diff --git a/.dockerignore b/.dockerignore index cfdc7fc735..3f674f978d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,25 +1,9 @@ -# use this file as a whitelist * !invokeai -!ldm !pyproject.toml +!docker/docker-entrypoint.sh +!LICENSE -# ignore frontend/web but whitelist dist -invokeai/frontend/web/ -!invokeai/frontend/web/dist/ - -# ignore invokeai/assets but whitelist invokeai/assets/web -invokeai/assets/ -!invokeai/assets/web/ - -# Guard against pulling in any models that might exist in the directory tree -**/*.pt* -**/*.ckpt - -# Byte-compiled / optimized / DLL files -**/__pycache__/ -**/*.py[cod] - -# Distribution / packaging -**/*.egg-info/ -**/*.egg +**/node_modules +**/__pycache__ +**/*.egg-info \ No newline at end of file diff --git a/.github/workflows/build-container.yml b/.github/workflows/build-container.yml index 23d7c82fe3..60eba4a297 100644 --- a/.github/workflows/build-container.yml +++ b/.github/workflows/build-container.yml @@ -3,17 +3,15 @@ on: push: branches: - 'main' - - 'update/ci/docker/*' - - 'update/docker/*' - - 'dev/ci/docker/*' - - 'dev/docker/*' paths: - 'pyproject.toml' - '.dockerignore' - 'invokeai/**' - 'docker/Dockerfile' + - 'docker/docker-entrypoint.sh' + - 'workflows/build-container.yml' tags: - - 'v*.*.*' + - 'v*' workflow_dispatch: permissions: @@ -26,23 +24,27 @@ jobs: strategy: fail-fast: false matrix: - flavor: - - rocm - - cuda - - cpu - include: - - flavor: rocm - pip-extra-index-url: 'https://download.pytorch.org/whl/rocm5.2' - - flavor: cuda - pip-extra-index-url: '' - - flavor: cpu - pip-extra-index-url: 'https://download.pytorch.org/whl/cpu' + gpu-driver: + - cuda + - cpu + - rocm runs-on: ubuntu-latest - name: ${{ matrix.flavor }} + name: ${{ matrix.gpu-driver }} env: - PLATFORMS: 'linux/amd64,linux/arm64' - DOCKERFILE: 'docker/Dockerfile' + # torch/arm64 does not support GPU currently, so arm64 builds + # would not be GPU-accelerated. + # re-enable arm64 if there is sufficient demand. + # PLATFORMS: 'linux/amd64,linux/arm64' + PLATFORMS: 'linux/amd64' steps: + - name: Free up more disk space on the runner + # https://github.com/actions/runner-images/issues/2840#issuecomment-1284059930 + run: | + sudo rm -rf /usr/share/dotnet + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + sudo swapoff /mnt/swapfile + sudo rm -rf /mnt/swapfile + - name: Checkout uses: actions/checkout@v3 @@ -53,7 +55,7 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} images: | ghcr.io/${{ github.repository }} - ${{ vars.DOCKERHUB_REPOSITORY }} + ${{ env.DOCKERHUB_REPOSITORY }} tags: | type=ref,event=branch type=ref,event=tag @@ -62,8 +64,8 @@ jobs: type=pep440,pattern={{major}} type=sha,enable=true,prefix=sha-,format=short flavor: | - latest=${{ matrix.flavor == 'cuda' && github.ref == 'refs/heads/main' }} - suffix=-${{ matrix.flavor }},onlatest=false + latest=${{ matrix.gpu-driver == 'cuda' && github.ref == 'refs/heads/main' }} + suffix=-${{ matrix.gpu-driver }},onlatest=false - name: Set up QEMU uses: docker/setup-qemu-action@v2 @@ -81,34 +83,33 @@ jobs: username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Login to Docker Hub - if: github.event_name != 'pull_request' && vars.DOCKERHUB_REPOSITORY != '' - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} + # - name: Login to Docker Hub + # if: github.event_name != 'pull_request' && vars.DOCKERHUB_REPOSITORY != '' + # uses: docker/login-action@v2 + # with: + # username: ${{ secrets.DOCKERHUB_USERNAME }} + # password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build container id: docker_build uses: docker/build-push-action@v4 with: context: . - file: ${{ env.DOCKERFILE }} + file: docker/Dockerfile platforms: ${{ env.PLATFORMS }} push: ${{ github.ref == 'refs/heads/main' || github.ref_type == 'tag' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - build-args: PIP_EXTRA_INDEX_URL=${{ matrix.pip-extra-index-url }} cache-from: | - type=gha,scope=${{ github.ref_name }}-${{ matrix.flavor }} - type=gha,scope=main-${{ matrix.flavor }} - cache-to: type=gha,mode=max,scope=${{ github.ref_name }}-${{ matrix.flavor }} + type=gha,scope=${{ github.ref_name }}-${{ matrix.gpu-driver }} + type=gha,scope=main-${{ matrix.gpu-driver }} + cache-to: type=gha,mode=max,scope=${{ github.ref_name }}-${{ matrix.gpu-driver }} - - name: Docker Hub Description - if: github.ref == 'refs/heads/main' || github.ref == 'refs/tags/*' && vars.DOCKERHUB_REPOSITORY != '' - uses: peter-evans/dockerhub-description@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - repository: ${{ vars.DOCKERHUB_REPOSITORY }} - short-description: ${{ github.event.repository.description }} + # - name: Docker Hub Description + # if: github.ref == 'refs/heads/main' || github.ref == 'refs/tags/*' && vars.DOCKERHUB_REPOSITORY != '' + # uses: peter-evans/dockerhub-description@v3 + # with: + # username: ${{ secrets.DOCKERHUB_USERNAME }} + # password: ${{ secrets.DOCKERHUB_TOKEN }} + # repository: ${{ vars.DOCKERHUB_REPOSITORY }} + # short-description: ${{ github.event.repository.description }} diff --git a/.github/workflows/test-invoke-pip-skip.yml b/.github/workflows/test-invoke-pip-skip.yml index d4c9d9fc00..004b46d5a8 100644 --- a/.github/workflows/test-invoke-pip-skip.yml +++ b/.github/workflows/test-invoke-pip-skip.yml @@ -1,10 +1,16 @@ name: Test invoke.py pip + +# This is a dummy stand-in for the actual tests +# we don't need to run python tests on non-Python changes +# But PRs require passing tests to be mergeable + on: pull_request: paths: - '**' - '!pyproject.toml' - '!invokeai/**' + - '!tests/**' - 'invokeai/frontend/web/**' merge_group: workflow_dispatch: @@ -19,48 +25,26 @@ jobs: strategy: matrix: python-version: - # - '3.9' - '3.10' pytorch: - # - linux-cuda-11_6 - linux-cuda-11_7 - linux-rocm-5_2 - linux-cpu - macos-default - windows-cpu - # - windows-cuda-11_6 - # - windows-cuda-11_7 include: - # - pytorch: linux-cuda-11_6 - # os: ubuntu-22.04 - # extra-index-url: 'https://download.pytorch.org/whl/cu116' - # github-env: $GITHUB_ENV - pytorch: linux-cuda-11_7 os: ubuntu-22.04 - github-env: $GITHUB_ENV - pytorch: linux-rocm-5_2 os: ubuntu-22.04 - extra-index-url: 'https://download.pytorch.org/whl/rocm5.2' - github-env: $GITHUB_ENV - pytorch: linux-cpu os: ubuntu-22.04 - extra-index-url: 'https://download.pytorch.org/whl/cpu' - github-env: $GITHUB_ENV - pytorch: macos-default os: macOS-12 - github-env: $GITHUB_ENV - pytorch: windows-cpu os: windows-2022 - github-env: $env:GITHUB_ENV - # - pytorch: windows-cuda-11_6 - # os: windows-2022 - # extra-index-url: 'https://download.pytorch.org/whl/cu116' - # github-env: $env:GITHUB_ENV - # - pytorch: windows-cuda-11_7 - # os: windows-2022 - # extra-index-url: 'https://download.pytorch.org/whl/cu117' - # github-env: $env:GITHUB_ENV name: ${{ matrix.pytorch }} on ${{ matrix.python-version }} runs-on: ${{ matrix.os }} steps: - - run: 'echo "No build required"' + - name: skip + run: echo "no build required" diff --git a/.github/workflows/test-invoke-pip.yml b/.github/workflows/test-invoke-pip.yml index 071232e06e..40be0a529e 100644 --- a/.github/workflows/test-invoke-pip.yml +++ b/.github/workflows/test-invoke-pip.yml @@ -11,6 +11,7 @@ on: paths: - 'pyproject.toml' - 'invokeai/**' + - 'tests/**' - '!invokeai/frontend/web/**' types: - 'ready_for_review' @@ -32,19 +33,12 @@ jobs: # - '3.9' - '3.10' pytorch: - # - linux-cuda-11_6 - linux-cuda-11_7 - linux-rocm-5_2 - linux-cpu - macos-default - windows-cpu - # - windows-cuda-11_6 - # - windows-cuda-11_7 include: - # - pytorch: linux-cuda-11_6 - # os: ubuntu-22.04 - # extra-index-url: 'https://download.pytorch.org/whl/cu116' - # github-env: $GITHUB_ENV - pytorch: linux-cuda-11_7 os: ubuntu-22.04 github-env: $GITHUB_ENV @@ -62,14 +56,6 @@ jobs: - pytorch: windows-cpu os: windows-2022 github-env: $env:GITHUB_ENV - # - pytorch: windows-cuda-11_6 - # os: windows-2022 - # extra-index-url: 'https://download.pytorch.org/whl/cu116' - # github-env: $env:GITHUB_ENV - # - pytorch: windows-cuda-11_7 - # os: windows-2022 - # extra-index-url: 'https://download.pytorch.org/whl/cu117' - # github-env: $env:GITHUB_ENV name: ${{ matrix.pytorch }} on ${{ matrix.python-version }} runs-on: ${{ matrix.os }} env: @@ -100,40 +86,38 @@ jobs: id: run-pytest run: pytest - - name: run invokeai-configure - id: run-preload-models - env: - HUGGING_FACE_HUB_TOKEN: ${{ secrets.HUGGINGFACE_TOKEN }} - run: > - invokeai-configure - --yes - --default_only - --full-precision - # can't use fp16 weights without a GPU + # - name: run invokeai-configure + # env: + # HUGGING_FACE_HUB_TOKEN: ${{ secrets.HUGGINGFACE_TOKEN }} + # run: > + # invokeai-configure + # --yes + # --default_only + # --full-precision + # # can't use fp16 weights without a GPU - - name: run invokeai - id: run-invokeai - env: - # Set offline mode to make sure configure preloaded successfully. - HF_HUB_OFFLINE: 1 - HF_DATASETS_OFFLINE: 1 - TRANSFORMERS_OFFLINE: 1 - INVOKEAI_OUTDIR: ${{ github.workspace }}/results - run: > - invokeai - --no-patchmatch - --no-nsfw_checker - --precision=float32 - --always_use_cpu - --use_memory_db - --outdir ${{ env.INVOKEAI_OUTDIR }}/${{ matrix.python-version }}/${{ matrix.pytorch }} - --from_file ${{ env.TEST_PROMPTS }} + # - name: run invokeai + # id: run-invokeai + # env: + # # Set offline mode to make sure configure preloaded successfully. + # HF_HUB_OFFLINE: 1 + # HF_DATASETS_OFFLINE: 1 + # TRANSFORMERS_OFFLINE: 1 + # INVOKEAI_OUTDIR: ${{ github.workspace }}/results + # run: > + # invokeai + # --no-patchmatch + # --no-nsfw_checker + # --precision=float32 + # --always_use_cpu + # --use_memory_db + # --outdir ${{ env.INVOKEAI_OUTDIR }}/${{ matrix.python-version }}/${{ matrix.pytorch }} + # --from_file ${{ env.TEST_PROMPTS }} - - name: Archive results - id: archive-results - env: - INVOKEAI_OUTDIR: ${{ github.workspace }}/results - uses: actions/upload-artifact@v3 - with: - name: results - path: ${{ env.INVOKEAI_OUTDIR }} + # - name: Archive results + # env: + # INVOKEAI_OUTDIR: ${{ github.workspace }}/results + # uses: actions/upload-artifact@v3 + # with: + # name: results + # path: ${{ env.INVOKEAI_OUTDIR }} diff --git a/.gitignore b/.gitignore index 7f3b1278df..b7b5c1ae75 100644 --- a/.gitignore +++ b/.gitignore @@ -34,7 +34,7 @@ __pycache__/ .Python build/ develop-eggs/ -dist/ +# dist/ downloads/ eggs/ .eggs/ @@ -79,6 +79,7 @@ cov.xml .pytest.ini cover/ junit/ +notes/ # Translations *.mo @@ -201,7 +202,8 @@ checkpoints # If it's a Mac .DS_Store -invokeai/frontend/web/dist/* +invokeai/frontend/yarn.lock +invokeai/frontend/node_modules # Let the frontend manage its own gitignore !invokeai/frontend/web/* diff --git a/LICENSE b/LICENSE index cb9631b9f6..fac28ea6b9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,176 @@ -MIT License + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Copyright (c) 2022 InvokeAI Team + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: + 1. Definitions. -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + diff --git a/README.md b/README.md index 9471e60404..5ad2b47509 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,11 @@
-![project logo](https://github.com/invoke-ai/InvokeAI/raw/main/docs/assets/invoke_ai_banner.png) +![project hero](https://github.com/invoke-ai/InvokeAI/assets/31807370/1a917d94-e099-4fa1-a70f-7dd8d0691018) + +# Invoke AI - Generative AI for Professional Creatives +## Professional Creative Tools for Stable Diffusion, Custom-Trained Models, and more. + To learn more about Invoke AI, get started instantly, or implement our Business solutions, visit [invoke.ai](https://invoke.ai) -# InvokeAI: A Stable Diffusion Toolkit [![discord badge]][discord link] @@ -33,32 +36,32 @@
-_**Note: The UI is not fully functional on `main`. If you need a stable UI based on `main`, use the `pre-nodes` tag while we [migrate to a new backend](https://github.com/invoke-ai/InvokeAI/discussions/3246).**_ +_**Note: This is an alpha release. Bugs are expected and not all +features are fully implemented. Please use the GitHub [Issues +pages](https://github.com/invoke-ai/InvokeAI/issues?q=is%3Aissue+is%3Aopen) +to report unexpected problems. Also note that InvokeAI root directory +which contains models, outputs and configuration files, has changed +between the 2.x and 3.x release. If you wish to use your v2.3 root +directory with v3.0, please follow the directions in [Migrating a 2.3 +root directory to 3.0](#migrating-to-3).**_ -InvokeAI is a leading creative engine built to empower professionals and enthusiasts alike. Generate and create stunning visual media using the latest AI-driven technologies. InvokeAI offers an industry leading Web Interface, interactive Command Line Interface, and also serves as the foundation for multiple commercial products. +InvokeAI is a leading creative engine built to empower professionals +and enthusiasts alike. Generate and create stunning visual media using +the latest AI-driven technologies. InvokeAI offers an industry leading +Web Interface, interactive Command Line Interface, and also serves as +the foundation for multiple commercial products. -**Quick links**: [[How to Install](https://invoke-ai.github.io/InvokeAI/#installation)] [Discord Server] [Documentation and Tutorials] [Code and Downloads] [Bug Reports] [Discussion, Ideas & Q&A] - -_Note: InvokeAI is rapidly evolving. Please use the -[Issues](https://github.com/invoke-ai/InvokeAI/issues) tab to report bugs and make feature -requests. Be sure to use the provided templates. They will help us diagnose issues faster._ - -## FOR DEVELOPERS - MIGRATING TO THE 3.0.0 MODELS FORMAT - -The models directory and models.yaml have changed. To migrate to the -new layout, please follow this recipe: - -1. Run `python scripts/migrate_models_to_3.0.py - -2. This will create a new models directory named `models-3.0` and a - new config directory named `models.yaml-3.0`, both in the current - working directory. If you prefer to name them something else, pass - the `--dest-directory` and/or `--dest-yaml` arguments. - -3. Check that the new models directory and yaml file look ok. - -4. Replace the existing directory and file, keeping backup copies just in -case. +**Quick links**: [[How to + Install](https://invoke-ai.github.io/InvokeAI/#installation)] [Discord Server] [Documentation and + Tutorials] [Code and + Downloads] [Bug Reports] + [Discussion, + Ideas & Q&A]
@@ -68,22 +71,30 @@ case. ## Table of Contents -1. [Quick Start](#getting-started-with-invokeai) -2. [Installation](#detailed-installation-instructions) -3. [Hardware Requirements](#hardware-requirements) -4. [Features](#features) -5. [Latest Changes](#latest-changes) -6. [Troubleshooting](#troubleshooting) -7. [Contributing](#contributing) -8. [Contributors](#contributors) -9. [Support](#support) -10. [Further Reading](#further-reading) +Table of Contents 📝 -## Getting Started with InvokeAI +**Getting Started** +1. 🏁 [Quick Start](#quick-start) +3. 🖥️ [Hardware Requirements](#hardware-requirements) + +**More About Invoke** +1. 🌟 [Features](#features) +2. 📣 [Latest Changes](#latest-changes) +3. 🛠️ [Troubleshooting](#troubleshooting) + +**Supporting the Project** +1. 🤝 [Contributing](#contributing) +2. 👥 [Contributors](#contributors) +3. 💕 [Support](#support) + +## Quick Start For full installation and upgrade instructions, please see: [InvokeAI Installation Overview](https://invoke-ai.github.io/InvokeAI/installation/) +If upgrading from version 2.3, please read [Migrating a 2.3 root +directory to 3.0](#migrating-to-3) first. + ### Automatic Installer (suggested for 1st time users) 1. Go to the bottom of the [Latest Release Page](https://github.com/invoke-ai/InvokeAI/releases/latest) @@ -92,9 +103,8 @@ For full installation and upgrade instructions, please see: 3. Unzip the file. -4. If you are on Windows, double-click on the `install.bat` script. On -macOS, open a Terminal window, drag the file `install.sh` from Finder -into the Terminal, and press return. On Linux, run `install.sh`. +4. **Windows:** double-click on the `install.bat` script. **macOS:** Open a Terminal window, drag the file `install.sh` from Finder +into the Terminal, and press return. **Linux:** run `install.sh`. 5. You'll be asked to confirm the location of the folder in which to install InvokeAI and its image generation model files. Pick a @@ -120,7 +130,7 @@ and go to http://localhost:9090. 10. Type `banana sushi` in the box on the top left and click `Invoke` -### Command-Line Installation (for users familiar with Terminals) +### Command-Line Installation (for developers and users familiar with Terminals) You must have Python 3.9 or 3.10 installed on your machine. Earlier or later versions are not supported. @@ -196,7 +206,7 @@ not supported. Be sure to activate the virtual environment each time before re-launching InvokeAI, using `source .venv/bin/activate` or `.venv\Scripts\activate`. -### Detailed Installation Instructions +## Detailed Installation Instructions This fork is supported across Linux, Windows and Macintosh. Linux users can use either an Nvidia-based card (with CUDA support) or an @@ -204,6 +214,87 @@ AMD card (using the ROCm driver). For full installation and upgrade instructions, please see: [InvokeAI Installation Overview](https://invoke-ai.github.io/InvokeAI/installation/INSTALL_SOURCE/) + +### Migrating a v2.3 InvokeAI root directory + +The InvokeAI root directory is where the InvokeAI startup file, +installed models, and generated images are stored. It is ordinarily +named `invokeai` and located in your home directory. The contents and +layout of this directory has changed between versions 2.3 and 3.0 and +cannot be used directly. + +We currently recommend that you use the installer to create a new root +directory named differently from the 2.3 one, e.g. `invokeai-3` and +then use a migration script to copy your 2.3 models into the new +location. However, if you choose, you can upgrade this directory in +place. This section gives both recipes. + +#### Creating a new root directory and migrating old models + +This is the safer recipe because it leaves your old root directory in +place to fall back on. + +1. Follow the instructions above to create and install InvokeAI in a +directory that has a different name from the 2.3 invokeai directory. +In this example, we will use "invokeai-3" + +2. When you are prompted to select models to install, select a minimal +set of models, such as stable-diffusion-v1.5 only. + +3. After installation is complete launch `invokeai.sh` (Linux/Mac) or +`invokeai.bat` and select option 8 "Open the developers console". This +will take you to the command line. + +4. Issue the command `invokeai-migrate3 --from /path/to/v2.3-root --to +/path/to/invokeai-3-root`. Provide the correct `--from` and `--to` +paths for your v2.3 and v3.0 root directories respectively. + +This will copy and convert your old models from 2.3 format to 3.0 +format and create a new `models` directory in the 3.0 directory. The +old models directory (which contains the models selected at install +time) will be renamed `models.orig` and can be deleted once you have +confirmed that the migration was successful. + +#### Migrating in place + +For the adventurous, you may do an in-place upgrade from 2.3 to 3.0 +without touching the command line. The recipe is as follows> + +1. Launch the InvokeAI launcher script in your current v2.3 root directory. + +2. Select option [9] "Update InvokeAI" to bring up the updater dialog. + +3a. During the alpha release phase, select option [3] and manually +enter the tag name `v3.0.0+a2`. + +3b. Once 3.0 is released, select option [1] to upgrade to the latest release. + +4. Once the upgrade is finished you will be returned to the launcher +menu. Select option [7] "Re-run the configure script to fix a broken +install or to complete a major upgrade". + +This will run the configure script against the v2.3 directory and +update it to the 3.0 format. The following files will be replaced: + + - The invokeai.init file, replaced by invokeai.yaml + - The models directory + - The configs/models.yaml model index + +The original versions of these files will be saved with the suffix +".orig" appended to the end. Once you have confirmed that the upgrade +worked, you can safely remove these files. Alternatively you can +restore a working v2.3 directory by removing the new files and +restoring the ".orig" files' original names. + +#### Migration Caveats + +The migration script will migrate your invokeai settings and models, +including textual inversion models, LoRAs and merges that you may have +installed previously. However it does **not** migrate the generated +images stored in your 2.3-format outputs directory. The released +version of 3.0 is expected to have an interface for importing an +entire directory of image files as a batch. + ## Hardware Requirements InvokeAI is supported across Linux, Windows and macOS. Linux @@ -222,13 +313,9 @@ We do not recommend the GTX 1650 or 1660 series video cards. They are unable to run in half-precision mode and do not have sufficient VRAM to render 512x512 images. -### Memory +**Memory** - At least 12 GB Main Memory RAM. -- At least 12 GB Main Memory RAM. - -### Disk - -- At least 12 GB of free disk space for the machine learning model, Python, and all its dependencies. +**Disk** - At least 12 GB of free disk space for the machine learning model, Python, and all its dependencies. ## Features @@ -242,28 +329,24 @@ InvokeAI offers a locally hosted Web Server & React Frontend, with an industry l The Unified Canvas is a fully integrated canvas implementation with support for all core generation capabilities, in/outpainting, brush tools, and more. This creative tool unlocks the capability for artists to create with AI as a creative collaborator, and can be used to augment AI-generated imagery, sketches, photography, renders, and more. -### *Advanced Prompt Syntax* +### *Node Architecture & Editor (Beta)* -InvokeAI's advanced prompt syntax allows for token weighting, cross-attention control, and prompt blending, allowing for fine-tuned tweaking of your invocations and exploration of the latent space. +Invoke AI's backend is built on a graph-based execution architecture. This allows for customizable generation pipelines to be developed by professional users looking to create specific workflows to support their production use-cases, and will be extended in the future with additional capabilities. -### *Command Line Interface* +### *Board & Gallery Management* -For users utilizing a terminal-based environment, or who want to take advantage of CLI features, InvokeAI offers an extensive and actively supported command-line interface that provides the full suite of generation functionality available in the tool. +Invoke AI provides an organized gallery system for easily storing, accessing, and remixing your content in the Invoke workspace. Images can be dragged/dropped onto any Image-base UI element in the application, and rich metadata within the Image allows for easy recall of key prompts or settings used in your workflow. ### Other features - *Support for both ckpt and diffusers models* - *SD 2.0, 2.1 support* -- *Noise Control & Tresholding* -- *Popular Sampler Support* -- *Upscaling & Face Restoration Tools* +- *Upscaling Tools* - *Embedding Manager & Support* - *Model Manager & Support* - -### Coming Soon - -- *Node-Based Architecture & UI* -- And more... +- *Node-Based Architecture* +- *Node-Based Plug-&-Play UI (Beta)* +- *SDXL Support* (Coming soon) ### Latest Changes @@ -271,7 +354,7 @@ For our latest changes, view our [Release Notes](https://github.com/invoke-ai/InvokeAI/releases) and the [CHANGELOG](docs/CHANGELOG.md). -## Troubleshooting +### Troubleshooting Please check out our **[Q&A](https://invoke-ai.github.io/InvokeAI/help/TROUBLESHOOT/#faq)** to get solutions for common installation problems and other issues. @@ -301,8 +384,6 @@ This fork is a combined effort of various people from across the world. [Check out the list of all these amazing people](https://invoke-ai.github.io/InvokeAI/other/CONTRIBUTORS/). We thank them for their time, hard work and effort. -Thanks to [Weblate](https://weblate.org/) for generously providing translation services to this project. - ### Support For support, please use this repository's GitHub Issues tracking service, or join the Discord. diff --git a/docker/.env.sample b/docker/.env.sample new file mode 100644 index 0000000000..7e414ecd65 --- /dev/null +++ b/docker/.env.sample @@ -0,0 +1,13 @@ +## Make a copy of this file named `.env` and fill in the values below. +## Any environment variables supported by InvokeAI can be specified here. + +# INVOKEAI_ROOT is the path to a path on the local filesystem where InvokeAI will store data. +# Outputs will also be stored here by default. +# This **must** be an absolute path. +INVOKEAI_ROOT= + +HUGGINGFACE_TOKEN= + +## optional variables specific to the docker setup +# GPU_DRIVER=cuda +# CONTAINER_UID=1000 \ No newline at end of file diff --git a/docker/Dockerfile b/docker/Dockerfile index 1c2b991028..e158c681a4 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,107 +1,129 @@ -# syntax=docker/dockerfile:1 +# syntax=docker/dockerfile:1.4 -ARG PYTHON_VERSION=3.9 -################## -## base image ## -################## -FROM --platform=${TARGETPLATFORM} python:${PYTHON_VERSION}-slim AS python-base +## Builder stage -LABEL org.opencontainers.image.authors="mauwii@outlook.de" +FROM library/ubuntu:22.04 AS builder -# Prepare apt for buildkit cache -RUN rm -f /etc/apt/apt.conf.d/docker-clean \ - && echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' >/etc/apt/apt.conf.d/keep-cache +ARG DEBIAN_FRONTEND=noninteractive +RUN rm -f /etc/apt/apt.conf.d/docker-clean; echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + apt update && apt-get install -y \ + git \ + python3.10-venv \ + python3-pip \ + build-essential -# Install dependencies -RUN \ - --mount=type=cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,target=/var/lib/apt,sharing=locked \ - apt-get update \ - && apt-get install -y \ - --no-install-recommends \ - libgl1-mesa-glx=20.3.* \ - libglib2.0-0=2.66.* \ - libopencv-dev=4.5.* +ENV INVOKEAI_SRC=/opt/invokeai +ENV VIRTUAL_ENV=/opt/venv/invokeai -# Set working directory and env -ARG APPDIR=/usr/src -ARG APPNAME=InvokeAI -WORKDIR ${APPDIR} -ENV PATH ${APPDIR}/${APPNAME}/bin:$PATH -# Keeps Python from generating .pyc files in the container -ENV PYTHONDONTWRITEBYTECODE 1 -# Turns off buffering for easier container logging -ENV PYTHONUNBUFFERED 1 -# Don't fall back to legacy build system -ENV PIP_USE_PEP517=1 +ENV PATH="$VIRTUAL_ENV/bin:$PATH" +ARG TORCH_VERSION=2.0.1 +ARG TORCHVISION_VERSION=0.15.2 +ARG GPU_DRIVER=cuda +ARG TARGETPLATFORM="linux/amd64" +# unused but available +ARG BUILDPLATFORM -####################### -## build pyproject ## -####################### -FROM python-base AS pyproject-builder +WORKDIR ${INVOKEAI_SRC} -# Install build dependencies -RUN \ - --mount=type=cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,target=/var/lib/apt,sharing=locked \ - apt-get update \ - && apt-get install -y \ - --no-install-recommends \ - build-essential=12.9 \ - gcc=4:10.2.* \ - python3-dev=3.9.* +# Install pytorch before all other pip packages +# NOTE: there are no pytorch builds for arm64 + cuda, only cpu +# x86_64/CUDA is default +RUN --mount=type=cache,target=/root/.cache/pip \ + python3 -m venv ${VIRTUAL_ENV} &&\ + if [ "$TARGETPLATFORM" = "linux/arm64" ] || [ "$GPU_DRIVER" = "cpu" ]; then \ + extra_index_url_arg="--extra-index-url https://download.pytorch.org/whl/cpu"; \ + elif [ "$GPU_DRIVER" = "rocm" ]; then \ + extra_index_url_arg="--extra-index-url https://download.pytorch.org/whl/rocm5.4.2"; \ + else \ + extra_index_url_arg="--extra-index-url https://download.pytorch.org/whl/cu118"; \ + fi &&\ + pip install $extra_index_url_arg \ + torch==$TORCH_VERSION \ + torchvision==$TORCHVISION_VERSION -# Prepare pip for buildkit cache -ARG PIP_CACHE_DIR=/var/cache/buildkit/pip -ENV PIP_CACHE_DIR ${PIP_CACHE_DIR} -RUN mkdir -p ${PIP_CACHE_DIR} +# Install the local package. +# Editable mode helps use the same image for development: +# the local working copy can be bind-mounted into the image +# at path defined by ${INVOKEAI_SRC} +COPY invokeai ./invokeai +COPY pyproject.toml ./ +RUN --mount=type=cache,target=/root/.cache/pip \ + # xformers + triton fails to install on arm64 + if [ "$GPU_DRIVER" = "cuda" ] && [ "$TARGETPLATFORM" = "linux/amd64" ]; then \ + pip install -e ".[xformers]"; \ + else \ + pip install -e "."; \ + fi -# Create virtual environment -RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ - python3 -m venv "${APPNAME}" \ - --upgrade-deps +# #### Build the Web UI ------------------------------------ -# Install requirements -COPY --link pyproject.toml . -COPY --link invokeai/version/invokeai_version.py invokeai/version/__init__.py invokeai/version/ -ARG PIP_EXTRA_INDEX_URL -ENV PIP_EXTRA_INDEX_URL ${PIP_EXTRA_INDEX_URL} -RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ - "${APPNAME}"/bin/pip install . +FROM node:18 AS web-builder +WORKDIR /build +COPY invokeai/frontend/web/ ./ +RUN --mount=type=cache,target=/usr/lib/node_modules \ + npm install --include dev +RUN --mount=type=cache,target=/usr/lib/node_modules \ + yarn vite build -# Install pyproject.toml -COPY --link . . -RUN --mount=type=cache,target=${PIP_CACHE_DIR} \ - "${APPNAME}/bin/pip" install . -# Build patchmatch +#### Runtime stage --------------------------------------- + +FROM library/ubuntu:22.04 AS runtime + +ARG DEBIAN_FRONTEND=noninteractive +ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 + +RUN apt update && apt install -y --no-install-recommends \ + git \ + curl \ + vim \ + tmux \ + ncdu \ + iotop \ + bzip2 \ + gosu \ + libglib2.0-0 \ + libgl1-mesa-glx \ + python3-venv \ + python3-pip \ + build-essential \ + libopencv-dev \ + libstdc++-10-dev &&\ + apt-get clean && apt-get autoclean + +# globally add magic-wormhole +# for ease of transferring data to and from the container +# when running in sandboxed cloud environments; e.g. Runpod etc. +RUN pip install magic-wormhole + +ENV INVOKEAI_SRC=/opt/invokeai +ENV VIRTUAL_ENV=/opt/venv/invokeai +ENV INVOKEAI_ROOT=/invokeai +ENV PATH="$VIRTUAL_ENV/bin:$INVOKEAI_SRC:$PATH" + +# --link requires buldkit w/ dockerfile syntax 1.4 +COPY --link --from=builder ${INVOKEAI_SRC} ${INVOKEAI_SRC} +COPY --link --from=builder ${VIRTUAL_ENV} ${VIRTUAL_ENV} +COPY --link --from=web-builder /build/dist ${INVOKEAI_SRC}/invokeai/frontend/web/dist + +# Link amdgpu.ids for ROCm builds +# contributed by https://github.com/Rubonnek +RUN mkdir -p "/opt/amdgpu/share/libdrm" &&\ + ln -s "/usr/share/libdrm/amdgpu.ids" "/opt/amdgpu/share/libdrm/amdgpu.ids" + +WORKDIR ${INVOKEAI_SRC} + +# build patchmatch +RUN cd /usr/lib/$(uname -p)-linux-gnu/pkgconfig/ && ln -sf opencv4.pc opencv.pc RUN python3 -c "from patchmatch import patch_match" -##################### -## runtime image ## -##################### -FROM python-base AS runtime +# Create unprivileged user and make the local dir +RUN useradd --create-home --shell /bin/bash -u 1000 --comment "container local user" invoke +RUN mkdir -p ${INVOKEAI_ROOT} && chown -R invoke:invoke ${INVOKEAI_ROOT} -# Create a new user -ARG UNAME=appuser -RUN useradd \ - --no-log-init \ - -m \ - -U \ - "${UNAME}" - -# Create volume directory -ARG VOLUME_DIR=/data -RUN mkdir -p "${VOLUME_DIR}" \ - && chown -hR "${UNAME}:${UNAME}" "${VOLUME_DIR}" - -# Setup runtime environment -USER ${UNAME}:${UNAME} -COPY --chown=${UNAME}:${UNAME} --from=pyproject-builder ${APPDIR}/${APPNAME} ${APPNAME} -ENV INVOKEAI_ROOT ${VOLUME_DIR} -ENV TRANSFORMERS_CACHE ${VOLUME_DIR}/.cache -ENV INVOKE_MODEL_RECONFIGURE "--yes --default_only" -EXPOSE 9090 -ENTRYPOINT [ "invokeai" ] -CMD [ "--web", "--host", "0.0.0.0", "--port", "9090" ] -VOLUME [ "${VOLUME_DIR}" ] +COPY docker/docker-entrypoint.sh ./ +ENTRYPOINT ["/opt/invokeai/docker-entrypoint.sh"] +CMD ["invokeai-web", "--host", "0.0.0.0"] diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000000..91f7fb8c51 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,77 @@ +# InvokeAI Containerized + +All commands are to be run from the `docker` directory: `cd docker` + +#### Linux + +1. Ensure builkit is enabled in the Docker daemon settings (`/etc/docker/daemon.json`) +2. Install the `docker compose` plugin using your package manager, or follow a [tutorial](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-22-04). + - The deprecated `docker-compose` (hyphenated) CLI continues to work for now. +3. Ensure docker daemon is able to access the GPU. + - You may need to install [nvidia-container-toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html) + +#### macOS + +1. Ensure Docker has at least 16GB RAM +2. Enable VirtioFS for file sharing +3. Enable `docker compose` V2 support + +This is done via Docker Desktop preferences + +## Quickstart + + +1. Make a copy of `env.sample` and name it `.env` (`cp env.sample .env` (Mac/Linux) or `copy example.env .env` (Windows)). Make changes as necessary. Set `INVOKEAI_ROOT` to an absolute path to: + a. the desired location of the InvokeAI runtime directory, or + b. an existing, v3.0.0 compatible runtime directory. +1. `docker compose up` + +The image will be built automatically if needed. + +The runtime directory (holding models and outputs) will be created in the location specified by `INVOKEAI_ROOT`. The default location is `~/invokeai`. The runtime directory will be populated with the base configs and models necessary to start generating. + +### Use a GPU + +- Linux is *recommended* for GPU support in Docker. +- WSL2 is *required* for Windows. +- only `x86_64` architecture is supported. + +The Docker daemon on the system must be already set up to use the GPU. In case of Linux, this involves installing `nvidia-docker-runtime` and configuring the `nvidia` runtime as default. Steps will be different for AMD. Please see Docker documentation for the most up-to-date instructions for using your GPU with Docker. + +## Customize + +Check the `.env.sample` file. It contains some environment variables for running in Docker. Copy it, name it `.env`, and fill it in with your own values. Next time you run `docker compose up`, your custom values will be used. + +You can also set these values in `docker compose.yml` directly, but `.env` will help avoid conflicts when code is updated. + +Example (most values are optional): + +``` +INVOKEAI_ROOT=/Volumes/WorkDrive/invokeai +HUGGINGFACE_TOKEN=the_actual_token +CONTAINER_UID=1000 +GPU_DRIVER=cuda +``` + +## Even Moar Customizing! + +See the `docker compose.yaml` file. The `command` instruction can be uncommented and used to run arbitrary startup commands. Some examples below. + +### Reconfigure the runtime directory + +Can be used to download additional models from the supported model list + +In conjunction with `INVOKEAI_ROOT` can be also used to initialize a runtime directory + +``` +command: + - invokeai-configure + - --yes +``` + +Or install models: + +``` +command: + - invokeai-model-install +``` \ No newline at end of file diff --git a/docker/build.sh b/docker/build.sh index 8bfb9a9ddc..db25439840 100755 --- a/docker/build.sh +++ b/docker/build.sh @@ -1,51 +1,11 @@ #!/usr/bin/env bash set -e -# If you want to build a specific flavor, set the CONTAINER_FLAVOR environment variable -# e.g. CONTAINER_FLAVOR=cpu ./build.sh -# Possible Values are: -# - cpu -# - cuda -# - rocm -# Don't forget to also set it when executing run.sh -# if it is not set, the script will try to detect the flavor by itself. -# -# Doc can be found here: -# https://invoke-ai.github.io/InvokeAI/installation/040_INSTALL_DOCKER/ +build_args="" -SCRIPTDIR=$(dirname "${BASH_SOURCE[0]}") -cd "$SCRIPTDIR" || exit 1 +[[ -f ".env" ]] && build_args=$(awk '$1 ~ /\=[^$]/ {print "--build-arg " $0 " "}' .env) -source ./env.sh +echo "docker-compose build args:" +echo $build_args -DOCKERFILE=${INVOKE_DOCKERFILE:-./Dockerfile} - -# print the settings -echo -e "You are using these values:\n" -echo -e "Dockerfile:\t\t${DOCKERFILE}" -echo -e "index-url:\t\t${PIP_EXTRA_INDEX_URL:-none}" -echo -e "Volumename:\t\t${VOLUMENAME}" -echo -e "Platform:\t\t${PLATFORM}" -echo -e "Container Registry:\t${CONTAINER_REGISTRY}" -echo -e "Container Repository:\t${CONTAINER_REPOSITORY}" -echo -e "Container Tag:\t\t${CONTAINER_TAG}" -echo -e "Container Flavor:\t${CONTAINER_FLAVOR}" -echo -e "Container Image:\t${CONTAINER_IMAGE}\n" - -# Create docker volume -if [[ -n "$(docker volume ls -f name="${VOLUMENAME}" -q)" ]]; then - echo -e "Volume already exists\n" -else - echo -n "creating docker volume " - docker volume create "${VOLUMENAME}" -fi - -# Build Container -docker build \ - --platform="${PLATFORM:-linux/amd64}" \ - --tag="${CONTAINER_IMAGE:-invokeai}" \ - ${CONTAINER_FLAVOR:+--build-arg="CONTAINER_FLAVOR=${CONTAINER_FLAVOR}"} \ - ${PIP_EXTRA_INDEX_URL:+--build-arg="PIP_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL}"} \ - ${PIP_PACKAGE:+--build-arg="PIP_PACKAGE=${PIP_PACKAGE}"} \ - --file="${DOCKERFILE}" \ - .. +docker-compose build $build_args diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 0000000000..85deac428e --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,48 @@ +# Copyright (c) 2023 Eugene Brodsky https://github.com/ebr + +version: '3.8' + +services: + invokeai: + image: "local/invokeai:latest" + # edit below to run on a container runtime other than nvidia-container-runtime. + # not yet tested with rocm/AMD GPUs + # Comment out the "deploy" section to run on CPU only + deploy: + resources: + reservations: + devices: + - driver: nvidia + count: 1 + capabilities: [gpu] + build: + context: .. + dockerfile: docker/Dockerfile + + # variables without a default will automatically inherit from the host environment + environment: + - INVOKEAI_ROOT + - HF_HOME + + # Create a .env file in the same directory as this docker-compose.yml file + # and populate it with environment variables. See .env.sample + env_file: + - .env + + ports: + - "${INVOKEAI_PORT:-9090}:9090" + volumes: + - ${INVOKEAI_ROOT:-~/invokeai}:${INVOKEAI_ROOT:-/invokeai} + - ${HF_HOME:-~/.cache/huggingface}:${HF_HOME:-/invokeai/.cache/huggingface} + # - ${INVOKEAI_MODELS_DIR:-${INVOKEAI_ROOT:-/invokeai/models}} + # - ${INVOKEAI_MODELS_CONFIG_PATH:-${INVOKEAI_ROOT:-/invokeai/configs/models.yaml}} + tty: true + stdin_open: true + + # # Example of running alternative commands/scripts in the container + # command: + # - bash + # - -c + # - | + # invokeai-model-install --yes --default-only --config_file ${INVOKEAI_ROOT}/config_custom.yaml + # invokeai-nodes-web --host 0.0.0.0 diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh new file mode 100755 index 0000000000..d45ed3d7ef --- /dev/null +++ b/docker/docker-entrypoint.sh @@ -0,0 +1,65 @@ +#!/bin/bash +set -e -o pipefail + +### Container entrypoint +# Runs the CMD as defined by the Dockerfile or passed to `docker run` +# Can be used to configure the runtime dir +# Bypass by using ENTRYPOINT or `--entrypoint` + +### Set INVOKEAI_ROOT pointing to a valid runtime directory +# Otherwise configure the runtime dir first. + +### Configure the InvokeAI runtime directory (done by default)): +# docker run --rm -it --configure +# or skip with --no-configure + +### Set the CONTAINER_UID envvar to match your user. +# Ensures files created in the container are owned by you: +# docker run --rm -it -v /some/path:/invokeai -e CONTAINER_UID=$(id -u) +# Default UID: 1000 chosen due to popularity on Linux systems. Possibly 501 on MacOS. + +USER_ID=${CONTAINER_UID:-1000} +USER=invoke +usermod -u ${USER_ID} ${USER} 1>/dev/null + +configure() { + # Configure the runtime directory + if [[ -f ${INVOKEAI_ROOT}/invokeai.yaml ]]; then + echo "${INVOKEAI_ROOT}/invokeai.yaml exists. InvokeAI is already configured." + echo "To reconfigure InvokeAI, delete the above file." + echo "======================================================================" + else + mkdir -p ${INVOKEAI_ROOT} + chown --recursive ${USER} ${INVOKEAI_ROOT} + gosu ${USER} invokeai-configure --yes --default_only + fi +} + +## Skip attempting to configure. +## Must be passed first, before any other args. +if [[ $1 != "--no-configure" ]]; then + configure +else + shift +fi + +### Set the $PUBLIC_KEY env var to enable SSH access. +# We do not install openssh-server in the image by default to avoid bloat. +# but it is useful to have the full SSH server e.g. on Runpod. +# (use SCP to copy files to/from the image, etc) +if [[ -v "PUBLIC_KEY" ]] && [[ ! -d "${HOME}/.ssh" ]]; then + apt-get update + apt-get install -y openssh-server + pushd $HOME + mkdir -p .ssh + echo ${PUBLIC_KEY} > .ssh/authorized_keys + chmod -R 700 .ssh + popd + service ssh start +fi + + +cd ${INVOKEAI_ROOT} + +# Run the CMD as the Container User (not root). +exec gosu ${USER} "$@" diff --git a/docker/env.sh b/docker/env.sh deleted file mode 100644 index ee3b54f5f6..0000000000 --- a/docker/env.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env bash - -# This file is used to set environment variables for the build.sh and run.sh scripts. - -# Try to detect the container flavor if no PIP_EXTRA_INDEX_URL got specified -if [[ -z "$PIP_EXTRA_INDEX_URL" ]]; then - - # Activate virtual environment if not already activated and exists - if [[ -z $VIRTUAL_ENV ]]; then - [[ -e "$(dirname "${BASH_SOURCE[0]}")/../.venv/bin/activate" ]] \ - && source "$(dirname "${BASH_SOURCE[0]}")/../.venv/bin/activate" \ - && echo "Activated virtual environment: $VIRTUAL_ENV" - fi - - # Decide which container flavor to build if not specified - if [[ -z "$CONTAINER_FLAVOR" ]] && python -c "import torch" &>/dev/null; then - # Check for CUDA and ROCm - CUDA_AVAILABLE=$(python -c "import torch;print(torch.cuda.is_available())") - ROCM_AVAILABLE=$(python -c "import torch;print(torch.version.hip is not None)") - if [[ "${CUDA_AVAILABLE}" == "True" ]]; then - CONTAINER_FLAVOR="cuda" - elif [[ "${ROCM_AVAILABLE}" == "True" ]]; then - CONTAINER_FLAVOR="rocm" - else - CONTAINER_FLAVOR="cpu" - fi - fi - - # Set PIP_EXTRA_INDEX_URL based on container flavor - if [[ "$CONTAINER_FLAVOR" == "rocm" ]]; then - PIP_EXTRA_INDEX_URL="https://download.pytorch.org/whl/rocm" - elif [[ "$CONTAINER_FLAVOR" == "cpu" ]]; then - PIP_EXTRA_INDEX_URL="https://download.pytorch.org/whl/cpu" - # elif [[ -z "$CONTAINER_FLAVOR" || "$CONTAINER_FLAVOR" == "cuda" ]]; then - # PIP_PACKAGE=${PIP_PACKAGE-".[xformers]"} - fi -fi - -# Variables shared by build.sh and run.sh -REPOSITORY_NAME="${REPOSITORY_NAME-$(basename "$(git rev-parse --show-toplevel)")}" -REPOSITORY_NAME="${REPOSITORY_NAME,,}" -VOLUMENAME="${VOLUMENAME-"${REPOSITORY_NAME}_data"}" -ARCH="${ARCH-$(uname -m)}" -PLATFORM="${PLATFORM-linux/${ARCH}}" -INVOKEAI_BRANCH="${INVOKEAI_BRANCH-$(git branch --show)}" -CONTAINER_REGISTRY="${CONTAINER_REGISTRY-"ghcr.io"}" -CONTAINER_REPOSITORY="${CONTAINER_REPOSITORY-"$(whoami)/${REPOSITORY_NAME}"}" -CONTAINER_FLAVOR="${CONTAINER_FLAVOR-cuda}" -CONTAINER_TAG="${CONTAINER_TAG-"${INVOKEAI_BRANCH##*/}-${CONTAINER_FLAVOR}"}" -CONTAINER_IMAGE="${CONTAINER_REGISTRY}/${CONTAINER_REPOSITORY}:${CONTAINER_TAG}" -CONTAINER_IMAGE="${CONTAINER_IMAGE,,}" - -# enable docker buildkit -export DOCKER_BUILDKIT=1 diff --git a/docker/run.sh b/docker/run.sh index d685788146..bb764ec022 100755 --- a/docker/run.sh +++ b/docker/run.sh @@ -1,41 +1,8 @@ #!/usr/bin/env bash set -e -# How to use: https://invoke-ai.github.io/InvokeAI/installation/040_INSTALL_DOCKER/ - SCRIPTDIR=$(dirname "${BASH_SOURCE[0]}") cd "$SCRIPTDIR" || exit 1 -source ./env.sh - -# Create outputs directory if it does not exist -[[ -d ./outputs ]] || mkdir ./outputs - -echo -e "You are using these values:\n" -echo -e "Volumename:\t${VOLUMENAME}" -echo -e "Invokeai_tag:\t${CONTAINER_IMAGE}" -echo -e "local Models:\t${MODELSPATH:-unset}\n" - -docker run \ - --interactive \ - --tty \ - --rm \ - --platform="${PLATFORM}" \ - --name="${REPOSITORY_NAME}" \ - --hostname="${REPOSITORY_NAME}" \ - --mount type=volume,volume-driver=local,source="${VOLUMENAME}",target=/data \ - --mount type=bind,source="$(pwd)"/outputs/,target=/data/outputs/ \ - ${MODELSPATH:+--mount="type=bind,source=${MODELSPATH},target=/data/models"} \ - ${HUGGING_FACE_HUB_TOKEN:+--env="HUGGING_FACE_HUB_TOKEN=${HUGGING_FACE_HUB_TOKEN}"} \ - --publish=9090:9090 \ - --cap-add=sys_nice \ - ${GPU_FLAGS:+--gpus="${GPU_FLAGS}"} \ - "${CONTAINER_IMAGE}" ${@:+$@} - -echo -e "\nCleaning trash folder ..." -for f in outputs/.Trash*; do - if [ -e "$f" ]; then - rm -Rf "$f" - break - fi -done +docker-compose up --build -d +docker-compose logs -f diff --git a/docker/runpod-readme.md b/docker/runpod-readme.md new file mode 100644 index 0000000000..c464480d46 --- /dev/null +++ b/docker/runpod-readme.md @@ -0,0 +1,60 @@ +# InvokeAI - A Stable Diffusion Toolkit + +Stable Diffusion distribution by InvokeAI: https://github.com/invoke-ai + +The Docker image tracks the `main` branch of the InvokeAI project, which means it includes the latest features, but may contain some bugs. + +Your working directory is mounted under the `/workspace` path inside the pod. The models are in `/workspace/invokeai/models`, and outputs are in `/workspace/invokeai/outputs`. + +> **Only the /workspace directory will persist between pod restarts!** + +> **If you _terminate_ (not just _stop_) the pod, the /workspace will be lost.** + +## Quickstart + +1. Launch a pod from this template. **It will take about 5-10 minutes to run through the initial setup**. Be patient. +1. Wait for the application to load. + - TIP: you know it's ready when the CPU usage goes idle + - You can also check the logs for a line that says "_Point your browser at..._" +1. Open the Invoke AI web UI: click the `Connect` => `connect over HTTP` button. +1. Generate some art! + +## Other things you can do + +At any point you may edit the pod configuration and set an arbitrary Docker command. For example, you could run a command to downloads some models using `curl`, or fetch some images and place them into your outputs to continue a working session. + +If you need to run *multiple commands*, define them in the Docker Command field like this: + +`bash -c "cd ${INVOKEAI_ROOT}/outputs; wormhole receive 2-foo-bar; invoke.py --web --host 0.0.0.0"` + +### Copying your data in and out of the pod + +This image includes a couple of handy tools to help you get the data into the pod (such as your custom models or embeddings), and out of the pod (such as downloading your outputs). Here are your options for getting your data in and out of the pod: + +- **SSH server**: + 1. Make sure to create and set your Public Key in the RunPod settings (follow the official instructions) + 1. Add an exposed port 22 (TCP) in the pod settings! + 1. When your pod restarts, you will see a new entry in the `Connect` dialog. Use this SSH server to `scp` or `sftp` your files as necessary, or SSH into the pod using the fully fledged SSH server. + +- [**Magic Wormhole**](https://magic-wormhole.readthedocs.io/en/latest/welcome.html): + 1. On your computer, `pip install magic-wormhole` (see above instructions for details) + 1. Connect to the command line **using the "light" SSH client** or the browser-based console. _Currently there's a bug where `wormhole` isn't available when connected to "full" SSH server, as described above_. + 1. `wormhole send /workspace/invokeai/outputs` will send the entire `outputs` directory. You can also send individual files. + 1. Once packaged, you will see a `wormhole receive <123-some-words>` command. Copy it + 1. Paste this command into the terminal on your local machine to securely download the payload. + 1. It works the same in reverse: you can `wormhole send` some models from your computer to the pod. Again, save your files somewhere in `/workspace` or they will be lost when the pod is stopped. + +- **RunPod's Cloud Sync feature** may be used to sync the persistent volume to cloud storage. You could, for example, copy the entire `/workspace` to S3, add some custom models to it, and copy it back from S3 when launching new pod configurations. Follow the Cloud Sync instructions. + + +### Disable the NSFW checker + +The NSFW checker is enabled by default. To disable it, edit the pod configuration and set the following command: + +``` +invoke --web --host 0.0.0.0 --no-nsfw_checker +``` + +--- + +Template ©2023 Eugene Brodsky [ebr](https://github.com/ebr) \ No newline at end of file diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index bd9b5b5512..ff9edde30a 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -4,6 +4,236 @@ title: Changelog # :octicons-log-16: **Changelog** +## v2.3.5 (22 May 2023) + +This release (along with the post1 and post2 follow-on releases) expands support for additional LoRA and LyCORIS models, upgrades diffusers versions, and fixes a few bugs. + +### LoRA and LyCORIS Support Improvement + + A number of LoRA/LyCORIS fine-tune files (those which alter the text encoder as well as the unet model) were not having the desired effect in InvokeAI. This bug has now been fixed. Full documentation of LoRA support is available at InvokeAI LoRA Support. + Previously, InvokeAI did not distinguish between LoRA/LyCORIS models based on Stable Diffusion v1.5 vs those based on v2.0 and 2.1, leading to a crash when an incompatible model was loaded. This has now been fixed. In addition, the web pulldown menus for LoRA and Textual Inversion selection have been enhanced to show only those files that are compatible with the currently-selected Stable Diffusion model. + Support for the newer LoKR LyCORIS files has been added. + +### Library Updates and Speed/Reproducibility Advancements +The major enhancement in this version is that NVIDIA users no longer need to decide between speed and reproducibility. Previously, if you activated the Xformers library, you would see improvements in speed and memory usage, but multiple images generated with the same seed and other parameters would be slightly different from each other. This is no longer the case. Relative to 2.3.5 you will see improved performance when running without Xformers, and even better performance when Xformers is activated. In both cases, images generated with the same settings will be identical. + +Here are the new library versions: +Library Version +Torch 2.0.0 +Diffusers 0.16.1 +Xformers 0.0.19 +Compel 1.1.5 +Other Improvements + +### Performance Improvements + + When a model is loaded for the first time, InvokeAI calculates its checksum for incorporation into the PNG metadata. This process could take up to a minute on network-mounted disks and WSL mounts. This release noticeably speeds up the process. + +### Bug Fixes + + The "import models from directory" and "import from URL" functionality in the console-based model installer has now been fixed. + When running the WebUI, we have reduced the number of times that InvokeAI reaches out to HuggingFace to fetch the list of embeddable Textual Inversion models. We have also caught and fixed a problem with the updater not correctly detecting when another instance of the updater is running + + +## v2.3.4 (7 April 2023) + +What's New in 2.3.4 + +This features release adds support for LoRA (Low-Rank Adaptation) and LyCORIS (Lora beYond Conventional) models, as well as some minor bug fixes. +### LoRA and LyCORIS Support + +LoRA files contain fine-tuning weights that enable particular styles, subjects or concepts to be applied to generated images. LyCORIS files are an extended variant of LoRA. InvokeAI supports the most common LoRA/LyCORIS format, which ends in the suffix .safetensors. You will find numerous LoRA and LyCORIS models for download at Civitai, and a small but growing number at Hugging Face. Full documentation of LoRA support is available at InvokeAI LoRA Support.( Pre-release note: this page will only be available after release) + +To use LoRA/LyCORIS models in InvokeAI: + + Download the .safetensors files of your choice and place in /path/to/invokeai/loras. This directory was not present in earlier version of InvokeAI but will be created for you the first time you run the command-line or web client. You can also create the directory manually. + + Add withLora(lora-file,weight) to your prompts. The weight is optional and will default to 1.0. A few examples, assuming that a LoRA file named loras/sushi.safetensors is present: + +family sitting at dinner table eating sushi withLora(sushi,0.9) +family sitting at dinner table eating sushi withLora(sushi, 0.75) +family sitting at dinner table eating sushi withLora(sushi) + +Multiple withLora() prompt fragments are allowed. The weight can be arbitrarily large, but the useful range is roughly 0.5 to 1.0. Higher weights make the LoRA's influence stronger. Negative weights are also allowed, which can lead to some interesting effects. + + Generate as you usually would! If you find that the image is too "crisp" try reducing the overall CFG value or reducing individual LoRA weights. As is the case with all fine-tunes, you'll get the best results when running the LoRA on top of the model similar to, or identical with, the one that was used during the LoRA's training. Don't try to load a SD 1.x-trained LoRA into a SD 2.x model, and vice versa. This will trigger a non-fatal error message and generation will not proceed. + + You can change the location of the loras directory by passing the --lora_directory option to `invokeai. + +### New WebUI LoRA and Textual Inversion Buttons + +This version adds two new web interface buttons for inserting LoRA and Textual Inversion triggers into the prompt as shown in the screenshot below. + +Clicking on one or the other of the buttons will bring up a menu of available LoRA/LyCORIS or Textual Inversion trigger terms. Select a menu item to insert the properly-formatted withLora() or prompt fragment into the positive prompt. The number in parentheses indicates the number of trigger terms currently in the prompt. You may click the button again and deselect the LoRA or trigger to remove it from the prompt, or simply edit the prompt directly. + +Currently terms are inserted into the positive prompt textbox only. However, some textual inversion embeddings are designed to be used with negative prompts. To move a textual inversion trigger into the negative prompt, simply cut and paste it. + +By default the Textual Inversion menu only shows locally installed models found at startup time in /path/to/invokeai/embeddings. However, InvokeAI has the ability to dynamically download and install additional Textual Inversion embeddings from the HuggingFace Concepts Library. You may choose to display the most popular of these (with five or more likes) in the Textual Inversion menu by going to Settings and turning on "Show Textual Inversions from HF Concepts Library." When this option is activated, the locally-installed TI embeddings will be shown first, followed by uninstalled terms from Hugging Face. See The Hugging Face Concepts Library and Importing Textual Inversion files for more information. +### Minor features and fixes + +This release changes model switching behavior so that the command-line and Web UIs save the last model used and restore it the next time they are launched. It also improves the behavior of the installer so that the pip utility is kept up to date. + +### Known Bugs in 2.3.4 + +These are known bugs in the release. + + The Ancestral DPMSolverMultistepScheduler (k_dpmpp_2a) sampler is not yet implemented for diffusers models and will disappear from the WebUI Sampler menu when a diffusers model is selected. + Windows Defender will sometimes raise Trojan or backdoor alerts for the codeformer.pth face restoration model, as well as the CIDAS/clipseg and runwayml/stable-diffusion-v1.5 models. These are false positives and can be safely ignored. InvokeAI performs a malware scan on all models as they are loaded. For additional security, you should use safetensors models whenever they are available. + + +## v2.3.3 (28 March 2023) + +This is a bugfix and minor feature release. +### Bugfixes + +Since version 2.3.2 the following bugs have been fixed: +Bugs + + When using legacy checkpoints with an external VAE, the VAE file is now scanned for malware prior to loading. Previously only the main model weights file was scanned. + Textual inversion will select an appropriate batchsize based on whether xformers is active, and will default to xformers enabled if the library is detected. + The batch script log file names have been fixed to be compatible with Windows. + Occasional corruption of the .next_prefix file (which stores the next output file name in sequence) on Windows systems is now detected and corrected. + Support loading of legacy config files that have no personalization (textual inversion) section. + An infinite loop when opening the developer's console from within the invoke.sh script has been corrected. + Documentation fixes, including a recipe for detecting and fixing problems with the AMD GPU ROCm driver. + +Enhancements + + It is now possible to load and run several community-contributed SD-2.0 based models, including the often-requested "Illuminati" model. + The "NegativePrompts" embedding file, and others like it, can now be loaded by placing it in the InvokeAI embeddings directory. + If no --model is specified at launch time, InvokeAI will remember the last model used and restore it the next time it is launched. + On Linux systems, the invoke.sh launcher now uses a prettier console-based interface. To take advantage of it, install the dialog package using your package manager (e.g. sudo apt install dialog). + When loading legacy models (safetensors/ckpt) you can specify a custom config file and/or a VAE by placing like-named files in the same directory as the model following this example: + +my-favorite-model.ckpt +my-favorite-model.yaml +my-favorite-model.vae.pt # or my-favorite-model.vae.safetensors + +### Known Bugs in 2.3.3 + +These are known bugs in the release. + + The Ancestral DPMSolverMultistepScheduler (k_dpmpp_2a) sampler is not yet implemented for diffusers models and will disappear from the WebUI Sampler menu when a diffusers model is selected. + Windows Defender will sometimes raise Trojan or backdoor alerts for the codeformer.pth face restoration model, as well as the CIDAS/clipseg and runwayml/stable-diffusion-v1.5 models. These are false positives and can be safely ignored. InvokeAI performs a malware scan on all models as they are loaded. For additional security, you should use safetensors models whenever they are available. + + +## v2.3.2 (11 March 2023) +This is a bugfix and minor feature release. + +### Bugfixes + +Since version 2.3.1 the following bugs have been fixed: + + Black images appearing for potential NSFW images when generating with legacy checkpoint models and both --no-nsfw_checker and --ckpt_convert turned on. + Black images appearing when generating from models fine-tuned on Stable-Diffusion-2-1-base. When importing V2-derived models, you may be asked to select whether the model was derived from a "base" model (512 pixels) or the 768-pixel SD-2.1 model. + The "Use All" button was not restoring the Hi-Res Fix setting on the WebUI + When using the model installer console app, models failed to import correctly when importing from directories with spaces in their names. A similar issue with the output directory was also fixed. + Crashes that occurred during model merging. + Restore previous naming of Stable Diffusion base and 768 models. + Upgraded to latest versions of diffusers, transformers, safetensors and accelerate libraries upstream. We hope that this will fix the assertion NDArray > 2**32 issue that MacOS users have had when generating images larger than 768x768 pixels. Please report back. + +As part of the upgrade to diffusers, the location of the diffusers-based models has changed from models/diffusers to models/hub. When you launch InvokeAI for the first time, it will prompt you to OK a one-time move. This should be quick and harmless, but if you have modified your models/diffusers directory in some way, for example using symlinks, you may wish to cancel the migration and make appropriate adjustments. +New "Invokeai-batch" script + +### Invoke AI Batch +2.3.2 introduces a new command-line only script called invokeai-batch that can be used to generate hundreds of images from prompts and settings that vary systematically. This can be used to try the same prompt across multiple combinations of models, steps, CFG settings and so forth. It also allows you to template prompts and generate a combinatorial list like: + +a shack in the mountains, photograph +a shack in the mountains, watercolor +a shack in the mountains, oil painting +a chalet in the mountains, photograph +a chalet in the mountains, watercolor +a chalet in the mountains, oil painting +a shack in the desert, photograph +... + +If you have a system with multiple GPUs, or a single GPU with lots of VRAM, you can parallelize generation across the combinatorial set, reducing wait times and using your system's resources efficiently (make sure you have good GPU cooling). + +To try invokeai-batch out. Launch the "developer's console" using the invoke launcher script, or activate the invokeai virtual environment manually. From the console, give the command invokeai-batch --help in order to learn how the script works and create your first template file for dynamic prompt generation. + + +### Known Bugs in 2.3.2 + +These are known bugs in the release. + + The Ancestral DPMSolverMultistepScheduler (k_dpmpp_2a) sampler is not yet implemented for diffusers models and will disappear from the WebUI Sampler menu when a diffusers model is selected. + Windows Defender will sometimes raise a Trojan alert for the codeformer.pth face restoration model. As far as we have been able to determine, this is a false positive and can be safely whitelisted. + + +## v2.3.1 (22 February 2023) +This is primarily a bugfix release, but it does provide several new features that will improve the user experience. + +### Enhanced support for model management + +InvokeAI now makes it convenient to add, remove and modify models. You can individually import models that are stored on your local system, scan an entire folder and its subfolders for models and import them automatically, and even directly import models from the internet by providing their download URLs. You also have the option of designating a local folder to scan for new models each time InvokeAI is restarted. + +There are three ways of accessing the model management features: + + From the WebUI, click on the cube to the right of the model selection menu. This will bring up a form that allows you to import models individually from your local disk or scan a directory for models to import. + + Using the Model Installer App + +Choose option (5) download and install models from the invoke launcher script to start a new console-based application for model management. You can use this to select from a curated set of starter models, or import checkpoint, safetensors, and diffusers models from a local disk or the internet. The example below shows importing two checkpoint URLs from popular SD sites and a HuggingFace diffusers model using its Repository ID. It also shows how to designate a folder to be scanned at startup time for new models to import. + +Command-line users can start this app using the command invokeai-model-install. + + Using the Command Line Client (CLI) + +The !install_model and !convert_model commands have been enhanced to allow entering of URLs and local directories to scan and import. The first command installs .ckpt and .safetensors files as-is. The second one converts them into the faster diffusers format before installation. + +Internally InvokeAI is able to probe the contents of a .ckpt or .safetensors file to distinguish among v1.x, v2.x and inpainting models. This means that you do not need to include "inpaint" in your model names to use an inpainting model. Note that Stable Diffusion v2.x models will be autoconverted into a diffusers model the first time you use it. + +Please see INSTALLING MODELS for more information on model management. + +### An Improved Installer Experience + +The installer now launches a console-based UI for setting and changing commonly-used startup options: + +After selecting the desired options, the installer installs several support models needed by InvokeAI's face reconstruction and upscaling features and then launches the interface for selecting and installing models shown earlier. At any time, you can edit the startup options by launching invoke.sh/invoke.bat and entering option (6) change InvokeAI startup options + +Command-line users can launch the new configure app using invokeai-configure. + +This release also comes with a renewed updater. To do an update without going through a whole reinstallation, launch invoke.sh or invoke.bat and choose option (9) update InvokeAI . This will bring you to a screen that prompts you to update to the latest released version, to the most current development version, or any released or unreleased version you choose by selecting the tag or branch of the desired version. + +Command-line users can run this interface by typing invokeai-configure + +### Image Symmetry Options + +There are now features to generate horizontal and vertical symmetry during generation. The way these work is to wait until a selected step in the generation process and then to turn on a mirror image effect. In addition to generating some cool images, you can also use this to make side-by-side comparisons of how an image will look with more or fewer steps. Access this option from the WebUI by selecting Symmetry from the image generation settings, or within the CLI by using the options --h_symmetry_time_pct and --v_symmetry_time_pct (these can be abbreviated to --h_sym and --v_sym like all other options). + +### A New Unified Canvas Look + +This release introduces a beta version of the WebUI Unified Canvas. To try it out, open up the settings dialogue in the WebUI (gear icon) and select Use Canvas Beta Layout: + +Refresh the screen and go to to Unified Canvas (left side of screen, third icon from the top). The new layout is designed to provide more space to work in and to keep the image controls close to the image itself: + +Model conversion and merging within the WebUI + +The WebUI now has an intuitive interface for model merging, as well as for permanent conversion of models from legacy .ckpt/.safetensors formats into diffusers format. These options are also available directly from the invoke.sh/invoke.bat scripts. +An easier way to contribute translations to the WebUI + +We have migrated our translation efforts to Weblate, a FOSS translation product. Maintaining the growing project's translations is now far simpler for the maintainers and community. Please review our brief translation guide for more information on how to contribute. +Numerous internal bugfixes and performance issues + +### Bug Fixes +This releases quashes multiple bugs that were reported in 2.3.0. Major internal changes include upgrading to diffusers 0.13.0, and using the compel library for prompt parsing. See Detailed Change Log for a detailed list of bugs caught and squished. +Summary of InvokeAI command line scripts (all accessible via the launcher menu) +Command Description +invokeai Command line interface +invokeai --web Web interface +invokeai-model-install Model installer with console forms-based front end +invokeai-ti --gui Textual inversion, with a console forms-based front end +invokeai-merge --gui Model merging, with a console forms-based front end +invokeai-configure Startup configuration; can also be used to reinstall support models +invokeai-update InvokeAI software updater + +### Known Bugs in 2.3.1 + +These are known bugs in the release. + MacOS users generating 768x768 pixel images or greater using diffusers models may experience a hard crash with assertion NDArray > 2**32 This appears to be an issu... + + + ## v2.3.0 (15 January 2023) **Transition to diffusers @@ -264,7 +494,7 @@ sections describe what's new for InvokeAI. [Manual Installation](installation/020_INSTALL_MANUAL.md). - The ability to save frequently-used startup options (model to load, steps, sampler, etc) in a `.invokeai` file. See - [Client](features/CLI.md) + [Client](deprecated/CLI.md) - Support for AMD GPU cards (non-CUDA) on Linux machines. - Multiple bugs and edge cases squashed. @@ -387,7 +617,7 @@ sections describe what's new for InvokeAI. - `dream.py` script renamed `invoke.py`. A `dream.py` script wrapper remains for backward compatibility. - Completely new WebGUI - launch with `python3 scripts/invoke.py --web` -- Support for [inpainting](features/INPAINTING.md) and +- Support for [inpainting](deprecated/INPAINTING.md) and [outpainting](features/OUTPAINTING.md) - img2img runs on all k\* samplers - Support for @@ -399,7 +629,7 @@ sections describe what's new for InvokeAI. using facial reconstruction, ESRGAN upscaling, outcropping (similar to DALL-E infinite canvas), and "embiggen" upscaling. See the `!fix` command. - New `--hires` option on `invoke>` line allows - [larger images to be created without duplicating elements](features/CLI.md#this-is-an-example-of-txt2img), + [larger images to be created without duplicating elements](deprecated/CLI.md#this-is-an-example-of-txt2img), at the cost of some performance. - New `--perlin` and `--threshold` options allow you to add and control variation during image generation (see @@ -408,7 +638,7 @@ sections describe what's new for InvokeAI. of images and tweaking of previous settings. - Command-line completion in `invoke.py` now works on Windows, Linux and Mac platforms. -- Improved [command-line completion behavior](features/CLI.md) New commands +- Improved [command-line completion behavior](deprecated/CLI.md) New commands added: - List command-line history with `!history` - Search command-line history with `!search` diff --git a/docs/assets/contributing/resize_invocation.png b/docs/assets/contributing/resize_invocation.png new file mode 100644 index 0000000000..a78f8eb86a Binary files /dev/null and b/docs/assets/contributing/resize_invocation.png differ diff --git a/docs/assets/contributing/resize_node_editor.png b/docs/assets/contributing/resize_node_editor.png new file mode 100644 index 0000000000..d121ba1aa6 Binary files /dev/null and b/docs/assets/contributing/resize_node_editor.png differ diff --git a/docs/assets/features/restoration-montage.png b/docs/assets/features/restoration-montage.png new file mode 100644 index 0000000000..825a89a8dd Binary files /dev/null and b/docs/assets/features/restoration-montage.png differ diff --git a/docs/assets/features/upscale-dialog.png b/docs/assets/features/upscale-dialog.png new file mode 100644 index 0000000000..3ba0136545 Binary files /dev/null and b/docs/assets/features/upscale-dialog.png differ diff --git a/docs/assets/features/upscaling-montage.png b/docs/assets/features/upscaling-montage.png new file mode 100644 index 0000000000..6b3eeba347 Binary files /dev/null and b/docs/assets/features/upscaling-montage.png differ diff --git a/docs/contributing/CONTRIBUTING.md b/docs/contributing/CONTRIBUTING.md new file mode 100644 index 0000000000..3360faed70 --- /dev/null +++ b/docs/contributing/CONTRIBUTING.md @@ -0,0 +1,54 @@ +## Welcome to Invoke AI + +We're thrilled to have you here and we're excited for you to contribute. + +Invoke AI originated as a project built by the community, and that vision carries forward today as we aim to build the best pro-grade tools available. We work together to incorporate the latest in AI/ML research, making these tools available in over 20 languages to artists and creatives around the world as part of our fully permissive OSS project designed for individual users to self-host and use. + +Here are some guidelines to help you get started: + +### Technical Prerequisites + +Front-end: You'll need a working knowledge of React and TypeScript. + +Back-end: Depending on the scope of your contribution, you may need to know SQLite, FastAPI, Python, and Socketio. Also, a good majority of the backend logic involved in processing images is built in a modular way using a concept called "Nodes", which are isolated functions that carry out individual, discrete operations. This design allows for easy contributions of novel pipelines and capabilities. + +### How to Submit Contributions + +To start contributing, please follow these steps: + +1. Familiarize yourself with our roadmap and open projects to see where your skills and interests align. These documents can serve as a source of inspiration. +2. Open a Pull Request (PR) with a clear description of the feature you're adding or the problem you're solving. Make sure your contribution aligns with the project's vision. +3. Adhere to general best practices. This includes assuming interoperability with other nodes, keeping the scope of your functions as small as possible, and organizing your code according to our architecture documents. + +### Types of Contributions We're Looking For + +We welcome all contributions that improve the project. Right now, we're especially looking for: + +1. Quality of life (QOL) enhancements on the front-end. +2. New backend capabilities added through nodes. +3. Incorporating additional optimizations from the broader open-source software community. + +### Communication and Decision-making Process + +Project maintainers and code owners review PRs to ensure they align with the project's goals. They may provide design or architectural guidance, suggestions on user experience, or provide more significant feedback on the contribution itself. Expect to receive feedback on your submissions, and don't hesitate to ask questions or propose changes. + +For more robust discussions, or if you're planning to add capabilities not currently listed on our roadmap, please reach out to us on our Discord server. That way, we can ensure your proposed contribution aligns with the project's direction before you start writing code. + +### Code of Conduct and Contribution Expectations + +We want everyone in our community to have a positive experience. To facilitate this, we've established a code of conduct and a statement of values that we expect all contributors to adhere to. Please take a moment to review these documents—they're essential to maintaining a respectful and inclusive environment. + +By making a contribution to this project, you certify that: + +1. The contribution was created in whole or in part by you and you have the right to submit it under the open-source license indicated in this project’s GitHub repository; or +2. The contribution is based upon previous work that, to the best of your knowledge, is covered under an appropriate open-source license and you have the right under that license to submit that work with modifications, whether created in whole or in part by you, under the same open-source license (unless you are permitted to submit under a different license); or +3. The contribution was provided directly to you by some other person who certified (1) or (2) and you have not modified it; or +4. You understand and agree that this project and the contribution are public and that a record of the contribution (including all personal information you submit with it, including your sign-off) is maintained indefinitely and may be redistributed consistent with this project or the open-source license(s) involved. + +This disclaimer is not a license and does not grant any rights or permissions. You must obtain necessary permissions and licenses, including from third parties, before contributing to this project. + +This disclaimer is provided "as is" without warranty of any kind, whether expressed or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, or non-infringement. In no event shall the authors or copyright holders be liable for any claim, damages, or other liability, whether in an action of contract, tort, or otherwise, arising from, out of, or in connection with the contribution or the use or other dealings in the contribution. + +--- + +Remember, your contributions help make this project great. We're excited to see what you'll bring to our community! diff --git a/docs/contributing/INVOCATIONS.md b/docs/contributing/INVOCATIONS.md index 212233f497..fb3d8df3eb 100644 --- a/docs/contributing/INVOCATIONS.md +++ b/docs/contributing/INVOCATIONS.md @@ -1,8 +1,521 @@ # Invocations -Invocations represent a single operation, its inputs, and its outputs. These -operations and their outputs can be chained together to generate and modify -images. +Features in InvokeAI are added in the form of modular node-like systems called +**Invocations**. + +An Invocation is simply a single operation that takes in some inputs and gives +out some outputs. We can then chain multiple Invocations together to create more +complex functionality. + +## Invocations Directory + +InvokeAI Invocations can be found in the `invokeai/app/invocations` directory. + +You can add your new functionality to one of the existing Invocations in this +directory or create a new file in this directory as per your needs. + +**Note:** _All Invocations must be inside this directory for InvokeAI to +recognize them as valid Invocations._ + +## Creating A New Invocation + +In order to understand the process of creating a new Invocation, let us actually +create one. + +In our example, let us create an Invocation that will take in an image, resize +it and output the resized image. + +The first set of things we need to do when creating a new Invocation are - + +- Create a new class that derives from a predefined parent class called + `BaseInvocation`. +- The name of every Invocation must end with the word `Invocation` in order for + it to be recognized as an Invocation. +- Every Invocation must have a `docstring` that describes what this Invocation + does. +- Every Invocation must have a unique `type` field defined which becomes its + indentifier. +- Invocations are strictly typed. We make use of the native + [typing](https://docs.python.org/3/library/typing.html) library and the + installed [pydantic](https://pydantic-docs.helpmanual.io/) library for + validation. + +So let us do that. + +```python +from typing import Literal +from .baseinvocation import BaseInvocation + +class ResizeInvocation(BaseInvocation): + '''Resizes an image''' + type: Literal['resize'] = 'resize' +``` + +That's great. + +Now we have setup the base of our new Invocation. Let us think about what inputs +our Invocation takes. + +- We need an `image` that we are going to resize. +- We will need new `width` and `height` values to which we need to resize the + image to. + +### **Inputs** + +Every Invocation input is a pydantic `Field` and like everything else should be +strictly typed and defined. + +So let us create these inputs for our Invocation. First up, the `image` input we +need. Generally, we can use standard variable types in Python but InvokeAI +already has a custom `ImageField` type that handles all the stuff that is needed +for image inputs. + +But what is this `ImageField` ..? It is a special class type specifically +written to handle how images are dealt with in InvokeAI. We will cover how to +create your own custom field types later in this guide. For now, let's go ahead +and use it. + +```python +from typing import Literal, Union +from pydantic import Field + +from .baseinvocation import BaseInvocation +from ..models.image import ImageField + +class ResizeInvocation(BaseInvocation): + '''Resizes an image''' + type: Literal['resize'] = 'resize' + + # Inputs + image: Union[ImageField, None] = Field(description="The input image", default=None) +``` + +Let us break down our input code. + +```python +image: Union[ImageField, None] = Field(description="The input image", default=None) +``` + +| Part | Value | Description | +| --------- | ---------------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| Name | `image` | The variable that will hold our image | +| Type Hint | `Union[ImageField, None]` | The types for our field. Indicates that the image can either be an `ImageField` type or `None` | +| Field | `Field(description="The input image", default=None)` | The image variable is a field which needs a description and a default value that we set to `None`. | + +Great. Now let us create our other inputs for `width` and `height` + +```python +from typing import Literal, Union +from pydantic import Field + +from .baseinvocation import BaseInvocation +from ..models.image import ImageField + +class ResizeInvocation(BaseInvocation): + '''Resizes an image''' + type: Literal['resize'] = 'resize' + + # Inputs + image: Union[ImageField, None] = Field(description="The input image", default=None) + width: int = Field(default=512, ge=64, le=2048, description="Width of the new image") + height: int = Field(default=512, ge=64, le=2048, description="Height of the new image") +``` + +As you might have noticed, we added two new parameters to the field type for +`width` and `height` called `gt` and `le`. These basically stand for _greater +than or equal to_ and _less than or equal to_. There are various other param +types for field that you can find on the **pydantic** documentation. + +**Note:** _Any time it is possible to define constraints for our field, we +should do it so the frontend has more information on how to parse this field._ + +Perfect. We now have our inputs. Let us do something with these. + +### **Invoke Function** + +The `invoke` function is where all the magic happens. This function provides you +the `context` parameter that is of the type `InvocationContext` which will give +you access to the current context of the generation and all the other services +that are provided by it by InvokeAI. + +Let us create this function first. + +```python +from typing import Literal, Union +from pydantic import Field + +from .baseinvocation import BaseInvocation, InvocationContext +from ..models.image import ImageField + +class ResizeInvocation(BaseInvocation): + '''Resizes an image''' + type: Literal['resize'] = 'resize' + + # Inputs + image: Union[ImageField, None] = Field(description="The input image", default=None) + width: int = Field(default=512, ge=64, le=2048, description="Width of the new image") + height: int = Field(default=512, ge=64, le=2048, description="Height of the new image") + + def invoke(self, context: InvocationContext): + pass +``` + +### **Outputs** + +The output of our Invocation will be whatever is returned by this `invoke` +function. Like with our inputs, we need to strongly type and define our outputs +too. + +What is our output going to be? Another image. Normally you'd have to create a +type for this but InvokeAI already offers you an `ImageOutput` type that handles +all the necessary info related to image outputs. So let us use that. + +We will cover how to create your own output types later in this guide. + +```python +from typing import Literal, Union +from pydantic import Field + +from .baseinvocation import BaseInvocation, InvocationContext +from ..models.image import ImageField +from .image import ImageOutput + +class ResizeInvocation(BaseInvocation): + '''Resizes an image''' + type: Literal['resize'] = 'resize' + + # Inputs + image: Union[ImageField, None] = Field(description="The input image", default=None) + width: int = Field(default=512, ge=64, le=2048, description="Width of the new image") + height: int = Field(default=512, ge=64, le=2048, description="Height of the new image") + + def invoke(self, context: InvocationContext) -> ImageOutput: + pass +``` + +Perfect. Now that we have our Invocation setup, let us do what we want to do. + +- We will first load the image. Generally we do this using the `PIL` library but + we can use one of the services provided by InvokeAI to load the image. +- We will resize the image using `PIL` to our input data. +- We will output this image in the format we set above. + +So let's do that. + +```python +from typing import Literal, Union +from pydantic import Field + +from .baseinvocation import BaseInvocation, InvocationContext +from ..models.image import ImageField, ResourceOrigin, ImageCategory +from .image import ImageOutput + +class ResizeInvocation(BaseInvocation): + '''Resizes an image''' + type: Literal['resize'] = 'resize' + + # Inputs + image: Union[ImageField, None] = Field(description="The input image", default=None) + width: int = Field(default=512, ge=64, le=2048, description="Width of the new image") + height: int = Field(default=512, ge=64, le=2048, description="Height of the new image") + + def invoke(self, context: InvocationContext) -> ImageOutput: + # Load the image using InvokeAI's predefined Image Service. + image = context.services.images.get_pil_image(self.image.image_origin, self.image.image_name) + + # Resizing the image + # Because we used the above service, we already have a PIL image. So we can simply resize. + resized_image = image.resize((self.width, self.height)) + + # Preparing the image for output using InvokeAI's predefined Image Service. + output_image = context.services.images.create( + image=resized_image, + image_origin=ResourceOrigin.INTERNAL, + image_category=ImageCategory.GENERAL, + node_id=self.id, + session_id=context.graph_execution_state_id, + is_intermediate=self.is_intermediate, + ) + + # Returning the Image + return ImageOutput( + image=ImageField( + image_name=output_image.image_name, + image_origin=output_image.image_origin, + ), + width=output_image.width, + height=output_image.height, + ) +``` + +**Note:** Do not be overwhelmed by the `ImageOutput` process. InvokeAI has a +certain way that the images need to be dispatched in order to be stored and read +correctly. In 99% of the cases when dealing with an image output, you can simply +copy-paste the template above. + +That's it. You made your own **Resize Invocation**. + +## Result + +Once you make your Invocation correctly, the rest of the process is fully +automated for you. + +When you launch InvokeAI, you can go to `http://localhost:9090/docs` and see +your new Invocation show up there with all the relevant info. + +![resize invocation](../assets/contributing/resize_invocation.png) + +When you launch the frontend UI, you can go to the Node Editor tab and find your +new Invocation ready to be used. + +![resize node editor](../assets/contributing/resize_node_editor.png) + +# Advanced + +## Custom Input Fields + +Now that you know how to create your own Invocations, let us dive into slightly +more advanced topics. + +While creating your own Invocations, you might run into a scenario where the +existing input types in InvokeAI do not meet your requirements. In such cases, +you can create your own input types. + +Let us create one as an example. Let us say we want to create a color input +field that represents a color code. But before we start on that here are some +general good practices to keep in mind. + +**Good Practices** + +- There is no naming convention for input fields but we highly recommend that + you name it something appropriate like `ColorField`. +- It is not mandatory but it is heavily recommended to add a relevant + `docstring` to describe your input field. +- Keep your field in the same file as the Invocation that it is made for or in + another file where it is relevant. + +All input types a class that derive from the `BaseModel` type from `pydantic`. +So let's create one. + +```python +from pydantic import BaseModel + +class ColorField(BaseModel): + '''A field that holds the rgba values of a color''' + pass +``` + +Perfect. Now let us create our custom inputs for our field. This is exactly +similar how you created input fields for your Invocation. All the same rules +apply. Let us create four fields representing the _red(r)_, _blue(b)_, +_green(g)_ and _alpha(a)_ channel of the color. + +```python +class ColorField(BaseModel): + '''A field that holds the rgba values of a color''' + r: int = Field(ge=0, le=255, description="The red channel") + g: int = Field(ge=0, le=255, description="The green channel") + b: int = Field(ge=0, le=255, description="The blue channel") + a: int = Field(ge=0, le=255, description="The alpha channel") +``` + +That's it. We now have a new input field type that we can use in our Invocations +like this. + +```python +color: ColorField = Field(default=ColorField(r=0, g=0, b=0, a=0), description='Background color of an image') +``` + +**Extra Config** + +All input fields also take an additional `Config` class that you can use to do +various advanced things like setting required parameters and etc. + +Let us do that for our _ColorField_ and enforce all the values because we did +not define any defaults for our fields. + +```python +class ColorField(BaseModel): + '''A field that holds the rgba values of a color''' + r: int = Field(ge=0, le=255, description="The red channel") + g: int = Field(ge=0, le=255, description="The green channel") + b: int = Field(ge=0, le=255, description="The blue channel") + a: int = Field(ge=0, le=255, description="The alpha channel") + + class Config: + schema_extra = {"required": ["r", "g", "b", "a"]} +``` + +Now it becomes mandatory for the user to supply all the values required by our +input field. + +We will discuss the `Config` class in extra detail later in this guide and how +you can use it to make your Invocations more robust. + +## Custom Output Types + +Like with custom inputs, sometimes you might find yourself needing custom +outputs that InvokeAI does not provide. We can easily set one up. + +Now that you are familiar with Invocations and Inputs, let us use that knowledge +to put together a custom output type for an Invocation that returns _width_, +_height_ and _background_color_ that we need to create a blank image. + +- A custom output type is a class that derives from the parent class of + `BaseInvocationOutput`. +- It is not mandatory but we recommend using names ending with `Output` for + output types. So we'll call our class `BlankImageOutput` +- It is not mandatory but we highly recommend adding a `docstring` to describe + what your output type is for. +- Like Invocations, each output type should have a `type` variable that is + **unique** + +Now that we know the basic rules for creating a new output type, let us go ahead +and make it. + +```python +from typing import Literal +from pydantic import Field + +from .baseinvocation import BaseInvocationOutput + +class BlankImageOutput(BaseInvocationOutput): + '''Base output type for creating a blank image''' + type: Literal['blank_image_output'] = 'blank_image_output' + + # Inputs + width: int = Field(description='Width of blank image') + height: int = Field(description='Height of blank image') + bg_color: ColorField = Field(description='Background color of blank image') + + class Config: + schema_extra = {"required": ["type", "width", "height", "bg_color"]} +``` + +All set. We now have an output type that requires what we need to create a +blank_image. And if you noticed it, we even used the `Config` class to ensure +the fields are required. + +## Custom Configuration + +As you might have noticed when making inputs and outputs, we used a class called +`Config` from _pydantic_ to further customize them. Because our inputs and +outputs essentially inherit from _pydantic_'s `BaseModel` class, all +[configuration options](https://docs.pydantic.dev/latest/usage/schema/#schema-customization) +that are valid for _pydantic_ classes are also valid for our inputs and outputs. +You can do the same for your Invocations too but InvokeAI makes our life a +little bit easier on that end. + +InvokeAI provides a custom configuration class called `InvocationConfig` +particularly for configuring Invocations. This is exactly the same as the raw +`Config` class from _pydantic_ with some extra stuff on top to help faciliate +parsing of the scheme in the frontend UI. + +At the current moment, tihs `InvocationConfig` class is further improved with +the following features related the `ui`. + +| Config Option | Field Type | Example | +| ------------- | ------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | +| type_hints | `Dict[str, Literal["integer", "float", "boolean", "string", "enum", "image", "latents", "model", "control"]]` | `type_hint: "model"` provides type hints related to the model like displaying a list of available models | +| tags | `List[str]` | `tags: ['resize', 'image']` will classify your invocation under the tags of resize and image. | +| title | `str` | `title: 'Resize Image` will rename your to this custom title rather than infer from the name of the Invocation class. | + +So let us update your `ResizeInvocation` with some extra configuration and see +how that works. + +```python +from typing import Literal, Union +from pydantic import Field + +from .baseinvocation import BaseInvocation, InvocationContext, InvocationConfig +from ..models.image import ImageField, ResourceOrigin, ImageCategory +from .image import ImageOutput + +class ResizeInvocation(BaseInvocation): + '''Resizes an image''' + type: Literal['resize'] = 'resize' + + # Inputs + image: Union[ImageField, None] = Field(description="The input image", default=None) + width: int = Field(default=512, ge=64, le=2048, description="Width of the new image") + height: int = Field(default=512, ge=64, le=2048, description="Height of the new image") + + class Config(InvocationConfig): + schema_extra: { + ui: { + tags: ['resize', 'image'], + title: ['My Custom Resize'] + } + } + + def invoke(self, context: InvocationContext) -> ImageOutput: + # Load the image using InvokeAI's predefined Image Service. + image = context.services.images.get_pil_image(self.image.image_origin, self.image.image_name) + + # Resizing the image + # Because we used the above service, we already have a PIL image. So we can simply resize. + resized_image = image.resize((self.width, self.height)) + + # Preparing the image for output using InvokeAI's predefined Image Service. + output_image = context.services.images.create( + image=resized_image, + image_origin=ResourceOrigin.INTERNAL, + image_category=ImageCategory.GENERAL, + node_id=self.id, + session_id=context.graph_execution_state_id, + is_intermediate=self.is_intermediate, + ) + + # Returning the Image + return ImageOutput( + image=ImageField( + image_name=output_image.image_name, + image_origin=output_image.image_origin, + ), + width=output_image.width, + height=output_image.height, + ) +``` + +We now customized our code to let the frontend know that our Invocation falls +under `resize` and `image` categories. So when the user searches for these +particular words, our Invocation will show up too. + +We also set a custom title for our Invocation. So instead of being called +`Resize`, it will be called `My Custom Resize`. + +As simple as that. + +As time goes by, InvokeAI will further improve and add more customizability for +Invocation configuration. We will have more documentation regarding this at a +later time. + +# **[TODO]** + +## Custom Components For Frontend + +Every backend input type should have a corresponding frontend component so the +UI knows what to render when you use a particular field type. + +If you are using existing field types, we already have components for those. So +you don't have to worry about creating anything new. But this might not always +be the case. Sometimes you might want to create new field types and have the +frontend UI deal with it in a different way. + +This is where we venture into the world of React and Javascript and create our +own new components for our Invocations. Do not fear the world of JS. It's +actually pretty straightforward. + +Let us create a new component for our custom color field we created above. When +we use a color field, let us say we want the UI to display a color picker for +the user to pick from rather than entering values. That is what we will build +now. + +--- + +# OLD -- TO BE DELETED OR MOVED LATER + +--- ## Creating a new invocation diff --git a/docs/features/CLI.md b/docs/deprecated/CLI.md similarity index 98% rename from docs/features/CLI.md rename to docs/deprecated/CLI.md index d346b31000..eaa215c8dd 100644 --- a/docs/features/CLI.md +++ b/docs/deprecated/CLI.md @@ -205,14 +205,14 @@ Here are the invoke> command that apply to txt2img: | `--seamless` | | `False` | Activate seamless tiling for interesting effects | | `--seamless_axes` | | `x,y` | Specify which axes to use circular convolution on. | | `--log_tokenization` | `-t` | `False` | Display a color-coded list of the parsed tokens derived from the prompt | -| `--skip_normalization` | `-x` | `False` | Weighted subprompts will not be normalized. See [Weighted Prompts](./OTHER.md#weighted-prompts) | +| `--skip_normalization` | `-x` | `False` | Weighted subprompts will not be normalized. See [Weighted Prompts](../features/OTHER.md#weighted-prompts) | | `--upscale ` | `-U ` | `-U 1 0.75` | Upscale image by magnification factor (2, 4), and set strength of upscaling (0.0-1.0). If strength not set, will default to 0.75. | | `--facetool_strength ` | `-G ` | `-G0` | Fix faces (defaults to using the GFPGAN algorithm); argument indicates how hard the algorithm should try (0.0-1.0) | | `--facetool ` | `-ft ` | `-ft gfpgan` | Select face restoration algorithm to use: gfpgan, codeformer | | `--codeformer_fidelity` | `-cf ` | `0.75` | Used along with CodeFormer. Takes values between 0 and 1. 0 produces high quality but low accuracy. 1 produces high accuracy but low quality | | `--save_original` | `-save_orig` | `False` | When upscaling or fixing faces, this will cause the original image to be saved rather than replaced. | -| `--variation ` | `-v` | `0.0` | Add a bit of noise (0.0=none, 1.0=high) to the image in order to generate a series of variations. Usually used in combination with `-S` and `-n` to generate a series a riffs on a starting image. See [Variations](./VARIATIONS.md). | -| `--with_variations ` | | `None` | Combine two or more variations. See [Variations](./VARIATIONS.md) for now to use this. | +| `--variation ` | `-v` | `0.0` | Add a bit of noise (0.0=none, 1.0=high) to the image in order to generate a series of variations. Usually used in combination with `-S` and `-n` to generate a series a riffs on a starting image. See [Variations](../features/VARIATIONS.md). | +| `--with_variations ` | | `None` | Combine two or more variations. See [Variations](../features/VARIATIONS.md) for now to use this. | | `--save_intermediates ` | | `None` | Save the image from every nth step into an "intermediates" folder inside the output directory | | `--h_symmetry_time_pct ` | | `None` | Create symmetry along the X axis at the desired percent complete of the generation process. (Must be between 0.0 and 1.0; set to a very small number like 0.0001 for just after the first step of generation.) | | `--v_symmetry_time_pct ` | | `None` | Create symmetry along the Y axis at the desired percent complete of the generation process. (Must be between 0.0 and 1.0; set to a very small number like 0.0001 for just after the first step of generation.) | @@ -257,7 +257,7 @@ additional options: by `-M`. You may also supply just a single initial image with the areas to overpaint made transparent, but you must be careful not to destroy the pixels underneath when you create the transparent areas. See - [Inpainting](./INPAINTING.md) for details. + [Inpainting](INPAINTING.md) for details. inpainting accepts all the arguments used for txt2img and img2img, as well as the --mask (-M) and --text_mask (-tm) arguments: @@ -297,7 +297,7 @@ invoke> a piece of cake -I /path/to/breakfast.png -tm bagel 0.6 You can load and use hundreds of community-contributed Textual Inversion models just by typing the appropriate trigger phrase. Please -see [Concepts Library](CONCEPTS.md) for more details. +see [Concepts Library](../features/CONCEPTS.md) for more details. ## Other Commands diff --git a/docs/features/EMBIGGEN.md b/docs/deprecated/EMBIGGEN.md similarity index 100% rename from docs/features/EMBIGGEN.md rename to docs/deprecated/EMBIGGEN.md diff --git a/docs/features/INPAINTING.md b/docs/deprecated/INPAINTING.md similarity index 100% rename from docs/features/INPAINTING.md rename to docs/deprecated/INPAINTING.md diff --git a/docs/features/OUTPAINTING.md b/docs/deprecated/OUTPAINTING.md similarity index 100% rename from docs/features/OUTPAINTING.md rename to docs/deprecated/OUTPAINTING.md diff --git a/docs/features/CONCEPTS.md b/docs/features/CONCEPTS.md index 7bf39c8b84..d9988b60ba 100644 --- a/docs/features/CONCEPTS.md +++ b/docs/features/CONCEPTS.md @@ -1,9 +1,12 @@ --- -title: Concepts Library +title: Concepts --- # :material-library-shelves: The Hugging Face Concepts Library and Importing Textual Inversion files +With the advances in research, many new capabilities are available to customize the knowledge and understanding of novel concepts not originally contained in the base model. + + ## Using Textual Inversion Files Textual inversion (TI) files are small models that customize the output of @@ -12,18 +15,16 @@ and artistic styles. They are also known as "embeds" in the machine learning world. Each TI file introduces one or more vocabulary terms to the SD model. These are -known in InvokeAI as "triggers." Triggers are often, but not always, denoted -using angle brackets as in "<trigger-phrase>". The two most common type of +known in InvokeAI as "triggers." Triggers are denoted using angle brackets +as in "<trigger-phrase>". The two most common type of TI files that you'll encounter are `.pt` and `.bin` files, which are produced by different TI training packages. InvokeAI supports both formats, but its -[built-in TI training system](TEXTUAL_INVERSION.md) produces `.pt`. +[built-in TI training system](TRAINING.md) produces `.pt`. The [Hugging Face company](https://huggingface.co/sd-concepts-library) has amassed a large ligrary of >800 community-contributed TI files covering a -broad range of subjects and styles. InvokeAI has built-in support for this -library which downloads and merges TI files automatically upon request. You can -also install your own or others' TI files by placing them in a designated -directory. +broad range of subjects and styles. You can also install your own or others' TI files +by placing them in the designated directory for the compatible model type ### An Example @@ -41,91 +42,43 @@ You can also combine styles and concepts: | :--------------------------------------------------------: | | ![](../assets/concepts/image5.png) | -## Using a Hugging Face Concept -!!! warning "Authenticating to HuggingFace" - - Some concepts require valid authentication to HuggingFace. Without it, they will not be downloaded - and will be silently ignored. - - If you used an installer to install InvokeAI, you may have already set a HuggingFace token. - If you skipped this step, you can: - - - run the InvokeAI configuration script again (if you used a manual installer): `invokeai-configure` - - set one of the `HUGGINGFACE_TOKEN` or `HUGGING_FACE_HUB_TOKEN` environment variables to contain your token - - Finally, if you already used any HuggingFace library on your computer, you might already have a token - in your local cache. Check for a hidden `.huggingface` directory in your home folder. If it - contains a `token` file, then you are all set. - - -Hugging Face TI concepts are downloaded and installed automatically as you -require them. This requires your machine to be connected to the Internet. To -find out what each concept is for, you can browse the -[Hugging Face concepts library](https://huggingface.co/sd-concepts-library) and -look at examples of what each concept produces. - -When you have an idea of a concept you wish to try, go to the command-line -client (CLI) and type a `<` character and the beginning of the Hugging Face -concept name you wish to load. Press ++tab++, and the CLI will show you all -matching concepts. You can also type `<` and hit ++tab++ to get a listing of all -~800 concepts, but be prepared to scroll up to see them all! If there is more -than one match you can continue to type and ++tab++ until the concept is -completed. - -!!! example - - if you type in ` - ``` - - Now type `id` and press ++tab++. It will be autocompleted to `` - because this is a unique match. - - Finish your prompt and generate as usual. You may include multiple concept terms - in the prompt. - -If you have never used this concept before, you will see a message that the TI -model is being downloaded and installed. After this, the concept will be saved -locally (in the `models/sd-concepts-library` directory) for future use. - -Several steps happen during downloading and installation, including a scan of -the file for malicious code. Should any errors occur, you will be warned and the -concept will fail to load. Generation will then continue treating the trigger -term as a normal string of characters (e.g. as literal ``). - -You can also use `` in the WebGUI's prompt textbox. There is no -autocompletion at this time. ## Installing your Own TI Files You may install any number of `.pt` and `.bin` files simply by copying them into -the `embeddings` directory of the InvokeAI runtime directory (usually `invokeai` -in your home directory). You may create subdirectories in order to organize the -files in any way you wish. Be careful not to overwrite one file with another. +the `embedding` directory of the corresponding InvokeAI models directory (usually `invokeai` +in your home directory). For example, you can simply move a Stable Diffusion 1.5 embedding file to +the `sd-1/embedding` folder. Be careful not to overwrite one file with another. For example, TI files generated by the Hugging Face toolkit share the named -`learned_embedding.bin`. You can use subdirectories to keep them distinct. +`learned_embedding.bin`. You can rename these, or use subdirectories to keep them distinct. -At startup time, InvokeAI will scan the `embeddings` directory and load any TI -files it finds there. At startup you will see a message similar to this one: +At startup time, InvokeAI will scan the various `embedding` directories and load any TI +files it finds there for compatible models. At startup you will see a message similar to this one: ```bash ->> Current embedding manager terms: *, , +>> Current embedding manager terms: , ``` +To use these when generating, simply type the `<` key in your prompt to open the Textual Inversion WebUI and +select the embedding you'd like to use. This UI has type-ahead support, so you can easily find supported embeddings. -Note the `*` trigger term. This is a placeholder term that many early TI -tutorials taught people to use rather than a more descriptive term. -Unfortunately, if you have multiple TI files that all use this term, only the -first one loaded will be triggered by use of the term. +## Using LoRAs -To avoid this problem, you can use the `merge_embeddings.py` script to merge two -or more TI files together. If it encounters a collision of terms, the script -will prompt you to select new terms that do not collide. See -[Textual Inversion](TEXTUAL_INVERSION.md) for details. +LoRA files are models that customize the output of Stable Diffusion image generation. +Larger than embeddings, but much smaller than full models, they augment SD with improved +understanding of subjects and artistic styles. -## Further Reading +Unlike TI files, LoRAs do not introduce novel vocabulary into the model's known tokens. Instead, +LoRAs augment the model's weights that are applied to generate imagery. LoRAs may be supplied +with a "trigger" word that they have been explicitly trained on, or may simply apply their +effect without being triggered. + +LoRAs are typically stored in .safetensors files, which are the most secure way to store and transmit +these types of weights. You may install any number of `.safetensors` LoRA files simply by copying them into +the `lora` directory of the corresponding InvokeAI models directory (usually `invokeai` +in your home directory). For example, you can simply move a Stable Diffusion 1.5 LoRA file to +the `sd-1/lora` folder. + +To use these when generating, open the LoRA menu item in the options panel, select the LoRAs you want to apply +and ensure that they have the appropriate weight recommended by the model provider. Typically, most LoRAs perform best at a weight of .75-1. -Please see [the repository](https://github.com/rinongal/textual_inversion) and -associated paper for details and limitations. diff --git a/docs/features/CONTROLNET.md b/docs/features/CONTROLNET.md new file mode 100644 index 0000000000..a0f6d7d23a --- /dev/null +++ b/docs/features/CONTROLNET.md @@ -0,0 +1,92 @@ +--- +title: ControlNet +--- + +# :material-loupe: ControlNet + +## ControlNet + +ControlNet + +ControlNet is a powerful set of features developed by the open-source community (notably, Stanford researcher [**@ilyasviel**](https://github.com/lllyasviel)) that allows you to apply a secondary neural network model to your image generation process in Invoke. + +With ControlNet, you can get more control over the output of your image generation, providing you with a way to direct the network towards generating images that better fit your desired style or outcome. + + +### How it works + +ControlNet works by analyzing an input image, pre-processing that image to identify relevant information that can be interpreted by each specific ControlNet model, and then inserting that control information into the generation process. This can be used to adjust the style, composition, or other aspects of the image to better achieve a specific result. + + +### Models + +As part of the model installation, ControlNet models can be selected including a variety of pre-trained models that have been added to achieve different effects or styles in your generated images. Further ControlNet models may require additional code functionality to also be incorporated into Invoke's Invocations folder. You should expect to follow any installation instructions for ControlNet models loaded outside the default models provided by Invoke. The default models include: + + +**Canny**: + +When the Canny model is used in ControlNet, Invoke will attempt to generate images that match the edges detected. + +Canny edge detection works by detecting the edges in an image by looking for abrupt changes in intensity. It is known for its ability to detect edges accurately while reducing noise and false edges, and the preprocessor can identify more information by decreasing the thresholds. + +**M-LSD**: + +M-LSD is another edge detection algorithm used in ControlNet. It stands for Multi-Scale Line Segment Detector. + +It detects straight line segments in an image by analyzing the local structure of the image at multiple scales. It can be useful for architectural imagery, or anything where straight-line structural information is needed for the resulting output. + +**Lineart**: + +The Lineart model in ControlNet generates line drawings from an input image. The resulting pre-processed image is a simplified version of the original, with only the outlines of objects visible.The Lineart model in ControlNet is known for its ability to accurately capture the contours of the objects in an input sketch. + +**Lineart Anime**: + +A variant of the Lineart model that generates line drawings with a distinct style inspired by anime and manga art styles. + +**Depth**: +A model that generates depth maps of images, allowing you to create more realistic 3D models or to simulate depth effects in post-processing. + +**Normal Map (BAE):** +A model that generates normal maps from input images, allowing for more realistic lighting effects in 3D rendering. + +**Image Segmentation**: +A model that divides input images into segments or regions, each of which corresponds to a different object or part of the image. (More details coming soon) + + +**Openpose**: +The OpenPose control model allows for the identification of the general pose of a character by pre-processing an existing image with a clear human structure. With advanced options, Openpose can also detect the face or hands in the image. + +**Mediapipe Face**: + +The MediaPipe Face identification processor is able to clearly identify facial features in order to capture vivid expressions of human faces. + +**Tile (experimental)**: + +The Tile model fills out details in the image to match the image, rather than the prompt. The Tile Model is a versatile tool that offers a range of functionalities. Its primary capabilities can be boiled down to two main behaviors: + +- It can reinterpret specific details within an image and create fresh, new elements. +- It has the ability to disregard global instructions if there's a discrepancy between them and the local context or specific parts of the image. In such cases, it uses the local context to guide the process. + +The Tile Model can be a powerful tool in your arsenal for enhancing image quality and details. If there are undesirable elements in your images, such as blurriness caused by resizing, this model can effectively eliminate these issues, resulting in cleaner, crisper images. Moreover, it can generate and add refined details to your images, improving their overall quality and appeal. + +**Pix2Pix (experimental)** + +With Pix2Pix, you can input an image into the controlnet, and then "instruct" the model to change it using your prompt. For example, you can say "Make it winter" to add more wintry elements to a scene. + +**Inpaint**: Coming Soon - Currently this model is available but not functional on the Canvas. An upcoming release will provide additional capabilities for using this model when inpainting. + +Each of these models can be adjusted and combined with other ControlNet models to achieve different results, giving you even more control over your image generation process. + + +## Using ControlNet + +To use ControlNet, you can simply select the desired model and adjust both the ControlNet and Pre-processor settings to achieve the desired result. You can also use multiple ControlNet models at the same time, allowing you to achieve even more complex effects or styles in your generated images. + + +Each ControlNet has two settings that are applied to the ControlNet. + +Weight - Strength of the Controlnet model applied to the generation for the section, defined by start/end. + +Start/End - 0 represents the start of the generation, 1 represents the end. The Start/end setting controls what steps during the generation process have the ControlNet applied. + +Additionally, each ControlNet section can be expanded in order to manipulate settings for the image pre-processor that adjusts your uploaded image before using it in when you Invoke. diff --git a/docs/features/IMG2IMG.md b/docs/features/IMG2IMG.md index fffba05f1b..046a25fdca 100644 --- a/docs/features/IMG2IMG.md +++ b/docs/features/IMG2IMG.md @@ -4,86 +4,13 @@ title: Image-to-Image # :material-image-multiple: Image-to-Image -Both the Web and command-line interfaces provide an "img2img" feature -that lets you seed your creations with an initial drawing or -photo. This is a really cool feature that tells stable diffusion to -build the prompt on top of the image you provide, preserving the -original's basic shape and layout. +InvokeAI provides an "img2img" feature that lets you seed your +creations with an initial drawing or photo. This is a really cool +feature that tells stable diffusion to build the prompt on top of the +image you provide, preserving the original's basic shape and layout. -See the [WebUI Guide](WEB.md) for a walkthrough of the img2img feature -in the InvokeAI web server. This document describes how to use img2img -in the command-line tool. - -## Basic Usage - -Launch the command-line client by launching `invoke.sh`/`invoke.bat` -and choosing option (1). Alternative, activate the InvokeAI -environment and issue the command `invokeai`. - -Once the `invoke> ` prompt appears, you can start an img2img render by -pointing to a seed file with the `-I` option as shown here: - -!!! example "" - - ```commandline - tree on a hill with a river, nature photograph, national geographic -I./test-pictures/tree-and-river-sketch.png -f 0.85 - ``` - -
- - | original image | generated image | - | :------------: | :-------------: | - | ![original-image](https://user-images.githubusercontent.com/50542132/193946000-c42a96d8-5a74-4f8a-b4c3-5213e6cadcce.png){ width=320 } | ![generated-image](https://user-images.githubusercontent.com/111189/194135515-53d4c060-e994-4016-8121-7c685e281ac9.png){ width=320 } | - -
- -The `--init_img` (`-I`) option gives the path to the seed picture. `--strength` -(`-f`) controls how much the original will be modified, ranging from `0.0` (keep -the original intact), to `1.0` (ignore the original completely). The default is -`0.75`, and ranges from `0.25-0.90` give interesting results. Other relevant -options include `-C` (classification free guidance scale), and `-s` (steps). -Unlike `txt2img`, adding steps will continuously change the resulting image and -it will not converge. - -You may also pass a `-v` option to generate `-n` -count variants on the original image. This is done by passing the first -generated image back into img2img the requested number of times. It generates -interesting variants. - -Note that the prompt makes a big difference. For example, this slight variation -on the prompt produces a very different image: - -
-![](https://user-images.githubusercontent.com/111189/194135220-16b62181-b60c-4248-8989-4834a8fd7fbd.png){ width=320 } -photograph of a tree on a hill with a river -
- -!!! tip - - When designing prompts, think about how the images scraped from the internet were - captioned. Very few photographs will be labeled "photograph" or "photorealistic." - They will, however, be captioned with the publication, photographer, camera model, - or film settings. - -If the initial image contains transparent regions, then Stable Diffusion will -only draw within the transparent regions, a process called -[`inpainting`](./INPAINTING.md#creating-transparent-regions-for-inpainting). -However, for this to work correctly, the color information underneath the -transparent needs to be preserved, not erased. - -!!! warning "**IMPORTANT ISSUE** " - - `img2img` does not work properly on initial images smaller - than 512x512. Please scale your image to at least 512x512 before using it. - Larger images are not a problem, but may run out of VRAM on your GPU card. To - fix this, use the --fit option, which downscales the initial image to fit within - the box specified by width x height: - - ``` - tree on a hill with a river, national geographic -I./test-pictures/big-sketch.png -H512 -W512 --fit - ``` - -## How does it actually work, though? +For a walkthrough of using Image-to-Image in the Web UI, see [InvokeAI +Web Server](./WEB.md#image-to-image). The main difference between `img2img` and `prompt2img` is the starting point. While `prompt2img` always starts with pure gaussian noise and progressively @@ -99,10 +26,6 @@ seed `1592514025` develops something like this: !!! example "" - ```bash - invoke> "fire" -s10 -W384 -H384 -S1592514025 - ``` -
![latent steps](../assets/img2img/000019.steps.png){ width=720 }
@@ -157,17 +80,8 @@ Diffusion has less chance to refine itself, so the result ends up inheriting all the problems of my bad drawing. If you want to try this out yourself, all of these are using a seed of -`1592514025` with a width/height of `384`, step count `10`, the default sampler -(`k_lms`), and the single-word prompt `"fire"`: - -```bash -invoke> "fire" -s10 -W384 -H384 -S1592514025 -I /tmp/fire-drawing.png --strength 0.7 -``` - -The code for rendering intermediates is on my (damian0815's) branch -[document-img2img](https://github.com/damian0815/InvokeAI/tree/document-img2img) - -run `invoke.py` and check your `outputs/img-samples/intermediates` folder while -generating an image. +`1592514025` with a width/height of `384`, step count `10`, the +`k_lms` sampler, and the single-word prompt `"fire"`. ### Compensating for the reduced step count @@ -180,10 +94,6 @@ give each generation 20 steps. Here's strength `0.4` (note step count `50`, which is `20 ÷ 0.4` to make sure SD does `20` steps from my image): -```bash -invoke> "fire" -s50 -W384 -H384 -S1592514025 -I /tmp/fire-drawing.png -f 0.4 -``` -
![000035.1592514025](../assets/img2img/000035.1592514025.png)
@@ -191,10 +101,6 @@ invoke> "fire" -s50 -W384 -H384 -S1592514025 -I /tmp/fire-drawing.png -f 0.4 and here is strength `0.7` (note step count `30`, which is roughly `20 ÷ 0.7` to make sure SD does `20` steps from my image): -```commandline -invoke> "fire" -s30 -W384 -H384 -S1592514025 -I /tmp/fire-drawing.png -f 0.7 -``` -
![000046.1592514025](../assets/img2img/000046.1592514025.png)
diff --git a/docs/features/MODEL_MERGING.md b/docs/features/MODEL_MERGING.md index 7157e035ae..36e15ad0e4 100644 --- a/docs/features/MODEL_MERGING.md +++ b/docs/features/MODEL_MERGING.md @@ -71,6 +71,3 @@ under the selected name and register it with InvokeAI. use InvokeAI conventions - only alphanumeric letters and the characters ".+-". -## Caveats - -This is a new script and may contain bugs. diff --git a/docs/features/NSFW.md b/docs/features/NSFW.md index 06d382f47d..f0539cc6a9 100644 --- a/docs/features/NSFW.md +++ b/docs/features/NSFW.md @@ -31,10 +31,22 @@ turned on and off on the command line using `--nsfw_checker` and At installation time, InvokeAI will ask whether the checker should be activated by default (neither argument given on the command line). The -response is stored in the InvokeAI initialization file (usually -`invokeai.init` in your home directory). You can change the default at any -time by opening this file in a text editor and commenting or -uncommenting the line `--nsfw_checker`. +response is stored in the InvokeAI initialization file +(`invokeai.yaml` in the InvokeAI root directory). You can change the +default at any time by opening this file in a text editor and +changing the line `nsfw_checker:` from true to false or vice-versa: + + +``` +... + Features: + esrgan: true + internet_available: true + log_tokenization: false + nsfw_checker: true + patchmatch: true + restore: true +``` ## Caveats @@ -79,11 +91,3 @@ generates. However, it does write metadata into the PNG data area, including the prompt used to generate the image and relevant parameter settings. These fields can be examined using the `sd-metadata.py` script that comes with the InvokeAI package. - -Note that several other Stable Diffusion distributions offer -wavelet-based "invisible" watermarking. We have experimented with the -library used to generate these watermarks and have reached the -conclusion that while the watermarking library may be adding -watermarks to PNG images, the currently available version is unable to -retrieve them successfully. If and when a functioning version of the -library becomes available, we will offer this feature as well. diff --git a/docs/features/OTHER.md b/docs/features/OTHER.md index 2ba76e912a..2401f644ba 100644 --- a/docs/features/OTHER.md +++ b/docs/features/OTHER.md @@ -18,43 +18,16 @@ Output Example: ## **Seamless Tiling** -The seamless tiling mode causes generated images to seamlessly tile with itself. To use it, add the -`--seamless` option when starting the script which will result in all generated images to tile, or -for each `invoke>` prompt as shown here: +The seamless tiling mode causes generated images to seamlessly tile +with itself creating repetitive wallpaper-like patterns. To use it, +activate the Seamless Tiling option in the Web GUI and then select +whether to tile on the X (horizontal) and/or Y (vertical) axes. Tiling +will then be active for the next set of generations. + +A nice prompt to test seamless tiling with is: -```python -invoke> "pond garden with lotus by claude monet" --seamless -s100 -n4 ``` - -By default this will tile on both the X and Y axes. However, you can also specify specific axes to tile on with `--seamless_axes`. -Possible values are `x`, `y`, and `x,y`: -```python -invoke> "pond garden with lotus by claude monet" --seamless --seamless_axes=x -s100 -n4 -``` - ---- - -## **Shortcuts: Reusing Seeds** - -Since it is so common to reuse seeds while refining a prompt, there is now a shortcut as of version -1.11. Provide a `-S` (or `--seed`) switch of `-1` to use the seed of the most recent image -generated. If you produced multiple images with the `-n` switch, then you can go back further -using `-2`, `-3`, etc. up to the first image generated by the previous command. Sorry, but you can't go -back further than one command. - -Here's an example of using this to do a quick refinement. It also illustrates using the new `-G` -switch to turn on upscaling and face enhancement (see previous section): - -```bash -invoke> a cute child playing hopscotch -G0.5 -[...] -outputs/img-samples/000039.3498014304.png: "a cute child playing hopscotch" -s50 -W512 -H512 -C7.5 -mk_lms -S3498014304 - -# I wonder what it will look like if I bump up the steps and set facial enhancement to full strength? -invoke> a cute child playing hopscotch -G1.0 -s100 -S -1 -reusing previous seed 3498014304 -[...] -outputs/img-samples/000040.3498014304.png: "a cute child playing hopscotch" -G1.0 -s100 -W512 -H512 -C7.5 -mk_lms -S3498014304 +pond garden with lotus by claude monet" ``` --- @@ -73,66 +46,27 @@ This will tell the sampler to invest 25% of its effort on the tabby cat aspect o on the white duck aspect (surprisingly, this example actually works). The prompt weights can use any combination of integers and floating point numbers, and they do not need to add up to 1. ---- - -## **Filename Format** - -The argument `--fnformat` allows to specify the filename of the - image. Supported wildcards are all arguments what can be set such as - `perlin`, `seed`, `threshold`, `height`, `width`, `gfpgan_strength`, - `sampler_name`, `steps`, `model`, `upscale`, `prompt`, `cfg_scale`, - `prefix`. - -The following prompt -```bash -dream> a red car --steps 25 -C 9.8 --perlin 0.1 --fnformat {prompt}_steps.{steps}_cfg.{cfg_scale}_perlin.{perlin}.png -``` - -generates a file with the name: `outputs/img-samples/a red car_steps.25_cfg.9.8_perlin.0.1.png` - ---- - ## **Thresholding and Perlin Noise Initialization Options** -Two new options are the thresholding (`--threshold`) and the perlin noise initialization (`--perlin`) options. Thresholding limits the range of the latent values during optimization, which helps combat oversaturation with higher CFG scale values. Perlin noise initialization starts with a percentage (a value ranging from 0 to 1) of perlin noise mixed into the initial noise. Both features allow for more variations and options in the course of generating images. +Under the Noise section of the Web UI, you will find two options named +Perlin Noise and Noise Threshold. [Perlin +noise](https://en.wikipedia.org/wiki/Perlin_noise) is a type of +structured noise used to simulate terrain and other natural +textures. The slider controls the percentage of perlin noise that will +be mixed into the image at the beginning of generation. Adding a little +perlin noise to a generation will alter the image substantially. + +The noise threshold limits the range of the latent values during +sampling and helps combat the oversharpening seem with higher CFG +scale values. For better intuition into what these options do in practice: ![here is a graphic demonstrating them both](../assets/truncation_comparison.jpg) -In generating this graphic, perlin noise at initialization was programmatically varied going across on the diagram by values 0.0, 0.1, 0.2, 0.4, 0.5, 0.6, 0.8, 0.9, 1.0; and the threshold was varied going down from -0, 1, 2, 3, 4, 5, 10, 20, 100. The other options are fixed, so the initial prompt is as follows (no thresholding or perlin noise): - -```bash -invoke> "a portrait of a beautiful young lady" -S 1950357039 -s 100 -C 20 -A k_euler_a --threshold 0 --perlin 0 -``` - -Here's an example of another prompt used when setting the threshold to 5 and perlin noise to 0.2: - -```bash -invoke> "a portrait of a beautiful young lady" -S 1950357039 -s 100 -C 20 -A k_euler_a --threshold 5 --perlin 0.2 -``` - -!!! note - - currently the thresholding feature is only implemented for the k-diffusion style samplers, and empirically appears to work best with `k_euler_a` and `k_dpm_2_a`. Using 0 disables thresholding. Using 0 for perlin noise disables using perlin noise for initialization. Finally, using 1 for perlin noise uses only perlin noise for initialization. - ---- - -## **Simplified API** - -For programmers who wish to incorporate stable-diffusion into other products, this repository -includes a simplified API for text to image generation, which lets you create images from a prompt -in just three lines of code: - -```bash -from ldm.generate import Generate -g = Generate() -outputs = g.txt2img("a unicorn in manhattan") -``` - -Outputs is a list of lists in the format [filename1,seed1],[filename2,seed2]...]. - -Please see the documentation in ldm/generate.py for more information. - ---- +In generating this graphic, perlin noise at initialization was +programmatically varied going across on the diagram by values 0.0, +0.1, 0.2, 0.4, 0.5, 0.6, 0.8, 0.9, 1.0; and the threshold was varied +going down from 0, 1, 2, 3, 4, 5, 10, 20, 100. The other options are +fixed using the prompt "a portrait of a beautiful young lady" a CFG of +20, 100 steps, and a seed of 1950357039. diff --git a/docs/features/POSTPROCESS.md b/docs/features/POSTPROCESS.md index c0233951da..22ef51e109 100644 --- a/docs/features/POSTPROCESS.md +++ b/docs/features/POSTPROCESS.md @@ -8,12 +8,6 @@ title: Postprocessing This extension provides the ability to restore faces and upscale images. -Face restoration and upscaling can be applied at the time you generate the -images, or at any later time against a previously-generated PNG file, using the -[!fix](#fixing-previously-generated-images) command. -[Outpainting and outcropping](OUTPAINTING.md) can only be applied after the -fact. - ## Face Fixing The default face restoration module is GFPGAN. The default upscale is @@ -23,8 +17,7 @@ Real-ESRGAN. For an alternative face restoration module, see As of version 1.14, environment.yaml will install the Real-ESRGAN package into the standard install location for python packages, and will put GFPGAN into a subdirectory of "src" in the InvokeAI directory. Upscaling with Real-ESRGAN -should "just work" without further intervention. Simply pass the `--upscale` -(`-U`) option on the `invoke>` command line, or indicate the desired scale on +should "just work" without further intervention. Simply indicate the desired scale on the popup in the Web GUI. **GFPGAN** requires a series of downloadable model files to work. These are @@ -41,48 +34,75 @@ reconstruction. ### Upscaling -`-U : ` +Open the upscaling dialog by clicking on the "expand" icon located +above the image display area in the Web UI: -The upscaling prompt argument takes two values. The first value is a scaling -factor and should be set to either `2` or `4` only. This will either scale the -image 2x or 4x respectively using different models. +
+![upscale1](../assets/features/upscale-dialog.png) +
-You can set the scaling stength between `0` and `1.0` to control intensity of -the of the scaling. This is handy because AI upscalers generally tend to smooth -out texture details. If you wish to retain some of those for natural looking -results, we recommend using values between `0.5 to 0.8`. +There are three different upscaling parameters that you can +adjust. The first is the scale itself, either 2x or 4x. -If you do not explicitly specify an upscaling_strength, it will default to 0.75. +The second is the "Denoising Strength." Higher values will smooth out +the image and remove digital chatter, but may lose fine detail at +higher values. + +Third, "Upscale Strength" allows you to adjust how the You can set the +scaling stength between `0` and `1.0` to control the intensity of the +scaling. AI upscalers generally tend to smooth out texture details. If +you wish to retain some of those for natural looking results, we +recommend using values between `0.5 to 0.8`. + +[This figure](../assets/features/upscaling-montage.png) illustrates +the effects of denoising and strength. The original image was 512x512, +4x scaled to 2048x2048. The "original" version on the upper left was +scaled using simple pixel averaging. The remainder use the ESRGAN +upscaling algorithm at different levels of denoising and strength. + +
+![upscaling](../assets/features/upscaling-montage.png){ width=720 } +
+ +Both denoising and strength default to 0.75. ### Face Restoration -`-G : ` +InvokeAI offers alternative two face restoration algorithms, +[GFPGAN](https://github.com/TencentARC/GFPGAN) and +[CodeFormer](https://huggingface.co/spaces/sczhou/CodeFormer). These +algorithms improve the appearance of faces, particularly eyes and +mouths. Issues with faces are less common with the latest set of +Stable Diffusion models than with the original 1.4 release, but the +restoration algorithms can still make a noticeable improvement in +certain cases. You can also apply restoration to old photographs you +upload. -This prompt argument controls the strength of the face restoration that is being -applied. Similar to upscaling, values between `0.5 to 0.8` are recommended. +To access face restoration, click the "smiley face" icon in the +toolbar above the InvokeAI image panel. You will be presented with a +dialog that offers a choice between the two algorithm and sliders that +allow you to adjust their parameters. Alternatively, you may open the +left-hand accordion panel labeled "Face Restoration" and have the +restoration algorithm of your choice applied to generated images +automatically. -You can use either one or both without any conflicts. In cases where you use -both, the image will be first upscaled and then the face restoration process -will be executed to ensure you get the highest quality facial features. -`--save_orig` +Like upscaling, there are a number of parameters that adjust the face +restoration output. GFPGAN has a single parameter, `strength`, which +controls how much the algorithm is allowed to adjust the +image. CodeFormer has two parameters, `strength`, and `fidelity`, +which together control the quality of the output image as described in +the [CodeFormer project +page](https://shangchenzhou.com/projects/CodeFormer/). Default values +are 0.75 for both parameters, which achieves a reasonable balance +between changing the image too much and not enough. -When you use either `-U` or `-G`, the final result you get is upscaled or face -modified. If you want to save the original Stable Diffusion generation, you can -use the `-save_orig` prompt argument to save the original unaffected version -too. +[This figure](../assets/features/restoration-montage.png) illustrates +the effects of adjusting GFPGAN and CodeFormer parameters. -### Example Usage - -```bash -invoke> "superman dancing with a panda bear" -U 2 0.6 -G 0.4 -``` - -This also works with img2img: - -```bash -invoke> "a man wearing a pineapple hat" -I path/to/your/file.png -U 2 0.5 -G 0.6 -``` +
+![upscaling](../assets/features/restoration-montage.png){ width=720 } +
!!! note @@ -95,69 +115,8 @@ invoke> "a man wearing a pineapple hat" -I path/to/your/file.png -U 2 0.5 -G 0.6 process is complete. While the image generation is taking place, you will still be able to preview the base images. -If you wish to stop during the image generation but want to upscale or face -restore a particular generated image, pass it again with the same prompt and -generated seed along with the `-U` and `-G` prompt arguments to perform those -actions. - -## CodeFormer Support - -This repo also allows you to perform face restoration using -[CodeFormer](https://github.com/sczhou/CodeFormer). - -In order to setup CodeFormer to work, you need to download the models like with -GFPGAN. You can do this either by running `invokeai-configure` or by manually -downloading the -[model file](https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth) -and saving it to `ldm/invoke/restoration/codeformer/weights` folder. - -You can use `-ft` prompt argument to swap between CodeFormer and the default -GFPGAN. The above mentioned `-G` prompt argument will allow you to control the -strength of the restoration effect. - -### CodeFormer Usage - -The following command will perform face restoration with CodeFormer instead of -the default gfpgan. - -` -G 0.8 -ft codeformer` - -### Other Options - -- `-cf` - cf or CodeFormer Fidelity takes values between `0` and `1`. 0 produces - high quality results but low accuracy and 1 produces lower quality results but - higher accuacy to your original face. - -The following command will perform face restoration with CodeFormer. CodeFormer -will output a result that is closely matching to the input face. - -` -G 1.0 -ft codeformer -cf 0.9` - -The following command will perform face restoration with CodeFormer. CodeFormer -will output a result that is the best restoration possible. This may deviate -slightly from the original face. This is an excellent option to use in -situations when there is very little facial data to work with. - -` -G 1.0 -ft codeformer -cf 0.1` - -## Fixing Previously-Generated Images - -It is easy to apply face restoration and/or upscaling to any -previously-generated file. Just use the syntax -`!fix path/to/file.png `. For example, to apply GFPGAN at strength 0.8 -and upscale 2X for a file named `./outputs/img-samples/000044.2945021133.png`, -just run: - -```bash -invoke> !fix ./outputs/img-samples/000044.2945021133.png -G 0.8 -U 2 -``` - -A new file named `000044.2945021133.fixed.png` will be created in the output -directory. Note that the `!fix` command does not replace the original file, -unlike the behavior at generate time. - ## How to disable If, for some reason, you do not wish to load the GFPGAN and/or ESRGAN libraries, you can disable them on the invoke.py command line with the `--no_restore` and -`--no_upscale` options, respectively. +`--no_esrgan` options, respectively. diff --git a/docs/features/PROMPTS.md b/docs/features/PROMPTS.md index 045e0d658a..1fd4550493 100644 --- a/docs/features/PROMPTS.md +++ b/docs/features/PROMPTS.md @@ -4,77 +4,12 @@ title: Prompting-Features # :octicons-command-palette-24: Prompting-Features -## **Reading Prompts from a File** - -You can automate `invoke.py` by providing a text file with the prompts you want -to run, one line per prompt. The text file must be composed with a text editor -(e.g. Notepad) and not a word processor. Each line should look like what you -would type at the invoke> prompt: - -```bash -"a beautiful sunny day in the park, children playing" -n4 -C10 -"stormy weather on a mountain top, goats grazing" -s100 -"innovative packaging for a squid's dinner" -S137038382 -``` - -Then pass this file's name to `invoke.py` when you invoke it: - -```bash -python scripts/invoke.py --from_file "/path/to/prompts.txt" -``` - -You may also read a series of prompts from standard input by providing -a filename of `-`. For example, here is a python script that creates a -matrix of prompts, each one varying slightly: - -```bash -#!/usr/bin/env python - -adjectives = ['sunny','rainy','overcast'] -samplers = ['k_lms','k_euler_a','k_heun'] -cfg = [7.5, 9, 11] - -for adj in adjectives: - for samp in samplers: - for cg in cfg: - print(f'a {adj} day -A{samp} -C{cg}') -``` - -Its output looks like this (abbreviated): - -```bash -a sunny day -Aklms -C7.5 -a sunny day -Aklms -C9 -a sunny day -Aklms -C11 -a sunny day -Ak_euler_a -C7.5 -a sunny day -Ak_euler_a -C9 -... -a overcast day -Ak_heun -C9 -a overcast day -Ak_heun -C11 -``` - -To feed it to invoke.py, pass the filename of "-" - -```bash -python matrix.py | python scripts/invoke.py --from_file - -``` - -When the script is finished, each of the 27 combinations -of adjective, sampler and CFG will be executed. - -The command-line interface provides `!fetch` and `!replay` commands -which allow you to read the prompts from a single previously-generated -image or a whole directory of them, write the prompts to a file, and -then replay them. Or you can create your own file of prompts and feed -them to the command-line client from within an interactive session. -See [Command-Line Interface](CLI.md) for details. - ---- - ## **Negative and Unconditioned Prompts** -Any words between a pair of square brackets will instruct Stable Diffusion to -attempt to ban the concept from the generated image. +Any words between a pair of square brackets will instruct Stable +Diffusion to attempt to ban the concept from the generated image. The +same effect is achieved by placing words in the "Negative Prompts" +textbox in the Web UI. ```text this is a test prompt [not really] to make you understand [cool] how this works. @@ -87,7 +22,9 @@ Here's a prompt that depicts what it does. original prompt: -`#!bash "A fantastical translucent pony made of water and foam, ethereal, radiant, hyperalism, scottish folklore, digital painting, artstation, concept art, smooth, 8 k frostbite 3 engine, ultra detailed, art by artgerm and greg rutkowski and magali villeneuve" -s 20 -W 512 -H 768 -C 7.5 -A k_euler_a -S 1654590180` +`#!bash "A fantastical translucent pony made of water and foam, ethereal, radiant, hyperalism, scottish folklore, digital painting, artstation, concept art, smooth, 8 k frostbite 3 engine, ultra detailed, art by artgerm and greg rutkowski and magali villeneuve"` + +`#!bash parameters: steps=20, dimensions=512x768, CFG=7.5, Scheduler=k_euler_a, seed=1654590180`
@@ -99,7 +36,8 @@ That image has a woman, so if we want the horse without a rider, we can influence the image not to have a woman by putting [woman] in the prompt, like this: -`#!bash "A fantastical translucent poney made of water and foam, ethereal, radiant, hyperalism, scottish folklore, digital painting, artstation, concept art, smooth, 8 k frostbite 3 engine, ultra detailed, art by artgerm and greg rutkowski and magali villeneuve [woman]" -s 20 -W 512 -H 768 -C 7.5 -A k_euler_a -S 1654590180` +`#!bash "A fantastical translucent poney made of water and foam, ethereal, radiant, hyperalism, scottish folklore, digital painting, artstation, concept art, smooth, 8 k frostbite 3 engine, ultra detailed, art by artgerm and greg rutkowski and magali villeneuve [woman]"` +(same parameters as above)
@@ -110,7 +48,8 @@ this: That's nice - but say we also don't want the image to be quite so blue. We can add "blue" to the list of negative prompts, so it's now [woman blue]: -`#!bash "A fantastical translucent poney made of water and foam, ethereal, radiant, hyperalism, scottish folklore, digital painting, artstation, concept art, smooth, 8 k frostbite 3 engine, ultra detailed, art by artgerm and greg rutkowski and magali villeneuve [woman blue]" -s 20 -W 512 -H 768 -C 7.5 -A k_euler_a -S 1654590180` +`#!bash "A fantastical translucent poney made of water and foam, ethereal, radiant, hyperalism, scottish folklore, digital painting, artstation, concept art, smooth, 8 k frostbite 3 engine, ultra detailed, art by artgerm and greg rutkowski and magali villeneuve [woman blue]"` +(same parameters as above)
@@ -121,7 +60,8 @@ add "blue" to the list of negative prompts, so it's now [woman blue]: Getting close - but there's no sense in having a saddle when our horse doesn't have a rider, so we'll add one more negative prompt: [woman blue saddle]. -`#!bash "A fantastical translucent poney made of water and foam, ethereal, radiant, hyperalism, scottish folklore, digital painting, artstation, concept art, smooth, 8 k frostbite 3 engine, ultra detailed, art by artgerm and greg rutkowski and magali villeneuve [woman blue saddle]" -s 20 -W 512 -H 768 -C 7.5 -A k_euler_a -S 1654590180` +`#!bash "A fantastical translucent poney made of water and foam, ethereal, radiant, hyperalism, scottish folklore, digital painting, artstation, concept art, smooth, 8 k frostbite 3 engine, ultra detailed, art by artgerm and greg rutkowski and magali villeneuve [woman blue saddle]"` +(same parameters as above)
@@ -261,19 +201,6 @@ Prompt2prompt `.swap()` is not compatible with xformers, which will be temporari The `prompt2prompt` code is based off [bloc97's colab](https://github.com/bloc97/CrossAttentionControl). -Note that `prompt2prompt` is not currently working with the runwayML inpainting -model, and may never work due to the way this model is set up. If you attempt to -use `prompt2prompt` you will get the original image back. However, since this -model is so good at inpainting, a good substitute is to use the `clipseg` text -masking option: - -```bash -invoke> a fluffy cat eating a hotdog -Outputs: -[1010] outputs/000025.2182095108.png: a fluffy cat eating a hotdog -invoke> a smiling dog eating a hotdog -I 000025.2182095108.png -tm cat -``` - ### Escaping parantheses () and speech marks "" If the model you are using has parentheses () or speech marks "" as part of its @@ -374,6 +301,48 @@ summoning up the concept of some sort of scifi creature? Let's find out. Indeed, removing the word "hybrid" produces an image that is more like what we'd expect. -In conclusion, prompt blending is great for exploring creative space, but can be -difficult to direct. A forthcoming release of InvokeAI will feature more -deterministic prompt weighting. +## Dynamic Prompts + +Dynamic Prompts are a powerful feature designed to produce a variety of prompts based on user-defined options. Using a special syntax, you can construct a prompt with multiple possibilities, and the system will automatically generate a series of permutations based on your settings. This is extremely beneficial for ideation, exploring various scenarios, or testing different concepts swiftly and efficiently. + +### Structure of a Dynamic Prompt + +A Dynamic Prompt comprises of regular text, supplemented with alternatives enclosed within curly braces {} and separated by a vertical bar |. For example: {option1|option2|option3}. The system will then select one of the options to include in the final prompt. This flexible system allows for options to be placed throughout the text as needed. + +Furthermore, Dynamic Prompts can designate multiple selections from a single group of options. This feature is triggered by prefixing the options with a numerical value followed by $$. For example, in {2$$option1|option2|option3}, the system will select two distinct options from the set. +### Creating Dynamic Prompts + +To create a Dynamic Prompt, follow these steps: + + Draft your sentence or phrase, identifying words or phrases with multiple possible options. + Encapsulate the different options within curly braces {}. + Within the braces, separate each option using a vertical bar |. + If you want to include multiple options from a single group, prefix with the desired number and $$. + +For instance: A {house|apartment|lodge|cottage} in {summer|winter|autumn|spring} designed in {2$$style1|style2|style3}. +### How Dynamic Prompts Work + +Once a Dynamic Prompt is configured, the system generates an array of combinations using the options provided. Each group of options in curly braces is treated independently, with the system selecting one option from each group. For a prefixed set (e.g., 2$$), the system will select two distinct options. + +For example, the following prompts could be generated from the above Dynamic Prompt: + + A house in summer designed in style1, style2 + A lodge in autumn designed in style3, style1 + A cottage in winter designed in style2, style3 + And many more! + +When the `Combinatorial` setting is on, Invoke will disable the "Images" selection, and generate every combination up until the setting for Max Prompts is reached. +When the `Combinatorial` setting is off, Invoke will randomly generate combinations up until the setting for Images has been reached. + + + +### Tips and Tricks for Using Dynamic Prompts + +Below are some useful strategies for creating Dynamic Prompts: + + Utilize Dynamic Prompts to generate a wide spectrum of prompts, perfect for brainstorming and exploring diverse ideas. + Ensure that the options within a group are contextually relevant to the part of the sentence where they are used. For instance, group building types together, and seasons together. + Apply the 2$$ prefix when you want to incorporate more than one option from a single group. This becomes quite handy when mixing and matching different elements. + Experiment with different quantities for the prefix. For example, 3$$ will select three distinct options. + Be aware of coherence in your prompts. Although the system can generate all possible combinations, not all may semantically make sense. Therefore, carefully choose the options for each group. + Always review and fine-tune the generated prompts as needed. While Dynamic Prompts can help you generate a multitude of combinations, the final polishing and refining remain in your hands. diff --git a/docs/features/TEXTUAL_INVERSION.md b/docs/features/TRAINING.md similarity index 93% rename from docs/features/TEXTUAL_INVERSION.md rename to docs/features/TRAINING.md index e90bd1a7f4..41197a334f 100644 --- a/docs/features/TEXTUAL_INVERSION.md +++ b/docs/features/TRAINING.md @@ -1,9 +1,10 @@ --- -title: Textual-Inversion +title: Training --- -# :material-file-document: Textual Inversion +# :material-file-document: Training +# Textual Inversion Training ## **Personalizing Text-to-Image Generation** You may personalize the generated images to provide your own styles or objects @@ -46,11 +47,19 @@ start the front end by selecting choice (3): ```sh Do you want to generate images using the -1. command-line -2. browser-based UI -3. textual inversion training -4. open the developer console -Please enter 1, 2, 3, or 4: [1] 3 +1: Browser-based UI +2: Command-line interface +3: Run textual inversion training +4: Merge models (diffusers type only) +5: Download and install models +6: Change InvokeAI startup options +7: Re-run the configure script to fix a broken install +8: Open the developer console +9: Update InvokeAI +10: Command-line help +Q: Quit + +Please enter 1-10, Q: [1] ``` From the command line, with the InvokeAI virtual environment active, @@ -250,16 +259,6 @@ invokeai-ti \ --only_save_embeds ``` -## Using Embeddings - -After training completes, the resultant embeddings will be saved into your `$INVOKEAI_ROOT/embeddings//learned_embeds.bin`. - -These will be automatically loaded when you start InvokeAI. - -Add the trigger word, surrounded by angle brackets, to use that embedding. For example, if your trigger word was `terence`, use `` in prompts. This is the same syntax used by the HuggingFace concepts library. - -**Note:** `.pt` embeddings do not require the angle brackets. - ## Troubleshooting ### `Cannot load embedding for . It was trained on a model with token dimension 1024, but the current model has token dimension 768` diff --git a/docs/features/VARIATIONS.md b/docs/features/VARIATIONS.md index aeeb57d52c..e6e21490c8 100644 --- a/docs/features/VARIATIONS.md +++ b/docs/features/VARIATIONS.md @@ -6,9 +6,7 @@ title: Variations ## Intro -Release 1.13 of SD-Dream adds support for image variations. - -You are able to do the following: +InvokeAI's support for variations enables you to do the following: 1. Generate a series of systematic variations of an image, given a prompt. The amount of variation from one image to the next can be controlled. @@ -30,19 +28,7 @@ The prompt we will use throughout is: This will be indicated as `#!bash "prompt"` in the examples below. First we let SD create a series of images in the usual way, in this case -requesting six iterations: - -```bash -invoke> lucy lawless as xena, warrior princess, character portrait, high resolution -n6 -... -Outputs: -./outputs/Xena/000001.1579445059.png: "prompt" -s50 -W512 -H512 -C7.5 -Ak_lms -S1579445059 -./outputs/Xena/000001.1880768722.png: "prompt" -s50 -W512 -H512 -C7.5 -Ak_lms -S1880768722 -./outputs/Xena/000001.332057179.png: "prompt" -s50 -W512 -H512 -C7.5 -Ak_lms -S332057179 -./outputs/Xena/000001.2224800325.png: "prompt" -s50 -W512 -H512 -C7.5 -Ak_lms -S2224800325 -./outputs/Xena/000001.465250761.png: "prompt" -s50 -W512 -H512 -C7.5 -Ak_lms -S465250761 -./outputs/Xena/000001.3357757885.png: "prompt" -s50 -W512 -H512 -C7.5 -Ak_lms -S3357757885 -``` +requesting six iterations.
![var1](../assets/variation_walkthru/000001.3357757885.png) @@ -53,22 +39,16 @@ Outputs: ## Step 2 - Generating Variations -Let's try to generate some variations. Using the same seed, we pass the argument -`-v0.1` (or --variant_amount), which generates a series of variations each -differing by a variation amount of 0.2. This number ranges from `0` to `1.0`, -with higher numbers being larger amounts of variation. +Let's try to generate some variations on this image. We select the "*" +symbol in the line of icons above the image in order to fix the prompt +and seed. Then we open up the "Variations" section of the generation +panel and use the slider to set the variation amount to 0.2. The +higher this value, the more each generated image will differ from the +previous one. -```bash -invoke> "prompt" -n6 -S3357757885 -v0.2 -... -Outputs: -./outputs/Xena/000002.784039624.png: "prompt" -s50 -W512 -H512 -C7.5 -Ak_lms -V 784039624:0.2 -S3357757885 -./outputs/Xena/000002.3647897225.png: "prompt" -s50 -W512 -H512 -C7.5 -Ak_lms -V 3647897225:0.2 -S3357757885 -./outputs/Xena/000002.917731034.png: "prompt" -s50 -W512 -H512 -C7.5 -Ak_lms -V 917731034:0.2 -S3357757885 -./outputs/Xena/000002.4116285959.png: "prompt" -s50 -W512 -H512 -C7.5 -Ak_lms -V 4116285959:0.2 -S3357757885 -./outputs/Xena/000002.1614299449.png: "prompt" -s50 -W512 -H512 -C7.5 -Ak_lms -V 1614299449:0.2 -S3357757885 -./outputs/Xena/000002.1335553075.png: "prompt" -s50 -W512 -H512 -C7.5 -Ak_lms -V 1335553075:0.2 -S3357757885 -``` +Now we run the prompt a second time, requesting six iterations. You +will see six images that are thematically related to each other. Try +increasing and decreasing the variation amount and see what happens. ### **Variation Sub Seeding** diff --git a/docs/features/WEB.md b/docs/features/WEB.md index b904f147b4..ef541736d9 100644 --- a/docs/features/WEB.md +++ b/docs/features/WEB.md @@ -299,14 +299,6 @@ initial image" icons are located. See the [Unified Canvas Guide](UNIFIED_CANVAS.md) -## Parting remarks - -This concludes the walkthrough, but there are several more features that you can -explore. Please check out the [Command Line Interface](CLI.md) documentation for -further explanation of the advanced features that were not covered here. - -The WebUI is only rapid development. Check back regularly for updates! - ## Reference ### Additional Options @@ -349,11 +341,9 @@ the settings configured in the toolbar. See below for additional documentation related to each feature: -- [Core Prompt Settings](./CLI.md) - [Variations](./VARIATIONS.md) - [Upscaling](./POSTPROCESS.md#upscaling) - [Image to Image](./IMG2IMG.md) -- [Inpainting](./INPAINTING.md) - [Other](./OTHER.md) #### Invocation Gallery diff --git a/docs/features/index.md b/docs/features/index.md index 53d380f3fb..12539ca98f 100644 --- a/docs/features/index.md +++ b/docs/features/index.md @@ -13,28 +13,16 @@ Build complex scenes by combine and modifying multiple images in a stepwise fashion. This feature combines img2img, inpainting and outpainting in a single convenient digital artist-optimized user interface. -### * The [Command Line Interface (CLI)](CLI.md) -Scriptable access to InvokeAI's features. - ## Image Generation ### * [Prompt Engineering](PROMPTS.md) Get the images you want with the InvokeAI prompt engineering language. -## * [Post-Processing](POSTPROCESS.md) -Restore mangled faces and make images larger with upscaling. Also see the [Embiggen Upscaling Guide](EMBIGGEN.md). - ## * The [Concepts Library](CONCEPTS.md) Add custom subjects and styles using HuggingFace's repository of embeddings. -### * [Image-to-Image Guide for the CLI](IMG2IMG.md) +### * [Image-to-Image Guide](IMG2IMG.md) Use a seed image to build new creations in the CLI. -### * [Inpainting Guide for the CLI](INPAINTING.md) -Selectively erase and replace portions of an existing image in the CLI. - -### * [Outpainting Guide for the CLI](OUTPAINTING.md) -Extend the borders of the image with an "outcrop" function within the CLI. - ### * [Generating Variations](VARIATIONS.md) Have an image you like and want to generate many more like it? Variations are the ticket. diff --git a/docs/index.md b/docs/index.md index 0aa99a1747..3af8571df9 100644 --- a/docs/index.md +++ b/docs/index.md @@ -13,6 +13,7 @@ title: Home
+ [![project logo](assets/invoke_ai_banner.png)](https://github.com/invoke-ai/InvokeAI) [![discord badge]][discord link] @@ -131,17 +132,13 @@ This method is recommended for those familiar with running Docker containers - [WebUI overview](features/WEB.md) - [WebUI hotkey reference guide](features/WEBUIHOTKEYS.md) - [WebUI Unified Canvas for Img2Img, inpainting and outpainting](features/UNIFIED_CANVAS.md) + -### The InvokeAI Command Line Interface -- [Command Line Interace Reference Guide](features/CLI.md) - + ### Image Management - [Image2Image](features/IMG2IMG.md) -- [Inpainting](features/INPAINTING.md) -- [Outpainting](features/OUTPAINTING.md) - [Adding custom styles and subjects](features/CONCEPTS.md) - [Upscaling and Face Reconstruction](features/POSTPROCESS.md) -- [Embiggen upscaling](features/EMBIGGEN.md) - [Other Features](features/OTHER.md) @@ -156,83 +153,60 @@ This method is recommended for those familiar with running Docker containers - [Prompt Syntax](features/PROMPTS.md) - [Generating Variations](features/VARIATIONS.md) -## :octicons-log-16: Latest Changes +## :octicons-log-16: Important Changes Since Version 2.3 -### v2.3.0 (9 February 2023) +### Nodes -#### Migration to Stable Diffusion `diffusers` models +Behind the scenes, InvokeAI has been completely rewritten to support +"nodes," small unitary operations that can be combined into graphs to +form arbitrary workflows. For example, there is a prompt node that +processes the prompt string and feeds it to a text2latent node that +generates a latent image. The latents are then fed to a latent2image +node that translates the latent image into a PNG. -Previous versions of InvokeAI supported the original model file format introduced with Stable Diffusion 1.4. In the original format, known variously as "checkpoint", or "legacy" format, there is a single large weights file ending with `.ckpt` or `.safetensors`. Though this format has served the community well, it has a number of disadvantages, including file size, slow loading times, and a variety of non-standard variants that require special-case code to handle. In addition, because checkpoint files are actually a bundle of multiple machine learning sub-models, it is hard to swap different sub-models in and out, or to share common sub-models. A new format, introduced by the StabilityAI company in collaboration with HuggingFace, is called `diffusers` and consists of a directory of individual models. The most immediate benefit of `diffusers` is that they load from disk very quickly. A longer term benefit is that in the near future `diffusers` models will be able to share common sub-models, dramatically reducing disk space when you have multiple fine-tune models derived from the same base. +The WebGUI has a node editor that allows you to graphically design and +execute custom node graphs. The ability to save and load graphs is +still a work in progress, but coming soon. -When you perform a new install of version 2.3.0, you will be offered the option to install the `diffusers` versions of a number of popular SD models, including Stable Diffusion versions 1.5 and 2.1 (including the 768x768 pixel version of 2.1). These will act and work just like the checkpoint versions. Do not be concerned if you already have a lot of ".ckpt" or ".safetensors" models on disk! InvokeAI 2.3.0 can still load these and generate images from them without any extra intervention on your part. +### Command-Line Interface Retired -To take advantage of the optimized loading times of `diffusers` models, InvokeAI offers options to convert legacy checkpoint models into optimized `diffusers` models. If you use the `invokeai` command line interface, the relevant commands are: +The original "invokeai" command-line interface has been retired. The +`invokeai` command will now launch a new command-line client that can +be used by developers to create and test nodes. It is not intended to +be used for routine image generation or manipulation. -* `!convert_model` -- Take the path to a local checkpoint file or a URL that is pointing to one, convert it into a `diffusers` model, and import it into InvokeAI's models registry file. -* `!optimize_model` -- If you already have a checkpoint model in your InvokeAI models file, this command will accept its short name and convert it into a like-named `diffusers` model, optionally deleting the original checkpoint file. -* `!import_model` -- Take the local path of either a checkpoint file or a `diffusers` model directory and import it into InvokeAI's registry file. You may also provide the ID of any diffusers model that has been published on the [HuggingFace models repository](https://huggingface.co/models?pipeline_tag=text-to-image&sort=downloads) and it will be downloaded and installed automatically. +To launch the Web GUI from the command-line, use the command +`invokeai-web` rather than the traditional `invokeai --web`. -The WebGUI offers similar functionality for model management. +### ControlNet -For advanced users, new command-line options provide additional functionality. Launching `invokeai` with the argument `--autoconvert ` takes the path to a directory of checkpoint files, automatically converts them into `diffusers` models and imports them. Each time the script is launched, the directory will be scanned for new checkpoint files to be loaded. Alternatively, the `--ckpt_convert` argument will cause any checkpoint or safetensors model that is already registered with InvokeAI to be converted into a `diffusers` model on the fly, allowing you to take advantage of future diffusers-only features without explicitly converting the model and saving it to disk. +This version of InvokeAI features ControlNet, a system that allows you +to achieve exact poses for human and animal figures by providing a +model to follow. Full details are found in [ControlNet](features/CONTROLNET.md) -Please see [INSTALLING MODELS](https://invoke-ai.github.io/InvokeAI/installation/050_INSTALLING_MODELS/) for more information on model management in both the command-line and Web interfaces. +### New Schedulers -#### Support for the `XFormers` Memory-Efficient Crossattention Package +The list of schedulers has been completely revamped and brought up to date: -On CUDA (Nvidia) systems, version 2.3.0 supports the `XFormers` library. Once installed, the`xformers` package dramatically reduces the memory footprint of loaded Stable Diffusion models files and modestly increases image generation speed. `xformers` will be installed and activated automatically if you specify a CUDA system at install time. +| **Short Name** | **Scheduler** | **Notes** | +|----------------|---------------------------------|-----------------------------| +| **ddim** | DDIMScheduler | | +| **ddpm** | DDPMScheduler | | +| **deis** | DEISMultistepScheduler | | +| **lms** | LMSDiscreteScheduler | | +| **pndm** | PNDMScheduler | | +| **heun** | HeunDiscreteScheduler | original noise schedule | +| **heun_k** | HeunDiscreteScheduler | using karras noise schedule | +| **euler** | EulerDiscreteScheduler | original noise schedule | +| **euler_k** | EulerDiscreteScheduler | using karras noise schedule | +| **kdpm_2** | KDPM2DiscreteScheduler | | +| **kdpm_2_a** | KDPM2AncestralDiscreteScheduler | | +| **dpmpp_2s** | DPMSolverSinglestepScheduler | | +| **dpmpp_2m** | DPMSolverMultistepScheduler | original noise scnedule | +| **dpmpp_2m_k** | DPMSolverMultistepScheduler | using karras noise schedule | +| **unipc** | UniPCMultistepScheduler | CPU only | -The caveat with using `xformers` is that it introduces slightly non-deterministic behavior, and images generated using the same seed and other settings will be subtly different between invocations. Generally the changes are unnoticeable unless you rapidly shift back and forth between images, but to disable `xformers` and restore fully deterministic behavior, you may launch InvokeAI using the `--no-xformers` option. This is most conveniently done by opening the file `invokeai/invokeai.init` with a text editor, and adding the line `--no-xformers` at the bottom. - -#### A Negative Prompt Box in the WebUI - -There is now a separate text input box for negative prompts in the WebUI. This is convenient for stashing frequently-used negative prompts ("mangled limbs, bad anatomy"). The `[negative prompt]` syntax continues to work in the main prompt box as well. - -To see exactly how your prompts are being parsed, launch `invokeai` with the `--log_tokenization` option. The console window will then display the tokenization process for both positive and negative prompts. - -#### Model Merging - -Version 2.3.0 offers an intuitive user interface for merging up to three Stable Diffusion models using an intuitive user interface. Model merging allows you to mix the behavior of models to achieve very interesting effects. To use this, each of the models must already be imported into InvokeAI and saved in `diffusers` format, then launch the merger using a new menu item in the InvokeAI launcher script (`invoke.sh`, `invoke.bat`) or directly from the command line with `invokeai-merge --gui`. You will be prompted to select the models to merge, the proportions in which to mix them, and the mixing algorithm. The script will create a new merged `diffusers` model and import it into InvokeAI for your use. - -See [MODEL MERGING](https://invoke-ai.github.io/InvokeAI/features/MODEL_MERGING/) for more details. - -#### Textual Inversion Training - -Textual Inversion (TI) is a technique for training a Stable Diffusion model to emit a particular subject or style when triggered by a keyword phrase. You can perform TI training by placing a small number of images of the subject or style in a directory, and choosing a distinctive trigger phrase, such as "pointillist-style". After successful training, The subject or style will be activated by including `` in your prompt. - -Previous versions of InvokeAI were able to perform TI, but it required using a command-line script with dozens of obscure command-line arguments. Version 2.3.0 features an intuitive TI frontend that will build a TI model on top of any `diffusers` model. To access training you can launch from a new item in the launcher script or from the command line using `invokeai-ti --gui`. - -See [TEXTUAL INVERSION](https://invoke-ai.github.io/InvokeAI/features/TEXTUAL_INVERSION/) for further details. - -#### A New Installer Experience - -The InvokeAI installer has been upgraded in order to provide a smoother and hopefully more glitch-free experience. In addition, InvokeAI is now packaged as a PyPi project, allowing developers and power-users to install InvokeAI with the command `pip install InvokeAI --use-pep517`. Please see [Installation](#installation) for details. - -Developers should be aware that the `pip` installation procedure has been simplified and that the `conda` method is no longer supported at all. Accordingly, the `environments_and_requirements` directory has been deleted from the repository. - -#### Command-line name changes - -All of InvokeAI's functionality, including the WebUI, command-line interface, textual inversion training and model merging, can all be accessed from the `invoke.sh` and `invoke.bat` launcher scripts. The menu of options has been expanded to add the new functionality. For the convenience of developers and power users, we have normalized the names of the InvokeAI command-line scripts: - -* `invokeai` -- Command-line client -* `invokeai --web` -- Web GUI -* `invokeai-merge --gui` -- Model merging script with graphical front end -* `invokeai-ti --gui` -- Textual inversion script with graphical front end -* `invokeai-configure` -- Configuration tool for initializing the `invokeai` directory and selecting popular starter models. - -For backward compatibility, the old command names are also recognized, including `invoke.py` and `configure-invokeai.py`. However, these are deprecated and will eventually be removed. - -Developers should be aware that the locations of the script's source code has been moved. The new locations are: -* `invokeai` => `ldm/invoke/CLI.py` -* `invokeai-configure` => `ldm/invoke/config/configure_invokeai.py` -* `invokeai-ti`=> `ldm/invoke/training/textual_inversion.py` -* `invokeai-merge` => `ldm/invoke/merge_diffusers` - -Developers are strongly encouraged to perform an "editable" install of InvokeAI using `pip install -e . --use-pep517` in the Git repository, and then to call the scripts using their 2.3.0 names, rather than executing the scripts directly. Developers should also be aware that the several important data files have been relocated into a new directory named `invokeai`. This includes the WebGUI's `frontend` and `backend` directories, and the `INITIAL_MODELS.yaml` files used by the installer to select starter models. Eventually all InvokeAI modules will be in subdirectories of `invokeai`. - -Please see [2.3.0 Release Notes](https://github.com/invoke-ai/InvokeAI/releases/tag/v2.3.0) for further details. -For older changelogs, please visit the -**[CHANGELOG](CHANGELOG/#v223-2-december-2022)**. +Please see [3.0.0 Release Notes](https://github.com/invoke-ai/InvokeAI/releases/tag/v3.0.0) for further details. ## :material-target: Troubleshooting @@ -268,8 +242,3 @@ free to send me an email if you use and like the script. Original portions of the software are Copyright (c) 2022-23 by [The InvokeAI Team](https://github.com/invoke-ai). -## :octicons-book-24: Further Reading - -Please see the original README for more information on this software and -underlying algorithm, located in the file -[README-CompViz.md](other/README-CompViz.md). diff --git a/docs/installation/060_INSTALL_PATCHMATCH.md b/docs/installation/060_INSTALL_PATCHMATCH.md index 6ac6e2814e..ccfd19d207 100644 --- a/docs/installation/060_INSTALL_PATCHMATCH.md +++ b/docs/installation/060_INSTALL_PATCHMATCH.md @@ -87,18 +87,18 @@ Prior to installing PyPatchMatch, you need to take the following steps: sudo pacman -S --needed base-devel ``` -2. Install `opencv`: +2. Install `opencv` and `blas`: ```sh - sudo pacman -S opencv + sudo pacman -S opencv blas ``` or for CUDA support ```sh - sudo pacman -S opencv-cuda + sudo pacman -S opencv-cuda blas ``` - + 3. Fix the naming of the `opencv` package configuration file: ```sh diff --git a/installer/install.bat.in b/installer/install.bat.in index 924f2cd40d..8f729e758d 100644 --- a/installer/install.bat.in +++ b/installer/install.bat.in @@ -38,6 +38,7 @@ echo https://learn.microsoft.com/en-US/cpp/windows/latest-supported-vc-redist echo. echo See %INSTRUCTIONS% for more details. echo. +echo "For the best user experience we suggest enlarging or maximizing this window now." pause @rem ---------------------------- check Python version --------------- diff --git a/installer/install.sh.in b/installer/install.sh.in index c1014b2496..0063c0ebbf 100755 --- a/installer/install.sh.in +++ b/installer/install.sh.in @@ -25,7 +25,8 @@ done if [ -z "$PYTHON" ]; then echo "A suitable Python interpreter could not be found" - echo "Please install Python 3.9 or higher before running this script. See instructions at $INSTRUCTIONS for help." + echo "Please install Python $MINIMUM_PYTHON_VERSION or higher (maximum $MAXIMUM_PYTHON_VERSION) before running this script. See instructions at $INSTRUCTIONS for help." + echo "For the best user experience we suggest enlarging or maximizing this window now." read -p "Press any key to exit" exit -1 fi diff --git a/installer/lib/installer.py b/installer/lib/installer.py index 96d8ce55e3..5904a71968 100644 --- a/installer/lib/installer.py +++ b/installer/lib/installer.py @@ -149,7 +149,7 @@ class Installer: return venv_dir - def install(self, root: str = "~/invokeai", version: str = "latest", yes_to_all=False, find_links: Path = None) -> None: + def install(self, root: str = "~/invokeai-3", version: str = "latest", yes_to_all=False, find_links: Path = None) -> None: """ Install the InvokeAI application into the given runtime path @@ -248,6 +248,7 @@ class InvokeAiInstance: "install", "--require-virtualenv", "torch~=2.0.0", + "torchmetrics==0.11.4", "torchvision>=0.14.1", "--force-reinstall", "--find-links" if find_links is not None else None, diff --git a/installer/lib/messages.py b/installer/lib/messages.py index dfc09dd94a..196c0e1eb0 100644 --- a/installer/lib/messages.py +++ b/installer/lib/messages.py @@ -293,6 +293,8 @@ def introduction() -> None: "3. Create initial configuration files.", "", "[i]At any point you may interrupt this program and resume later.", + "", + "[b]For the best user experience, please enlarge or maximize this window", ), ) ) diff --git a/installer/templates/invoke.bat.in b/installer/templates/invoke.bat.in index b5816164a3..7900eac1cf 100644 --- a/installer/templates/invoke.bat.in +++ b/installer/templates/invoke.bat.in @@ -14,13 +14,13 @@ echo 3. Run textual inversion training echo 4. Merge models (diffusers type only) echo 5. Download and install models echo 6. Change InvokeAI startup options -echo 7. Re-run the configure script to fix a broken install +echo 7. Re-run the configure script to fix a broken install or to complete a major upgrade echo 8. Open the developer console echo 9. Update InvokeAI echo 10. Command-line help echo Q - Quit set /P choice="Please enter 1-10, Q: [2] " -if not defined choice set choice=2 +if not defined choice set choice=1 IF /I "%choice%" == "1" ( echo Starting the InvokeAI browser-based UI.. python .venv\Scripts\invokeai-web.exe %* @@ -56,7 +56,7 @@ IF /I "%choice%" == "1" ( call cmd /k ) ELSE IF /I "%choice%" == "9" ( echo Running invokeai-update... - python .venv\Scripts\invokeai-update.exe %* + python -m invokeai.frontend.install.invokeai_update ) ELSE IF /I "%choice%" == "10" ( echo Displaying command line help... python .venv\Scripts\invokeai.exe --help %* diff --git a/installer/templates/invoke.sh.in b/installer/templates/invoke.sh.in index e457d57842..cb54074aa2 100644 --- a/installer/templates/invoke.sh.in +++ b/installer/templates/invoke.sh.in @@ -81,7 +81,7 @@ do_choice() { ;; 7) clear - printf "Re-run the configure script to fix a broken install\n" + printf "Re-run the configure script to fix a broken install or to complete a major upgrade\n" invokeai-configure --root ${INVOKEAI_ROOT} --yes --default_only ;; 8) @@ -93,7 +93,7 @@ do_choice() { 9) clear printf "Update InvokeAI\n" - invokeai-update + python -m invokeai.frontend.install.invokeai_update ;; 10) clear @@ -118,12 +118,12 @@ do_choice() { do_dialog() { options=( 1 "Generate images with a browser-based interface" - 2 "Generate images using a command-line interface" + 2 "Explore InvokeAI nodes using a command-line interface" 3 "Textual inversion training" 4 "Merge models (diffusers type only)" 5 "Download and install models" 6 "Change InvokeAI startup options" - 7 "Re-run the configure script to fix a broken install" + 7 "Re-run the configure script to fix a broken install or to complete a major upgrade" 8 "Open the developer console" 9 "Update InvokeAI") diff --git a/invokeai/app/api/dependencies.py b/invokeai/app/api/dependencies.py index efeb778922..cb867354a5 100644 --- a/invokeai/app/api/dependencies.py +++ b/invokeai/app/api/dependencies.py @@ -13,10 +13,10 @@ from invokeai.app.services.board_record_storage import SqliteBoardRecordStorage from invokeai.app.services.boards import BoardService, BoardServiceDependencies from invokeai.app.services.image_record_storage import SqliteImageRecordStorage from invokeai.app.services.images import ImageService, ImageServiceDependencies -from invokeai.app.services.metadata import CoreMetadataService from invokeai.app.services.resource_name import SimpleNameService from invokeai.app.services.urls import LocalUrlService from invokeai.backend.util.logging import InvokeAILogger +from invokeai.version.invokeai_version import __version__ from ..services.default_graphs import create_system_graphs from ..services.latent_storage import DiskLatentsStorage, ForwardCacheLatentsStorage @@ -58,7 +58,8 @@ class ApiDependencies: @staticmethod def initialize(config, event_handler_id: int, logger: Logger = logger): - logger.info(f"Internet connectivity is {config.internet_available}") + logger.debug(f'InvokeAI version {__version__}') + logger.debug(f"Internet connectivity is {config.internet_available}") events = FastAPIEventService(event_handler_id) @@ -73,7 +74,6 @@ class ApiDependencies: ) urls = LocalUrlService() - metadata = CoreMetadataService() image_record_storage = SqliteImageRecordStorage(db_location) image_file_storage = DiskImageFileStorage(f"{output_folder}/images") names = SimpleNameService() @@ -109,7 +109,6 @@ class ApiDependencies: board_image_record_storage=board_image_record_storage, image_record_storage=image_record_storage, image_file_storage=image_file_storage, - metadata=metadata, url=urls, logger=logger, names=names, diff --git a/invokeai/app/api/routers/app_info.py b/invokeai/app/api/routers/app_info.py new file mode 100644 index 0000000000..8e2955c9aa --- /dev/null +++ b/invokeai/app/api/routers/app_info.py @@ -0,0 +1,36 @@ +from fastapi.routing import APIRouter +from pydantic import BaseModel, Field + +from invokeai.backend.image_util.patchmatch import PatchMatch +from invokeai.version import __version__ + +app_router = APIRouter(prefix="/v1/app", tags=["app"]) + + +class AppVersion(BaseModel): + """App Version Response""" + + version: str = Field(description="App version") + + +class AppConfig(BaseModel): + """App Config Response""" + + infill_methods: list[str] = Field(description="List of available infill methods") + + +@app_router.get( + "/version", operation_id="app_version", status_code=200, response_model=AppVersion +) +async def get_version() -> AppVersion: + return AppVersion(version=__version__) + + +@app_router.get( + "/config", operation_id="get_config", status_code=200, response_model=AppConfig +) +async def get_config() -> AppConfig: + infill_methods = ['tile'] + if PatchMatch.patchmatch_available(): + infill_methods.append('patchmatch') + return AppConfig(infill_methods=infill_methods) diff --git a/invokeai/app/api/routers/boards.py b/invokeai/app/api/routers/boards.py index 55cd7c8ca2..94d8667ae4 100644 --- a/invokeai/app/api/routers/boards.py +++ b/invokeai/app/api/routers/boards.py @@ -5,6 +5,7 @@ from invokeai.app.services.board_record_storage import BoardChanges from invokeai.app.services.image_record_storage import OffsetPaginatedResults from invokeai.app.services.models.board_record import BoardDTO + from ..dependencies import ApiDependencies boards_router = APIRouter(prefix="/v1/boards", tags=["boards"]) @@ -71,11 +72,19 @@ async def update_board( @boards_router.delete("/{board_id}", operation_id="delete_board") async def delete_board( board_id: str = Path(description="The id of board to delete"), + include_images: Optional[bool] = Query( + description="Permanently delete all images on the board", default=False + ), ) -> None: """Deletes a board""" - try: - ApiDependencies.invoker.services.boards.delete(board_id=board_id) + if include_images is True: + ApiDependencies.invoker.services.images.delete_images_on_board( + board_id=board_id + ) + ApiDependencies.invoker.services.boards.delete(board_id=board_id) + else: + ApiDependencies.invoker.services.boards.delete(board_id=board_id) except Exception as e: # TODO: Does this need any exception handling at all? pass diff --git a/invokeai/app/api/routers/images.py b/invokeai/app/api/routers/images.py index a8c84b81b9..a0428e772e 100644 --- a/invokeai/app/api/routers/images.py +++ b/invokeai/app/api/routers/images.py @@ -1,20 +1,19 @@ import io from typing import Optional -from fastapi import Body, HTTPException, Path, Query, Request, Response, UploadFile -from fastapi.routing import APIRouter + +from fastapi import (Body, HTTPException, Path, Query, Request, Response, + UploadFile) from fastapi.responses import FileResponse +from fastapi.routing import APIRouter from PIL import Image -from invokeai.app.models.image import ( - ImageCategory, - ResourceOrigin, -) + +from invokeai.app.invocations.metadata import ImageMetadata +from invokeai.app.models.image import ImageCategory, ResourceOrigin from invokeai.app.services.image_record_storage import OffsetPaginatedResults -from invokeai.app.services.models.image_record import ( - ImageDTO, - ImageRecordChanges, - ImageUrlsDTO, -) from invokeai.app.services.item_storage import PaginatedResults +from invokeai.app.services.models.image_record import (ImageDTO, + ImageRecordChanges, + ImageUrlsDTO) from ..dependencies import ApiDependencies @@ -103,23 +102,38 @@ async def update_image( @images_router.get( - "/{image_name}/metadata", - operation_id="get_image_metadata", + "/{image_name}", + operation_id="get_image_dto", response_model=ImageDTO, ) -async def get_image_metadata( +async def get_image_dto( image_name: str = Path(description="The name of image to get"), ) -> ImageDTO: - """Gets an image's metadata""" + """Gets an image's DTO""" try: return ApiDependencies.invoker.services.images.get_dto(image_name) except Exception as e: raise HTTPException(status_code=404) +@images_router.get( + "/{image_name}/metadata", + operation_id="get_image_metadata", + response_model=ImageMetadata, +) +async def get_image_metadata( + image_name: str = Path(description="The name of image to get"), +) -> ImageMetadata: + """Gets an image's metadata""" + + try: + return ApiDependencies.invoker.services.images.get_metadata(image_name) + except Exception as e: + raise HTTPException(status_code=404) + @images_router.get( - "/{image_name}", + "/{image_name}/full", operation_id="get_image_full", response_class=Response, responses={ @@ -208,10 +222,10 @@ async def get_image_urls( @images_router.get( "/", - operation_id="list_images_with_metadata", + operation_id="list_image_dtos", response_model=OffsetPaginatedResults[ImageDTO], ) -async def list_images_with_metadata( +async def list_image_dtos( image_origin: Optional[ResourceOrigin] = Query( default=None, description="The origin of images to list" ), @@ -227,7 +241,7 @@ async def list_images_with_metadata( offset: int = Query(default=0, description="The page offset"), limit: int = Query(default=10, description="The number of images per page"), ) -> OffsetPaginatedResults[ImageDTO]: - """Gets a list of images""" + """Gets a list of image DTOs""" image_dtos = ApiDependencies.invoker.services.images.get_many( offset, diff --git a/invokeai/app/api/routers/models.py b/invokeai/app/api/routers/models.py index 50d645eb57..8dbeaa3d05 100644 --- a/invokeai/app/api/routers/models.py +++ b/invokeai/app/api/routers/models.py @@ -1,69 +1,30 @@ -# Copyright (c) 2023 Kyle Schouviller (https://github.com/kyle0654) and 2023 Kent Keirsey (https://github.com/hipsterusername) +# Copyright (c) 2023 Kyle Schouviller (https://github.com/kyle0654), 2023 Kent Keirsey (https://github.com/hipsterusername), 2024 Lincoln Stein -from typing import Annotated, Literal, Optional, Union, Dict -from fastapi import Query -from fastapi.routing import APIRouter, HTTPException -from pydantic import BaseModel, Field, parse_obj_as -from ..dependencies import ApiDependencies +from typing import Literal, List, Optional, Union + +from fastapi import Body, Path, Query, Response +from fastapi.routing import APIRouter +from pydantic import BaseModel, parse_obj_as +from starlette.exceptions import HTTPException + from invokeai.backend import BaseModelType, ModelType -from invokeai.backend.model_management.models import OPENAPI_MODEL_CONFIGS -MODEL_CONFIGS = Union[tuple(OPENAPI_MODEL_CONFIGS)] +from invokeai.backend.model_management.models import ( + OPENAPI_MODEL_CONFIGS, + SchedulerPredictionType, +) +from invokeai.backend.model_management import MergeInterpolationMethod +from ..dependencies import ApiDependencies models_router = APIRouter(prefix="/v1/models", tags=["models"]) - -class VaeRepo(BaseModel): - repo_id: str = Field(description="The repo ID to use for this VAE") - path: Optional[str] = Field(description="The path to the VAE") - subfolder: Optional[str] = Field(description="The subfolder to use for this VAE") - -class ModelInfo(BaseModel): - description: Optional[str] = Field(description="A description of the model") - model_name: str = Field(description="The name of the model") - model_type: str = Field(description="The type of the model") - -class DiffusersModelInfo(ModelInfo): - format: Literal['folder'] = 'folder' - - vae: Optional[VaeRepo] = Field(description="The VAE repo to use for this model") - repo_id: Optional[str] = Field(description="The repo ID to use for this model") - path: Optional[str] = Field(description="The path to the model") - -class CkptModelInfo(ModelInfo): - format: Literal['ckpt'] = 'ckpt' - - config: str = Field(description="The path to the model config") - weights: str = Field(description="The path to the model weights") - vae: str = Field(description="The path to the model VAE") - width: Optional[int] = Field(description="The width of the model") - height: Optional[int] = Field(description="The height of the model") - -class SafetensorsModelInfo(CkptModelInfo): - format: Literal['safetensors'] = 'safetensors' - -class CreateModelRequest(BaseModel): - name: str = Field(description="The name of the model") - info: Union[CkptModelInfo, DiffusersModelInfo] = Field(discriminator="format", description="The model info") - -class CreateModelResponse(BaseModel): - name: str = Field(description="The name of the new model") - info: Union[CkptModelInfo, DiffusersModelInfo] = Field(discriminator="format", description="The model info") - status: str = Field(description="The status of the API response") - -class ConversionRequest(BaseModel): - name: str = Field(description="The name of the new model") - info: CkptModelInfo = Field(description="The converted model info") - save_location: str = Field(description="The path to save the converted model weights") - - -class ConvertedModelResponse(BaseModel): - name: str = Field(description="The name of the new model") - info: DiffusersModelInfo = Field(description="The converted model info") +UpdateModelResponse = Union[tuple(OPENAPI_MODEL_CONFIGS)] +ImportModelResponse = Union[tuple(OPENAPI_MODEL_CONFIGS)] +ConvertModelResponse = Union[tuple(OPENAPI_MODEL_CONFIGS)] +MergeModelResponse = Union[tuple(OPENAPI_MODEL_CONFIGS)] class ModelsList(BaseModel): - models: list[MODEL_CONFIGS] - + models: list[Union[tuple(OPENAPI_MODEL_CONFIGS)]] @models_router.get( "/", @@ -71,43 +32,103 @@ class ModelsList(BaseModel): responses={200: {"model": ModelsList }}, ) async def list_models( - base_model: Optional[BaseModelType] = Query( - default=None, description="Base model" - ), - model_type: Optional[ModelType] = Query( - default=None, description="The type of model to get" - ), + base_model: Optional[BaseModelType] = Query(default=None, description="Base model"), + model_type: Optional[ModelType] = Query(default=None, description="The type of model to get"), ) -> ModelsList: """Gets a list of models""" models_raw = ApiDependencies.invoker.services.model_manager.list_models(base_model, model_type) models = parse_obj_as(ModelsList, { "models": models_raw }) return models - -@models_router.post( - "/", +@models_router.patch( + "/{base_model}/{model_type}/{model_name}", operation_id="update_model", - responses={200: {"status": "success"}}, + responses={200: {"description" : "The model was updated successfully"}, + 404: {"description" : "The model could not be found"}, + 400: {"description" : "Bad request"} + }, + status_code = 200, + response_model = UpdateModelResponse, ) async def update_model( - model_request: CreateModelRequest -) -> CreateModelResponse: + base_model: BaseModelType = Path(description="Base model"), + model_type: ModelType = Path(description="The type of model"), + model_name: str = Path(description="model name"), + info: Union[tuple(OPENAPI_MODEL_CONFIGS)] = Body(description="Model configuration"), +) -> UpdateModelResponse: """ Add Model """ - model_request_info = model_request.info - info_dict = model_request_info.dict() - model_response = CreateModelResponse(name=model_request.name, info=model_request.info, status="success") - - ApiDependencies.invoker.services.model_manager.add_model( - model_name=model_request.name, - model_attributes=info_dict, - clobber=True, - ) + try: + ApiDependencies.invoker.services.model_manager.update_model( + model_name=model_name, + base_model=base_model, + model_type=model_type, + model_attributes=info.dict() + ) + model_raw = ApiDependencies.invoker.services.model_manager.list_model( + model_name=model_name, + base_model=base_model, + model_type=model_type, + ) + model_response = parse_obj_as(UpdateModelResponse, model_raw) + except KeyError as e: + raise HTTPException(status_code=404, detail=str(e)) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) return model_response +@models_router.post( + "/", + operation_id="import_model", + responses= { + 201: {"description" : "The model imported successfully"}, + 404: {"description" : "The model could not be found"}, + 424: {"description" : "The model appeared to import successfully, but could not be found in the model manager"}, + 409: {"description" : "There is already a model corresponding to this path or repo_id"}, + }, + status_code=201, + response_model=ImportModelResponse +) +async def import_model( + location: str = Body(description="A model path, repo_id or URL to import"), + prediction_type: Optional[Literal['v_prediction','epsilon','sample']] = \ + Body(description='Prediction type for SDv2 checkpoint files', default="v_prediction"), +) -> ImportModelResponse: + """ Add a model using its local path, repo_id, or remote URL """ + + items_to_import = {location} + prediction_types = { x.value: x for x in SchedulerPredictionType } + logger = ApiDependencies.invoker.services.logger + + try: + installed_models = ApiDependencies.invoker.services.model_manager.heuristic_import( + items_to_import = items_to_import, + prediction_type_helper = lambda x: prediction_types.get(prediction_type) + ) + info = installed_models.get(location) + + if not info: + logger.error("Import failed") + raise HTTPException(status_code=424) + + logger.info(f'Successfully imported {location}, got {info}') + model_raw = ApiDependencies.invoker.services.model_manager.list_model( + model_name=info.name, + base_model=info.base_model, + model_type=info.model_type + ) + return parse_obj_as(ImportModelResponse, model_raw) + + except KeyError as e: + logger.error(str(e)) + raise HTTPException(status_code=404, detail=str(e)) + except ValueError as e: + logger.error(str(e)) + raise HTTPException(status_code=409, detail=str(e)) + @models_router.delete( - "/{model_name}", + "/{base_model}/{model_type}/{model_name}", operation_id="del_model", responses={ 204: { @@ -118,144 +139,95 @@ async def update_model( } }, ) -async def delete_model(model_name: str) -> None: +async def delete_model( + base_model: BaseModelType = Path(description="Base model"), + model_type: ModelType = Path(description="The type of model"), + model_name: str = Path(description="model name"), +) -> Response: """Delete Model""" - model_names = ApiDependencies.invoker.services.model_manager.model_names() logger = ApiDependencies.invoker.services.logger - model_exists = model_name in model_names - - # check if model exists - logger.info(f"Checking for model {model_name}...") - - if model_exists: - logger.info(f"Deleting Model: {model_name}") - ApiDependencies.invoker.services.model_manager.del_model(model_name, delete_files=True) - logger.info(f"Model Deleted: {model_name}") - raise HTTPException(status_code=204, detail=f"Model '{model_name}' deleted successfully") - else: - logger.error("Model not found") + try: + ApiDependencies.invoker.services.model_manager.del_model(model_name, + base_model = base_model, + model_type = model_type + ) + logger.info(f"Deleted model: {model_name}") + return Response(status_code=204) + except KeyError: + logger.error(f"Model not found: {model_name}") raise HTTPException(status_code=404, detail=f"Model '{model_name}' not found") - - # @socketio.on("convertToDiffusers") - # def convert_to_diffusers(model_to_convert: dict): - # try: - # if model_info := self.generate.model_manager.model_info( - # model_name=model_to_convert["model_name"] - # ): - # if "weights" in model_info: - # ckpt_path = Path(model_info["weights"]) - # original_config_file = Path(model_info["config"]) - # model_name = model_to_convert["model_name"] - # model_description = model_info["description"] - # else: - # self.socketio.emit( - # "error", {"message": "Model is not a valid checkpoint file"} - # ) - # else: - # self.socketio.emit( - # "error", {"message": "Could not retrieve model info."} - # ) - - # if not ckpt_path.is_absolute(): - # ckpt_path = Path(Globals.root, ckpt_path) - - # if original_config_file and not original_config_file.is_absolute(): - # original_config_file = Path(Globals.root, original_config_file) - - # diffusers_path = Path( - # ckpt_path.parent.absolute(), f"{model_name}_diffusers" - # ) - - # if model_to_convert["save_location"] == "root": - # diffusers_path = Path( - # global_converted_ckpts_dir(), f"{model_name}_diffusers" - # ) - - # if ( - # model_to_convert["save_location"] == "custom" - # and model_to_convert["custom_location"] is not None - # ): - # diffusers_path = Path( - # model_to_convert["custom_location"], f"{model_name}_diffusers" - # ) - - # if diffusers_path.exists(): - # shutil.rmtree(diffusers_path) - - # self.generate.model_manager.convert_and_import( - # ckpt_path, - # diffusers_path, - # model_name=model_name, - # model_description=model_description, - # vae=None, - # original_config_file=original_config_file, - # commit_to_conf=opt.conf, - # ) - - # new_model_list = self.generate.model_manager.list_models() - # socketio.emit( - # "modelConverted", - # { - # "new_model_name": model_name, - # "model_list": new_model_list, - # "update": True, - # }, - # ) - # print(f">> Model Converted: {model_name}") - # except Exception as e: - # self.handle_exceptions(e) - - # @socketio.on("mergeDiffusersModels") - # def merge_diffusers_models(model_merge_info: dict): - # try: - # models_to_merge = model_merge_info["models_to_merge"] - # model_ids_or_paths = [ - # self.generate.model_manager.model_name_or_path(x) - # for x in models_to_merge - # ] - # merged_pipe = merge_diffusion_models( - # model_ids_or_paths, - # model_merge_info["alpha"], - # model_merge_info["interp"], - # model_merge_info["force"], - # ) - - # dump_path = global_models_dir() / "merged_models" - # if model_merge_info["model_merge_save_path"] is not None: - # dump_path = Path(model_merge_info["model_merge_save_path"]) - - # os.makedirs(dump_path, exist_ok=True) - # dump_path = dump_path / model_merge_info["merged_model_name"] - # merged_pipe.save_pretrained(dump_path, safe_serialization=1) - - # merged_model_config = dict( - # model_name=model_merge_info["merged_model_name"], - # description=f'Merge of models {", ".join(models_to_merge)}', - # commit_to_conf=opt.conf, - # ) - - # if vae := self.generate.model_manager.config[models_to_merge[0]].get( - # "vae", None - # ): - # print(f">> Using configured VAE assigned to {models_to_merge[0]}") - # merged_model_config.update(vae=vae) - - # self.generate.model_manager.import_diffuser_model( - # dump_path, **merged_model_config - # ) - # new_model_list = self.generate.model_manager.list_models() - - # socketio.emit( - # "modelsMerged", - # { - # "merged_models": models_to_merge, - # "merged_model_name": model_merge_info["merged_model_name"], - # "model_list": new_model_list, - # "update": True, - # }, - # ) - # print(f">> Models Merged: {models_to_merge}") - # print(f">> New Model Added: {model_merge_info['merged_model_name']}") - # except Exception as e: +@models_router.put( + "/convert/{base_model}/{model_type}/{model_name}", + operation_id="convert_model", + responses={ + 200: { "description": "Model converted successfully" }, + 400: {"description" : "Bad request" }, + 404: { "description": "Model not found" }, + }, + status_code = 200, + response_model = ConvertModelResponse, +) +async def convert_model( + base_model: BaseModelType = Path(description="Base model"), + model_type: ModelType = Path(description="The type of model"), + model_name: str = Path(description="model name"), +) -> ConvertModelResponse: + """Convert a checkpoint model into a diffusers model""" + logger = ApiDependencies.invoker.services.logger + try: + logger.info(f"Converting model: {model_name}") + ApiDependencies.invoker.services.model_manager.convert_model(model_name, + base_model = base_model, + model_type = model_type + ) + model_raw = ApiDependencies.invoker.services.model_manager.list_model(model_name, + base_model = base_model, + model_type = model_type) + response = parse_obj_as(ConvertModelResponse, model_raw) + except KeyError: + raise HTTPException(status_code=404, detail=f"Model '{model_name}' not found") + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + return response + +@models_router.put( + "/merge/{base_model}", + operation_id="merge_models", + responses={ + 200: { "description": "Model converted successfully" }, + 400: { "description": "Incompatible models" }, + 404: { "description": "One or more models not found" }, + }, + status_code = 200, + response_model = MergeModelResponse, +) +async def merge_models( + base_model: BaseModelType = Path(description="Base model"), + model_names: List[str] = Body(description="model name", min_items=2, max_items=3), + merged_model_name: Optional[str] = Body(description="Name of destination model"), + alpha: Optional[float] = Body(description="Alpha weighting strength to apply to 2d and 3d models", default=0.5), + interp: Optional[MergeInterpolationMethod] = Body(description="Interpolation method"), + force: Optional[bool] = Body(description="Force merging of models created with different versions of diffusers", default=False), +) -> MergeModelResponse: + """Convert a checkpoint model into a diffusers model""" + logger = ApiDependencies.invoker.services.logger + try: + logger.info(f"Merging models: {model_names}") + result = ApiDependencies.invoker.services.model_manager.merge_models(model_names, + base_model, + merged_model_name or "+".join(model_names), + alpha, + interp, + force) + model_raw = ApiDependencies.invoker.services.model_manager.list_model(result.name, + base_model = base_model, + model_type = ModelType.Main, + ) + response = parse_obj_as(ConvertModelResponse, model_raw) + except KeyError: + raise HTTPException(status_code=404, detail=f"One or more of the models '{model_names}' not found") + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + return response diff --git a/invokeai/app/api_app.py b/invokeai/app/api_app.py index e14c58bab7..9bcded1c49 100644 --- a/invokeai/app/api_app.py +++ b/invokeai/app/api_app.py @@ -1,5 +1,6 @@ -# Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) +# Copyright (c) 2022-2023 Kyle Schouviller (https://github.com/kyle0654) and the InvokeAI Team import asyncio +import sys from inspect import signature import uvicorn @@ -20,13 +21,31 @@ from ..backend.util.logging import InvokeAILogger app_config = InvokeAIAppConfig.get_config() app_config.parse_args() logger = InvokeAILogger.getLogger(config=app_config) +from invokeai.version.invokeai_version import __version__ + +# we call this early so that the message appears before +# other invokeai initialization messages +if app_config.version: + print(f'InvokeAI version {__version__}') + sys.exit(0) import invokeai.frontend.web as web_dir +import mimetypes from .api.dependencies import ApiDependencies -from .api.routers import sessions, models, images, boards, board_images +from .api.routers import sessions, models, images, boards, board_images, app_info from .api.sockets import SocketIO from .invocations.baseinvocation import BaseInvocation + + +import torch +if torch.backends.mps.is_available(): + import invokeai.backend.util.mps_fixes + +# fix for windows mimetypes registry entries being borked +# see https://github.com/invoke-ai/InvokeAI/discussions/3684#discussioncomment-6391352 +mimetypes.add_type('application/javascript', '.js') +mimetypes.add_type('text/css', '.css') # Create the app # TODO: create this all in a method so configuration/etc. can be passed in? @@ -82,6 +101,8 @@ app.include_router(boards.boards_router, prefix="/api") app.include_router(board_images.board_images_router, prefix="/api") +app.include_router(app_info.app_router, prefix='/api') + # Build a custom OpenAPI to include all outputs # TODO: can outputs be included on metadata of invocation schemas somehow? def custom_openapi(): diff --git a/invokeai/app/cli/commands.py b/invokeai/app/cli/commands.py index 10d1ead677..bffb2988dc 100644 --- a/invokeai/app/cli/commands.py +++ b/invokeai/app/cli/commands.py @@ -47,7 +47,7 @@ def add_parsers( commands: list[type], command_field: str = "type", exclude_fields: list[str] = ["id", "type"], - add_arguments: Callable[[argparse.ArgumentParser], None]|None = None + add_arguments: Union[Callable[[argparse.ArgumentParser], None],None] = None ): """Adds parsers for each command to the subparsers""" @@ -72,7 +72,7 @@ def add_parsers( def add_graph_parsers( subparsers, graphs: list[LibraryGraph], - add_arguments: Callable[[argparse.ArgumentParser], None]|None = None + add_arguments: Union[Callable[[argparse.ArgumentParser], None], None] = None ): for graph in graphs: command_parser = subparsers.add_parser(graph.name, help=graph.description) diff --git a/invokeai/app/cli_app.py b/invokeai/app/cli_app.py index 26e058166b..888d36c4bf 100644 --- a/invokeai/app/cli_app.py +++ b/invokeai/app/cli_app.py @@ -1,12 +1,11 @@ # Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) import argparse -import os import re import shlex import sys import time -from typing import Union, get_type_hints +from typing import Union, get_type_hints, Optional from pydantic import BaseModel, ValidationError from pydantic.fields import Field @@ -17,10 +16,24 @@ from invokeai.backend.util.logging import InvokeAILogger config = InvokeAIAppConfig.get_config() config.parse_args() logger = InvokeAILogger().getLogger(config=config) +from invokeai.version.invokeai_version import __version__ +# we call this early so that the message appears before other invokeai initialization messages +if config.version: + print(f'InvokeAI version {__version__}') + sys.exit(0) + +from invokeai.app.services.board_image_record_storage import ( + SqliteBoardImageRecordStorage, +) +from invokeai.app.services.board_images import ( + BoardImagesService, + BoardImagesServiceDependencies, +) +from invokeai.app.services.board_record_storage import SqliteBoardRecordStorage +from invokeai.app.services.boards import BoardService, BoardServiceDependencies from invokeai.app.services.image_record_storage import SqliteImageRecordStorage -from invokeai.app.services.images import ImageService -from invokeai.app.services.metadata import CoreMetadataService +from invokeai.app.services.images import ImageService, ImageServiceDependencies from invokeai.app.services.resource_name import SimpleNameService from invokeai.app.services.urls import LocalUrlService from .services.default_graphs import (default_text_to_image_graph_id, @@ -44,6 +57,10 @@ from .services.processor import DefaultInvocationProcessor from .services.restoration_services import RestorationServices from .services.sqlite import SqliteItemStorage +import torch +if torch.backends.mps.is_available(): + import invokeai.backend.util.mps_fixes + class CliCommand(BaseModel): command: Union[BaseCommand.get_commands() + BaseInvocation.get_invocations()] = Field(discriminator="type") # type: ignore @@ -196,6 +213,7 @@ def invoke_all(context: CliContext): raise SessionError() def invoke_cli(): + logger.info(f'InvokeAI version {__version__}') # get the optional list of invocations to execute on the command line parser = config.get_parser() parser.add_argument('commands',nargs='*') @@ -225,26 +243,52 @@ def invoke_cli(): ) urls = LocalUrlService() - metadata = CoreMetadataService() image_record_storage = SqliteImageRecordStorage(db_location) image_file_storage = DiskImageFileStorage(f"{output_folder}/images") names = SimpleNameService() - images = ImageService( - image_record_storage=image_record_storage, - image_file_storage=image_file_storage, - metadata=metadata, - url=urls, - logger=logger, - names=names, - graph_execution_manager=graph_execution_manager, + board_record_storage = SqliteBoardRecordStorage(db_location) + board_image_record_storage = SqliteBoardImageRecordStorage(db_location) + + boards = BoardService( + services=BoardServiceDependencies( + board_image_record_storage=board_image_record_storage, + board_record_storage=board_record_storage, + image_record_storage=image_record_storage, + url=urls, + logger=logger, + ) ) + board_images = BoardImagesService( + services=BoardImagesServiceDependencies( + board_image_record_storage=board_image_record_storage, + board_record_storage=board_record_storage, + image_record_storage=image_record_storage, + url=urls, + logger=logger, + ) + ) + + images = ImageService( + services=ImageServiceDependencies( + board_image_record_storage=board_image_record_storage, + image_record_storage=image_record_storage, + image_file_storage=image_file_storage, + url=urls, + logger=logger, + names=names, + graph_execution_manager=graph_execution_manager, + ) + ) + services = InvocationServices( model_manager=model_manager, events=events, latents = ForwardCacheLatentsStorage(DiskLatentsStorage(f'{output_folder}/latents')), images=images, + boards=boards, + board_images=board_images, queue=MemoryInvocationQueue(), graph_library=SqliteItemStorage[LibraryGraph]( filename=db_location, table_name="graphs" @@ -311,7 +355,7 @@ def invoke_cli(): # Parse invocation command: CliCommand = None # type:ignore - system_graph: LibraryGraph|None = None + system_graph: Optional[LibraryGraph] = None if args['type'] in system_graph_names: system_graph = next(filter(lambda g: g.name == args['type'], system_graphs)) invocation = GraphInvocation(graph=system_graph.graph, id=str(current_id)) diff --git a/invokeai/app/invocations/baseinvocation.py b/invokeai/app/invocations/baseinvocation.py index 4ce3e839b6..4c7314bd2b 100644 --- a/invokeai/app/invocations/baseinvocation.py +++ b/invokeai/app/invocations/baseinvocation.py @@ -4,9 +4,10 @@ from __future__ import annotations from abc import ABC, abstractmethod from inspect import signature -from typing import get_args, get_type_hints, Dict, List, Literal, TypedDict, TYPE_CHECKING +from typing import (TYPE_CHECKING, Dict, List, Literal, TypedDict, get_args, + get_type_hints) -from pydantic import BaseModel, Field +from pydantic import BaseConfig, BaseModel, Field if TYPE_CHECKING: from ..services.invocation_services import InvocationServices @@ -65,8 +66,13 @@ class BaseInvocation(ABC, BaseModel): @classmethod def get_invocations_map(cls): # Get the type strings out of the literals and into a dictionary - return dict(map(lambda t: (get_args(get_type_hints(t)['type'])[0], t),BaseInvocation.get_all_subclasses())) - + return dict( + map( + lambda t: (get_args(get_type_hints(t)["type"])[0], t), + BaseInvocation.get_all_subclasses(), + ) + ) + @classmethod def get_output_type(cls): return signature(cls.invoke).return_annotation @@ -75,11 +81,11 @@ class BaseInvocation(ABC, BaseModel): def invoke(self, context: InvocationContext) -> BaseInvocationOutput: """Invoke with provided context and return outputs.""" pass - - #fmt: off + + # fmt: off id: str = Field(description="The id of this node. Must be unique among all nodes.") is_intermediate: bool = Field(default=False, description="Whether or not this node is an intermediate node.") - #fmt: on + # fmt: on # TODO: figure out a better way to provide these hints @@ -97,16 +103,20 @@ class UIConfig(TypedDict, total=False): "latents", "model", "control", + "image_collection", + "vae_model", + "lora_model", ], ] tags: List[str] title: str + class CustomisedSchemaExtra(TypedDict): ui: UIConfig -class InvocationConfig(BaseModel.Config): +class InvocationConfig(BaseConfig): """Customizes pydantic's BaseModel.Config class for use by Invocations. Provide `schema_extra` a `ui` dict to add hints for generated UIs. diff --git a/invokeai/app/invocations/collections.py b/invokeai/app/invocations/collections.py index 891f217317..33bde42d69 100644 --- a/invokeai/app/invocations/collections.py +++ b/invokeai/app/invocations/collections.py @@ -4,13 +4,16 @@ from typing import Literal import numpy as np from pydantic import Field, validator +from invokeai.app.models.image import ImageField from invokeai.app.util.misc import SEED_MAX, get_random_seed from .baseinvocation import ( BaseInvocation, + InvocationConfig, InvocationContext, BaseInvocationOutput, + UIConfig, ) @@ -22,6 +25,7 @@ class IntCollectionOutput(BaseInvocationOutput): # Outputs collection: list[int] = Field(default=[], description="The int collection") + class FloatCollectionOutput(BaseInvocationOutput): """A collection of floats""" @@ -31,6 +35,18 @@ class FloatCollectionOutput(BaseInvocationOutput): collection: list[float] = Field(default=[], description="The float collection") +class ImageCollectionOutput(BaseInvocationOutput): + """A collection of images""" + + type: Literal["image_collection"] = "image_collection" + + # Outputs + collection: list[ImageField] = Field(default=[], description="The output images") + + class Config: + schema_extra = {"required": ["type", "collection"]} + + class RangeInvocation(BaseInvocation): """Creates a range of numbers from start to stop with step""" @@ -92,3 +108,27 @@ class RandomRangeInvocation(BaseInvocation): return IntCollectionOutput( collection=list(rng.integers(low=self.low, high=self.high, size=self.size)) ) + + +class ImageCollectionInvocation(BaseInvocation): + """Load a collection of images and provide it as output.""" + + # fmt: off + type: Literal["image_collection"] = "image_collection" + + # Inputs + images: list[ImageField] = Field( + default=[], description="The image collection to load" + ) + # fmt: on + def invoke(self, context: InvocationContext) -> ImageCollectionOutput: + return ImageCollectionOutput(collection=self.images) + + class Config(InvocationConfig): + schema_extra = { + "ui": { + "type_hints": { + "images": "image_collection", + } + }, + } diff --git a/invokeai/app/invocations/compel.py b/invokeai/app/invocations/compel.py index 4c1a4448de..dd4d5ce30b 100644 --- a/invokeai/app/invocations/compel.py +++ b/invokeai/app/invocations/compel.py @@ -1,6 +1,5 @@ -from typing import Literal, Optional, Union +from typing import Literal, Optional, Union, List from pydantic import BaseModel, Field -from contextlib import ExitStack import re from .baseinvocation import BaseInvocation, BaseInvocationOutput, InvocationContext, InvocationConfig @@ -10,17 +9,25 @@ from ...backend.util.devices import torch_dtype from ...backend.stable_diffusion.diffusion import InvokeAIDiffuserComponent from ...backend.model_management import BaseModelType, ModelType, SubModelType, ModelPatcher +import torch from compel import Compel -from compel.prompt_parser import ( - Blend, - CrossAttentionControlSubstitute, - FlattenedPrompt, - Fragment, Conjunction, -) +from compel.prompt_parser import (Blend, Conjunction, + CrossAttentionControlSubstitute, + FlattenedPrompt, Fragment) +from ...backend.util.devices import torch_dtype +from ...backend.model_management import ModelType +from ...backend.model_management.models import ModelNotFoundException +from ...backend.model_management.lora import ModelPatcher +from ...backend.stable_diffusion.diffusion import InvokeAIDiffuserComponent +from .baseinvocation import (BaseInvocation, BaseInvocationOutput, + InvocationConfig, InvocationContext) +from .model import ClipField class ConditioningField(BaseModel): - conditioning_name: Optional[str] = Field(default=None, description="The name of conditioning data") + conditioning_name: Optional[str] = Field( + default=None, description="The name of conditioning data") + class Config: schema_extra = {"required": ["conditioning_name"]} @@ -50,86 +57,111 @@ class CompelInvocation(BaseInvocation): "title": "Prompt (Compel)", "tags": ["prompt", "compel"], "type_hints": { - "model": "model" + "model": "model" } }, } + @torch.no_grad() def invoke(self, context: InvocationContext) -> CompelOutput: - tokenizer_info = context.services.model_manager.get_model( **self.clip.tokenizer.dict(), ) text_encoder_info = context.services.model_manager.get_model( **self.clip.text_encoder.dict(), ) - with tokenizer_info as orig_tokenizer,\ - text_encoder_info as text_encoder,\ - ExitStack() as stack: - loras = [(stack.enter_context(context.services.model_manager.get_model(**lora.dict(exclude={"weight"}))), lora.weight) for lora in self.clip.loras] + def _lora_loader(): + for lora in self.clip.loras: + lora_info = context.services.model_manager.get_model( + **lora.dict(exclude={"weight"})) + yield (lora_info.context.model, lora.weight) + del lora_info + return - ti_list = [] - for trigger in re.findall(r"<[a-zA-Z0-9., _-]+>", self.prompt): - name = trigger[1:-1] - try: - ti_list.append( - stack.enter_context( - context.services.model_manager.get_model( - model_name=name, - base_model=self.clip.text_encoder.base_model, - model_type=ModelType.TextualInversion, - ) - ) - ) - except Exception: - #print(e) - #import traceback - #print(traceback.format_exc()) - print(f"Warn: trigger: \"{trigger}\" not found") + #loras = [(context.services.model_manager.get_model(**lora.dict(exclude={"weight"})).context.model, lora.weight) for lora in self.clip.loras] - with ModelPatcher.apply_lora_text_encoder(text_encoder, loras),\ - ModelPatcher.apply_ti(orig_tokenizer, text_encoder, ti_list) as (tokenizer, ti_manager): - - compel = Compel( - tokenizer=tokenizer, - text_encoder=text_encoder, - textual_inversion_manager=ti_manager, - dtype_for_device_getter=torch_dtype, - truncate_long_prompts=True, # TODO: + ti_list = [] + for trigger in re.findall(r"<[a-zA-Z0-9., _-]+>", self.prompt): + name = trigger[1:-1] + try: + ti_list.append( + context.services.model_manager.get_model( + model_name=name, + base_model=self.clip.text_encoder.base_model, + model_type=ModelType.TextualInversion, + ).context.model ) - - conjunction = Compel.parse_prompt_string(self.prompt) - prompt: Union[FlattenedPrompt, Blend] = conjunction.prompts[0] + except ModelNotFoundException: + # print(e) + #import traceback + #print(traceback.format_exc()) + print(f"Warn: trigger: \"{trigger}\" not found") - if context.services.configuration.log_tokenization: - log_tokenization_for_prompt_object(prompt, tokenizer) + with ModelPatcher.apply_lora_text_encoder(text_encoder_info.context.model, _lora_loader()),\ + ModelPatcher.apply_ti(tokenizer_info.context.model, text_encoder_info.context.model, ti_list) as (tokenizer, ti_manager),\ + ModelPatcher.apply_clip_skip(text_encoder_info.context.model, self.clip.skipped_layers),\ + text_encoder_info as text_encoder: - c, options = compel.build_conditioning_tensor_for_prompt_object(prompt) - - # TODO: long prompt support - #if not self.truncate_long_prompts: - # [c, uc] = compel.pad_conditioning_tensors_to_same_length([c, uc]) - ec = InvokeAIDiffuserComponent.ExtraConditioningInfo( - tokens_count_including_eos_bos=get_max_token_count(tokenizer, conjunction), - cross_attention_control_args=options.get("cross_attention_control", None), - ) - - conditioning_name = f"{context.graph_execution_state_id}_{self.id}_conditioning" - - # TODO: hacky but works ;D maybe rename latents somehow? - context.services.latents.save(conditioning_name, (c, ec)) - - return CompelOutput( - conditioning=ConditioningField( - conditioning_name=conditioning_name, - ), + compel = Compel( + tokenizer=tokenizer, + text_encoder=text_encoder, + textual_inversion_manager=ti_manager, + dtype_for_device_getter=torch_dtype, + truncate_long_prompts=True, # TODO: ) + conjunction = Compel.parse_prompt_string(self.prompt) + prompt: Union[FlattenedPrompt, Blend] = conjunction.prompts[0] + + if context.services.configuration.log_tokenization: + log_tokenization_for_prompt_object(prompt, tokenizer) + + c, options = compel.build_conditioning_tensor_for_prompt_object( + prompt) + + # TODO: long prompt support + # if not self.truncate_long_prompts: + # [c, uc] = compel.pad_conditioning_tensors_to_same_length([c, uc]) + ec = InvokeAIDiffuserComponent.ExtraConditioningInfo( + tokens_count_including_eos_bos=get_max_token_count( + tokenizer, conjunction), + cross_attention_control_args=options.get( + "cross_attention_control", None),) + + conditioning_name = f"{context.graph_execution_state_id}_{self.id}_conditioning" + + # TODO: hacky but works ;D maybe rename latents somehow? + context.services.latents.save(conditioning_name, (c, ec)) + + return CompelOutput( + conditioning=ConditioningField( + conditioning_name=conditioning_name, + ), + ) + +class ClipSkipInvocationOutput(BaseInvocationOutput): + """Clip skip node output""" + type: Literal["clip_skip_output"] = "clip_skip_output" + clip: ClipField = Field(None, description="Clip with skipped layers") + +class ClipSkipInvocation(BaseInvocation): + """Skip layers in clip text_encoder model.""" + type: Literal["clip_skip"] = "clip_skip" + + clip: ClipField = Field(None, description="Clip to use") + skipped_layers: int = Field(0, description="Number of layers to skip in text_encoder") + + def invoke(self, context: InvocationContext) -> ClipSkipInvocationOutput: + self.clip.skipped_layers += self.skipped_layers + return ClipSkipInvocationOutput( + clip=self.clip, + ) + def get_max_token_count( - tokenizer, prompt: Union[FlattenedPrompt, Blend, Conjunction], truncate_if_too_long=False -) -> int: + tokenizer, prompt: Union[FlattenedPrompt, Blend, Conjunction], + truncate_if_too_long=False) -> int: if type(prompt) is Blend: blend: Blend = prompt return max( @@ -148,13 +180,13 @@ def get_max_token_count( ) else: return len( - get_tokens_for_prompt_object(tokenizer, prompt, truncate_if_too_long) - ) + get_tokens_for_prompt_object( + tokenizer, prompt, truncate_if_too_long)) def get_tokens_for_prompt_object( tokenizer, parsed_prompt: FlattenedPrompt, truncate_if_too_long=True -) -> [str]: +) -> List[str]: if type(parsed_prompt) is Blend: raise ValueError( "Blend is not supported here - you need to get tokens for each of its .children" @@ -183,7 +215,7 @@ def log_tokenization_for_conjunction( ): display_label_prefix = display_label_prefix or "" for i, p in enumerate(c.prompts): - if len(c.prompts)>1: + if len(c.prompts) > 1: this_display_label_prefix = f"{display_label_prefix}(conjunction part {i + 1}, weight={c.weights[i]})" else: this_display_label_prefix = display_label_prefix @@ -238,7 +270,8 @@ def log_tokenization_for_prompt_object( ) -def log_tokenization_for_text(text, tokenizer, display_label=None, truncate_if_too_long=False): +def log_tokenization_for_text( + text, tokenizer, display_label=None, truncate_if_too_long=False): """shows how the prompt is tokenized # usually tokens have '' to indicate end-of-word, # but for readability it has been replaced with ' ' diff --git a/invokeai/app/invocations/controlnet_image_processors.py b/invokeai/app/invocations/controlnet_image_processors.py index f40954ebb6..c37dcda998 100644 --- a/invokeai/app/invocations/controlnet_image_processors.py +++ b/invokeai/app/invocations/controlnet_image_processors.py @@ -1,11 +1,12 @@ -# InvokeAI nodes for ControlNet image preprocessors +# Invocations for ControlNet image preprocessors # initial implementation by Gregg Helt, 2023 # heavily leverages controlnet_aux package: https://github.com/patrickvonplaten/controlnet_aux -from builtins import float +from builtins import float, bool +import cv2 import numpy as np -from typing import Literal, Optional, Union, List -from PIL import Image, ImageFilter, ImageOps +from typing import Literal, Optional, Union, List, Dict +from PIL import Image from pydantic import BaseModel, Field, validator from ..models.image import ImageField, ImageCategory, ResourceOrigin @@ -29,8 +30,13 @@ from controlnet_aux import ( ContentShuffleDetector, ZoeDetector, MediapipeFaceDetector, + SamDetector, + LeresDetector, ) +from controlnet_aux.util import HWC3, ade_palette + + from .image import ImageOutput, PILInvocationConfig CONTROLNET_DEFAULT_MODELS = [ @@ -94,6 +100,10 @@ CONTROLNET_DEFAULT_MODELS = [ ] CONTROLNET_NAME_VALUES = Literal[tuple(CONTROLNET_DEFAULT_MODELS)] +CONTROLNET_MODE_VALUES = Literal[tuple(["balanced", "more_prompt", "more_control", "unbalanced"])] +# crop and fill options not ready yet +# CONTROLNET_RESIZE_VALUES = Literal[tuple(["just_resize", "crop_resize", "fill_resize"])] + class ControlField(BaseModel): image: ImageField = Field(default=None, description="The control image") @@ -104,6 +114,9 @@ class ControlField(BaseModel): description="When the ControlNet is first applied (% of total steps)") end_step_percent: float = Field(default=1, ge=0, le=1, description="When the ControlNet is last applied (% of total steps)") + control_mode: CONTROLNET_MODE_VALUES = Field(default="balanced", description="The control mode to use") + # resize_mode: CONTROLNET_RESIZE_VALUES = Field(default="just_resize", description="The resize mode to use") + @validator("control_weight") def abs_le_one(cls, v): """validate that all abs(values) are <=1""" @@ -144,11 +157,11 @@ class ControlNetInvocation(BaseInvocation): control_model: CONTROLNET_NAME_VALUES = Field(default="lllyasviel/sd-controlnet-canny", description="control model used") control_weight: Union[float, List[float]] = Field(default=1.0, description="The weight given to the ControlNet") - # TODO: add support in backend core for begin_step_percent, end_step_percent, guess_mode begin_step_percent: float = Field(default=0, ge=0, le=1, description="When the ControlNet is first applied (% of total steps)") end_step_percent: float = Field(default=1, ge=0, le=1, description="When the ControlNet is last applied (% of total steps)") + control_mode: CONTROLNET_MODE_VALUES = Field(default="balanced", description="The control mode used") # fmt: on class Config(InvocationConfig): @@ -166,7 +179,6 @@ class ControlNetInvocation(BaseInvocation): } def invoke(self, context: InvocationContext) -> ControlOutput: - return ControlOutput( control=ControlField( image=self.image, @@ -174,10 +186,11 @@ class ControlNetInvocation(BaseInvocation): control_weight=self.control_weight, begin_step_percent=self.begin_step_percent, end_step_percent=self.end_step_percent, + control_mode=self.control_mode, ), ) -# TODO: move image processors to separate file (image_analysis.py + class ImageProcessorInvocation(BaseInvocation, PILInvocationConfig): """Base class for invocations that preprocess images for ControlNet""" @@ -409,9 +422,9 @@ class ContentShuffleImageProcessorInvocation(ImageProcessorInvocation, PILInvoca # Inputs detect_resolution: int = Field(default=512, ge=0, description="The pixel resolution for detection") image_resolution: int = Field(default=512, ge=0, description="The pixel resolution for the output image") - h: Union[int, None] = Field(default=512, ge=0, description="Content shuffle `h` parameter") - w: Union[int, None] = Field(default=512, ge=0, description="Content shuffle `w` parameter") - f: Union[int, None] = Field(default=256, ge=0, description="Content shuffle `f` parameter") + h: Optional[int] = Field(default=512, ge=0, description="Content shuffle `h` parameter") + w: Optional[int] = Field(default=512, ge=0, description="Content shuffle `w` parameter") + f: Optional[int] = Field(default=256, ge=0, description="Content shuffle `f` parameter") # fmt: on def run_processor(self, image): @@ -449,6 +462,104 @@ class MediapipeFaceProcessorInvocation(ImageProcessorInvocation, PILInvocationCo # fmt: on def run_processor(self, image): + # MediaPipeFaceDetector throws an error if image has alpha channel + # so convert to RGB if needed + if image.mode == 'RGBA': + image = image.convert('RGB') mediapipe_face_processor = MediapipeFaceDetector() processed_image = mediapipe_face_processor(image, max_faces=self.max_faces, min_confidence=self.min_confidence) return processed_image + +class LeresImageProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): + """Applies leres processing to image""" + # fmt: off + type: Literal["leres_image_processor"] = "leres_image_processor" + # Inputs + thr_a: float = Field(default=0, description="Leres parameter `thr_a`") + thr_b: float = Field(default=0, description="Leres parameter `thr_b`") + boost: bool = Field(default=False, description="Whether to use boost mode") + detect_resolution: int = Field(default=512, ge=0, description="The pixel resolution for detection") + image_resolution: int = Field(default=512, ge=0, description="The pixel resolution for the output image") + # fmt: on + + def run_processor(self, image): + leres_processor = LeresDetector.from_pretrained("lllyasviel/Annotators") + processed_image = leres_processor(image, + thr_a=self.thr_a, + thr_b=self.thr_b, + boost=self.boost, + detect_resolution=self.detect_resolution, + image_resolution=self.image_resolution) + return processed_image + + +class TileResamplerProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): + + # fmt: off + type: Literal["tile_image_processor"] = "tile_image_processor" + # Inputs + #res: int = Field(default=512, ge=0, le=1024, description="The pixel resolution for each tile") + down_sampling_rate: float = Field(default=1.0, ge=1.0, le=8.0, description="Down sampling rate") + # fmt: on + + # tile_resample copied from sd-webui-controlnet/scripts/processor.py + def tile_resample(self, + np_img: np.ndarray, + res=512, # never used? + down_sampling_rate=1.0, + ): + np_img = HWC3(np_img) + if down_sampling_rate < 1.1: + return np_img + H, W, C = np_img.shape + H = int(float(H) / float(down_sampling_rate)) + W = int(float(W) / float(down_sampling_rate)) + np_img = cv2.resize(np_img, (W, H), interpolation=cv2.INTER_AREA) + return np_img + + def run_processor(self, img): + np_img = np.array(img, dtype=np.uint8) + processed_np_image = self.tile_resample(np_img, + #res=self.tile_size, + down_sampling_rate=self.down_sampling_rate + ) + processed_image = Image.fromarray(processed_np_image) + return processed_image + + + + +class SegmentAnythingProcessorInvocation(ImageProcessorInvocation, PILInvocationConfig): + """Applies segment anything processing to image""" + # fmt: off + type: Literal["segment_anything_processor"] = "segment_anything_processor" + # fmt: on + + def run_processor(self, image): + # segment_anything_processor = SamDetector.from_pretrained("ybelkada/segment-anything", subfolder="checkpoints") + segment_anything_processor = SamDetectorReproducibleColors.from_pretrained("ybelkada/segment-anything", subfolder="checkpoints") + np_img = np.array(image, dtype=np.uint8) + processed_image = segment_anything_processor(np_img) + return processed_image + +class SamDetectorReproducibleColors(SamDetector): + + # overriding SamDetector.show_anns() method to use reproducible colors for segmentation image + # base class show_anns() method randomizes colors, + # which seems to also lead to non-reproducible image generation + # so using ADE20k color palette instead + def show_anns(self, anns: List[Dict]): + if len(anns) == 0: + return + sorted_anns = sorted(anns, key=(lambda x: x['area']), reverse=True) + h, w = anns[0]['segmentation'].shape + final_img = Image.fromarray(np.zeros((h, w, 3), dtype=np.uint8), mode="RGB") + palette = ade_palette() + for i, ann in enumerate(sorted_anns): + m = ann['segmentation'] + img = np.empty((m.shape[0], m.shape[1], 3), dtype=np.uint8) + # doing modulo just in case number of annotated regions exceeds number of colors in palette + ann_color = palette[i % len(palette)] + img[:, :] = ann_color + final_img.paste(Image.fromarray(img, mode="RGB"), (0, 0), Image.fromarray(np.uint8(m * 255))) + return np.array(final_img, dtype=np.uint8) diff --git a/invokeai/app/invocations/generate.py b/invokeai/app/invocations/generate.py index 7135e66a02..6cdb83effc 100644 --- a/invokeai/app/invocations/generate.py +++ b/invokeai/app/invocations/generate.py @@ -1,11 +1,10 @@ # Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) from functools import partial -from typing import Literal, Optional, Union, get_args +from typing import Literal, Optional, get_args import torch -from diffusers import ControlNetModel -from pydantic import BaseModel, Field +from pydantic import Field from invokeai.app.models.image import (ColorField, ImageCategory, ImageField, ResourceOrigin) @@ -18,7 +17,6 @@ from ..util.step_callback import stable_diffusion_step_callback from .baseinvocation import BaseInvocation, InvocationConfig, InvocationContext from .image import ImageOutput -import re from ...backend.model_management.lora import ModelPatcher from ...backend.stable_diffusion.diffusers_pipeline import StableDiffusionGeneratorPipeline from .model import UNetField, VaeField @@ -76,7 +74,7 @@ class InpaintInvocation(BaseInvocation): vae: VaeField = Field(default=None, description="Vae model") # Inputs - image: Union[ImageField, None] = Field(description="The input image") + image: Optional[ImageField] = Field(description="The input image") strength: float = Field( default=0.75, gt=0, le=1, description="The strength of the original image" ) @@ -86,7 +84,7 @@ class InpaintInvocation(BaseInvocation): ) # Inputs - mask: Union[ImageField, None] = Field(description="The mask") + mask: Optional[ImageField] = Field(description="The mask") seam_size: int = Field(default=96, ge=1, description="The seam inpaint size (px)") seam_blur: int = Field( default=16, ge=0, description="The seam inpaint blur radius (px)" @@ -156,40 +154,42 @@ class InpaintInvocation(BaseInvocation): @contextmanager def load_model_old_way(self, context, scheduler): + def _lora_loader(): + for lora in self.unet.loras: + lora_info = context.services.model_manager.get_model( + **lora.dict(exclude={"weight"})) + yield (lora_info.context.model, lora.weight) + del lora_info + return + unet_info = context.services.model_manager.get_model(**self.unet.unet.dict()) vae_info = context.services.model_manager.get_model(**self.vae.vae.dict()) - #unet = unet_info.context.model - #vae = vae_info.context.model + with vae_info as vae,\ + ModelPatcher.apply_lora_unet(unet_info.context.model, _lora_loader()),\ + unet_info as unet: - with ExitStack() as stack: - loras = [(stack.enter_context(context.services.model_manager.get_model(**lora.dict(exclude={"weight"}))), lora.weight) for lora in self.unet.loras] + device = context.services.model_manager.mgr.cache.execution_device + dtype = context.services.model_manager.mgr.cache.precision - with vae_info as vae,\ - unet_info as unet,\ - ModelPatcher.apply_lora_unet(unet, loras): + pipeline = StableDiffusionGeneratorPipeline( + vae=vae, + text_encoder=None, + tokenizer=None, + unet=unet, + scheduler=scheduler, + safety_checker=None, + feature_extractor=None, + requires_safety_checker=False, + precision="float16" if dtype == torch.float16 else "float32", + execution_device=device, + ) - device = context.services.model_manager.mgr.cache.execution_device - dtype = context.services.model_manager.mgr.cache.precision - - pipeline = StableDiffusionGeneratorPipeline( - vae=vae, - text_encoder=None, - tokenizer=None, - unet=unet, - scheduler=scheduler, - safety_checker=None, - feature_extractor=None, - requires_safety_checker=False, - precision="float16" if dtype == torch.float16 else "float32", - execution_device=device, - ) - - yield OldModelInfo( - name=self.unet.unet.model_name, - hash="", - model=pipeline, - ) + yield OldModelInfo( + name=self.unet.unet.model_name, + hash="", + model=pipeline, + ) def invoke(self, context: InvocationContext) -> ImageOutput: image = ( @@ -228,21 +228,21 @@ class InpaintInvocation(BaseInvocation): ), # Shorthand for passing all of the parameters above manually ) - # Outputs is an infinite iterator that will return a new InvokeAIGeneratorOutput object - # each time it is called. We only need the first one. - generator_output = next(outputs) + # Outputs is an infinite iterator that will return a new InvokeAIGeneratorOutput object + # each time it is called. We only need the first one. + generator_output = next(outputs) - image_dto = context.services.images.create( - image=generator_output.image, - image_origin=ResourceOrigin.INTERNAL, - image_category=ImageCategory.GENERAL, - session_id=context.graph_execution_state_id, - node_id=self.id, - is_intermediate=self.is_intermediate, - ) + image_dto = context.services.images.create( + image=generator_output.image, + image_origin=ResourceOrigin.INTERNAL, + image_category=ImageCategory.GENERAL, + session_id=context.graph_execution_state_id, + node_id=self.id, + is_intermediate=self.is_intermediate, + ) - return ImageOutput( - image=ImageField(image_name=image_dto.image_name), - width=image_dto.width, - height=image_dto.height, - ) + return ImageOutput( + image=ImageField(image_name=image_dto.image_name), + width=image_dto.width, + height=image_dto.height, + ) diff --git a/invokeai/app/invocations/image.py b/invokeai/app/invocations/image.py index f85669eab1..1dbbff1c84 100644 --- a/invokeai/app/invocations/image.py +++ b/invokeai/app/invocations/image.py @@ -1,7 +1,6 @@ # Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) -import io -from typing import Literal, Optional, Union +from typing import Literal, Optional import numpy from PIL import Image, ImageFilter, ImageOps, ImageChops @@ -67,7 +66,7 @@ class LoadImageInvocation(BaseInvocation): type: Literal["load_image"] = "load_image" # Inputs - image: Union[ImageField, None] = Field( + image: Optional[ImageField] = Field( default=None, description="The image to load" ) # fmt: on @@ -87,7 +86,7 @@ class ShowImageInvocation(BaseInvocation): type: Literal["show_image"] = "show_image" # Inputs - image: Union[ImageField, None] = Field( + image: Optional[ImageField] = Field( default=None, description="The image to show" ) @@ -112,7 +111,7 @@ class ImageCropInvocation(BaseInvocation, PILInvocationConfig): type: Literal["img_crop"] = "img_crop" # Inputs - image: Union[ImageField, None] = Field(default=None, description="The image to crop") + image: Optional[ImageField] = Field(default=None, description="The image to crop") x: int = Field(default=0, description="The left x coordinate of the crop rectangle") y: int = Field(default=0, description="The top y coordinate of the crop rectangle") width: int = Field(default=512, gt=0, description="The width of the crop rectangle") @@ -150,8 +149,8 @@ class ImagePasteInvocation(BaseInvocation, PILInvocationConfig): type: Literal["img_paste"] = "img_paste" # Inputs - base_image: Union[ImageField, None] = Field(default=None, description="The base image") - image: Union[ImageField, None] = Field(default=None, description="The image to paste") + base_image: Optional[ImageField] = Field(default=None, description="The base image") + image: Optional[ImageField] = Field(default=None, description="The image to paste") mask: Optional[ImageField] = Field(default=None, description="The mask to use when pasting") x: int = Field(default=0, description="The left x coordinate at which to paste the image") y: int = Field(default=0, description="The top y coordinate at which to paste the image") @@ -203,7 +202,7 @@ class MaskFromAlphaInvocation(BaseInvocation, PILInvocationConfig): type: Literal["tomask"] = "tomask" # Inputs - image: Union[ImageField, None] = Field(default=None, description="The image to create the mask from") + image: Optional[ImageField] = Field(default=None, description="The image to create the mask from") invert: bool = Field(default=False, description="Whether or not to invert the mask") # fmt: on @@ -237,8 +236,8 @@ class ImageMultiplyInvocation(BaseInvocation, PILInvocationConfig): type: Literal["img_mul"] = "img_mul" # Inputs - image1: Union[ImageField, None] = Field(default=None, description="The first image to multiply") - image2: Union[ImageField, None] = Field(default=None, description="The second image to multiply") + image1: Optional[ImageField] = Field(default=None, description="The first image to multiply") + image2: Optional[ImageField] = Field(default=None, description="The second image to multiply") # fmt: on def invoke(self, context: InvocationContext) -> ImageOutput: @@ -273,7 +272,7 @@ class ImageChannelInvocation(BaseInvocation, PILInvocationConfig): type: Literal["img_chan"] = "img_chan" # Inputs - image: Union[ImageField, None] = Field(default=None, description="The image to get the channel from") + image: Optional[ImageField] = Field(default=None, description="The image to get the channel from") channel: IMAGE_CHANNELS = Field(default="A", description="The channel to get") # fmt: on @@ -308,7 +307,7 @@ class ImageConvertInvocation(BaseInvocation, PILInvocationConfig): type: Literal["img_conv"] = "img_conv" # Inputs - image: Union[ImageField, None] = Field(default=None, description="The image to convert") + image: Optional[ImageField] = Field(default=None, description="The image to convert") mode: IMAGE_MODES = Field(default="L", description="The mode to convert to") # fmt: on @@ -340,7 +339,7 @@ class ImageBlurInvocation(BaseInvocation, PILInvocationConfig): type: Literal["img_blur"] = "img_blur" # Inputs - image: Union[ImageField, None] = Field(default=None, description="The image to blur") + image: Optional[ImageField] = Field(default=None, description="The image to blur") radius: float = Field(default=8.0, ge=0, description="The blur radius") blur_type: Literal["gaussian", "box"] = Field(default="gaussian", description="The type of blur") # fmt: on @@ -398,7 +397,7 @@ class ImageResizeInvocation(BaseInvocation, PILInvocationConfig): type: Literal["img_resize"] = "img_resize" # Inputs - image: Union[ImageField, None] = Field(default=None, description="The image to resize") + image: Optional[ImageField] = Field(default=None, description="The image to resize") width: int = Field(ge=64, multiple_of=8, description="The width to resize to (px)") height: int = Field(ge=64, multiple_of=8, description="The height to resize to (px)") resample_mode: PIL_RESAMPLING_MODES = Field(default="bicubic", description="The resampling mode") @@ -437,7 +436,7 @@ class ImageScaleInvocation(BaseInvocation, PILInvocationConfig): type: Literal["img_scale"] = "img_scale" # Inputs - image: Union[ImageField, None] = Field(default=None, description="The image to scale") + image: Optional[ImageField] = Field(default=None, description="The image to scale") scale_factor: float = Field(gt=0, description="The factor by which to scale the image") resample_mode: PIL_RESAMPLING_MODES = Field(default="bicubic", description="The resampling mode") # fmt: on @@ -477,7 +476,7 @@ class ImageLerpInvocation(BaseInvocation, PILInvocationConfig): type: Literal["img_lerp"] = "img_lerp" # Inputs - image: Union[ImageField, None] = Field(default=None, description="The image to lerp") + image: Optional[ImageField] = Field(default=None, description="The image to lerp") min: int = Field(default=0, ge=0, le=255, description="The minimum output value") max: int = Field(default=255, ge=0, le=255, description="The maximum output value") # fmt: on @@ -513,7 +512,7 @@ class ImageInverseLerpInvocation(BaseInvocation, PILInvocationConfig): type: Literal["img_ilerp"] = "img_ilerp" # Inputs - image: Union[ImageField, None] = Field(default=None, description="The image to lerp") + image: Optional[ImageField] = Field(default=None, description="The image to lerp") min: int = Field(default=0, ge=0, le=255, description="The minimum input value") max: int = Field(default=255, ge=0, le=255, description="The maximum input value") # fmt: on diff --git a/invokeai/app/invocations/infill.py b/invokeai/app/invocations/infill.py index ad67594c29..2640b2531d 100644 --- a/invokeai/app/invocations/infill.py +++ b/invokeai/app/invocations/infill.py @@ -1,6 +1,6 @@ # Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) and the InvokeAI Team -from typing import Literal, Union, get_args +from typing import Literal, Optional, get_args import numpy as np import math @@ -68,7 +68,7 @@ def get_tile_images(image: np.ndarray, width=8, height=8): def tile_fill_missing( - im: Image.Image, tile_size: int = 16, seed: Union[int, None] = None + im: Image.Image, tile_size: int = 16, seed: Optional[int] = None ) -> Image.Image: # Only fill if there's an alpha layer if im.mode != "RGBA": @@ -125,7 +125,7 @@ class InfillColorInvocation(BaseInvocation): """Infills transparent areas of an image with a solid color""" type: Literal["infill_rgba"] = "infill_rgba" - image: Union[ImageField, None] = Field( + image: Optional[ImageField] = Field( default=None, description="The image to infill" ) color: ColorField = Field( @@ -162,7 +162,7 @@ class InfillTileInvocation(BaseInvocation): type: Literal["infill_tile"] = "infill_tile" - image: Union[ImageField, None] = Field( + image: Optional[ImageField] = Field( default=None, description="The image to infill" ) tile_size: int = Field(default=32, ge=1, description="The tile size (px)") @@ -202,7 +202,7 @@ class InfillPatchMatchInvocation(BaseInvocation): type: Literal["infill_patchmatch"] = "infill_patchmatch" - image: Union[ImageField, None] = Field( + image: Optional[ImageField] = Field( default=None, description="The image to infill" ) diff --git a/invokeai/app/invocations/latent.py b/invokeai/app/invocations/latent.py index 942dae77f0..118f2e5e9d 100644 --- a/invokeai/app/invocations/latent.py +++ b/invokeai/app/invocations/latent.py @@ -1,21 +1,18 @@ # Copyright (c) 2023 Kyle Schouviller (https://github.com/kyle0654) -from contextlib import ExitStack from typing import List, Literal, Optional, Union import einops - -from pydantic import BaseModel, Field, validator import torch -from diffusers import ControlNetModel, DPMSolverMultistepScheduler +from diffusers import ControlNetModel from diffusers.image_processor import VaeImageProcessor from diffusers.schedulers import SchedulerMixin as Scheduler +from pydantic import BaseModel, Field, validator -from invokeai.app.util.misc import SEED_MAX, get_random_seed +from invokeai.app.invocations.metadata import CoreMetadata from invokeai.app.util.step_callback import stable_diffusion_step_callback -from ..models.image import ImageCategory, ImageField, ResourceOrigin -from ...backend.image_util.seamless import configure_model_padding +from ...backend.model_management.lora import ModelPatcher from ...backend.stable_diffusion import PipelineIntermediateState from ...backend.stable_diffusion.diffusers_pipeline import ( ConditioningData, ControlNetData, StableDiffusionGeneratorPipeline, @@ -25,6 +22,7 @@ from ...backend.stable_diffusion.diffusion.shared_invokeai_diffusion import \ from ...backend.stable_diffusion.schedulers import SCHEDULER_MAP from ...backend.util.devices import choose_torch_device, torch_dtype from ...backend.model_management import ModelPatcher +from ..models.image import ImageCategory, ImageField, ResourceOrigin from .baseinvocation import (BaseInvocation, BaseInvocationOutput, InvocationConfig, InvocationContext) from .compel import ConditioningField @@ -32,14 +30,17 @@ from .controlnet_image_processors import ControlField from .image import ImageOutput from .model import ModelInfo, UNetField, VaeField + class LatentsField(BaseModel): """A latents field used for passing latents between invocations""" - latents_name: Optional[str] = Field(default=None, description="The name of the latents") + latents_name: Optional[str] = Field( + default=None, description="The name of the latents") class Config: schema_extra = {"required": ["latents_name"]} + class LatentsOutput(BaseInvocationOutput): """Base class for invocations that output latents""" #fmt: off @@ -53,29 +54,11 @@ class LatentsOutput(BaseInvocationOutput): def build_latents_output(latents_name: str, latents: torch.Tensor): - return LatentsOutput( - latents=LatentsField(latents_name=latents_name), - width=latents.shape[3] * 8, - height=latents.shape[2] * 8, - ) - -class NoiseOutput(BaseInvocationOutput): - """Invocation noise output""" - #fmt: off - type: Literal["noise_output"] = "noise_output" - - # Inputs - noise: LatentsField = Field(default=None, description="The output noise") - width: int = Field(description="The width of the noise in pixels") - height: int = Field(description="The height of the noise in pixels") - #fmt: on - -def build_noise_output(latents_name: str, latents: torch.Tensor): - return NoiseOutput( - noise=LatentsField(latents_name=latents_name), - width=latents.size()[3] * 8, - height=latents.size()[2] * 8, - ) + return LatentsOutput( + latents=LatentsField(latents_name=latents_name), + width=latents.size()[3] * 8, + height=latents.size()[2] * 8, + ) SAMPLER_NAME_VALUES = Literal[ @@ -83,84 +66,30 @@ SAMPLER_NAME_VALUES = Literal[ ] - def get_scheduler( context: InvocationContext, scheduler_info: ModelInfo, scheduler_name: str, ) -> Scheduler: - scheduler_class, scheduler_extra_config = SCHEDULER_MAP.get(scheduler_name, SCHEDULER_MAP['ddim']) - orig_scheduler_info = context.services.model_manager.get_model(**scheduler_info.dict()) + scheduler_class, scheduler_extra_config = SCHEDULER_MAP.get( + scheduler_name, SCHEDULER_MAP['ddim']) + orig_scheduler_info = context.services.model_manager.get_model( + **scheduler_info.dict()) with orig_scheduler_info as orig_scheduler: scheduler_config = orig_scheduler.config - + if "_backup" in scheduler_config: scheduler_config = scheduler_config["_backup"] - scheduler_config = {**scheduler_config, **scheduler_extra_config, "_backup": scheduler_config} + scheduler_config = {**scheduler_config, ** + scheduler_extra_config, "_backup": scheduler_config} scheduler = scheduler_class.from_config(scheduler_config) - + # hack copied over from generate.py if not hasattr(scheduler, 'uses_inpainting_model'): scheduler.uses_inpainting_model = lambda: False return scheduler -def get_noise(width:int, height:int, device:torch.device, seed:int = 0, latent_channels:int=4, use_mps_noise:bool=False, downsampling_factor:int = 8): - # limit noise to only the diffusion image channels, not the mask channels - input_channels = min(latent_channels, 4) - use_device = "cpu" if (use_mps_noise or device.type == "mps") else device - generator = torch.Generator(device=use_device).manual_seed(seed) - x = torch.randn( - [ - 1, - input_channels, - height // downsampling_factor, - width // downsampling_factor, - ], - dtype=torch_dtype(device), - device=use_device, - generator=generator, - ).to(device) - # if self.perlin > 0.0: - # perlin_noise = self.get_perlin_noise( - # width // self.downsampling_factor, height // self.downsampling_factor - # ) - # x = (1 - self.perlin) * x + self.perlin * perlin_noise - return x - -class NoiseInvocation(BaseInvocation): - """Generates latent noise.""" - - type: Literal["noise"] = "noise" - - # Inputs - seed: int = Field(ge=0, le=SEED_MAX, description="The seed to use", default_factory=get_random_seed) - width: int = Field(default=512, multiple_of=8, gt=0, description="The width of the resulting noise", ) - height: int = Field(default=512, multiple_of=8, gt=0, description="The height of the resulting noise", ) - - - # Schema customisation - class Config(InvocationConfig): - schema_extra = { - "ui": { - "tags": ["latents", "noise"], - }, - } - - @validator("seed", pre=True) - def modulo_seed(cls, v): - """Returns the seed modulo SEED_MAX to ensure it is within the valid range.""" - return v % SEED_MAX - - def invoke(self, context: InvocationContext) -> NoiseOutput: - device = torch.device(choose_torch_device()) - noise = get_noise(self.width, self.height, device, self.seed) - - name = f'{context.graph_execution_state_id}__{self.id}' - context.services.latents.save(name, noise) - return build_noise_output(latents_name=name, latents=noise) - - # Text to image class TextToLatentsInvocation(BaseInvocation): """Generates latents from conditionings.""" @@ -199,18 +128,18 @@ class TextToLatentsInvocation(BaseInvocation): "ui": { "tags": ["latents"], "type_hints": { - "model": "model", - "control": "control", - # "cfg_scale": "float", - "cfg_scale": "number" + "model": "model", + "control": "control", + # "cfg_scale": "float", + "cfg_scale": "number" } }, } # TODO: pass this an emitter method or something? or a session for dispatching? def dispatch_progress( - self, context: InvocationContext, source_node_id: str, intermediate_state: PipelineIntermediateState - ) -> None: + self, context: InvocationContext, source_node_id: str, + intermediate_state: PipelineIntermediateState) -> None: stable_diffusion_step_callback( context=context, intermediate_state=intermediate_state, @@ -218,9 +147,12 @@ class TextToLatentsInvocation(BaseInvocation): source_node_id=source_node_id, ) - def get_conditioning_data(self, context: InvocationContext, scheduler) -> ConditioningData: - c, extra_conditioning_info = context.services.latents.get(self.positive_conditioning.conditioning_name) - uc, _ = context.services.latents.get(self.negative_conditioning.conditioning_name) + def get_conditioning_data( + self, context: InvocationContext, scheduler) -> ConditioningData: + c, extra_conditioning_info = context.services.latents.get( + self.positive_conditioning.conditioning_name) + uc, _ = context.services.latents.get( + self.negative_conditioning.conditioning_name) conditioning_data = ConditioningData( unconditioned_embeddings=uc, @@ -228,10 +160,10 @@ class TextToLatentsInvocation(BaseInvocation): guidance_scale=self.cfg_scale, extra=extra_conditioning_info, postprocessing_settings=PostprocessingSettings( - threshold=0.0,#threshold, - warmup=0.2,#warmup, - h_symmetry_time_pct=None,#h_symmetry_time_pct, - v_symmetry_time_pct=None#v_symmetry_time_pct, + threshold=0.0, # threshold, + warmup=0.2, # warmup, + h_symmetry_time_pct=None, # h_symmetry_time_pct, + v_symmetry_time_pct=None # v_symmetry_time_pct, ), ) @@ -239,31 +171,32 @@ class TextToLatentsInvocation(BaseInvocation): scheduler, # for ddim scheduler - eta=0.0, #ddim_eta + eta=0.0, # ddim_eta # for ancestral and sde schedulers generator=torch.Generator(device=uc.device).manual_seed(0), ) return conditioning_data - def create_pipeline(self, unet, scheduler) -> StableDiffusionGeneratorPipeline: + def create_pipeline( + self, unet, scheduler) -> StableDiffusionGeneratorPipeline: # TODO: - #configure_model_padding( + # configure_model_padding( # unet, # self.seamless, # self.seamless_axes, - #) + # ) class FakeVae: class FakeVaeConfig: def __init__(self): self.block_out_channels = [0] - + def __init__(self): self.config = FakeVae.FakeVaeConfig() return StableDiffusionGeneratorPipeline( - vae=FakeVae(), # TODO: oh... + vae=FakeVae(), # TODO: oh... text_encoder=None, tokenizer=None, unet=unet, @@ -273,11 +206,12 @@ class TextToLatentsInvocation(BaseInvocation): requires_safety_checker=False, precision="float16" if unet.dtype == torch.float16 else "float32", ) - + def prep_control_data( self, context: InvocationContext, - model: StableDiffusionGeneratorPipeline, # really only need model for dtype and device + # really only need model for dtype and device + model: StableDiffusionGeneratorPipeline, control_input: List[ControlField], latents_shape: List[int], do_classifier_free_guidance: bool = True, @@ -287,19 +221,14 @@ class TextToLatentsInvocation(BaseInvocation): control_height_resize = latents_shape[2] * 8 control_width_resize = latents_shape[3] * 8 if control_input is None: - # print("control input is None") control_list = None elif isinstance(control_input, list) and len(control_input) == 0: - # print("control input is empty list") control_list = None elif isinstance(control_input, ControlField): - # print("control input is ControlField") control_list = [control_input] elif isinstance(control_input, list) and len(control_input) > 0 and isinstance(control_input[0], ControlField): - # print("control input is list[ControlField]") control_list = control_input else: - # print("input control is unrecognized:", type(self.control)) control_list = None if (control_list is None): control_data = None @@ -318,15 +247,17 @@ class TextToLatentsInvocation(BaseInvocation): print("Using HF model subfolders") print(" control_name: ", control_name) print(" control_subfolder: ", control_subfolder) - control_model = ControlNetModel.from_pretrained(control_name, - subfolder=control_subfolder, - torch_dtype=model.unet.dtype).to(model.device) + control_model = ControlNetModel.from_pretrained( + control_name, subfolder=control_subfolder, + torch_dtype=model.unet.dtype).to( + model.device) else: - control_model = ControlNetModel.from_pretrained(control_info.control_model, - torch_dtype=model.unet.dtype).to(model.device) + control_model = ControlNetModel.from_pretrained( + control_info.control_model, torch_dtype=model.unet.dtype).to(model.device) control_models.append(control_model) control_image_field = control_info.image - input_image = context.services.images.get_pil_image(control_image_field.image_name) + input_image = context.services.images.get_pil_image( + control_image_field.image_name) # self.image.image_type, self.image.image_name # FIXME: still need to test with different widths, heights, devices, dtypes # and add in batch_size, num_images_per_prompt? @@ -341,41 +272,52 @@ class TextToLatentsInvocation(BaseInvocation): # num_images_per_prompt=num_images_per_prompt, device=control_model.device, dtype=control_model.dtype, + control_mode=control_info.control_mode, ) - control_item = ControlNetData(model=control_model, - image_tensor=control_image, - weight=control_info.control_weight, - begin_step_percent=control_info.begin_step_percent, - end_step_percent=control_info.end_step_percent) + control_item = ControlNetData( + model=control_model, image_tensor=control_image, + weight=control_info.control_weight, + begin_step_percent=control_info.begin_step_percent, + end_step_percent=control_info.end_step_percent, + control_mode=control_info.control_mode,) control_data.append(control_item) # MultiControlNetModel has been refactored out, just need list[ControlNetData] return control_data + @torch.no_grad() def invoke(self, context: InvocationContext) -> LatentsOutput: noise = context.services.latents.get(self.noise.latents_name) # Get the source node id (we are invoking the prepared node) - graph_execution_state = context.services.graph_execution_manager.get(context.graph_execution_state_id) + graph_execution_state = context.services.graph_execution_manager.get( + context.graph_execution_state_id) source_node_id = graph_execution_state.prepared_source_mapping[self.id] def step_callback(state: PipelineIntermediateState): self.dispatch_progress(context, source_node_id, state) - unet_info = context.services.model_manager.get_model(**self.unet.unet.dict()) - with unet_info as unet,\ - ExitStack() as stack: + def _lora_loader(): + for lora in self.unet.loras: + lora_info = context.services.model_manager.get_model( + **lora.dict(exclude={"weight"})) + yield (lora_info.context.model, lora.weight) + del lora_info + return + + unet_info = context.services.model_manager.get_model( + **self.unet.unet.dict()) + with ModelPatcher.apply_lora_unet(unet_info.context.model, _lora_loader()),\ + unet_info as unet: scheduler = get_scheduler( context=context, scheduler_info=self.unet.scheduler, scheduler_name=self.scheduler, ) - + pipeline = self.create_pipeline(unet, scheduler) conditioning_data = self.get_conditioning_data(context, scheduler) - loras = [(stack.enter_context(context.services.model_manager.get_model(**lora.dict(exclude={"weight"}))), lora.weight) for lora in self.unet.loras] - control_data = self.prep_control_data( model=pipeline, context=context, control_input=self.control, latents_shape=noise.shape, @@ -383,16 +325,15 @@ class TextToLatentsInvocation(BaseInvocation): do_classifier_free_guidance=True, ) - with ModelPatcher.apply_lora_unet(pipeline.unet, loras): - # TODO: Verify the noise is the right size - result_latents, result_attention_map_saver = pipeline.latents_from_embeddings( - latents=torch.zeros_like(noise, dtype=torch_dtype(unet.device)), - noise=noise, - num_inference_steps=self.steps, - conditioning_data=conditioning_data, - control_data=control_data, # list[ControlNetData] - callback=step_callback, - ) + # TODO: Verify the noise is the right size + result_latents, result_attention_map_saver = pipeline.latents_from_embeddings( + latents=torch.zeros_like(noise, dtype=torch_dtype(unet.device)), + noise=noise, + num_inference_steps=self.steps, + conditioning_data=conditioning_data, + control_data=control_data, # list[ControlNetData] + callback=step_callback, + ) # https://discuss.huggingface.co/t/memory-usage-by-later-pipeline-stages/23699 torch.cuda.empty_cache() @@ -401,14 +342,18 @@ class TextToLatentsInvocation(BaseInvocation): context.services.latents.save(name, result_latents) return build_latents_output(latents_name=name, latents=result_latents) + class LatentsToLatentsInvocation(TextToLatentsInvocation): """Generates latents using latents as base image.""" type: Literal["l2l"] = "l2l" # Inputs - latents: Optional[LatentsField] = Field(description="The latents to use as a base image") - strength: float = Field(default=0.7, ge=0, le=1, description="The strength of the latents to use") + latents: Optional[LatentsField] = Field( + description="The latents to use as a base image") + strength: float = Field( + default=0.7, ge=0, le=1, + description="The strength of the latents to use") # Schema customisation class Config(InvocationConfig): @@ -423,23 +368,31 @@ class LatentsToLatentsInvocation(TextToLatentsInvocation): }, } + @torch.no_grad() def invoke(self, context: InvocationContext) -> LatentsOutput: noise = context.services.latents.get(self.noise.latents_name) latent = context.services.latents.get(self.latents.latents_name) # Get the source node id (we are invoking the prepared node) - graph_execution_state = context.services.graph_execution_manager.get(context.graph_execution_state_id) + graph_execution_state = context.services.graph_execution_manager.get( + context.graph_execution_state_id) source_node_id = graph_execution_state.prepared_source_mapping[self.id] def step_callback(state: PipelineIntermediateState): self.dispatch_progress(context, source_node_id, state) - unet_info = context.services.model_manager.get_model( - **self.unet.unet.dict(), - ) + def _lora_loader(): + for lora in self.unet.loras: + lora_info = context.services.model_manager.get_model( + **lora.dict(exclude={"weight"})) + yield (lora_info.context.model, lora.weight) + del lora_info + return - with unet_info as unet,\ - ExitStack() as stack: + unet_info = context.services.model_manager.get_model( + **self.unet.unet.dict()) + with ModelPatcher.apply_lora_unet(unet_info.context.model, _lora_loader()),\ + unet_info as unet: scheduler = get_scheduler( context=context, @@ -449,7 +402,7 @@ class LatentsToLatentsInvocation(TextToLatentsInvocation): pipeline = self.create_pipeline(unet, scheduler) conditioning_data = self.get_conditioning_data(context, scheduler) - + control_data = self.prep_control_data( model=pipeline, context=context, control_input=self.control, latents_shape=noise.shape, @@ -459,8 +412,7 @@ class LatentsToLatentsInvocation(TextToLatentsInvocation): # TODO: Verify the noise is the right size initial_latents = latent if self.strength < 1.0 else torch.zeros_like( - latent, device=unet.device, dtype=latent.dtype - ) + latent, device=unet.device, dtype=latent.dtype) timesteps, _ = pipeline.get_img2img_timesteps( self.steps, @@ -468,18 +420,15 @@ class LatentsToLatentsInvocation(TextToLatentsInvocation): device=unet.device, ) - loras = [(stack.enter_context(context.services.model_manager.get_model(**lora.dict(exclude={"weight"}))), lora.weight) for lora in self.unet.loras] - - with ModelPatcher.apply_lora_unet(pipeline.unet, loras): - result_latents, result_attention_map_saver = pipeline.latents_from_embeddings( - latents=initial_latents, - timesteps=timesteps, - noise=noise, - num_inference_steps=self.steps, - conditioning_data=conditioning_data, - control_data=control_data, # list[ControlNetData] - callback=step_callback - ) + result_latents, result_attention_map_saver = pipeline.latents_from_embeddings( + latents=initial_latents, + timesteps=timesteps, + noise=noise, + num_inference_steps=self.steps, + conditioning_data=conditioning_data, + control_data=control_data, # list[ControlNetData] + callback=step_callback + ) # https://discuss.huggingface.co/t/memory-usage-by-later-pipeline-stages/23699 torch.cuda.empty_cache() @@ -496,9 +445,14 @@ class LatentsToImageInvocation(BaseInvocation): type: Literal["l2i"] = "l2i" # Inputs - latents: Optional[LatentsField] = Field(description="The latents to generate an image from") + latents: Optional[LatentsField] = Field( + description="The latents to generate an image from") vae: VaeField = Field(default=None, description="Vae submodel") - tiled: bool = Field(default=False, description="Decode latents by overlaping tiles(less memory consumption)") + tiled: bool = Field( + default=False, + description="Decode latents by overlaping tiles(less memory consumption)") + metadata: Optional[CoreMetadata] = Field(default=None, description="Optional core metadata to be written to the image") + # Schema customisation class Config(InvocationConfig): @@ -529,7 +483,7 @@ class LatentsToImageInvocation(BaseInvocation): # copied from diffusers pipeline latents = latents / vae.config.scaling_factor image = vae.decode(latents, return_dict=False)[0] - image = (image / 2 + 0.5).clamp(0, 1) # denormalize + image = (image / 2 + 0.5).clamp(0, 1) # denormalize # we always cast to float32 as this does not cause significant overhead and is compatible with bfloat16 np_image = image.cpu().permute(0, 2, 3, 1).float().numpy() @@ -543,6 +497,8 @@ class LatentsToImageInvocation(BaseInvocation): image_category=ImageCategory.GENERAL, node_id=self.id, session_id=context.graph_execution_state_id, + is_intermediate=self.is_intermediate, + metadata=self.metadata.dict() if self.metadata else None, ) return ImageOutput( @@ -551,9 +507,9 @@ class LatentsToImageInvocation(BaseInvocation): height=image_dto.height, ) -LATENTS_INTERPOLATION_MODE = Literal[ - "nearest", "linear", "bilinear", "bicubic", "trilinear", "area", "nearest-exact" -] + +LATENTS_INTERPOLATION_MODE = Literal["nearest", "linear", + "bilinear", "bicubic", "trilinear", "area", "nearest-exact"] class ResizeLatentsInvocation(BaseInvocation): @@ -562,21 +518,25 @@ class ResizeLatentsInvocation(BaseInvocation): type: Literal["lresize"] = "lresize" # Inputs - latents: Optional[LatentsField] = Field(description="The latents to resize") - width: int = Field(ge=64, multiple_of=8, description="The width to resize to (px)") - height: int = Field(ge=64, multiple_of=8, description="The height to resize to (px)") - mode: LATENTS_INTERPOLATION_MODE = Field(default="bilinear", description="The interpolation mode") - antialias: bool = Field(default=False, description="Whether or not to antialias (applied in bilinear and bicubic modes only)") + latents: Optional[LatentsField] = Field( + description="The latents to resize") + width: int = Field( + ge=64, multiple_of=8, description="The width to resize to (px)") + height: int = Field( + ge=64, multiple_of=8, description="The height to resize to (px)") + mode: LATENTS_INTERPOLATION_MODE = Field( + default="bilinear", description="The interpolation mode") + antialias: bool = Field( + default=False, + description="Whether or not to antialias (applied in bilinear and bicubic modes only)") def invoke(self, context: InvocationContext) -> LatentsOutput: latents = context.services.latents.get(self.latents.latents_name) resized_latents = torch.nn.functional.interpolate( - latents, - size=(self.height // 8, self.width // 8), - mode=self.mode, - antialias=self.antialias if self.mode in ["bilinear", "bicubic"] else False, - ) + latents, size=(self.height // 8, self.width // 8), + mode=self.mode, antialias=self.antialias + if self.mode in ["bilinear", "bicubic"] else False,) # https://discuss.huggingface.co/t/memory-usage-by-later-pipeline-stages/23699 torch.cuda.empty_cache() @@ -593,21 +553,24 @@ class ScaleLatentsInvocation(BaseInvocation): type: Literal["lscale"] = "lscale" # Inputs - latents: Optional[LatentsField] = Field(description="The latents to scale") - scale_factor: float = Field(gt=0, description="The factor by which to scale the latents") - mode: LATENTS_INTERPOLATION_MODE = Field(default="bilinear", description="The interpolation mode") - antialias: bool = Field(default=False, description="Whether or not to antialias (applied in bilinear and bicubic modes only)") + latents: Optional[LatentsField] = Field( + description="The latents to scale") + scale_factor: float = Field( + gt=0, description="The factor by which to scale the latents") + mode: LATENTS_INTERPOLATION_MODE = Field( + default="bilinear", description="The interpolation mode") + antialias: bool = Field( + default=False, + description="Whether or not to antialias (applied in bilinear and bicubic modes only)") def invoke(self, context: InvocationContext) -> LatentsOutput: latents = context.services.latents.get(self.latents.latents_name) # resizing resized_latents = torch.nn.functional.interpolate( - latents, - scale_factor=self.scale_factor, - mode=self.mode, - antialias=self.antialias if self.mode in ["bilinear", "bicubic"] else False, - ) + latents, scale_factor=self.scale_factor, mode=self.mode, + antialias=self.antialias + if self.mode in ["bilinear", "bicubic"] else False,) # https://discuss.huggingface.co/t/memory-usage-by-later-pipeline-stages/23699 torch.cuda.empty_cache() @@ -624,9 +587,11 @@ class ImageToLatentsInvocation(BaseInvocation): type: Literal["i2l"] = "i2l" # Inputs - image: Union[ImageField, None] = Field(description="The image to encode") + image: Optional[ImageField] = Field(description="The image to encode") vae: VaeField = Field(default=None, description="Vae submodel") - tiled: bool = Field(default=False, description="Encode latents by overlaping tiles(less memory consumption)") + tiled: bool = Field( + default=False, + description="Encode latents by overlaping tiles(less memory consumption)") # Schema customisation class Config(InvocationConfig): diff --git a/invokeai/app/invocations/metadata.py b/invokeai/app/invocations/metadata.py new file mode 100644 index 0000000000..b7639c56c7 --- /dev/null +++ b/invokeai/app/invocations/metadata.py @@ -0,0 +1,124 @@ +from typing import Literal, Optional, Union + +from pydantic import BaseModel, Field + +from invokeai.app.invocations.baseinvocation import (BaseInvocation, + BaseInvocationOutput, + InvocationContext) +from invokeai.app.invocations.controlnet_image_processors import ControlField +from invokeai.app.invocations.model import (LoRAModelField, MainModelField, + VAEModelField) + + +class LoRAMetadataField(BaseModel): + """LoRA metadata for an image generated in InvokeAI.""" + lora: LoRAModelField = Field(description="The LoRA model") + weight: float = Field(description="The weight of the LoRA model") + + +class CoreMetadata(BaseModel): + """Core generation metadata for an image generated in InvokeAI.""" + + generation_mode: str = Field(description="The generation mode that output this image",) + positive_prompt: str = Field(description="The positive prompt parameter") + negative_prompt: str = Field(description="The negative prompt parameter") + width: int = Field(description="The width parameter") + height: int = Field(description="The height parameter") + seed: int = Field(description="The seed used for noise generation") + rand_device: str = Field(description="The device used for random number generation") + cfg_scale: float = Field(description="The classifier-free guidance scale parameter") + steps: int = Field(description="The number of steps used for inference") + scheduler: str = Field(description="The scheduler used for inference") + clip_skip: int = Field(description="The number of skipped CLIP layers",) + model: MainModelField = Field(description="The main model used for inference") + controlnets: list[ControlField]= Field(description="The ControlNets used for inference") + loras: list[LoRAMetadataField] = Field(description="The LoRAs used for inference") + strength: Union[float, None] = Field( + default=None, + description="The strength used for latents-to-latents", + ) + init_image: Union[str, None] = Field( + default=None, description="The name of the initial image" + ) + vae: Union[VAEModelField, None] = Field( + default=None, + description="The VAE used for decoding, if the main model's default was not used", + ) + + +class ImageMetadata(BaseModel): + """An image's generation metadata""" + + metadata: Optional[dict] = Field( + default=None, + description="The image's core metadata, if it was created in the Linear or Canvas UI", + ) + graph: Optional[dict] = Field( + default=None, description="The graph that created the image" + ) + + +class MetadataAccumulatorOutput(BaseInvocationOutput): + """The output of the MetadataAccumulator node""" + + type: Literal["metadata_accumulator_output"] = "metadata_accumulator_output" + + metadata: CoreMetadata = Field(description="The core metadata for the image") + + +class MetadataAccumulatorInvocation(BaseInvocation): + """Outputs a Core Metadata Object""" + + type: Literal["metadata_accumulator"] = "metadata_accumulator" + + generation_mode: str = Field(description="The generation mode that output this image",) + positive_prompt: str = Field(description="The positive prompt parameter") + negative_prompt: str = Field(description="The negative prompt parameter") + width: int = Field(description="The width parameter") + height: int = Field(description="The height parameter") + seed: int = Field(description="The seed used for noise generation") + rand_device: str = Field(description="The device used for random number generation") + cfg_scale: float = Field(description="The classifier-free guidance scale parameter") + steps: int = Field(description="The number of steps used for inference") + scheduler: str = Field(description="The scheduler used for inference") + clip_skip: int = Field(description="The number of skipped CLIP layers",) + model: MainModelField = Field(description="The main model used for inference") + controlnets: list[ControlField]= Field(description="The ControlNets used for inference") + loras: list[LoRAMetadataField] = Field(description="The LoRAs used for inference") + strength: Union[float, None] = Field( + default=None, + description="The strength used for latents-to-latents", + ) + init_image: Union[str, None] = Field( + default=None, description="The name of the initial image" + ) + vae: Union[VAEModelField, None] = Field( + default=None, + description="The VAE used for decoding, if the main model's default was not used", + ) + + + def invoke(self, context: InvocationContext) -> MetadataAccumulatorOutput: + """Collects and outputs a CoreMetadata object""" + + return MetadataAccumulatorOutput( + metadata=CoreMetadata( + generation_mode=self.generation_mode, + positive_prompt=self.positive_prompt, + negative_prompt=self.negative_prompt, + width=self.width, + height=self.height, + seed=self.seed, + rand_device=self.rand_device, + cfg_scale=self.cfg_scale, + steps=self.steps, + scheduler=self.scheduler, + model=self.model, + strength=self.strength, + init_image=self.init_image, + vae=self.vae, + controlnets=self.controlnets, + loras=self.loras, + clip_skip=self.clip_skip, + ) + ) diff --git a/invokeai/app/invocations/model.py b/invokeai/app/invocations/model.py index 6bc4eb93a4..2ea5bf9687 100644 --- a/invokeai/app/invocations/model.py +++ b/invokeai/app/invocations/model.py @@ -1,31 +1,39 @@ -from typing import Literal, Optional, Union, List -from pydantic import BaseModel, Field import copy +from typing import List, Literal, Optional, Union -from .baseinvocation import BaseInvocation, BaseInvocationOutput, InvocationContext, InvocationConfig +from pydantic import BaseModel, Field -from ...backend.util.devices import choose_torch_device, torch_dtype from ...backend.model_management import BaseModelType, ModelType, SubModelType +from .baseinvocation import (BaseInvocation, BaseInvocationOutput, + InvocationConfig, InvocationContext) + class ModelInfo(BaseModel): model_name: str = Field(description="Info to load submodel") base_model: BaseModelType = Field(description="Base model") model_type: ModelType = Field(description="Info to load submodel") - submodel: Optional[SubModelType] = Field(description="Info to load submodel") + submodel: Optional[SubModelType] = Field( + default=None, description="Info to load submodel" + ) + class LoraInfo(ModelInfo): weight: float = Field(description="Lora's weight which to use when apply to model") + class UNetField(BaseModel): unet: ModelInfo = Field(description="Info to load unet submodel") scheduler: ModelInfo = Field(description="Info to load scheduler submodel") loras: List[LoraInfo] = Field(description="Loras to apply on model loading") + class ClipField(BaseModel): tokenizer: ModelInfo = Field(description="Info to load tokenizer submodel") text_encoder: ModelInfo = Field(description="Info to load text_encoder submodel") + skipped_layers: int = Field(description="Number of skipped layers in text_encoder") loras: List[LoraInfo] = Field(description="Loras to apply on model loading") + class VaeField(BaseModel): # TODO: better naming? vae: ModelInfo = Field(description="Info to load vae submodel") @@ -34,46 +42,51 @@ class VaeField(BaseModel): class ModelLoaderOutput(BaseInvocationOutput): """Model loader output""" - #fmt: off + # fmt: off type: Literal["model_loader_output"] = "model_loader_output" unet: UNetField = Field(default=None, description="UNet submodel") clip: ClipField = Field(default=None, description="Tokenizer and text_encoder submodels") vae: VaeField = Field(default=None, description="Vae submodel") - #fmt: on + # fmt: on -class PipelineModelField(BaseModel): - """Pipeline model field""" +class MainModelField(BaseModel): + """Main model field""" model_name: str = Field(description="Name of the model") base_model: BaseModelType = Field(description="Base model") -class PipelineModelLoaderInvocation(BaseInvocation): - """Loads a pipeline model, outputting its submodels.""" +class LoRAModelField(BaseModel): + """LoRA model field""" - type: Literal["pipeline_model_loader"] = "pipeline_model_loader" + model_name: str = Field(description="Name of the LoRA model") + base_model: BaseModelType = Field(description="Base model") - model: PipelineModelField = Field(description="The model to load") + +class MainModelLoaderInvocation(BaseInvocation): + """Loads a main model, outputting its submodels.""" + + type: Literal["main_model_loader"] = "main_model_loader" + + model: MainModelField = Field(description="The model to load") # TODO: precision? # Schema customisation class Config(InvocationConfig): schema_extra = { "ui": { + "title": "Model Loader", "tags": ["model", "loader"], - "type_hints": { - "model": "model" - } + "type_hints": {"model": "model"}, }, } def invoke(self, context: InvocationContext) -> ModelLoaderOutput: - base_model = self.model.base_model model_name = self.model.model_name - model_type = ModelType.Pipeline + model_type = ModelType.Main # TODO: not found exceptions if not context.services.model_manager.model_exists( @@ -112,7 +125,6 @@ class PipelineModelLoaderInvocation(BaseInvocation): ) """ - return ModelLoaderOutput( unet=UNetField( unet=ModelInfo( @@ -143,6 +155,7 @@ class PipelineModelLoaderInvocation(BaseInvocation): submodel=SubModelType.TextEncoder, ), loras=[], + skipped_layers=0, ), vae=VaeField( vae=ModelInfo( @@ -151,47 +164,69 @@ class PipelineModelLoaderInvocation(BaseInvocation): model_type=model_type, submodel=SubModelType.Vae, ), - ) + ), ) + class LoraLoaderOutput(BaseInvocationOutput): """Model loader output""" - #fmt: off + # fmt: off type: Literal["lora_loader_output"] = "lora_loader_output" unet: Optional[UNetField] = Field(default=None, description="UNet submodel") clip: Optional[ClipField] = Field(default=None, description="Tokenizer and text_encoder submodels") - #fmt: on + # fmt: on + class LoraLoaderInvocation(BaseInvocation): """Apply selected lora to unet and text_encoder.""" type: Literal["lora_loader"] = "lora_loader" - lora_name: str = Field(description="Lora model name") + lora: Union[LoRAModelField, None] = Field( + default=None, description="Lora model name" + ) weight: float = Field(default=0.75, description="With what weight to apply lora") unet: Optional[UNetField] = Field(description="UNet model for applying lora") clip: Optional[ClipField] = Field(description="Clip model for applying lora") + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "Lora Loader", + "tags": ["lora", "loader"], + "type_hints": {"lora": "lora_model"}, + }, + } + def invoke(self, context: InvocationContext) -> LoraLoaderOutput: + if self.lora is None: + raise Exception("No LoRA provided") + + base_model = self.lora.base_model + lora_name = self.lora.model_name # TODO: ui rewrite base_model = BaseModelType.StableDiffusion1 if not context.services.model_manager.model_exists( base_model=base_model, - model_name=self.lora_name, + model_name=lora_name, model_type=ModelType.Lora, ): - raise Exception(f"Unkown lora name: {self.lora_name}!") + raise Exception(f"Unkown lora name: {lora_name}!") - if self.unet is not None and any(lora.model_name == self.lora_name for lora in self.unet.loras): - raise Exception(f"Lora \"{self.lora_name}\" already applied to unet") + if self.unet is not None and any( + lora.model_name == lora_name for lora in self.unet.loras + ): + raise Exception(f'Lora "{lora_name}" already applied to unet') - if self.clip is not None and any(lora.model_name == self.lora_name for lora in self.clip.loras): - raise Exception(f"Lora \"{self.lora_name}\" already applied to clip") + if self.clip is not None and any( + lora.model_name == lora_name for lora in self.clip.loras + ): + raise Exception(f'Lora "{lora_name}" already applied to clip') output = LoraLoaderOutput() @@ -200,7 +235,7 @@ class LoraLoaderInvocation(BaseInvocation): output.unet.loras.append( LoraInfo( base_model=base_model, - model_name=self.lora_name, + model_name=lora_name, model_type=ModelType.Lora, submodel=None, weight=self.weight, @@ -212,7 +247,7 @@ class LoraLoaderInvocation(BaseInvocation): output.clip.loras.append( LoraInfo( base_model=base_model, - model_name=self.lora_name, + model_name=lora_name, model_type=ModelType.Lora, submodel=None, weight=self.weight, @@ -221,3 +256,58 @@ class LoraLoaderInvocation(BaseInvocation): return output + +class VAEModelField(BaseModel): + """Vae model field""" + + model_name: str = Field(description="Name of the model") + base_model: BaseModelType = Field(description="Base model") + + +class VaeLoaderOutput(BaseInvocationOutput): + """Model loader output""" + + # fmt: off + type: Literal["vae_loader_output"] = "vae_loader_output" + + vae: VaeField = Field(default=None, description="Vae model") + # fmt: on + + +class VaeLoaderInvocation(BaseInvocation): + """Loads a VAE model, outputting a VaeLoaderOutput""" + + type: Literal["vae_loader"] = "vae_loader" + + vae_model: VAEModelField = Field(description="The VAE to load") + + # Schema customisation + class Config(InvocationConfig): + schema_extra = { + "ui": { + "title": "VAE Loader", + "tags": ["vae", "loader"], + "type_hints": {"vae_model": "vae_model"}, + }, + } + + def invoke(self, context: InvocationContext) -> VaeLoaderOutput: + base_model = self.vae_model.base_model + model_name = self.vae_model.model_name + model_type = ModelType.Vae + + if not context.services.model_manager.model_exists( + base_model=base_model, + model_name=model_name, + model_type=model_type, + ): + raise Exception(f"Unkown vae name: {model_name}!") + return VaeLoaderOutput( + vae=VaeField( + vae=ModelInfo( + model_name=model_name, + base_model=base_model, + model_type=model_type, + ) + ) + ) diff --git a/invokeai/app/invocations/noise.py b/invokeai/app/invocations/noise.py new file mode 100644 index 0000000000..0d62ada34e --- /dev/null +++ b/invokeai/app/invocations/noise.py @@ -0,0 +1,134 @@ +# Copyright (c) 2023 Kyle Schouviller (https://github.com/kyle0654) & the InvokeAI Team + +import math +from typing import Literal + +from pydantic import Field, validator +import torch +from invokeai.app.invocations.latent import LatentsField + +from invokeai.app.util.misc import SEED_MAX, get_random_seed +from ...backend.util.devices import choose_torch_device, torch_dtype +from .baseinvocation import ( + BaseInvocation, + BaseInvocationOutput, + InvocationConfig, + InvocationContext, +) + +""" +Utilities +""" + + +def get_noise( + width: int, + height: int, + device: torch.device, + seed: int = 0, + latent_channels: int = 4, + downsampling_factor: int = 8, + use_cpu: bool = True, + perlin: float = 0.0, +): + """Generate noise for a given image size.""" + noise_device_type = "cpu" if use_cpu else device.type + + # limit noise to only the diffusion image channels, not the mask channels + input_channels = min(latent_channels, 4) + generator = torch.Generator(device=noise_device_type).manual_seed(seed) + + noise_tensor = torch.randn( + [ + 1, + input_channels, + height // downsampling_factor, + width // downsampling_factor, + ], + dtype=torch_dtype(device), + device=noise_device_type, + generator=generator, + ).to(device) + + return noise_tensor + + +""" +Nodes +""" + + +class NoiseOutput(BaseInvocationOutput): + """Invocation noise output""" + + # fmt: off + type: Literal["noise_output"] = "noise_output" + + # Inputs + noise: LatentsField = Field(default=None, description="The output noise") + width: int = Field(description="The width of the noise in pixels") + height: int = Field(description="The height of the noise in pixels") + # fmt: on + + +def build_noise_output(latents_name: str, latents: torch.Tensor): + return NoiseOutput( + noise=LatentsField(latents_name=latents_name), + width=latents.size()[3] * 8, + height=latents.size()[2] * 8, + ) + + +class NoiseInvocation(BaseInvocation): + """Generates latent noise.""" + + type: Literal["noise"] = "noise" + + # Inputs + seed: int = Field( + ge=0, + le=SEED_MAX, + description="The seed to use", + default_factory=get_random_seed, + ) + width: int = Field( + default=512, + multiple_of=8, + gt=0, + description="The width of the resulting noise", + ) + height: int = Field( + default=512, + multiple_of=8, + gt=0, + description="The height of the resulting noise", + ) + use_cpu: bool = Field( + default=True, + description="Use CPU for noise generation (for reproducible results across platforms)", + ) + + # Schema customisation + class Config(InvocationConfig): + schema_extra = { + "ui": { + "tags": ["latents", "noise"], + }, + } + + @validator("seed", pre=True) + def modulo_seed(cls, v): + """Returns the seed modulo SEED_MAX to ensure it is within the valid range.""" + return v % SEED_MAX + + def invoke(self, context: InvocationContext) -> NoiseOutput: + noise = get_noise( + width=self.width, + height=self.height, + device=choose_torch_device(), + seed=self.seed, + use_cpu=self.use_cpu, + ) + name = f"{context.graph_execution_state_id}__{self.id}" + context.services.latents.save(name, noise) + return build_noise_output(latents_name=name, latents=noise) diff --git a/invokeai/app/invocations/param_easing.py b/invokeai/app/invocations/param_easing.py index 1ff6261b88..e79763a35e 100644 --- a/invokeai/app/invocations/param_easing.py +++ b/invokeai/app/invocations/param_easing.py @@ -133,20 +133,19 @@ class StepParamEasingInvocation(BaseInvocation): postlist = list(num_poststeps * [self.post_end_value]) if log_diagnostics: - logger = InvokeAILogger.getLogger(name="StepParamEasing") - logger.debug("start_step: " + str(start_step)) - logger.debug("end_step: " + str(end_step)) - logger.debug("num_easing_steps: " + str(num_easing_steps)) - logger.debug("num_presteps: " + str(num_presteps)) - logger.debug("num_poststeps: " + str(num_poststeps)) - logger.debug("prelist size: " + str(len(prelist))) - logger.debug("postlist size: " + str(len(postlist))) - logger.debug("prelist: " + str(prelist)) - logger.debug("postlist: " + str(postlist)) + context.services.logger.debug("start_step: " + str(start_step)) + context.services.logger.debug("end_step: " + str(end_step)) + context.services.logger.debug("num_easing_steps: " + str(num_easing_steps)) + context.services.logger.debug("num_presteps: " + str(num_presteps)) + context.services.logger.debug("num_poststeps: " + str(num_poststeps)) + context.services.logger.debug("prelist size: " + str(len(prelist))) + context.services.logger.debug("postlist size: " + str(len(postlist))) + context.services.logger.debug("prelist: " + str(prelist)) + context.services.logger.debug("postlist: " + str(postlist)) easing_class = EASING_FUNCTIONS_MAP[self.easing] if log_diagnostics: - logger.debug("easing class: " + str(easing_class)) + context.services.logger.debug("easing class: " + str(easing_class)) easing_list = list() if self.mirror: # "expected" mirroring # if number of steps is even, squeeze duration down to (number_of_steps)/2 @@ -156,7 +155,7 @@ class StepParamEasingInvocation(BaseInvocation): # but if even then number_of_steps/2 === ceil(number_of_steps/2), so can just use ceil always base_easing_duration = int(np.ceil(num_easing_steps/2.0)) - if log_diagnostics: logger.debug("base easing duration: " + str(base_easing_duration)) + if log_diagnostics: context.services.logger.debug("base easing duration: " + str(base_easing_duration)) even_num_steps = (num_easing_steps % 2 == 0) # even number of steps easing_function = easing_class(start=self.start_value, end=self.end_value, @@ -166,14 +165,14 @@ class StepParamEasingInvocation(BaseInvocation): easing_val = easing_function.ease(step_index) base_easing_vals.append(easing_val) if log_diagnostics: - logger.debug("step_index: " + str(step_index) + ", easing_val: " + str(easing_val)) + context.services.logger.debug("step_index: " + str(step_index) + ", easing_val: " + str(easing_val)) if even_num_steps: mirror_easing_vals = list(reversed(base_easing_vals)) else: mirror_easing_vals = list(reversed(base_easing_vals[0:-1])) if log_diagnostics: - logger.debug("base easing vals: " + str(base_easing_vals)) - logger.debug("mirror easing vals: " + str(mirror_easing_vals)) + context.services.logger.debug("base easing vals: " + str(base_easing_vals)) + context.services.logger.debug("mirror easing vals: " + str(mirror_easing_vals)) easing_list = base_easing_vals + mirror_easing_vals # FIXME: add alt_mirror option (alternative to default or mirror), or remove entirely @@ -206,12 +205,12 @@ class StepParamEasingInvocation(BaseInvocation): step_val = easing_function.ease(step_index) easing_list.append(step_val) if log_diagnostics: - logger.debug("step_index: " + str(step_index) + ", easing_val: " + str(step_val)) + context.services.logger.debug("step_index: " + str(step_index) + ", easing_val: " + str(step_val)) if log_diagnostics: - logger.debug("prelist size: " + str(len(prelist))) - logger.debug("easing_list size: " + str(len(easing_list))) - logger.debug("postlist size: " + str(len(postlist))) + context.services.logger.debug("prelist size: " + str(len(prelist))) + context.services.logger.debug("easing_list size: " + str(len(easing_list))) + context.services.logger.debug("postlist size: " + str(len(postlist))) param_list = prelist + easing_list + postlist diff --git a/invokeai/app/invocations/reconstruct.py b/invokeai/app/invocations/reconstruct.py index 4185de3fd3..84ace2eefe 100644 --- a/invokeai/app/invocations/reconstruct.py +++ b/invokeai/app/invocations/reconstruct.py @@ -1,4 +1,4 @@ -from typing import Literal, Union +from typing import Literal, Optional from pydantic import Field @@ -15,7 +15,7 @@ class RestoreFaceInvocation(BaseInvocation): type: Literal["restore_face"] = "restore_face" # Inputs - image: Union[ImageField, None] = Field(description="The input image") + image: Optional[ImageField] = Field(description="The input image") strength: float = Field(default=0.75, gt=0, le=1, description="The strength of the restoration" ) # fmt: on diff --git a/invokeai/app/invocations/upscale.py b/invokeai/app/invocations/upscale.py index 42f85fd18d..15497343ae 100644 --- a/invokeai/app/invocations/upscale.py +++ b/invokeai/app/invocations/upscale.py @@ -1,6 +1,6 @@ # Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) -from typing import Literal, Union +from typing import Literal, Optional from pydantic import Field @@ -16,7 +16,7 @@ class UpscaleInvocation(BaseInvocation): type: Literal["upscale"] = "upscale" # Inputs - image: Union[ImageField, None] = Field(description="The input image", default=None) + image: Optional[ImageField] = Field(description="The input image", default=None) strength: float = Field(default=0.75, gt=0, le=1, description="The strength") level: Literal[2, 4] = Field(default=2, description="The upscale level") # fmt: on diff --git a/invokeai/app/models/metadata.py b/invokeai/app/models/metadata.py deleted file mode 100644 index 8d90ca0bc8..0000000000 --- a/invokeai/app/models/metadata.py +++ /dev/null @@ -1,93 +0,0 @@ -from typing import Optional, Union, List -from pydantic import BaseModel, Extra, Field, StrictFloat, StrictInt, StrictStr - - -class ImageMetadata(BaseModel): - """ - Core generation metadata for an image/tensor generated in InvokeAI. - - Also includes any metadata from the image's PNG tEXt chunks. - - Generated by traversing the execution graph, collecting the parameters of the nearest ancestors - of a given node. - - Full metadata may be accessed by querying for the session in the `graph_executions` table. - """ - - class Config: - extra = Extra.allow - """ - This lets the ImageMetadata class accept arbitrary additional fields. The CoreMetadataService - won't add any fields that are not already defined, but other a different metadata service - implementation might. - """ - - type: Optional[StrictStr] = Field( - default=None, - description="The type of the ancestor node of the image output node.", - ) - """The type of the ancestor node of the image output node.""" - positive_conditioning: Optional[StrictStr] = Field( - default=None, description="The positive conditioning." - ) - """The positive conditioning""" - negative_conditioning: Optional[StrictStr] = Field( - default=None, description="The negative conditioning." - ) - """The negative conditioning""" - width: Optional[StrictInt] = Field( - default=None, description="Width of the image/latents in pixels." - ) - """Width of the image/latents in pixels""" - height: Optional[StrictInt] = Field( - default=None, description="Height of the image/latents in pixels." - ) - """Height of the image/latents in pixels""" - seed: Optional[StrictInt] = Field( - default=None, description="The seed used for noise generation." - ) - """The seed used for noise generation""" - # cfg_scale: Optional[StrictFloat] = Field( - # cfg_scale: Union[float, list[float]] = Field( - cfg_scale: Union[StrictFloat, List[StrictFloat]] = Field( - default=None, description="The classifier-free guidance scale." - ) - """The classifier-free guidance scale""" - steps: Optional[StrictInt] = Field( - default=None, description="The number of steps used for inference." - ) - """The number of steps used for inference""" - scheduler: Optional[StrictStr] = Field( - default=None, description="The scheduler used for inference." - ) - """The scheduler used for inference""" - model: Optional[StrictStr] = Field( - default=None, description="The model used for inference." - ) - """The model used for inference""" - strength: Optional[StrictFloat] = Field( - default=None, - description="The strength used for image-to-image/latents-to-latents.", - ) - """The strength used for image-to-image/latents-to-latents.""" - latents: Optional[StrictStr] = Field( - default=None, description="The ID of the initial latents." - ) - """The ID of the initial latents""" - vae: Optional[StrictStr] = Field( - default=None, description="The VAE used for decoding." - ) - """The VAE used for decoding""" - unet: Optional[StrictStr] = Field( - default=None, description="The UNet used dor inference." - ) - """The UNet used dor inference""" - clip: Optional[StrictStr] = Field( - default=None, description="The CLIP Encoder used for conditioning." - ) - """The CLIP Encoder used for conditioning""" - extra: Optional[StrictStr] = Field( - default=None, - description="Uploaded image metadata, extracted from the PNG tEXt chunk.", - ) - """Uploaded image metadata, extracted from the PNG tEXt chunk.""" diff --git a/invokeai/app/services/board_image_record_storage.py b/invokeai/app/services/board_image_record_storage.py index 7aff41860c..197a639157 100644 --- a/invokeai/app/services/board_image_record_storage.py +++ b/invokeai/app/services/board_image_record_storage.py @@ -1,8 +1,7 @@ from abc import ABC, abstractmethod import sqlite3 import threading -from typing import Union, cast -from invokeai.app.services.board_record_storage import BoardRecord +from typing import Optional, cast from invokeai.app.services.image_record_storage import OffsetPaginatedResults from invokeai.app.services.models.image_record import ( @@ -44,7 +43,7 @@ class BoardImageRecordStorageBase(ABC): def get_board_for_image( self, image_name: str, - ) -> Union[str, None]: + ) -> Optional[str]: """Gets an image's board id, if it has one.""" pass @@ -215,7 +214,7 @@ class SqliteBoardImageRecordStorage(BoardImageRecordStorageBase): def get_board_for_image( self, image_name: str, - ) -> Union[str, None]: + ) -> Optional[str]: try: self._lock.acquire() self._cursor.execute( diff --git a/invokeai/app/services/board_images.py b/invokeai/app/services/board_images.py index 072effbfae..1ba225338b 100644 --- a/invokeai/app/services/board_images.py +++ b/invokeai/app/services/board_images.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod from logging import Logger -from typing import List, Union +from typing import List, Union, Optional from invokeai.app.services.board_image_record_storage import BoardImageRecordStorageBase from invokeai.app.services.board_record_storage import ( BoardRecord, @@ -49,7 +49,7 @@ class BoardImagesServiceABC(ABC): def get_board_for_image( self, image_name: str, - ) -> Union[str, None]: + ) -> Optional[str]: """Gets an image's board id, if it has one.""" pass @@ -126,13 +126,13 @@ class BoardImagesService(BoardImagesServiceABC): def get_board_for_image( self, image_name: str, - ) -> Union[str, None]: + ) -> Optional[str]: board_id = self._services.board_image_records.get_board_for_image(image_name) return board_id def board_record_to_dto( - board_record: BoardRecord, cover_image_name: str | None, image_count: int + board_record: BoardRecord, cover_image_name: Optional[str], image_count: int ) -> BoardDTO: """Converts a board record to a board DTO.""" return BoardDTO( diff --git a/invokeai/app/services/config.py b/invokeai/app/services/config.py index 014119289f..6d27c013f1 100644 --- a/invokeai/app/services/config.py +++ b/invokeai/app/services/config.py @@ -15,7 +15,7 @@ InvokeAI: conf_path: configs/models.yaml legacy_conf_dir: configs/stable-diffusion outdir: outputs - autoconvert_dir: null + autoimport_dir: null Models: model: stable-diffusion-1.5 embeddings: true @@ -23,7 +23,8 @@ InvokeAI: xformers_enabled: false sequential_guidance: false precision: float16 - max_loaded_models: 4 + max_cache_size: 6 + max_vram_cache_size: 2.7 always_use_cpu: false free_gpu_mem: false Features: @@ -168,9 +169,10 @@ from argparse import ArgumentParser from omegaconf import OmegaConf, DictConfig from pathlib import Path from pydantic import BaseSettings, Field, parse_obj_as -from typing import ClassVar, Dict, List, Literal, Union, get_origin, get_type_hints, get_args +from typing import ClassVar, Dict, List, Set, Literal, Union, get_origin, get_type_hints, get_args INIT_FILE = Path('invokeai.yaml') +MODEL_CORE = Path('models/core') DB_FILE = Path('invokeai.db') LEGACY_INIT_FILE = Path('invokeai.init') @@ -228,10 +230,10 @@ class InvokeAISettings(BaseSettings): upcase_environ = dict() for key,value in os.environ.items(): upcase_environ[key.upper()] = value - + fields = cls.__fields__ cls.argparse_groups = {} - + for name, field in fields.items(): if name not in cls._excluded(): current_default = field.default @@ -269,7 +271,8 @@ class InvokeAISettings(BaseSettings): @classmethod def _excluded(self)->List[str]: - return ['type','initconf'] + # combination of deprecated parameters and internal ones + return ['type','initconf', 'gpu_mem_reserved', 'max_loaded_models', 'version'] class Config: env_file_encoding = 'utf-8' @@ -324,16 +327,11 @@ class InvokeAISettings(BaseSettings): help=field.field_info.description, ) def _find_root()->Path: + venv = Path(os.environ.get("VIRTUAL_ENV") or ".") if os.environ.get("INVOKEAI_ROOT"): root = Path(os.environ.get("INVOKEAI_ROOT")).resolve() - elif ( - os.environ.get("VIRTUAL_ENV") - and (Path(os.environ.get("VIRTUAL_ENV"), "..", INIT_FILE).exists() - or - Path(os.environ.get("VIRTUAL_ENV"), "..", LEGACY_INIT_FILE).exists() - ) - ): - root = Path(os.environ.get("VIRTUAL_ENV"), "..").resolve() + elif any([(venv.parent/x).exists() for x in [INIT_FILE, LEGACY_INIT_FILE, MODEL_CORE]]): + root = (venv.parent).resolve() else: root = Path("~/invokeai").expanduser().resolve() return root @@ -348,7 +346,7 @@ setting environment variables INVOKEAI_. ''' singleton_config: ClassVar[InvokeAIAppConfig] = None singleton_init: ClassVar[Dict] = None - + #fmt: off type: Literal["InvokeAI"] = "InvokeAI" host : str = Field(default="127.0.0.1", description="IP address to bind to", category='Web Server') @@ -367,33 +365,41 @@ setting environment variables INVOKEAI_. always_use_cpu : bool = Field(default=False, description="If true, use the CPU for rendering even if a GPU is available.", category='Memory/Performance') free_gpu_mem : bool = Field(default=False, description="If true, purge model from GPU after each generation.", category='Memory/Performance') - max_loaded_models : int = Field(default=2, gt=0, description="Maximum number of models to keep in memory for rapid switching", category='Memory/Performance') + max_loaded_models : int = Field(default=3, gt=0, description="(DEPRECATED: use max_cache_size) Maximum number of models to keep in memory for rapid switching", category='DEPRECATED') + max_cache_size : float = Field(default=6.0, gt=0, description="Maximum memory amount used by model cache for rapid switching", category='Memory/Performance') + max_vram_cache_size : float = Field(default=2.75, ge=0, description="Amount of VRAM reserved for model storage", category='Memory/Performance') + gpu_mem_reserved : float = Field(default=2.75, ge=0, description="DEPRECATED: use max_vram_cache_size. Amount of VRAM reserved for model storage", category='DEPRECATED') precision : Literal[tuple(['auto','float16','float32','autocast'])] = Field(default='float16',description='Floating point precision', category='Memory/Performance') sequential_guidance : bool = Field(default=False, description="Whether to calculate guidance in serial instead of in parallel, lowering memory requirements", category='Memory/Performance') xformers_enabled : bool = Field(default=True, description="Enable/disable memory-efficient attention", category='Memory/Performance') tiled_decode : bool = Field(default=False, description="Whether to enable tiled VAE decode (reduces memory consumption with some performance penalty)", category='Memory/Performance') root : Path = Field(default=_find_root(), description='InvokeAI runtime root directory', category='Paths') - autoconvert_dir : Path = Field(default=None, description='Path to a directory of ckpt files to be converted into diffusers and imported on startup.', category='Paths') + autoimport_dir : Path = Field(default='autoimport/main', description='Path to a directory of models files to be imported on startup.', category='Paths') + lora_dir : Path = Field(default='autoimport/lora', description='Path to a directory of LoRA/LyCORIS models to be imported on startup.', category='Paths') + embedding_dir : Path = Field(default='autoimport/embedding', description='Path to a directory of Textual Inversion embeddings to be imported on startup.', category='Paths') + controlnet_dir : Path = Field(default='autoimport/controlnet', description='Path to a directory of ControlNet embeddings to be imported on startup.', category='Paths') conf_path : Path = Field(default='configs/models.yaml', description='Path to models definition file', category='Paths') - models_dir : Path = Field(default='./models', description='Path to the models directory', category='Paths') + models_dir : Path = Field(default='models', description='Path to the models directory', category='Paths') legacy_conf_dir : Path = Field(default='configs/stable-diffusion', description='Path to directory of legacy checkpoint config files', category='Paths') db_dir : Path = Field(default='databases', description='Path to InvokeAI databases directory', category='Paths') outdir : Path = Field(default='outputs', description='Default folder for output images', category='Paths') from_file : Path = Field(default=None, description='Take command input from the indicated file (command-line client only)', category='Paths') use_memory_db : bool = Field(default=False, description='Use in-memory database for storing image metadata', category='Paths') - + model : str = Field(default='stable-diffusion-1.5', description='Initial model name', category='Models') - + log_handlers : List[str] = Field(default=["console"], description='Log handler. Valid options are "console", "file=", "syslog=path|address:host:port", "http="', category="Logging") # note - would be better to read the log_format values from logging.py, but this creates circular dependencies issues log_format : Literal[tuple(['plain','color','syslog','legacy'])] = Field(default="color", description='Log format. Use "plain" for text-only, "color" for colorized output, "legacy" for 2.3-style logging and "syslog" for syslog-style', category="Logging") log_level : Literal[tuple(["debug","info","warning","error","critical"])] = Field(default="debug", description="Emit logging messages at this level or higher", category="Logging") + + version : bool = Field(default=False, description="Show InvokeAI version and exit", category="Other") #fmt: on def parse_args(self, argv: List[str]=None, conf: DictConfig = None, clobber=False): ''' - Update settings with contents of init file, environment, and + Update settings with contents of init file, environment, and command-line settings. :param conf: alternate Omegaconf dictionary object :param argv: aternate sys.argv list @@ -408,7 +414,7 @@ setting environment variables INVOKEAI_. except: pass InvokeAISettings.initconf = conf - + # parse args again in order to pick up settings in configuration file super().parse_args(argv) @@ -428,7 +434,7 @@ setting environment variables INVOKEAI_. cls.singleton_config = cls(**kwargs) cls.singleton_init = kwargs return cls.singleton_config - + @property def root_path(self)->Path: ''' diff --git a/invokeai/app/services/default_graphs.py b/invokeai/app/services/default_graphs.py index 5eda5e957d..92263751b7 100644 --- a/invokeai/app/services/default_graphs.py +++ b/invokeai/app/services/default_graphs.py @@ -1,4 +1,5 @@ -from ..invocations.latent import LatentsToImageInvocation, NoiseInvocation, TextToLatentsInvocation +from ..invocations.latent import LatentsToImageInvocation, TextToLatentsInvocation +from ..invocations.noise import NoiseInvocation from ..invocations.compel import CompelInvocation from ..invocations.params import ParamIntInvocation from .graph import Edge, EdgeConnection, ExposedNodeInput, ExposedNodeOutput, Graph, LibraryGraph diff --git a/invokeai/app/services/events.py b/invokeai/app/services/events.py index e578a24006..6c516c9b74 100644 --- a/invokeai/app/services/events.py +++ b/invokeai/app/services/events.py @@ -1,10 +1,9 @@ # Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) -from typing import Any +from typing import Any, Optional from invokeai.app.models.image import ProgressImage from invokeai.app.util.misc import get_timestamp from invokeai.app.services.model_manager_service import BaseModelType, ModelType, SubModelType, ModelInfo -from invokeai.app.models.exceptions import CanceledException class EventServiceBase: session_event: str = "session_event" @@ -28,7 +27,7 @@ class EventServiceBase: graph_execution_state_id: str, node: dict, source_node_id: str, - progress_image: ProgressImage | None, + progress_image: Optional[ProgressImage], step: int, total_steps: int, ) -> None: diff --git a/invokeai/app/services/graph.py b/invokeai/app/services/graph.py index e3cd3d47ce..24096da29b 100644 --- a/invokeai/app/services/graph.py +++ b/invokeai/app/services/graph.py @@ -3,7 +3,6 @@ import copy import itertools import uuid -from types import NoneType from typing import ( Annotated, Any, @@ -26,6 +25,8 @@ from ..invocations.baseinvocation import ( InvocationContext, ) +# in 3.10 this would be "from types import NoneType" +NoneType = type(None) class EdgeConnection(BaseModel): node_id: str = Field(description="The id of the node for this edge connection") @@ -60,8 +61,6 @@ def get_input_field(node: BaseInvocation, field: str) -> Any: node_input_field = node_inputs.get(field) or None return node_input_field -from typing import Optional, Union, List, get_args - def is_union_subtype(t1, t2): t1_args = get_args(t1) t2_args = get_args(t2) @@ -846,7 +845,7 @@ class GraphExecutionState(BaseModel): ] } - def next(self) -> BaseInvocation | None: + def next(self) -> Optional[BaseInvocation]: """Gets the next node ready to execute.""" # TODO: enable multiple nodes to execute simultaneously by tracking currently executing nodes diff --git a/invokeai/app/services/image_file_storage.py b/invokeai/app/services/image_file_storage.py index b90b9b2f8b..60ae613748 100644 --- a/invokeai/app/services/image_file_storage.py +++ b/invokeai/app/services/image_file_storage.py @@ -1,15 +1,14 @@ # Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) and the InvokeAI Team +import json from abc import ABC, abstractmethod from pathlib import Path from queue import Queue -from typing import Dict, Optional +from typing import Dict, Optional, Union -from PIL.Image import Image as PILImageType from PIL import Image, PngImagePlugin +from PIL.Image import Image as PILImageType from send2trash import send2trash -from invokeai.app.models.image import ResourceOrigin -from invokeai.app.models.metadata import ImageMetadata from invokeai.app.util.thumbnails import get_thumbnail_name, make_thumbnail @@ -60,7 +59,8 @@ class ImageFileStorageBase(ABC): self, image: PILImageType, image_name: str, - metadata: Optional[ImageMetadata] = None, + metadata: Optional[dict] = None, + graph: Optional[dict] = None, thumbnail_size: int = 256, ) -> None: """Saves an image and a 256x256 WEBP thumbnail. Returns a tuple of the image name, thumbnail name, and created timestamp.""" @@ -80,13 +80,15 @@ class DiskImageFileStorage(ImageFileStorageBase): __cache: Dict[Path, PILImageType] __max_cache_size: int - def __init__(self, output_folder: str | Path): + def __init__(self, output_folder: Union[str, Path]): self.__cache = dict() self.__cache_ids = Queue() self.__max_cache_size = 10 # TODO: get this from config - self.__output_folder: Path = output_folder if isinstance(output_folder, Path) else Path(output_folder) - self.__thumbnails_folder = self.__output_folder / 'thumbnails' + self.__output_folder: Path = ( + output_folder if isinstance(output_folder, Path) else Path(output_folder) + ) + self.__thumbnails_folder = self.__output_folder / "thumbnails" # Validate required output folders at launch self.__validate_storage_folders() @@ -94,7 +96,7 @@ class DiskImageFileStorage(ImageFileStorageBase): def get(self, image_name: str) -> PILImageType: try: image_path = self.get_path(image_name) - + cache_item = self.__get_cache(image_path) if cache_item: return cache_item @@ -109,20 +111,22 @@ class DiskImageFileStorage(ImageFileStorageBase): self, image: PILImageType, image_name: str, - metadata: Optional[ImageMetadata] = None, + metadata: Optional[dict] = None, + graph: Optional[dict] = None, thumbnail_size: int = 256, ) -> None: try: self.__validate_storage_folders() image_path = self.get_path(image_name) + pnginfo = PngImagePlugin.PngInfo() + if metadata is not None: - pnginfo = PngImagePlugin.PngInfo() - pnginfo.add_text("invokeai", metadata.json()) - image.save(image_path, "PNG", pnginfo=pnginfo) - else: - image.save(image_path, "PNG") + pnginfo.add_text("invokeai_metadata", json.dumps(metadata)) + if graph is not None: + pnginfo.add_text("invokeai_graph", json.dumps(graph)) + image.save(image_path, "PNG", pnginfo=pnginfo) thumbnail_name = get_thumbnail_name(image_name) thumbnail_path = self.get_path(thumbnail_name, thumbnail=True) thumbnail_image = make_thumbnail(image, thumbnail_size) @@ -155,31 +159,33 @@ class DiskImageFileStorage(ImageFileStorageBase): # TODO: make this a bit more flexible for e.g. cloud storage def get_path(self, image_name: str, thumbnail: bool = False) -> Path: path = self.__output_folder / image_name - + if thumbnail: thumbnail_name = get_thumbnail_name(image_name) path = self.__thumbnails_folder / thumbnail_name return path - def validate_path(self, path: str | Path) -> bool: + def validate_path(self, path: Union[str, Path]) -> bool: """Validates the path given for an image or thumbnail.""" path = path if isinstance(path, Path) else Path(path) return path.exists() - + def __validate_storage_folders(self) -> None: """Checks if the required output folders exist and create them if they don't""" folders: list[Path] = [self.__output_folder, self.__thumbnails_folder] for folder in folders: folder.mkdir(parents=True, exist_ok=True) - def __get_cache(self, image_name: Path) -> PILImageType | None: + def __get_cache(self, image_name: Path) -> Optional[PILImageType]: return None if image_name not in self.__cache else self.__cache[image_name] def __set_cache(self, image_name: Path, image: PILImageType): if not image_name in self.__cache: self.__cache[image_name] = image - self.__cache_ids.put(image_name) # TODO: this should refresh position for LRU cache + self.__cache_ids.put( + image_name + ) # TODO: this should refresh position for LRU cache if len(self.__cache) > self.__max_cache_size: cache_id = self.__cache_ids.get() if cache_id in self.__cache: diff --git a/invokeai/app/services/image_record_storage.py b/invokeai/app/services/image_record_storage.py index c34d2ca5c8..7b37307ce8 100644 --- a/invokeai/app/services/image_record_storage.py +++ b/invokeai/app/services/image_record_storage.py @@ -1,23 +1,16 @@ +import json +import sqlite3 +import threading from abc import ABC, abstractmethod from datetime import datetime from typing import Generic, Optional, TypeVar, cast -import sqlite3 -import threading -from typing import Optional, Union from pydantic import BaseModel, Field from pydantic.generics import GenericModel -from invokeai.app.models.metadata import ImageMetadata -from invokeai.app.models.image import ( - ImageCategory, - ResourceOrigin, -) +from invokeai.app.models.image import ImageCategory, ResourceOrigin from invokeai.app.services.models.image_record import ( - ImageRecord, - ImageRecordChanges, - deserialize_image_record, -) + ImageRecord, ImageRecordChanges, deserialize_image_record) T = TypeVar("T", bound=BaseModel) @@ -55,6 +48,28 @@ class ImageRecordDeleteException(Exception): super().__init__(message) +IMAGE_DTO_COLS = ", ".join( + list( + map( + lambda c: "images." + c, + [ + "image_name", + "image_origin", + "image_category", + "width", + "height", + "session_id", + "node_id", + "is_intermediate", + "created_at", + "updated_at", + "deleted_at", + ], + ) + ) +) + + class ImageRecordStorageBase(ABC): """Low-level service responsible for interfacing with the image record store.""" @@ -65,6 +80,11 @@ class ImageRecordStorageBase(ABC): """Gets an image record.""" pass + @abstractmethod + def get_metadata(self, image_name: str) -> Optional[dict]: + """Gets an image's metadata'.""" + pass + @abstractmethod def update( self, @@ -94,6 +114,11 @@ class ImageRecordStorageBase(ABC): """Deletes an image record.""" pass + @abstractmethod + def delete_many(self, image_names: list[str]) -> None: + """Deletes many image records.""" + pass + @abstractmethod def save( self, @@ -104,14 +129,14 @@ class ImageRecordStorageBase(ABC): height: int, session_id: Optional[str], node_id: Optional[str], - metadata: Optional[ImageMetadata], + metadata: Optional[dict], is_intermediate: bool = False, ) -> datetime: """Saves an image record.""" pass @abstractmethod - def get_most_recent_image_for_board(self, board_id: str) -> ImageRecord | None: + def get_most_recent_image_for_board(self, board_id: str) -> Optional[ImageRecord]: """Gets the most recent image for a board.""" pass @@ -158,7 +183,6 @@ class SqliteImageRecordStorage(ImageRecordStorageBase): node_id TEXT, metadata TEXT, is_intermediate BOOLEAN DEFAULT FALSE, - board_id TEXT, created_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), -- Updated via trigger updated_at DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), @@ -203,19 +227,19 @@ class SqliteImageRecordStorage(ImageRecordStorageBase): """ ) - def get(self, image_name: str) -> Union[ImageRecord, None]: + def get(self, image_name: str) -> Optional[ImageRecord]: try: self._lock.acquire() self._cursor.execute( f"""--sql - SELECT * FROM images + SELECT {IMAGE_DTO_COLS} FROM images WHERE image_name = ?; """, (image_name,), ) - result = cast(Union[sqlite3.Row, None], self._cursor.fetchone()) + result = cast(Optional[sqlite3.Row], self._cursor.fetchone()) except sqlite3.Error as e: self._conn.rollback() raise ImageRecordNotFoundException from e @@ -227,6 +251,28 @@ class SqliteImageRecordStorage(ImageRecordStorageBase): return deserialize_image_record(dict(result)) + def get_metadata(self, image_name: str) -> Optional[dict]: + try: + self._lock.acquire() + + self._cursor.execute( + f"""--sql + SELECT images.metadata FROM images + WHERE image_name = ?; + """, + (image_name,), + ) + + result = cast(Optional[sqlite3.Row], self._cursor.fetchone()) + if not result or not result[0]: + return None + return json.loads(result[0]) + except sqlite3.Error as e: + self._conn.rollback() + raise ImageRecordNotFoundException from e + finally: + self._lock.release() + def update( self, image_name: str, @@ -294,8 +340,8 @@ class SqliteImageRecordStorage(ImageRecordStorageBase): WHERE 1=1 """ - images_query = """--sql - SELECT images.* + images_query = f"""--sql + SELECT {IMAGE_DTO_COLS} FROM images LEFT JOIN board_images ON board_images.image_name = images.image_name WHERE 1=1 @@ -385,6 +431,25 @@ class SqliteImageRecordStorage(ImageRecordStorageBase): finally: self._lock.release() + def delete_many(self, image_names: list[str]) -> None: + try: + placeholders = ",".join("?" for _ in image_names) + + self._lock.acquire() + + # Construct the SQLite query with the placeholders + query = f"DELETE FROM images WHERE image_name IN ({placeholders})" + + # Execute the query with the list of IDs as parameters + self._cursor.execute(query, image_names) + + self._conn.commit() + except sqlite3.Error as e: + self._conn.rollback() + raise ImageRecordDeleteException from e + finally: + self._lock.release() + def save( self, image_name: str, @@ -394,12 +459,12 @@ class SqliteImageRecordStorage(ImageRecordStorageBase): width: int, height: int, node_id: Optional[str], - metadata: Optional[ImageMetadata], + metadata: Optional[dict], is_intermediate: bool = False, ) -> datetime: try: metadata_json = ( - None if metadata is None else metadata.json(exclude_none=True) + None if metadata is None else json.dumps(metadata) ) self._lock.acquire() self._cursor.execute( @@ -449,9 +514,7 @@ class SqliteImageRecordStorage(ImageRecordStorageBase): finally: self._lock.release() - def get_most_recent_image_for_board( - self, board_id: str - ) -> Union[ImageRecord, None]: + def get_most_recent_image_for_board(self, board_id: str) -> Optional[ImageRecord]: try: self._lock.acquire() self._cursor.execute( @@ -466,7 +529,7 @@ class SqliteImageRecordStorage(ImageRecordStorageBase): (board_id,), ) - result = cast(Union[sqlite3.Row, None], self._cursor.fetchone()) + result = cast(Optional[sqlite3.Row], self._cursor.fetchone()) finally: self._lock.release() if result is None: diff --git a/invokeai/app/services/images.py b/invokeai/app/services/images.py index 542f874f1d..a7d0b6ddee 100644 --- a/invokeai/app/services/images.py +++ b/invokeai/app/services/images.py @@ -1,39 +1,30 @@ +import json from abc import ABC, abstractmethod from logging import Logger -from typing import Optional, TYPE_CHECKING, Union +from typing import TYPE_CHECKING, Optional + from PIL.Image import Image as PILImageType -from invokeai.app.models.image import ( - ImageCategory, - ResourceOrigin, - InvalidImageCategoryException, - InvalidOriginException, -) -from invokeai.app.models.metadata import ImageMetadata -from invokeai.app.services.board_image_record_storage import BoardImageRecordStorageBase -from invokeai.app.services.image_record_storage import ( - ImageRecordDeleteException, - ImageRecordNotFoundException, - ImageRecordSaveException, - ImageRecordStorageBase, - OffsetPaginatedResults, -) -from invokeai.app.services.models.image_record import ( - ImageRecord, - ImageDTO, - ImageRecordChanges, - image_record_to_dto, -) +from invokeai.app.invocations.metadata import ImageMetadata +from invokeai.app.models.image import (ImageCategory, + InvalidImageCategoryException, + InvalidOriginException, ResourceOrigin) +from invokeai.app.services.board_image_record_storage import \ + BoardImageRecordStorageBase +from invokeai.app.services.graph import Graph from invokeai.app.services.image_file_storage import ( - ImageFileDeleteException, - ImageFileNotFoundException, - ImageFileSaveException, - ImageFileStorageBase, -) -from invokeai.app.services.item_storage import ItemStorageABC, PaginatedResults -from invokeai.app.services.metadata import MetadataServiceBase + ImageFileDeleteException, ImageFileNotFoundException, + ImageFileSaveException, ImageFileStorageBase) +from invokeai.app.services.image_record_storage import ( + ImageRecordDeleteException, ImageRecordNotFoundException, + ImageRecordSaveException, ImageRecordStorageBase, OffsetPaginatedResults) +from invokeai.app.services.item_storage import ItemStorageABC +from invokeai.app.services.models.image_record import (ImageDTO, ImageRecord, + ImageRecordChanges, + image_record_to_dto) from invokeai.app.services.resource_name import NameServiceBase from invokeai.app.services.urls import UrlServiceBase +from invokeai.app.util.metadata import get_metadata_graph_from_raw_session if TYPE_CHECKING: from invokeai.app.services.graph import GraphExecutionState @@ -51,6 +42,7 @@ class ImageServiceABC(ABC): node_id: Optional[str] = None, session_id: Optional[str] = None, is_intermediate: bool = False, + metadata: Optional[dict] = None, ) -> ImageDTO: """Creates an image, storing the file and its metadata.""" pass @@ -79,6 +71,11 @@ class ImageServiceABC(ABC): """Gets an image DTO.""" pass + @abstractmethod + def get_metadata(self, image_name: str) -> ImageMetadata: + """Gets an image's metadata.""" + pass + @abstractmethod def get_path(self, image_name: str, thumbnail: bool = False) -> str: """Gets an image's path.""" @@ -112,6 +109,11 @@ class ImageServiceABC(ABC): """Deletes an image.""" pass + @abstractmethod + def delete_images_on_board(self, board_id: str): + """Deletes all images on a board.""" + pass + class ImageServiceDependencies: """Service dependencies for the ImageService.""" @@ -119,7 +121,6 @@ class ImageServiceDependencies: image_records: ImageRecordStorageBase image_files: ImageFileStorageBase board_image_records: BoardImageRecordStorageBase - metadata: MetadataServiceBase urls: UrlServiceBase logger: Logger names: NameServiceBase @@ -130,7 +131,6 @@ class ImageServiceDependencies: image_record_storage: ImageRecordStorageBase, image_file_storage: ImageFileStorageBase, board_image_record_storage: BoardImageRecordStorageBase, - metadata: MetadataServiceBase, url: UrlServiceBase, logger: Logger, names: NameServiceBase, @@ -139,7 +139,6 @@ class ImageServiceDependencies: self.image_records = image_record_storage self.image_files = image_file_storage self.board_image_records = board_image_record_storage - self.metadata = metadata self.urls = url self.logger = logger self.names = names @@ -160,6 +159,7 @@ class ImageService(ImageServiceABC): node_id: Optional[str] = None, session_id: Optional[str] = None, is_intermediate: bool = False, + metadata: Optional[dict] = None, ) -> ImageDTO: if image_origin not in ResourceOrigin: raise InvalidOriginException @@ -169,7 +169,16 @@ class ImageService(ImageServiceABC): image_name = self._services.names.create_image_name() - metadata = self._get_metadata(session_id, node_id) + graph = None + + if session_id is not None: + session_raw = self._services.graph_execution_manager.get_raw(session_id) + if session_raw is not None: + try: + graph = get_metadata_graph_from_raw_session(session_raw) + except Exception as e: + self._services.logger.warn(f"Failed to parse session graph: {e}") + graph = None (width, height) = image.size @@ -186,14 +195,12 @@ class ImageService(ImageServiceABC): is_intermediate=is_intermediate, # Nullable fields node_id=node_id, - session_id=session_id, metadata=metadata, + session_id=session_id, ) self._services.image_files.save( - image_name=image_name, - image=image, - metadata=metadata, + image_name=image_name, image=image, metadata=metadata, graph=graph ) image_dto = self.get_dto(image_name) @@ -263,6 +270,34 @@ class ImageService(ImageServiceABC): self._services.logger.error("Problem getting image DTO") raise e + def get_metadata(self, image_name: str) -> Optional[ImageMetadata]: + try: + image_record = self._services.image_records.get(image_name) + + if not image_record.session_id: + return ImageMetadata() + + session_raw = self._services.graph_execution_manager.get_raw( + image_record.session_id + ) + graph = None + + if session_raw: + try: + graph = get_metadata_graph_from_raw_session(session_raw) + except Exception as e: + self._services.logger.warn(f"Failed to parse session graph: {e}") + graph = None + + metadata = self._services.image_records.get_metadata(image_name) + return ImageMetadata(graph=graph, metadata=metadata) + except ImageRecordNotFoundException: + self._services.logger.error("Image record not found") + raise + except Exception as e: + self._services.logger.error("Problem getting image DTO") + raise e + def get_path(self, image_name: str, thumbnail: bool = False) -> str: try: return self._services.image_files.get_path(image_name, thumbnail) @@ -341,14 +376,24 @@ class ImageService(ImageServiceABC): self._services.logger.error("Problem deleting image record and file") raise e - def _get_metadata( - self, session_id: Optional[str] = None, node_id: Optional[str] = None - ) -> Union[ImageMetadata, None]: - """Get the metadata for a node.""" - metadata = None - - if node_id is not None and session_id is not None: - session = self._services.graph_execution_manager.get(session_id) - metadata = self._services.metadata.create_image_metadata(session, node_id) - - return metadata + def delete_images_on_board(self, board_id: str): + try: + images = self._services.board_image_records.get_images_for_board(board_id) + image_name_list = list( + map( + lambda r: r.image_name, + images.items, + ) + ) + for image_name in image_name_list: + self._services.image_files.delete(image_name) + self._services.image_records.delete_many(image_name_list) + except ImageRecordDeleteException: + self._services.logger.error(f"Failed to delete image records") + raise + except ImageFileDeleteException: + self._services.logger.error(f"Failed to delete image files") + raise + except Exception as e: + self._services.logger.error("Problem deleting image records and files") + raise e diff --git a/invokeai/app/services/invocation_queue.py b/invokeai/app/services/invocation_queue.py index acfda6b90b..eb78a542a6 100644 --- a/invokeai/app/services/invocation_queue.py +++ b/invokeai/app/services/invocation_queue.py @@ -5,7 +5,7 @@ from abc import ABC, abstractmethod from queue import Queue from pydantic import BaseModel, Field - +from typing import Optional class InvocationQueueItem(BaseModel): graph_execution_state_id: str = Field(description="The ID of the graph execution state") @@ -22,7 +22,7 @@ class InvocationQueueABC(ABC): pass @abstractmethod - def put(self, item: InvocationQueueItem | None) -> None: + def put(self, item: Optional[InvocationQueueItem]) -> None: pass @abstractmethod @@ -57,7 +57,7 @@ class MemoryInvocationQueue(InvocationQueueABC): return item - def put(self, item: InvocationQueueItem | None) -> None: + def put(self, item: Optional[InvocationQueueItem]) -> None: self.__queue.put(item) def cancel(self, graph_execution_state_id: str) -> None: diff --git a/invokeai/app/services/invocation_services.py b/invokeai/app/services/invocation_services.py index 10d1d91920..4e1da3b040 100644 --- a/invokeai/app/services/invocation_services.py +++ b/invokeai/app/services/invocation_services.py @@ -7,7 +7,7 @@ if TYPE_CHECKING: from invokeai.app.services.board_images import BoardImagesServiceABC from invokeai.app.services.boards import BoardServiceABC from invokeai.app.services.images import ImageServiceABC - from invokeai.backend import ModelManager + from invokeai.app.services.model_manager_service import ModelManagerServiceBase from invokeai.app.services.events import EventServiceBase from invokeai.app.services.latent_storage import LatentsStorageBase from invokeai.app.services.restoration_services import RestorationServices @@ -22,46 +22,47 @@ class InvocationServices: """Services that can be used by invocations""" # TODO: Just forward-declared everything due to circular dependencies. Fix structure. - events: "EventServiceBase" - latents: "LatentsStorageBase" - queue: "InvocationQueueABC" - model_manager: "ModelManager" - restoration: "RestorationServices" - configuration: "InvokeAISettings" - images: "ImageServiceABC" - boards: "BoardServiceABC" board_images: "BoardImagesServiceABC" - graph_library: "ItemStorageABC"["LibraryGraph"] + boards: "BoardServiceABC" + configuration: "InvokeAISettings" + events: "EventServiceBase" graph_execution_manager: "ItemStorageABC"["GraphExecutionState"] + graph_library: "ItemStorageABC"["LibraryGraph"] + images: "ImageServiceABC" + latents: "LatentsStorageBase" + logger: "Logger" + model_manager: "ModelManagerServiceBase" processor: "InvocationProcessorABC" + queue: "InvocationQueueABC" + restoration: "RestorationServices" def __init__( self, - model_manager: "ModelManager", - events: "EventServiceBase", - logger: "Logger", - latents: "LatentsStorageBase", - images: "ImageServiceABC", - boards: "BoardServiceABC", board_images: "BoardImagesServiceABC", - queue: "InvocationQueueABC", - graph_library: "ItemStorageABC"["LibraryGraph"], - graph_execution_manager: "ItemStorageABC"["GraphExecutionState"], - processor: "InvocationProcessorABC", - restoration: "RestorationServices", + boards: "BoardServiceABC", configuration: "InvokeAISettings", + events: "EventServiceBase", + graph_execution_manager: "ItemStorageABC"["GraphExecutionState"], + graph_library: "ItemStorageABC"["LibraryGraph"], + images: "ImageServiceABC", + latents: "LatentsStorageBase", + logger: "Logger", + model_manager: "ModelManagerServiceBase", + processor: "InvocationProcessorABC", + queue: "InvocationQueueABC", + restoration: "RestorationServices", ): - self.model_manager = model_manager - self.events = events - self.logger = logger - self.latents = latents - self.images = images - self.boards = boards self.board_images = board_images - self.queue = queue - self.graph_library = graph_library - self.graph_execution_manager = graph_execution_manager - self.processor = processor - self.restoration = restoration - self.configuration = configuration self.boards = boards + self.boards = boards + self.configuration = configuration + self.events = events + self.graph_execution_manager = graph_execution_manager + self.graph_library = graph_library + self.images = images + self.latents = latents + self.logger = logger + self.model_manager = model_manager + self.processor = processor + self.queue = queue + self.restoration = restoration diff --git a/invokeai/app/services/invoker.py b/invokeai/app/services/invoker.py index f12ba79c15..951d3b17c4 100644 --- a/invokeai/app/services/invoker.py +++ b/invokeai/app/services/invoker.py @@ -1,14 +1,11 @@ # Copyright (c) 2022 Kyle Schouviller (https://github.com/kyle0654) from abc import ABC -from threading import Event, Thread +from typing import Optional -from ..invocations.baseinvocation import InvocationContext from .graph import Graph, GraphExecutionState -from .invocation_queue import InvocationQueueABC, InvocationQueueItem +from .invocation_queue import InvocationQueueItem from .invocation_services import InvocationServices -from .item_storage import ItemStorageABC - class Invoker: """The invoker, used to execute invocations""" @@ -21,7 +18,7 @@ class Invoker: def invoke( self, graph_execution_state: GraphExecutionState, invoke_all: bool = False - ) -> str | None: + ) -> Optional[str]: """Determines the next node to invoke and enqueues it, preparing if needed. Returns the id of the queued node, or `None` if there are no nodes left to enqueue.""" @@ -45,7 +42,7 @@ class Invoker: return invocation.id - def create_execution_state(self, graph: Graph | None = None) -> GraphExecutionState: + def create_execution_state(self, graph: Optional[Graph] = None) -> GraphExecutionState: """Creates a new execution state for the given graph""" new_state = GraphExecutionState(graph=Graph() if graph is None else graph) self.services.graph_execution_manager.set(new_state) diff --git a/invokeai/app/services/item_storage.py b/invokeai/app/services/item_storage.py index 394f67797d..709d88bf97 100644 --- a/invokeai/app/services/item_storage.py +++ b/invokeai/app/services/item_storage.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -from typing import Callable, Generic, TypeVar +from typing import Callable, Generic, Optional, TypeVar from pydantic import BaseModel, Field from pydantic.generics import GenericModel @@ -29,14 +29,22 @@ class ItemStorageABC(ABC, Generic[T]): @abstractmethod def get(self, item_id: str) -> T: + """Gets the item, parsing it into a Pydantic model""" + pass + + @abstractmethod + def get_raw(self, item_id: str) -> Optional[str]: + """Gets the raw item as a string, skipping Pydantic parsing""" pass @abstractmethod def set(self, item: T) -> None: + """Sets the item""" pass @abstractmethod def list(self, page: int = 0, per_page: int = 10) -> PaginatedResults[T]: + """Gets a paginated list of items""" pass @abstractmethod diff --git a/invokeai/app/services/latent_storage.py b/invokeai/app/services/latent_storage.py index 17d35d7c33..0e23d6d018 100644 --- a/invokeai/app/services/latent_storage.py +++ b/invokeai/app/services/latent_storage.py @@ -3,7 +3,7 @@ from abc import ABC, abstractmethod from pathlib import Path from queue import Queue -from typing import Dict +from typing import Dict, Union, Optional import torch @@ -55,7 +55,7 @@ class ForwardCacheLatentsStorage(LatentsStorageBase): if name in self.__cache: del self.__cache[name] - def __get_cache(self, name: str) -> torch.Tensor|None: + def __get_cache(self, name: str) -> Optional[torch.Tensor]: return None if name not in self.__cache else self.__cache[name] def __set_cache(self, name: str, data: torch.Tensor): @@ -69,9 +69,9 @@ class ForwardCacheLatentsStorage(LatentsStorageBase): class DiskLatentsStorage(LatentsStorageBase): """Stores latents in a folder on disk without caching""" - __output_folder: str | Path + __output_folder: Union[str, Path] - def __init__(self, output_folder: str | Path): + def __init__(self, output_folder: Union[str, Path]): self.__output_folder = output_folder if isinstance(output_folder, Path) else Path(output_folder) self.__output_folder.mkdir(parents=True, exist_ok=True) @@ -91,4 +91,4 @@ class DiskLatentsStorage(LatentsStorageBase): def get_path(self, name: str) -> Path: return self.__output_folder / name - \ No newline at end of file + diff --git a/invokeai/app/services/metadata.py b/invokeai/app/services/metadata.py deleted file mode 100644 index aa7bc2291a..0000000000 --- a/invokeai/app/services/metadata.py +++ /dev/null @@ -1,142 +0,0 @@ -from abc import ABC, abstractmethod -from typing import Any, Union -import networkx as nx - -from invokeai.app.models.metadata import ImageMetadata -from invokeai.app.services.graph import Graph, GraphExecutionState - - -class MetadataServiceBase(ABC): - """Handles building metadata for nodes, images, and outputs.""" - - @abstractmethod - def create_image_metadata( - self, session: GraphExecutionState, node_id: str - ) -> ImageMetadata: - """Builds an ImageMetadata object for a node.""" - pass - - -class CoreMetadataService(MetadataServiceBase): - _ANCESTOR_TYPES = ["t2l", "l2l"] - """The ancestor types that contain the core metadata""" - - _ANCESTOR_PARAMS = ["type", "steps", "model", "cfg_scale", "scheduler", "strength"] - """The core metadata parameters in the ancestor types""" - - _NOISE_FIELDS = ["seed", "width", "height"] - """The core metadata parameters in the noise node""" - - def create_image_metadata( - self, session: GraphExecutionState, node_id: str - ) -> ImageMetadata: - metadata = self._build_metadata_from_graph(session, node_id) - - return metadata - - def _find_nearest_ancestor(self, G: nx.DiGraph, node_id: str) -> Union[str, None]: - """ - Finds the id of the nearest ancestor (of a valid type) of a given node. - - Parameters: - G (nx.DiGraph): The execution graph, converted in to a networkx DiGraph. Its nodes must - have the same data as the execution graph. - node_id (str): The ID of the node. - - Returns: - str | None: The ID of the nearest ancestor, or None if there are no valid ancestors. - """ - - # Retrieve the node from the graph - node = G.nodes[node_id] - - # If the node type is one of the core metadata node types, return its id - if node.get("type") in self._ANCESTOR_TYPES: - return node.get("id") - - # Else, look for the ancestor in the predecessor nodes - for predecessor in G.predecessors(node_id): - result = self._find_nearest_ancestor(G, predecessor) - if result: - return result - - # If there are no valid ancestors, return None - return None - - def _get_additional_metadata( - self, graph: Graph, node_id: str - ) -> Union[dict[str, Any], None]: - """ - Returns additional metadata for a given node. - - Parameters: - graph (Graph): The execution graph. - node_id (str): The ID of the node. - - Returns: - dict[str, Any] | None: A dictionary of additional metadata. - """ - - metadata = {} - - # Iterate over all edges in the graph - for edge in graph.edges: - dest_node_id = edge.destination.node_id - dest_field = edge.destination.field - source_node_dict = graph.nodes[edge.source.node_id].dict() - - # If the destination node ID matches the given node ID, gather necessary metadata - if dest_node_id == node_id: - # Prompt - if dest_field == "positive_conditioning": - metadata["positive_conditioning"] = source_node_dict.get("prompt") - # Negative prompt - if dest_field == "negative_conditioning": - metadata["negative_conditioning"] = source_node_dict.get("prompt") - # Seed, width and height - if dest_field == "noise": - for field in self._NOISE_FIELDS: - metadata[field] = source_node_dict.get(field) - return metadata - - def _build_metadata_from_graph( - self, session: GraphExecutionState, node_id: str - ) -> ImageMetadata: - """ - Builds an ImageMetadata object for a node. - - Parameters: - session (GraphExecutionState): The session. - node_id (str): The ID of the node. - - Returns: - ImageMetadata: The metadata for the node. - """ - - # We need to do all the traversal on the execution graph - graph = session.execution_graph - - # Find the nearest `t2l`/`l2l` ancestor of the given node - ancestor_id = self._find_nearest_ancestor(graph.nx_graph_with_data(), node_id) - - # If no ancestor was found, return an empty ImageMetadata object - if ancestor_id is None: - return ImageMetadata() - - ancestor_node = graph.get_node(ancestor_id) - - # Grab all the core metadata from the ancestor node - ancestor_metadata = { - param: val - for param, val in ancestor_node.dict().items() - if param in self._ANCESTOR_PARAMS - } - - # Get this image's prompts and noise parameters - addl_metadata = self._get_additional_metadata(graph, ancestor_id) - - # If additional metadata was found, add it to the main metadata - if addl_metadata is not None: - ancestor_metadata.update(addl_metadata) - - return ImageMetadata(**ancestor_metadata) diff --git a/invokeai/app/services/model_manager_service.py b/invokeai/app/services/model_manager_service.py index 8b46b17ad0..1b1c43dc11 100644 --- a/invokeai/app/services/model_manager_service.py +++ b/invokeai/app/services/model_manager_service.py @@ -2,22 +2,29 @@ from __future__ import annotations -import torch from abc import ABC, abstractmethod from pathlib import Path -from typing import Optional, Union, Callable, List, Tuple, types, TYPE_CHECKING -from dataclasses import dataclass +from pydantic import Field +from typing import Optional, Union, Callable, List, Tuple, TYPE_CHECKING +from types import ModuleType -from invokeai.backend.model_management.model_manager import ( +from invokeai.backend.model_management import ( ModelManager, BaseModelType, ModelType, SubModelType, ModelInfo, + AddModelResult, + SchedulerPredictionType, + ModelMerger, + MergeInterpolationMethod, ) + + +import torch from invokeai.app.models.exceptions import CanceledException -from .config import InvokeAIAppConfig from ...backend.util import choose_precision, choose_torch_device +from .config import InvokeAIAppConfig if TYPE_CHECKING: from ..invocations.baseinvocation import BaseInvocation, InvocationContext @@ -30,16 +37,16 @@ class ModelManagerServiceBase(ABC): def __init__( self, config: InvokeAIAppConfig, - logger: types.ModuleType, + logger: ModuleType, ): """ - Initialize with the path to the models.yaml config file. + Initialize with the path to the models.yaml config file. Optional parameters are the torch device type, precision, max_models, and sequential_offload boolean. Note that the default device type and precision are set up for a CUDA system running at half precision. """ pass - + @abstractmethod def get_model( self, @@ -50,8 +57,8 @@ class ModelManagerServiceBase(ABC): node: Optional[BaseInvocation] = None, context: Optional[InvocationContext] = None, ) -> ModelInfo: - """Retrieve the indicated model with name and type. - submodel can be used to get a part (such as the vae) + """Retrieve the indicated model with name and type. + submodel can be used to get a part (such as the vae) of a diffusers pipeline.""" pass @@ -73,13 +80,7 @@ class ModelManagerServiceBase(ABC): def model_info(self, model_name: str, base_model: BaseModelType, model_type: ModelType) -> dict: """ Given a model name returns a dict-like (OmegaConf) object describing it. - """ - pass - - @abstractmethod - def model_names(self) -> List[Tuple[str, BaseModelType, ModelType]]: - """ - Returns a list of all the model names known. + Uses the exact format as the omegaconf stanza. """ pass @@ -101,7 +102,20 @@ class ModelManagerServiceBase(ABC): } """ pass + + @abstractmethod + def list_model(self, model_name: str, base_model: BaseModelType, model_type: ModelType) -> dict: + """ + Return information about the model using the same format as list_models() + """ + pass + @abstractmethod + def model_names(self) -> List[Tuple[str, BaseModelType, ModelType]]: + """ + Returns a list of all the model names known. + """ + pass @abstractmethod def add_model( @@ -111,16 +125,34 @@ class ModelManagerServiceBase(ABC): model_type: ModelType, model_attributes: dict, clobber: bool = False - ) -> None: + ) -> AddModelResult: """ Update the named model with a dictionary of attributes. Will fail with an assertion error if the name already exists. Pass clobber=True to overwrite. + On a successful update, the config will be changed in memory. Will fail + with an assertion error if provided attributes are incorrect or + the model name is missing. Call commit() to write changes to disk. + """ + pass + + @abstractmethod + def update_model( + self, + model_name: str, + base_model: BaseModelType, + model_type: ModelType, + model_attributes: dict, + ) -> AddModelResult: + """ + Update the named model with a dictionary of attributes. Will fail with a + KeyErrorException if the name does not already exist. + On a successful update, the config will be changed in memory. Will fail with an assertion error if provided attributes are incorrect or the model name is missing. Call commit() to write changes to disk. """ pass - + @abstractmethod def del_model( self, @@ -129,14 +161,78 @@ class ModelManagerServiceBase(ABC): model_type: ModelType, ): """ - Delete the named model from configuration. If delete_files is true, - then the underlying weight file or diffusers directory will be deleted + Delete the named model from configuration. If delete_files is true, + then the underlying weight file or diffusers directory will be deleted as well. Call commit() to write to disk. """ pass @abstractmethod - def commit(self, conf_file: Path = None) -> None: + def convert_model( + self, + model_name: str, + base_model: BaseModelType, + model_type: Union[ModelType.Main,ModelType.Vae], + ) -> AddModelResult: + """ + Convert a checkpoint file into a diffusers folder, deleting the cached + version and deleting the original checkpoint file if it is in the models + directory. + :param model_name: Name of the model to convert + :param base_model: Base model type + :param model_type: Type of model ['vae' or 'main'] + + This will raise a ValueError unless the model is not a checkpoint. It will + also raise a ValueError in the event that there is a similarly-named diffusers + directory already in place. + """ + pass + + @abstractmethod + def heuristic_import(self, + items_to_import: set[str], + prediction_type_helper: Optional[Callable[[Path],SchedulerPredictionType]]=None, + )->dict[str, AddModelResult]: + '''Import a list of paths, repo_ids or URLs. Returns the set of + successfully imported items. + :param items_to_import: Set of strings corresponding to models to be imported. + :param prediction_type_helper: A callback that receives the Path of a Stable Diffusion 2 checkpoint model and returns a SchedulerPredictionType. + + The prediction type helper is necessary to distinguish between + models based on Stable Diffusion 2 Base (requiring + SchedulerPredictionType.Epsilson) and Stable Diffusion 768 + (requiring SchedulerPredictionType.VPrediction). It is + generally impossible to do this programmatically, so the + prediction_type_helper usually asks the user to choose. + + The result is a set of successfully installed models. Each element + of the set is a dict corresponding to the newly-created OmegaConf stanza for + that model. + ''' + pass + + @abstractmethod + def merge_models( + self, + model_names: List[str] = Field(default=None, min_items=2, max_items=3, description="List of model names to merge"), + base_model: Union[BaseModelType,str] = Field(default=None, description="Base model shared by all models to be merged"), + merged_model_name: str = Field(default=None, description="Name of destination model after merging"), + alpha: Optional[float] = 0.5, + interp: Optional[MergeInterpolationMethod] = None, + force: Optional[bool] = False, + ) -> AddModelResult: + """ + Merge two to three diffusrs pipeline models and save as a new model. + :param model_names: List of 2-3 models to merge + :param base_model: Base model to use for all models + :param merged_model_name: Name of destination merged model + :param alpha: Alpha strength to apply to 2d and 3d model + :param interp: Interpolation method. None (default) + """ + pass + + @abstractmethod + def commit(self, conf_file: Optional[Path] = None) -> None: """ Write current configuration out to the indicated file. If no conf_file is provided, then replaces the @@ -150,10 +246,10 @@ class ModelManagerService(ModelManagerServiceBase): def __init__( self, config: InvokeAIAppConfig, - logger: types.ModuleType, + logger: ModuleType, ): """ - Initialize with the path to the models.yaml config file. + Initialize with the path to the models.yaml config file. Optional parameters are the torch device type, precision, max_models, and sequential_offload boolean. Note that the default device type and precision are set up for a CUDA system running at half precision. @@ -162,12 +258,12 @@ class ModelManagerService(ModelManagerServiceBase): config_file = config.model_conf_path else: config_file = config.root_dir / "configs/models.yaml" - if not config_file.exists(): - raise IOError(f"The file {config_file} could not be found.") - + logger.debug(f'config file={config_file}') device = torch.device(choose_torch_device()) + logger.debug(f'GPU device = {device}') + precision = config.precision if precision == "auto": precision = choose_precision(device) @@ -183,6 +279,8 @@ class ModelManagerService(ModelManagerServiceBase): if hasattr(config,'max_cache_size') \ else config.max_loaded_models * 2.5 + logger.debug(f"Maximum RAM cache size: {max_cache_size} GiB") + sequential_offload = config.sequential_guidance self.mgr = ModelManager( @@ -238,7 +336,7 @@ class ModelManagerService(ModelManagerServiceBase): submodel=submodel, model_info=model_info ) - + return model_info def model_exists( @@ -274,12 +372,19 @@ class ModelManagerService(ModelManagerServiceBase): base_model: Optional[BaseModelType] = None, model_type: Optional[ModelType] = None ) -> list[dict]: - # ) -> dict: """ Return a list of models. """ return self.mgr.list_models(base_model, model_type) + def list_model(self, model_name: str, base_model: BaseModelType, model_type: ModelType) -> dict: + """ + Return information about the model using the same format as list_models() + """ + return self.mgr.list_model(model_name=model_name, + base_model=base_model, + model_type=model_type) + def add_model( self, model_name: str, @@ -291,13 +396,32 @@ class ModelManagerService(ModelManagerServiceBase): """ Update the named model with a dictionary of attributes. Will fail with an assertion error if the name already exists. Pass clobber=True to overwrite. + On a successful update, the config will be changed in memory. Will fail + with an assertion error if provided attributes are incorrect or + the model name is missing. Call commit() to write changes to disk. + """ + self.logger.debug(f'add/update model {model_name}') + return self.mgr.add_model(model_name, base_model, model_type, model_attributes, clobber) + + def update_model( + self, + model_name: str, + base_model: BaseModelType, + model_type: ModelType, + model_attributes: dict, + ) -> AddModelResult: + """ + Update the named model with a dictionary of attributes. Will fail with a + KeyError exception if the name does not already exist. On a successful update, the config will be changed in memory. Will fail with an assertion error if provided attributes are incorrect or the model name is missing. Call commit() to write changes to disk. """ - return self.mgr.add_model(model_name, base_model, model_type, model_attributes, clobber) - - + self.logger.debug(f'update model {model_name}') + if not self.model_exists(model_name, base_model, model_type): + raise KeyError(f"Unknown model {model_name}") + return self.add_model(model_name, base_model, model_type, model_attributes, clobber=True) + def del_model( self, model_name: str, @@ -305,12 +429,33 @@ class ModelManagerService(ModelManagerServiceBase): model_type: ModelType, ): """ - Delete the named model from configuration. If delete_files is true, - then the underlying weight file or diffusers directory will be deleted + Delete the named model from configuration. If delete_files is true, + then the underlying weight file or diffusers directory will be deleted as well. Call commit() to write to disk. """ + self.logger.debug(f'delete model {model_name}') self.mgr.del_model(model_name, base_model, model_type) + def convert_model( + self, + model_name: str, + base_model: BaseModelType, + model_type: Union[ModelType.Main,ModelType.Vae], + ) -> AddModelResult: + """ + Convert a checkpoint file into a diffusers folder, deleting the cached + version and deleting the original checkpoint file if it is in the models + directory. + :param model_name: Name of the model to convert + :param base_model: Base model type + :param model_type: Type of model ['vae' or 'main'] + + This will raise a ValueError unless the model is not a checkpoint. It will + also raise a ValueError in the event that there is a similarly-named diffusers + directory already in place. + """ + self.logger.debug(f'convert model {model_name}') + return self.mgr.convert_model(model_name, base_model, model_type) def commit(self, conf_file: Optional[Path]=None): """ @@ -360,4 +505,56 @@ class ModelManagerService(ModelManagerServiceBase): @property def logger(self): return self.mgr.logger - + + def heuristic_import(self, + items_to_import: set[str], + prediction_type_helper: Optional[Callable[[Path],SchedulerPredictionType]]=None, + )->dict[str, AddModelResult]: + '''Import a list of paths, repo_ids or URLs. Returns the set of + successfully imported items. + :param items_to_import: Set of strings corresponding to models to be imported. + :param prediction_type_helper: A callback that receives the Path of a Stable Diffusion 2 checkpoint model and returns a SchedulerPredictionType. + + The prediction type helper is necessary to distinguish between + models based on Stable Diffusion 2 Base (requiring + SchedulerPredictionType.Epsilson) and Stable Diffusion 768 + (requiring SchedulerPredictionType.VPrediction). It is + generally impossible to do this programmatically, so the + prediction_type_helper usually asks the user to choose. + + The result is a set of successfully installed models. Each element + of the set is a dict corresponding to the newly-created OmegaConf stanza for + that model. + ''' + return self.mgr.heuristic_import(items_to_import, prediction_type_helper) + + def merge_models( + self, + model_names: List[str] = Field(default=None, min_items=2, max_items=3, description="List of model names to merge"), + base_model: Union[BaseModelType,str] = Field(default=None, description="Base model shared by all models to be merged"), + merged_model_name: str = Field(default=None, description="Name of destination model after merging"), + alpha: Optional[float] = 0.5, + interp: Optional[MergeInterpolationMethod] = None, + force: Optional[bool] = False, + ) -> AddModelResult: + """ + Merge two to three diffusrs pipeline models and save as a new model. + :param model_names: List of 2-3 models to merge + :param base_model: Base model to use for all models + :param merged_model_name: Name of destination merged model + :param alpha: Alpha strength to apply to 2d and 3d model + :param interp: Interpolation method. None (default) + """ + merger = ModelMerger(self.mgr) + try: + result = merger.merge_diffusion_models_and_save( + model_names = model_names, + base_model = base_model, + merged_model_name = merged_model_name, + alpha = alpha, + interp = interp, + force = force, + ) + except AssertionError as e: + raise ValueError(e) + return result diff --git a/invokeai/app/services/models/image_record.py b/invokeai/app/services/models/image_record.py index cc02016cf9..cf10f6e8b2 100644 --- a/invokeai/app/services/models/image_record.py +++ b/invokeai/app/services/models/image_record.py @@ -1,13 +1,14 @@ import datetime from typing import Optional, Union + from pydantic import BaseModel, Extra, Field, StrictBool, StrictStr + from invokeai.app.models.image import ImageCategory, ResourceOrigin -from invokeai.app.models.metadata import ImageMetadata from invokeai.app.util.misc import get_iso_timestamp class ImageRecord(BaseModel): - """Deserialized image record.""" + """Deserialized image record without metadata.""" image_name: str = Field(description="The unique name of the image.") """The unique name of the image.""" @@ -43,11 +44,6 @@ class ImageRecord(BaseModel): description="The node ID that generated this image, if it is a generated image.", ) """The node ID that generated this image, if it is a generated image.""" - metadata: Optional[ImageMetadata] = Field( - default=None, - description="A limited subset of the image's generation metadata. Retrieve the image's session for full metadata.", - ) - """A limited subset of the image's generation metadata. Retrieve the image's session for full metadata.""" class ImageRecordChanges(BaseModel, extra=Extra.forbid): @@ -88,7 +84,7 @@ class ImageUrlsDTO(BaseModel): class ImageDTO(ImageRecord, ImageUrlsDTO): """Deserialized image record, enriched for the frontend.""" - board_id: Union[str, None] = Field( + board_id: Optional[str] = Field( description="The id of the board the image belongs to, if one exists." ) """The id of the board the image belongs to, if one exists.""" @@ -96,7 +92,7 @@ class ImageDTO(ImageRecord, ImageUrlsDTO): def image_record_to_dto( - image_record: ImageRecord, image_url: str, thumbnail_url: str, board_id: Union[str, None] + image_record: ImageRecord, image_url: str, thumbnail_url: str, board_id: Optional[str] ) -> ImageDTO: """Converts an image record to an image DTO.""" return ImageDTO( @@ -112,6 +108,7 @@ def deserialize_image_record(image_dict: dict) -> ImageRecord: # Retrieve all the values, setting "reasonable" defaults if they are not present. + # TODO: do we really need to handle default values here? ideally the data is the correct shape... image_name = image_dict.get("image_name", "unknown") image_origin = ResourceOrigin( image_dict.get("image_origin", ResourceOrigin.INTERNAL.value) @@ -128,13 +125,6 @@ def deserialize_image_record(image_dict: dict) -> ImageRecord: deleted_at = image_dict.get("deleted_at", get_iso_timestamp()) is_intermediate = image_dict.get("is_intermediate", False) - raw_metadata = image_dict.get("metadata") - - if raw_metadata is not None: - metadata = ImageMetadata.parse_raw(raw_metadata) - else: - metadata = None - return ImageRecord( image_name=image_name, image_origin=image_origin, @@ -143,7 +133,6 @@ def deserialize_image_record(image_dict: dict) -> ImageRecord: height=height, session_id=session_id, node_id=node_id, - metadata=metadata, created_at=created_at, updated_at=updated_at, deleted_at=deleted_at, diff --git a/invokeai/app/services/processor.py b/invokeai/app/services/processor.py index 9e3b5a0a30..e11eb84b3d 100644 --- a/invokeai/app/services/processor.py +++ b/invokeai/app/services/processor.py @@ -104,6 +104,7 @@ class DefaultInvocationProcessor(InvocationProcessorABC): except Exception as e: error = traceback.format_exc() + logger.error(error) # Save error graph_execution_state.set_node_error(invocation.id, error) diff --git a/invokeai/app/services/sqlite.py b/invokeai/app/services/sqlite.py index a62fff88a1..8902415096 100644 --- a/invokeai/app/services/sqlite.py +++ b/invokeai/app/services/sqlite.py @@ -1,6 +1,6 @@ import sqlite3 from threading import Lock -from typing import Generic, TypeVar, Union, get_args +from typing import Generic, Optional, TypeVar, get_args from pydantic import BaseModel, parse_raw_as @@ -63,7 +63,7 @@ class SqliteItemStorage(ItemStorageABC, Generic[T]): self._lock.release() self._on_changed(item) - def get(self, id: str) -> Union[T, None]: + def get(self, id: str) -> Optional[T]: try: self._lock.acquire() self._cursor.execute( @@ -78,6 +78,21 @@ class SqliteItemStorage(ItemStorageABC, Generic[T]): return self._parse_item(result[0]) + def get_raw(self, id: str) -> Optional[str]: + try: + self._lock.acquire() + self._cursor.execute( + f"""SELECT item FROM {self._table_name} WHERE id = ?;""", (str(id),) + ) + result = self._cursor.fetchone() + finally: + self._lock.release() + + if not result: + return None + + return result[0] + def delete(self, id: str): try: self._lock.acquire() diff --git a/invokeai/app/services/urls.py b/invokeai/app/services/urls.py index 5920e9e6c1..73d8ddadf4 100644 --- a/invokeai/app/services/urls.py +++ b/invokeai/app/services/urls.py @@ -22,4 +22,4 @@ class LocalUrlService(UrlServiceBase): if thumbnail: return f"{self._base_url}/images/{image_basename}/thumbnail" - return f"{self._base_url}/images/{image_basename}" + return f"{self._base_url}/images/{image_basename}/full" diff --git a/invokeai/app/util/metadata.py b/invokeai/app/util/metadata.py new file mode 100644 index 0000000000..5ca5f14e12 --- /dev/null +++ b/invokeai/app/util/metadata.py @@ -0,0 +1,55 @@ +import json +from typing import Optional + +from pydantic import ValidationError + +from invokeai.app.services.graph import Edge + + +def get_metadata_graph_from_raw_session(session_raw: str) -> Optional[dict]: + """ + Parses raw session string, returning a dict of the graph. + + Only the general graph shape is validated; none of the fields are validated. + + Any `metadata_accumulator` nodes and edges are removed. + + Any validation failure will return None. + """ + + graph = json.loads(session_raw).get("graph", None) + + # sanity check make sure the graph is at least reasonably shaped + if ( + type(graph) is not dict + or "nodes" not in graph + or type(graph["nodes"]) is not dict + or "edges" not in graph + or type(graph["edges"]) is not list + ): + # something has gone terribly awry, return an empty dict + return None + + try: + # delete the `metadata_accumulator` node + del graph["nodes"]["metadata_accumulator"] + except KeyError: + # no accumulator node, all good + pass + + # delete any edges to or from it + for i, edge in enumerate(graph["edges"]): + try: + # try to parse the edge + Edge(**edge) + except ValidationError: + # something has gone terribly awry, return an empty dict + return None + + if ( + edge["source"]["node_id"] == "metadata_accumulator" + or edge["destination"]["node_id"] == "metadata_accumulator" + ): + del graph["edges"][i] + + return graph diff --git a/invokeai/backend/generator/base.py b/invokeai/backend/generator/base.py index 462b1a4f4b..99a63d56a3 100644 --- a/invokeai/backend/generator/base.py +++ b/invokeai/backend/generator/base.py @@ -21,7 +21,7 @@ from PIL import Image, ImageChops, ImageFilter from accelerate.utils import set_seed from diffusers import DiffusionPipeline from tqdm import trange -from typing import Callable, List, Iterator, Optional, Type +from typing import Callable, List, Iterator, Optional, Type, Union from dataclasses import dataclass, field from diffusers.schedulers import SchedulerMixin as Scheduler @@ -178,7 +178,7 @@ class InvokeAIGenerator(metaclass=ABCMeta): # ------------------------------------ class Img2Img(InvokeAIGenerator): def generate(self, - init_image: Image.Image | torch.FloatTensor, + init_image: Union[Image.Image, torch.FloatTensor], strength: float=0.75, **keyword_args )->Iterator[InvokeAIGeneratorOutput]: @@ -195,7 +195,7 @@ class Img2Img(InvokeAIGenerator): # Takes all the arguments of Img2Img and adds the mask image and the seam/infill stuff class Inpaint(Img2Img): def generate(self, - mask_image: Image.Image | torch.FloatTensor, + mask_image: Union[Image.Image, torch.FloatTensor], # Seam settings - when 0, doesn't fill seam seam_size: int = 96, seam_blur: int = 16, @@ -570,28 +570,16 @@ class Generator: device = self.model.device # limit noise to only the diffusion image channels, not the mask channels input_channels = min(self.latent_channels, 4) - if self.use_mps_noise or device.type == "mps": - x = torch.randn( - [ - 1, - input_channels, - height // self.downsampling_factor, - width // self.downsampling_factor, - ], - dtype=self.torch_dtype(), - device="cpu", - ).to(device) - else: - x = torch.randn( - [ - 1, - input_channels, - height // self.downsampling_factor, - width // self.downsampling_factor, - ], - dtype=self.torch_dtype(), - device=device, - ) + x = torch.randn( + [ + 1, + input_channels, + height // self.downsampling_factor, + width // self.downsampling_factor, + ], + dtype=self.torch_dtype(), + device=device, + ) if self.perlin > 0.0: perlin_noise = self.get_perlin_noise( width // self.downsampling_factor, height // self.downsampling_factor diff --git a/invokeai/backend/generator/img2img.py b/invokeai/backend/generator/img2img.py index 1cfbeb66c0..b3b0e8f510 100644 --- a/invokeai/backend/generator/img2img.py +++ b/invokeai/backend/generator/img2img.py @@ -88,10 +88,7 @@ class Img2Img(Generator): def get_noise_like(self, like: torch.Tensor): device = like.device - if device.type == "mps": - x = torch.randn_like(like, device="cpu").to(device) - else: - x = torch.randn_like(like, device=device) + x = torch.randn_like(like, device=device) if self.perlin > 0.0: shape = like.shape x = (1 - self.perlin) * x + self.perlin * self.get_perlin_noise( diff --git a/invokeai/backend/generator/inpaint.py b/invokeai/backend/generator/inpaint.py index eaf4047109..c91fe0c6a7 100644 --- a/invokeai/backend/generator/inpaint.py +++ b/invokeai/backend/generator/inpaint.py @@ -4,11 +4,10 @@ invokeai.backend.generator.inpaint descends from .generator from __future__ import annotations import math -from typing import Tuple, Union +from typing import Tuple, Union, Optional import cv2 import numpy as np -import PIL import torch from PIL import Image, ImageChops, ImageFilter, ImageOps @@ -76,7 +75,7 @@ class Inpaint(Img2Img): return im_patched def tile_fill_missing( - self, im: Image.Image, tile_size: int = 16, seed: Union[int, None] = None + self, im: Image.Image, tile_size: int = 16, seed: Optional[int] = None ) -> Image.Image: # Only fill if there's an alpha layer if im.mode != "RGBA": @@ -203,8 +202,8 @@ class Inpaint(Img2Img): cfg_scale, ddim_eta, conditioning, - init_image: Image.Image | torch.FloatTensor, - mask_image: Image.Image | torch.FloatTensor, + init_image: Union[Image.Image, torch.FloatTensor], + mask_image: Union[Image.Image, torch.FloatTensor], strength: float, mask_blur_radius: int = 8, # Seam settings - when 0, doesn't fill seam diff --git a/invokeai/backend/install/invokeai_configure.py b/invokeai/backend/install/invokeai_configure.py index 603760c0c1..adc985c655 100755 --- a/invokeai/backend/install/invokeai_configure.py +++ b/invokeai/backend/install/invokeai_configure.py @@ -7,8 +7,6 @@ # Coauthor: Kevin Turner http://github.com/keturn # import sys -print("Loading Python libraries...\n",file=sys.stderr) - import argparse import io import os @@ -16,6 +14,7 @@ import shutil import textwrap import traceback import warnings +import yaml from argparse import Namespace from pathlib import Path from shutil import get_terminal_size @@ -25,6 +24,7 @@ from urllib import request import npyscreen import transformers from diffusers import AutoencoderKL +from diffusers.pipelines.stable_diffusion.safety_checker import StableDiffusionSafetyChecker from huggingface_hub import HfFolder from huggingface_hub import login as hf_hub_login from omegaconf import OmegaConf @@ -34,6 +34,8 @@ from transformers import ( CLIPSegForImageSegmentation, CLIPTextModel, CLIPTokenizer, + AutoFeatureExtractor, + BertTokenizerFast, ) import invokeai.configs as configs @@ -43,6 +45,7 @@ from invokeai.app.services.config import ( from invokeai.backend.util.logging import InvokeAILogger from invokeai.frontend.install.model_install import addModelsForm, process_and_execute from invokeai.frontend.install.widgets import ( + SingleSelectColumns, CenteredButtonPress, IntTitleSlider, set_min_terminal_size, @@ -52,12 +55,13 @@ from invokeai.frontend.install.widgets import ( ) from invokeai.backend.install.legacy_arg_parsing import legacy_parser from invokeai.backend.install.model_install_backend import ( - default_dataset, - download_from_hf, - hf_download_with_resume, - recommended_datasets, - UserSelections, + hf_download_from_pretrained, + InstallSelections, + ModelInstall, ) +from invokeai.backend.model_management.model_probe import ( + ModelType, BaseModelType + ) warnings.filterwarnings("ignore") transformers.logging.set_verbosity_error() @@ -73,7 +77,7 @@ Weights_dir = "ldm/stable-diffusion-v1/" Default_config_file = config.model_conf_path SD_Configs = config.legacy_conf_path -PRECISION_CHOICES = ['auto','float16','float32','autocast'] +PRECISION_CHOICES = ['auto','float16','float32'] INIT_FILE_PREAMBLE = """# InvokeAI initialization file # This is the InvokeAI initialization file, which contains command-line default values. @@ -81,7 +85,7 @@ INIT_FILE_PREAMBLE = """# InvokeAI initialization file # or renaming it and then running invokeai-configure again. """ -logger=None +logger=InvokeAILogger.getLogger() # -------------------------------------------- def postscript(errors: None): @@ -162,75 +166,91 @@ class ProgressBar: # --------------------------------------------- def download_with_progress_bar(model_url: str, model_dest: str, label: str = "the"): try: - print(f"Installing {label} model file {model_url}...", end="", file=sys.stderr) + logger.info(f"Installing {label} model file {model_url}...") if not os.path.exists(model_dest): os.makedirs(os.path.dirname(model_dest), exist_ok=True) request.urlretrieve( model_url, model_dest, ProgressBar(os.path.basename(model_dest)) ) - print("...downloaded successfully", file=sys.stderr) + logger.info("...downloaded successfully") else: - print("...exists", file=sys.stderr) + logger.info("...exists") except Exception: - print("...download failed", file=sys.stderr) - print(f"Error downloading {label} model", file=sys.stderr) + logger.info("...download failed") + logger.info(f"Error downloading {label} model") print(traceback.format_exc(), file=sys.stderr) -# --------------------------------------------- -# this will preload the Bert tokenizer fles -def download_bert(): - print("Installing bert tokenizer...", file=sys.stderr) - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning) - from transformers import BertTokenizerFast +def download_conversion_models(): + target_dir = config.root_path / 'models/core/convert' + kwargs = dict() # for future use + try: + logger.info('Downloading core tokenizers and text encoders') - download_from_hf(BertTokenizerFast, "bert-base-uncased") + # bert + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + bert = BertTokenizerFast.from_pretrained("bert-base-uncased", **kwargs) + bert.save_pretrained(target_dir / 'bert-base-uncased', safe_serialization=True) + + # sd-1 + repo_id = 'openai/clip-vit-large-patch14' + hf_download_from_pretrained(CLIPTokenizer, repo_id, target_dir / 'clip-vit-large-patch14') + hf_download_from_pretrained(CLIPTextModel, repo_id, target_dir / 'clip-vit-large-patch14') + # sd-2 + repo_id = "stabilityai/stable-diffusion-2" + pipeline = CLIPTokenizer.from_pretrained(repo_id, subfolder="tokenizer", **kwargs) + pipeline.save_pretrained(target_dir / 'stable-diffusion-2-clip' / 'tokenizer', safe_serialization=True) -# --------------------------------------------- -def download_sd1_clip(): - print("Installing SD1 clip model...", file=sys.stderr) - version = "openai/clip-vit-large-patch14" - download_from_hf(CLIPTokenizer, version) - download_from_hf(CLIPTextModel, version) + pipeline = CLIPTextModel.from_pretrained(repo_id, subfolder="text_encoder", **kwargs) + pipeline.save_pretrained(target_dir / 'stable-diffusion-2-clip' / 'text_encoder', safe_serialization=True) + # VAE + logger.info('Downloading stable diffusion VAE') + vae = AutoencoderKL.from_pretrained('stabilityai/sd-vae-ft-mse', **kwargs) + vae.save_pretrained(target_dir / 'sd-vae-ft-mse', safe_serialization=True) -# --------------------------------------------- -def download_sd2_clip(): - version = "stabilityai/stable-diffusion-2" - print("Installing SD2 clip model...", file=sys.stderr) - download_from_hf(CLIPTokenizer, version, subfolder="tokenizer") - download_from_hf(CLIPTextModel, version, subfolder="text_encoder") + # safety checking + logger.info('Downloading safety checker') + repo_id = "CompVis/stable-diffusion-safety-checker" + pipeline = AutoFeatureExtractor.from_pretrained(repo_id,**kwargs) + pipeline.save_pretrained(target_dir / 'stable-diffusion-safety-checker', safe_serialization=True) + pipeline = StableDiffusionSafetyChecker.from_pretrained(repo_id,**kwargs) + pipeline.save_pretrained(target_dir / 'stable-diffusion-safety-checker', safe_serialization=True) + except KeyboardInterrupt: + raise + except Exception as e: + logger.error(str(e)) # --------------------------------------------- def download_realesrgan(): - print("Installing models from RealESRGAN...", file=sys.stderr) + logger.info("Installing models from RealESRGAN...") model_url = "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-x4v3.pth" wdn_model_url = "https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.5.0/realesr-general-wdn-x4v3.pth" - model_dest = config.root_path / "models/realesrgan/realesr-general-x4v3.pth" - wdn_model_dest = config.root_path / "models/realesrgan/realesr-general-wdn-x4v3.pth" + model_dest = config.root_path / "models/core/upscaling/realesrgan/realesr-general-x4v3.pth" + wdn_model_dest = config.root_path / "models/core/upscaling/realesrgan/realesr-general-wdn-x4v3.pth" download_with_progress_bar(model_url, str(model_dest), "RealESRGAN") download_with_progress_bar(wdn_model_url, str(wdn_model_dest), "RealESRGANwdn") def download_gfpgan(): - print("Installing GFPGAN models...", file=sys.stderr) + logger.info("Installing GFPGAN models...") for model in ( [ "https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.4.pth", - "./models/gfpgan/GFPGANv1.4.pth", + "./models/core/face_restoration/gfpgan/GFPGANv1.4.pth", ], [ "https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth", - "./models/gfpgan/weights/detection_Resnet50_Final.pth", + "./models/core/face_restoration/gfpgan/weights/detection_Resnet50_Final.pth", ], [ "https://github.com/xinntao/facexlib/releases/download/v0.2.2/parsing_parsenet.pth", - "./models/gfpgan/weights/parsing_parsenet.pth", + "./models/core/face_restoration/gfpgan/weights/parsing_parsenet.pth", ], ): model_url, model_dest = model[0], config.root_path / model[1] @@ -239,70 +259,32 @@ def download_gfpgan(): # --------------------------------------------- def download_codeformer(): - print("Installing CodeFormer model file...", file=sys.stderr) + logger.info("Installing CodeFormer model file...") model_url = ( "https://github.com/sczhou/CodeFormer/releases/download/v0.1.0/codeformer.pth" ) - model_dest = config.root_path / "models/codeformer/codeformer.pth" + model_dest = config.root_path / "models/core/face_restoration/codeformer/codeformer.pth" download_with_progress_bar(model_url, str(model_dest), "CodeFormer") # --------------------------------------------- def download_clipseg(): - print("Installing clipseg model for text-based masking...", file=sys.stderr) + logger.info("Installing clipseg model for text-based masking...") CLIPSEG_MODEL = "CIDAS/clipseg-rd64-refined" try: - download_from_hf(AutoProcessor, CLIPSEG_MODEL) - download_from_hf(CLIPSegForImageSegmentation, CLIPSEG_MODEL) + hf_download_from_pretrained(AutoProcessor, CLIPSEG_MODEL, config.root_path / 'models/core/misc/clipseg') + hf_download_from_pretrained(CLIPSegForImageSegmentation, CLIPSEG_MODEL, config.root_path / 'models/core/misc/clipseg') except Exception: - print("Error installing clipseg model:") - print(traceback.format_exc()) + logger.info("Error installing clipseg model:") + logger.info(traceback.format_exc()) -# ------------------------------------- -def download_safety_checker(): - print("Installing model for NSFW content detection...", file=sys.stderr) - try: - from diffusers.pipelines.stable_diffusion.safety_checker import ( - StableDiffusionSafetyChecker, - ) - from transformers import AutoFeatureExtractor - except ModuleNotFoundError: - print("Error installing NSFW checker model:") - print(traceback.format_exc()) - return - safety_model_id = "CompVis/stable-diffusion-safety-checker" - print("AutoFeatureExtractor...", file=sys.stderr) - download_from_hf(AutoFeatureExtractor, safety_model_id) - print("StableDiffusionSafetyChecker...", file=sys.stderr) - download_from_hf(StableDiffusionSafetyChecker, safety_model_id) - - -# ------------------------------------- -def download_vaes(): - print("Installing stabilityai VAE...", file=sys.stderr) - try: - # first the diffusers version - repo_id = "stabilityai/sd-vae-ft-mse" - args = dict( - cache_dir=config.cache_dir, - ) - if not AutoencoderKL.from_pretrained(repo_id, **args): - raise Exception(f"download of {repo_id} failed") - - repo_id = "stabilityai/sd-vae-ft-mse-original" - model_name = "vae-ft-mse-840000-ema-pruned.ckpt" - # next the legacy checkpoint version - if not hf_download_with_resume( - repo_id=repo_id, - model_name=model_name, - model_dir=str(config.root_path / Model_dir / Weights_dir), - ): - raise Exception(f"download of {model_name} failed") - except Exception as e: - print(f"Error downloading StabilityAI standard VAE: {str(e)}", file=sys.stderr) - print(traceback.format_exc(), file=sys.stderr) - +def download_support_models(): + download_realesrgan() + download_gfpgan() + download_codeformer() + download_clipseg() + download_conversion_models() # ------------------------------------- def get_root(root: str = None) -> str: @@ -378,9 +360,7 @@ Use cursor arrows to make a checkbox selection, and space to toggle. scroll_exit=True, ) self.nextrely += 1 - label = """If you have an account at HuggingFace you may optionally paste your access token here -to allow InvokeAI to download restricted styles & subjects from the "Concept Library". See https://huggingface.co/settings/tokens. -""" + label = """HuggingFace access token (OPTIONAL) for automatic model downloads. See https://huggingface.co/settings/tokens.""" for line in textwrap.wrap(label,width=window_width-6): self.add_widget_intelligent( npyscreen.FixedText, @@ -442,6 +422,7 @@ to allow InvokeAI to download restricted styles & subjects from the "Concept Lib ) self.precision = self.add_widget_intelligent( npyscreen.TitleSelectOne, + columns = 2, name="Precision", values=PRECISION_CHOICES, value=PRECISION_CHOICES.index(precision), @@ -449,13 +430,13 @@ to allow InvokeAI to download restricted styles & subjects from the "Concept Lib max_height=len(PRECISION_CHOICES) + 1, scroll_exit=True, ) - self.max_loaded_models = self.add_widget_intelligent( + self.max_cache_size = self.add_widget_intelligent( IntTitleSlider, - name="Number of models to cache in CPU memory (each will use 2-4 GB!)", - value=old_opts.max_loaded_models, - out_of=10, - lowest=1, - begin_entry_at=4, + name="Size of the RAM cache used for fast model switching (GB)", + value=old_opts.max_cache_size, + out_of=20, + lowest=3, + begin_entry_at=6, scroll_exit=True, ) self.nextrely += 1 @@ -465,39 +446,19 @@ to allow InvokeAI to download restricted styles & subjects from the "Concept Lib editable=False, color="CONTROL", ) - self.embedding_dir = self.add_widget_intelligent( - npyscreen.TitleFilename, - name=" Textual Inversion Embeddings:", - value=str(default_embedding_dir()), - select_dir=True, - must_exist=False, - use_two_lines=False, - labelColor="GOOD", - begin_entry_at=32, - scroll_exit=True, - ) - self.lora_dir = self.add_widget_intelligent( - npyscreen.TitleFilename, - name=" LoRA and LyCORIS:", - value=str(default_lora_dir()), - select_dir=True, - must_exist=False, - use_two_lines=False, - labelColor="GOOD", - begin_entry_at=32, - scroll_exit=True, - ) - self.controlnet_dir = self.add_widget_intelligent( - npyscreen.TitleFilename, - name=" ControlNets:", - value=str(default_controlnet_dir()), - select_dir=True, - must_exist=False, - use_two_lines=False, - labelColor="GOOD", - begin_entry_at=32, - scroll_exit=True, - ) + self.autoimport_dirs = {} + for description, config_name, path in autoimport_paths(old_opts): + self.autoimport_dirs[config_name] = self.add_widget_intelligent( + npyscreen.TitleFilename, + name=description+':', + value=str(path), + select_dir=True, + must_exist=False, + use_two_lines=False, + labelColor="GOOD", + begin_entry_at=32, + scroll_exit=True + ) self.nextrely += 1 self.add_widget_intelligent( npyscreen.TitleFixedText, @@ -562,10 +523,6 @@ https://huggingface.co/spaces/CompVis/stable-diffusion-license bad_fields.append( f"The output directory does not seem to be valid. Please check that {str(Path(opt.outdir).parent)} is an existing directory." ) - if not Path(opt.embedding_dir).parent.exists(): - bad_fields.append( - f"The embedding directory does not seem to be valid. Please check that {str(Path(opt.embedding_dir).parent)} is an existing directory." - ) if len(bad_fields) > 0: message = "The following problems were detected and must be corrected:\n" for problem in bad_fields: @@ -582,22 +539,22 @@ https://huggingface.co/spaces/CompVis/stable-diffusion-license "outdir", "nsfw_checker", "free_gpu_mem", - "max_loaded_models", + "max_cache_size", "xformers_enabled", "always_use_cpu", - "embedding_dir", - "lora_dir", - "controlnet_dir", ]: setattr(new_opts, attr, getattr(self, attr).value) + for attr in self.autoimport_dirs: + directory = Path(self.autoimport_dirs[attr].value) + if directory.is_relative_to(config.root_path): + directory = directory.relative_to(config.root_path) + setattr(new_opts, attr, directory) + new_opts.hf_token = self.hf_token.value new_opts.license_acceptance = self.license_acceptance.value new_opts.precision = PRECISION_CHOICES[self.precision.value[0]] - # widget library workaround to make max_loaded_models an int rather than a float - new_opts.max_loaded_models = int(new_opts.max_loaded_models) - return new_opts @@ -607,7 +564,8 @@ class EditOptApplication(npyscreen.NPSAppManaged): self.program_opts = program_opts self.invokeai_opts = invokeai_opts self.user_cancelled = False - self.user_selections = default_user_selections(program_opts) + self.autoload_pending = True + self.install_selections = default_user_selections(program_opts) def onStart(self): npyscreen.setTheme(npyscreen.Themes.DefaultTheme) @@ -642,41 +600,62 @@ def default_startup_options(init_file: Path) -> Namespace: opts.nsfw_checker = True return opts -def default_user_selections(program_opts: Namespace) -> UserSelections: - return UserSelections( - install_models=default_dataset() +def default_user_selections(program_opts: Namespace) -> InstallSelections: + installer = ModelInstall(config) + models = installer.all_models() + return InstallSelections( + install_models=[models[installer.default_model()].path or models[installer.default_model()].repo_id] if program_opts.default_only - else recommended_datasets() + else [models[x].path or models[x].repo_id for x in installer.recommended_models()] if program_opts.yes_to_all - else dict(), - purge_deleted_models=False, - scan_directory=None, - autoscan_on_startup=None, + else list(), +# scan_directory=None, +# autoscan_on_startup=None, ) - +# ------------------------------------- +def autoimport_paths(config: InvokeAIAppConfig): + return [ + ('Checkpoints & diffusers models', 'autoimport_dir', config.root_path / config.autoimport_dir), + ('LoRA/LyCORIS models', 'lora_dir', config.root_path / config.lora_dir), + ('Controlnet models', 'controlnet_dir', config.root_path / config.controlnet_dir), + ('Textual Inversion Embeddings', 'embedding_dir', config.root_path / config.embedding_dir), + ] + # ------------------------------------- def initialize_rootdir(root: Path, yes_to_all: bool = False): - print("** INITIALIZING INVOKEAI RUNTIME DIRECTORY **") - + logger.info("** INITIALIZING INVOKEAI RUNTIME DIRECTORY **") for name in ( "models", - "configs", - "embeddings", "databases", - "loras", - "controlnets", "text-inversion-output", "text-inversion-training-data", + "configs" ): os.makedirs(os.path.join(root, name), exist_ok=True) + for model_type in ModelType: + Path(root, 'autoimport', model_type.value).mkdir(parents=True, exist_ok=True) configs_src = Path(configs.__path__[0]) configs_dest = root / "configs" if not os.path.samefile(configs_src, configs_dest): shutil.copytree(configs_src, configs_dest, dirs_exist_ok=True) + dest = root / 'models' + for model_base in BaseModelType: + for model_type in ModelType: + path = dest / model_base.value / model_type.value + path.mkdir(parents=True, exist_ok=True) + path = dest / 'core' + path.mkdir(parents=True, exist_ok=True) + with open(root / 'configs' / 'models.yaml','w') as yaml_file: + yaml_file.write(yaml.dump({'__metadata__': + {'version':'3.0.0'} + } + ) + ) + # ------------------------------------- def run_console_ui( program_opts: Namespace, initfile: Path = None @@ -699,7 +678,7 @@ def run_console_ui( if editApp.user_cancelled: return (None, None) else: - return (editApp.new_opts, editApp.user_selections) + return (editApp.new_opts, editApp.install_selections) # ------------------------------------- @@ -722,18 +701,6 @@ def write_opts(opts: Namespace, init_file: Path): def default_output_dir() -> Path: return config.root_path / "outputs" -# ------------------------------------- -def default_embedding_dir() -> Path: - return config.root_path / "embeddings" - -# ------------------------------------- -def default_lora_dir() -> Path: - return config.root_path / "loras" - -# ------------------------------------- -def default_controlnet_dir() -> Path: - return config.root_path / "controlnets" - # ------------------------------------- def write_default_options(program_opts: Namespace, initfile: Path): opt = default_startup_options(initfile) @@ -758,14 +725,42 @@ def migrate_init_file(legacy_format:Path): new.nsfw_checker = old.safety_checker new.xformers_enabled = old.xformers new.conf_path = old.conf - new.embedding_dir = old.embedding_path + new.root = legacy_format.parent.resolve() invokeai_yaml = legacy_format.parent / 'invokeai.yaml' with open(invokeai_yaml,"w", encoding="utf-8") as outfile: outfile.write(new.to_yaml()) - legacy_format.replace(legacy_format.parent / 'invokeai.init.old') + legacy_format.replace(legacy_format.parent / 'invokeai.init.orig') +# ------------------------------------- +def migrate_models(root: Path): + from invokeai.backend.install.migrate_to_3 import do_migrate + do_migrate(root, root) + +def migrate_if_needed(opt: Namespace, root: Path)->bool: + # We check for to see if the runtime directory is correctly initialized. + old_init_file = root / 'invokeai.init' + new_init_file = root / 'invokeai.yaml' + old_hub = root / 'models/hub' + migration_needed = old_init_file.exists() and not new_init_file.exists() or old_hub.exists() + + if migration_needed: + if opt.yes_to_all or \ + yes_or_no(f'{str(config.root_path)} appears to be a 2.3 format root directory. Convert to version 3.0?'): + + logger.info('** Migrating invokeai.init to invokeai.yaml') + migrate_init_file(old_init_file) + config.parse_args(argv=[],conf=OmegaConf.load(new_init_file)) + + if old_hub.exists(): + migrate_models(config.root_path) + else: + print('Cannot continue without conversion. Aborting.') + + return migration_needed + + # ------------------------------------- def main(): parser = argparse.ArgumentParser(description="InvokeAI model downloader") @@ -831,20 +826,16 @@ def main(): errors = set() try: - models_to_download = default_user_selections(opt) - - # We check for to see if the runtime directory is correctly initialized. - old_init_file = config.root_path / 'invokeai.init' - new_init_file = config.root_path / 'invokeai.yaml' - if old_init_file.exists() and not new_init_file.exists(): - print('** Migrating invokeai.init to invokeai.yaml') - migrate_init_file(old_init_file) - # Load new init file into config - config.parse_args(argv=[],conf=OmegaConf.load(new_init_file)) + # if we do a root migration/upgrade, then we are keeping previous + # configuration and we are done. + if migrate_if_needed(opt, config.root_path): + sys.exit(0) if not config.model_conf_path.exists(): initialize_rootdir(config.root_path, opt.yes_to_all) + models_to_download = default_user_selections(opt) + new_init_file = config.root_path / 'invokeai.yaml' if opt.yes_to_all: write_default_options(opt, new_init_file) init_options = Namespace( @@ -855,29 +846,21 @@ def main(): if init_options: write_opts(init_options, new_init_file) else: - print( + logger.info( '\n** CANCELLED AT USER\'S REQUEST. USE THE "invoke.sh" LAUNCHER TO RUN LATER **\n' ) sys.exit(0) - + if opt.skip_support_models: - print("\n** SKIPPING SUPPORT MODEL DOWNLOADS PER USER REQUEST **") + logger.info("SKIPPING SUPPORT MODEL DOWNLOADS PER USER REQUEST") else: - print("\n** CHECKING/UPDATING SUPPORT MODELS **") - download_bert() - download_sd1_clip() - download_sd2_clip() - download_realesrgan() - download_gfpgan() - download_codeformer() - download_clipseg() - download_safety_checker() - download_vaes() + logger.info("CHECKING/UPDATING SUPPORT MODELS") + download_support_models() if opt.skip_sd_weights: - print("\n** SKIPPING DIFFUSION WEIGHTS DOWNLOAD PER USER REQUEST **") + logger.info("\n** SKIPPING DIFFUSION WEIGHTS DOWNLOAD PER USER REQUEST **") elif models_to_download: - print("\n** DOWNLOADING DIFFUSION WEIGHTS **") + logger.info("\n** DOWNLOADING DIFFUSION WEIGHTS **") process_and_execute(opt, models_to_download) postscript(errors=errors) diff --git a/invokeai/backend/install/legacy_arg_parsing.py b/invokeai/backend/install/legacy_arg_parsing.py index 4a58ff8336..684c50c77d 100644 --- a/invokeai/backend/install/legacy_arg_parsing.py +++ b/invokeai/backend/install/legacy_arg_parsing.py @@ -4,6 +4,8 @@ import argparse import shlex from argparse import ArgumentParser +# note that this includes both old sampler names and new scheduler names +# in order to be able to parse both 2.0 and 3.0-pre-nodes versions of invokeai.init SAMPLER_CHOICES = [ "ddim", "ddpm", @@ -27,6 +29,15 @@ SAMPLER_CHOICES = [ "dpmpp_sde", "dpmpp_sde_k", "unipc", + "k_dpm_2_a", + "k_dpm_2", + "k_dpmpp_2_a", + "k_dpmpp_2", + "k_euler_a", + "k_euler", + "k_heun", + "k_lms", + "plms", ] PRECISION_CHOICES = [ diff --git a/invokeai/backend/install/migrate_to_3.py b/invokeai/backend/install/migrate_to_3.py new file mode 100644 index 0000000000..4500d7b7cd --- /dev/null +++ b/invokeai/backend/install/migrate_to_3.py @@ -0,0 +1,606 @@ +''' +Migrate the models directory and models.yaml file from an existing +InvokeAI 2.3 installation to 3.0.0. +''' + +import os +import argparse +import shutil +import yaml + +import transformers +import diffusers +import warnings + +from dataclasses import dataclass +from pathlib import Path +from omegaconf import OmegaConf, DictConfig +from typing import Union + +from diffusers import StableDiffusionPipeline, AutoencoderKL +from diffusers.pipelines.stable_diffusion.safety_checker import StableDiffusionSafetyChecker +from transformers import ( + CLIPTextModel, + CLIPTokenizer, + AutoFeatureExtractor, + BertTokenizerFast, +) + +import invokeai.backend.util.logging as logger +from invokeai.app.services.config import InvokeAIAppConfig +from invokeai.backend.model_management import ModelManager +from invokeai.backend.model_management.model_probe import ( + ModelProbe, ModelType, BaseModelType, ModelProbeInfo + ) + +warnings.filterwarnings("ignore") +transformers.logging.set_verbosity_error() +diffusers.logging.set_verbosity_error() + +# holder for paths that we will migrate +@dataclass +class ModelPaths: + models: Path + embeddings: Path + loras: Path + controlnets: Path + +class MigrateTo3(object): + def __init__(self, + from_root: Path, + to_models: Path, + model_manager: ModelManager, + src_paths: ModelPaths, + ): + self.root_directory = from_root + self.dest_models = to_models + self.mgr = model_manager + self.src_paths = src_paths + + @classmethod + def initialize_yaml(cls, yaml_file: Path): + with open(yaml_file, 'w') as file: + file.write( + yaml.dump( + { + '__metadata__': {'version':'3.0.0'} + } + ) + ) + + def create_directory_structure(self): + ''' + Create the basic directory structure for the models folder. + ''' + for model_base in [BaseModelType.StableDiffusion1,BaseModelType.StableDiffusion2]: + for model_type in [ModelType.Main, ModelType.Vae, ModelType.Lora, + ModelType.ControlNet,ModelType.TextualInversion]: + path = self.dest_models / model_base.value / model_type.value + path.mkdir(parents=True, exist_ok=True) + path = self.dest_models / 'core' + path.mkdir(parents=True, exist_ok=True) + + @staticmethod + def copy_file(src:Path,dest:Path): + ''' + copy a single file with logging + ''' + if dest.exists(): + logger.info(f'Skipping existing {str(dest)}') + return + logger.info(f'Copying {str(src)} to {str(dest)}') + try: + shutil.copy(src, dest) + except Exception as e: + logger.error(f'COPY FAILED: {str(e)}') + + @staticmethod + def copy_dir(src:Path,dest:Path): + ''' + Recursively copy a directory with logging + ''' + if dest.exists(): + logger.info(f'Skipping existing {str(dest)}') + return + + logger.info(f'Copying {str(src)} to {str(dest)}') + try: + shutil.copytree(src, dest) + except Exception as e: + logger.error(f'COPY FAILED: {str(e)}') + + def migrate_models(self, src_dir: Path): + ''' + Recursively walk through src directory, probe anything + that looks like a model, and copy the model into the + appropriate location within the destination models directory. + ''' + directories_scanned = set() + for root, dirs, files in os.walk(src_dir): + for d in dirs: + try: + model = Path(root,d) + info = ModelProbe().heuristic_probe(model) + if not info: + continue + dest = self._model_probe_to_path(info) / model.name + self.copy_dir(model, dest) + directories_scanned.add(model) + except Exception as e: + logger.error(str(e)) + except KeyboardInterrupt: + raise + except Exception as e: + logger.error(str(e)) + for f in files: + # don't copy raw learned_embeds.bin or pytorch_lora_weights.bin + # let them be copied as part of a tree copy operation + try: + if f in {'learned_embeds.bin','pytorch_lora_weights.bin'}: + continue + model = Path(root,f) + if model.parent in directories_scanned: + continue + info = ModelProbe().heuristic_probe(model) + if not info: + continue + dest = self._model_probe_to_path(info) / f + self.copy_file(model, dest) + except Exception as e: + logger.error(str(e)) + except KeyboardInterrupt: + raise + except Exception as e: + logger.error(str(e)) + + def migrate_support_models(self): + ''' + Copy the clipseg, upscaler, and restoration models to their new + locations. + ''' + dest_directory = self.dest_models + if (self.root_directory / 'models/clipseg').exists(): + self.copy_dir(self.root_directory / 'models/clipseg', dest_directory / 'core/misc/clipseg') + if (self.root_directory / 'models/realesrgan').exists(): + self.copy_dir(self.root_directory / 'models/realesrgan', dest_directory / 'core/upscaling/realesrgan') + for d in ['codeformer','gfpgan']: + path = self.root_directory / 'models' / d + if path.exists(): + self.copy_dir(path,dest_directory / f'core/face_restoration/{d}') + + def migrate_tuning_models(self): + ''' + Migrate the embeddings, loras and controlnets directories to their new homes. + ''' + for src in [self.src_paths.embeddings, self.src_paths.loras, self.src_paths.controlnets]: + if not src: + continue + if src.is_dir(): + logger.info(f'Scanning {src}') + self.migrate_models(src) + else: + logger.info(f'{src} directory not found; skipping') + continue + + def migrate_conversion_models(self): + ''' + Migrate all the models that are needed by the ckpt_to_diffusers conversion + script. + ''' + + dest_directory = self.dest_models + kwargs = dict( + cache_dir = self.root_directory / 'models/hub', + #local_files_only = True + ) + try: + logger.info('Migrating core tokenizers and text encoders') + target_dir = dest_directory / 'core' / 'convert' + + self._migrate_pretrained(BertTokenizerFast, + repo_id='bert-base-uncased', + dest = target_dir / 'bert-base-uncased', + **kwargs) + + # sd-1 + repo_id = 'openai/clip-vit-large-patch14' + self._migrate_pretrained(CLIPTokenizer, + repo_id= repo_id, + dest= target_dir / 'clip-vit-large-patch14', + **kwargs) + self._migrate_pretrained(CLIPTextModel, + repo_id = repo_id, + dest = target_dir / 'clip-vit-large-patch14', + force = True, + **kwargs) + + # sd-2 + repo_id = "stabilityai/stable-diffusion-2" + self._migrate_pretrained(CLIPTokenizer, + repo_id = repo_id, + dest = target_dir / 'stable-diffusion-2-clip' / 'tokenizer', + **{'subfolder':'tokenizer',**kwargs} + ) + self._migrate_pretrained(CLIPTextModel, + repo_id = repo_id, + dest = target_dir / 'stable-diffusion-2-clip' / 'text_encoder', + **{'subfolder':'text_encoder',**kwargs} + ) + + # VAE + logger.info('Migrating stable diffusion VAE') + self._migrate_pretrained(AutoencoderKL, + repo_id = 'stabilityai/sd-vae-ft-mse', + dest = target_dir / 'sd-vae-ft-mse', + **kwargs) + + # safety checking + logger.info('Migrating safety checker') + repo_id = "CompVis/stable-diffusion-safety-checker" + self._migrate_pretrained(AutoFeatureExtractor, + repo_id = repo_id, + dest = target_dir / 'stable-diffusion-safety-checker', + **kwargs) + self._migrate_pretrained(StableDiffusionSafetyChecker, + repo_id = repo_id, + dest = target_dir / 'stable-diffusion-safety-checker', + **kwargs) + except KeyboardInterrupt: + raise + except Exception as e: + logger.error(str(e)) + + def _model_probe_to_path(self, info: ModelProbeInfo)->Path: + return Path(self.dest_models, info.base_type.value, info.model_type.value) + + def _migrate_pretrained(self, model_class, repo_id: str, dest: Path, force:bool=False, **kwargs): + if dest.exists() and not force: + logger.info(f'Skipping existing {dest}') + return + model = model_class.from_pretrained(repo_id, **kwargs) + self._save_pretrained(model, dest, overwrite=force) + + def _save_pretrained(self, model, dest: Path, overwrite: bool=False): + model_name = dest.name + if overwrite: + model.save_pretrained(dest, safe_serialization=True) + else: + download_path = dest.with_name(f'{model_name}.downloading') + model.save_pretrained(download_path, safe_serialization=True) + download_path.replace(dest) + + def _download_vae(self, repo_id: str, subfolder:str=None)->Path: + vae = AutoencoderKL.from_pretrained(repo_id, cache_dir=self.root_directory / 'models/hub', subfolder=subfolder) + info = ModelProbe().heuristic_probe(vae) + _, model_name = repo_id.split('/') + dest = self._model_probe_to_path(info) / self.unique_name(model_name, info) + vae.save_pretrained(dest, safe_serialization=True) + return dest + + def _vae_path(self, vae: Union[str,dict])->Path: + ''' + Convert 2.3 VAE stanza to a straight path. + ''' + vae_path = None + + # First get a path + if isinstance(vae,str): + vae_path = vae + + elif isinstance(vae,DictConfig): + if p := vae.get('path'): + vae_path = p + elif repo_id := vae.get('repo_id'): + if repo_id=='stabilityai/sd-vae-ft-mse': # this guy is already downloaded + vae_path = 'models/core/convert/sd-vae-ft-mse' + return vae_path + else: + vae_path = self._download_vae(repo_id, vae.get('subfolder')) + + assert vae_path is not None, "Couldn't find VAE for this model" + + # if the VAE is in the old models directory, then we must move it into the new + # one. VAEs outside of this directory can stay where they are. + vae_path = Path(vae_path) + if vae_path.is_relative_to(self.src_paths.models): + info = ModelProbe().heuristic_probe(vae_path) + dest = self._model_probe_to_path(info) / vae_path.name + if not dest.exists(): + if vae_path.is_dir(): + self.copy_dir(vae_path,dest) + else: + self.copy_file(vae_path,dest) + vae_path = dest + + if vae_path.is_relative_to(self.dest_models): + rel_path = vae_path.relative_to(self.dest_models) + return Path('models',rel_path) + else: + return vae_path + + def migrate_repo_id(self, repo_id: str, model_name: str=None, **extra_config): + ''' + Migrate a locally-cached diffusers pipeline identified with a repo_id + ''' + dest_dir = self.dest_models + + cache = self.root_directory / 'models/hub' + kwargs = dict( + cache_dir = cache, + safety_checker = None, + # local_files_only = True, + ) + + owner,repo_name = repo_id.split('/') + model_name = model_name or repo_name + model = cache / '--'.join(['models',owner,repo_name]) + + if len(list(model.glob('snapshots/**/model_index.json')))==0: + return + revisions = [x.name for x in model.glob('refs/*')] + + # if an fp16 is available we use that + revision = 'fp16' if len(revisions) > 1 and 'fp16' in revisions else revisions[0] + pipeline = StableDiffusionPipeline.from_pretrained( + repo_id, + revision=revision, + **kwargs) + + info = ModelProbe().heuristic_probe(pipeline) + if not info: + return + + if self.mgr.model_exists(model_name, info.base_type, info.model_type): + logger.warning(f'A model named {model_name} already exists at the destination. Skipping migration.') + return + + dest = self._model_probe_to_path(info) / model_name + self._save_pretrained(pipeline, dest) + + rel_path = Path('models',dest.relative_to(dest_dir)) + self._add_model(model_name, info, rel_path, **extra_config) + + def migrate_path(self, location: Path, model_name: str=None, **extra_config): + ''' + Migrate a model referred to using 'weights' or 'path' + ''' + + # handle relative paths + dest_dir = self.dest_models + location = self.root_directory / location + model_name = model_name or location.stem + + info = ModelProbe().heuristic_probe(location) + if not info: + return + + if self.mgr.model_exists(model_name, info.base_type, info.model_type): + logger.warning(f'A model named {model_name} already exists at the destination. Skipping migration.') + return + + # uh oh, weights is in the old models directory - move it into the new one + if Path(location).is_relative_to(self.src_paths.models): + dest = Path(dest_dir, info.base_type.value, info.model_type.value, location.name) + if location.is_dir(): + self.copy_dir(location,dest) + else: + self.copy_file(location,dest) + location = Path('models', info.base_type.value, info.model_type.value, location.name) + + self._add_model(model_name, info, location, **extra_config) + + def _add_model(self, + model_name: str, + info: ModelProbeInfo, + location: Path, + **extra_config): + if info.model_type != ModelType.Main: + return + + self.mgr.add_model( + model_name = model_name, + base_model = info.base_type, + model_type = info.model_type, + clobber = True, + model_attributes = { + 'path': str(location), + 'description': f'A {info.base_type.value} {info.model_type.value} model', + 'model_format': info.format, + 'variant': info.variant_type.value, + **extra_config, + } + ) + + def migrate_defined_models(self): + ''' + Migrate models defined in models.yaml + ''' + # find any models referred to in old models.yaml + conf = OmegaConf.load(self.root_directory / 'configs/models.yaml') + + for model_name, stanza in conf.items(): + + try: + passthru_args = {} + + if vae := stanza.get('vae'): + try: + passthru_args['vae'] = str(self._vae_path(vae)) + except Exception as e: + logger.warning(f'Could not find a VAE matching "{vae}" for model "{model_name}"') + logger.warning(str(e)) + + if config := stanza.get('config'): + passthru_args['config'] = config + + if description:= stanza.get('description'): + passthru_args['description'] = description + + if repo_id := stanza.get('repo_id'): + logger.info(f'Migrating diffusers model {model_name}') + self.migrate_repo_id(repo_id, model_name, **passthru_args) + + elif location := stanza.get('weights'): + logger.info(f'Migrating checkpoint model {model_name}') + self.migrate_path(Path(location), model_name, **passthru_args) + + elif location := stanza.get('path'): + logger.info(f'Migrating diffusers model {model_name}') + self.migrate_path(Path(location), model_name, **passthru_args) + + except KeyboardInterrupt: + raise + except Exception as e: + logger.error(str(e)) + + def migrate(self): + self.create_directory_structure() + # the configure script is doing this + self.migrate_support_models() + self.migrate_conversion_models() + self.migrate_tuning_models() + self.migrate_defined_models() + +def _parse_legacy_initfile(root: Path, initfile: Path)->ModelPaths: + ''' + Returns tuple of (embedding_path, lora_path, controlnet_path) + ''' + parser = argparse.ArgumentParser(fromfile_prefix_chars='@') + parser.add_argument( + '--embedding_directory', + '--embedding_path', + type=Path, + dest='embedding_path', + default=Path('embeddings'), + ) + parser.add_argument( + '--lora_directory', + dest='lora_path', + type=Path, + default=Path('loras'), + ) + opt,_ = parser.parse_known_args([f'@{str(initfile)}']) + return ModelPaths( + models = root / 'models', + embeddings = root / str(opt.embedding_path).strip('"'), + loras = root / str(opt.lora_path).strip('"'), + controlnets = root / 'controlnets', + ) + +def _parse_legacy_yamlfile(root: Path, initfile: Path)->ModelPaths: + ''' + Returns tuple of (embedding_path, lora_path, controlnet_path) + ''' + # Don't use the config object because it is unforgiving of version updates + # Just use omegaconf directly + opt = OmegaConf.load(initfile) + paths = opt.InvokeAI.Paths + models = paths.get('models_dir','models') + embeddings = paths.get('embedding_dir','embeddings') + loras = paths.get('lora_dir','loras') + controlnets = paths.get('controlnet_dir','controlnets') + return ModelPaths( + models = root / models, + embeddings = root / embeddings, + loras = root /loras, + controlnets = root / controlnets, + ) + +def get_legacy_embeddings(root: Path) -> ModelPaths: + path = root / 'invokeai.init' + if path.exists(): + return _parse_legacy_initfile(root, path) + path = root / 'invokeai.yaml' + if path.exists(): + return _parse_legacy_yamlfile(root, path) + +def do_migrate(src_directory: Path, dest_directory: Path): + """ + Migrate models from src to dest InvokeAI root directories + """ + config_file = dest_directory / 'configs' / 'models.yaml.3' + dest_models = dest_directory / 'models.3' + + version_3 = (dest_directory / 'models' / 'core').exists() + + # Here we create the destination models.yaml file. + # If we are writing into a version 3 directory and the + # file already exists, then we write into a copy of it to + # avoid deleting its previous customizations. Otherwise we + # create a new empty one. + if version_3: # write into the dest directory + try: + shutil.copy(dest_directory / 'configs' / 'models.yaml', config_file) + except: + MigrateTo3.initialize_yaml(config_file) + mgr = ModelManager(config_file) # important to initialize BEFORE moving the models directory + (dest_directory / 'models').replace(dest_models) + else: + MigrateTo3.initialize_yaml(config_file) + mgr = ModelManager(config_file) + + paths = get_legacy_embeddings(src_directory) + migrator = MigrateTo3( + from_root = src_directory, + to_models = dest_models, + model_manager = mgr, + src_paths = paths + ) + migrator.migrate() + print("Migration successful.") + + if not version_3: + (dest_directory / 'models').replace(src_directory / 'models.orig') + print(f'Original models directory moved to {dest_directory}/models.orig') + + (dest_directory / 'configs' / 'models.yaml').replace(src_directory / 'configs' / 'models.yaml.orig') + print(f'Original models.yaml file moved to {dest_directory}/configs/models.yaml.orig') + + config_file.replace(config_file.with_suffix('')) + dest_models.replace(dest_models.with_suffix('')) + +def main(): + parser = argparse.ArgumentParser(prog="invokeai-migrate3", + description=""" +This will copy and convert the models directory and the configs/models.yaml from the InvokeAI 2.3 format +'--from-directory' root to the InvokeAI 3.0 '--to-directory' root. These may be abbreviated '--from' and '--to'.a + +The old models directory and config file will be renamed 'models.orig' and 'models.yaml.orig' respectively. +It is safe to provide the same directory for both arguments, but it is better to use the invokeai_configure +script, which will perform a full upgrade in place.""" + ) + parser.add_argument('--from-directory', + dest='src_root', + type=Path, + required=True, + help='Source InvokeAI 2.3 root directory (containing "invokeai.init" or "invokeai.yaml")' + ) + parser.add_argument('--to-directory', + dest='dest_root', + type=Path, + required=True, + help='Destination InvokeAI 3.0 directory (containing "invokeai.yaml")' + ) + args = parser.parse_args() + src_root = args.src_root + assert src_root.is_dir(), f"{src_root} is not a valid directory" + assert (src_root / 'models').is_dir(), f"{src_root} does not contain a 'models' subdirectory" + assert (src_root / 'models' / 'hub').exists(), f"{src_root} does not contain a version 2.3 models directory" + assert (src_root / 'invokeai.init').exists() or (src_root / 'invokeai.yaml').exists(), f"{src_root} does not contain an InvokeAI init file." + + dest_root = args.dest_root + assert dest_root.is_dir(), f"{dest_root} is not a valid directory" + config = InvokeAIAppConfig.get_config() + config.parse_args(['--root',str(dest_root)]) + + # TODO: revisit + # assert (dest_root / 'models').is_dir(), f"{dest_root} does not contain a 'models' subdirectory" + # assert (dest_root / 'invokeai.yaml').exists(), f"{dest_root} does not contain an InvokeAI init file." + + do_migrate(src_root,dest_root) + +if __name__ == '__main__': + main() + + + diff --git a/invokeai/backend/install/model_install_backend.py b/invokeai/backend/install/model_install_backend.py index 18964c774e..b6f6d62d97 100644 --- a/invokeai/backend/install/model_install_backend.py +++ b/invokeai/backend/install/model_install_backend.py @@ -2,46 +2,37 @@ Utility (backend) functions used by model_install.py """ import os -import re import shutil -import sys import warnings from dataclasses import dataclass,field from pathlib import Path -from tempfile import TemporaryFile -from typing import List, Dict, Callable +from tempfile import TemporaryDirectory +from typing import List, Dict, Callable, Union, Set import requests -from diffusers import AutoencoderKL -from huggingface_hub import hf_hub_url, HfFolder +from diffusers import StableDiffusionPipeline +from diffusers import logging as dlogging +from huggingface_hub import hf_hub_url, HfFolder, HfApi from omegaconf import OmegaConf -from omegaconf.dictconfig import DictConfig from tqdm import tqdm import invokeai.configs as configs - from invokeai.app.services.config import InvokeAIAppConfig -from ..stable_diffusion import StableDiffusionGeneratorPipeline +from invokeai.backend.model_management import ModelManager, ModelType, BaseModelType, ModelVariantType, AddModelResult +from invokeai.backend.model_management.model_probe import ModelProbe, SchedulerPredictionType, ModelProbeInfo +from invokeai.backend.util import download_with_resume from ..util.logging import InvokeAILogger warnings.filterwarnings("ignore") # --------------------------globals----------------------- config = InvokeAIAppConfig.get_config() - -Model_dir = "models" -Weights_dir = "ldm/stable-diffusion-v1/" +logger = InvokeAILogger.getLogger(name='InvokeAI') # the initial "configs" dir is now bundled in the `invokeai.configs` package Dataset_path = Path(configs.__path__[0]) / "INITIAL_MODELS.yaml" -# initial models omegaconf -Datasets = None - -# logger -logger = InvokeAILogger.getLogger(name='InvokeAI') - Config_preamble = """ # This file describes the alternative machine learning models # available to InvokeAI script. @@ -52,6 +43,24 @@ Config_preamble = """ # was trained on. """ +LEGACY_CONFIGS = { + BaseModelType.StableDiffusion1: { + ModelVariantType.Normal: 'v1-inference.yaml', + ModelVariantType.Inpaint: 'v1-inpainting-inference.yaml', + }, + + BaseModelType.StableDiffusion2: { + ModelVariantType.Normal: { + SchedulerPredictionType.Epsilon: 'v2-inference.yaml', + SchedulerPredictionType.VPrediction: 'v2-inference-v.yaml', + }, + ModelVariantType.Inpaint: { + SchedulerPredictionType.Epsilon: 'v2-inpainting-inference.yaml', + SchedulerPredictionType.VPrediction: 'v2-inpainting-inference-v.yaml', + } + } +} + @dataclass class ModelInstallList: '''Class for listing models to be installed/removed''' @@ -59,133 +68,332 @@ class ModelInstallList: remove_models: List[str] = field(default_factory=list) @dataclass -class UserSelections(): +class InstallSelections(): install_models: List[str]= field(default_factory=list) remove_models: List[str]=field(default_factory=list) - purge_deleted_models: bool=field(default_factory=list) - install_cn_models: List[str] = field(default_factory=list) - remove_cn_models: List[str] = field(default_factory=list) - install_lora_models: List[str] = field(default_factory=list) - remove_lora_models: List[str] = field(default_factory=list) - install_ti_models: List[str] = field(default_factory=list) - remove_ti_models: List[str] = field(default_factory=list) - scan_directory: Path = None - autoscan_on_startup: bool=False - import_model_paths: str=None +# scan_directory: Path = None +# autoscan_on_startup: bool=False + +@dataclass +class ModelLoadInfo(): + name: str + model_type: ModelType + base_type: BaseModelType + path: Path = None + repo_id: str = None + description: str = '' + installed: bool = False + recommended: bool = False + default: bool = False + +class ModelInstall(object): + def __init__(self, + config:InvokeAIAppConfig, + prediction_type_helper: Callable[[Path],SchedulerPredictionType]=None, + model_manager: ModelManager = None, + access_token:str = None): + self.config = config + self.mgr = model_manager or ModelManager(config.model_conf_path) + self.datasets = OmegaConf.load(Dataset_path) + self.prediction_helper = prediction_type_helper + self.access_token = access_token or HfFolder.get_token() + self.reverse_paths = self._reverse_paths(self.datasets) + + def all_models(self)->Dict[str,ModelLoadInfo]: + ''' + Return dict of model_key=>ModelLoadInfo objects. + This method consolidates and simplifies the entries in both + models.yaml and INITIAL_MODELS.yaml so that they can + be treated uniformly. It also sorts the models alphabetically + by their name, to improve the display somewhat. + ''' + model_dict = dict() -def default_config_file(): - return config.model_conf_path + # first populate with the entries in INITIAL_MODELS.yaml + for key, value in self.datasets.items(): + name,base,model_type = ModelManager.parse_key(key) + value['name'] = name + value['base_type'] = base + value['model_type'] = model_type + model_dict[key] = ModelLoadInfo(**value) -def sd_configs(): - return config.legacy_conf_path - -def initial_models(): - global Datasets - if Datasets: - return Datasets - return (Datasets := OmegaConf.load(Dataset_path)['diffusers']) - -def install_requested_models( - diffusers: ModelInstallList = None, - controlnet: ModelInstallList = None, - lora: ModelInstallList = None, - ti: ModelInstallList = None, - cn_model_map: Dict[str,str] = None, # temporary - move to model manager - scan_directory: Path = None, - external_models: List[str] = None, - scan_at_startup: bool = False, - precision: str = "float16", - purge_deleted: bool = False, - config_file_path: Path = None, - model_config_file_callback: Callable[[Path],Path] = None -): - """ - Entry point for installing/deleting starter models, or installing external models. - """ - access_token = HfFolder.get_token() - config_file_path = config_file_path or default_config_file() - if not config_file_path.exists(): - open(config_file_path, "w") - - # prevent circular import here - from ..model_management import ModelManager - model_manager = ModelManager(OmegaConf.load(config_file_path), precision=precision) - if controlnet: - model_manager.install_controlnet_models(controlnet.install_models, access_token=access_token) - model_manager.delete_controlnet_models(controlnet.remove_models) - - if lora: - model_manager.install_lora_models(lora.install_models, access_token=access_token) - model_manager.delete_lora_models(lora.remove_models) - - if ti: - model_manager.install_ti_models(ti.install_models, access_token=access_token) - model_manager.delete_ti_models(ti.remove_models) - - if diffusers: - # TODO: Replace next three paragraphs with calls into new model manager - if diffusers.remove_models and len(diffusers.remove_models) > 0: - logger.info("Processing requested deletions") - for model in diffusers.remove_models: - logger.info(f"{model}...") - model_manager.del_model(model, delete_files=purge_deleted) - model_manager.commit(config_file_path) - - if diffusers.install_models and len(diffusers.install_models) > 0: - logger.info("Installing requested models") - downloaded_paths = download_weight_datasets( - models=diffusers.install_models, - access_token=None, - precision=precision, - ) - successful = {x:v for x,v in downloaded_paths.items() if v is not None} - if len(successful) > 0: - update_config_file(successful, config_file_path) - if len(successful) < len(diffusers.install_models): - unsuccessful = [x for x in downloaded_paths if downloaded_paths[x] is None] - logger.warning(f"Some of the model downloads were not successful: {unsuccessful}") - - # due to above, we have to reload the model manager because conf file - # was changed behind its back - model_manager = ModelManager(OmegaConf.load(config_file_path), precision=precision) - - external_models = external_models or list() - if scan_directory: - external_models.append(str(scan_directory)) - - if len(external_models) > 0: - logger.info("INSTALLING EXTERNAL MODELS") - for path_url_or_repo in external_models: - try: - logger.debug(f'In install_requested_models; callback = {model_config_file_callback}') - model_manager.heuristic_import( - path_url_or_repo, - commit_to_conf=config_file_path, - config_file_callback = model_config_file_callback, + # supplement with entries in models.yaml + installed_models = self.mgr.list_models() + for md in installed_models: + base = md['base_model'] + model_type = md['model_type'] + name = md['model_name'] + key = ModelManager.create_key(name, base, model_type) + if key in model_dict: + model_dict[key].installed = True + else: + model_dict[key] = ModelLoadInfo( + name = name, + base_type = base, + model_type = model_type, + path = value.get('path'), + installed = True, ) - except KeyboardInterrupt: - sys.exit(-1) - except Exception: + return {x : model_dict[x] for x in sorted(model_dict.keys(),key=lambda y: model_dict[y].name.lower())} + + def starter_models(self)->Set[str]: + models = set() + for key, value in self.datasets.items(): + name,base,model_type = ModelManager.parse_key(key) + if model_type==ModelType.Main: + models.add(key) + return models + + def recommended_models(self)->Set[str]: + starters = self.starter_models() + return set([x for x in starters if self.datasets[x].get('recommended',False)]) + + def default_model(self)->str: + starters = self.starter_models() + defaults = [x for x in starters if self.datasets[x].get('default',False)] + return defaults[0] + + def install(self, selections: InstallSelections): + verbosity = dlogging.get_verbosity() # quench NSFW nags + dlogging.set_verbosity_error() + + job = 1 + jobs = len(selections.remove_models) + len(selections.install_models) + + # remove requested models + for key in selections.remove_models: + name,base,mtype = self.mgr.parse_key(key) + logger.info(f'Deleting {mtype} model {name} [{job}/{jobs}]') + try: + self.mgr.del_model(name,base,mtype) + except FileNotFoundError as e: + logger.warning(e) + job += 1 + + # add requested models + for path in selections.install_models: + logger.info(f'Installing {path} [{job}/{jobs}]') + try: + self.heuristic_import(path) + except (ValueError, KeyError) as e: + logger.error(str(e)) + job += 1 + + dlogging.set_verbosity(verbosity) + self.mgr.commit() + + def heuristic_import(self, + model_path_id_or_url: Union[str,Path], + models_installed: Set[Path]=None, + )->Dict[str, AddModelResult]: + ''' + :param model_path_id_or_url: A Path to a local model to import, or a string representing its repo_id or URL + :param models_installed: Set of installed models, used for recursive invocation + Returns a set of dict objects corresponding to newly-created stanzas in models.yaml. + ''' + + if not models_installed: + models_installed = dict() + + # A little hack to allow nested routines to retrieve info on the requested ID + self.current_id = model_path_id_or_url + path = Path(model_path_id_or_url) + # checkpoint file, or similar + if path.is_file(): + models_installed.update({str(path):self._install_path(path)}) + + # folders style or similar + elif path.is_dir() and any([(path/x).exists() for x in \ + {'config.json','model_index.json','learned_embeds.bin','pytorch_lora_weights.bin'} + ] + ): + models_installed.update(self._install_path(path)) + + # recursive scan + elif path.is_dir(): + for child in path.iterdir(): + self.heuristic_import(child, models_installed=models_installed) + + # huggingface repo + elif len(str(model_path_id_or_url).split('/')) == 2: + models_installed.update({str(model_path_id_or_url): self._install_repo(str(model_path_id_or_url))}) + + # a URL + elif str(model_path_id_or_url).startswith(("http:", "https:", "ftp:")): + models_installed.update({str(model_path_id_or_url): self._install_url(model_path_id_or_url)}) + + else: + raise KeyError(f'{str(model_path_id_or_url)} is not recognized as a local path, repo ID or URL. Skipping') + + return models_installed + + # install a model from a local path. The optional info parameter is there to prevent + # the model from being probed twice in the event that it has already been probed. + def _install_path(self, path: Path, info: ModelProbeInfo=None)->AddModelResult: + info = info or ModelProbe().heuristic_probe(path,self.prediction_helper) + if not info: + logger.warning(f'Unable to parse format of {path}') + return None + model_name = path.stem if path.is_file() else path.name + if self.mgr.model_exists(model_name, info.base_type, info.model_type): + raise ValueError(f'A model named "{model_name}" is already installed.') + attributes = self._make_attributes(path,info) + return self.mgr.add_model(model_name = model_name, + base_model = info.base_type, + model_type = info.model_type, + model_attributes = attributes, + ) + + def _install_url(self, url: str)->AddModelResult: + with TemporaryDirectory(dir=self.config.models_path) as staging: + location = download_with_resume(url,Path(staging)) + if not location: + logger.error(f'Unable to download {url}. Skipping.') + info = ModelProbe().heuristic_probe(location) + dest = self.config.models_path / info.base_type.value / info.model_type.value / location.name + models_path = shutil.move(location,dest) + + # staged version will be garbage-collected at this time + return self._install_path(Path(models_path), info) + + def _install_repo(self, repo_id: str)->AddModelResult: + hinfo = HfApi().model_info(repo_id) + + # we try to figure out how to download this most economically + # list all the files in the repo + files = [x.rfilename for x in hinfo.siblings] + location = None + + with TemporaryDirectory(dir=self.config.models_path) as staging: + staging = Path(staging) + if 'model_index.json' in files: + location = self._download_hf_pipeline(repo_id, staging) # pipeline + else: + for suffix in ['safetensors','bin']: + if f'pytorch_lora_weights.{suffix}' in files: + location = self._download_hf_model(repo_id, ['pytorch_lora_weights.bin'], staging) # LoRA + break + elif self.config.precision=='float16' and f'diffusion_pytorch_model.fp16.{suffix}' in files: # vae, controlnet or some other standalone + files = ['config.json', f'diffusion_pytorch_model.fp16.{suffix}'] + location = self._download_hf_model(repo_id, files, staging) + break + elif f'diffusion_pytorch_model.{suffix}' in files: + files = ['config.json', f'diffusion_pytorch_model.{suffix}'] + location = self._download_hf_model(repo_id, files, staging) + break + elif f'learned_embeds.{suffix}' in files: + location = self._download_hf_model(repo_id, [f'learned_embeds.{suffix}'], staging) + break + if not location: + logger.warning(f'Could not determine type of repo {repo_id}. Skipping install.') + return {} + + info = ModelProbe().heuristic_probe(location, self.prediction_helper) + if not info: + logger.warning(f'Could not probe {location}. Skipping install.') + return {} + dest = self.config.models_path / info.base_type.value / info.model_type.value / self._get_model_name(repo_id,location) + if dest.exists(): + shutil.rmtree(dest) + shutil.copytree(location,dest) + return self._install_path(dest, info) + + def _get_model_name(self,path_name: str, location: Path)->str: + ''' + Calculate a name for the model - primitive implementation. + ''' + if key := self.reverse_paths.get(path_name): + (name, base, mtype) = ModelManager.parse_key(key) + return name + else: + return location.stem + + def _make_attributes(self, path: Path, info: ModelProbeInfo)->dict: + model_name = path.name if path.is_dir() else path.stem + description = f'{info.base_type.value} {info.model_type.value} model {model_name}' + if key := self.reverse_paths.get(self.current_id): + if key in self.datasets: + description = self.datasets[key].get('description') or description + + rel_path = self.relative_to_root(path) + + attributes = dict( + path = str(rel_path), + description = str(description), + model_format = info.format, + ) + if info.model_type == ModelType.Main: + attributes.update(dict(variant = info.variant_type,)) + if info.format=="checkpoint": + try: + possible_conf = path.with_suffix('.yaml') + if possible_conf.exists(): + legacy_conf = str(self.relative_to_root(possible_conf)) + elif info.base_type == BaseModelType.StableDiffusion2: + legacy_conf = Path(self.config.legacy_conf_dir, LEGACY_CONFIGS[info.base_type][info.variant_type][info.prediction_type]) + else: + legacy_conf = Path(self.config.legacy_conf_dir, LEGACY_CONFIGS[info.base_type][info.variant_type]) + except KeyError: + legacy_conf = Path(self.config.legacy_conf_dir, 'v1-inference.yaml') # best guess + + attributes.update( + dict( + config = str(legacy_conf) + ) + ) + return attributes + + def relative_to_root(self, path: Path)->Path: + root = self.config.root_path + if path.is_relative_to(root): + return path.relative_to(root) + else: + return path + + def _download_hf_pipeline(self, repo_id: str, staging: Path)->Path: + ''' + This retrieves a StableDiffusion model from cache or remote and then + does a save_pretrained() to the indicated staging area. + ''' + _,name = repo_id.split("/") + revisions = ['fp16','main'] if self.config.precision=='float16' else ['main'] + model = None + for revision in revisions: + try: + model = StableDiffusionPipeline.from_pretrained(repo_id,revision=revision,safety_checker=None) + except: # most errors are due to fp16 not being present. Fix this to catch other errors pass + if model: + break + if not model: + logger.error(f'Diffusers model {repo_id} could not be downloaded. Skipping.') + return None + model.save_pretrained(staging / name, safe_serialization=True) + return staging / name - if scan_at_startup and scan_directory.is_dir(): - update_autoconvert_dir(scan_directory) - else: - update_autoconvert_dir(None) - -def update_autoconvert_dir(autodir: Path): - ''' - Update the "autoconvert_dir" option in invokeai.yaml - ''' - invokeai_config_path = config.init_file_path - conf = OmegaConf.load(invokeai_config_path) - conf.InvokeAI.Paths.autoconvert_dir = str(autodir) if autodir else None - yaml = OmegaConf.to_yaml(conf) - tmpfile = invokeai_config_path.parent / "new_config.tmp" - with open(tmpfile, "w", encoding="utf-8") as outfile: - outfile.write(yaml) - tmpfile.replace(invokeai_config_path) + def _download_hf_model(self, repo_id: str, files: List[str], staging: Path)->Path: + _,name = repo_id.split("/") + location = staging / name + paths = list() + for filename in files: + p = hf_download_with_resume(repo_id, + model_dir=location, + model_name=filename, + access_token = self.access_token + ) + if p: + paths.append(p) + else: + logger.warning(f'Could not download {filename} from {repo_id}.') + + return location if len(paths)>0 else None + @classmethod + def _reverse_paths(cls,datasets)->dict: + ''' + Reverse mapping from repo_id/path to destination name. + ''' + return {v.get('path') or v.get('repo_id') : k for k, v in datasets.items()} # ------------------------------------- def yes_or_no(prompt: str, default_yes=True): @@ -197,133 +405,19 @@ def yes_or_no(prompt: str, default_yes=True): return response[0] in ("y", "Y") # --------------------------------------------- -def recommended_datasets() -> List['str']: - datasets = set() - for ds in initial_models().keys(): - if initial_models()[ds].get("recommended", False): - datasets.add(ds) - return list(datasets) - -# --------------------------------------------- -def default_dataset() -> dict: - datasets = set() - for ds in initial_models().keys(): - if initial_models()[ds].get("default", False): - datasets.add(ds) - return list(datasets) - - -# --------------------------------------------- -def all_datasets() -> dict: - datasets = dict() - for ds in initial_models().keys(): - datasets[ds] = True - return datasets - - -# --------------------------------------------- -# look for legacy model.ckpt in models directory and offer to -# normalize its name -def migrate_models_ckpt(): - model_path = os.path.join(config.root_dir, Model_dir, Weights_dir) - if not os.path.exists(os.path.join(model_path, "model.ckpt")): - return - new_name = initial_models()["stable-diffusion-1.4"]["file"] - logger.warning( - 'The Stable Diffusion v4.1 "model.ckpt" is already installed. The name will be changed to {new_name} to avoid confusion.' - ) - logger.warning(f"model.ckpt => {new_name}") - os.replace( - os.path.join(model_path, "model.ckpt"), os.path.join(model_path, new_name) - ) - - -# --------------------------------------------- -def download_weight_datasets( - models: List[str], access_token: str, precision: str = "float32" -): - migrate_models_ckpt() - successful = dict() - for mod in models: - logger.info(f"Downloading {mod}:") - successful[mod] = _download_repo_or_file( - initial_models()[mod], access_token, precision=precision - ) - return successful - - -def _download_repo_or_file( - mconfig: DictConfig, access_token: str, precision: str = "float32" -) -> Path: - path = None - if mconfig["format"] == "ckpt": - path = _download_ckpt_weights(mconfig, access_token) - else: - path = _download_diffusion_weights(mconfig, access_token, precision=precision) - if "vae" in mconfig and "repo_id" in mconfig["vae"]: - _download_diffusion_weights( - mconfig["vae"], access_token, precision=precision - ) - return path - -def _download_ckpt_weights(mconfig: DictConfig, access_token: str) -> Path: - repo_id = mconfig["repo_id"] - filename = mconfig["file"] - cache_dir = os.path.join(config.root_dir, Model_dir, Weights_dir) - return hf_download_with_resume( - repo_id=repo_id, - model_dir=cache_dir, - model_name=filename, - access_token=access_token, - ) - - -# --------------------------------------------- -def download_from_hf( - model_class: object, model_name: str, **kwargs +def hf_download_from_pretrained( + model_class: object, model_name: str, destination: Path, **kwargs ): logger = InvokeAILogger.getLogger('InvokeAI') logger.addFilter(lambda x: 'fp16 is not a valid' not in x.getMessage()) - path = config.cache_dir model = model_class.from_pretrained( model_name, - cache_dir=path, resume_download=True, **kwargs, ) - model_name = "--".join(("models", *model_name.split("/"))) - return path / model_name if model else None - - -def _download_diffusion_weights( - mconfig: DictConfig, access_token: str, precision: str = "float32" -): - repo_id = mconfig["repo_id"] - model_class = ( - StableDiffusionGeneratorPipeline - if mconfig.get("format", None) == "diffusers" - else AutoencoderKL - ) - extra_arg_list = [{"revision": "fp16"}, {}] if precision == "float16" else [{}] - path = None - for extra_args in extra_arg_list: - try: - path = download_from_hf( - model_class, - repo_id, - safety_checker=None, - **extra_args, - ) - except OSError as e: - if 'Revision Not Found' in str(e): - pass - else: - logger.error(str(e)) - if path: - break - return path - + model.save_pretrained(destination, safe_serialization=True) + return destination # --------------------------------------------- def hf_download_with_resume( @@ -383,128 +477,3 @@ def hf_download_with_resume( return model_dest -# --------------------------------------------- -def update_config_file(successfully_downloaded: dict, config_file: Path): - config_file = ( - Path(config_file) if config_file is not None else default_config_file() - ) - - # In some cases (incomplete setup, etc), the default configs directory might be missing. - # Create it if it doesn't exist. - # this check is ignored if opt.config_file is specified - user is assumed to know what they - # are doing if they are passing a custom config file from elsewhere. - if config_file is default_config_file() and not config_file.parent.exists(): - configs_src = Dataset_path.parent - configs_dest = default_config_file().parent - shutil.copytree(configs_src, configs_dest, dirs_exist_ok=True) - - yaml = new_config_file_contents(successfully_downloaded, config_file) - - try: - backup = None - if os.path.exists(config_file): - logger.warning( - f"{config_file.name} exists. Renaming to {config_file.stem}.yaml.orig" - ) - backup = config_file.with_suffix(".yaml.orig") - ## Ugh. Windows is unable to overwrite an existing backup file, raises a WinError 183 - if sys.platform == "win32" and backup.is_file(): - backup.unlink() - config_file.rename(backup) - - with TemporaryFile() as tmp: - tmp.write(Config_preamble.encode()) - tmp.write(yaml.encode()) - - with open(str(config_file.expanduser().resolve()), "wb") as new_config: - tmp.seek(0) - new_config.write(tmp.read()) - - except Exception as e: - logger.error(f"Error creating config file {config_file}: {str(e)}") - if backup is not None: - logger.info("restoring previous config file") - ## workaround, for WinError 183, see above - if sys.platform == "win32" and config_file.is_file(): - config_file.unlink() - backup.rename(config_file) - return - - logger.info(f"Successfully created new configuration file {config_file}") - - -# --------------------------------------------- -def new_config_file_contents( - successfully_downloaded: dict, - config_file: Path, -) -> str: - if config_file.exists(): - conf = OmegaConf.load(str(config_file.expanduser().resolve())) - else: - conf = OmegaConf.create() - - default_selected = None - for model in successfully_downloaded: - # a bit hacky - what we are doing here is seeing whether a checkpoint - # version of the model was previously defined, and whether the current - # model is a diffusers (indicated with a path) - if conf.get(model) and Path(successfully_downloaded[model]).is_dir(): - delete_weights(model, conf[model]) - - stanza = {} - mod = initial_models()[model] - stanza["description"] = mod["description"] - stanza["repo_id"] = mod["repo_id"] - stanza["format"] = mod["format"] - # diffusers don't need width and height (probably .ckpt doesn't either) - # so we no longer require these in INITIAL_MODELS.yaml - if "width" in mod: - stanza["width"] = mod["width"] - if "height" in mod: - stanza["height"] = mod["height"] - if "file" in mod: - stanza["weights"] = os.path.relpath( - successfully_downloaded[model], start=config.root_dir - ) - stanza["config"] = os.path.normpath( - os.path.join(sd_configs(), mod["config"]) - ) - if "vae" in mod: - if "file" in mod["vae"]: - stanza["vae"] = os.path.normpath( - os.path.join(Model_dir, Weights_dir, mod["vae"]["file"]) - ) - else: - stanza["vae"] = mod["vae"] - if mod.get("default", False): - stanza["default"] = True - default_selected = True - - conf[model] = stanza - - # if no default model was chosen, then we select the first - # one in the list - if not default_selected: - conf[list(successfully_downloaded.keys())[0]]["default"] = True - - return OmegaConf.to_yaml(conf) - - -# --------------------------------------------- -def delete_weights(model_name: str, conf_stanza: dict): - if not (weights := conf_stanza.get("weights")): - return - if re.match("/VAE/", conf_stanza.get("config")): - return - - logger.warning( - f"\nThe checkpoint version of {model_name} is superseded by the diffusers version. Deleting the original file {weights}?" - ) - - weights = Path(weights) - if not weights.is_absolute(): - weights = config.root_dir / weights - try: - weights.unlink() - except OSError as e: - logger.error(str(e)) diff --git a/invokeai/backend/model_management/__init__.py b/invokeai/backend/model_management/__init__.py index e96b064658..e2eef922f4 100644 --- a/invokeai/backend/model_management/__init__.py +++ b/invokeai/backend/model_management/__init__.py @@ -1,7 +1,9 @@ """ Initialization file for invokeai.backend.model_management """ -from .model_manager import ModelManager, ModelInfo +from .model_manager import ModelManager, ModelInfo, AddModelResult, SchedulerPredictionType from .model_cache import ModelCache from .models import BaseModelType, ModelType, SubModelType, ModelVariantType from .lora import ModelPatcher, ONNXModelPatcher +from .model_merge import ModelMerger, MergeInterpolationMethod + diff --git a/invokeai/backend/model_management/convert_ckpt_to_diffusers.py b/invokeai/backend/model_management/convert_ckpt_to_diffusers.py index db099acbb8..e3e64940de 100644 --- a/invokeai/backend/model_management/convert_ckpt_to_diffusers.py +++ b/invokeai/backend/model_management/convert_ckpt_to_diffusers.py @@ -29,8 +29,8 @@ import invokeai.backend.util.logging as logger from invokeai.app.services.config import InvokeAIAppConfig from .model_manager import ModelManager -from .model_cache import ModelCache -from .models import SchedulerPredictionType, BaseModelType, ModelVariantType +from picklescan.scanner import scan_file_path +from .models import BaseModelType, ModelVariantType try: from omegaconf import OmegaConf @@ -73,7 +73,9 @@ from transformers import ( from ..stable_diffusion import StableDiffusionGeneratorPipeline -MODEL_ROOT = None +# TODO: redo in future +#CONVERT_MODEL_ROOT = InvokeAIAppConfig.get_config().models_path / "core" / "convert" +CONVERT_MODEL_ROOT = InvokeAIAppConfig.get_config().root_path / "models" / "core" / "convert" def shave_segments(path, n_shave_prefix_segments=1): """ @@ -159,17 +161,17 @@ def renew_vae_attention_paths(old_list, n_shave_prefix_segments=0): new_item = new_item.replace("norm.weight", "group_norm.weight") new_item = new_item.replace("norm.bias", "group_norm.bias") - new_item = new_item.replace("q.weight", "query.weight") - new_item = new_item.replace("q.bias", "query.bias") + new_item = new_item.replace("q.weight", "to_q.weight") + new_item = new_item.replace("q.bias", "to_q.bias") - new_item = new_item.replace("k.weight", "key.weight") - new_item = new_item.replace("k.bias", "key.bias") + new_item = new_item.replace("k.weight", "to_k.weight") + new_item = new_item.replace("k.bias", "to_k.bias") - new_item = new_item.replace("v.weight", "value.weight") - new_item = new_item.replace("v.bias", "value.bias") + new_item = new_item.replace("v.weight", "to_v.weight") + new_item = new_item.replace("v.bias", "to_v.bias") - new_item = new_item.replace("proj_out.weight", "proj_attn.weight") - new_item = new_item.replace("proj_out.bias", "proj_attn.bias") + new_item = new_item.replace("proj_out.weight", "to_out.0.weight") + new_item = new_item.replace("proj_out.bias", "to_out.0.bias") new_item = shave_segments( new_item, n_shave_prefix_segments=n_shave_prefix_segments @@ -184,7 +186,6 @@ def assign_to_checkpoint( paths, checkpoint, old_checkpoint, - attention_paths_to_split=None, additional_replacements=None, config=None, ): @@ -199,35 +200,9 @@ def assign_to_checkpoint( paths, list ), "Paths should be a list of dicts containing 'old' and 'new' keys." - # Splits the attention layers into three variables. - if attention_paths_to_split is not None: - for path, path_map in attention_paths_to_split.items(): - old_tensor = old_checkpoint[path] - channels = old_tensor.shape[0] // 3 - - target_shape = (-1, channels) if len(old_tensor.shape) == 3 else (-1) - - num_heads = old_tensor.shape[0] // config["num_head_channels"] // 3 - - old_tensor = old_tensor.reshape( - (num_heads, 3 * channels // num_heads) + old_tensor.shape[1:] - ) - query, key, value = old_tensor.split(channels // num_heads, dim=1) - - checkpoint[path_map["query"]] = query.reshape(target_shape) - checkpoint[path_map["key"]] = key.reshape(target_shape) - checkpoint[path_map["value"]] = value.reshape(target_shape) - for path in paths: new_path = path["new"] - # These have already been assigned - if ( - attention_paths_to_split is not None - and new_path in attention_paths_to_split - ): - continue - # Global renaming happens here new_path = new_path.replace("middle_block.0", "mid_block.resnets.0") new_path = new_path.replace("middle_block.1", "mid_block.attentions.0") @@ -246,14 +221,14 @@ def assign_to_checkpoint( def conv_attn_to_linear(checkpoint): keys = list(checkpoint.keys()) - attn_keys = ["query.weight", "key.weight", "value.weight"] + attn_keys = ["to_q.weight", "to_k.weight", "to_v.weight"] for key in keys: if ".".join(key.split(".")[-2:]) in attn_keys: if checkpoint[key].ndim > 2: checkpoint[key] = checkpoint[key][:, :, 0, 0] - elif "proj_attn.weight" in key: + elif "to_out.0.weight" in key: if checkpoint[key].ndim > 2: - checkpoint[key] = checkpoint[key][:, :, 0] + checkpoint[key] = checkpoint[key][:, :, 0, 0] def create_unet_diffusers_config(original_config, image_size: int): @@ -632,7 +607,7 @@ def convert_ldm_vae_checkpoint(checkpoint, config): else: vae_state_dict = checkpoint - new_checkpoint = convert_ldm_vae_state_dict(vae_state_dict,config) + new_checkpoint = convert_ldm_vae_state_dict(vae_state_dict, config) return new_checkpoint def convert_ldm_vae_state_dict(vae_state_dict, config): @@ -855,7 +830,7 @@ def convert_ldm_bert_checkpoint(checkpoint, config): def convert_ldm_clip_checkpoint(checkpoint): - text_model = CLIPTextModel.from_pretrained(MODEL_ROOT / 'clip-vit-large-patch14') + text_model = CLIPTextModel.from_pretrained(CONVERT_MODEL_ROOT / 'clip-vit-large-patch14') keys = list(checkpoint.keys()) text_model_dict = {} @@ -909,7 +884,7 @@ textenc_pattern = re.compile("|".join(protected.keys())) def convert_open_clip_checkpoint(checkpoint): text_model = CLIPTextModel.from_pretrained( - MODEL_ROOT / 'stable-diffusion-2-clip', + CONVERT_MODEL_ROOT / 'stable-diffusion-2-clip', subfolder='text_encoder', ) @@ -976,7 +951,7 @@ def convert_open_clip_checkpoint(checkpoint): return text_model -def replace_checkpoint_vae(checkpoint, vae_path:str): +def replace_checkpoint_vae(checkpoint, vae_path: str): if vae_path.endswith(".safetensors"): vae_ckpt = load_file(vae_path) else: @@ -986,7 +961,7 @@ def replace_checkpoint_vae(checkpoint, vae_path:str): new_key = f'first_stage_model.{vae_key}' checkpoint[new_key] = state_dict[vae_key] -def convert_ldm_vae_to_diffusers(checkpoint, vae_config: DictConfig, image_size: int)->AutoencoderKL: +def convert_ldm_vae_to_diffusers(checkpoint, vae_config: DictConfig, image_size: int) -> AutoencoderKL: vae_config = create_vae_diffusers_config( vae_config, image_size=image_size ) @@ -1006,8 +981,6 @@ def load_pipeline_from_original_stable_diffusion_ckpt( original_config_file: str, extract_ema: bool = True, precision: torch.dtype = torch.float32, - upcast_attention: bool = False, - prediction_type: SchedulerPredictionType = SchedulerPredictionType.Epsilon, scan_needed: bool = True, ) -> StableDiffusionPipeline: """ @@ -1021,8 +994,6 @@ def load_pipeline_from_original_stable_diffusion_ckpt( :param checkpoint_path: Path to `.ckpt` file. :param original_config_file: Path to `.yaml` config file corresponding to the original architecture. If `None`, will be automatically inferred by looking for a key that only exists in SD2.0 models. - :param prediction_type: The prediction type that the model was trained on. Use `'epsilon'` for Stable Diffusion - v1.X and Stable Diffusion v2 Base. Use `'v-prediction'` for Stable Diffusion v2. :param scheduler_type: Type of scheduler to use. Should be one of `["pndm", "lms", "heun", "euler", "euler-ancestral", "dpm", "ddim"]`. :param model_type: The pipeline type. `None` to automatically infer, or one of `["FrozenOpenCLIPEmbedder", "FrozenCLIPEmbedder"]`. :param extract_ema: Only relevant for @@ -1030,21 +1001,23 @@ def load_pipeline_from_original_stable_diffusion_ckpt( or not. Defaults to `False`. Pass `True` to extract the EMA weights. EMA weights usually yield higher quality images for inference. Non-EMA weights are usually better to continue fine-tuning. :param precision: precision to use - torch.float16, torch.float32 or torch.autocast - :param upcast_attention: Whether the attention computation should always be upcasted. This is necessary when - running stable diffusion 2.1. """ - config = InvokeAIAppConfig.get_config() + if not isinstance(checkpoint_path, Path): + checkpoint_path = Path(checkpoint_path) with warnings.catch_warnings(): warnings.simplefilter("ignore") verbosity = dlogging.get_verbosity() dlogging.set_verbosity_error() - if str(checkpoint_path).endswith(".safetensors"): + if checkpoint_path.suffix == ".safetensors": checkpoint = load_file(checkpoint_path) else: if scan_needed: - ModelCache.scan_model(checkpoint_path, checkpoint_path) + # scan model + scan_result = scan_file_path(checkpoint_path) + if scan_result.infected_files != 0: + raise "The model {checkpoint_path} is potentially infected by malware. Aborting import." checkpoint = torch.load(checkpoint_path) # sometimes there is a state_dict key and sometimes not @@ -1053,9 +1026,13 @@ def load_pipeline_from_original_stable_diffusion_ckpt( original_config = OmegaConf.load(original_config_file) - if model_version == BaseModelType.StableDiffusion2 and prediction_type == SchedulerPredictionType.VPrediction: + if model_version == BaseModelType.StableDiffusion2 and original_config["model"]["params"]["parameterization"] == "v": + prediction_type = "v_prediction" + upcast_attention = True image_size = 768 else: + prediction_type = "epsilon" + upcast_attention = False image_size = 512 # @@ -1110,7 +1087,7 @@ def load_pipeline_from_original_stable_diffusion_ckpt( if model_type == "FrozenOpenCLIPEmbedder": text_model = convert_open_clip_checkpoint(checkpoint) tokenizer = CLIPTokenizer.from_pretrained( - MODEL_ROOT / 'stable-diffusion-2-clip', + CONVERT_MODEL_ROOT / 'stable-diffusion-2-clip', subfolder='tokenizer', ) pipe = StableDiffusionPipeline( @@ -1126,9 +1103,9 @@ def load_pipeline_from_original_stable_diffusion_ckpt( elif model_type in ["FrozenCLIPEmbedder", "WeightedFrozenCLIPEmbedder"]: text_model = convert_ldm_clip_checkpoint(checkpoint) - tokenizer = CLIPTokenizer.from_pretrained(MODEL_ROOT / 'clip-vit-large-patch14') - safety_checker = StableDiffusionSafetyChecker.from_pretrained(MODEL_ROOT / 'stable-diffusion-safety-checker') - feature_extractor = AutoFeatureExtractor.from_pretrained(MODEL_ROOT / 'stable-diffusion-safety-checker') + tokenizer = CLIPTokenizer.from_pretrained(CONVERT_MODEL_ROOT / 'clip-vit-large-patch14') + safety_checker = StableDiffusionSafetyChecker.from_pretrained(CONVERT_MODEL_ROOT / 'stable-diffusion-safety-checker') + feature_extractor = AutoFeatureExtractor.from_pretrained(CONVERT_MODEL_ROOT / 'stable-diffusion-safety-checker') pipe = StableDiffusionPipeline( vae=vae.to(precision), text_encoder=text_model.to(precision), @@ -1142,7 +1119,7 @@ def load_pipeline_from_original_stable_diffusion_ckpt( else: text_config = create_ldm_bert_config(original_config) text_model = convert_ldm_bert_checkpoint(checkpoint, text_config) - tokenizer = BertTokenizerFast.from_pretrained(MODEL_ROOT / "bert-base-uncased") + tokenizer = BertTokenizerFast.from_pretrained(CONVERT_MODEL_ROOT / "bert-base-uncased") pipe = LDMTextToImagePipeline( vqvae=vae, bert=text_model, @@ -1158,7 +1135,6 @@ def load_pipeline_from_original_stable_diffusion_ckpt( def convert_ckpt_to_diffusers( checkpoint_path: Union[str, Path], dump_path: Union[str, Path], - model_root: Union[str, Path], **kwargs, ): """ @@ -1166,9 +1142,6 @@ def convert_ckpt_to_diffusers( and in addition a path-like object indicating the location of the desired diffusers model to be written. """ - # setting global here to avoid massive changes late at night - global MODEL_ROOT - MODEL_ROOT = Path(model_root) / 'core/convert' pipe = load_pipeline_from_original_stable_diffusion_ckpt(checkpoint_path, **kwargs) pipe.save_pretrained( diff --git a/invokeai/backend/model_management/lora.py b/invokeai/backend/model_management/lora.py index b6187469c5..37e5a6fa40 100644 --- a/invokeai/backend/model_management/lora.py +++ b/invokeai/backend/model_management/lora.py @@ -1,9 +1,9 @@ from __future__ import annotations import copy -from pathlib import Path from contextlib import contextmanager -from typing import Optional, Dict, Tuple, Any +from typing import Optional, Dict, Tuple, Any, Union, List +from pathlib import Path import torch from safetensors.torch import load_file @@ -16,6 +16,9 @@ from onnxruntime import OrtValue import numpy as np from compel.embeddings_provider import BaseTextualInversionManager +from diffusers.models import UNet2DConditionModel +from safetensors.torch import load_file +from transformers import CLIPTextModel, CLIPTokenizer # TODO: rename and split this file @@ -129,8 +132,8 @@ class LoRALayer(LoRALayerBase): def get_weight(self): if self.mid is not None: - up = self.up.reshape(up.shape[0], up.shape[1]) - down = self.down.reshape(up.shape[0], up.shape[1]) + up = self.up.reshape(self.up.shape[0], self.up.shape[1]) + down = self.down.reshape(self.down.shape[0], self.down.shape[1]) weight = torch.einsum("m n w h, i m, n j -> i j w h", self.mid, up, down) else: weight = self.up.reshape(self.up.shape[0], -1) @ self.down.reshape(self.down.shape[0], -1) @@ -171,7 +174,7 @@ class LoHALayer(LoRALayerBase): layer_key: str, values: dict, ): - super().__init__(module_key, rank, alpha, bias) + super().__init__(layer_key, values) self.w1_a = values["hada_w1_a"] self.w1_b = values["hada_w1_b"] @@ -244,7 +247,7 @@ class LoKRLayer(LoRALayerBase): layer_key: str, values: dict, ): - super().__init__(module_key, rank, alpha, bias) + super().__init__(layer_key, values) if "lokr_w1" in values: self.w1 = values["lokr_w1"] @@ -291,7 +294,7 @@ class LoKRLayer(LoRALayerBase): if len(w2.shape) == 4: w1 = w1.unsqueeze(2).unsqueeze(2) w2 = w2.contiguous() - weight = torch.kron(w1, w2)#.reshape(module.weight.shape) # TODO: can we remove reshape? + weight = torch.kron(w1, w2) return weight @@ -416,7 +419,7 @@ class LoRAModel: #(torch.nn.Module): else: # TODO: diff/ia3/... format print( - f">> Encountered unknown lora layer module in {self.name}: {layer_key}" + f">> Encountered unknown lora layer module in {model.name}: {layer_key}" ) return @@ -476,7 +479,7 @@ class ModelPatcher: submodule_name += "_" + key_parts.pop(0) module = module.get_submodule(submodule_name) - module_key = module_key.rstrip(".") + module_key = (module_key + "." + submodule_name).lstrip(".") return (module_key, module) @@ -530,23 +533,37 @@ class ModelPatcher: loras: List[Tuple[LoraModel, float]], prefix: str, ): - hooks = dict() + original_weights = dict() try: - for lora, lora_weight in loras: - for layer_key, layer in lora.layers.items(): - if not layer_key.startswith(prefix): - continue + with torch.no_grad(): + for lora, lora_weight in loras: + #assert lora.device.type == "cpu" + for layer_key, layer in lora.layers.items(): + if not layer_key.startswith(prefix): + continue - module_key, module = cls._resolve_lora_key(model, layer_key, prefix) - if module_key not in hooks: - hooks[module_key] = module.register_forward_hook(cls._lora_forward_hook(loras, layer_key)) + module_key, module = cls._resolve_lora_key(model, layer_key, prefix) + if module_key not in original_weights: + original_weights[module_key] = module.weight.detach().to(device="cpu", copy=True) + + # enable autocast to calc fp16 loras on cpu + #with torch.autocast(device_type="cpu"): + layer.to(dtype=torch.float32) + layer_scale = layer.alpha / layer.rank if (layer.alpha and layer.rank) else 1.0 + layer_weight = layer.get_weight() * lora_weight * layer_scale + + if module.weight.shape != layer_weight.shape: + # TODO: debug on lycoris + layer_weight = layer_weight.reshape(module.weight.shape) + + module.weight += layer_weight.to(device=module.weight.device, dtype=module.weight.dtype) yield # wait for context manager exit finally: - for module_key, hook in hooks.items(): - hook.remove() - hooks.clear() + with torch.no_grad(): + for module_key, weight in original_weights.items(): + model.get_submodule(module_key).weight.copy_(weight) @classmethod @@ -596,7 +613,7 @@ class ModelPatcher: f"Cannot load embedding for {trigger}. It was trained on a model with token dimension {embedding.shape[0]}, but the current model has token dimension {model_embeddings.weight.data[token_id].shape[0]}." ) - model_embeddings.weight.data[token_id] = embedding + model_embeddings.weight.data[token_id] = embedding.to(device=text_encoder.device, dtype=text_encoder.dtype) ti_tokens.append(token_id) if len(ti_tokens) > 1: @@ -609,6 +626,24 @@ class ModelPatcher: text_encoder.resize_token_embeddings(init_tokens_count) + @classmethod + @contextmanager + def apply_clip_skip( + cls, + text_encoder: CLIPTextModel, + clip_skip: int, + ): + skipped_layers = [] + try: + for i in range(clip_skip): + skipped_layers.append(text_encoder.text_model.encoder.layers.pop(-1)) + + yield + + finally: + while len(skipped_layers) > 0: + text_encoder.text_model.encoder.layers.append(skipped_layers.pop()) + class TextualInversionModel: name: str embedding: torch.Tensor # [n, 768]|[n, 1280] @@ -647,6 +682,9 @@ class TextualInversionModel: else: result.embedding = next(iter(state_dict.values())) + if len(result.embedding.shape) == 1: + result.embedding = result.embedding.unsqueeze(0) + if not isinstance(result.embedding, torch.Tensor): raise ValueError(f"Invalid embeddings file: {file_path.name}") diff --git a/invokeai/backend/model_management/model_cache.py b/invokeai/backend/model_management/model_cache.py index 77b6ac5115..e4cba3517e 100644 --- a/invokeai/backend/model_management/model_cache.py +++ b/invokeai/backend/model_management/model_cache.py @@ -8,7 +8,7 @@ The cache returns context manager generators designed to load the model into the GPU within the context, and unload outside the context. Use like this: - cache = ModelCache(max_models_cached=6) + cache = ModelCache(max_cache_size=7.5) with cache.get_model('runwayml/stable-diffusion-1-5') as SD1, cache.get_model('stabilityai/stable-diffusion-2') as SD2: do_something_in_GPU(SD1,SD2) @@ -36,6 +36,9 @@ from .models import BaseModelType, ModelType, SubModelType, ModelBase # Default is roughly enough to hold three fp16 diffusers models in RAM simultaneously DEFAULT_MAX_CACHE_SIZE = 6.0 +# amount of GPU memory to hold in reserve for use by generations (GB) +DEFAULT_MAX_VRAM_CACHE_SIZE= 2.75 + # actual size of a gig GIG = 1073741824 @@ -82,6 +85,7 @@ class ModelCache(object): def __init__( self, max_cache_size: float=DEFAULT_MAX_CACHE_SIZE, + max_vram_cache_size: float=DEFAULT_MAX_VRAM_CACHE_SIZE, execution_device: torch.device=torch.device('cuda'), storage_device: torch.device=torch.device('cpu'), precision: torch.dtype=torch.float16, @@ -91,7 +95,7 @@ class ModelCache(object): logger: types.ModuleType = logger ): ''' - :param max_models: Maximum number of models to cache in CPU RAM [4] + :param max_cache_size: Maximum size of the RAM cache [6.0 GB] :param execution_device: Torch device to load active model into [torch.device('cuda')] :param storage_device: Torch device to save inactive model in [torch.device('cpu')] :param precision: Precision for loaded models [torch.float16] @@ -99,14 +103,11 @@ class ModelCache(object): :param sequential_offload: Conserve VRAM by loading and unloading each stage of the pipeline sequentially :param sha_chunksize: Chunksize to use when calculating sha256 model hash ''' - #max_cache_size = 9999 - execution_device = torch.device('cuda') - self.model_infos: Dict[str, ModelBase] = dict() self.lazy_offloading = lazy_offloading - #self.sequential_offload: bool=sequential_offload self.precision: torch.dtype=precision - self.max_cache_size: int=max_cache_size + self.max_cache_size: float=max_cache_size + self.max_vram_cache_size: float=max_vram_cache_size self.execution_device: torch.device=execution_device self.storage_device: torch.device=storage_device self.sha_chunksize=sha_chunksize @@ -128,16 +129,6 @@ class ModelCache(object): key += f":{submodel_type}" return key - #def get_model( - # self, - # repo_id_or_path: Union[str, Path], - # model_type: ModelType = ModelType.Diffusers, - # subfolder: Path = None, - # submodel: ModelType = None, - # revision: str = None, - # attach_model_part: Tuple[ModelType, str] = (None, None), - # gpu_load: bool = True, - #) -> ModelLocker: # ?? what does it return def _get_model_info( self, model_path: str, @@ -213,14 +204,22 @@ class ModelCache(object): self._cache_stack.remove(key) self._cache_stack.append(key) - return self.ModelLocker(self, key, cache_entry.model, gpu_load) + return self.ModelLocker(self, key, cache_entry.model, gpu_load, cache_entry.size) class ModelLocker(object): - def __init__(self, cache, key, model, gpu_load): + def __init__(self, cache, key, model, gpu_load, size_needed): + ''' + :param cache: The model_cache object + :param key: The key of the model to lock in GPU + :param model: The model to lock + :param gpu_load: True if load into gpu + :param size_needed: Size of the model to load + ''' self.gpu_load = gpu_load self.cache = cache self.key = key self.model = model + self.size_needed = size_needed self.cache_entry = self.cache._cached_models[self.key] def __enter__(self) -> Any: @@ -234,7 +233,7 @@ class ModelCache(object): try: if self.cache.lazy_offloading: - self.cache._offload_unlocked_models() + self.cache._offload_unlocked_models(self.size_needed) if self.model.device != self.cache.execution_device: self.cache.logger.debug(f'Moving {self.key} into {self.cache.execution_device}') @@ -349,12 +348,20 @@ class ModelCache(object): self.logger.debug(f"After unloading: cached_models={len(self._cached_models)}") - - def _offload_unlocked_models(self): - for model_key, cache_entry in self._cached_models.items(): + def _offload_unlocked_models(self, size_needed: int=0): + reserved = self.max_vram_cache_size * GIG + vram_in_use = torch.cuda.memory_allocated() + self.logger.debug(f'{(vram_in_use/GIG):.2f}GB VRAM used for models; max allowed={(reserved/GIG):.2f}GB') + for model_key, cache_entry in sorted(self._cached_models.items(), key=lambda x:x[1].size): + if vram_in_use <= reserved: + break if not cache_entry.locked and cache_entry.loaded: self.logger.debug(f'Offloading {model_key} from {self.execution_device} into {self.storage_device}') - cache_entry.model.to(self.storage_device) + with VRAMUsage() as mem: + cache_entry.model.to(self.storage_device) + self.logger.debug(f'GPU VRAM freed: {(mem.vram_used/GIG):.2f} GB') + vram_in_use += mem.vram_used # note vram_used is negative + self.logger.debug(f'{(vram_in_use/GIG):.2f}GB VRAM used for models; max allowed={(reserved/GIG):.2f}GB') def _local_model_hash(self, model_path: Union[str, Path]) -> str: sha = hashlib.sha256() diff --git a/invokeai/backend/model_management/model_install.py b/invokeai/backend/model_management/model_install.py deleted file mode 100644 index 64c52185f3..0000000000 --- a/invokeai/backend/model_management/model_install.py +++ /dev/null @@ -1,118 +0,0 @@ -""" -Routines for downloading and installing models. -""" -import json -import safetensors -import safetensors.torch -import shutil -import tempfile -import torch -import traceback -from dataclasses import dataclass -from diffusers import ModelMixin -from enum import Enum -from typing import Callable -from pathlib import Path - -import invokeai.backend.util.logging as logger -from invokeai.app.services.config import InvokeAIAppConfig -from . import ModelManager -from .models import BaseModelType, ModelType, VariantType -from .model_probe import ModelProbe, ModelVariantInfo -from .model_cache import SilenceWarnings - -class ModelInstall(object): - ''' - This class is able to download and install several different kinds of - InvokeAI models. The helper function, if provided, is called on to distinguish - between v2-base and v2-768 stable diffusion pipelines. This usually involves - asking the user to select the proper type, as there is no way of distinguishing - the two type of v2 file programmatically (as far as I know). - ''' - def __init__(self, - config: InvokeAIAppConfig, - model_base_helper: Callable[[Path],BaseModelType]=None, - clobber:bool = False - ): - ''' - :param config: InvokeAI configuration object - :param model_base_helper: A function call that accepts the Path to a checkpoint model and returns a ModelType enum - :param clobber: If true, models with colliding names will be overwritten - ''' - self.config = config - self.clogger = clobber - self.helper = model_base_helper - self.prober = ModelProbe() - - def install_checkpoint_file(self, checkpoint: Path)->dict: - ''' - Install the checkpoint file at path and return a - configuration entry that can be added to `models.yaml`. - Model checkpoints and VAEs will be converted into - diffusers before installation. Note that the model manager - does not hold entries for anything but diffusers pipelines, - and the configuration file stanzas returned from such models - can be safely ignored. - ''' - model_info = self.prober.probe(checkpoint, self.helper) - if not model_info: - raise ValueError(f"Unable to determine type of checkpoint file {checkpoint}") - - key = ModelManager.create_key( - model_name = checkpoint.stem, - base_model = model_info.base_type, - model_type = model_info.model_type, - ) - destination_path = self._dest_path(model_info) / checkpoint - destination_path.parent.mkdir(parents=True, exist_ok=True) - self._check_for_collision(destination_path) - stanza = { - key: dict( - name = checkpoint.stem, - description = f'{model_info.model_type} model {checkpoint.stem}', - base = model_info.base_model.value, - type = model_info.model_type.value, - variant = model_info.variant_type.value, - path = str(destination_path), - ) - } - - # non-pipeline; no conversion needed, just copy into right place - if model_info.model_type != ModelType.Pipeline: - shutil.copyfile(checkpoint, destination_path) - stanza[key].update({'format': 'checkpoint'}) - - # pipeline - conversion needed here - else: - destination_path = self._dest_path(model_info) / checkpoint.stem - config_file = self._pipeline_type_to_config_file(model_info.model_type) - - from .convert_ckpt_to_diffusers import convert_ckpt_to_diffusers - with SilenceWarnings: - convert_ckpt_to_diffusers( - checkpoint, - destination_path, - extract_ema=True, - original_config_file=config_file, - scan_needed=False, - ) - stanza[key].update({'format': 'folder', - 'path': destination_path, # no suffix on this - }) - - return stanza - - - def _check_for_collision(self, path: Path): - if not path.exists(): - return - if self.clobber: - shutil.rmtree(path) - else: - raise ValueError(f"Destination {path} already exists. Won't overwrite unless clobber=True.") - - def _staging_directory(self)->tempfile.TemporaryDirectory: - return tempfile.TemporaryDirectory(dir=self.config.root_path) - - - diff --git a/invokeai/backend/model_management/model_manager.py b/invokeai/backend/model_management/model_manager.py index f9a66a87dd..0476425c8b 100644 --- a/invokeai/backend/model_management/model_manager.py +++ b/invokeai/backend/model_management/model_manager.py @@ -1,53 +1,209 @@ """This module manages the InvokeAI `models.yaml` file, mapping -symbolic diffusers model names to the paths and repo_ids used -by the underlying `from_pretrained()` call. +symbolic diffusers model names to the paths and repo_ids used by the +underlying `from_pretrained()` call. -For fetching models, use manager.get_model('symbolic name'). This will -return a ModelInfo object that contains the following attributes: - - * context -- a context manager Generator that loads and locks the - model into GPU VRAM and returns the model for use. - See below for usage. - * name -- symbolic name of the model - * type -- SubModelType of the model - * hash -- unique hash for the model - * location -- path or repo_id of the model - * revision -- revision of the model if coming from a repo id, - e.g. 'fp16' - * precision -- torch precision of the model +SYNOPSIS: -Typical usage: + mgr = ModelManager('/home/phi/invokeai/configs/models.yaml') + sd1_5 = mgr.get_model('stable-diffusion-v1-5', + model_type=ModelType.Main, + base_model=BaseModelType.StableDiffusion1, + submodel_type=SubModelType.Unet) + with sd1_5 as unet: + run_some_inference(unet) - from invokeai.backend import ModelManager +FETCHING MODELS: - manager = ModelManager( - config='./configs/models.yaml', - max_cache_size=8 - ) # gigabytes +Models are described using four attributes: - model_info = manager.get_model('stable-diffusion-1.5', SubModelType.Diffusers) - with model_info.context as my_model: - my_model.latents_from_embeddings(...) + 1) model_name -- the symbolic name for the model -The manager uses the underlying ModelCache class to keep -frequently-used models in RAM and move them into GPU as needed for -generation operations. The optional `max_cache_size` argument -indicates the maximum size the cache can grow to, in gigabytes. The -underlying ModelCache object can be accessed using the manager's "cache" -attribute. + 2) ModelType -- an enum describing the type of the model. Currently + defined types are: + ModelType.Main -- a full model capable of generating images + ModelType.Vae -- a VAE model + ModelType.Lora -- a LoRA or LyCORIS fine-tune + ModelType.TextualInversion -- a textual inversion embedding + ModelType.ControlNet -- a ControlNet model -Because the model manager can return multiple different types of -models, you may wish to add additional type checking on the class -of model returned. To do this, provide the option `model_type` -parameter: + 3) BaseModelType -- an enum indicating the stable diffusion base model, one of: + BaseModelType.StableDiffusion1 + BaseModelType.StableDiffusion2 - model_info = manager.get_model( - 'clip-tokenizer', - model_type=SubModelType.Tokenizer - ) + 4) SubModelType (optional) -- an enum that refers to one of the submodels contained + within the main model. Values are: -This will raise an InvalidModelError if the format defined in the -config file doesn't match the requested model type. + SubModelType.UNet + SubModelType.TextEncoder + SubModelType.Tokenizer + SubModelType.Scheduler + SubModelType.SafetyChecker + +To fetch a model, use `manager.get_model()`. This takes the symbolic +name of the model, the ModelType, the BaseModelType and the +SubModelType. The latter is required for ModelType.Main. + +get_model() will return a ModelInfo object that can then be used in +context to retrieve the model and move it into GPU VRAM (on GPU +systems). + +A typical example is: + + sd1_5 = mgr.get_model('stable-diffusion-v1-5', + model_type=ModelType.Main, + base_model=BaseModelType.StableDiffusion1, + submodel_type=SubModelType.UNet) + with sd1_5 as unet: + run_some_inference(unet) + +The ModelInfo object provides a number of useful fields describing the +model, including: + + name -- symbolic name of the model + base_model -- base model (BaseModelType) + type -- model type (ModelType) + location -- path to the model file + precision -- torch precision of the model + hash -- unique sha256 checksum for this model + +SUBMODELS: + +When fetching a main model, you must specify the submodel. Retrieval +of full pipelines is not supported. + + vae_info = mgr.get_model('stable-diffusion-1.5', + model_type = ModelType.Main, + base_model = BaseModelType.StableDiffusion1, + submodel_type = SubModelType.Vae + ) + with vae_info as vae: + do_something(vae) + +This rule does not apply to controlnets, embeddings, loras and standalone +VAEs, which do not have submodels. + +LISTING MODELS + +The model_names() method will return a list of Tuples describing each +model it knows about: + + >> mgr.model_names() + [ + ('stable-diffusion-1.5', , ), + ('stable-diffusion-2.1', , ), + ('inpaint', , ) + ('Ink scenery', , ) + ... + ] + +The tuple is in the correct order to pass to get_model(): + + for m in mgr.model_names(): + info = get_model(*m) + +In contrast, the list_models() method returns a list of dicts, each +providing information about a model defined in models.yaml. For example: + + >>> models = mgr.list_models() + >>> json.dumps(models[0]) + {"path": "/home/lstein/invokeai-main/models/sd-1/controlnet/canny", + "model_format": "diffusers", + "name": "canny", + "base_model": "sd-1", + "type": "controlnet" + } + +You can filter by model type and base model as shown here: + + + controlnets = mgr.list_models(model_type=ModelType.ControlNet, + base_model=BaseModelType.StableDiffusion1) + for c in controlnets: + name = c['name'] + format = c['model_format'] + path = c['path'] + type = c['type'] + # etc + +ADDING AND REMOVING MODELS + +At startup time, the `models` directory will be scanned for +checkpoints, diffusers pipelines, controlnets, LoRAs and TI +embeddings. New entries will be added to the model manager and defunct +ones removed. Anything that is a main model (ModelType.Main) will be +added to models.yaml. For scanning to succeed, files need to be in +their proper places. For example, a controlnet folder built on the +stable diffusion 2 base, will need to be placed in +`models/sd-2/controlnet`. + +Layout of the `models` directory: + + models + ├── sd-1 + │   ├── controlnet + │   ├── lora + │   ├── main + │   └── embedding + ├── sd-2 + │   ├── controlnet + │   ├── lora + │   ├── main + │ └── embedding + └── core + ├── face_reconstruction + │ ├── codeformer + │ └── gfpgan + ├── sd-conversion + │ ├── clip-vit-large-patch14 - tokenizer, text_encoder subdirs + │ ├── stable-diffusion-2 - tokenizer, text_encoder subdirs + │ └── stable-diffusion-safety-checker + └── upscaling + └─── esrgan + + + +class ConfigMeta(BaseModel):Loras, textual_inversion and controlnet models are not listed +explicitly in models.yaml, but are added to the in-memory data +structure at initialization time by scanning the models directory. The +in-memory data structure can be resynchronized by calling +`manager.scan_models_directory()`. + +Files and folders placed inside the `autoimport` paths (paths +defined in `invokeai.yaml`) will also be scanned for new models at +initialization time and added to `models.yaml`. Files will not be +moved from this location but preserved in-place. These directories +are: + + configuration default description + ------------- ------- ----------- + autoimport_dir autoimport/main main models + lora_dir autoimport/lora LoRA/LyCORIS models + embedding_dir autoimport/embedding TI embeddings + controlnet_dir autoimport/controlnet ControlNet models + +In actuality, models located in any of these directories are scanned +to determine their type, so it isn't strictly necessary to organize +the different types in this way. This entry in `invokeai.yaml` will +recursively scan all subdirectories within `autoimport`, scan models +files it finds, and import them if recognized. + + Paths: + autoimport_dir: autoimport + +A model can be manually added using `add_model()` using the model's +name, base model, type and a dict of model attributes. See +`invokeai/backend/model_management/models` for the attributes required +by each model type. + +A model can be deleted using `del_model()`, providing the same +identifying information as `get_model()` + +The `heuristic_import()` method will take a set of strings +corresponding to local paths, remote URLs, and repo_ids, probe the +object to determine what type of model it is (if any), and import new +models into the manager. If passed a directory, it will recursively +scan it for models to import. The return value is a set of the models +successfully added. MODELS.YAML @@ -56,93 +212,18 @@ The general format of a models.yaml section is: type-of-model/name-of-model: path: /path/to/local/file/or/directory description: a description - format: folder|ckpt|safetensors|pt - base: SD-1|SD-2 - subfolder: subfolder-name + format: diffusers|checkpoint + variant: normal|inpaint|depth The type of model is given in the stanza key, and is one of -{diffusers, ckpt, vae, text_encoder, tokenizer, unet, scheduler, -safety_checker, feature_extractor, lora, textual_inversion, -controlnet}, and correspond to items in the SubModelType enum defined -in model_cache.py +{main, vae, lora, controlnet, textual} -The format indicates whether the model is organized as a folder with -model subdirectories, or is contained in a single checkpoint or -safetensors file. +The format indicates whether the model is organized as a diffusers +folder with model subdirectories, or is contained in a single +checkpoint or safetensors file. -One, but not both, of repo_id and path are provided. repo_id is the -HuggingFace repository ID of the model, and path points to the file or -directory on disk. - -If subfolder is provided, then the model exists in a subdirectory of -the main model. These are usually named after the model type, such as -"unet". - -This example summarizes the two ways of getting a non-diffuser model: - - text_encoder/clip-test-1: - format: folder - path: /path/to/folder - description: Returns standalone CLIPTextModel - - text_encoder/clip-test-2: - format: folder - repo_id: /path/to/folder - subfolder: text_encoder - description: Returns the text_encoder in the subfolder of the diffusers model (just the encoder in RAM) - -SUBMODELS: - -It is also possible to fetch an isolated submodel from a diffusers -model. Use the `submodel` parameter to select which part: - - vae = manager.get_model('stable-diffusion-1.5',submodel=SubModelType.Vae) - with vae.context as my_vae: - print(type(my_vae)) - # "AutoencoderKL" - -DIRECTORY_SCANNING: - -Loras, textual_inversion and controlnet models are usually not listed -explicitly in models.yaml, but are added to the in-memory data -structure at initialization time by scanning the models directory. The -in-memory data structure can be resynchronized by calling -`manager.scan_models_directory`. - -DISAMBIGUATION: - -You may wish to use the same name for a related family of models. To -do this, disambiguate the stanza key with the model and and format -separated by "/". Example: - - tokenizer/clip-large: - format: tokenizer - path: /path/to/folder - description: Returns standalone tokenizer - - text_encoder/clip-large: - format: text_encoder - path: /path/to/folder - description: Returns standalone text encoder - -You can now use the `model_type` argument to indicate which model you -want: - - tokenizer = mgr.get('clip-large',model_type=SubModelType.Tokenizer) - encoder = mgr.get('clip-large',model_type=SubModelType.TextEncoder) - -OTHER FUNCTIONS: - -Other methods provided by ModelManager support importing, editing, -converting and deleting models. - -IMPORTANT CHANGES AND LIMITATIONS SINCE 2.3: - -1. Only local paths are supported. Repo_ids are no longer accepted. This -simplifies the logic. - -2. VAEs can't be swapped in and out at load time. They must be baked -into the model when downloaded or converted. +The path points to a file or directory on disk. If a relative path, +the root is the InvokeAI ROOTDIR. """ from __future__ import annotations @@ -150,24 +231,27 @@ from __future__ import annotations import os import hashlib import textwrap +import yaml from dataclasses import dataclass -from packaging import version from pathlib import Path -from typing import Dict, Optional, List, Tuple, Union, types -from shutil import rmtree +from typing import Optional, List, Tuple, Union, Dict, Set, Callable, types +from shutil import rmtree, move import torch -from huggingface_hub import scan_cache_dir from omegaconf import OmegaConf from omegaconf.dictconfig import DictConfig -from pydantic import BaseModel +from pydantic import BaseModel, Field import invokeai.backend.util.logging as logger from invokeai.app.services.config import InvokeAIAppConfig -from invokeai.backend.util import CUDA_DEVICE, download_with_resume +from invokeai.backend.util import CUDA_DEVICE, Chdir from .model_cache import ModelCache, ModelLocker -from .models import BaseModelType, ModelType, SubModelType, ModelError, MODEL_CLASSES +from .models import ( + BaseModelType, ModelType, SubModelType, + ModelError, SchedulerPredictionType, MODEL_CLASSES, + ModelConfigBase, ModelNotFoundException, InvalidModelException, +) # We are only starting to number the config file with release 3. # The config file version doesn't have to start at release version, but it will help @@ -183,7 +267,6 @@ class ModelInfo(): hash: str location: Union[Path, str] precision: torch.dtype - revision: str = None _cache: ModelCache = None def __enter__(self): @@ -192,38 +275,14 @@ class ModelInfo(): def __exit__(self,*args, **kwargs): self.context.__exit__(*args, **kwargs) -class InvalidModelError(Exception): - "Raised when an invalid model is requested" - pass +class AddModelResult(BaseModel): + name: str = Field(description="The name of the model after installation") + model_type: ModelType = Field(description="The type of model") + base_model: BaseModelType = Field(description="The base model") + config: ModelConfigBase = Field(description="The configuration of the model") MAX_CACHE_SIZE = 6.0 # GB - -# layout of the models directory: -# models -# ├── sd-1 -# │   ├── controlnet -# │   ├── lora -# │   ├── pipeline -# │   └── textual_inversion -# ├── sd-2 -# │   ├── controlnet -# │   ├── lora -# │   ├── pipeline -# │ └── textual_inversion -# └── core -# ├── face_reconstruction -# │ ├── codeformer -# │ └── gfpgan -# ├── sd-conversion -# │ ├── clip-vit-large-patch14 - tokenizer, text_encoder subdirs -# │ ├── stable-diffusion-2 - tokenizer, text_encoder subdirs -# │ └── stable-diffusion-safety-checker -# └── upscaling -# └─── esrgan - - - class ConfigMeta(BaseModel): version: str @@ -249,10 +308,12 @@ class ModelManager(object): and sequential_offload boolean. Note that the default device type and precision are set up for a CUDA system running at half precision. """ - self.config_path = None if isinstance(config, (str, Path)): self.config_path = Path(config) + if not self.config_path.exists(): + logger.warning(f'The file {self.config_path} was not found. Initializing a new file') + self.initialize_model_config(self.config_path) config = OmegaConf.load(self.config_path) elif not isinstance(config, DictConfig): @@ -271,10 +332,11 @@ class ModelManager(object): self.models[model_key] = model_class.create_config(**model_config) # check config version number and update on disk/RAM if necessary - self.globals = InvokeAIAppConfig.get_config() + self.app_config = InvokeAIAppConfig.get_config() self.logger = logger self.cache = ModelCache( max_cache_size=max_cache_size, + max_vram_cache_size = self.app_config.max_vram_cache_size, execution_device = device_type, precision = precision, sequential_offload = sequential_offload, @@ -307,7 +369,8 @@ class ModelManager(object): ) -> str: return f"{base_model}/{model_type}/{model_name}" - def parse_key(self, model_key: str) -> Tuple[str, BaseModelType, ModelType]: + @classmethod + def parse_key(cls, model_key: str) -> Tuple[str, BaseModelType, ModelType]: base_model_str, model_type_str, model_name = model_key.split('/', 2) try: model_type = ModelType(model_type_str) @@ -321,103 +384,72 @@ class ModelManager(object): return (model_name, base_model, model_type) + def _get_model_cache_path(self, model_path): + return self.app_config.models_path / ".cache" / hashlib.md5(str(model_path).encode()).hexdigest() + + @classmethod + def initialize_model_config(cls, config_path: Path): + """Create empty config file""" + with open(config_path,'w') as yaml_file: + yaml_file.write(yaml.dump({'__metadata__': + {'version':'3.0.0'} + } + ) + ) + def get_model( self, model_name: str, base_model: BaseModelType, model_type: ModelType, submodel_type: Optional[SubModelType] = None - ): + )->ModelInfo: """Given a model named identified in models.yaml, return an ModelInfo object describing it. :param model_name: symbolic name of the model in models.yaml :param model_type: ModelType enum indicating the type of model to return + :param base_model: BaseModelType enum indicating the base model used by this model :param submode_typel: an ModelType enum indicating the portion of the model to retrieve (e.g. ModelType.Vae) - - If not provided, the model_type will be read from the `format` field - of the corresponding stanza. If provided, the model_type will be used - to disambiguate stanzas in the configuration file. The default is to - assume a diffusers pipeline. The behavior is illustrated here: - - [models.yaml] - diffusers/test1: - repo_id: foo/bar - description: Typical diffusers pipeline - - lora/test1: - repo_id: /tmp/loras/test1.safetensors - description: Typical lora file - - test1_pipeline = mgr.get_model('test1') - # returns a StableDiffusionGeneratorPipeline - - test1_vae1 = mgr.get_model('test1', submodel=ModelType.Vae) - # returns the VAE part of a diffusers model as an AutoencoderKL - - test1_vae2 = mgr.get_model('test1', model_type=ModelType.Diffusers, submodel=ModelType.Vae) - # does the same thing as the previous statement. Note that model_type - # is for the parent model, and submodel is for the part - - test1_lora = mgr.get_model('test1', model_type=ModelType.Lora) - # returns a LoRA embed (as a 'dict' of tensors) - - test1_encoder = mgr.get_modelI('test1', model_type=ModelType.TextEncoder) - # raises an InvalidModelError - """ model_class = MODEL_CLASSES[base_model][model_type] model_key = self.create_key(model_name, base_model, model_type) # if model not found try to find it (maybe file just pasted) if model_key not in self.models: - # TODO: find by mask or try rescan? - path_mask = f"/models/{base_model}/{model_type}/{model_name}*" - if False: # model_path = next(find_by_mask(path_mask)): - model_path = None # TODO: - model_config = model_class.probe_config(model_path) - self.models[model_key] = model_config - else: - raise Exception(f"Model not found - {model_key}") - - # if it known model check that target path exists (if manualy deleted) - else: - # logic repeated twice(in rescan too) any way to optimize? - if not os.path.exists(self.models[model_key].path): - if model_class.save_to_config: - self.models[model_key].error = ModelError.NotFound - raise Exception(f"Files for model \"{model_key}\" not found") - - else: - self.models.pop(model_key, None) - raise Exception(f"Model not found - {model_key}") - - # reset model errors? - - + self.scan_models_directory(base_model=base_model, model_type=model_type) + if model_key not in self.models: + raise ModelNotFoundException(f"Model not found - {model_key}") model_config = self.models[model_key] + model_path = self.app_config.root_path / model_config.path - # /models/{base_model}/{model_type}/{name}.ckpt or .safentesors - # /models/{base_model}/{model_type}/{name}/ - model_path = model_config.path + if not model_path.exists(): + if model_class.save_to_config: + self.models[model_key].error = ModelError.NotFound + raise Exception(f"Files for model \"{model_key}\" not found") + + else: + self.models.pop(model_key, None) + raise ModelNotFoundException(f"Model not found - {model_key}") # vae/movq override # TODO: if submodel_type is not None and hasattr(model_config, submodel_type): override_path = getattr(model_config, submodel_type) if override_path: - model_path = override_path + model_path = self.app_config.root_path / override_path model_type = submodel_type submodel_type = None model_class = MODEL_CLASSES[base_model][model_type] # TODO: path # TODO: is it accurate to use path as id - dst_convert_path = self.globals.models_dir / ".cache" / hashlib.md5(model_path.encode()).hexdigest() + dst_convert_path = self._get_model_cache_path(model_path) + model_path = model_class.convert_if_required( base_model=base_model, - model_path=model_path, + model_path=str(model_path), # TODO: refactor str/Path types logic output_path=dst_convert_path, config=model_config, ) @@ -469,22 +501,32 @@ class ModelManager(object): """ return [(self.parse_key(x)) for x in self.models.keys()] + def list_model( + self, + model_name: str, + base_model: BaseModelType, + model_type: ModelType, + ) -> dict: + """ + Returns a dict describing one installed model, using + the combined format of the list_models() method. + """ + models = self.list_models(base_model,model_type,model_name) + return models[0] if models else None + def list_models( self, base_model: Optional[BaseModelType] = None, model_type: Optional[ModelType] = None, + model_name: Optional[str] = None, ) -> list[dict]: """ Return a list of models. - - Please use model_manager.models() to get all the model names, - model_manager.model_info('model-name') to get the stanza for the model - named 'model-name', and model_manager.config to get the full OmegaConf - object derived from models.yaml """ + model_keys = [self.create_key(model_name, base_model, model_type)] if model_name else sorted(self.models, key=str.casefold) models = [] - for model_key in sorted(self.models, key=str.casefold): + for model_key in model_keys: model_config = self.models[model_key] cur_model_name, cur_base_model, cur_model_type = self.parse_key(model_key) @@ -496,9 +538,9 @@ class ModelManager(object): model_dict = dict( **model_config.dict(exclude_defaults=True), # OpenAPIModelInfoBase - name=cur_model_name, + model_name=cur_model_name, base_model=cur_base_model, - type=cur_model_type, + model_type=cur_model_type, ) models.append(model_dict) @@ -507,7 +549,7 @@ class ModelManager(object): def print_models(self) -> None: """ - Print a table of models, their descriptions + Print a table of models and their descriptions. This needs to be redone """ # TODO: redo for model_type, model_dict in self.list_models().items(): @@ -515,7 +557,7 @@ class ModelManager(object): line = f'{model_info["name"]:25s} {model_info["type"]:10s} {model_info["description"]}' print(line) - # TODO: test when ui implemented + # Tested - LS def del_model( self, model_name: str, @@ -525,15 +567,11 @@ class ModelManager(object): """ Delete the named model. """ - raise Exception("TODO: del_model") # TODO: redo model_key = self.create_key(model_name, base_model, model_type) model_cfg = self.models.pop(model_key, None) if model_cfg is None: - self.logger.error( - f"Unknown model {model_key}" - ) - return + raise KeyError(f"Unknown model {model_key}") # note: it not garantie to release memory(model can has other references) cache_ids = self.cache_keys.pop(model_key, []) @@ -541,14 +579,18 @@ class ModelManager(object): self.cache.uncache_model(cache_id) # if model inside invoke models folder - delete files - if model_cfg.path.startswith("models/") or model_cfg.path.startswith("models\\"): - model_path = self.globals.root_dir / model_cfg.path - if model_path.isdir(): - shutil.rmtree(str(model_path)) + model_path = self.app_config.root_path / model_cfg.path + cache_path = self._get_model_cache_path(model_path) + if cache_path.exists(): + rmtree(str(cache_path)) + + if model_path.is_relative_to(self.app_config.models_path): + if model_path.is_dir(): + rmtree(str(model_path)) else: model_path.unlink() - # TODO: test when ui implemented + # LS: tested def add_model( self, model_name: str, @@ -556,31 +598,107 @@ class ModelManager(object): model_type: ModelType, model_attributes: dict, clobber: bool = False, - ) -> None: + ) -> AddModelResult: """ Update the named model with a dictionary of attributes. Will fail with an assertion error if the name already exists. Pass clobber=True to overwrite. On a successful update, the config will be changed in memory and the method will return True. Will fail with an assertion error if provided attributes are incorrect or the model name is missing. + + The returned dict has the same format as the dict returned by + model_info(). """ model_class = MODEL_CLASSES[base_model][model_type] model_config = model_class.create_config(**model_attributes) model_key = self.create_key(model_name, base_model, model_type) - assert ( - clobber or model_key not in self.models - ), f'attempt to overwrite existing model definition "{model_key}"' + if model_key in self.models and not clobber: + raise Exception(f'Attempt to overwrite existing model definition "{model_key}"') - self.models[model_key] = model_config - - if clobber and model_key in self.cache_keys: - # note: it not garantie to release memory(model can has other references) + old_model = self.models.pop(model_key, None) + if old_model is not None: + # TODO: if path changed and old_model.path inside models folder should we delete this too? + + # remove conversion cache as config changed + old_model_path = self.app_config.root_path / old_model.path + old_model_cache = self._get_model_cache_path(old_model_path) + if old_model_cache.exists(): + if old_model_cache.is_dir(): + rmtree(str(old_model_cache)) + else: + old_model_cache.unlink() + + # remove in-memory cache + # note: it not guaranteed to release memory(model can has other references) cache_ids = self.cache_keys.pop(model_key, []) for cache_id in cache_ids: self.cache.uncache_model(cache_id) + self.models[model_key] = model_config + self.commit() + return AddModelResult( + name = model_name, + model_type = model_type, + base_model = base_model, + config = model_config, + ) + + def convert_model ( + self, + model_name: str, + base_model: BaseModelType, + model_type: Union[ModelType.Main,ModelType.Vae], + ) -> AddModelResult: + ''' + Convert a checkpoint file into a diffusers folder, deleting the cached + version and deleting the original checkpoint file if it is in the models + directory. + :param model_name: Name of the model to convert + :param base_model: Base model type + :param model_type: Type of model ['vae' or 'main'] + + This will raise a ValueError unless the model is a checkpoint. + ''' + info = self.model_info(model_name, base_model, model_type) + if info["model_format"] != "checkpoint": + raise ValueError(f"not a checkpoint format model: {model_name}") + + # We are taking advantage of a side effect of get_model() that converts check points + # into cached diffusers directories stored at `location`. It doesn't matter + # what submodeltype we request here, so we get the smallest. + submodel = {"submodel_type": SubModelType.Tokenizer} if model_type==ModelType.Main else {} + model = self.get_model(model_name, + base_model, + model_type, + **submodel, + ) + checkpoint_path = self.app_config.root_path / info["path"] + old_diffusers_path = self.app_config.models_path / model.location + new_diffusers_path = self.app_config.models_path / base_model.value / model_type.value / model_name + if new_diffusers_path.exists(): + raise ValueError(f"A diffusers model already exists at {new_diffusers_path}") + + try: + move(old_diffusers_path,new_diffusers_path) + info["model_format"] = "diffusers" + info["path"] = str(new_diffusers_path.relative_to(self.app_config.root_path)) + info.pop('config') + + result = self.add_model(model_name, base_model, model_type, + model_attributes = info, + clobber=True) + except: + # something went wrong, so don't leave dangling diffusers model in directory or it will cause a duplicate model error! + rmtree(new_diffusers_path) + raise + + if checkpoint_path.exists() and checkpoint_path.is_relative_to(self.app_config.models_path): + checkpoint_path.unlink() + + return result + def search_models(self, search_folder): self.logger.info(f"Finding Models In: {search_folder}") models_folder_ckpt = Path(search_folder).glob("**/*.ckpt") @@ -621,7 +739,7 @@ class ModelManager(object): yaml_str = OmegaConf.to_yaml(data_to_save) config_file_path = conf_file or self.config_path assert config_file_path is not None,'no config file path to write to' - config_file_path = self.globals.root_dir / config_file_path + config_file_path = self.app_config.root_path / config_file_path tmpfile = os.path.join(os.path.dirname(config_file_path), "new_config.tmp") with open(tmpfile, "w", encoding="utf-8") as outfile: outfile.write(self.preamble()) @@ -644,42 +762,165 @@ class ModelManager(object): """ ) - def scan_models_directory(self): + def scan_models_directory( + self, + base_model: Optional[BaseModelType] = None, + model_type: Optional[ModelType] = None, + ): + loaded_files = set() new_models_found = False - for model_key, model_config in list(self.models.items()): - model_name, base_model, model_type = self.parse_key(model_key) - model_path = str(self.globals.root / model_config.path) - if not os.path.exists(model_path): - model_class = MODEL_CLASSES[base_model][model_type] - if model_class.save_to_config: - model_config.error = ModelError.NotFound + self.logger.info(f'scanning {self.app_config.models_path} for new models') + with Chdir(self.app_config.root_path): + for model_key, model_config in list(self.models.items()): + model_name, cur_base_model, cur_model_type = self.parse_key(model_key) + model_path = self.app_config.root_path.absolute() / model_config.path + if not model_path.exists(): + model_class = MODEL_CLASSES[cur_base_model][cur_model_type] + if model_class.save_to_config: + model_config.error = ModelError.NotFound + self.models.pop(model_key, None) + else: + self.models.pop(model_key, None) else: - self.models.pop(model_key, None) - else: - loaded_files.add(model_path) + loaded_files.add(model_path) - for base_model in BaseModelType: - for model_type in ModelType: - model_class = MODEL_CLASSES[base_model][model_type] - models_dir = os.path.join(self.globals.models_path, base_model, model_type) + for cur_base_model in BaseModelType: + if base_model is not None and cur_base_model != base_model: + continue - if not os.path.exists(models_dir): - continue # TODO: or create all folders? - - for entry_name in os.listdir(models_dir): - model_path = os.path.join(models_dir, entry_name) - if model_path not in loaded_files: # TODO: check - model_name = Path(model_path).stem - model_key = self.create_key(model_name, base_model, model_type) + for cur_model_type in ModelType: + if model_type is not None and cur_model_type != model_type: + continue + model_class = MODEL_CLASSES[cur_base_model][cur_model_type] + models_dir = self.app_config.models_path / cur_base_model.value / cur_model_type.value - if model_key in self.models: - raise Exception(f"Model with key {model_key} added twice") + if not models_dir.exists(): + continue # TODO: or create all folders? - model_config: ModelConfigBase = model_class.probe_config(model_path) - self.models[model_key] = model_config - new_models_found = True + for model_path in models_dir.iterdir(): + if model_path not in loaded_files: # TODO: check + model_name = model_path.name if model_path.is_dir() else model_path.stem + model_key = self.create_key(model_name, cur_base_model, cur_model_type) - if new_models_found: + if model_key in self.models: + raise Exception(f"Model with key {model_key} added twice") + + if model_path.is_relative_to(self.app_config.root_path): + model_path = model_path.relative_to(self.app_config.root_path) + try: + model_config: ModelConfigBase = model_class.probe_config(str(model_path)) + self.models[model_key] = model_config + new_models_found = True + except InvalidModelException: + self.logger.warning(f"Not a valid model: {model_path}") + except NotImplementedError as e: + self.logger.warning(e) + + imported_models = self.autoimport() + + if (new_models_found or imported_models) and self.config_path: self.commit() + + def autoimport(self)->Dict[str, AddModelResult]: + ''' + Scan the autoimport directory (if defined) and import new models, delete defunct models. + ''' + # avoid circular import + from invokeai.backend.install.model_install_backend import ModelInstall + from invokeai.frontend.install.model_install import ask_user_for_prediction_type + + installer = ModelInstall(config = self.app_config, + model_manager = self, + prediction_type_helper = ask_user_for_prediction_type, + ) + + scanned_dirs = set() + + config = self.app_config + known_paths = {(self.app_config.root_path / x['path']) for x in self.list_models()} + + for autodir in [config.autoimport_dir, + config.lora_dir, + config.embedding_dir, + config.controlnet_dir]: + if autodir is None: + continue + + self.logger.info(f'Scanning {autodir} for models to import') + installed = dict() + + autodir = self.app_config.root_path / autodir + if not autodir.exists(): + continue + + items_scanned = 0 + new_models_found = dict() + + for root, dirs, files in os.walk(autodir): + items_scanned += len(dirs) + len(files) + for d in dirs: + path = Path(root) / d + if path in known_paths or path.parent in scanned_dirs: + scanned_dirs.add(path) + continue + if any([(path/x).exists() for x in {'config.json','model_index.json','learned_embeds.bin','pytorch_lora_weights.bin'}]): + try: + new_models_found.update(installer.heuristic_import(path)) + scanned_dirs.add(path) + except ValueError as e: + self.logger.warning(str(e)) + + for f in files: + path = Path(root) / f + if path in known_paths or path.parent in scanned_dirs: + continue + if path.suffix in {'.ckpt','.bin','.pth','.safetensors','.pt'}: + try: + import_result = installer.heuristic_import(path) + new_models_found.update(import_result) + except ValueError as e: + self.logger.warning(str(e)) + + self.logger.info(f'Scanned {items_scanned} files and directories, imported {len(new_models_found)} models') + installed.update(new_models_found) + + return installed + + def heuristic_import(self, + items_to_import: Set[str], + prediction_type_helper: Callable[[Path],SchedulerPredictionType]=None, + )->Dict[str, AddModelResult]: + '''Import a list of paths, repo_ids or URLs. Returns the set of + successfully imported items. + :param items_to_import: Set of strings corresponding to models to be imported. + :param prediction_type_helper: A callback that receives the Path of a Stable Diffusion 2 checkpoint model and returns a SchedulerPredictionType. + + The prediction type helper is necessary to distinguish between + models based on Stable Diffusion 2 Base (requiring + SchedulerPredictionType.Epsilson) and Stable Diffusion 768 + (requiring SchedulerPredictionType.VPrediction). It is + generally impossible to do this programmatically, so the + prediction_type_helper usually asks the user to choose. + + The result is a set of successfully installed models. Each element + of the set is a dict corresponding to the newly-created OmegaConf stanza for + that model. + + May return the following exceptions: + - KeyError - one or more of the items to import is not a valid path, repo_id or URL + - ValueError - a corresponding model already exists + ''' + # avoid circular import here + from invokeai.backend.install.model_install_backend import ModelInstall + successfully_installed = dict() + + installer = ModelInstall(config = self.app_config, + prediction_type_helper = prediction_type_helper, + model_manager = self) + for thing in items_to_import: + installed = installer.heuristic_import(thing) + successfully_installed.update(installed) + self.commit() + return successfully_installed diff --git a/invokeai/backend/model_management/model_merge.py b/invokeai/backend/model_management/model_merge.py new file mode 100644 index 0000000000..39f951d2b4 --- /dev/null +++ b/invokeai/backend/model_management/model_merge.py @@ -0,0 +1,131 @@ +""" +invokeai.backend.model_management.model_merge exports: +merge_diffusion_models() -- combine multiple models by location and return a pipeline object +merge_diffusion_models_and_commit() -- combine multiple models by ModelManager ID and write to models.yaml + +Copyright (c) 2023 Lincoln Stein and the InvokeAI Development Team +""" + +import warnings +from enum import Enum +from pathlib import Path +from diffusers import DiffusionPipeline +from diffusers import logging as dlogging +from typing import List, Union + +import invokeai.backend.util.logging as logger + +from ...backend.model_management import ModelManager, ModelType, BaseModelType, ModelVariantType, AddModelResult + +class MergeInterpolationMethod(str, Enum): + WeightedSum = "weighted_sum" + Sigmoid = "sigmoid" + InvSigmoid = "inv_sigmoid" + AddDifference = "add_difference" + +class ModelMerger(object): + def __init__(self, manager: ModelManager): + self.manager = manager + + def merge_diffusion_models( + self, + model_paths: List[Path], + alpha: float = 0.5, + interp: MergeInterpolationMethod = None, + force: bool = False, + **kwargs, + ) -> DiffusionPipeline: + """ + :param model_paths: up to three models, designated by their local paths or HuggingFace repo_ids + :param alpha: The interpolation parameter. Ranges from 0 to 1. It affects the ratio in which the checkpoints are merged. A 0.8 alpha + would mean that the first model checkpoints would affect the final result far less than an alpha of 0.2 + :param interp: The interpolation method to use for the merging. Supports "sigmoid", "inv_sigmoid", "add_difference" and None. + Passing None uses the default interpolation which is weighted sum interpolation. For merging three checkpoints, only "add_difference" is supported. + :param force: Whether to ignore mismatch in model_config.json for the current models. Defaults to False. + + **kwargs - the default DiffusionPipeline.get_config_dict kwargs: + cache_dir, resume_download, force_download, proxies, local_files_only, use_auth_token, revision, torch_dtype, device_map + """ + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + verbosity = dlogging.get_verbosity() + dlogging.set_verbosity_error() + + pipe = DiffusionPipeline.from_pretrained( + model_paths[0], + custom_pipeline="checkpoint_merger", + ) + merged_pipe = pipe.merge( + pretrained_model_name_or_path_list=model_paths, + alpha=alpha, + interp=interp.value if interp else None, #diffusers API treats None as "weighted sum" + force=force, + **kwargs, + ) + dlogging.set_verbosity(verbosity) + return merged_pipe + + + def merge_diffusion_models_and_save ( + self, + model_names: List[str], + base_model: Union[BaseModelType,str], + merged_model_name: str, + alpha: float = 0.5, + interp: MergeInterpolationMethod = None, + force: bool = False, + **kwargs, + ) -> AddModelResult: + """ + :param models: up to three models, designated by their InvokeAI models.yaml model name + :param base_model: base model (must be the same for all merged models!) + :param merged_model_name: name for new model + :param alpha: The interpolation parameter. Ranges from 0 to 1. It affects the ratio in which the checkpoints are merged. A 0.8 alpha + would mean that the first model checkpoints would affect the final result far less than an alpha of 0.2 + :param interp: The interpolation method to use for the merging. Supports "weighted_average", "sigmoid", "inv_sigmoid", "add_difference" and None. + Passing None uses the default interpolation which is weighted sum interpolation. For merging three checkpoints, only "add_difference" is supported. Add_difference is A+(B-C). + :param force: Whether to ignore mismatch in model_config.json for the current models. Defaults to False. + + **kwargs - the default DiffusionPipeline.get_config_dict kwargs: + cache_dir, resume_download, force_download, proxies, local_files_only, use_auth_token, revision, torch_dtype, device_map + """ + model_paths = list() + config = self.manager.app_config + base_model = BaseModelType(base_model) + vae = None + + for mod in model_names: + info = self.manager.list_model(mod, base_model=base_model, model_type=ModelType.Main) + assert info, f"model {mod}, base_model {base_model}, is unknown" + assert info["model_format"] == "diffusers", f"{mod} is not a diffusers model. It must be optimized before merging" + assert info["variant"] == "normal", f"{mod} is a {info['variant']} model, which cannot currently be merged" + assert len(model_names) <= 2 or \ + interp==MergeInterpolationMethod.AddDifference, "When merging three models, only the 'add_difference' merge method is supported" + # pick up the first model's vae + if mod == model_names[0]: + vae = info.get("vae") + model_paths.extend([config.root_path / info["path"]]) + + merge_method = None if interp == 'weighted_sum' else MergeInterpolationMethod(interp) + logger.debug(f'interp = {interp}, merge_method={merge_method}') + merged_pipe = self.merge_diffusion_models( + model_paths, alpha, merge_method, force, **kwargs + ) + dump_path = config.models_path / base_model.value / ModelType.Main.value + dump_path.mkdir(parents=True, exist_ok=True) + dump_path = dump_path / merged_model_name + + merged_pipe.save_pretrained(dump_path, safe_serialization=1) + attributes = dict( + path = str(dump_path), + description = f"Merge of models {', '.join(model_names)}", + model_format = "diffusers", + variant = ModelVariantType.Normal.value, + vae = vae, + ) + return self.manager.add_model(merged_model_name, + base_model = base_model, + model_type = ModelType.Main, + model_attributes = attributes, + clobber = True + ) diff --git a/invokeai/backend/model_management/model_probe.py b/invokeai/backend/model_management/model_probe.py index 54fac5cde1..1da0b59101 100644 --- a/invokeai/backend/model_management/model_probe.py +++ b/invokeai/backend/model_management/model_probe.py @@ -1,27 +1,28 @@ import json -import traceback import torch import safetensors.torch from dataclasses import dataclass -from enum import Enum -from diffusers import ModelMixin, ConfigMixin, StableDiffusionPipeline, AutoencoderKL, ControlNetModel +from diffusers import ModelMixin, ConfigMixin from pathlib import Path -from typing import Callable, Literal, Union, Dict +from typing import Callable, Literal, Union, Dict, Optional from picklescan.scanner import scan_file_path -import invokeai.backend.util.logging as logger -from .models import BaseModelType, ModelType, ModelVariantType, SchedulerPredictionType, SilenceWarnings +from .models import ( + BaseModelType, ModelType, ModelVariantType, + SchedulerPredictionType, SilenceWarnings, +) +from .models.base import read_checkpoint_meta @dataclass -class ModelVariantInfo(object): +class ModelProbeInfo(object): model_type: ModelType base_type: BaseModelType variant_type: ModelVariantType prediction_type: SchedulerPredictionType upcast_attention: bool - format: Literal['folder','checkpoint'] + format: Literal['diffusers','checkpoint', 'lycoris'] image_size: int class ProbeBase(object): @@ -31,19 +32,19 @@ class ProbeBase(object): class ModelProbe(object): PROBES = { - 'folder': { }, + 'diffusers': { }, 'checkpoint': { }, } CLASS2TYPE = { - 'StableDiffusionPipeline' : ModelType.Pipeline, + 'StableDiffusionPipeline' : ModelType.Main, 'AutoencoderKL' : ModelType.Vae, 'ControlNetModel' : ModelType.ControlNet, } @classmethod def register_probe(cls, - format: Literal['folder','file'], + format: Literal['diffusers','checkpoint'], model_type: ModelType, probe_class: ProbeBase): cls.PROBES[format][model_type] = probe_class @@ -51,20 +52,20 @@ class ModelProbe(object): @classmethod def heuristic_probe(cls, model: Union[Dict, ModelMixin, Path], - prediction_type_helper: Callable[[Path],BaseModelType]=None, - )->ModelVariantInfo: + prediction_type_helper: Callable[[Path],SchedulerPredictionType]=None, + )->ModelProbeInfo: if isinstance(model,Path): return cls.probe(model_path=model,prediction_type_helper=prediction_type_helper) elif isinstance(model,(dict,ModelMixin,ConfigMixin)): return cls.probe(model_path=None, model=model, prediction_type_helper=prediction_type_helper) else: - raise Exception("model parameter {model} is neither a Path, nor a model") + raise ValueError("model parameter {model} is neither a Path, nor a model") @classmethod def probe(cls, model_path: Path, - model: Union[Dict, ModelMixin] = None, - prediction_type_helper: Callable[[Path],BaseModelType] = None)->ModelVariantInfo: + model: Optional[Union[Dict, ModelMixin]] = None, + prediction_type_helper: Optional[Callable[[Path],SchedulerPredictionType]] = None)->ModelProbeInfo: ''' Probe the model at model_path and return sufficient information about it to place it somewhere in the models directory hierarchy. If the model is @@ -74,23 +75,23 @@ class ModelProbe(object): between V2-Base and V2-768 SD models. ''' if model_path: - format = 'folder' if model_path.is_dir() else 'checkpoint' + format_type = 'diffusers' if model_path.is_dir() else 'checkpoint' else: - format = 'folder' if isinstance(model,(ConfigMixin,ModelMixin)) else 'checkpoint' - + format_type = 'diffusers' if isinstance(model,(ConfigMixin,ModelMixin)) else 'checkpoint' model_info = None try: model_type = cls.get_model_type_from_folder(model_path, model) \ - if format == 'folder' \ + if format_type == 'diffusers' \ else cls.get_model_type_from_checkpoint(model_path, model) - probe_class = cls.PROBES[format].get(model_type) + probe_class = cls.PROBES[format_type].get(model_type) if not probe_class: return None probe = probe_class(model_path, model, prediction_type_helper) base_type = probe.get_base_type() variant_type = probe.get_variant_type() prediction_type = probe.get_scheduler_prediction_type() - model_info = ModelVariantInfo( + format = probe.get_format() + model_info = ModelProbeInfo( model_type = model_type, base_type = base_type, variant_type = variant_type, @@ -102,32 +103,42 @@ class ModelProbe(object): and prediction_type==SchedulerPredictionType.VPrediction \ ) else 512, ) - except Exception as e: - return None + except Exception: + raise return model_info @classmethod - def get_model_type_from_checkpoint(cls, model_path: Path, checkpoint: dict)->ModelType: - if model_path.suffix not in ('.bin','.pt','.ckpt','.safetensors'): + def get_model_type_from_checkpoint(cls, model_path: Path, checkpoint: dict) -> ModelType: + if model_path.suffix not in ('.bin','.pt','.ckpt','.safetensors','.pth'): return None - if model_path.name=='learned_embeds.bin': + + if model_path.name == "learned_embeds.bin": return ModelType.TextualInversion - checkpoint = checkpoint or cls._scan_and_load_checkpoint(model_path) - state_dict = checkpoint.get("state_dict") or checkpoint - if any([x.startswith("model.diffusion_model") for x in state_dict.keys()]): - return ModelType.Pipeline - if any([x.startswith("encoder.conv_in") for x in state_dict.keys()]): - return ModelType.Vae - if "string_to_token" in state_dict or "emb_params" in state_dict: - return ModelType.TextualInversion - if any([x.startswith("lora") for x in state_dict.keys()]): - return ModelType.Lora - if any([x.startswith("control_model") for x in state_dict.keys()]): - return ModelType.ControlNet - if any([x.startswith("input_blocks") for x in state_dict.keys()]): - return ModelType.ControlNet - return None # give up + + ckpt = checkpoint if checkpoint else read_checkpoint_meta(model_path, scan=True) + ckpt = ckpt.get("state_dict", ckpt) + + for key in ckpt.keys(): + if any(key.startswith(v) for v in {"cond_stage_model.", "first_stage_model.", "model.diffusion_model."}): + return ModelType.Main + elif any(key.startswith(v) for v in {"encoder.conv_in", "decoder.conv_in"}): + return ModelType.Vae + elif any(key.startswith(v) for v in {"lora_te_", "lora_unet_"}): + return ModelType.Lora + elif any(key.endswith(v) for v in {"to_k_lora.up.weight", "to_q_lora.down.weight"}): + return ModelType.Lora + elif any(key.startswith(v) for v in {"control_model", "input_blocks"}): + return ModelType.ControlNet + elif key in {"emb_params", "string_to_param"}: + return ModelType.TextualInversion + + else: + # diffusers-ti + if len(ckpt) < 10 and all(isinstance(v, torch.Tensor) for v in ckpt.values()): + return ModelType.TextualInversion + + raise ValueError(f"Unable to determine model type for {model_path}") @classmethod def get_model_type_from_folder(cls, folder_path: Path, model: ModelMixin)->ModelType: @@ -157,7 +168,7 @@ class ModelProbe(object): return type # give up - raise ValueError("Unable to determine model type") + raise ValueError(f"Unable to determine model type for {folder_path}") @classmethod def _scan_and_load_checkpoint(cls,model_path: Path)->dict: @@ -192,11 +203,14 @@ class ProbeBase(object): def get_scheduler_prediction_type(self)->SchedulerPredictionType: pass + def get_format(self)->str: + pass + class CheckpointProbeBase(ProbeBase): def __init__(self, checkpoint_path: Path, checkpoint: dict, - helper: Callable[[Path],BaseModelType] = None + helper: Callable[[Path],SchedulerPredictionType] = None )->BaseModelType: self.checkpoint = checkpoint or ModelProbe._scan_and_load_checkpoint(checkpoint_path) self.checkpoint_path = checkpoint_path @@ -205,9 +219,12 @@ class CheckpointProbeBase(ProbeBase): def get_base_type(self)->BaseModelType: pass + def get_format(self)->str: + return 'checkpoint' + def get_variant_type(self)-> ModelVariantType: model_type = ModelProbe.get_model_type_from_checkpoint(self.checkpoint_path,self.checkpoint) - if model_type != ModelType.Pipeline: + if model_type != ModelType.Main: return ModelVariantType.Normal state_dict = self.checkpoint.get('state_dict') or self.checkpoint in_channels = state_dict[ @@ -220,7 +237,7 @@ class CheckpointProbeBase(ProbeBase): elif in_channels == 4: return ModelVariantType.Normal else: - raise Exception("Cannot determine variant type") + raise ValueError(f"Cannot determine variant type (in_channels={in_channels}) at {self.checkpoint_path}") class PipelineCheckpointProbe(CheckpointProbeBase): def get_base_type(self)->BaseModelType: @@ -231,7 +248,7 @@ class PipelineCheckpointProbe(CheckpointProbeBase): return BaseModelType.StableDiffusion1 if key_name in state_dict and state_dict[key_name].shape[-1] == 1024: return BaseModelType.StableDiffusion2 - raise Exception("Cannot determine base type") + raise ValueError("Cannot determine base type") def get_scheduler_prediction_type(self)->SchedulerPredictionType: type = self.get_base_type() @@ -246,7 +263,8 @@ class PipelineCheckpointProbe(CheckpointProbeBase): return SchedulerPredictionType.Epsilon elif checkpoint["global_step"] == 110000: return SchedulerPredictionType.VPrediction - if self.checkpoint_path and self.helper: + if self.checkpoint_path and self.helper \ + and not self.checkpoint_path.with_suffix('.yaml').exists(): # if a .yaml config file exists, then this step not needed return self.helper(self.checkpoint_path) else: return None @@ -257,6 +275,9 @@ class VaeCheckpointProbe(CheckpointProbeBase): return BaseModelType.StableDiffusion1 class LoRACheckpointProbe(CheckpointProbeBase): + def get_format(self)->str: + return 'lycoris' + def get_base_type(self)->BaseModelType: checkpoint = self.checkpoint key1 = "lora_te_text_model_encoder_layers_0_mlp_fc1.lora_down.weight" @@ -276,6 +297,9 @@ class LoRACheckpointProbe(CheckpointProbeBase): return None class TextualInversionCheckpointProbe(CheckpointProbeBase): + def get_format(self)->str: + return None + def get_base_type(self)->BaseModelType: checkpoint = self.checkpoint if 'string_to_token' in checkpoint: @@ -305,7 +329,7 @@ class ControlNetCheckpointProbe(CheckpointProbeBase): return BaseModelType.StableDiffusion2 elif self.checkpoint_path and self.helper: return self.helper(self.checkpoint_path) - raise Exception("Unable to determine base type for {self.checkpoint_path}") + raise ValueError("Unable to determine base type for {self.checkpoint_path}") ######################################################## # classes for probing folders @@ -322,17 +346,16 @@ class FolderProbeBase(ProbeBase): def get_variant_type(self)->ModelVariantType: return ModelVariantType.Normal + def get_format(self)->str: + return 'diffusers' + class PipelineFolderProbe(FolderProbeBase): def get_base_type(self)->BaseModelType: if self.model: unet_conf = self.model.unet.config - scheduler_conf = self.model.scheduler.config else: with open(self.folder_path / 'unet' / 'config.json','r') as file: unet_conf = json.load(file) - with open(self.folder_path / 'scheduler' / 'scheduler_config.json','r') as file: - scheduler_conf = json.load(file) - if unet_conf['cross_attention_dim'] == 768: return BaseModelType.StableDiffusion1 elif unet_conf['cross_attention_dim'] == 1024: @@ -381,6 +404,9 @@ class VaeFolderProbe(FolderProbeBase): return BaseModelType.StableDiffusion1 class TextualInversionFolderProbe(FolderProbeBase): + def get_format(self)->str: + return None + def get_base_type(self)->BaseModelType: path = self.folder_path / 'learned_embeds.bin' if not path.exists(): @@ -392,7 +418,7 @@ class ControlNetFolderProbe(FolderProbeBase): def get_base_type(self)->BaseModelType: config_file = self.folder_path / 'config.json' if not config_file.exists(): - raise Exception(f"Cannot determine base type for {self.folder_path}") + raise ValueError(f"Cannot determine base type for {self.folder_path}") with open(config_file,'r') as file: config = json.load(file) # no obvious way to distinguish between sd2-base and sd2-768 @@ -401,16 +427,24 @@ class ControlNetFolderProbe(FolderProbeBase): else BaseModelType.StableDiffusion2 class LoRAFolderProbe(FolderProbeBase): - # I've never seen one of these in the wild, so this is a noop - pass + def get_base_type(self)->BaseModelType: + model_file = None + for suffix in ['safetensors','bin']: + base_file = self.folder_path / f'pytorch_lora_weights.{suffix}' + if base_file.exists(): + model_file = base_file + break + if not model_file: + raise ValueError('Unknown LoRA format encountered') + return LoRACheckpointProbe(model_file,None).get_base_type() ############## register probe classes ###### -ModelProbe.register_probe('folder', ModelType.Pipeline, PipelineFolderProbe) -ModelProbe.register_probe('folder', ModelType.Vae, VaeFolderProbe) -ModelProbe.register_probe('folder', ModelType.Lora, LoRAFolderProbe) -ModelProbe.register_probe('folder', ModelType.TextualInversion, TextualInversionFolderProbe) -ModelProbe.register_probe('folder', ModelType.ControlNet, ControlNetFolderProbe) -ModelProbe.register_probe('checkpoint', ModelType.Pipeline, PipelineCheckpointProbe) +ModelProbe.register_probe('diffusers', ModelType.Main, PipelineFolderProbe) +ModelProbe.register_probe('diffusers', ModelType.Vae, VaeFolderProbe) +ModelProbe.register_probe('diffusers', ModelType.Lora, LoRAFolderProbe) +ModelProbe.register_probe('diffusers', ModelType.TextualInversion, TextualInversionFolderProbe) +ModelProbe.register_probe('diffusers', ModelType.ControlNet, ControlNetFolderProbe) +ModelProbe.register_probe('checkpoint', ModelType.Main, PipelineCheckpointProbe) ModelProbe.register_probe('checkpoint', ModelType.Vae, VaeCheckpointProbe) ModelProbe.register_probe('checkpoint', ModelType.Lora, LoRACheckpointProbe) ModelProbe.register_probe('checkpoint', ModelType.TextualInversion, TextualInversionCheckpointProbe) diff --git a/invokeai/backend/model_management/models/__init__.py b/invokeai/backend/model_management/models/__init__.py index 0b8cdbfa0d..3599a5a60b 100644 --- a/invokeai/backend/model_management/models/__init__.py +++ b/invokeai/backend/model_management/models/__init__.py @@ -2,7 +2,7 @@ import inspect from enum import Enum from pydantic import BaseModel from typing import Literal, get_origin -from .base import BaseModelType, ModelType, SubModelType, ModelBase, ModelConfigBase, ModelVariantType, SchedulerPredictionType, ModelError, SilenceWarnings +from .base import BaseModelType, ModelType, SubModelType, ModelBase, ModelConfigBase, ModelVariantType, SchedulerPredictionType, ModelError, SilenceWarnings, ModelNotFoundException, InvalidModelException from .stable_diffusion import StableDiffusion1Model, StableDiffusion2Model from .vae import VaeModel from .lora import LoRAModel @@ -13,23 +13,23 @@ from .stable_diffusion_onnx import ONNXStableDiffusion1Model, ONNXStableDiffusio MODEL_CLASSES = { BaseModelType.StableDiffusion1: { - ModelType.Pipeline: StableDiffusion1Model, ModelType.ONNX: ONNXStableDiffusion1Model, + ModelType.Main: StableDiffusion1Model, ModelType.Vae: VaeModel, ModelType.Lora: LoRAModel, ModelType.ControlNet: ControlNetModel, ModelType.TextualInversion: TextualInversionModel, }, BaseModelType.StableDiffusion2: { - ModelType.Pipeline: StableDiffusion2Model, ModelType.ONNX: ONNXStableDiffusion2Model, + ModelType.Main: StableDiffusion2Model, ModelType.Vae: VaeModel, ModelType.Lora: LoRAModel, ModelType.ControlNet: ControlNetModel, ModelType.TextualInversion: TextualInversionModel, }, #BaseModelType.Kandinsky2_1: { - # ModelType.Pipeline: Kandinsky2_1Model, + # ModelType.Main: Kandinsky2_1Model, # ModelType.MoVQ: MoVQModel, # ModelType.Lora: LoRAModel, # ModelType.ControlNet: ControlNetModel, @@ -41,9 +41,9 @@ MODEL_CONFIGS = list() OPENAPI_MODEL_CONFIGS = list() class OpenAPIModelInfoBase(BaseModel): - name: str + model_name: str base_model: BaseModelType - type: ModelType + model_type: ModelType for base_model, models in MODEL_CLASSES.items(): @@ -60,7 +60,7 @@ for base_model, models in MODEL_CLASSES.items(): api_wrapper = type(openapi_cfg_name, (cfg, OpenAPIModelInfoBase), dict( __annotations__ = dict( - type=Literal[model_type.value], + model_type=Literal[model_type.value], ), )) @@ -72,7 +72,11 @@ def get_model_config_enums(): enums = list() for model_config in MODEL_CONFIGS: - fields = inspect.get_annotations(model_config) + + if hasattr(inspect,'get_annotations'): + fields = inspect.get_annotations(model_config) + else: + fields = model_config.__annotations__ try: field = fields["model_format"] except: diff --git a/invokeai/backend/model_management/models/base.py b/invokeai/backend/model_management/models/base.py index a3c9b4bc87..78685fb6f8 100644 --- a/invokeai/backend/model_management/models/base.py +++ b/invokeai/backend/model_management/models/base.py @@ -1,9 +1,12 @@ +import json import os import sys import typing import inspect from enum import Enum from abc import ABCMeta, abstractmethod +from pathlib import Path +from picklescan.scanner import scan_file_path import torch import numpy as np import safetensors.torch @@ -18,6 +21,11 @@ import onnx from onnx import numpy_helper from onnx.external_data_helper import set_external_data from onnxruntime import InferenceSession, OrtValue, SessionOptions +class InvalidModelException(Exception): + pass + +class ModelNotFoundException(Exception): + pass class BaseModelType(str, Enum): StableDiffusion1 = "sd-1" @@ -26,7 +34,7 @@ class BaseModelType(str, Enum): class ModelType(str, Enum): ONNX = "onnx" - Pipeline = "pipeline" + Main = "main" Vae = "vae" Lora = "lora" ControlNet = "controlnet" # used by model_probe @@ -66,7 +74,6 @@ class ModelConfigBase(BaseModel): class Config: use_enum_values = True - class EmptyConfigLoader(ConfigMixin): @classmethod def load_config(cls, *args, **kwargs): @@ -134,7 +141,10 @@ class ModelBase(metaclass=ABCMeta): if not isinstance(value, type) or not issubclass(value, ModelConfigBase): continue - fields = inspect.get_annotations(value) + if hasattr(inspect,'get_annotations'): + fields = inspect.get_annotations(value) + else: + fields = value.__annotations__ try: field = fields["model_format"] except: @@ -395,15 +405,18 @@ def _fast_safetensors_reader(path: str): return checkpoint - -def read_checkpoint_meta(path: str): - if path.endswith(".safetensors"): +def read_checkpoint_meta(path: Union[str, Path], scan: bool = False): + if str(path).endswith(".safetensors"): try: checkpoint = _fast_safetensors_reader(path) except: # TODO: create issue for support "meta"? checkpoint = safetensors.torch.load_file(path, device="cpu") else: + if scan: + scan_result = scan_file_path(path) + if scan_result.infected_files != 0: + raise Exception(f"The model file \"{path}\" is potentially infected by malware. Aborting import.") checkpoint = torch.load(path, map_location=torch.device("meta")) return checkpoint diff --git a/invokeai/backend/model_management/models/controlnet.py b/invokeai/backend/model_management/models/controlnet.py index 9563f87afd..3b73097799 100644 --- a/invokeai/backend/model_management/models/controlnet.py +++ b/invokeai/backend/model_management/models/controlnet.py @@ -13,6 +13,7 @@ from .base import ( calc_model_size_by_fs, calc_model_size_by_data, classproperty, + InvalidModelException, ) class ControlNetModelFormat(str, Enum): @@ -73,10 +74,18 @@ class ControlNetModel(ModelBase): @classmethod def detect_format(cls, path: str): + if not os.path.exists(path): + raise ModelNotFoundException() + if os.path.isdir(path): - return ControlNetModelFormat.Diffusers - else: - return ControlNetModelFormat.Checkpoint + if os.path.exists(os.path.join(path, "config.json")): + return ControlNetModelFormat.Diffusers + + if os.path.isfile(path): + if any([path.endswith(f".{ext}") for ext in ["safetensors", "ckpt", "pt", "pth"]]): + return ControlNetModelFormat.Checkpoint + + raise InvalidModelException(f"Not a valid model: {path}") @classmethod def convert_if_required( diff --git a/invokeai/backend/model_management/models/lora.py b/invokeai/backend/model_management/models/lora.py index 59feacde06..5387ade0e5 100644 --- a/invokeai/backend/model_management/models/lora.py +++ b/invokeai/backend/model_management/models/lora.py @@ -9,6 +9,7 @@ from .base import ( ModelType, SubModelType, classproperty, + InvalidModelException, ) # TODO: naming from ..lora import LoRAModel as LoRAModelRaw @@ -56,10 +57,18 @@ class LoRAModel(ModelBase): @classmethod def detect_format(cls, path: str): + if not os.path.exists(path): + raise ModelNotFoundException() + if os.path.isdir(path): - return LoRAModelFormat.Diffusers - else: - return LoRAModelFormat.LyCORIS + if os.path.exists(os.path.join(path, "pytorch_lora_weights.bin")): + return LoRAModelFormat.Diffusers + + if os.path.isfile(path): + if any([path.endswith(f".{ext}") for ext in ["safetensors", "ckpt", "pt"]]): + return LoRAModelFormat.LyCORIS + + raise InvalidModelException(f"Not a valid model: {path}") @classmethod def convert_if_required( diff --git a/invokeai/backend/model_management/models/stable_diffusion.py b/invokeai/backend/model_management/models/stable_diffusion.py index f169326571..74751a40dd 100644 --- a/invokeai/backend/model_management/models/stable_diffusion.py +++ b/invokeai/backend/model_management/models/stable_diffusion.py @@ -16,6 +16,7 @@ from .base import ( SilenceWarnings, read_checkpoint_meta, classproperty, + InvalidModelException, ) from invokeai.app.services.config import InvokeAIAppConfig from omegaconf import OmegaConf @@ -34,17 +35,17 @@ class StableDiffusion1Model(DiffusersModel): class CheckpointConfig(ModelConfigBase): model_format: Literal[StableDiffusion1ModelFormat.Checkpoint] vae: Optional[str] = Field(None) - config: Optional[str] = Field(None) + config: str variant: ModelVariantType def __init__(self, model_path: str, base_model: BaseModelType, model_type: ModelType): assert base_model == BaseModelType.StableDiffusion1 - assert model_type == ModelType.Pipeline + assert model_type == ModelType.Main super().__init__( model_path=model_path, base_model=BaseModelType.StableDiffusion1, - model_type=ModelType.Pipeline, + model_type=ModelType.Main, ) @classmethod @@ -69,7 +70,7 @@ class StableDiffusion1Model(DiffusersModel): in_channels = unet_config['in_channels'] else: - raise Exception("Not supported stable diffusion diffusers format(possibly onnx?)") + raise NotImplementedError(f"{path} is not a supported stable diffusion diffusers format") else: raise NotImplementedError(f"Unknown stable diffusion 1.* format: {model_format}") @@ -81,6 +82,8 @@ class StableDiffusion1Model(DiffusersModel): else: raise Exception("Unkown stable diffusion 1.* model format") + if ckpt_config_path is None: + ckpt_config_path = _select_ckpt_config(BaseModelType.StableDiffusion1, variant) return cls.create_config( path=path, @@ -96,10 +99,18 @@ class StableDiffusion1Model(DiffusersModel): @classmethod def detect_format(cls, model_path: str): + if not os.path.exists(model_path): + raise ModelNotFoundException() + if os.path.isdir(model_path): - return StableDiffusion1ModelFormat.Diffusers - else: - return StableDiffusion1ModelFormat.Checkpoint + if os.path.exists(os.path.join(model_path, "model_index.json")): + return StableDiffusion1ModelFormat.Diffusers + + if os.path.isfile(model_path): + if any([model_path.endswith(f".{ext}") for ext in ["safetensors", "ckpt", "pt"]]): + return StableDiffusion1ModelFormat.Checkpoint + + raise InvalidModelException(f"Not a valid model: {model_path}") @classmethod def convert_if_required( @@ -109,14 +120,12 @@ class StableDiffusion1Model(DiffusersModel): config: ModelConfigBase, base_model: BaseModelType, ) -> str: - assert model_path == config.path - if isinstance(config, cls.CheckpointConfig): return _convert_ckpt_and_cache( version=BaseModelType.StableDiffusion1, model_config=config, output_path=output_path, - ) # TODO: args + ) else: return model_path @@ -131,25 +140,20 @@ class StableDiffusion2Model(DiffusersModel): model_format: Literal[StableDiffusion2ModelFormat.Diffusers] vae: Optional[str] = Field(None) variant: ModelVariantType - prediction_type: SchedulerPredictionType - upcast_attention: bool class CheckpointConfig(ModelConfigBase): model_format: Literal[StableDiffusion2ModelFormat.Checkpoint] vae: Optional[str] = Field(None) - config: Optional[str] = Field(None) + config: str variant: ModelVariantType - prediction_type: SchedulerPredictionType - upcast_attention: bool - def __init__(self, model_path: str, base_model: BaseModelType, model_type: ModelType): assert base_model == BaseModelType.StableDiffusion2 - assert model_type == ModelType.Pipeline + assert model_type == ModelType.Main super().__init__( model_path=model_path, base_model=BaseModelType.StableDiffusion2, - model_type=ModelType.Pipeline, + model_type=ModelType.Main, ) @classmethod @@ -188,13 +192,8 @@ class StableDiffusion2Model(DiffusersModel): else: raise Exception("Unkown stable diffusion 2.* model format") - if variant == ModelVariantType.Normal: - prediction_type = SchedulerPredictionType.VPrediction - upcast_attention = True - - else: - prediction_type = SchedulerPredictionType.Epsilon - upcast_attention = False + if ckpt_config_path is None: + ckpt_config_path = _select_ckpt_config(BaseModelType.StableDiffusion2, variant) return cls.create_config( path=path, @@ -202,8 +201,6 @@ class StableDiffusion2Model(DiffusersModel): config=ckpt_config_path, variant=variant, - prediction_type=prediction_type, - upcast_attention=upcast_attention, ) @classproperty @@ -212,10 +209,18 @@ class StableDiffusion2Model(DiffusersModel): @classmethod def detect_format(cls, model_path: str): + if not os.path.exists(model_path): + raise ModelNotFoundException() + if os.path.isdir(model_path): - return StableDiffusion2ModelFormat.Diffusers - else: - return StableDiffusion2ModelFormat.Checkpoint + if os.path.exists(os.path.join(model_path, "model_index.json")): + return StableDiffusion2ModelFormat.Diffusers + + if os.path.isfile(model_path): + if any([model_path.endswith(f".{ext}") for ext in ["safetensors", "ckpt", "pt"]]): + return StableDiffusion2ModelFormat.Checkpoint + + raise InvalidModelException(f"Not a valid model: {model_path}") @classmethod def convert_if_required( @@ -225,14 +230,12 @@ class StableDiffusion2Model(DiffusersModel): config: ModelConfigBase, base_model: BaseModelType, ) -> str: - assert model_path == config.path - if isinstance(config, cls.CheckpointConfig): return _convert_ckpt_and_cache( version=BaseModelType.StableDiffusion2, model_config=config, output_path=output_path, - ) # TODO: args + ) else: return model_path @@ -243,18 +246,18 @@ def _select_ckpt_config(version: BaseModelType, variant: ModelVariantType): ModelVariantType.Inpaint: "v1-inpainting-inference.yaml", }, BaseModelType.StableDiffusion2: { - # code further will manually set upcast_attention and v_prediction - ModelVariantType.Normal: "v2-inference.yaml", + ModelVariantType.Normal: "v2-inference-v.yaml", # best guess, as we can't differentiate with base(512) ModelVariantType.Inpaint: "v2-inpainting-inference.yaml", ModelVariantType.Depth: "v2-midas-inference.yaml", } } + app_config = InvokeAIAppConfig.get_config() try: - # TODO: path - #model_config.config = app_config.config_dir / "stable-diffusion" / ckpt_configs[version][model_config.variant] - #return InvokeAIAppConfig.get_config().legacy_conf_dir / ckpt_configs[version][variant] - return InvokeAIAppConfig.get_config().root_dir / "configs" / "stable-diffusion" / ckpt_configs[version][variant] + config_path = app_config.legacy_conf_path / ckpt_configs[version][variant] + if config_path.is_relative_to(app_config.root_path): + config_path = config_path.relative_to(app_config.root_path) + return str(config_path) except: return None @@ -273,36 +276,14 @@ def _convert_ckpt_and_cache( """ app_config = InvokeAIAppConfig.get_config() - if model_config.config is None: - model_config.config = _select_ckpt_config(version, model_config.variant) - if model_config.config is None: - raise Exception(f"Model variant {model_config.variant} not supported for {version}") - - - weights = app_config.root_dir / model_config.path - config_file = app_config.root_dir / model_config.config + weights = app_config.root_path / model_config.path + config_file = app_config.root_path / model_config.config output_path = Path(output_path) - if version == BaseModelType.StableDiffusion1: - upcast_attention = False - prediction_type = SchedulerPredictionType.Epsilon - - elif version == BaseModelType.StableDiffusion2: - upcast_attention = model_config.upcast_attention - prediction_type = model_config.prediction_type - - else: - raise Exception(f"Unknown model provided: {version}") - - # return cached version if it exists if output_path.exists(): return output_path - # TODO: I think that it more correctly to convert with embedded vae - # as if user will delete custom vae he will got not embedded but also custom vae - #vae_ckpt_path, vae_model = self._get_vae_for_conversion(weights, mconfig) - # to avoid circular import errors from ..convert_ckpt_to_diffusers import convert_ckpt_to_diffusers with SilenceWarnings(): @@ -313,9 +294,6 @@ def _convert_ckpt_and_cache( model_variant=model_config.variant, original_config_file=config_file, extract_ema=True, - upcast_attention=upcast_attention, - prediction_type=prediction_type, scan_needed=True, - model_root=app_config.models_path, ) return output_path diff --git a/invokeai/backend/model_management/models/textual_inversion.py b/invokeai/backend/model_management/models/textual_inversion.py index 9a032218f0..9cd62bb417 100644 --- a/invokeai/backend/model_management/models/textual_inversion.py +++ b/invokeai/backend/model_management/models/textual_inversion.py @@ -8,6 +8,8 @@ from .base import ( ModelType, SubModelType, classproperty, + ModelNotFoundException, + InvalidModelException, ) # TODO: naming from ..lora import TextualInversionModel as TextualInversionModelRaw @@ -37,8 +39,15 @@ class TextualInversionModel(ModelBase): if child_type is not None: raise Exception("There is no child models in textual inversion") + checkpoint_path = self.model_path + if os.path.isdir(checkpoint_path): + checkpoint_path = os.path.join(checkpoint_path, "learned_embeds.bin") + + if not os.path.exists(checkpoint_path): + raise ModelNotFoundException() + model = TextualInversionModelRaw.from_checkpoint( - file_path=self.model_path, + file_path=checkpoint_path, dtype=torch_dtype, ) @@ -51,7 +60,18 @@ class TextualInversionModel(ModelBase): @classmethod def detect_format(cls, path: str): - return None + if not os.path.exists(path): + raise ModelNotFoundException() + + if os.path.isdir(path): + if os.path.exists(os.path.join(path, "learned_embeds.bin")): + return None # diffusers-ti + + if os.path.isfile(path): + if any([path.endswith(f".{ext}") for ext in ["safetensors", "ckpt", "pt"]]): + return None + + raise InvalidModelException(f"Not a valid model: {path}") @classmethod def convert_if_required( diff --git a/invokeai/backend/model_management/models/vae.py b/invokeai/backend/model_management/models/vae.py index 76133b074d..2a5b7cff24 100644 --- a/invokeai/backend/model_management/models/vae.py +++ b/invokeai/backend/model_management/models/vae.py @@ -15,6 +15,7 @@ from .base import ( calc_model_size_by_fs, calc_model_size_by_data, classproperty, + InvalidModelException, ) from invokeai.app.services.config import InvokeAIAppConfig from diffusers.utils import is_safetensors_available @@ -75,10 +76,18 @@ class VaeModel(ModelBase): @classmethod def detect_format(cls, path: str): + if not os.path.exists(path): + raise ModelNotFoundException() + if os.path.isdir(path): - return VaeModelFormat.Diffusers - else: - return VaeModelFormat.Checkpoint + if os.path.exists(os.path.join(path, "config.json")): + return VaeModelFormat.Diffusers + + if os.path.isfile(path): + if any([path.endswith(f".{ext}") for ext in ["safetensors", "ckpt", "pt"]]): + return VaeModelFormat.Checkpoint + + raise InvalidModelException(f"Not a valid model: {path}") @classmethod def convert_if_required( @@ -137,7 +146,6 @@ def _convert_vae_ckpt_and_cache( from .stable_diffusion import _select_ckpt_config # all sd models use same vae settings config_file = _select_ckpt_config(base_model, ModelVariantType.Normal) - else: raise Exception(f"Vae conversion not supported for model type: {base_model}") @@ -152,13 +160,12 @@ def _convert_vae_ckpt_and_cache( if "state_dict" in checkpoint: checkpoint = checkpoint["state_dict"] - config = OmegaConf.load(config_file) + config = OmegaConf.load(app_config.root_path/config_file) vae_model = convert_ldm_vae_to_diffusers( checkpoint = checkpoint, vae_config = config, image_size = image_size, - model_root = app_config.models_path, ) vae_model.save_pretrained( output_path, diff --git a/invokeai/backend/stable_diffusion/diffusers_pipeline.py b/invokeai/backend/stable_diffusion/diffusers_pipeline.py index 0010f33a0d..1d701b21fd 100644 --- a/invokeai/backend/stable_diffusion/diffusers_pipeline.py +++ b/invokeai/backend/stable_diffusion/diffusers_pipeline.py @@ -7,7 +7,7 @@ import secrets from collections.abc import Sequence from dataclasses import dataclass, field from typing import Any, Callable, Generic, List, Optional, Type, TypeVar, Union -from pydantic import BaseModel, Field +from pydantic import Field import einops import PIL.Image @@ -17,12 +17,11 @@ import psutil import torch import torchvision.transforms as T from diffusers.models import AutoencoderKL, UNet2DConditionModel -from diffusers.models.controlnet import ControlNetModel, ControlNetOutput +from diffusers.models.controlnet import ControlNetModel from diffusers.pipelines.stable_diffusion import StableDiffusionPipelineOutput from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion import ( StableDiffusionPipeline, ) -from diffusers.pipelines.controlnet import MultiControlNetModel from diffusers.pipelines.stable_diffusion.pipeline_stable_diffusion_img2img import ( StableDiffusionImg2ImgPipeline, @@ -46,7 +45,7 @@ from .diffusion import ( InvokeAIDiffuserComponent, PostprocessingSettings, ) -from .offloading import FullyLoadedModelGroup, LazilyLoadedModelGroup, ModelGroup +from .offloading import FullyLoadedModelGroup, ModelGroup @dataclass class PipelineIntermediateState: @@ -105,7 +104,7 @@ class AddsMaskGuidance: _debug: Optional[Callable] = None def __call__( - self, step_output: BaseOutput | SchedulerOutput, t: torch.Tensor, conditioning + self, step_output: Union[BaseOutput, SchedulerOutput], t: torch.Tensor, conditioning ) -> BaseOutput: output_class = step_output.__class__ # We'll create a new one with masked data. @@ -128,7 +127,7 @@ class AddsMaskGuidance: def _t_for_field(self, field_name: str, t): if field_name == "pred_original_sample": - return torch.zeros_like(t, dtype=t.dtype) # it represents t=0 + return self.scheduler.timesteps[-1] return t def apply_mask(self, latents: torch.Tensor, t) -> torch.Tensor: @@ -215,10 +214,12 @@ class GeneratorToCallbackinator(Generic[ParamType, ReturnType, CallbackType]): @dataclass class ControlNetData: model: ControlNetModel = Field(default=None) - image_tensor: torch.Tensor= Field(default=None) - weight: Union[float, List[float]]= Field(default=1.0) + image_tensor: torch.Tensor = Field(default=None) + weight: Union[float, List[float]] = Field(default=1.0) begin_step_percent: float = Field(default=0.0) end_step_percent: float = Field(default=1.0) + control_mode: str = Field(default="balanced") + @dataclass(frozen=True) class ConditioningData: @@ -359,37 +360,34 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): ): self.enable_xformers_memory_efficient_attention() else: - if torch.backends.mps.is_available(): - # until pytorch #91617 is fixed, slicing is borked on MPS - # https://github.com/pytorch/pytorch/issues/91617 - # fix is in https://github.com/kulinseth/pytorch/pull/222 but no idea when it will get merged to pytorch mainline. - pass + if self.device.type == "cpu" or self.device.type == "mps": + mem_free = psutil.virtual_memory().free + elif self.device.type == "cuda": + mem_free, _ = torch.cuda.mem_get_info(normalize_device(self.device)) else: - if self.device.type == "cpu" or self.device.type == "mps": - mem_free = psutil.virtual_memory().free - elif self.device.type == "cuda": - mem_free, _ = torch.cuda.mem_get_info(normalize_device(self.device)) - else: - raise ValueError(f"unrecognized device {self.device}") - # input tensor of [1, 4, h/8, w/8] - # output tensor of [16, (h/8 * w/8), (h/8 * w/8)] - bytes_per_element_needed_for_baddbmm_duplication = ( - latents.element_size() + 4 - ) - max_size_required_for_baddbmm = ( - 16 - * latents.size(dim=2) - * latents.size(dim=3) - * latents.size(dim=2) - * latents.size(dim=3) - * bytes_per_element_needed_for_baddbmm_duplication - ) - if max_size_required_for_baddbmm > ( - mem_free * 3.0 / 4.0 - ): # 3.3 / 4.0 is from old Invoke code - self.enable_attention_slicing(slice_size="max") - else: - self.disable_attention_slicing() + raise ValueError(f"unrecognized device {self.device}") + # input tensor of [1, 4, h/8, w/8] + # output tensor of [16, (h/8 * w/8), (h/8 * w/8)] + bytes_per_element_needed_for_baddbmm_duplication = ( + latents.element_size() + 4 + ) + max_size_required_for_baddbmm = ( + 16 + * latents.size(dim=2) + * latents.size(dim=3) + * latents.size(dim=2) + * latents.size(dim=3) + * bytes_per_element_needed_for_baddbmm_duplication + ) + if max_size_required_for_baddbmm > ( + mem_free * 3.0 / 4.0 + ): # 3.3 / 4.0 is from old Invoke code + self.enable_attention_slicing(slice_size="max") + elif torch.backends.mps.is_available(): + # diffusers recommends always enabling for mps + self.enable_attention_slicing(slice_size="max") + else: + self.disable_attention_slicing() def to(self, torch_device: Optional[Union[str, torch.device]] = None, silence_dtype_warnings=False): # overridden method; types match the superclass. @@ -599,48 +597,68 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): # TODO: should this scaling happen here or inside self._unet_forward? # i.e. before or after passing it to InvokeAIDiffuserComponent - latent_model_input = self.scheduler.scale_model_input(latents, timestep) + unet_latent_input = self.scheduler.scale_model_input(latents, timestep) # default is no controlnet, so set controlnet processing output to None down_block_res_samples, mid_block_res_sample = None, None if control_data is not None: - # FIXME: make sure guidance_scale < 1.0 is handled correctly if doing per-step guidance setting - # if conditioning_data.guidance_scale > 1.0: - if conditioning_data.guidance_scale is not None: - # expand the latents input to control model if doing classifier free guidance - # (which I think for now is always true, there is conditional elsewhere that stops execution if - # classifier_free_guidance is <= 1.0 ?) - latent_control_input = torch.cat([latent_model_input] * 2) - else: - latent_control_input = latent_model_input # control_data should be type List[ControlNetData] # this loop covers both ControlNet (one ControlNetData in list) # and MultiControlNet (multiple ControlNetData in list) for i, control_datum in enumerate(control_data): - # print("controlnet", i, "==>", type(control_datum)) + control_mode = control_datum.control_mode + # soft_injection and cfg_injection are the two ControlNet control_mode booleans + # that are combined at higher level to make control_mode enum + # soft_injection determines whether to do per-layer re-weighting adjustment (if True) + # or default weighting (if False) + soft_injection = (control_mode == "more_prompt" or control_mode == "more_control") + # cfg_injection = determines whether to apply ControlNet to only the conditional (if True) + # or the default both conditional and unconditional (if False) + cfg_injection = (control_mode == "more_control" or control_mode == "unbalanced") + first_control_step = math.floor(control_datum.begin_step_percent * total_step_count) last_control_step = math.ceil(control_datum.end_step_percent * total_step_count) # only apply controlnet if current step is within the controlnet's begin/end step range if step_index >= first_control_step and step_index <= last_control_step: - # print("running controlnet", i, "for step", step_index) + + if cfg_injection: + control_latent_input = unet_latent_input + else: + # expand the latents input to control model if doing classifier free guidance + # (which I think for now is always true, there is conditional elsewhere that stops execution if + # classifier_free_guidance is <= 1.0 ?) + control_latent_input = torch.cat([unet_latent_input] * 2) + + if cfg_injection: # only applying ControlNet to conditional instead of in unconditioned + encoder_hidden_states = conditioning_data.text_embeddings + else: + encoder_hidden_states = torch.cat([conditioning_data.unconditioned_embeddings, + conditioning_data.text_embeddings]) if isinstance(control_datum.weight, list): # if controlnet has multiple weights, use the weight for the current step controlnet_weight = control_datum.weight[step_index] else: # if controlnet has a single weight, use it for all steps controlnet_weight = control_datum.weight + + # controlnet(s) inference down_samples, mid_sample = control_datum.model( - sample=latent_control_input, + sample=control_latent_input, timestep=timestep, - encoder_hidden_states=torch.cat([conditioning_data.unconditioned_embeddings, - conditioning_data.text_embeddings]), + encoder_hidden_states=encoder_hidden_states, controlnet_cond=control_datum.image_tensor, - conditioning_scale=controlnet_weight, - # cross_attention_kwargs, - guess_mode=False, + conditioning_scale=controlnet_weight, # controlnet specific, NOT the guidance scale + guess_mode=soft_injection, # this is still called guess_mode in diffusers ControlNetModel return_dict=False, ) + if cfg_injection: + # Inferred ControlNet only for the conditional batch. + # To apply the output of ControlNet to both the unconditional and conditional batches, + # add 0 to the unconditional batch to keep it unchanged. + down_samples = [torch.cat([torch.zeros_like(d), d]) for d in down_samples] + mid_sample = torch.cat([torch.zeros_like(mid_sample), mid_sample]) + if down_block_res_samples is None and mid_block_res_sample is None: down_block_res_samples, mid_block_res_sample = down_samples, mid_sample else: @@ -653,11 +671,11 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): # predict the noise residual noise_pred = self.invokeai_diffuser.do_diffusion_step( - latent_model_input, - t, - conditioning_data.unconditioned_embeddings, - conditioning_data.text_embeddings, - conditioning_data.guidance_scale, + x=unet_latent_input, + sigma=t, + unconditioning=conditioning_data.unconditioned_embeddings, + conditioning=conditioning_data.text_embeddings, + unconditional_guidance_scale=conditioning_data.guidance_scale, step_index=step_index, total_step_count=total_step_count, down_block_additional_residuals=down_block_res_samples, # from controlnet(s) @@ -895,20 +913,11 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): def non_noised_latents_from_image(self, init_image, *, device: torch.device, dtype): init_image = init_image.to(device=device, dtype=dtype) with torch.inference_mode(): - if device.type == "mps": - # workaround for torch MPS bug that has been fixed in https://github.com/kulinseth/pytorch/pull/222 - # TODO remove this workaround once kulinseth#222 is merged to pytorch mainline - self.vae.to(CPU_DEVICE) - init_image = init_image.to(CPU_DEVICE) - else: - self._model_group.load(self.vae) + self._model_group.load(self.vae) init_latent_dist = self.vae.encode(init_image).latent_dist init_latents = init_latent_dist.sample().to( dtype=dtype ) # FIXME: uses torch.randn. make reproducible! - if device.type == "mps": - self.vae.to(device) - init_latents = init_latents.to(device) init_latents = 0.18215 * init_latents return init_latents @@ -962,6 +971,7 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): device="cuda", dtype=torch.float16, do_classifier_free_guidance=True, + control_mode="balanced" ): if not isinstance(image, torch.Tensor): @@ -992,6 +1002,7 @@ class StableDiffusionGeneratorPipeline(StableDiffusionPipeline): repeat_by = num_images_per_prompt image = image.repeat_interleave(repeat_by, dim=0) image = image.to(device=device, dtype=dtype) - if do_classifier_free_guidance: + cfg_injection = (control_mode == "more_control" or control_mode == "unbalanced") + if do_classifier_free_guidance and not cfg_injection: image = torch.cat([image] * 2) return image diff --git a/invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py b/invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py index f3b09f6a9f..1175475bba 100644 --- a/invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py +++ b/invokeai/backend/stable_diffusion/diffusion/shared_invokeai_diffusion.py @@ -248,9 +248,6 @@ class InvokeAIDiffuserComponent: x_twice, sigma_twice, both_conditionings, **kwargs, ) unconditioned_next_x, conditioned_next_x = both_results.chunk(2) - if conditioned_next_x.device.type == "mps": - # prevent a result filled with zeros. seems to be a torch bug. - conditioned_next_x = conditioned_next_x.clone() return unconditioned_next_x, conditioned_next_x def _apply_standard_conditioning_sequentially( @@ -264,9 +261,6 @@ class InvokeAIDiffuserComponent: # low-memory sequential path unconditioned_next_x = self.model_forward_callback(x, sigma, unconditioning, **kwargs) conditioned_next_x = self.model_forward_callback(x, sigma, conditioning, **kwargs) - if conditioned_next_x.device.type == "mps": - # prevent a result filled with zeros. seems to be a torch bug. - conditioned_next_x = conditioned_next_x.clone() return unconditioned_next_x, conditioned_next_x # TODO: looks unused diff --git a/invokeai/backend/stable_diffusion/offloading.py b/invokeai/backend/stable_diffusion/offloading.py index 5fc3f765ae..d36b65872a 100644 --- a/invokeai/backend/stable_diffusion/offloading.py +++ b/invokeai/backend/stable_diffusion/offloading.py @@ -4,7 +4,7 @@ import warnings import weakref from abc import ABCMeta, abstractmethod from collections.abc import MutableMapping -from typing import Callable +from typing import Callable, Union import torch from accelerate.utils import send_to_device @@ -117,7 +117,7 @@ class LazilyLoadedModelGroup(ModelGroup): """ _hooks: MutableMapping[torch.nn.Module, RemovableHandle] - _current_model_ref: Callable[[], torch.nn.Module | _NoModel] + _current_model_ref: Callable[[], Union[torch.nn.Module, _NoModel]] def __init__(self, execution_device: torch.device): super().__init__(execution_device) diff --git a/invokeai/backend/util/__init__.py b/invokeai/backend/util/__init__.py index 84720b1854..fadeff4d75 100644 --- a/invokeai/backend/util/__init__.py +++ b/invokeai/backend/util/__init__.py @@ -16,6 +16,7 @@ from .util import ( download_with_resume, instantiate_from_config, url_attachment_name, + Chdir ) diff --git a/invokeai/backend/util/devices.py b/invokeai/backend/util/devices.py index 615209d98d..3fbdaba41a 100644 --- a/invokeai/backend/util/devices.py +++ b/invokeai/backend/util/devices.py @@ -4,6 +4,7 @@ from contextlib import nullcontext import torch from torch import autocast +from typing import Union from invokeai.app.services.config import InvokeAIAppConfig CPU_DEVICE = torch.device("cpu") @@ -28,6 +29,8 @@ def choose_precision(device: torch.device) -> str: device_name = torch.cuda.get_device_name(device) if not ("GeForce GTX 1660" in device_name or "GeForce GTX 1650" in device_name): return "float16" + elif device.type == "mps": + return "float16" return "float32" @@ -49,7 +52,7 @@ def choose_autocast(precision): return nullcontext -def normalize_device(device: str | torch.device) -> torch.device: +def normalize_device(device: Union[str, torch.device]) -> torch.device: """Ensure device has a device index defined, if appropriate.""" device = torch.device(device) if device.index is None: diff --git a/invokeai/backend/util/mps_fixes.py b/invokeai/backend/util/mps_fixes.py new file mode 100644 index 0000000000..1fc58f9c98 --- /dev/null +++ b/invokeai/backend/util/mps_fixes.py @@ -0,0 +1,63 @@ +import torch + + +if torch.backends.mps.is_available(): + torch.empty = torch.zeros + + +_torch_layer_norm = torch.nn.functional.layer_norm +def new_layer_norm(input, normalized_shape, weight=None, bias=None, eps=1e-05): + if input.device.type == "mps" and input.dtype == torch.float16: + input = input.float() + if weight is not None: + weight = weight.float() + if bias is not None: + bias = bias.float() + return _torch_layer_norm(input, normalized_shape, weight, bias, eps).half() + else: + return _torch_layer_norm(input, normalized_shape, weight, bias, eps) + +torch.nn.functional.layer_norm = new_layer_norm + + +_torch_tensor_permute = torch.Tensor.permute +def new_torch_tensor_permute(input, *dims): + result = _torch_tensor_permute(input, *dims) + if input.device == "mps" and input.dtype == torch.float16: + result = result.contiguous() + return result + +torch.Tensor.permute = new_torch_tensor_permute + + +_torch_lerp = torch.lerp +def new_torch_lerp(input, end, weight, *, out=None): + if input.device.type == "mps" and input.dtype == torch.float16: + input = input.float() + end = end.float() + if isinstance(weight, torch.Tensor): + weight = weight.float() + if out is not None: + out_fp32 = torch.zeros_like(out, dtype=torch.float32) + else: + out_fp32 = None + result = _torch_lerp(input, end, weight, out=out_fp32) + if out is not None: + out.copy_(out_fp32.half()) + del out_fp32 + return result.half() + + else: + return _torch_lerp(input, end, weight, out=out) + +torch.lerp = new_torch_lerp + + +_torch_interpolate = torch.nn.functional.interpolate +def new_torch_interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None, antialias=False): + if input.device.type == "mps" and input.dtype == torch.float16: + return _torch_interpolate(input.float(), size, scale_factor, mode, align_corners, recompute_scale_factor, antialias).half() + else: + return _torch_interpolate(input, size, scale_factor, mode, align_corners, recompute_scale_factor, antialias) + +torch.nn.functional.interpolate = new_torch_interpolate diff --git a/invokeai/backend/util/util.py b/invokeai/backend/util/util.py index 9c6a61a4fa..1cc632e483 100644 --- a/invokeai/backend/util/util.py +++ b/invokeai/backend/util/util.py @@ -381,3 +381,18 @@ def image_to_dataURL(image: Image.Image, image_format: str = "PNG") -> str: buffered.getvalue() ).decode("UTF-8") return image_base64 + +class Chdir(object): + '''Context manager to chdir to desired directory and change back after context exits: + Args: + path (Path): The path to the cwd + ''' + def __init__(self, path: Path): + self.path = path + self.original = Path().absolute() + + def __enter__(self): + os.chdir(self.path) + + def __exit__(self,*args): + os.chdir(self.original) diff --git a/invokeai/configs/INITIAL_MODELS.yaml b/invokeai/configs/INITIAL_MODELS.yaml index 6bf3d4231a..4ba67bc4bc 100644 --- a/invokeai/configs/INITIAL_MODELS.yaml +++ b/invokeai/configs/INITIAL_MODELS.yaml @@ -1,107 +1,92 @@ # This file predefines a few models that the user may want to install. -diffusers: - stable-diffusion-1.5: - description: Stable Diffusion version 1.5 diffusers model (4.27 GB) - repo_id: runwayml/stable-diffusion-v1-5 - format: diffusers - vae: - repo_id: stabilityai/sd-vae-ft-mse - recommended: True - default: True - sd-inpainting-1.5: - description: RunwayML SD 1.5 model optimized for inpainting, diffusers version (4.27 GB) - repo_id: runwayml/stable-diffusion-inpainting - format: diffusers - vae: - repo_id: stabilityai/sd-vae-ft-mse - recommended: True - stable-diffusion-2.1: - description: Stable Diffusion version 2.1 diffusers model, trained on 768 pixel images (5.21 GB) - repo_id: stabilityai/stable-diffusion-2-1 - format: diffusers - recommended: True - sd-inpainting-2.0: - description: Stable Diffusion version 2.0 inpainting model (5.21 GB) - repo_id: stabilityai/stable-diffusion-2-inpainting - format: diffusers - recommended: False - analog-diffusion-1.0: - description: An SD-1.5 model trained on diverse analog photographs (2.13 GB) - repo_id: wavymulder/Analog-Diffusion - format: diffusers - recommended: false - deliberate-1.0: - description: Versatile model that produces detailed images up to 768px (4.27 GB) - format: diffusers - repo_id: XpucT/Deliberate - recommended: False - d&d-diffusion-1.0: - description: Dungeons & Dragons characters (2.13 GB) - format: diffusers - repo_id: 0xJustin/Dungeons-and-Diffusion - recommended: False - dreamlike-photoreal-2.0: - description: A photorealistic model trained on 768 pixel images based on SD 1.5 (2.13 GB) - format: diffusers - repo_id: dreamlike-art/dreamlike-photoreal-2.0 - recommended: False - inkpunk-1.0: - description: Stylized illustrations inspired by Gorillaz, FLCL and Shinkawa; prompt with "nvinkpunk" (4.27 GB) - format: diffusers - repo_id: Envvi/Inkpunk-Diffusion - recommended: False - openjourney-4.0: - description: An SD 1.5 model fine tuned on Midjourney; prompt with "mdjrny-v4 style" (2.13 GB) - format: diffusers - repo_id: prompthero/openjourney - vae: - repo_id: stabilityai/sd-vae-ft-mse - recommended: False - portrait-plus-1.0: - description: An SD-1.5 model trained on close range portraits of people; prompt with "portrait+" (2.13 GB) - format: diffusers - repo_id: wavymulder/portraitplus - recommended: False - seek-art-mega-1.0: - description: A general use SD-1.5 "anything" model that supports multiple styles (2.1 GB) - repo_id: coreco/seek.art_MEGA - format: diffusers - vae: - repo_id: stabilityai/sd-vae-ft-mse - recommended: False - trinart-2.0: - description: An SD-1.5 model finetuned with ~40K assorted high resolution manga/anime-style images (2.13 GB) - repo_id: naclbit/trinart_stable_diffusion_v2 - format: diffusers - vae: - repo_id: stabilityai/sd-vae-ft-mse - recommended: False - waifu-diffusion-1.4: - description: An SD-1.5 model trained on 680k anime/manga-style images (2.13 GB) - repo_id: hakurei/waifu-diffusion - format: diffusers - vae: - repo_id: stabilityai/sd-vae-ft-mse - recommended: False -controlnet: - canny: lllyasviel/control_v11p_sd15_canny - inpaint: lllyasviel/control_v11p_sd15_inpaint - mlsd: lllyasviel/control_v11p_sd15_mlsd - depth: lllyasviel/control_v11f1p_sd15_depth - normal_bae: lllyasviel/control_v11p_sd15_normalbae - seg: lllyasviel/control_v11p_sd15_seg - lineart: lllyasviel/control_v11p_sd15_lineart - lineart_anime: lllyasviel/control_v11p_sd15s2_lineart_anime - scribble: lllyasviel/control_v11p_sd15_scribble - softedge: lllyasviel/control_v11p_sd15_softedge - shuffle: lllyasviel/control_v11e_sd15_shuffle - tile: lllyasviel/control_v11f1e_sd15_tile - ip2p: lllyasviel/control_v11e_sd15_ip2p -textual_inversion: - 'EasyNegative': https://huggingface.co/embed/EasyNegative/resolve/main/EasyNegative.safetensors - 'ahx-beta-453407d': sd-concepts-library/ahx-beta-453407d -lora: - 'LowRA': https://civitai.com/api/download/models/63006 - 'Ink scenery': https://civitai.com/api/download/models/83390 - 'sd-model-finetuned-lora-t4': sayakpaul/sd-model-finetuned-lora-t4 - +sd-1/main/stable-diffusion-v1-5: + description: Stable Diffusion version 1.5 diffusers model (4.27 GB) + repo_id: runwayml/stable-diffusion-v1-5 + recommended: True + default: True +sd-1/main/stable-diffusion-inpainting: + description: RunwayML SD 1.5 model optimized for inpainting, diffusers version (4.27 GB) + repo_id: runwayml/stable-diffusion-inpainting + recommended: True +sd-2/main/stable-diffusion-2-1: + description: Stable Diffusion version 2.1 diffusers model, trained on 768 pixel images (5.21 GB) + repo_id: stabilityai/stable-diffusion-2-1 + recommended: True +sd-2/main/stable-diffusion-2-inpainting: + description: Stable Diffusion version 2.0 inpainting model (5.21 GB) + repo_id: stabilityai/stable-diffusion-2-inpainting + recommended: False +sd-1/main/Analog-Diffusion: + description: An SD-1.5 model trained on diverse analog photographs (2.13 GB) + repo_id: wavymulder/Analog-Diffusion + recommended: false +sd-1/main/Deliberate: + description: Versatile model that produces detailed images up to 768px (4.27 GB) + repo_id: XpucT/Deliberate + recommended: False +sd-1/main/Dungeons-and-Diffusion: + description: Dungeons & Dragons characters (2.13 GB) + repo_id: 0xJustin/Dungeons-and-Diffusion + recommended: False +sd-1/main/dreamlike-photoreal-2: + description: A photorealistic model trained on 768 pixel images based on SD 1.5 (2.13 GB) + repo_id: dreamlike-art/dreamlike-photoreal-2.0 + recommended: False +sd-1/main/Inkpunk-Diffusion: + description: Stylized illustrations inspired by Gorillaz, FLCL and Shinkawa; prompt with "nvinkpunk" (4.27 GB) + repo_id: Envvi/Inkpunk-Diffusion + recommended: False +sd-1/main/openjourney: + description: An SD 1.5 model fine tuned on Midjourney; prompt with "mdjrny-v4 style" (2.13 GB) + repo_id: prompthero/openjourney + recommended: False +sd-1/main/portraitplus: + description: An SD-1.5 model trained on close range portraits of people; prompt with "portrait+" (2.13 GB) + repo_id: wavymulder/portraitplus + recommended: False +sd-1/main/seek.art_MEGA: + repo_id: coreco/seek.art_MEGA + description: A general use SD-1.5 "anything" model that supports multiple styles (2.1 GB) + recommended: False +sd-1/main/trinart_stable_diffusion_v2: + description: An SD-1.5 model finetuned with ~40K assorted high resolution manga/anime-style images (2.13 GB) + repo_id: naclbit/trinart_stable_diffusion_v2 + recommended: False +sd-1/main/waifu-diffusion: + description: An SD-1.5 model trained on 680k anime/manga-style images (2.13 GB) + repo_id: hakurei/waifu-diffusion + recommended: False +sd-1/controlnet/canny: + repo_id: lllyasviel/control_v11p_sd15_canny +sd-1/controlnet/inpaint: + repo_id: lllyasviel/control_v11p_sd15_inpaint +sd-1/controlnet/mlsd: + repo_id: lllyasviel/control_v11p_sd15_mlsd +sd-1/controlnet/depth: + repo_id: lllyasviel/control_v11f1p_sd15_depth +sd-1/controlnet/normal_bae: + repo_id: lllyasviel/control_v11p_sd15_normalbae +sd-1/controlnet/seg: + repo_id: lllyasviel/control_v11p_sd15_seg +sd-1/controlnet/lineart: + repo_id: lllyasviel/control_v11p_sd15_lineart +sd-1/controlnet/lineart_anime: + repo_id: lllyasviel/control_v11p_sd15s2_lineart_anime +sd-1/controlnet/scribble: + repo_id: lllyasviel/control_v11p_sd15_scribble +sd-1/controlnet/softedge: + repo_id: lllyasviel/control_v11p_sd15_softedge +sd-1/controlnet/shuffle: + repo_id: lllyasviel/control_v11e_sd15_shuffle +sd-1/controlnet/tile: + repo_id: lllyasviel/control_v11f1e_sd15_tile +sd-1/controlnet/ip2p: + repo_id: lllyasviel/control_v11e_sd15_ip2p +sd-1/embedding/EasyNegative: + path: https://huggingface.co/embed/EasyNegative/resolve/main/EasyNegative.safetensors +sd-1/embedding/ahx-beta-453407d: + repo_id: sd-concepts-library/ahx-beta-453407d +sd-1/lora/LowRA: + path: https://civitai.com/api/download/models/63006 +sd-1/lora/Ink scenery: + path: https://civitai.com/api/download/models/83390 diff --git a/invokeai/configs/stable-diffusion/v2-inpainting-inference-v.yaml b/invokeai/configs/stable-diffusion/v2-inpainting-inference-v.yaml new file mode 100644 index 0000000000..37cda460aa --- /dev/null +++ b/invokeai/configs/stable-diffusion/v2-inpainting-inference-v.yaml @@ -0,0 +1,159 @@ +model: + base_learning_rate: 5.0e-05 + target: ldm.models.diffusion.ddpm.LatentInpaintDiffusion + params: + linear_start: 0.00085 + linear_end: 0.0120 + parameterization: "v" + num_timesteps_cond: 1 + log_every_t: 200 + timesteps: 1000 + first_stage_key: "jpg" + cond_stage_key: "txt" + image_size: 64 + channels: 4 + cond_stage_trainable: false + conditioning_key: hybrid + scale_factor: 0.18215 + monitor: val/loss_simple_ema + finetune_keys: null + use_ema: False + + unet_config: + target: ldm.modules.diffusionmodules.openaimodel.UNetModel + params: + use_checkpoint: True + image_size: 32 # unused + in_channels: 9 + out_channels: 4 + model_channels: 320 + attention_resolutions: [ 4, 2, 1 ] + num_res_blocks: 2 + channel_mult: [ 1, 2, 4, 4 ] + num_head_channels: 64 # need to fix for flash-attn + use_spatial_transformer: True + use_linear_in_transformer: True + transformer_depth: 1 + context_dim: 1024 + legacy: False + + first_stage_config: + target: ldm.models.autoencoder.AutoencoderKL + params: + embed_dim: 4 + monitor: val/rec_loss + ddconfig: + #attn_type: "vanilla-xformers" + double_z: true + z_channels: 4 + resolution: 256 + in_channels: 3 + out_ch: 3 + ch: 128 + ch_mult: + - 1 + - 2 + - 4 + - 4 + num_res_blocks: 2 + attn_resolutions: [ ] + dropout: 0.0 + lossconfig: + target: torch.nn.Identity + + cond_stage_config: + target: ldm.modules.encoders.modules.FrozenOpenCLIPEmbedder + params: + freeze: True + layer: "penultimate" + + +data: + target: ldm.data.laion.WebDataModuleFromConfig + params: + tar_base: null # for concat as in LAION-A + p_unsafe_threshold: 0.1 + filter_word_list: "data/filters.yaml" + max_pwatermark: 0.45 + batch_size: 8 + num_workers: 6 + multinode: True + min_size: 512 + train: + shards: + - "pipe:aws s3 cp s3://stability-aws/laion-a-native/part-0/{00000..18699}.tar -" + - "pipe:aws s3 cp s3://stability-aws/laion-a-native/part-1/{00000..18699}.tar -" + - "pipe:aws s3 cp s3://stability-aws/laion-a-native/part-2/{00000..18699}.tar -" + - "pipe:aws s3 cp s3://stability-aws/laion-a-native/part-3/{00000..18699}.tar -" + - "pipe:aws s3 cp s3://stability-aws/laion-a-native/part-4/{00000..18699}.tar -" #{00000-94333}.tar" + shuffle: 10000 + image_key: jpg + image_transforms: + - target: torchvision.transforms.Resize + params: + size: 512 + interpolation: 3 + - target: torchvision.transforms.RandomCrop + params: + size: 512 + postprocess: + target: ldm.data.laion.AddMask + params: + mode: "512train-large" + p_drop: 0.25 + # NOTE use enough shards to avoid empty validation loops in workers + validation: + shards: + - "pipe:aws s3 cp s3://deep-floyd-s3/datasets/laion_cleaned-part5/{93001..94333}.tar - " + shuffle: 0 + image_key: jpg + image_transforms: + - target: torchvision.transforms.Resize + params: + size: 512 + interpolation: 3 + - target: torchvision.transforms.CenterCrop + params: + size: 512 + postprocess: + target: ldm.data.laion.AddMask + params: + mode: "512train-large" + p_drop: 0.25 + +lightning: + find_unused_parameters: True + modelcheckpoint: + params: + every_n_train_steps: 5000 + + callbacks: + metrics_over_trainsteps_checkpoint: + params: + every_n_train_steps: 10000 + + image_logger: + target: main.ImageLogger + params: + enable_autocast: False + disabled: False + batch_frequency: 1000 + max_images: 4 + increase_log_steps: False + log_first_step: False + log_images_kwargs: + use_ema_scope: False + inpaint: False + plot_progressive_rows: False + plot_diffusion_rows: False + N: 4 + unconditional_guidance_scale: 5.0 + unconditional_guidance_label: [""] + ddim_steps: 50 # todo check these out for depth2img, + ddim_eta: 0.0 # todo check these out for depth2img, + + trainer: + benchmark: True + val_check_interval: 5000000 + num_sanity_val_steps: 0 + accumulate_grad_batches: 1 \ No newline at end of file diff --git a/invokeai/configs/stable-diffusion/v2-inpainting-inference.yaml b/invokeai/configs/stable-diffusion/v2-inpainting-inference.yaml new file mode 100644 index 0000000000..5aaf13162d --- /dev/null +++ b/invokeai/configs/stable-diffusion/v2-inpainting-inference.yaml @@ -0,0 +1,158 @@ +model: + base_learning_rate: 5.0e-05 + target: ldm.models.diffusion.ddpm.LatentInpaintDiffusion + params: + linear_start: 0.00085 + linear_end: 0.0120 + num_timesteps_cond: 1 + log_every_t: 200 + timesteps: 1000 + first_stage_key: "jpg" + cond_stage_key: "txt" + image_size: 64 + channels: 4 + cond_stage_trainable: false + conditioning_key: hybrid + scale_factor: 0.18215 + monitor: val/loss_simple_ema + finetune_keys: null + use_ema: False + + unet_config: + target: ldm.modules.diffusionmodules.openaimodel.UNetModel + params: + use_checkpoint: True + image_size: 32 # unused + in_channels: 9 + out_channels: 4 + model_channels: 320 + attention_resolutions: [ 4, 2, 1 ] + num_res_blocks: 2 + channel_mult: [ 1, 2, 4, 4 ] + num_head_channels: 64 # need to fix for flash-attn + use_spatial_transformer: True + use_linear_in_transformer: True + transformer_depth: 1 + context_dim: 1024 + legacy: False + + first_stage_config: + target: ldm.models.autoencoder.AutoencoderKL + params: + embed_dim: 4 + monitor: val/rec_loss + ddconfig: + #attn_type: "vanilla-xformers" + double_z: true + z_channels: 4 + resolution: 256 + in_channels: 3 + out_ch: 3 + ch: 128 + ch_mult: + - 1 + - 2 + - 4 + - 4 + num_res_blocks: 2 + attn_resolutions: [ ] + dropout: 0.0 + lossconfig: + target: torch.nn.Identity + + cond_stage_config: + target: ldm.modules.encoders.modules.FrozenOpenCLIPEmbedder + params: + freeze: True + layer: "penultimate" + + +data: + target: ldm.data.laion.WebDataModuleFromConfig + params: + tar_base: null # for concat as in LAION-A + p_unsafe_threshold: 0.1 + filter_word_list: "data/filters.yaml" + max_pwatermark: 0.45 + batch_size: 8 + num_workers: 6 + multinode: True + min_size: 512 + train: + shards: + - "pipe:aws s3 cp s3://stability-aws/laion-a-native/part-0/{00000..18699}.tar -" + - "pipe:aws s3 cp s3://stability-aws/laion-a-native/part-1/{00000..18699}.tar -" + - "pipe:aws s3 cp s3://stability-aws/laion-a-native/part-2/{00000..18699}.tar -" + - "pipe:aws s3 cp s3://stability-aws/laion-a-native/part-3/{00000..18699}.tar -" + - "pipe:aws s3 cp s3://stability-aws/laion-a-native/part-4/{00000..18699}.tar -" #{00000-94333}.tar" + shuffle: 10000 + image_key: jpg + image_transforms: + - target: torchvision.transforms.Resize + params: + size: 512 + interpolation: 3 + - target: torchvision.transforms.RandomCrop + params: + size: 512 + postprocess: + target: ldm.data.laion.AddMask + params: + mode: "512train-large" + p_drop: 0.25 + # NOTE use enough shards to avoid empty validation loops in workers + validation: + shards: + - "pipe:aws s3 cp s3://deep-floyd-s3/datasets/laion_cleaned-part5/{93001..94333}.tar - " + shuffle: 0 + image_key: jpg + image_transforms: + - target: torchvision.transforms.Resize + params: + size: 512 + interpolation: 3 + - target: torchvision.transforms.CenterCrop + params: + size: 512 + postprocess: + target: ldm.data.laion.AddMask + params: + mode: "512train-large" + p_drop: 0.25 + +lightning: + find_unused_parameters: True + modelcheckpoint: + params: + every_n_train_steps: 5000 + + callbacks: + metrics_over_trainsteps_checkpoint: + params: + every_n_train_steps: 10000 + + image_logger: + target: main.ImageLogger + params: + enable_autocast: False + disabled: False + batch_frequency: 1000 + max_images: 4 + increase_log_steps: False + log_first_step: False + log_images_kwargs: + use_ema_scope: False + inpaint: False + plot_progressive_rows: False + plot_diffusion_rows: False + N: 4 + unconditional_guidance_scale: 5.0 + unconditional_guidance_label: [""] + ddim_steps: 50 # todo check these out for depth2img, + ddim_eta: 0.0 # todo check these out for depth2img, + + trainer: + benchmark: True + val_check_interval: 5000000 + num_sanity_val_steps: 0 + accumulate_grad_batches: 1 \ No newline at end of file diff --git a/invokeai/frontend/install/invokeai_update.py b/invokeai/frontend/install/invokeai_update.py index 18ad71957e..f73f670496 100644 --- a/invokeai/frontend/install/invokeai_update.py +++ b/invokeai/frontend/install/invokeai_update.py @@ -108,11 +108,11 @@ def main(): print(f':crossed_fingers: Upgrading to [yellow]{tag if tag else release}[/yellow]') if release: - cmd = f"pip install 'invokeai{extras} @ {INVOKE_AI_SRC}/{release}.zip' --use-pep517 --upgrade" + cmd = f'pip install "invokeai{extras} @ {INVOKE_AI_SRC}/{release}.zip" --use-pep517 --upgrade' elif tag: - cmd = f"pip install 'invokeai{extras} @ {INVOKE_AI_TAG}/{tag}.zip' --use-pep517 --upgrade" + cmd = f'pip install "invokeai{extras} @ {INVOKE_AI_TAG}/{tag}.zip" --use-pep517 --upgrade' else: - cmd = f"pip install 'invokeai{extras} @ {INVOKE_AI_BRANCH}/{branch}.zip' --use-pep517 --upgrade" + cmd = f'pip install "invokeai{extras} @ {INVOKE_AI_BRANCH}/{branch}.zip" --use-pep517 --upgrade' print('') print('') if os.system(cmd)==0: diff --git a/invokeai/frontend/install/model_install.py b/invokeai/frontend/install/model_install.py index 265c456e3a..736d27a321 100644 --- a/invokeai/frontend/install/model_install.py +++ b/invokeai/frontend/install/model_install.py @@ -11,7 +11,6 @@ The work is actually done in backend code in model_install_backend.py. import argparse import curses -import os import sys import textwrap import traceback @@ -20,28 +19,22 @@ from multiprocessing import Process from multiprocessing.connection import Connection, Pipe from pathlib import Path from shutil import get_terminal_size -from typing import List import logging import npyscreen import torch from npyscreen import widget -from omegaconf import OmegaConf from invokeai.backend.util.logging import InvokeAILogger from invokeai.backend.install.model_install_backend import ( - Dataset_path, - default_config_file, - default_dataset, - install_requested_models, - recommended_datasets, ModelInstallList, - UserSelections, + InstallSelections, + ModelInstall, + SchedulerPredictionType, ) -from invokeai.backend import ModelManager +from invokeai.backend.model_management import ModelManager, ModelType from invokeai.backend.util import choose_precision, choose_torch_device -from invokeai.backend.util.logging import InvokeAILogger from invokeai.frontend.install.widgets import ( CenteredTitleText, MultiSelectColumns, @@ -58,6 +51,7 @@ from invokeai.frontend.install.widgets import ( from invokeai.app.services.config import InvokeAIAppConfig config = InvokeAIAppConfig.get_config() +logger = InvokeAILogger.getLogger() # build a table mapping all non-printable characters to None # for stripping control characters @@ -71,8 +65,8 @@ def make_printable(s:str)->str: return s.translate(NOPRINT_TRANS_TABLE) class addModelsForm(CyclingForm, npyscreen.FormMultiPage): - # for responsive resizing - disabled - # FIX_MINIMUM_SIZE_WHEN_CREATED = False + # for responsive resizing set to False, but this seems to cause a crash! + FIX_MINIMUM_SIZE_WHEN_CREATED = True # for persistence current_tab = 0 @@ -90,25 +84,10 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): if not config.model_conf_path.exists(): with open(config.model_conf_path,'w') as file: print('# InvokeAI model configuration file',file=file) - model_manager = ModelManager(config.model_conf_path) - - self.starter_models = OmegaConf.load(Dataset_path)['diffusers'] - self.installed_diffusers_models = self.list_additional_diffusers_models( - model_manager, - self.starter_models, - ) - self.installed_cn_models = model_manager.list_controlnet_models() - self.installed_lora_models = model_manager.list_lora_models() - self.installed_ti_models = model_manager.list_ti_models() - - try: - self.existing_models = OmegaConf.load(default_config_file()) - except: - self.existing_models = dict() - - self.starter_model_list = list(self.starter_models.keys()) - self.installed_models = dict() - + self.installer = ModelInstall(config) + self.all_models = self.installer.all_models() + self.starter_models = self.installer.starter_models() + self.model_labels = self._get_model_labels() window_width, window_height = get_terminal_size() self.nextrely -= 1 @@ -141,39 +120,37 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): scroll_exit = True, ) self.tabs.on_changed = self._toggle_tables - + top_of_table = self.nextrely - self.starter_diffusers_models = self.add_starter_diffusers() + self.starter_pipelines = self.add_starter_pipelines() bottom_of_table = self.nextrely self.nextrely = top_of_table - self.diffusers_models = self.add_diffusers_widgets( - predefined_models=self.installed_diffusers_models, - model_type='Diffusers', + self.pipeline_models = self.add_pipeline_widgets( + model_type=ModelType.Main, window_width=window_width, + exclude = self.starter_models ) + # self.pipeline_models['autoload_pending'] = True bottom_of_table = max(bottom_of_table,self.nextrely) self.nextrely = top_of_table self.controlnet_models = self.add_model_widgets( - predefined_models=self.installed_cn_models, - model_type='ControlNet', + model_type=ModelType.ControlNet, window_width=window_width, ) bottom_of_table = max(bottom_of_table,self.nextrely) self.nextrely = top_of_table self.lora_models = self.add_model_widgets( - predefined_models=self.installed_lora_models, - model_type="LoRA/LyCORIS", + model_type=ModelType.Lora, window_width=window_width, ) bottom_of_table = max(bottom_of_table,self.nextrely) self.nextrely = top_of_table self.ti_models = self.add_model_widgets( - predefined_models=self.installed_ti_models, - model_type="Textual Inversion Embeddings", + model_type=ModelType.TextualInversion, window_width=window_width, ) bottom_of_table = max(bottom_of_table,self.nextrely) @@ -184,7 +161,7 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): BufferBox, name='Log Messages', editable=False, - max_height = 16, + max_height = 10, ) self.nextrely += 1 @@ -197,13 +174,14 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): rely=-3, when_pressed_function=self.on_back, ) - self.ok_button = self.add_widget_intelligent( - npyscreen.ButtonPress, - name=done_label, - relx=(window_width - len(done_label)) // 2, - rely=-3, - when_pressed_function=self.on_execute - ) + else: + self.ok_button = self.add_widget_intelligent( + npyscreen.ButtonPress, + name=done_label, + relx=(window_width - len(done_label)) // 2, + rely=-3, + when_pressed_function=self.on_execute + ) label = "APPLY CHANGES & EXIT" self.done = self.add_widget_intelligent( @@ -220,18 +198,15 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): self._toggle_tables([self.current_tab]) ############# diffusers tab ########## - def add_starter_diffusers(self)->dict[str, npyscreen.widget]: + def add_starter_pipelines(self)->dict[str, npyscreen.widget]: '''Add widgets responsible for selecting diffusers models''' widgets = dict() - - starter_model_labels = self._get_starter_model_labels() - recommended_models = [ - x - for x in self.starter_model_list - if self.starter_models[x].get("recommended", False) - ] + models = self.all_models + starters = self.starter_models + starter_model_labels = self.model_labels + self.installed_models = sorted( - [x for x in list(self.starter_models.keys()) if x in self.existing_models] + [x for x in starters if models[x].installed] ) widgets.update( @@ -246,55 +221,46 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): self.nextrely -= 1 # if user has already installed some initial models, then don't patronize them # by showing more recommendations - show_recommended = not self.existing_models + show_recommended = len(self.installed_models)==0 + keys = [x for x in models.keys() if x in starters] widgets.update( models_selected = self.add_widget_intelligent( MultiSelectColumns, columns=1, name="Install Starter Models", - values=starter_model_labels, + values=[starter_model_labels[x] for x in keys], value=[ - self.starter_model_list.index(x) - for x in self.starter_model_list - if (show_recommended and x in recommended_models)\ - or (x in self.existing_models) + keys.index(x) + for x in keys + if (show_recommended and models[x].recommended) \ + or (x in self.installed_models) ], - max_height=len(starter_model_labels) + 1, + max_height=len(starters) + 1, relx=4, scroll_exit=True, - ) + ), + models = keys, ) - widgets.update( - purge_deleted = self.add_widget_intelligent( - npyscreen.Checkbox, - name="Purge unchecked diffusers models from disk", - value=False, - scroll_exit=True, - relx=4, - ) - ) - widgets['purge_deleted'].when_value_edited = lambda: self.sync_purge_buttons(widgets['purge_deleted']) - self.nextrely += 1 return widgets ############# Add a set of model install widgets ######## def add_model_widgets(self, - predefined_models: dict[str,bool], - model_type: str, + model_type: ModelType, window_width: int=120, install_prompt: str=None, - add_purge_deleted: bool=False, + exclude: set=set(), )->dict[str,npyscreen.widget]: '''Generic code to create model selection widgets''' widgets = dict() - model_list = sorted(predefined_models.keys()) + model_list = [x for x in self.all_models if self.all_models[x].model_type==model_type and not x in exclude] + model_labels = [self.model_labels[x] for x in model_list] if len(model_list) > 0: - max_width = max([len(x) for x in model_list]) + max_width = max([len(x) for x in model_labels]) columns = window_width // (max_width+8) # 8 characters for "[x] " and padding columns = min(len(model_list),columns) or 1 - prompt = install_prompt or f"Select the desired {model_type} models to install. Unchecked models will be purged from disk." + prompt = install_prompt or f"Select the desired {model_type.value.title()} models to install. Unchecked models will be purged from disk." widgets.update( label1 = self.add_widget_intelligent( @@ -310,31 +276,19 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): MultiSelectColumns, columns=columns, name=f"Install {model_type} Models", - values=model_list, + values=model_labels, value=[ model_list.index(x) for x in model_list - if predefined_models[x] + if self.all_models[x].installed ], max_height=len(model_list)//columns + 1, relx=4, scroll_exit=True, - ) + ), + models = model_list, ) - if add_purge_deleted: - self.nextrely += 1 - widgets.update( - purge_deleted = self.add_widget_intelligent( - npyscreen.Checkbox, - name="Purge unchecked diffusers models from disk", - value=False, - scroll_exit=True, - relx=4, - ) - ) - widgets['purge_deleted'].when_value_edited = lambda: self.sync_purge_buttons(widgets['purge_deleted']) - self.nextrely += 1 widgets.update( download_ids = self.add_widget_intelligent( @@ -348,63 +302,33 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): return widgets ### Tab for arbitrary diffusers widgets ### - def add_diffusers_widgets(self, - predefined_models: dict[str,bool], - model_type: str='Diffusers', - window_width: int=120, - )->dict[str,npyscreen.widget]: + def add_pipeline_widgets(self, + model_type: ModelType=ModelType.Main, + window_width: int=120, + **kwargs, + )->dict[str,npyscreen.widget]: '''Similar to add_model_widgets() but adds some additional widgets at the bottom to support the autoload directory''' widgets = self.add_model_widgets( - predefined_models, - 'Diffusers', - window_width, - install_prompt="Additional diffusers models already installed.", - add_purge_deleted=True + model_type = model_type, + window_width = window_width, + install_prompt=f"Additional {model_type.value.title()} models already installed.", + **kwargs, ) - label = "Directory to scan for models to automatically import ( autocompletes):" - self.nextrely += 1 - widgets.update( - autoload_directory = self.add_widget_intelligent( - FileBox, - max_height=3, - name=label, - value=str(config.autoconvert_dir) if config.autoconvert_dir else None, - select_dir=True, - must_exist=True, - use_two_lines=False, - labelColor="DANGER", - begin_entry_at=len(label)+1, - scroll_exit=True, - ) - ) - widgets.update( - autoscan_on_startup = self.add_widget_intelligent( - npyscreen.Checkbox, - name="Scan and import from this directory each time InvokeAI starts", - value=config.autoconvert_dir is not None, - relx=4, - scroll_exit=True, - ) - ) return widgets - def sync_purge_buttons(self,checkbox): - value = checkbox.value - self.starter_diffusers_models['purge_deleted'].value = value - self.diffusers_models['purge_deleted'].value = value - def resize(self): super().resize() - if (s := self.starter_diffusers_models.get("models_selected")): - s.values = self._get_starter_model_labels() + if (s := self.starter_pipelines.get("models_selected")): + keys = [x for x in self.all_models.keys() if x in self.starter_models] + s.values = [self.model_labels[x] for x in keys] def _toggle_tables(self, value=None): selected_tab = value[0] widgets = [ - self.starter_diffusers_models, - self.diffusers_models, + self.starter_pipelines, + self.pipeline_models, self.controlnet_models, self.lora_models, self.ti_models, @@ -412,34 +336,38 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): for group in widgets: for k,v in group.items(): - v.hidden = True - v.editable = False + try: + v.hidden = True + v.editable = False + except: + pass for k,v in widgets[selected_tab].items(): - v.hidden = False - if not isinstance(v,(npyscreen.FixedText, npyscreen.TitleFixedText, CenteredTitleText)): - v.editable = True + try: + v.hidden = False + if not isinstance(v,(npyscreen.FixedText, npyscreen.TitleFixedText, CenteredTitleText)): + v.editable = True + except: + pass self.__class__.current_tab = selected_tab # for persistence self.display() - def _get_starter_model_labels(self) -> List[str]: + def _get_model_labels(self) -> dict[str,str]: window_width, window_height = get_terminal_size() - label_width = 25 checkbox_width = 4 spacing_width = 2 + + models = self.all_models + label_width = max([len(models[x].name) for x in models]) description_width = window_width - label_width - checkbox_width - spacing_width - im = self.starter_models - names = self.starter_model_list - descriptions = [ - im[x].description[0 : description_width - 3] + "..." - if len(im[x].description) > description_width - else im[x].description - for x in names - ] - return [ - f"%-{label_width}s %s" % (names[x], descriptions[x]) - for x in range(0, len(names)) - ] + result = dict() + for x in models.keys(): + description = models[x].description + description = description[0 : description_width - 3] + "..." \ + if description and len(description) > description_width \ + else description if description else '' + result[x] = f"%-{label_width}s %s" % (models[x].name, description) + return result def _get_columns(self) -> int: window_width, window_height = get_terminal_size() @@ -454,10 +382,21 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): ) return min(cols, len(self.installed_models)) + def confirm_deletions(self, selections: InstallSelections)->bool: + remove_models = selections.remove_models + if len(remove_models) > 0: + mods = "\n".join([ModelManager.parse_key(x)[0] for x in remove_models]) + return npyscreen.notify_ok_cancel(f"These unchecked models will be deleted from disk. Continue?\n---------\n{mods}") + else: + return True + def on_execute(self): - self.monitor.entry_widget.buffer(['Processing...'],scroll_end=True) self.marshall_arguments() app = self.parentApp + if not self.confirm_deletions(app.install_selections): + return + + self.monitor.entry_widget.buffer(['Processing...'],scroll_end=True) self.ok_button.hidden = True self.display() @@ -467,7 +406,7 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): target = process_and_execute, kwargs=dict( opt = app.program_opts, - selections = app.user_selections, + selections = app.install_selections, conn_out = child_conn, ) ) @@ -475,8 +414,8 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): child_conn.close() self.subprocess_connection = parent_conn self.subprocess = p - app.user_selections = UserSelections() - # process_and_execute(app.opt, app.user_selections) + app.install_selections = InstallSelections() + # process_and_execute(app.opt, app.install_selections) def on_back(self): self.parentApp.switchFormPrevious() @@ -489,10 +428,12 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): def on_done(self): self.marshall_arguments() + if not self.confirm_deletions(self.parentApp.install_selections): + return self.parentApp.setNextForm(None) self.parentApp.user_cancelled = False self.editing = False - + ########## This routine monitors the child process that is performing model installation and removal ##### def while_waiting(self): '''Called during idle periods. Main task is to update the Log Messages box with messages @@ -548,8 +489,8 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): # rebuild the form, saving and restoring some of the fields that need to be preserved. saved_messages = self.monitor.entry_widget.values - autoload_dir = self.diffusers_models['autoload_directory'].value - autoscan = self.diffusers_models['autoscan_on_startup'].value + # autoload_dir = str(config.root_path / self.pipeline_models['autoload_directory'].value) + # autoscan = self.pipeline_models['autoscan_on_startup'].value app.main_form = app.addForm( "MAIN", addModelsForm, name="Install Stable Diffusion Models", multipage=self.multipage, @@ -558,23 +499,8 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): app.main_form.monitor.entry_widget.values = saved_messages app.main_form.monitor.entry_widget.buffer([''],scroll_end=True) - app.main_form.diffusers_models['autoload_directory'].value = autoload_dir - app.main_form.diffusers_models['autoscan_on_startup'].value = autoscan - - ############################################################### - - def list_additional_diffusers_models(self, - manager: ModelManager, - starters:dict - )->dict[str,bool]: - '''Return a dict of all the currently installed models that are not on the starter list''' - model_info = manager.list_models() - additional_models = { - x:True for x in model_info \ - if model_info[x]['format']=='diffusers' \ - and x not in starters - } - return additional_models + # app.main_form.pipeline_models['autoload_directory'].value = autoload_dir + # app.main_form.pipeline_models['autoscan_on_startup'].value = autoscan def marshall_arguments(self): """ @@ -586,89 +512,40 @@ class addModelsForm(CyclingForm, npyscreen.FormMultiPage): .autoscan_on_startup: True if invokeai should scan and import at startup time .import_model_paths: list of URLs, repo_ids and file paths to import """ - # we're using a global here rather than storing the result in the parentapp - # due to some bug in npyscreen that is causing attributes to be lost - selections = self.parentApp.user_selections + selections = self.parentApp.install_selections + all_models = self.all_models - # Starter models to install/remove - starter_models = dict( - map( - lambda x: (self.starter_model_list[x], True), - self.starter_diffusers_models['models_selected'].value, - ) - ) - selections.purge_deleted_models = self.starter_diffusers_models['purge_deleted'].value or \ - self.diffusers_models['purge_deleted'].value - - selections.install_models = [x for x in starter_models if x not in self.existing_models] - selections.remove_models = [x for x in self.starter_model_list if x in self.existing_models and x not in starter_models] + # Defined models (in INITIAL_CONFIG.yaml or models.yaml) to add/remove + ui_sections = [self.starter_pipelines, self.pipeline_models, + self.controlnet_models, self.lora_models, self.ti_models] + for section in ui_sections: + if not 'models_selected' in section: + continue + selected = set([section['models'][x] for x in section['models_selected'].value]) + models_to_install = [x for x in selected if not self.all_models[x].installed] + models_to_remove = [x for x in section['models'] if x not in selected and self.all_models[x].installed] + selections.remove_models.extend(models_to_remove) + selections.install_models.extend(all_models[x].path or all_models[x].repo_id \ + for x in models_to_install if all_models[x].path or all_models[x].repo_id) - # "More" models - selections.import_model_paths = self.diffusers_models['download_ids'].value.split() - if diffusers_selected := self.diffusers_models.get('models_selected'): - selections.remove_models.extend([x - for x in diffusers_selected.values - if self.installed_diffusers_models[x] - and diffusers_selected.values.index(x) not in diffusers_selected.value - ] - ) - - # TODO: REFACTOR THIS REPETITIVE CODE - if cn_models_selected := self.controlnet_models.get('models_selected'): - selections.install_cn_models = [cn_models_selected.values[x] - for x in cn_models_selected.value - if not self.installed_cn_models[cn_models_selected.values[x]] - ] - selections.remove_cn_models = [x - for x in cn_models_selected.values - if self.installed_cn_models[x] - and cn_models_selected.values.index(x) not in cn_models_selected.value - ] - if (additional_cns := self.controlnet_models['download_ids'].value.split()): - valid_cns = [x for x in additional_cns if '/' in x] - selections.install_cn_models.extend(valid_cns) + # models located in the 'download_ids" section + for section in ui_sections: + if downloads := section.get('download_ids'): + selections.install_models.extend(downloads.value.split()) - # same thing, for LoRAs - if loras_selected := self.lora_models.get('models_selected'): - selections.install_lora_models = [loras_selected.values[x] - for x in loras_selected.value - if not self.installed_lora_models[loras_selected.values[x]] - ] - selections.remove_lora_models = [x - for x in loras_selected.values - if self.installed_lora_models[x] - and loras_selected.values.index(x) not in loras_selected.value - ] - if (additional_loras := self.lora_models['download_ids'].value.split()): - selections.install_lora_models.extend(additional_loras) - - # same thing, for TIs - # TODO: refactor - if tis_selected := self.ti_models.get('models_selected'): - selections.install_ti_models = [tis_selected.values[x] - for x in tis_selected.value - if not self.installed_ti_models[tis_selected.values[x]] - ] - selections.remove_ti_models = [x - for x in tis_selected.values - if self.installed_ti_models[x] - and tis_selected.values.index(x) not in tis_selected.value - ] - - if (additional_tis := self.ti_models['download_ids'].value.split()): - selections.install_ti_models.extend(additional_tis) - # load directory and whether to scan on startup - selections.scan_directory = self.diffusers_models['autoload_directory'].value - selections.autoscan_on_startup = self.diffusers_models['autoscan_on_startup'].value - + # if self.parentApp.autoload_pending: + # selections.scan_directory = str(config.root_path / self.pipeline_models['autoload_directory'].value) + # self.parentApp.autoload_pending = False + # selections.autoscan_on_startup = self.pipeline_models['autoscan_on_startup'].value class AddModelApplication(npyscreen.NPSAppManaged): def __init__(self,opt): super().__init__() self.program_opts = opt self.user_cancelled = False - self.user_selections = UserSelections() + # self.autoload_pending = True + self.install_selections = InstallSelections() def onStart(self): npyscreen.setTheme(npyscreen.Themes.DefaultTheme) @@ -687,26 +564,22 @@ class StderrToMessage(): pass # -------------------------------------------------------- -def ask_user_for_config_file(model_path: Path, - tui_conn: Connection=None - )->Path: +def ask_user_for_prediction_type(model_path: Path, + tui_conn: Connection=None + )->SchedulerPredictionType: if tui_conn: logger.debug('Waiting for user response...') - return _ask_user_for_cf_tui(model_path, tui_conn) + return _ask_user_for_pt_tui(model_path, tui_conn) else: - return _ask_user_for_cf_cmdline(model_path) + return _ask_user_for_pt_cmdline(model_path) -def _ask_user_for_cf_cmdline(model_path): - choices = [ - config.legacy_conf_path / x - for x in ['v2-inference.yaml','v2-inference-v.yaml'] - ] - choices.extend([None]) +def _ask_user_for_pt_cmdline(model_path: Path)->SchedulerPredictionType: + choices = [SchedulerPredictionType.Epsilon, SchedulerPredictionType.VPrediction, None] print( f""" Please select the type of the V2 checkpoint named {model_path.name}: -[1] A Stable Diffusion v2.x base model (512 pixels; there should be no 'parameterization:' line in its yaml file) -[2] A Stable Diffusion v2.x v-predictive model (768 pixels; look for a 'parameterization: "v"' line in its yaml file) +[1] A model based on Stable Diffusion v2 trained on 512 pixel images (SD-2-base) +[2] A model based on Stable Diffusion v2 trained on 768 pixel images (SD-2-768) [3] Skip this model and come back later. """ ) @@ -723,7 +596,7 @@ Please select the type of the V2 checkpoint named {model_path.name}: return return choice -def _ask_user_for_cf_tui(model_path: Path, tui_conn: Connection)->Path: +def _ask_user_for_pt_tui(model_path: Path, tui_conn: Connection)->SchedulerPredictionType: try: tui_conn.send_bytes(f'*need v2 config for:{model_path}'.encode('utf-8')) # note that we don't do any status checking here @@ -731,20 +604,20 @@ def _ask_user_for_cf_tui(model_path: Path, tui_conn: Connection)->Path: if response is None: return None elif response == 'epsilon': - return config.legacy_conf_path / 'v2-inference.yaml' + return SchedulerPredictionType.epsilon elif response == 'v': - return config.legacy_conf_path / 'v2-inference-v.yaml' + return SchedulerPredictionType.VPrediction elif response == 'abort': logger.info('Conversion aborted') return None else: - return Path(response) + return response except: return None # -------------------------------------------------------- def process_and_execute(opt: Namespace, - selections: UserSelections, + selections: InstallSelections, conn_out: Connection=None, ): # set up so that stderr is sent to conn_out @@ -755,34 +628,14 @@ def process_and_execute(opt: Namespace, logger = InvokeAILogger.getLogger() logger.handlers.clear() logger.addHandler(logging.StreamHandler(translator)) - - models_to_install = selections.install_models - models_to_remove = selections.remove_models - directory_to_scan = selections.scan_directory - scan_at_startup = selections.autoscan_on_startup - potential_models_to_install = selections.import_model_paths - install_requested_models( - diffusers = ModelInstallList(models_to_install, models_to_remove), - controlnet = ModelInstallList(selections.install_cn_models, selections.remove_cn_models), - lora = ModelInstallList(selections.install_lora_models, selections.remove_lora_models), - ti = ModelInstallList(selections.install_ti_models, selections.remove_ti_models), - scan_directory=Path(directory_to_scan) if directory_to_scan else None, - external_models=potential_models_to_install, - scan_at_startup=scan_at_startup, - precision="float32" - if opt.full_precision - else choose_precision(torch.device(choose_torch_device())), - purge_deleted=selections.purge_deleted_models, - config_file_path=Path(opt.config_file) if opt.config_file else config.model_conf_path, - model_config_file_callback = lambda x: ask_user_for_config_file(x,conn_out) - ) + installer = ModelInstall(config, prediction_type_helper=lambda x: ask_user_for_prediction_type(x,conn_out)) + installer.install(selections) if conn_out: conn_out.send_bytes('*done*'.encode('utf-8')) conn_out.close() - def do_listings(opt)->bool: """List installed models of various sorts, and return True if any were requested.""" @@ -813,38 +666,32 @@ def select_and_download_models(opt: Namespace): if opt.full_precision else choose_precision(torch.device(choose_torch_device())) ) - - if do_listings(opt): - pass - # this processes command line additions/removals - elif opt.diffusers or opt.controlnets or opt.textual_inversions or opt.loras: - action = 'remove_models' if opt.delete else 'install_models' - diffusers_args = {'diffusers':ModelInstallList(remove_models=opt.diffusers or [])} \ - if opt.delete \ - else {'external_models':opt.diffusers or []} - install_requested_models( - **diffusers_args, - controlnet=ModelInstallList(**{action:opt.controlnets or []}), - ti=ModelInstallList(**{action:opt.textual_inversions or []}), - lora=ModelInstallList(**{action:opt.loras or []}), - precision=precision, - purge_deleted=True, - model_config_file_callback=lambda x: ask_user_for_config_file(x), + config.precision = precision + helper = lambda x: ask_user_for_prediction_type(x) + # if do_listings(opt): + # pass + + installer = ModelInstall(config, prediction_type_helper=helper) + if opt.add or opt.delete: + selections = InstallSelections( + install_models = opt.add or [], + remove_models = opt.delete or [] ) + installer.install(selections) elif opt.default_only: - install_requested_models( - diffusers=ModelInstallList(install_models=default_dataset()), - precision=precision, + selections = InstallSelections( + install_models = installer.default_model() ) + installer.install(selections) elif opt.yes_to_all: - install_requested_models( - diffusers=ModelInstallList(install_models=recommended_datasets()), - precision=precision, + selections = InstallSelections( + install_models = installer.recommended_models() ) + installer.install(selections) # this is where the TUI is called else: - # needed because the torch library is loaded, even though we don't use it + # needed to support the probe() method running under a subprocess torch.multiprocessing.set_start_method("spawn") # the third argument is needed in the Windows 11 environment in @@ -861,35 +708,20 @@ def select_and_download_models(opt: Namespace): installApp.main_form.subprocess.terminate() installApp.main_form.subprocess = None raise e - process_and_execute(opt, installApp.user_selections) + process_and_execute(opt, installApp.install_selections) # ------------------------------------- def main(): parser = argparse.ArgumentParser(description="InvokeAI model downloader") parser.add_argument( - "--diffusers", + "--add", nargs="*", - help="List of URLs or repo_ids of diffusers to install/delete", - ) - parser.add_argument( - "--loras", - nargs="*", - help="List of URLs or repo_ids of LoRA/LyCORIS models to install/delete", - ) - parser.add_argument( - "--controlnets", - nargs="*", - help="List of URLs or repo_ids of controlnet models to install/delete", - ) - parser.add_argument( - "--textual-inversions", - nargs="*", - help="List of URLs or repo_ids of textual inversion embeddings to install/delete", + help="List of URLs, local paths or repo_ids of models to install", ) parser.add_argument( "--delete", - action="store_true", - help="Delete models listed on command line rather than installing them", + nargs="*", + help="List of names of models to idelete", ) parser.add_argument( "--full-precision", @@ -909,7 +741,7 @@ def main(): parser.add_argument( "--default_only", action="store_true", - help="only install the default model", + help="Only install the default model", ) parser.add_argument( "--list-models", @@ -941,7 +773,7 @@ def main(): config.parse_args(invoke_args) logger = InvokeAILogger().getLogger(config=config) - if not (config.root_dir / config.conf_path.parent).exists(): + if not (config.conf_path / 'models.yaml').exists(): logger.info( "Your InvokeAI root directory is not set up. Calling invokeai-configure." ) @@ -965,13 +797,15 @@ def main(): logger.error( "Insufficient vertical space for the interface. Please make your window taller and try again" ) - elif str(e).startswith("addwstr"): + input('Press any key to continue...') + except Exception as e: + if str(e).startswith("addwstr"): logger.error( "Insufficient horizontal space for the interface. Please make your window wider and try again." ) - except Exception as e: - print(f'An exception has occurred: {str(e)} Details:') - print(traceback.format_exc(), file=sys.stderr) + else: + print(f'An exception has occurred: {str(e)} Details:') + print(traceback.format_exc(), file=sys.stderr) input('Press any key to continue...') diff --git a/invokeai/frontend/install/widgets.py b/invokeai/frontend/install/widgets.py index 14167d4ee0..c3bb3542ae 100644 --- a/invokeai/frontend/install/widgets.py +++ b/invokeai/frontend/install/widgets.py @@ -17,8 +17,8 @@ from shutil import get_terminal_size from curses import BUTTON2_CLICKED,BUTTON3_CLICKED # minimum size for UIs -MIN_COLS = 120 -MIN_LINES = 50 +MIN_COLS = 130 +MIN_LINES = 45 # ------------------------------------- def set_terminal_size(columns: int, lines: int, launch_command: str=None): @@ -42,6 +42,18 @@ def set_terminal_size(columns: int, lines: int, launch_command: str=None): elif OS in ["Darwin", "Linux"]: _set_terminal_size_unix(width,height) + # check whether it worked.... + ts = get_terminal_size() + pause = False + if ts.columns < columns: + print('\033[1mThis window is too narrow for the user interface. Please make it wider.\033[0m') + pause = True + if ts.lines < lines: + print('\033[1mThis window is too short for the user interface. Please make it taller.\033[0m') + pause = True + if pause: + input('Press any key to continue..') + def _set_terminal_size_powershell(width: int, height: int): script=f''' $pshost = get-host @@ -61,6 +73,12 @@ def _set_terminal_size_unix(width: int, height: int): import fcntl import termios + # These terminals accept the size command and report that the + # size changed, but they lie!!! + for bad_terminal in ['TERMINATOR_UUID', 'ALACRITTY_WINDOW_ID']: + if os.environ.get(bad_terminal): + return + winsize = struct.pack("HHHH", height, width, 0, 0) fcntl.ioctl(sys.stdout.fileno(), termios.TIOCSWINSZ, winsize) sys.stdout.write("\x1b[8;{height};{width}t".format(height=height, width=width)) @@ -75,6 +93,12 @@ def set_min_terminal_size(min_cols: int, min_lines: int, launch_command: str=Non lines = max(term_lines, min_lines) set_terminal_size(cols, lines, launch_command) + # did it work? + term_cols, term_lines = get_terminal_size() + if term_cols < cols or term_lines < lines: + print(f'This window is too small for optimal display. For best results please enlarge it.') + input('After resizing, press any key to continue...') + class IntSlider(npyscreen.Slider): def translate_value(self): stri = "%2d / %2d" % (self.value, self.out_of) @@ -378,13 +402,12 @@ def select_stable_diffusion_config_file( wrap:bool =True, model_name:str='Unknown', ): - message = "Please select the correct base model for the V2 checkpoint named {model_name}. Press to skip installation." + message = f"Please select the correct base model for the V2 checkpoint named '{model_name}'. Press to skip installation." title = "CONFIG FILE SELECTION" options=[ "An SD v2.x base model (512 pixels; no 'parameterization:' line in its yaml file)", "An SD v2.x v-predictive model (768 pixels; 'parameterization: \"v\"' line in its yaml file)", "Skip installation for now and come back later", - "Enter config file path manually", ] F = ConfirmCancelPopup( @@ -406,35 +429,17 @@ def select_stable_diffusion_config_file( mlw.values = message choice = F.add( - SingleSelectWithChanged, + npyscreen.SelectOne, values = options, value = [0], max_height = len(options)+1, scroll_exit=True, ) - file = F.add( - FileBox, - name='Path to config file', - max_height=3, - hidden=True, - must_exist=True, - scroll_exit=True - ) - - def toggle_visible(value): - value = value[0] - if value==3: - file.hidden=False - else: - file.hidden=True - F.display() - - choice.on_changed = toggle_visible F.editw = 1 F.edit() if not F.value: return None - assert choice.value[0] in range(0,4),'invalid choice' - choices = ['epsilon','v','abort',file.value] + assert choice.value[0] in range(0,3),'invalid choice' + choices = ['epsilon','v','abort'] return choices[choice.value[0]] diff --git a/invokeai/frontend/legacy_launch_invokeai.py b/invokeai/frontend/legacy_launch_invokeai.py new file mode 100644 index 0000000000..349fa5b945 --- /dev/null +++ b/invokeai/frontend/legacy_launch_invokeai.py @@ -0,0 +1,19 @@ +import os +import sys +import argparse + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--web', action='store_true') + opts,_ = parser.parse_known_args() + + if opts.web: + sys.argv.pop(sys.argv.index('--web')) + from invokeai.app.api_app import invoke_api + invoke_api() + else: + from invokeai.app.cli_app import invoke_cli + invoke_cli() + +if __name__ == '__main__': + main() diff --git a/invokeai/frontend/merge/__init__.py b/invokeai/frontend/merge/__init__.py index fb892fd7db..f1fc66c39e 100644 --- a/invokeai/frontend/merge/__init__.py +++ b/invokeai/frontend/merge/__init__.py @@ -1,4 +1,5 @@ """ Initialization file for invokeai.frontend.merge """ -from .merge_diffusers import main as invokeai_merge_diffusers, merge_diffusion_models +from .merge_diffusers import main as invokeai_merge_diffusers + diff --git a/invokeai/frontend/merge/merge_diffusers.py b/invokeai/frontend/merge/merge_diffusers.py index 9da04b97f8..c20d913883 100644 --- a/invokeai/frontend/merge/merge_diffusers.py +++ b/invokeai/frontend/merge/merge_diffusers.py @@ -6,9 +6,7 @@ Copyright (c) 2023 Lincoln Stein and the InvokeAI Development Team """ import argparse import curses -import os import sys -import warnings from argparse import Namespace from pathlib import Path from typing import List, Union @@ -20,99 +18,15 @@ from npyscreen import widget from omegaconf import OmegaConf import invokeai.backend.util.logging as logger -from invokeai.services.config import InvokeAIAppConfig -from ...backend.model_management import ModelManager -from ...frontend.install.widgets import FloatTitleSlider +from invokeai.app.services.config import InvokeAIAppConfig +from invokeai.backend.model_management import ( + ModelMerger, MergeInterpolationMethod, + ModelManager, ModelType, BaseModelType, +) +from invokeai.frontend.install.widgets import FloatTitleSlider, TextBox, SingleSelectColumns -DEST_MERGED_MODEL_DIR = "merged_models" config = InvokeAIAppConfig.get_config() -def merge_diffusion_models( - model_ids_or_paths: List[Union[str, Path]], - alpha: float = 0.5, - interp: str = None, - force: bool = False, - **kwargs, -) -> DiffusionPipeline: - """ - model_ids_or_paths - up to three models, designated by their local paths or HuggingFace repo_ids - alpha - The interpolation parameter. Ranges from 0 to 1. It affects the ratio in which the checkpoints are merged. A 0.8 alpha - would mean that the first model checkpoints would affect the final result far less than an alpha of 0.2 - interp - The interpolation method to use for the merging. Supports "sigmoid", "inv_sigmoid", "add_difference" and None. - Passing None uses the default interpolation which is weighted sum interpolation. For merging three checkpoints, only "add_difference" is supported. - force - Whether to ignore mismatch in model_config.json for the current models. Defaults to False. - - **kwargs - the default DiffusionPipeline.get_config_dict kwargs: - cache_dir, resume_download, force_download, proxies, local_files_only, use_auth_token, revision, torch_dtype, device_map - """ - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - verbosity = dlogging.get_verbosity() - dlogging.set_verbosity_error() - - pipe = DiffusionPipeline.from_pretrained( - model_ids_or_paths[0], - cache_dir=kwargs.get("cache_dir", config.cache_dir), - custom_pipeline="checkpoint_merger", - ) - merged_pipe = pipe.merge( - pretrained_model_name_or_path_list=model_ids_or_paths, - alpha=alpha, - interp=interp, - force=force, - **kwargs, - ) - dlogging.set_verbosity(verbosity) - return merged_pipe - - -def merge_diffusion_models_and_commit( - models: List["str"], - merged_model_name: str, - alpha: float = 0.5, - interp: str = None, - force: bool = False, - **kwargs, -): - """ - models - up to three models, designated by their InvokeAI models.yaml model name - merged_model_name = name for new model - alpha - The interpolation parameter. Ranges from 0 to 1. It affects the ratio in which the checkpoints are merged. A 0.8 alpha - would mean that the first model checkpoints would affect the final result far less than an alpha of 0.2 - interp - The interpolation method to use for the merging. Supports "weighted_average", "sigmoid", "inv_sigmoid", "add_difference" and None. - Passing None uses the default interpolation which is weighted sum interpolation. For merging three checkpoints, only "add_difference" is supported. Add_difference is A+(B-C). - force - Whether to ignore mismatch in model_config.json for the current models. Defaults to False. - - **kwargs - the default DiffusionPipeline.get_config_dict kwargs: - cache_dir, resume_download, force_download, proxies, local_files_only, use_auth_token, revision, torch_dtype, device_map - """ - config_file = config.model_conf_path - model_manager = ModelManager(OmegaConf.load(config_file)) - for mod in models: - assert mod in model_manager.model_names(), f'** Unknown model "{mod}"' - assert ( - model_manager.model_info(mod).get("format", None) == "diffusers" - ), f"** {mod} is not a diffusers model. It must be optimized before merging." - model_ids_or_paths = [model_manager.model_name_or_path(x) for x in models] - - merged_pipe = merge_diffusion_models( - model_ids_or_paths, alpha, interp, force, **kwargs - ) - dump_path = config.models_dir / DEST_MERGED_MODEL_DIR - - os.makedirs(dump_path, exist_ok=True) - dump_path = dump_path / merged_model_name - merged_pipe.save_pretrained(dump_path, safe_serialization=1) - import_args = dict( - model_name=merged_model_name, description=f'Merge of models {", ".join(models)}' - ) - if vae := model_manager.config[models[0]].get("vae", None): - logger.info(f"Using configured VAE assigned to {models[0]}") - import_args.update(vae=vae) - model_manager.import_diffuser_model(dump_path, **import_args) - model_manager.commit(config_file) - - def _parse_args() -> Namespace: parser = argparse.ArgumentParser(description="InvokeAI model merging") parser.add_argument( @@ -131,10 +45,17 @@ def _parse_args() -> Namespace: ) parser.add_argument( "--models", + dest="model_names", type=str, nargs="+", help="Two to three model names to be merged", ) + parser.add_argument( + "--base_model", + type=str, + choices=[x.value for x in BaseModelType], + help="The base model shared by the models to be merged", + ) parser.add_argument( "--merged_model_name", "--destination", @@ -192,6 +113,7 @@ class mergeModelsForm(npyscreen.FormMultiPageAction): window_height, window_width = curses.initscr().getmaxyx() self.model_names = self.get_model_names() + self.current_base = 0 max_width = max([len(x) for x in self.model_names]) max_width += 6 horizontal_layout = max_width * 3 < window_width @@ -208,12 +130,26 @@ class mergeModelsForm(npyscreen.FormMultiPageAction): value="Use up and down arrows to move, to select an item, and to move from one field to the next.", editable=False, ) + self.nextrely += 1 + self.base_select = self.add_widget_intelligent( + SingleSelectColumns, + values=[ + 'Models Built on SD-1.x', + 'Models Built on SD-2.x', + ], + value=[self.current_base], + columns = 4, + max_height = 2, + relx=8, + scroll_exit = True, + ) + self.base_select.on_changed = self._populate_models self.add_widget_intelligent( npyscreen.FixedText, value="MODEL 1", color="GOOD", editable=False, - rely=4 if horizontal_layout else None, + rely=6 if horizontal_layout else None, ) self.model1 = self.add_widget_intelligent( npyscreen.SelectOne, @@ -222,7 +158,7 @@ class mergeModelsForm(npyscreen.FormMultiPageAction): max_height=len(self.model_names), max_width=max_width, scroll_exit=True, - rely=5, + rely=7, ) self.add_widget_intelligent( npyscreen.FixedText, @@ -230,7 +166,7 @@ class mergeModelsForm(npyscreen.FormMultiPageAction): color="GOOD", editable=False, relx=max_width + 3 if horizontal_layout else None, - rely=4 if horizontal_layout else None, + rely=6 if horizontal_layout else None, ) self.model2 = self.add_widget_intelligent( npyscreen.SelectOne, @@ -240,7 +176,7 @@ class mergeModelsForm(npyscreen.FormMultiPageAction): max_height=len(self.model_names), max_width=max_width, relx=max_width + 3 if horizontal_layout else None, - rely=5 if horizontal_layout else None, + rely=7 if horizontal_layout else None, scroll_exit=True, ) self.add_widget_intelligent( @@ -249,7 +185,7 @@ class mergeModelsForm(npyscreen.FormMultiPageAction): color="GOOD", editable=False, relx=max_width * 2 + 3 if horizontal_layout else None, - rely=4 if horizontal_layout else None, + rely=6 if horizontal_layout else None, ) models_plus_none = self.model_names.copy() models_plus_none.insert(0, "None") @@ -262,24 +198,26 @@ class mergeModelsForm(npyscreen.FormMultiPageAction): max_width=max_width, scroll_exit=True, relx=max_width * 2 + 3 if horizontal_layout else None, - rely=5 if horizontal_layout else None, + rely=7 if horizontal_layout else None, ) for m in [self.model1, self.model2, self.model3]: m.when_value_edited = self.models_changed self.merged_model_name = self.add_widget_intelligent( - npyscreen.TitleText, + TextBox, name="Name for merged model:", labelColor="CONTROL", + max_height=3, value="", scroll_exit=True, ) self.force = self.add_widget_intelligent( npyscreen.Checkbox, - name="Force merge of incompatible models", + name="Force merge of models created by different diffusers library versions", labelColor="CONTROL", - value=False, + value=True, scroll_exit=True, ) + self.nextrely += 1 self.merge_method = self.add_widget_intelligent( npyscreen.TitleSelectOne, name="Merge Method:", @@ -341,7 +279,8 @@ class mergeModelsForm(npyscreen.FormMultiPageAction): interp = self.interpolations[self.merge_method.value[0]] args = dict( - models=models, + model_names=models, + base_model=tuple(BaseModelType)[self.base_select.value[0]], alpha=self.alpha.value, interp=interp, force=self.force.value, @@ -379,21 +318,30 @@ class mergeModelsForm(npyscreen.FormMultiPageAction): else: return True - def get_model_names(self) -> List[str]: + def get_model_names(self, base_model: BaseModelType=None) -> List[str]: model_names = [ - name - for name in self.model_manager.model_names() - if self.model_manager.model_info(name).get("format") == "diffusers" + info["name"] + for info in self.model_manager.list_models(model_type=ModelType.Main, base_model=base_model) + if info["model_format"] == "diffusers" ] return sorted(model_names) + def _populate_models(self,value=None): + base_model = tuple(BaseModelType)[value[0]] + self.model_names = self.get_model_names(base_model) + + models_plus_none = self.model_names.copy() + models_plus_none.insert(0, "None") + self.model1.values = self.model_names + self.model2.values = self.model_names + self.model3.values = models_plus_none + + self.display() + class Mergeapp(npyscreen.NPSAppManaged): - def __init__(self): + def __init__(self, model_manager:ModelManager): super().__init__() - conf = OmegaConf.load(config.model_conf_path) - self.model_manager = ModelManager( - conf, "cpu", "float16" - ) # precision doesn't really matter here + self.model_manager = model_manager def onStart(self): npyscreen.setTheme(npyscreen.Themes.ElegantTheme) @@ -401,44 +349,41 @@ class Mergeapp(npyscreen.NPSAppManaged): def run_gui(args: Namespace): - mergeapp = Mergeapp() + model_manager = ModelManager(config.model_conf_path) + mergeapp = Mergeapp(model_manager) mergeapp.run() args = mergeapp.merge_arguments - merge_diffusion_models_and_commit(**args) + merger = ModelMerger(model_manager) + merger.merge_diffusion_models_and_save(**args) logger.info(f'Models merged into new model: "{args["merged_model_name"]}".') def run_cli(args: Namespace): assert args.alpha >= 0 and args.alpha <= 1.0, "alpha must be between 0 and 1" assert ( - args.models and len(args.models) >= 1 and len(args.models) <= 3 + args.model_names and len(args.model_names) >= 1 and len(args.model_names) <= 3 ), "Please provide the --models argument to list 2 to 3 models to merge. Use --help for full usage." if not args.merged_model_name: - args.merged_model_name = "+".join(args.models) + args.merged_model_name = "+".join(args.model_names) logger.info( f'No --merged_model_name provided. Defaulting to "{args.merged_model_name}"' ) - model_manager = ModelManager(OmegaConf.load(config.model_conf_path)) - assert ( - args.clobber or args.merged_model_name not in model_manager.model_names() - ), f'A model named "{args.merged_model_name}" already exists. Use --clobber to overwrite.' + model_manager = ModelManager(config.model_conf_path) + assert ( + not model_manager.model_exists(args.merged_model_name, args.base_model, ModelType.Main) or args.clobber + ), f'A model named "{args.merged_model_name}" already exists. Use --clobber to overwrite.' - merge_diffusion_models_and_commit(**vars(args)) - logger.info(f'Models merged into new model: "{args.merged_model_name}".') + merger = ModelMerger(model_manager) + merger.merge_diffusion_models_and_save(**vars(args)) + logger.info(f'Models merged into new model: "{args.merged_model_name}".') def main(): args = _parse_args() - config.root = args.root_dir - - cache_dir = config.cache_dir - os.environ[ - "HF_HOME" - ] = cache_dir # because not clear the merge pipeline is honoring cache_dir - args.cache_dir = cache_dir + config.parse_args(['--root',str(args.root_dir)]) try: if args.front_end: diff --git a/invokeai/frontend/web/.eslintrc.js b/invokeai/frontend/web/.eslintrc.js index b1a2b6a7e4..34db9d466b 100644 --- a/invokeai/frontend/web/.eslintrc.js +++ b/invokeai/frontend/web/.eslintrc.js @@ -36,6 +36,12 @@ module.exports = { ], 'prettier/prettier': ['error', { endOfLine: 'auto' }], '@typescript-eslint/ban-ts-comment': 'warn', + '@typescript-eslint/no-empty-interface': [ + 'error', + { + allowSingleExtends: true, + }, + ], }, settings: { react: { diff --git a/invokeai/frontend/web/config/common.ts b/invokeai/frontend/web/config/common.ts new file mode 100644 index 0000000000..4470224225 --- /dev/null +++ b/invokeai/frontend/web/config/common.ts @@ -0,0 +1,12 @@ +import react from '@vitejs/plugin-react-swc'; +import { visualizer } from 'rollup-plugin-visualizer'; +import { PluginOption, UserConfig } from 'vite'; +import eslint from 'vite-plugin-eslint'; +import tsconfigPaths from 'vite-tsconfig-paths'; + +export const commonPlugins: UserConfig['plugins'] = [ + react(), + eslint(), + tsconfigPaths(), + visualizer() as unknown as PluginOption, +]; diff --git a/invokeai/frontend/web/config/vite.app.config.ts b/invokeai/frontend/web/config/vite.app.config.ts index e6c4df79fd..958313402a 100644 --- a/invokeai/frontend/web/config/vite.app.config.ts +++ b/invokeai/frontend/web/config/vite.app.config.ts @@ -1,17 +1,9 @@ -import react from '@vitejs/plugin-react-swc'; -import { visualizer } from 'rollup-plugin-visualizer'; -import { PluginOption, UserConfig } from 'vite'; -import eslint from 'vite-plugin-eslint'; -import tsconfigPaths from 'vite-tsconfig-paths'; +import { UserConfig } from 'vite'; +import { commonPlugins } from './common'; export const appConfig: UserConfig = { base: './', - plugins: [ - react(), - eslint(), - tsconfigPaths(), - visualizer() as unknown as PluginOption, - ], + plugins: [...commonPlugins], build: { chunkSizeWarningLimit: 1500, }, diff --git a/invokeai/frontend/web/config/vite.package.config.ts b/invokeai/frontend/web/config/vite.package.config.ts index f87cce0bc9..0dcccab086 100644 --- a/invokeai/frontend/web/config/vite.package.config.ts +++ b/invokeai/frontend/web/config/vite.package.config.ts @@ -1,19 +1,13 @@ -import react from '@vitejs/plugin-react-swc'; import path from 'path'; -import { visualizer } from 'rollup-plugin-visualizer'; -import { PluginOption, UserConfig } from 'vite'; +import { UserConfig } from 'vite'; import dts from 'vite-plugin-dts'; -import eslint from 'vite-plugin-eslint'; -import tsconfigPaths from 'vite-tsconfig-paths'; import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'; +import { commonPlugins } from './common'; export const packageConfig: UserConfig = { base: './', plugins: [ - react(), - eslint(), - tsconfigPaths(), - visualizer() as unknown as PluginOption, + ...commonPlugins, dts({ insertTypesEntry: true, }), diff --git a/invokeai/frontend/web/dist/assets/App-4c33c38e.css b/invokeai/frontend/web/dist/assets/App-4c33c38e.css new file mode 100644 index 0000000000..482eef3217 --- /dev/null +++ b/invokeai/frontend/web/dist/assets/App-4c33c38e.css @@ -0,0 +1 @@ +.ltr-image-gallery-css-transition-enter{transform:translate(150%)}.ltr-image-gallery-css-transition-enter-active{transform:translate(0);transition:all .12s ease-out}.ltr-image-gallery-css-transition-exit{transform:translate(0)}.ltr-image-gallery-css-transition-exit-active{transform:translate(150%);transition:all .12s ease-out}.rtl-image-gallery-css-transition-enter{transform:translate(-150%)}.rtl-image-gallery-css-transition-enter-active{transform:translate(0);transition:all .12s ease-out}.rtl-image-gallery-css-transition-exit{transform:translate(0)}.rtl-image-gallery-css-transition-exit-active{transform:translate(-150%);transition:all .12s ease-out}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;cursor:-webkit-grab;cursor:grab}.react-flow__pane.selection{cursor:pointer}.react-flow__pane.dragging{cursor:-webkit-grabbing;cursor:grabbing}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow .react-flow__edges{pointer-events:none;overflow:visible}.react-flow__edge-path,.react-flow__connection-path{stroke:#b1b1b7;stroke-width:1;fill:none}.react-flow__edge{pointer-events:visibleStroke;cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;-webkit-animation:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge:focus .react-flow__edge-path,.react-flow__edge:focus-visible .react-flow__edge-path{stroke:#555}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge-textbg{fill:#fff}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;-webkit-animation:dashdraw .5s linear infinite;animation:dashdraw .5s linear infinite}.react-flow__connectionline{z-index:1001}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:-webkit-grab;cursor:grab}.react-flow__node.dragging{cursor:-webkit-grabbing;cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:-webkit-grab;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background:#1a192b;border:1px solid white;border-radius:100%}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:-4px;transform:translate(-50%)}.react-flow__handle-top{left:50%;top:-4px;transform:translate(-50%)}.react-flow__handle-left{top:50%;left:-4px;transform:translateY(-50%)}.react-flow__handle-right{right:-4px;top:50%;transform:translateY(-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;transform:translate(-50%)}.react-flow__attribution{font-size:10px;background:rgba(255,255,255,.5);padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@-webkit-keyframes dashdraw{0%{stroke-dashoffset:10}}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-default,.react-flow__node-input,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:3px;width:150px;font-size:12px;color:#222;text-align:center;border-width:1px;border-style:solid;border-color:#1a192b;background-color:#fff}.react-flow__node-default.selectable:hover,.react-flow__node-input.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:0 1px 4px 1px #00000014}.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:0 0 0 .5px #1a192b}.react-flow__node-group{background-color:#f0f0f040}.react-flow__nodesselection-rect,.react-flow__selection{background:rgba(0,89,220,.08);border:1px dotted rgba(0,89,220,.8)}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls{box-shadow:0 0 2px 1px #00000014}.react-flow__controls-button{border:none;background:#fefefe;border-bottom:1px solid #eee;box-sizing:content-box;display:flex;justify-content:center;align-items:center;width:16px;height:16px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;padding:5px}.react-flow__controls-button:hover{background:#f4f4f4}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__minimap{background-color:#fff}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:4px;height:4px;border:1px solid #fff;border-radius:1px;background-color:#3367d9;transform:translate(-50%,-50%)}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:#3367d9;border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%} diff --git a/invokeai/frontend/web/dist/assets/App-a44d46fe.js b/invokeai/frontend/web/dist/assets/App-a44d46fe.js new file mode 100644 index 0000000000..eedd37b459 --- /dev/null +++ b/invokeai/frontend/web/dist/assets/App-a44d46fe.js @@ -0,0 +1,199 @@ +import{t as mv,b as VI,r as UI,i as GI,a as qI,c as KI,d as Z4,e as J4,f as e3,g as YI,h as XI,j as QI,k as ZI,l as JI,m as eO,n as tO,o as nO,s as rO,p as oO,q as p,u as nt,v as i,I as mo,w as ur,x as Un,y as Be,z as Ot,A as Ru,B as bt,C as Mu,D as Ao,E as bo,F as Xr,G as xr,H as sO,J as R0,K as aO,L as qa,M as su,N as Zi,O as on,P as xa,Q as oh,R as M0,S as Al,T as T0,U as dc,_ as nr,V as iO,W as z,X as t3,Y as n3,Z as vx,$ as r3,a0 as sh,a1 as D0,a2 as fc,a3 as lO,a4 as cO,a5 as uO,a6 as dO,a7 as o3,a8 as s3,a9 as ah,aa as zf,ab as fO,ac as pO,ad as ag,ae as yx,af as a3,ag as i3,ah as Ji,ai as bx,aj as xx,ak as hO,al as mO,am as gO,an as vO,ao as yO,ap as ig,aq as ml,ar as lg,as as bO,at as xO,au as SO,av as A0,aw as ih,ax as $f,ay as wO,az as l3,aA as c3,aB as CO,aC as Tu,aD as N0,aE as PO,aF as kO,aG as _O,aH as jO,aI as EO,aJ as IO,aK as OO,aL as Sx,aM as qe,aN as H,aO as aa,aP as Pe,aQ as ao,aR as Sr,aS as re,aT as B,aU as Du,aV as me,aW as u3,aX as xo,aY as st,aZ as d3,a_ as ai,a$ as z0,b0 as RO,b1 as MO,b2 as TO,b3 as gl,b4 as Ti,b5 as Vs,b6 as f3,b7 as p3,b8 as DO,b9 as AO,ba as Au,bb as Nu,bc as Gl,bd as Gn,be as h3,bf as NO,bg as zO,bh as mn,bi as Et,bj as lh,bk as Ka,bl as wx,bm as ch,bn as $O,bo as LO,bp as Ef,bq as Ie,br as zd,bs as $d,bt as au,bu as iu,bv as Cx,bw as Lf,bx as Px,by as Ff,bz as kx,bA as gv,bB as _x,bC as vv,bD as jx,bE as Bf,bF as Ex,bG as ql,bH as Ix,bI as Kl,bJ as Ox,bK as Hf,bL as FO,bM as Wf,bN as m3,bO as $0,bP as BO,bQ as g3,bR as HO,bS as WO,bT as v3,bU as y3,bV as uh,bW as Oi,bX as yv,bY as VO,bZ as b3,b_ as UO,b$ as x3,c0 as Ja,c1 as Rx,c2 as GO,c3 as Mx,c4 as qO,c5 as vt,c6 as Vf,c7 as KO,c8 as S3,c9 as pc,ca as Wt,cb as So,cc as rr,cd as bv,ce as Us,cf as ir,cg as mr,ch as w3,ci as YO,cj as C3,ck as Tx,cl as XO,cm as QO,cn as ZO,co as JO,cp as e8,cq as t8,cr as L0,cs as os,ct as n8,cu as r8,cv as Dx,cw as Ax,cx as Nx,cy as zx,cz as o8,cA as s8,cB as P3,cC as mu,cD as k3,cE as $x,cF as a8,cG as i8,cH as l8,cI as c8,cJ as u8,cK as d8,cL as _3,cM as f8,cN as Pr,cO as j3,cP as p8,cQ as E3,cR as I3,cS as h8,cT as Lx,cU as m8,cV as g8,cW as v8,cX as y8,cY as b8,cZ as x8,c_ as S8,c$ as w8,d0 as C8,d1 as P8,d2 as k8,d3 as _8,d4 as j8,d5 as E8,d6 as I8,d7 as O8,d8 as R8,d9 as M8,da as T8,db as D8,dc as A8,dd as N8,de as zu,df as z8,dg as Lc,dh as ii,di as $8,dj as L8,dk as F8,dl as B8,dm as H8,dn as W8,dp as O3,dq as V8,dr as U8,ds as ss,dt as G8,du as Fx,dv as Bx,dw as Ya,dx as q8,dy as K8,dz as Y8,dA as R3,dB as X8,dC as Q8,dD as Z8,dE as F0,dF as B0,dG as J8,dH as Hx,dI as eR,dJ as Wx,dK as No,dL as tR,dM as nR,dN as Vx,dO as Ux,dP as rR,dQ as Gx,dR as oR,dS as sR,dT as aR,dU as iR,dV as lR,dW as cR,dX as M3,dY as T3,dZ as D3,d_ as A3,d$ as N3,e0 as $u,e1 as qx,e2 as cg,e3 as uR,e4 as dR,e5 as Yl,e6 as fR,e7 as pR,e8 as z3,e9 as $3,ea as hR,eb as Kx,ec as mR,ed as gR,ee as vR,ef as Mo,eg as Uf,eh as yR,ei as Yx,ej as L3,ek as bR,el as Xx,em as F3,en as H0,eo as Ps,ep as xR,eq as B3,er as SR,es as wR,et as Qx,eu as CR,ev as PR,ew as kR,ex as _R,ey as jR,ez as ER,eA as IR,eB as OR,eC as RR,eD as MR,eE as Zx,eF as TR,eG as Jx,eH as If,eI as DR,eJ as en,eK as Gf,eL as H3,eM as qf,eN as AR,eO as NR,eP as Ws,eQ as W3,eR as W0,eS as Lu,eT as zR,eU as $R,eV as LR,eW as ha,eX as V3,eY as FR,eZ as BR,e_ as U3,e$ as HR,f0 as WR,f1 as VR,f2 as UR,f3 as GR,f4 as qR,f5 as KR,f6 as YR,f7 as XR,f8 as QR,f9 as ZR,fa as e2,fb as JR,fc as e7,fd as t7,fe as n7,ff as r7,fg as o7,fh as ug,fi as gu,fj as Ld,fk as dg,fl as fg,fm as Fd,fn as t2,fo as xv,fp as s7,fq as a7,fr as i7,fs as l7,ft as c7,fu as Kf,fv as G3,fw as q3,fx as u7,fy as d7,fz as K3,fA as Y3,fB as X3,fC as Q3,fD as Z3,fE as J3,fF as e5,fG as t5,fH as Nl,fI as zl,fJ as n5,fK as r5,fL as f7,fM as o5,fN as s5,fO as a5,fP as i5,fQ as l5,fR as c5,fS as u5,fT as V0,fU as p7,fV as n2,fW as h7,fX as m7,fY as Yf,fZ as r2,f_ as o2,f$ as s2,g0 as a2,g1 as g7,g2 as v7,g3 as y7,g4 as b7,g5 as x7,g6 as S7,g7 as w7,g8 as C7,g9 as P7}from"./index-078526aa.js";import{u as d5,a as Sa,b as k7,r as Le,f as _7,g as i2,c as At,d as jr}from"./MantineProvider-8988d217.js";function j7(e,t){if(e==null)return{};var n={},r=Object.keys(e),o,s;for(s=0;s=0)&&(n[o]=e[o]);return n}var l2=1/0,E7=17976931348623157e292;function pg(e){if(!e)return e===0?e:0;if(e=mv(e),e===l2||e===-l2){var t=e<0?-1:1;return t*E7}return e===e?e:0}var I7=4;function c2(e){return VI(e,I7)}var O7=function(){return UI.Date.now()};const hg=O7;var R7="Expected a function",M7=Math.max,T7=Math.min;function D7(e,t,n){var r,o,s,a,u,d,f=0,h=!1,m=!1,v=!0;if(typeof e!="function")throw new TypeError(R7);t=mv(t)||0,GI(n)&&(h=!!n.leading,m="maxWait"in n,s=m?M7(mv(n.maxWait)||0,t):s,v="trailing"in n?!!n.trailing:v);function b(O){var R=r,M=o;return r=o=void 0,f=O,a=e.apply(M,R),a}function w(O){return f=O,u=setTimeout(P,t),h?b(O):a}function C(O){var R=O-d,M=O-f,A=t-R;return m?T7(A,s-M):A}function S(O){var R=O-d,M=O-f;return d===void 0||R>=t||R<0||m&&M>=s}function P(){var O=hg();if(S(O))return k(O);u=setTimeout(P,C(O))}function k(O){return u=void 0,v&&r?b(O):(r=o=void 0,a)}function j(){u!==void 0&&clearTimeout(u),f=0,r=d=o=u=void 0}function E(){return u===void 0?a:k(hg())}function I(){var O=hg(),R=S(O);if(r=arguments,o=this,d=O,R){if(u===void 0)return w(d);if(m)return clearTimeout(u),u=setTimeout(P,t),b(d)}return u===void 0&&(u=setTimeout(P,t)),a}return I.cancel=j,I.flush=E,I}function A7(e,t){var n=-1,r=qI(e)?Array(e.length):[];return KI(e,function(o,s,a){r[++n]=t(o,s,a)}),r}function Ks(e,t){var n=Z4(e)?J4:A7;return n(e,e3(t))}var N7="[object Number]";function vl(e){return typeof e=="number"||YI(e)&&XI(e)==N7}var z7=Array.prototype,$7=z7.splice;function L7(e,t){for(var n=e?t.length:0,r=n-1;n--;){var o=t[n];if(n==r||o!==s){var s=o;QI(o)?$7.call(e,o,1):ZI(e,o)}}return e}var F7=Math.ceil,B7=Math.max;function H7(e,t,n,r){for(var o=-1,s=B7(F7((t-e)/(n||1)),0),a=Array(s);s--;)a[r?s:++o]=e,e+=n;return a}function W7(e){return function(t,n,r){return r&&typeof r!="number"&&JI(t,n,r)&&(n=r=void 0),t=pg(t),n===void 0?(n=t,t=0):n=pg(n),r=r===void 0?ti.jsx(mo,{ref:d,viewBox:t,...o,...u,children:s.length?s:i.jsx("path",{fill:"currentColor",d:n})}));return a.displayName=r,a}var G7=Object.defineProperty,q7=(e,t,n)=>t in e?G7(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,pr=(e,t,n)=>(q7(e,typeof t!="symbol"?t+"":t,n),n);function d2(e){return e.sort((t,n)=>{const r=t.compareDocumentPosition(n);if(r&Node.DOCUMENT_POSITION_FOLLOWING||r&Node.DOCUMENT_POSITION_CONTAINED_BY)return-1;if(r&Node.DOCUMENT_POSITION_PRECEDING||r&Node.DOCUMENT_POSITION_CONTAINS)return 1;if(r&Node.DOCUMENT_POSITION_DISCONNECTED||r&Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC)throw Error("Cannot sort the given nodes.");return 0})}var K7=e=>typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.ELEMENT_NODE;function f2(e,t,n){let r=e+1;return n&&r>=t&&(r=0),r}function p2(e,t,n){let r=e-1;return n&&r<0&&(r=t),r}var Sv=typeof window<"u"?p.useLayoutEffect:p.useEffect,Xf=e=>e,Y7=class{constructor(){pr(this,"descendants",new Map),pr(this,"register",e=>{if(e!=null)return K7(e)?this.registerNode(e):t=>{this.registerNode(t,e)}}),pr(this,"unregister",e=>{this.descendants.delete(e);const t=d2(Array.from(this.descendants.keys()));this.assignIndex(t)}),pr(this,"destroy",()=>{this.descendants.clear()}),pr(this,"assignIndex",e=>{this.descendants.forEach(t=>{const n=e.indexOf(t.node);t.index=n,t.node.dataset.index=t.index.toString()})}),pr(this,"count",()=>this.descendants.size),pr(this,"enabledCount",()=>this.enabledValues().length),pr(this,"values",()=>Array.from(this.descendants.values()).sort((t,n)=>t.index-n.index)),pr(this,"enabledValues",()=>this.values().filter(e=>!e.disabled)),pr(this,"item",e=>{if(this.count()!==0)return this.values()[e]}),pr(this,"enabledItem",e=>{if(this.enabledCount()!==0)return this.enabledValues()[e]}),pr(this,"first",()=>this.item(0)),pr(this,"firstEnabled",()=>this.enabledItem(0)),pr(this,"last",()=>this.item(this.descendants.size-1)),pr(this,"lastEnabled",()=>{const e=this.enabledValues().length-1;return this.enabledItem(e)}),pr(this,"indexOf",e=>{var t,n;return e&&(n=(t=this.descendants.get(e))==null?void 0:t.index)!=null?n:-1}),pr(this,"enabledIndexOf",e=>e==null?-1:this.enabledValues().findIndex(t=>t.node.isSameNode(e))),pr(this,"next",(e,t=!0)=>{const n=f2(e,this.count(),t);return this.item(n)}),pr(this,"nextEnabled",(e,t=!0)=>{const n=this.item(e);if(!n)return;const r=this.enabledIndexOf(n.node),o=f2(r,this.enabledCount(),t);return this.enabledItem(o)}),pr(this,"prev",(e,t=!0)=>{const n=p2(e,this.count()-1,t);return this.item(n)}),pr(this,"prevEnabled",(e,t=!0)=>{const n=this.item(e);if(!n)return;const r=this.enabledIndexOf(n.node),o=p2(r,this.enabledCount()-1,t);return this.enabledItem(o)}),pr(this,"registerNode",(e,t)=>{if(!e||this.descendants.has(e))return;const n=Array.from(this.descendants.keys()).concat(e),r=d2(n);t!=null&&t.disabled&&(t.disabled=!!t.disabled);const o={node:e,index:-1,...t};this.descendants.set(e,o),this.assignIndex(r)})}};function X7(){const e=p.useRef(new Y7);return Sv(()=>()=>e.current.destroy()),e.current}var[Q7,p5]=ur({name:"DescendantsProvider",errorMessage:"useDescendantsContext must be used within DescendantsProvider"});function Z7(e){const t=p5(),[n,r]=p.useState(-1),o=p.useRef(null);Sv(()=>()=>{o.current&&t.unregister(o.current)},[]),Sv(()=>{if(!o.current)return;const a=Number(o.current.dataset.index);n!=a&&!Number.isNaN(a)&&r(a)});const s=Xf(e?t.register(e):t.register);return{descendants:t,index:n,enabledIndex:t.enabledIndexOf(o.current),register:Un(s,o)}}function G0(){return[Xf(Q7),()=>Xf(p5()),()=>X7(),o=>Z7(o)]}var[J7,dh]=ur({name:"AccordionStylesContext",hookName:"useAccordionStyles",providerName:""}),[eM,q0]=ur({name:"AccordionItemContext",hookName:"useAccordionItemContext",providerName:""}),[tM,zae,nM,rM]=G0(),Zc=nt(function(t,n){const{getButtonProps:r}=q0(),o=r(t,n),a={display:"flex",alignItems:"center",width:"100%",outline:0,...dh().button};return i.jsx(Be.button,{...o,className:Ot("chakra-accordion__button",t.className),__css:a})});Zc.displayName="AccordionButton";function oM(e){const{onChange:t,defaultIndex:n,index:r,allowMultiple:o,allowToggle:s,...a}=e;iM(e),lM(e);const u=nM(),[d,f]=p.useState(-1);p.useEffect(()=>()=>{f(-1)},[]);const[h,m]=Ru({value:r,defaultValue(){return o?n??[]:n??-1},onChange:t});return{index:h,setIndex:m,htmlProps:a,getAccordionItemProps:b=>{let w=!1;return b!==null&&(w=Array.isArray(h)?h.includes(b):h===b),{isOpen:w,onChange:S=>{if(b!==null)if(o&&Array.isArray(h)){const P=S?h.concat(b):h.filter(k=>k!==b);m(P)}else S?m(b):s&&m(-1)}}},focusedIndex:d,setFocusedIndex:f,descendants:u}}var[sM,K0]=ur({name:"AccordionContext",hookName:"useAccordionContext",providerName:"Accordion"});function aM(e){const{isDisabled:t,isFocusable:n,id:r,...o}=e,{getAccordionItemProps:s,setFocusedIndex:a}=K0(),u=p.useRef(null),d=p.useId(),f=r??d,h=`accordion-button-${f}`,m=`accordion-panel-${f}`;cM(e);const{register:v,index:b,descendants:w}=rM({disabled:t&&!n}),{isOpen:C,onChange:S}=s(b===-1?null:b);uM({isOpen:C,isDisabled:t});const P=()=>{S==null||S(!0)},k=()=>{S==null||S(!1)},j=p.useCallback(()=>{S==null||S(!C),a(b)},[b,a,C,S]),E=p.useCallback(M=>{const L={ArrowDown:()=>{const D=w.nextEnabled(b);D==null||D.node.focus()},ArrowUp:()=>{const D=w.prevEnabled(b);D==null||D.node.focus()},Home:()=>{const D=w.firstEnabled();D==null||D.node.focus()},End:()=>{const D=w.lastEnabled();D==null||D.node.focus()}}[M.key];L&&(M.preventDefault(),L(M))},[w,b]),I=p.useCallback(()=>{a(b)},[a,b]),O=p.useCallback(function(A={},L=null){return{...A,type:"button",ref:Un(v,u,L),id:h,disabled:!!t,"aria-expanded":!!C,"aria-controls":m,onClick:bt(A.onClick,j),onFocus:bt(A.onFocus,I),onKeyDown:bt(A.onKeyDown,E)}},[h,t,C,j,I,E,m,v]),R=p.useCallback(function(A={},L=null){return{...A,ref:L,role:"region",id:m,"aria-labelledby":h,hidden:!C}},[h,C,m]);return{isOpen:C,isDisabled:t,isFocusable:n,onOpen:P,onClose:k,getButtonProps:O,getPanelProps:R,htmlProps:o}}function iM(e){const t=e.index||e.defaultIndex,n=t!=null&&!Array.isArray(t)&&e.allowMultiple;Mu({condition:!!n,message:`If 'allowMultiple' is passed, then 'index' or 'defaultIndex' must be an array. You passed: ${typeof t},`})}function lM(e){Mu({condition:!!(e.allowMultiple&&e.allowToggle),message:"If 'allowMultiple' is passed, 'allowToggle' will be ignored. Either remove 'allowToggle' or 'allowMultiple' depending on whether you want multiple accordions visible or not"})}function cM(e){Mu({condition:!!(e.isFocusable&&!e.isDisabled),message:`Using only 'isFocusable', this prop is reserved for situations where you pass 'isDisabled' but you still want the element to receive focus (A11y). Either remove it or pass 'isDisabled' as well. + `})}function uM(e){Mu({condition:e.isOpen&&!!e.isDisabled,message:"Cannot open a disabled accordion item"})}function Jc(e){const{isOpen:t,isDisabled:n}=q0(),{reduceMotion:r}=K0(),o=Ot("chakra-accordion__icon",e.className),s=dh(),a={opacity:n?.4:1,transform:t?"rotate(-180deg)":void 0,transition:r?void 0:"transform 0.2s",transformOrigin:"center",...s.icon};return i.jsx(mo,{viewBox:"0 0 24 24","aria-hidden":!0,className:o,__css:a,...e,children:i.jsx("path",{fill:"currentColor",d:"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"})})}Jc.displayName="AccordionIcon";var eu=nt(function(t,n){const{children:r,className:o}=t,{htmlProps:s,...a}=aM(t),d={...dh().container,overflowAnchor:"none"},f=p.useMemo(()=>a,[a]);return i.jsx(eM,{value:f,children:i.jsx(Be.div,{ref:n,...s,className:Ot("chakra-accordion__item",o),__css:d,children:typeof r=="function"?r({isExpanded:!!a.isOpen,isDisabled:!!a.isDisabled}):r})})});eu.displayName="AccordionItem";var Ri={ease:[.25,.1,.25,1],easeIn:[.4,0,1,1],easeOut:[0,0,.2,1],easeInOut:[.4,0,.2,1]},Fc={scale:{enter:{scale:1},exit:{scale:.95}},fade:{enter:{opacity:1},exit:{opacity:0}},pushLeft:{enter:{x:"100%"},exit:{x:"-30%"}},pushRight:{enter:{x:"-100%"},exit:{x:"30%"}},pushUp:{enter:{y:"100%"},exit:{y:"-30%"}},pushDown:{enter:{y:"-100%"},exit:{y:"30%"}},slideLeft:{position:{left:0,top:0,bottom:0,width:"100%"},enter:{x:0,y:0},exit:{x:"-100%",y:0}},slideRight:{position:{right:0,top:0,bottom:0,width:"100%"},enter:{x:0,y:0},exit:{x:"100%",y:0}},slideUp:{position:{top:0,left:0,right:0,maxWidth:"100vw"},enter:{x:0,y:0},exit:{x:0,y:"-100%"}},slideDown:{position:{bottom:0,left:0,right:0,maxWidth:"100vw"},enter:{x:0,y:0},exit:{x:0,y:"100%"}}};function wv(e){var t;switch((t=e==null?void 0:e.direction)!=null?t:"right"){case"right":return Fc.slideRight;case"left":return Fc.slideLeft;case"bottom":return Fc.slideDown;case"top":return Fc.slideUp;default:return Fc.slideRight}}var Di={enter:{duration:.2,ease:Ri.easeOut},exit:{duration:.1,ease:Ri.easeIn}},vs={enter:(e,t)=>({...e,delay:typeof t=="number"?t:t==null?void 0:t.enter}),exit:(e,t)=>({...e,delay:typeof t=="number"?t:t==null?void 0:t.exit})},dM=e=>e!=null&&parseInt(e.toString(),10)>0,h2={exit:{height:{duration:.2,ease:Ri.ease},opacity:{duration:.3,ease:Ri.ease}},enter:{height:{duration:.3,ease:Ri.ease},opacity:{duration:.4,ease:Ri.ease}}},fM={exit:({animateOpacity:e,startingHeight:t,transition:n,transitionEnd:r,delay:o})=>{var s;return{...e&&{opacity:dM(t)?1:0},height:t,transitionEnd:r==null?void 0:r.exit,transition:(s=n==null?void 0:n.exit)!=null?s:vs.exit(h2.exit,o)}},enter:({animateOpacity:e,endingHeight:t,transition:n,transitionEnd:r,delay:o})=>{var s;return{...e&&{opacity:1},height:t,transitionEnd:r==null?void 0:r.enter,transition:(s=n==null?void 0:n.enter)!=null?s:vs.enter(h2.enter,o)}}},fh=p.forwardRef((e,t)=>{const{in:n,unmountOnExit:r,animateOpacity:o=!0,startingHeight:s=0,endingHeight:a="auto",style:u,className:d,transition:f,transitionEnd:h,...m}=e,[v,b]=p.useState(!1);p.useEffect(()=>{const k=setTimeout(()=>{b(!0)});return()=>clearTimeout(k)},[]),Mu({condition:Number(s)>0&&!!r,message:"startingHeight and unmountOnExit are mutually exclusive. You can't use them together"});const w=parseFloat(s.toString())>0,C={startingHeight:s,endingHeight:a,animateOpacity:o,transition:v?f:{enter:{duration:0}},transitionEnd:{enter:h==null?void 0:h.enter,exit:r?h==null?void 0:h.exit:{...h==null?void 0:h.exit,display:w?"block":"none"}}},S=r?n:!0,P=n||r?"enter":"exit";return i.jsx(Ao,{initial:!1,custom:C,children:S&&i.jsx(bo.div,{ref:t,...m,className:Ot("chakra-collapse",d),style:{overflow:"hidden",display:"block",...u},custom:C,variants:fM,initial:r?"exit":!1,animate:P,exit:"exit"})})});fh.displayName="Collapse";var pM={enter:({transition:e,transitionEnd:t,delay:n}={})=>{var r;return{opacity:1,transition:(r=e==null?void 0:e.enter)!=null?r:vs.enter(Di.enter,n),transitionEnd:t==null?void 0:t.enter}},exit:({transition:e,transitionEnd:t,delay:n}={})=>{var r;return{opacity:0,transition:(r=e==null?void 0:e.exit)!=null?r:vs.exit(Di.exit,n),transitionEnd:t==null?void 0:t.exit}}},h5={initial:"exit",animate:"enter",exit:"exit",variants:pM},hM=p.forwardRef(function(t,n){const{unmountOnExit:r,in:o,className:s,transition:a,transitionEnd:u,delay:d,...f}=t,h=o||r?"enter":"exit",m=r?o&&r:!0,v={transition:a,transitionEnd:u,delay:d};return i.jsx(Ao,{custom:v,children:m&&i.jsx(bo.div,{ref:n,className:Ot("chakra-fade",s),custom:v,...h5,animate:h,...f})})});hM.displayName="Fade";var mM={exit:({reverse:e,initialScale:t,transition:n,transitionEnd:r,delay:o})=>{var s;return{opacity:0,...e?{scale:t,transitionEnd:r==null?void 0:r.exit}:{transitionEnd:{scale:t,...r==null?void 0:r.exit}},transition:(s=n==null?void 0:n.exit)!=null?s:vs.exit(Di.exit,o)}},enter:({transitionEnd:e,transition:t,delay:n})=>{var r;return{opacity:1,scale:1,transition:(r=t==null?void 0:t.enter)!=null?r:vs.enter(Di.enter,n),transitionEnd:e==null?void 0:e.enter}}},m5={initial:"exit",animate:"enter",exit:"exit",variants:mM},gM=p.forwardRef(function(t,n){const{unmountOnExit:r,in:o,reverse:s=!0,initialScale:a=.95,className:u,transition:d,transitionEnd:f,delay:h,...m}=t,v=r?o&&r:!0,b=o||r?"enter":"exit",w={initialScale:a,reverse:s,transition:d,transitionEnd:f,delay:h};return i.jsx(Ao,{custom:w,children:v&&i.jsx(bo.div,{ref:n,className:Ot("chakra-offset-slide",u),...m5,animate:b,custom:w,...m})})});gM.displayName="ScaleFade";var vM={initial:({offsetX:e,offsetY:t,transition:n,transitionEnd:r,delay:o})=>{var s;return{opacity:0,x:e,y:t,transition:(s=n==null?void 0:n.exit)!=null?s:vs.exit(Di.exit,o),transitionEnd:r==null?void 0:r.exit}},enter:({transition:e,transitionEnd:t,delay:n})=>{var r;return{opacity:1,x:0,y:0,transition:(r=e==null?void 0:e.enter)!=null?r:vs.enter(Di.enter,n),transitionEnd:t==null?void 0:t.enter}},exit:({offsetY:e,offsetX:t,transition:n,transitionEnd:r,reverse:o,delay:s})=>{var a;const u={x:t,y:e};return{opacity:0,transition:(a=n==null?void 0:n.exit)!=null?a:vs.exit(Di.exit,s),...o?{...u,transitionEnd:r==null?void 0:r.exit}:{transitionEnd:{...u,...r==null?void 0:r.exit}}}}},Cv={initial:"initial",animate:"enter",exit:"exit",variants:vM},yM=p.forwardRef(function(t,n){const{unmountOnExit:r,in:o,reverse:s=!0,className:a,offsetX:u=0,offsetY:d=8,transition:f,transitionEnd:h,delay:m,...v}=t,b=r?o&&r:!0,w=o||r?"enter":"exit",C={offsetX:u,offsetY:d,reverse:s,transition:f,transitionEnd:h,delay:m};return i.jsx(Ao,{custom:C,children:b&&i.jsx(bo.div,{ref:n,className:Ot("chakra-offset-slide",a),custom:C,...Cv,animate:w,...v})})});yM.displayName="SlideFade";var m2={exit:{duration:.15,ease:Ri.easeInOut},enter:{type:"spring",damping:25,stiffness:180}},bM={exit:({direction:e,transition:t,transitionEnd:n,delay:r})=>{var o;const{exit:s}=wv({direction:e});return{...s,transition:(o=t==null?void 0:t.exit)!=null?o:vs.exit(m2.exit,r),transitionEnd:n==null?void 0:n.exit}},enter:({direction:e,transitionEnd:t,transition:n,delay:r})=>{var o;const{enter:s}=wv({direction:e});return{...s,transition:(o=n==null?void 0:n.enter)!=null?o:vs.enter(m2.enter,r),transitionEnd:t==null?void 0:t.enter}}},g5=p.forwardRef(function(t,n){const{direction:r="right",style:o,unmountOnExit:s,in:a,className:u,transition:d,transitionEnd:f,delay:h,motionProps:m,...v}=t,b=wv({direction:r}),w=Object.assign({position:"fixed"},b.position,o),C=s?a&&s:!0,S=a||s?"enter":"exit",P={transitionEnd:f,transition:d,direction:r,delay:h};return i.jsx(Ao,{custom:P,children:C&&i.jsx(bo.div,{...v,ref:n,initial:"exit",className:Ot("chakra-slide",u),animate:S,exit:"exit",custom:P,variants:bM,style:w,...m})})});g5.displayName="Slide";var tu=nt(function(t,n){const{className:r,motionProps:o,...s}=t,{reduceMotion:a}=K0(),{getPanelProps:u,isOpen:d}=q0(),f=u(s,n),h=Ot("chakra-accordion__panel",r),m=dh();a||delete f.hidden;const v=i.jsx(Be.div,{...f,__css:m.panel,className:h});return a?v:i.jsx(fh,{in:d,...o,children:v})});tu.displayName="AccordionPanel";var v5=nt(function({children:t,reduceMotion:n,...r},o){const s=Xr("Accordion",r),a=xr(r),{htmlProps:u,descendants:d,...f}=oM(a),h=p.useMemo(()=>({...f,reduceMotion:!!n}),[f,n]);return i.jsx(tM,{value:d,children:i.jsx(sM,{value:h,children:i.jsx(J7,{value:s,children:i.jsx(Be.div,{ref:o,...u,className:Ot("chakra-accordion",r.className),__css:s.root,children:t})})})})});v5.displayName="Accordion";var xM={horizontal:{"> *:first-of-type:not(:last-of-type)":{borderEndRadius:0},"> *:not(:first-of-type):not(:last-of-type)":{borderRadius:0},"> *:not(:first-of-type):last-of-type":{borderStartRadius:0}},vertical:{"> *:first-of-type:not(:last-of-type)":{borderBottomRadius:0},"> *:not(:first-of-type):not(:last-of-type)":{borderRadius:0},"> *:not(:first-of-type):last-of-type":{borderTopRadius:0}}},SM={horizontal:e=>({"& > *:not(style) ~ *:not(style)":{marginStart:e}}),vertical:e=>({"& > *:not(style) ~ *:not(style)":{marginTop:e}})},gr=nt(function(t,n){const{size:r,colorScheme:o,variant:s,className:a,spacing:u="0.5rem",isAttached:d,isDisabled:f,orientation:h="horizontal",...m}=t,v=Ot("chakra-button__group",a),b=p.useMemo(()=>({size:r,colorScheme:o,variant:s,isDisabled:f}),[r,o,s,f]);let w={display:"inline-flex",...d?xM[h]:SM[h](u)};const C=h==="vertical";return i.jsx(sO,{value:b,children:i.jsx(Be.div,{ref:n,role:"group",__css:w,className:v,"data-attached":d?"":void 0,"data-orientation":h,flexDir:C?"column":void 0,...m})})});gr.displayName="ButtonGroup";var[$ae,wM]=ur({name:"CheckboxGroupContext",strict:!1});function CM(e){const[t,n]=p.useState(e),[r,o]=p.useState(!1);return e!==t&&(o(!0),n(e)),r}function PM(e){return i.jsx(Be.svg,{width:"1.2em",viewBox:"0 0 12 10",style:{fill:"none",strokeWidth:2,stroke:"currentColor",strokeDasharray:16},...e,children:i.jsx("polyline",{points:"1.5 6 4.5 9 10.5 1"})})}function kM(e){return i.jsx(Be.svg,{width:"1.2em",viewBox:"0 0 24 24",style:{stroke:"currentColor",strokeWidth:4},...e,children:i.jsx("line",{x1:"21",x2:"3",y1:"12",y2:"12"})})}function _M(e){const{isIndeterminate:t,isChecked:n,...r}=e,o=t?kM:PM;return n||t?i.jsx(Be.div,{style:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%"},children:i.jsx(o,{...r})}):null}var[jM,EM]=ur({name:"FormErrorStylesContext",errorMessage:`useFormErrorStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),po=nt((e,t)=>{const n=Xr("FormError",e),r=xr(e),o=R0();return o!=null&&o.isInvalid?i.jsx(jM,{value:n,children:i.jsx(Be.div,{...o==null?void 0:o.getErrorMessageProps(r,t),className:Ot("chakra-form__error-message",e.className),__css:{display:"flex",alignItems:"center",...n.text}})}):null});po.displayName="FormErrorMessage";var IM=nt((e,t)=>{const n=EM(),r=R0();if(!(r!=null&&r.isInvalid))return null;const o=Ot("chakra-form__error-icon",e.className);return i.jsx(mo,{ref:t,"aria-hidden":!0,...e,__css:n.icon,className:o,children:i.jsx("path",{fill:"currentColor",d:"M11.983,0a12.206,12.206,0,0,0-8.51,3.653A11.8,11.8,0,0,0,0,12.207,11.779,11.779,0,0,0,11.8,24h.214A12.111,12.111,0,0,0,24,11.791h0A11.766,11.766,0,0,0,11.983,0ZM10.5,16.542a1.476,1.476,0,0,1,1.449-1.53h.027a1.527,1.527,0,0,1,1.523,1.47,1.475,1.475,0,0,1-1.449,1.53h-.027A1.529,1.529,0,0,1,10.5,16.542ZM11,12.5v-6a1,1,0,0,1,2,0v6a1,1,0,1,1-2,0Z"})})});IM.displayName="FormErrorIcon";var Y0={border:"0",clip:"rect(0, 0, 0, 0)",height:"1px",width:"1px",margin:"-1px",padding:"0",overflow:"hidden",whiteSpace:"nowrap",position:"absolute"},y5=Be("span",{baseStyle:Y0});y5.displayName="VisuallyHidden";var OM=Be("input",{baseStyle:Y0});OM.displayName="VisuallyHiddenInput";var g2=!1,Fu=null,Hi=!1,Pv=!1,kv=new Set;function X0(e,t){kv.forEach(n=>n(e,t))}var RM=typeof window<"u"&&window.navigator!=null?/^Mac/.test(window.navigator.platform):!1;function MM(e){return!(e.metaKey||!RM&&e.altKey||e.ctrlKey||e.key==="Control"||e.key==="Shift"||e.key==="Meta")}function v2(e){Hi=!0,MM(e)&&(Fu="keyboard",X0("keyboard",e))}function yl(e){if(Fu="pointer",e.type==="mousedown"||e.type==="pointerdown"){Hi=!0;const t=e.composedPath?e.composedPath()[0]:e.target;let n=!1;try{n=t.matches(":focus-visible")}catch{}if(n)return;X0("pointer",e)}}function TM(e){return e.mozInputSource===0&&e.isTrusted?!0:e.detail===0&&!e.pointerType}function DM(e){TM(e)&&(Hi=!0,Fu="virtual")}function AM(e){e.target===window||e.target===document||(!Hi&&!Pv&&(Fu="virtual",X0("virtual",e)),Hi=!1,Pv=!1)}function NM(){Hi=!1,Pv=!0}function y2(){return Fu!=="pointer"}function zM(){if(typeof window>"u"||g2)return;const{focus:e}=HTMLElement.prototype;HTMLElement.prototype.focus=function(...n){Hi=!0,e.apply(this,n)},document.addEventListener("keydown",v2,!0),document.addEventListener("keyup",v2,!0),document.addEventListener("click",DM,!0),window.addEventListener("focus",AM,!0),window.addEventListener("blur",NM,!1),typeof PointerEvent<"u"?(document.addEventListener("pointerdown",yl,!0),document.addEventListener("pointermove",yl,!0),document.addEventListener("pointerup",yl,!0)):(document.addEventListener("mousedown",yl,!0),document.addEventListener("mousemove",yl,!0),document.addEventListener("mouseup",yl,!0)),g2=!0}function b5(e){zM(),e(y2());const t=()=>e(y2());return kv.add(t),()=>{kv.delete(t)}}function $M(e,t=[]){const n=Object.assign({},e);for(const r of t)r in n&&delete n[r];return n}function x5(e={}){const t=aO(e),{isDisabled:n,isReadOnly:r,isRequired:o,isInvalid:s,id:a,onBlur:u,onFocus:d,"aria-describedby":f}=t,{defaultChecked:h,isChecked:m,isFocusable:v,onChange:b,isIndeterminate:w,name:C,value:S,tabIndex:P=void 0,"aria-label":k,"aria-labelledby":j,"aria-invalid":E,...I}=e,O=$M(I,["isDisabled","isReadOnly","isRequired","isInvalid","id","onBlur","onFocus","aria-describedby"]),R=qa(b),M=qa(u),A=qa(d),[L,D]=p.useState(!1),[V,$]=p.useState(!1),[F,U]=p.useState(!1),[X,N]=p.useState(!1);p.useEffect(()=>b5(D),[]);const G=p.useRef(null),[W,q]=p.useState(!0),[ne,ve]=p.useState(!!h),le=m!==void 0,oe=le?m:ne,Y=p.useCallback(ye=>{if(r||n){ye.preventDefault();return}le||ve(oe?ye.target.checked:w?!0:ye.target.checked),R==null||R(ye)},[r,n,oe,le,w,R]);su(()=>{G.current&&(G.current.indeterminate=!!w)},[w]),Zi(()=>{n&&$(!1)},[n,$]),su(()=>{const ye=G.current;ye!=null&&ye.form&&(ye.form.onreset=()=>{ve(!!h)})},[]);const ae=n&&!v,de=p.useCallback(ye=>{ye.key===" "&&N(!0)},[N]),xe=p.useCallback(ye=>{ye.key===" "&&N(!1)},[N]);su(()=>{if(!G.current)return;G.current.checked!==oe&&ve(G.current.checked)},[G.current]);const se=p.useCallback((ye={},Oe=null)=>{const at=Fe=>{V&&Fe.preventDefault(),N(!0)};return{...ye,ref:Oe,"data-active":on(X),"data-hover":on(F),"data-checked":on(oe),"data-focus":on(V),"data-focus-visible":on(V&&L),"data-indeterminate":on(w),"data-disabled":on(n),"data-invalid":on(s),"data-readonly":on(r),"aria-hidden":!0,onMouseDown:bt(ye.onMouseDown,at),onMouseUp:bt(ye.onMouseUp,()=>N(!1)),onMouseEnter:bt(ye.onMouseEnter,()=>U(!0)),onMouseLeave:bt(ye.onMouseLeave,()=>U(!1))}},[X,oe,n,V,L,F,w,s,r]),ge=p.useCallback((ye={},Oe=null)=>({...O,...ye,ref:Un(Oe,at=>{at&&q(at.tagName==="LABEL")}),onClick:bt(ye.onClick,()=>{var at;W||((at=G.current)==null||at.click(),requestAnimationFrame(()=>{var Fe;(Fe=G.current)==null||Fe.focus({preventScroll:!0})}))}),"data-disabled":on(n),"data-checked":on(oe),"data-invalid":on(s)}),[O,n,oe,s,W]),fe=p.useCallback((ye={},Oe=null)=>({...ye,ref:Un(G,Oe),type:"checkbox",name:C,value:S,id:a,tabIndex:P,onChange:bt(ye.onChange,Y),onBlur:bt(ye.onBlur,M,()=>$(!1)),onFocus:bt(ye.onFocus,A,()=>$(!0)),onKeyDown:bt(ye.onKeyDown,de),onKeyUp:bt(ye.onKeyUp,xe),required:o,checked:oe,disabled:ae,readOnly:r,"aria-label":k,"aria-labelledby":j,"aria-invalid":E?!!E:s,"aria-describedby":f,"aria-disabled":n,style:Y0}),[C,S,a,Y,M,A,de,xe,o,oe,ae,r,k,j,E,s,f,n,P]),ke=p.useCallback((ye={},Oe=null)=>({...ye,ref:Oe,onMouseDown:bt(ye.onMouseDown,LM),"data-disabled":on(n),"data-checked":on(oe),"data-invalid":on(s)}),[oe,n,s]);return{state:{isInvalid:s,isFocused:V,isChecked:oe,isActive:X,isHovered:F,isIndeterminate:w,isDisabled:n,isReadOnly:r,isRequired:o},getRootProps:ge,getCheckboxProps:se,getInputProps:fe,getLabelProps:ke,htmlProps:O}}function LM(e){e.preventDefault(),e.stopPropagation()}var FM={display:"inline-flex",alignItems:"center",justifyContent:"center",verticalAlign:"top",userSelect:"none",flexShrink:0},BM={cursor:"pointer",display:"inline-flex",alignItems:"center",verticalAlign:"top",position:"relative"},HM=xa({from:{opacity:0,strokeDashoffset:16,transform:"scale(0.95)"},to:{opacity:1,strokeDashoffset:0,transform:"scale(1)"}}),WM=xa({from:{opacity:0},to:{opacity:1}}),VM=xa({from:{transform:"scaleX(0.65)"},to:{transform:"scaleX(1)"}}),S5=nt(function(t,n){const r=wM(),o={...r,...t},s=Xr("Checkbox",o),a=xr(t),{spacing:u="0.5rem",className:d,children:f,iconColor:h,iconSize:m,icon:v=i.jsx(_M,{}),isChecked:b,isDisabled:w=r==null?void 0:r.isDisabled,onChange:C,inputProps:S,...P}=a;let k=b;r!=null&&r.value&&a.value&&(k=r.value.includes(a.value));let j=C;r!=null&&r.onChange&&a.value&&(j=oh(r.onChange,C));const{state:E,getInputProps:I,getCheckboxProps:O,getLabelProps:R,getRootProps:M}=x5({...P,isDisabled:w,isChecked:k,onChange:j}),A=CM(E.isChecked),L=p.useMemo(()=>({animation:A?E.isIndeterminate?`${WM} 20ms linear, ${VM} 200ms linear`:`${HM} 200ms linear`:void 0,fontSize:m,color:h,...s.icon}),[h,m,A,E.isIndeterminate,s.icon]),D=p.cloneElement(v,{__css:L,isIndeterminate:E.isIndeterminate,isChecked:E.isChecked});return i.jsxs(Be.label,{__css:{...BM,...s.container},className:Ot("chakra-checkbox",d),...M(),children:[i.jsx("input",{className:"chakra-checkbox__input",...I(S,n)}),i.jsx(Be.span,{__css:{...FM,...s.control},className:"chakra-checkbox__control",...O(),children:D}),f&&i.jsx(Be.span,{className:"chakra-checkbox__label",...R(),__css:{marginStart:u,...s.label},children:f})]})});S5.displayName="Checkbox";var[UM,w5]=ur({name:"EditableStylesContext",errorMessage:`useEditableStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),[GM,C5]=ur({name:"EditableContext",errorMessage:"useEditableContext: context is undefined. Seems you forgot to wrap the editable components in ``"}),P5={fontSize:"inherit",fontWeight:"inherit",textAlign:"inherit",bg:"transparent"},k5=nt(function(t,n){const{getInputProps:r}=C5(),o=w5(),s=r(t,n),a=Ot("chakra-editable__input",t.className);return i.jsx(Be.input,{...s,__css:{outline:0,...P5,...o.input},className:a})});k5.displayName="EditableInput";var _5=nt(function(t,n){const{getPreviewProps:r}=C5(),o=w5(),s=r(t,n),a=Ot("chakra-editable__preview",t.className);return i.jsx(Be.span,{...s,__css:{cursor:"text",display:"inline-block",...P5,...o.preview},className:a})});_5.displayName="EditablePreview";function qM(e){return"current"in e}var j5=()=>typeof window<"u";function KM(){var e;const t=navigator.userAgentData;return(e=t==null?void 0:t.platform)!=null?e:navigator.platform}var YM=e=>j5()&&e.test(navigator.vendor),XM=e=>j5()&&e.test(KM()),QM=()=>XM(/mac|iphone|ipad|ipod/i),ZM=()=>QM()&&YM(/apple/i);function E5(e){const{ref:t,elements:n,enabled:r}=e,o=()=>{var s,a;return(a=(s=t.current)==null?void 0:s.ownerDocument)!=null?a:document};M0(o,"pointerdown",s=>{if(!ZM()||!r)return;const a=s.target,d=(n??[t]).some(f=>{const h=qM(f)?f.current:f;return(h==null?void 0:h.contains(a))||h===a});o().activeElement!==a&&d&&(s.preventDefault(),a.focus())})}function b2(e,t){return e?e===t||e.contains(t):!1}function JM(e={}){const{onChange:t,onCancel:n,onSubmit:r,onBlur:o,value:s,isDisabled:a,defaultValue:u,startWithEditView:d,isPreviewFocusable:f=!0,submitOnBlur:h=!0,selectAllOnFocus:m=!0,placeholder:v,onEdit:b,finalFocusRef:w,...C}=e,S=qa(b),P=!!(d&&!a),[k,j]=p.useState(P),[E,I]=Ru({defaultValue:u||"",value:s,onChange:t}),[O,R]=p.useState(E),M=p.useRef(null),A=p.useRef(null),L=p.useRef(null),D=p.useRef(null),V=p.useRef(null);E5({ref:M,enabled:k,elements:[D,V]});const $=!k&&!a;su(()=>{var se,ge;k&&((se=M.current)==null||se.focus(),m&&((ge=M.current)==null||ge.select()))},[]),Zi(()=>{var se,ge,fe,ke;if(!k){w?(se=w.current)==null||se.focus():(ge=L.current)==null||ge.focus();return}(fe=M.current)==null||fe.focus(),m&&((ke=M.current)==null||ke.select()),S==null||S()},[k,S,m]);const F=p.useCallback(()=>{$&&j(!0)},[$]),U=p.useCallback(()=>{R(E)},[E]),X=p.useCallback(()=>{j(!1),I(O),n==null||n(O),o==null||o(O)},[n,o,I,O]),N=p.useCallback(()=>{j(!1),R(E),r==null||r(E),o==null||o(O)},[E,r,o,O]);p.useEffect(()=>{if(k)return;const se=M.current;(se==null?void 0:se.ownerDocument.activeElement)===se&&(se==null||se.blur())},[k]);const G=p.useCallback(se=>{I(se.currentTarget.value)},[I]),W=p.useCallback(se=>{const ge=se.key,ke={Escape:X,Enter:Ae=>{!Ae.shiftKey&&!Ae.metaKey&&N()}}[ge];ke&&(se.preventDefault(),ke(se))},[X,N]),q=p.useCallback(se=>{const ge=se.key,ke={Escape:X}[ge];ke&&(se.preventDefault(),ke(se))},[X]),ne=E.length===0,ve=p.useCallback(se=>{var ge;if(!k)return;const fe=se.currentTarget.ownerDocument,ke=(ge=se.relatedTarget)!=null?ge:fe.activeElement,Ae=b2(D.current,ke),ye=b2(V.current,ke);!Ae&&!ye&&(h?N():X())},[h,N,X,k]),le=p.useCallback((se={},ge=null)=>{const fe=$&&f?0:void 0;return{...se,ref:Un(ge,A),children:ne?v:E,hidden:k,"aria-disabled":Al(a),tabIndex:fe,onFocus:bt(se.onFocus,F,U)}},[a,k,$,f,ne,F,U,v,E]),oe=p.useCallback((se={},ge=null)=>({...se,hidden:!k,placeholder:v,ref:Un(ge,M),disabled:a,"aria-disabled":Al(a),value:E,onBlur:bt(se.onBlur,ve),onChange:bt(se.onChange,G),onKeyDown:bt(se.onKeyDown,W),onFocus:bt(se.onFocus,U)}),[a,k,ve,G,W,U,v,E]),Y=p.useCallback((se={},ge=null)=>({...se,hidden:!k,placeholder:v,ref:Un(ge,M),disabled:a,"aria-disabled":Al(a),value:E,onBlur:bt(se.onBlur,ve),onChange:bt(se.onChange,G),onKeyDown:bt(se.onKeyDown,q),onFocus:bt(se.onFocus,U)}),[a,k,ve,G,q,U,v,E]),ae=p.useCallback((se={},ge=null)=>({"aria-label":"Edit",...se,type:"button",onClick:bt(se.onClick,F),ref:Un(ge,L),disabled:a}),[F,a]),de=p.useCallback((se={},ge=null)=>({...se,"aria-label":"Submit",ref:Un(V,ge),type:"button",onClick:bt(se.onClick,N),disabled:a}),[N,a]),xe=p.useCallback((se={},ge=null)=>({"aria-label":"Cancel",id:"cancel",...se,ref:Un(D,ge),type:"button",onClick:bt(se.onClick,X),disabled:a}),[X,a]);return{isEditing:k,isDisabled:a,isValueEmpty:ne,value:E,onEdit:F,onCancel:X,onSubmit:N,getPreviewProps:le,getInputProps:oe,getTextareaProps:Y,getEditButtonProps:ae,getSubmitButtonProps:de,getCancelButtonProps:xe,htmlProps:C}}var I5=nt(function(t,n){const r=Xr("Editable",t),o=xr(t),{htmlProps:s,...a}=JM(o),{isEditing:u,onSubmit:d,onCancel:f,onEdit:h}=a,m=Ot("chakra-editable",t.className),v=T0(t.children,{isEditing:u,onSubmit:d,onCancel:f,onEdit:h});return i.jsx(GM,{value:a,children:i.jsx(UM,{value:r,children:i.jsx(Be.div,{ref:n,...s,className:m,children:v})})})});I5.displayName="Editable";var O5={exports:{}},eT="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED",tT=eT,nT=tT;function R5(){}function M5(){}M5.resetWarningCache=R5;var rT=function(){function e(r,o,s,a,u,d){if(d!==nT){var f=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw f.name="Invariant Violation",f}}e.isRequired=e;function t(){return e}var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:M5,resetWarningCache:R5};return n.PropTypes=n,n};O5.exports=rT();var oT=O5.exports;const An=dc(oT);var _v="data-focus-lock",T5="data-focus-lock-disabled",sT="data-no-focus-lock",aT="data-autofocus-inside",iT="data-no-autofocus";function lT(e,t){return typeof e=="function"?e(t):e&&(e.current=t),e}function cT(e,t){var n=p.useState(function(){return{value:e,callback:t,facade:{get current(){return n.value},set current(r){var o=n.value;o!==r&&(n.value=r,n.callback(r,o))}}}})[0];return n.callback=t,n.facade}function D5(e,t){return cT(t||null,function(n){return e.forEach(function(r){return lT(r,n)})})}var mg={width:"1px",height:"0px",padding:0,overflow:"hidden",position:"fixed",top:"1px",left:"1px"},Bs=function(){return Bs=Object.assign||function(t){for(var n,r=1,o=arguments.length;r0&&s[s.length-1])&&(f[0]===6||f[0]===2)){n=0;continue}if(f[0]===3&&(!s||f[1]>s[0]&&f[1]0)&&!(o=r.next()).done;)s.push(o.value)}catch(u){a={error:u}}finally{try{o&&!o.done&&(n=r.return)&&n.call(r)}finally{if(a)throw a.error}}return s}function jv(e,t,n){if(n||arguments.length===2)for(var r=0,o=t.length,s;r=0}).sort(CT)},PT=["button:enabled","select:enabled","textarea:enabled","input:enabled","a[href]","area[href]","summary","iframe","object","embed","audio[controls]","video[controls]","[tabindex]","[contenteditable]","[autofocus]"],e1=PT.join(","),kT="".concat(e1,", [data-focus-guard]"),Z5=function(e,t){return Ys((e.shadowRoot||e).children).reduce(function(n,r){return n.concat(r.matches(t?kT:e1)?[r]:[],Z5(r))},[])},_T=function(e,t){var n;return e instanceof HTMLIFrameElement&&(!((n=e.contentDocument)===null||n===void 0)&&n.body)?ph([e.contentDocument.body],t):[e]},ph=function(e,t){return e.reduce(function(n,r){var o,s=Z5(r,t),a=(o=[]).concat.apply(o,s.map(function(u){return _T(u,t)}));return n.concat(a,r.parentNode?Ys(r.parentNode.querySelectorAll(e1)).filter(function(u){return u===r}):[])},[])},jT=function(e){var t=e.querySelectorAll("[".concat(aT,"]"));return Ys(t).map(function(n){return ph([n])}).reduce(function(n,r){return n.concat(r)},[])},t1=function(e,t){return Ys(e).filter(function(n){return G5(t,n)}).filter(function(n){return xT(n)})},S2=function(e,t){return t===void 0&&(t=new Map),Ys(e).filter(function(n){return q5(t,n)})},Iv=function(e,t,n){return Q5(t1(ph(e,n),t),!0,n)},w2=function(e,t){return Q5(t1(ph(e),t),!1)},ET=function(e,t){return t1(jT(e),t)},$l=function(e,t){return e.shadowRoot?$l(e.shadowRoot,t):Object.getPrototypeOf(e).contains!==void 0&&Object.getPrototypeOf(e).contains.call(e,t)?!0:Ys(e.children).some(function(n){var r;if(n instanceof HTMLIFrameElement){var o=(r=n.contentDocument)===null||r===void 0?void 0:r.body;return o?$l(o,t):!1}return $l(n,t)})},IT=function(e){for(var t=new Set,n=e.length,r=0;r0&&t.add(o),(s&Node.DOCUMENT_POSITION_CONTAINS)>0&&t.add(r)}return e.filter(function(a,u){return!t.has(u)})},J5=function(e){return e.parentNode?J5(e.parentNode):e},n1=function(e){var t=Qf(e);return t.filter(Boolean).reduce(function(n,r){var o=r.getAttribute(_v);return n.push.apply(n,o?IT(Ys(J5(r).querySelectorAll("[".concat(_v,'="').concat(o,'"]:not([').concat(T5,'="disabled"])')))):[r]),n},[])},OT=function(e){try{return e()}catch{return}},vu=function(e){if(e===void 0&&(e=document),!(!e||!e.activeElement)){var t=e.activeElement;return t.shadowRoot?vu(t.shadowRoot):t instanceof HTMLIFrameElement&&OT(function(){return t.contentWindow.document})?vu(t.contentWindow.document):t}},RT=function(e,t){return e===t},MT=function(e,t){return!!Ys(e.querySelectorAll("iframe")).some(function(n){return RT(n,t)})},e6=function(e,t){return t===void 0&&(t=vu(W5(e).ownerDocument)),!t||t.dataset&&t.dataset.focusGuard?!1:n1(e).some(function(n){return $l(n,t)||MT(n,t)})},TT=function(e){e===void 0&&(e=document);var t=vu(e);return t?Ys(e.querySelectorAll("[".concat(sT,"]"))).some(function(n){return $l(n,t)}):!1},DT=function(e,t){return t.filter(X5).filter(function(n){return n.name===e.name}).filter(function(n){return n.checked})[0]||e},r1=function(e,t){return X5(e)&&e.name?DT(e,t):e},AT=function(e){var t=new Set;return e.forEach(function(n){return t.add(r1(n,e))}),e.filter(function(n){return t.has(n)})},C2=function(e){return e[0]&&e.length>1?r1(e[0],e):e[0]},P2=function(e,t){return e.length>1?e.indexOf(r1(e[t],e)):t},t6="NEW_FOCUS",NT=function(e,t,n,r){var o=e.length,s=e[0],a=e[o-1],u=J0(n);if(!(n&&e.indexOf(n)>=0)){var d=n!==void 0?t.indexOf(n):-1,f=r?t.indexOf(r):d,h=r?e.indexOf(r):-1,m=d-f,v=t.indexOf(s),b=t.indexOf(a),w=AT(t),C=n!==void 0?w.indexOf(n):-1,S=C-(r?w.indexOf(r):d),P=P2(e,0),k=P2(e,o-1);if(d===-1||h===-1)return t6;if(!m&&h>=0)return h;if(d<=v&&u&&Math.abs(m)>1)return k;if(d>=b&&u&&Math.abs(m)>1)return P;if(m&&Math.abs(S)>1)return h;if(d<=v)return k;if(d>b)return P;if(m)return Math.abs(m)>1?h:(o+h+m)%o}},zT=function(e){return function(t){var n,r=(n=K5(t))===null||n===void 0?void 0:n.autofocus;return t.autofocus||r!==void 0&&r!=="false"||e.indexOf(t)>=0}},$T=function(e,t,n){var r=e.map(function(s){var a=s.node;return a}),o=S2(r.filter(zT(n)));return o&&o.length?C2(o):C2(S2(t))},Ov=function(e,t){return t===void 0&&(t=[]),t.push(e),e.parentNode&&Ov(e.parentNode.host||e.parentNode,t),t},gg=function(e,t){for(var n=Ov(e),r=Ov(t),o=0;o=0)return s}return!1},n6=function(e,t,n){var r=Qf(e),o=Qf(t),s=r[0],a=!1;return o.filter(Boolean).forEach(function(u){a=gg(a||u,u)||a,n.filter(Boolean).forEach(function(d){var f=gg(s,d);f&&(!a||$l(f,a)?a=f:a=gg(f,a))})}),a},LT=function(e,t){return e.reduce(function(n,r){return n.concat(ET(r,t))},[])},FT=function(e,t){var n=new Map;return t.forEach(function(r){return n.set(r.node,r)}),e.map(function(r){return n.get(r)}).filter(wT)},BT=function(e,t){var n=vu(Qf(e).length>0?document:W5(e).ownerDocument),r=n1(e).filter(Zf),o=n6(n||e,e,r),s=new Map,a=w2(r,s),u=Iv(r,s).filter(function(b){var w=b.node;return Zf(w)});if(!(!u[0]&&(u=a,!u[0]))){var d=w2([o],s).map(function(b){var w=b.node;return w}),f=FT(d,u),h=f.map(function(b){var w=b.node;return w}),m=NT(h,d,n,t);if(m===t6){var v=$T(a,h,LT(r,s));if(v)return{node:v};console.warn("focus-lock: cannot find any node to move focus into");return}return m===void 0?m:f[m]}},HT=function(e){var t=n1(e).filter(Zf),n=n6(e,e,t),r=new Map,o=Iv([n],r,!0),s=Iv(t,r).filter(function(a){var u=a.node;return Zf(u)}).map(function(a){var u=a.node;return u});return o.map(function(a){var u=a.node,d=a.index;return{node:u,index:d,lockItem:s.indexOf(u)>=0,guard:J0(u)}})},WT=function(e,t){"focus"in e&&e.focus(t),"contentWindow"in e&&e.contentWindow&&e.contentWindow.focus()},vg=0,yg=!1,r6=function(e,t,n){n===void 0&&(n={});var r=BT(e,t);if(!yg&&r){if(vg>2){console.error("FocusLock: focus-fighting detected. Only one focus management system could be active. See https://github.com/theKashey/focus-lock/#focus-fighting"),yg=!0,setTimeout(function(){yg=!1},1);return}vg++,WT(r.node,n.focusOptions),vg--}};function o6(e){var t=window,n=t.setImmediate;typeof n<"u"?n(e):setTimeout(e,1)}var VT=function(){return document&&document.activeElement===document.body},UT=function(){return VT()||TT()},Ll=null,Il=null,Fl=null,yu=!1,GT=function(){return!0},qT=function(t){return(Ll.whiteList||GT)(t)},KT=function(t,n){Fl={observerNode:t,portaledElement:n}},YT=function(t){return Fl&&Fl.portaledElement===t};function k2(e,t,n,r){var o=null,s=e;do{var a=r[s];if(a.guard)a.node.dataset.focusAutoGuard&&(o=a);else if(a.lockItem){if(s!==e)return;o=null}else break}while((s+=n)!==t);o&&(o.node.tabIndex=0)}var XT=function(t){return t&&"current"in t?t.current:t},QT=function(t){return t?!!yu:yu==="meanwhile"},ZT=function e(t,n,r){return n&&(n.host===t&&(!n.activeElement||r.contains(n.activeElement))||n.parentNode&&e(t,n.parentNode,r))},JT=function(t,n){return n.some(function(r){return ZT(t,r,r)})},Jf=function(){var t=!1;if(Ll){var n=Ll,r=n.observed,o=n.persistentFocus,s=n.autoFocus,a=n.shards,u=n.crossFrame,d=n.focusOptions,f=r||Fl&&Fl.portaledElement,h=document&&document.activeElement;if(f){var m=[f].concat(a.map(XT).filter(Boolean));if((!h||qT(h))&&(o||QT(u)||!UT()||!Il&&s)&&(f&&!(e6(m)||h&&JT(h,m)||YT(h))&&(document&&!Il&&h&&!s?(h.blur&&h.blur(),document.body.focus()):(t=r6(m,Il,{focusOptions:d}),Fl={})),yu=!1,Il=document&&document.activeElement),document){var v=document&&document.activeElement,b=HT(m),w=b.map(function(C){var S=C.node;return S}).indexOf(v);w>-1&&(b.filter(function(C){var S=C.guard,P=C.node;return S&&P.dataset.focusAutoGuard}).forEach(function(C){var S=C.node;return S.removeAttribute("tabIndex")}),k2(w,b.length,1,b),k2(w,-1,-1,b))}}}return t},s6=function(t){Jf()&&t&&(t.stopPropagation(),t.preventDefault())},o1=function(){return o6(Jf)},eD=function(t){var n=t.target,r=t.currentTarget;r.contains(n)||KT(r,n)},tD=function(){return null},a6=function(){yu="just",setTimeout(function(){yu="meanwhile"},0)},nD=function(){document.addEventListener("focusin",s6),document.addEventListener("focusout",o1),window.addEventListener("blur",a6)},rD=function(){document.removeEventListener("focusin",s6),document.removeEventListener("focusout",o1),window.removeEventListener("blur",a6)};function oD(e){return e.filter(function(t){var n=t.disabled;return!n})}function sD(e){var t=e.slice(-1)[0];t&&!Ll&&nD();var n=Ll,r=n&&t&&t.id===n.id;Ll=t,n&&!r&&(n.onDeactivation(),e.filter(function(o){var s=o.id;return s===n.id}).length||n.returnFocus(!t)),t?(Il=null,(!r||n.observed!==t.observed)&&t.onActivation(),Jf(),o6(Jf)):(rD(),Il=null)}F5.assignSyncMedium(eD);B5.assignMedium(o1);dT.assignMedium(function(e){return e({moveFocusInside:r6,focusInside:e6})});const aD=mT(oD,sD)(tD);var i6=p.forwardRef(function(t,n){return p.createElement(H5,nr({sideCar:aD,ref:n},t))}),l6=H5.propTypes||{};l6.sideCar;j7(l6,["sideCar"]);i6.propTypes={};const _2=i6;var c6=e=>e.hasAttribute("tabindex"),iD=e=>c6(e)&&e.tabIndex===-1;function lD(e){return!!e.getAttribute("disabled")||!!e.getAttribute("aria-disabled")}function u6(e){return e.parentElement&&u6(e.parentElement)?!0:e.hidden}function cD(e){const t=e.getAttribute("contenteditable");return t!=="false"&&t!=null}function d6(e){if(!t3(e)||u6(e)||lD(e))return!1;const{localName:t}=e;if(["input","select","textarea","button"].indexOf(t)>=0)return!0;const r={a:()=>e.hasAttribute("href"),audio:()=>e.hasAttribute("controls"),video:()=>e.hasAttribute("controls")};return t in r?r[t]():cD(e)?!0:c6(e)}function uD(e){return e?t3(e)&&d6(e)&&!iD(e):!1}var dD=["input:not(:disabled):not([disabled])","select:not(:disabled):not([disabled])","textarea:not(:disabled):not([disabled])","embed","iframe","object","a[href]","area[href]","button:not(:disabled):not([disabled])","[tabindex]","audio[controls]","video[controls]","*[tabindex]:not([aria-disabled])","*[contenteditable]"],fD=dD.join(),pD=e=>e.offsetWidth>0&&e.offsetHeight>0;function f6(e){const t=Array.from(e.querySelectorAll(fD));return t.unshift(e),t.filter(n=>d6(n)&&pD(n))}var j2,hD=(j2=_2.default)!=null?j2:_2,p6=e=>{const{initialFocusRef:t,finalFocusRef:n,contentRef:r,restoreFocus:o,children:s,isDisabled:a,autoFocus:u,persistentFocus:d,lockFocusAcrossFrames:f}=e,h=p.useCallback(()=>{t!=null&&t.current?t.current.focus():r!=null&&r.current&&f6(r.current).length===0&&requestAnimationFrame(()=>{var w;(w=r.current)==null||w.focus()})},[t,r]),m=p.useCallback(()=>{var b;(b=n==null?void 0:n.current)==null||b.focus()},[n]),v=o&&!n;return i.jsx(hD,{crossFrame:f,persistentFocus:d,autoFocus:u,disabled:a,onActivation:h,onDeactivation:m,returnFocus:v,children:s})};p6.displayName="FocusLock";function mD(e,t,n,r){const o=n3(t);return p.useEffect(()=>{var s;const a=(s=vx(n))!=null?s:document;if(t)return a.addEventListener(e,o,r),()=>{a.removeEventListener(e,o,r)}},[e,n,r,o,t]),()=>{var s;((s=vx(n))!=null?s:document).removeEventListener(e,o,r)}}function gD(e){const{ref:t,handler:n,enabled:r=!0}=e,o=n3(n),a=p.useRef({isPointerDown:!1,ignoreEmulatedMouseEvents:!1}).current;p.useEffect(()=>{if(!r)return;const u=m=>{bg(m,t)&&(a.isPointerDown=!0)},d=m=>{if(a.ignoreEmulatedMouseEvents){a.ignoreEmulatedMouseEvents=!1;return}a.isPointerDown&&n&&bg(m,t)&&(a.isPointerDown=!1,o(m))},f=m=>{a.ignoreEmulatedMouseEvents=!0,n&&a.isPointerDown&&bg(m,t)&&(a.isPointerDown=!1,o(m))},h=r3(t.current);return h.addEventListener("mousedown",u,!0),h.addEventListener("mouseup",d,!0),h.addEventListener("touchstart",u,!0),h.addEventListener("touchend",f,!0),()=>{h.removeEventListener("mousedown",u,!0),h.removeEventListener("mouseup",d,!0),h.removeEventListener("touchstart",u,!0),h.removeEventListener("touchend",f,!0)}},[n,t,o,a,r])}function bg(e,t){var n;const r=e.target;return r&&!r3(r).contains(r)?!1:!((n=t.current)!=null&&n.contains(r))}var[vD,yD]=ur({name:"InputGroupStylesContext",errorMessage:`useInputGroupStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),h6=nt(function(t,n){const r=Xr("Input",t),{children:o,className:s,...a}=xr(t),u=Ot("chakra-input__group",s),d={},f=sh(o),h=r.field;f.forEach(v=>{var b,w;r&&(h&&v.type.id==="InputLeftElement"&&(d.paddingStart=(b=h.height)!=null?b:h.h),h&&v.type.id==="InputRightElement"&&(d.paddingEnd=(w=h.height)!=null?w:h.h),v.type.id==="InputRightAddon"&&(d.borderEndRadius=0),v.type.id==="InputLeftAddon"&&(d.borderStartRadius=0))});const m=f.map(v=>{var b,w;const C=U0({size:((b=v.props)==null?void 0:b.size)||t.size,variant:((w=v.props)==null?void 0:w.variant)||t.variant});return v.type.id!=="Input"?p.cloneElement(v,C):p.cloneElement(v,Object.assign(C,d,v.props))});return i.jsx(Be.div,{className:u,ref:n,__css:{width:"100%",display:"flex",position:"relative",isolation:"isolate"},"data-group":!0,...a,children:i.jsx(vD,{value:r,children:m})})});h6.displayName="InputGroup";var bD=Be("div",{baseStyle:{display:"flex",alignItems:"center",justifyContent:"center",position:"absolute",top:"0",zIndex:2}}),hh=nt(function(t,n){var r,o;const{placement:s="left",...a}=t,u=yD(),d=u.field,h={[s==="left"?"insetStart":"insetEnd"]:"0",width:(r=d==null?void 0:d.height)!=null?r:d==null?void 0:d.h,height:(o=d==null?void 0:d.height)!=null?o:d==null?void 0:d.h,fontSize:d==null?void 0:d.fontSize,...u.element};return i.jsx(bD,{ref:n,__css:h,...a})});hh.id="InputElement";hh.displayName="InputElement";var m6=nt(function(t,n){const{className:r,...o}=t,s=Ot("chakra-input__left-element",r);return i.jsx(hh,{ref:n,placement:"left",className:s,...o})});m6.id="InputLeftElement";m6.displayName="InputLeftElement";var s1=nt(function(t,n){const{className:r,...o}=t,s=Ot("chakra-input__right-element",r);return i.jsx(hh,{ref:n,placement:"right",className:s,...o})});s1.id="InputRightElement";s1.displayName="InputRightElement";var Bu=nt(function(t,n){const{htmlSize:r,...o}=t,s=Xr("Input",o),a=xr(o),u=D0(a),d=Ot("chakra-input",t.className);return i.jsx(Be.input,{size:r,...u,__css:s.field,ref:n,className:d})});Bu.displayName="Input";Bu.id="Input";var Ai=nt(function(t,n){const r=fc("Link",t),{className:o,isExternal:s,...a}=xr(t);return i.jsx(Be.a,{target:s?"_blank":void 0,rel:s?"noopener":void 0,ref:n,className:Ot("chakra-link",o),...a,__css:r})});Ai.displayName="Link";var[xD,g6]=ur({name:"ListStylesContext",errorMessage:`useListStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),a1=nt(function(t,n){const r=Xr("List",t),{children:o,styleType:s="none",stylePosition:a,spacing:u,...d}=xr(t),f=sh(o),m=u?{["& > *:not(style) ~ *:not(style)"]:{mt:u}}:{};return i.jsx(xD,{value:r,children:i.jsx(Be.ul,{ref:n,listStyleType:s,listStylePosition:a,role:"list",__css:{...r.container,...m},...d,children:f})})});a1.displayName="List";var SD=nt((e,t)=>{const{as:n,...r}=e;return i.jsx(a1,{ref:t,as:"ol",styleType:"decimal",marginStart:"1em",...r})});SD.displayName="OrderedList";var mh=nt(function(t,n){const{as:r,...o}=t;return i.jsx(a1,{ref:n,as:"ul",styleType:"initial",marginStart:"1em",...o})});mh.displayName="UnorderedList";var To=nt(function(t,n){const r=g6();return i.jsx(Be.li,{ref:n,...t,__css:r.item})});To.displayName="ListItem";var wD=nt(function(t,n){const r=g6();return i.jsx(mo,{ref:n,role:"presentation",...t,__css:r.icon})});wD.displayName="ListIcon";var ma=nt(function(t,n){const{templateAreas:r,gap:o,rowGap:s,columnGap:a,column:u,row:d,autoFlow:f,autoRows:h,templateRows:m,autoColumns:v,templateColumns:b,...w}=t,C={display:"grid",gridTemplateAreas:r,gridGap:o,gridRowGap:s,gridColumnGap:a,gridAutoColumns:v,gridColumn:u,gridRow:d,gridAutoFlow:f,gridAutoRows:h,gridTemplateRows:m,gridTemplateColumns:b};return i.jsx(Be.div,{ref:n,__css:C,...w})});ma.displayName="Grid";var li=Be("div",{baseStyle:{flex:1,justifySelf:"stretch",alignSelf:"stretch"}});li.displayName="Spacer";var Ue=nt(function(t,n){const r=fc("Text",t),{className:o,align:s,decoration:a,casing:u,...d}=xr(t),f=U0({textAlign:t.align,textDecoration:t.decoration,textTransform:t.casing});return i.jsx(Be.p,{ref:n,className:Ot("chakra-text",t.className),...f,...d,__css:r})});Ue.displayName="Text";var _r=nt((e,t)=>i.jsx(lO,{align:"center",...e,direction:"column",ref:t}));_r.displayName="VStack";function E2(e){return cO(e,t=>t==="auto"?"auto":`span ${t}/span ${t}`)}var Rv=nt(function(t,n){const{area:r,colSpan:o,colStart:s,colEnd:a,rowEnd:u,rowSpan:d,rowStart:f,...h}=t,m=U0({gridArea:r,gridColumn:E2(o),gridRow:E2(d),gridColumnStart:s,gridColumnEnd:a,gridRowStart:f,gridRowEnd:u});return i.jsx(Be.div,{ref:n,__css:m,...h})});Rv.displayName="GridItem";var Xl=nt(function(t,n){const r=fc("Badge",t),{className:o,...s}=xr(t);return i.jsx(Be.span,{ref:n,className:Ot("chakra-badge",t.className),...s,__css:{display:"inline-block",whiteSpace:"nowrap",verticalAlign:"middle",...r}})});Xl.displayName="Badge";var v6=Be("div",{baseStyle:{display:"flex",alignItems:"center",justifyContent:"center"}});v6.displayName="Center";var CD={horizontal:{insetStart:"50%",transform:"translateX(-50%)"},vertical:{top:"50%",transform:"translateY(-50%)"},both:{insetStart:"50%",top:"50%",transform:"translate(-50%, -50%)"}};nt(function(t,n){const{axis:r="both",...o}=t;return i.jsx(Be.div,{ref:n,__css:CD[r],...o,position:"absolute"})});var wa=nt(function(t,n){const{borderLeftWidth:r,borderBottomWidth:o,borderTopWidth:s,borderRightWidth:a,borderWidth:u,borderStyle:d,borderColor:f,...h}=fc("Divider",t),{className:m,orientation:v="horizontal",__css:b,...w}=xr(t),C={vertical:{borderLeftWidth:r||a||u||"1px",height:"100%"},horizontal:{borderBottomWidth:o||s||u||"1px",width:"100%"}};return i.jsx(Be.hr,{ref:n,"aria-orientation":v,...w,__css:{...h,border:"0",borderColor:f,borderStyle:d,...C[v],...b},className:Ot("chakra-divider",m)})});wa.displayName="Divider";function PD(e){const{key:t}=e;return t.length===1||t.length>1&&/[^a-zA-Z0-9]/.test(t)}function kD(e={}){const{timeout:t=300,preventDefault:n=()=>!0}=e,[r,o]=p.useState([]),s=p.useRef(),a=()=>{s.current&&(clearTimeout(s.current),s.current=null)},u=()=>{a(),s.current=setTimeout(()=>{o([]),s.current=null},t)};p.useEffect(()=>a,[]);function d(f){return h=>{if(h.key==="Backspace"){const m=[...r];m.pop(),o(m);return}if(PD(h)){const m=r.concat(h.key);n(h)&&(h.preventDefault(),h.stopPropagation()),o(m),f(m.join("")),u()}}}return d}function _D(e,t,n,r){if(t==null)return r;if(!r)return e.find(a=>n(a).toLowerCase().startsWith(t.toLowerCase()));const o=e.filter(s=>n(s).toLowerCase().startsWith(t.toLowerCase()));if(o.length>0){let s;return o.includes(r)?(s=o.indexOf(r)+1,s===o.length&&(s=0),o[s]):(s=e.indexOf(o[0]),e[s])}return r}function jD(){const e=p.useRef(new Map),t=e.current,n=p.useCallback((o,s,a,u)=>{e.current.set(a,{type:s,el:o,options:u}),o.addEventListener(s,a,u)},[]),r=p.useCallback((o,s,a,u)=>{o.removeEventListener(s,a,u),e.current.delete(a)},[]);return p.useEffect(()=>()=>{t.forEach((o,s)=>{r(o.el,o.type,s,o.options)})},[r,t]),{add:n,remove:r}}function xg(e){const t=e.target,{tagName:n,isContentEditable:r}=t;return n!=="INPUT"&&n!=="TEXTAREA"&&r!==!0}function y6(e={}){const{ref:t,isDisabled:n,isFocusable:r,clickOnEnter:o=!0,clickOnSpace:s=!0,onMouseDown:a,onMouseUp:u,onClick:d,onKeyDown:f,onKeyUp:h,tabIndex:m,onMouseOver:v,onMouseLeave:b,...w}=e,[C,S]=p.useState(!0),[P,k]=p.useState(!1),j=jD(),E=N=>{N&&N.tagName!=="BUTTON"&&S(!1)},I=C?m:m||0,O=n&&!r,R=p.useCallback(N=>{if(n){N.stopPropagation(),N.preventDefault();return}N.currentTarget.focus(),d==null||d(N)},[n,d]),M=p.useCallback(N=>{P&&xg(N)&&(N.preventDefault(),N.stopPropagation(),k(!1),j.remove(document,"keyup",M,!1))},[P,j]),A=p.useCallback(N=>{if(f==null||f(N),n||N.defaultPrevented||N.metaKey||!xg(N.nativeEvent)||C)return;const G=o&&N.key==="Enter";s&&N.key===" "&&(N.preventDefault(),k(!0)),G&&(N.preventDefault(),N.currentTarget.click()),j.add(document,"keyup",M,!1)},[n,C,f,o,s,j,M]),L=p.useCallback(N=>{if(h==null||h(N),n||N.defaultPrevented||N.metaKey||!xg(N.nativeEvent)||C)return;s&&N.key===" "&&(N.preventDefault(),k(!1),N.currentTarget.click())},[s,C,n,h]),D=p.useCallback(N=>{N.button===0&&(k(!1),j.remove(document,"mouseup",D,!1))},[j]),V=p.useCallback(N=>{if(N.button!==0)return;if(n){N.stopPropagation(),N.preventDefault();return}C||k(!0),N.currentTarget.focus({preventScroll:!0}),j.add(document,"mouseup",D,!1),a==null||a(N)},[n,C,a,j,D]),$=p.useCallback(N=>{N.button===0&&(C||k(!1),u==null||u(N))},[u,C]),F=p.useCallback(N=>{if(n){N.preventDefault();return}v==null||v(N)},[n,v]),U=p.useCallback(N=>{P&&(N.preventDefault(),k(!1)),b==null||b(N)},[P,b]),X=Un(t,E);return C?{...w,ref:X,type:"button","aria-disabled":O?void 0:n,disabled:O,onClick:R,onMouseDown:a,onMouseUp:u,onKeyUp:h,onKeyDown:f,onMouseOver:v,onMouseLeave:b}:{...w,ref:X,role:"button","data-active":on(P),"aria-disabled":n?"true":void 0,tabIndex:O?void 0:I,onClick:R,onMouseDown:V,onMouseUp:$,onKeyUp:L,onKeyDown:A,onMouseOver:F,onMouseLeave:U}}function ED(e){const t=e.current;if(!t)return!1;const n=uO(t);return!n||t.contains(n)?!1:!!uD(n)}function b6(e,t){const{shouldFocus:n,visible:r,focusRef:o}=t,s=n&&!r;Zi(()=>{if(!s||ED(e))return;const a=(o==null?void 0:o.current)||e.current;let u;if(a)return u=requestAnimationFrame(()=>{a.focus({preventScroll:!0})}),()=>{cancelAnimationFrame(u)}},[s,e,o])}var ID={preventScroll:!0,shouldFocus:!1};function OD(e,t=ID){const{focusRef:n,preventScroll:r,shouldFocus:o,visible:s}=t,a=RD(e)?e.current:e,u=o&&s,d=p.useRef(u),f=p.useRef(s);su(()=>{!f.current&&s&&(d.current=u),f.current=s},[s,u]);const h=p.useCallback(()=>{if(!(!s||!a||!d.current)&&(d.current=!1,!a.contains(document.activeElement)))if(n!=null&&n.current)requestAnimationFrame(()=>{var m;(m=n.current)==null||m.focus({preventScroll:r})});else{const m=f6(a);m.length>0&&requestAnimationFrame(()=>{m[0].focus({preventScroll:r})})}},[s,r,a,n]);Zi(()=>{h()},[h]),M0(a,"transitionend",h)}function RD(e){return"current"in e}function MD(e){const{ref:t,handler:n,enabled:r=!0}=e,o=qa(n),a=p.useRef({isPointerDown:!1,ignoreEmulatedMouseEvents:!1}).current;p.useEffect(()=>{if(!r)return;const u=m=>{Sg(m,t)&&(a.isPointerDown=!0)},d=m=>{if(a.ignoreEmulatedMouseEvents){a.ignoreEmulatedMouseEvents=!1;return}a.isPointerDown&&n&&Sg(m,t)&&(a.isPointerDown=!1,o(m))},f=m=>{a.ignoreEmulatedMouseEvents=!0,n&&a.isPointerDown&&Sg(m,t)&&(a.isPointerDown=!1,o(m))},h=x6(t.current);return h.addEventListener("mousedown",u,!0),h.addEventListener("mouseup",d,!0),h.addEventListener("touchstart",u,!0),h.addEventListener("touchend",f,!0),()=>{h.removeEventListener("mousedown",u,!0),h.removeEventListener("mouseup",d,!0),h.removeEventListener("touchstart",u,!0),h.removeEventListener("touchend",f,!0)}},[n,t,o,a,r])}function Sg(e,t){var n;const r=e.target;return r&&!x6(r).contains(r)?!1:!((n=t.current)!=null&&n.contains(r))}function x6(e){var t;return(t=e==null?void 0:e.ownerDocument)!=null?t:document}function S6(e){const{isOpen:t,ref:n}=e,[r,o]=p.useState(t),[s,a]=p.useState(!1);return p.useEffect(()=>{s||(o(t),a(!0))},[t,s,r]),M0(()=>n.current,"animationend",()=>{o(t)}),{present:!(t?!1:!r),onComplete(){var d;const f=dO(n.current),h=new f.CustomEvent("animationend",{bubbles:!0});(d=n.current)==null||d.dispatchEvent(h)}}}function i1(e){const{wasSelected:t,enabled:n,isSelected:r,mode:o="unmount"}=e;return!!(!n||r||o==="keepMounted"&&t)}var[TD,DD,AD,ND]=G0(),[zD,Hu]=ur({strict:!1,name:"MenuContext"});function $D(e,...t){const n=p.useId(),r=e||n;return p.useMemo(()=>t.map(o=>`${o}-${r}`),[r,t])}function w6(e){var t;return(t=e==null?void 0:e.ownerDocument)!=null?t:document}function I2(e){return w6(e).activeElement===e}function LD(e={}){const{id:t,closeOnSelect:n=!0,closeOnBlur:r=!0,initialFocusRef:o,autoSelect:s=!0,isLazy:a,isOpen:u,defaultIsOpen:d,onClose:f,onOpen:h,placement:m="bottom-start",lazyBehavior:v="unmount",direction:b,computePositionOnMount:w=!1,...C}=e,S=p.useRef(null),P=p.useRef(null),k=AD(),j=p.useCallback(()=>{requestAnimationFrame(()=>{var le;(le=S.current)==null||le.focus({preventScroll:!1})})},[]),E=p.useCallback(()=>{const le=setTimeout(()=>{var oe;if(o)(oe=o.current)==null||oe.focus();else{const Y=k.firstEnabled();Y&&$(Y.index)}});G.current.add(le)},[k,o]),I=p.useCallback(()=>{const le=setTimeout(()=>{const oe=k.lastEnabled();oe&&$(oe.index)});G.current.add(le)},[k]),O=p.useCallback(()=>{h==null||h(),s?E():j()},[s,E,j,h]),{isOpen:R,onOpen:M,onClose:A,onToggle:L}=o3({isOpen:u,defaultIsOpen:d,onClose:f,onOpen:O});MD({enabled:R&&r,ref:S,handler:le=>{var oe;(oe=P.current)!=null&&oe.contains(le.target)||A()}});const D=s3({...C,enabled:R||w,placement:m,direction:b}),[V,$]=p.useState(-1);Zi(()=>{R||$(-1)},[R]),b6(S,{focusRef:P,visible:R,shouldFocus:!0});const F=S6({isOpen:R,ref:S}),[U,X]=$D(t,"menu-button","menu-list"),N=p.useCallback(()=>{M(),j()},[M,j]),G=p.useRef(new Set([]));qD(()=>{G.current.forEach(le=>clearTimeout(le)),G.current.clear()});const W=p.useCallback(()=>{M(),E()},[E,M]),q=p.useCallback(()=>{M(),I()},[M,I]),ne=p.useCallback(()=>{var le,oe;const Y=w6(S.current),ae=(le=S.current)==null?void 0:le.contains(Y.activeElement);if(!(R&&!ae))return;const xe=(oe=k.item(V))==null?void 0:oe.node;xe==null||xe.focus()},[R,V,k]),ve=p.useRef(null);return{openAndFocusMenu:N,openAndFocusFirstItem:W,openAndFocusLastItem:q,onTransitionEnd:ne,unstable__animationState:F,descendants:k,popper:D,buttonId:U,menuId:X,forceUpdate:D.forceUpdate,orientation:"vertical",isOpen:R,onToggle:L,onOpen:M,onClose:A,menuRef:S,buttonRef:P,focusedIndex:V,closeOnSelect:n,closeOnBlur:r,autoSelect:s,setFocusedIndex:$,isLazy:a,lazyBehavior:v,initialFocusRef:o,rafId:ve}}function FD(e={},t=null){const n=Hu(),{onToggle:r,popper:o,openAndFocusFirstItem:s,openAndFocusLastItem:a}=n,u=p.useCallback(d=>{const f=d.key,m={Enter:s,ArrowDown:s,ArrowUp:a}[f];m&&(d.preventDefault(),d.stopPropagation(),m(d))},[s,a]);return{...e,ref:Un(n.buttonRef,t,o.referenceRef),id:n.buttonId,"data-active":on(n.isOpen),"aria-expanded":n.isOpen,"aria-haspopup":"menu","aria-controls":n.menuId,onClick:bt(e.onClick,r),onKeyDown:bt(e.onKeyDown,u)}}function Mv(e){var t;return UD(e)&&!!((t=e==null?void 0:e.getAttribute("role"))!=null&&t.startsWith("menuitem"))}function BD(e={},t=null){const n=Hu();if(!n)throw new Error("useMenuContext: context is undefined. Seems you forgot to wrap component within ");const{focusedIndex:r,setFocusedIndex:o,menuRef:s,isOpen:a,onClose:u,menuId:d,isLazy:f,lazyBehavior:h,unstable__animationState:m}=n,v=DD(),b=kD({preventDefault:P=>P.key!==" "&&Mv(P.target)}),w=p.useCallback(P=>{if(!P.currentTarget.contains(P.target))return;const k=P.key,E={Tab:O=>O.preventDefault(),Escape:u,ArrowDown:()=>{const O=v.nextEnabled(r);O&&o(O.index)},ArrowUp:()=>{const O=v.prevEnabled(r);O&&o(O.index)}}[k];if(E){P.preventDefault(),E(P);return}const I=b(O=>{const R=_D(v.values(),O,M=>{var A,L;return(L=(A=M==null?void 0:M.node)==null?void 0:A.textContent)!=null?L:""},v.item(r));if(R){const M=v.indexOf(R.node);o(M)}});Mv(P.target)&&I(P)},[v,r,b,u,o]),C=p.useRef(!1);a&&(C.current=!0);const S=i1({wasSelected:C.current,enabled:f,mode:h,isSelected:m.present});return{...e,ref:Un(s,t),children:S?e.children:null,tabIndex:-1,role:"menu",id:d,style:{...e.style,transformOrigin:"var(--popper-transform-origin)"},"aria-orientation":"vertical",onKeyDown:bt(e.onKeyDown,w)}}function HD(e={}){const{popper:t,isOpen:n}=Hu();return t.getPopperProps({...e,style:{visibility:n?"visible":"hidden",...e.style}})}function C6(e={},t=null){const{onMouseEnter:n,onMouseMove:r,onMouseLeave:o,onClick:s,onFocus:a,isDisabled:u,isFocusable:d,closeOnSelect:f,type:h,...m}=e,v=Hu(),{setFocusedIndex:b,focusedIndex:w,closeOnSelect:C,onClose:S,menuRef:P,isOpen:k,menuId:j,rafId:E}=v,I=p.useRef(null),O=`${j}-menuitem-${p.useId()}`,{index:R,register:M}=ND({disabled:u&&!d}),A=p.useCallback(N=>{n==null||n(N),!u&&b(R)},[b,R,u,n]),L=p.useCallback(N=>{r==null||r(N),I.current&&!I2(I.current)&&A(N)},[A,r]),D=p.useCallback(N=>{o==null||o(N),!u&&b(-1)},[b,u,o]),V=p.useCallback(N=>{s==null||s(N),Mv(N.currentTarget)&&(f??C)&&S()},[S,s,C,f]),$=p.useCallback(N=>{a==null||a(N),b(R)},[b,a,R]),F=R===w,U=u&&!d;Zi(()=>{k&&(F&&!U&&I.current?(E.current&&cancelAnimationFrame(E.current),E.current=requestAnimationFrame(()=>{var N;(N=I.current)==null||N.focus(),E.current=null})):P.current&&!I2(P.current)&&P.current.focus({preventScroll:!0}))},[F,U,P,k]);const X=y6({onClick:V,onFocus:$,onMouseEnter:A,onMouseMove:L,onMouseLeave:D,ref:Un(M,I,t),isDisabled:u,isFocusable:d});return{...m,...X,type:h??X.type,id:O,role:"menuitem",tabIndex:F?0:-1}}function WD(e={},t=null){const{type:n="radio",isChecked:r,...o}=e;return{...C6(o,t),role:`menuitem${n}`,"aria-checked":r}}function VD(e={}){const{children:t,type:n="radio",value:r,defaultValue:o,onChange:s,...a}=e,d=n==="radio"?"":[],[f,h]=Ru({defaultValue:o??d,value:r,onChange:s}),m=p.useCallback(w=>{if(n==="radio"&&typeof f=="string"&&h(w),n==="checkbox"&&Array.isArray(f)){const C=f.includes(w)?f.filter(S=>S!==w):f.concat(w);h(C)}},[f,h,n]),b=sh(t).map(w=>{if(w.type.id!=="MenuItemOption")return w;const C=P=>{var k,j;m(w.props.value),(j=(k=w.props).onClick)==null||j.call(k,P)},S=n==="radio"?w.props.value===f:f.includes(w.props.value);return p.cloneElement(w,{type:n,onClick:C,isChecked:S})});return{...a,children:b}}function UD(e){var t;if(!GD(e))return!1;const n=(t=e.ownerDocument.defaultView)!=null?t:window;return e instanceof n.HTMLElement}function GD(e){return e!=null&&typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.ELEMENT_NODE}function qD(e,t=[]){return p.useEffect(()=>()=>e(),t)}var[KD,Wu]=ur({name:"MenuStylesContext",errorMessage:`useMenuStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),gh=e=>{const{children:t}=e,n=Xr("Menu",e),r=xr(e),{direction:o}=ah(),{descendants:s,...a}=LD({...r,direction:o}),u=p.useMemo(()=>a,[a]),{isOpen:d,onClose:f,forceUpdate:h}=u;return i.jsx(TD,{value:s,children:i.jsx(zD,{value:u,children:i.jsx(KD,{value:n,children:T0(t,{isOpen:d,onClose:f,forceUpdate:h})})})})};gh.displayName="Menu";var P6=nt((e,t)=>{const n=Wu();return i.jsx(Be.span,{ref:t,...e,__css:n.command,className:"chakra-menu__command"})});P6.displayName="MenuCommand";var k6=nt((e,t)=>{const{type:n,...r}=e,o=Wu(),s=r.as||n?n??void 0:"button",a=p.useMemo(()=>({textDecoration:"none",color:"inherit",userSelect:"none",display:"flex",width:"100%",alignItems:"center",textAlign:"start",flex:"0 0 auto",outline:0,...o.item}),[o.item]);return i.jsx(Be.button,{ref:t,type:s,...r,__css:a})}),l1=e=>{const{className:t,children:n,...r}=e,o=p.Children.only(n),s=p.isValidElement(o)?p.cloneElement(o,{focusable:"false","aria-hidden":!0,className:Ot("chakra-menu__icon",o.props.className)}):null,a=Ot("chakra-menu__icon-wrapper",t);return i.jsx(Be.span,{className:a,...r,__css:{display:"inline-flex",alignItems:"center",justifyContent:"center",flexShrink:0},children:s})};l1.displayName="MenuIcon";var ro=nt((e,t)=>{const{icon:n,iconSpacing:r="0.75rem",command:o,commandSpacing:s="0.75rem",children:a,...u}=e,d=C6(u,t),h=n||o?i.jsx("span",{style:{pointerEvents:"none",flex:1},children:a}):a;return i.jsxs(k6,{...d,className:Ot("chakra-menu__menuitem",d.className),children:[n&&i.jsx(l1,{fontSize:"0.8em",marginEnd:r,children:n}),h,o&&i.jsx(P6,{marginStart:s,children:o})]})});ro.displayName="MenuItem";var YD={enter:{visibility:"visible",opacity:1,scale:1,transition:{duration:.2,ease:[.4,0,.2,1]}},exit:{transitionEnd:{visibility:"hidden"},opacity:0,scale:.8,transition:{duration:.1,easings:"easeOut"}}},XD=Be(bo.div),Vu=nt(function(t,n){var r,o;const{rootProps:s,motionProps:a,...u}=t,{isOpen:d,onTransitionEnd:f,unstable__animationState:h}=Hu(),m=BD(u,n),v=HD(s),b=Wu();return i.jsx(Be.div,{...v,__css:{zIndex:(o=t.zIndex)!=null?o:(r=b.list)==null?void 0:r.zIndex},children:i.jsx(XD,{variants:YD,initial:!1,animate:d?"enter":"exit",__css:{outline:0,...b.list},...a,className:Ot("chakra-menu__menu-list",m.className),...m,onUpdate:f,onAnimationComplete:oh(h.onComplete,m.onAnimationComplete)})})});Vu.displayName="MenuList";var _6=nt((e,t)=>{const{title:n,children:r,className:o,...s}=e,a=Ot("chakra-menu__group__title",o),u=Wu();return i.jsxs("div",{ref:t,className:"chakra-menu__group",role:"group",children:[n&&i.jsx(Be.p,{className:a,...s,__css:u.groupTitle,children:n}),r]})});_6.displayName="MenuGroup";var c1=e=>{const{className:t,title:n,...r}=e,o=VD(r);return i.jsx(_6,{title:n,className:Ot("chakra-menu__option-group",t),...o})};c1.displayName="MenuOptionGroup";var QD=nt((e,t)=>{const n=Wu();return i.jsx(Be.button,{ref:t,...e,__css:{display:"inline-flex",appearance:"none",alignItems:"center",outline:0,...n.button}})}),vh=nt((e,t)=>{const{children:n,as:r,...o}=e,s=FD(o,t),a=r||QD;return i.jsx(a,{...s,className:Ot("chakra-menu__menu-button",e.className),children:i.jsx(Be.span,{__css:{pointerEvents:"none",flex:"1 1 auto",minW:0},children:e.children})})});vh.displayName="MenuButton";var ZD=e=>i.jsx("svg",{viewBox:"0 0 14 14",width:"1em",height:"1em",...e,children:i.jsx("polygon",{fill:"currentColor",points:"5.5 11.9993304 14 3.49933039 12.5 2 5.5 8.99933039 1.5 4.9968652 0 6.49933039"})}),bu=nt((e,t)=>{const{icon:n,iconSpacing:r="0.75rem",...o}=e,s=WD(o,t);return i.jsxs(k6,{...s,className:Ot("chakra-menu__menuitem-option",o.className),children:[n!==null&&i.jsx(l1,{fontSize:"0.8em",marginEnd:r,opacity:e.isChecked?1:0,children:n||i.jsx(ZD,{})}),i.jsx("span",{style:{flex:1},children:s.children})]})});bu.id="MenuItemOption";bu.displayName="MenuItemOption";var JD={slideInBottom:{...Cv,custom:{offsetY:16,reverse:!0}},slideInRight:{...Cv,custom:{offsetX:16,reverse:!0}},scale:{...m5,custom:{initialScale:.95,reverse:!0}},none:{}},e9=Be(bo.section),t9=e=>JD[e||"none"],j6=p.forwardRef((e,t)=>{const{preset:n,motionProps:r=t9(n),...o}=e;return i.jsx(e9,{ref:t,...r,...o})});j6.displayName="ModalTransition";var n9=Object.defineProperty,r9=(e,t,n)=>t in e?n9(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,o9=(e,t,n)=>(r9(e,typeof t!="symbol"?t+"":t,n),n),s9=class{constructor(){o9(this,"modals"),this.modals=new Map}add(e){return this.modals.set(e,this.modals.size+1),this.modals.size}remove(e){this.modals.delete(e)}isTopModal(e){return e?this.modals.get(e)===this.modals.size:!1}},Tv=new s9;function E6(e,t){const[n,r]=p.useState(0);return p.useEffect(()=>{const o=e.current;if(o){if(t){const s=Tv.add(o);r(s)}return()=>{Tv.remove(o),r(0)}}},[t,e]),n}var a9=function(e){if(typeof document>"u")return null;var t=Array.isArray(e)?e[0]:e;return t.ownerDocument.body},bl=new WeakMap,Bd=new WeakMap,Hd={},wg=0,I6=function(e){return e&&(e.host||I6(e.parentNode))},i9=function(e,t){return t.map(function(n){if(e.contains(n))return n;var r=I6(n);return r&&e.contains(r)?r:(console.error("aria-hidden",n,"in not contained inside",e,". Doing nothing"),null)}).filter(function(n){return!!n})},l9=function(e,t,n,r){var o=i9(t,Array.isArray(e)?e:[e]);Hd[n]||(Hd[n]=new WeakMap);var s=Hd[n],a=[],u=new Set,d=new Set(o),f=function(m){!m||u.has(m)||(u.add(m),f(m.parentNode))};o.forEach(f);var h=function(m){!m||d.has(m)||Array.prototype.forEach.call(m.children,function(v){if(u.has(v))h(v);else{var b=v.getAttribute(r),w=b!==null&&b!=="false",C=(bl.get(v)||0)+1,S=(s.get(v)||0)+1;bl.set(v,C),s.set(v,S),a.push(v),C===1&&w&&Bd.set(v,!0),S===1&&v.setAttribute(n,"true"),w||v.setAttribute(r,"true")}})};return h(t),u.clear(),wg++,function(){a.forEach(function(m){var v=bl.get(m)-1,b=s.get(m)-1;bl.set(m,v),s.set(m,b),v||(Bd.has(m)||m.removeAttribute(r),Bd.delete(m)),b||m.removeAttribute(n)}),wg--,wg||(bl=new WeakMap,bl=new WeakMap,Bd=new WeakMap,Hd={})}},c9=function(e,t,n){n===void 0&&(n="data-aria-hidden");var r=Array.from(Array.isArray(e)?e:[e]),o=t||a9(e);return o?(r.push.apply(r,Array.from(o.querySelectorAll("[aria-live]"))),l9(r,o,n,"aria-hidden")):function(){return null}};function u9(e){const{isOpen:t,onClose:n,id:r,closeOnOverlayClick:o=!0,closeOnEsc:s=!0,useInert:a=!0,onOverlayClick:u,onEsc:d}=e,f=p.useRef(null),h=p.useRef(null),[m,v,b]=f9(r,"chakra-modal","chakra-modal--header","chakra-modal--body");d9(f,t&&a);const w=E6(f,t),C=p.useRef(null),S=p.useCallback(A=>{C.current=A.target},[]),P=p.useCallback(A=>{A.key==="Escape"&&(A.stopPropagation(),s&&(n==null||n()),d==null||d())},[s,n,d]),[k,j]=p.useState(!1),[E,I]=p.useState(!1),O=p.useCallback((A={},L=null)=>({role:"dialog",...A,ref:Un(L,f),id:m,tabIndex:-1,"aria-modal":!0,"aria-labelledby":k?v:void 0,"aria-describedby":E?b:void 0,onClick:bt(A.onClick,D=>D.stopPropagation())}),[b,E,m,v,k]),R=p.useCallback(A=>{A.stopPropagation(),C.current===A.target&&Tv.isTopModal(f.current)&&(o&&(n==null||n()),u==null||u())},[n,o,u]),M=p.useCallback((A={},L=null)=>({...A,ref:Un(L,h),onClick:bt(A.onClick,R),onKeyDown:bt(A.onKeyDown,P),onMouseDown:bt(A.onMouseDown,S)}),[P,S,R]);return{isOpen:t,onClose:n,headerId:v,bodyId:b,setBodyMounted:I,setHeaderMounted:j,dialogRef:f,overlayRef:h,getDialogProps:O,getDialogContainerProps:M,index:w}}function d9(e,t){const n=e.current;p.useEffect(()=>{if(!(!e.current||!t))return c9(e.current)},[t,e,n])}function f9(e,...t){const n=p.useId(),r=e||n;return p.useMemo(()=>t.map(o=>`${o}-${r}`),[r,t])}var[p9,vc]=ur({name:"ModalStylesContext",errorMessage:`useModalStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),[h9,Wi]=ur({strict:!0,name:"ModalContext",errorMessage:"useModalContext: `context` is undefined. Seems you forgot to wrap modal components in ``"}),xu=e=>{const t={scrollBehavior:"outside",autoFocus:!0,trapFocus:!0,returnFocusOnClose:!0,blockScrollOnMount:!0,allowPinchZoom:!1,motionPreset:"scale",lockFocusAcrossFrames:!0,...e},{portalProps:n,children:r,autoFocus:o,trapFocus:s,initialFocusRef:a,finalFocusRef:u,returnFocusOnClose:d,blockScrollOnMount:f,allowPinchZoom:h,preserveScrollBarGap:m,motionPreset:v,lockFocusAcrossFrames:b,onCloseComplete:w}=t,C=Xr("Modal",t),P={...u9(t),autoFocus:o,trapFocus:s,initialFocusRef:a,finalFocusRef:u,returnFocusOnClose:d,blockScrollOnMount:f,allowPinchZoom:h,preserveScrollBarGap:m,motionPreset:v,lockFocusAcrossFrames:b};return i.jsx(h9,{value:P,children:i.jsx(p9,{value:C,children:i.jsx(Ao,{onExitComplete:w,children:P.isOpen&&i.jsx(zf,{...n,children:r})})})})};xu.displayName="Modal";var Of="right-scroll-bar-position",Rf="width-before-scroll-bar",m9="with-scroll-bars-hidden",g9="--removed-body-scroll-bar-size",O6=$5(),Cg=function(){},yh=p.forwardRef(function(e,t){var n=p.useRef(null),r=p.useState({onScrollCapture:Cg,onWheelCapture:Cg,onTouchMoveCapture:Cg}),o=r[0],s=r[1],a=e.forwardProps,u=e.children,d=e.className,f=e.removeScrollBar,h=e.enabled,m=e.shards,v=e.sideCar,b=e.noIsolation,w=e.inert,C=e.allowPinchZoom,S=e.as,P=S===void 0?"div":S,k=e.gapMode,j=A5(e,["forwardProps","children","className","removeScrollBar","enabled","shards","sideCar","noIsolation","inert","allowPinchZoom","as","gapMode"]),E=v,I=D5([n,t]),O=Bs(Bs({},j),o);return p.createElement(p.Fragment,null,h&&p.createElement(E,{sideCar:O6,removeScrollBar:f,shards:m,noIsolation:b,inert:w,setCallbacks:s,allowPinchZoom:!!C,lockRef:n,gapMode:k}),a?p.cloneElement(p.Children.only(u),Bs(Bs({},O),{ref:I})):p.createElement(P,Bs({},O,{className:d,ref:I}),u))});yh.defaultProps={enabled:!0,removeScrollBar:!0,inert:!1};yh.classNames={fullWidth:Rf,zeroRight:Of};var O2,v9=function(){if(O2)return O2;if(typeof __webpack_nonce__<"u")return __webpack_nonce__};function y9(){if(!document)return null;var e=document.createElement("style");e.type="text/css";var t=v9();return t&&e.setAttribute("nonce",t),e}function b9(e,t){e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t))}function x9(e){var t=document.head||document.getElementsByTagName("head")[0];t.appendChild(e)}var S9=function(){var e=0,t=null;return{add:function(n){e==0&&(t=y9())&&(b9(t,n),x9(t)),e++},remove:function(){e--,!e&&t&&(t.parentNode&&t.parentNode.removeChild(t),t=null)}}},w9=function(){var e=S9();return function(t,n){p.useEffect(function(){return e.add(t),function(){e.remove()}},[t&&n])}},R6=function(){var e=w9(),t=function(n){var r=n.styles,o=n.dynamic;return e(r,o),null};return t},C9={left:0,top:0,right:0,gap:0},Pg=function(e){return parseInt(e||"",10)||0},P9=function(e){var t=window.getComputedStyle(document.body),n=t[e==="padding"?"paddingLeft":"marginLeft"],r=t[e==="padding"?"paddingTop":"marginTop"],o=t[e==="padding"?"paddingRight":"marginRight"];return[Pg(n),Pg(r),Pg(o)]},k9=function(e){if(e===void 0&&(e="margin"),typeof window>"u")return C9;var t=P9(e),n=document.documentElement.clientWidth,r=window.innerWidth;return{left:t[0],top:t[1],right:t[2],gap:Math.max(0,r-n+t[2]-t[0])}},_9=R6(),j9=function(e,t,n,r){var o=e.left,s=e.top,a=e.right,u=e.gap;return n===void 0&&(n="margin"),` + .`.concat(m9,` { + overflow: hidden `).concat(r,`; + padding-right: `).concat(u,"px ").concat(r,`; + } + body { + overflow: hidden `).concat(r,`; + overscroll-behavior: contain; + `).concat([t&&"position: relative ".concat(r,";"),n==="margin"&&` + padding-left: `.concat(o,`px; + padding-top: `).concat(s,`px; + padding-right: `).concat(a,`px; + margin-left:0; + margin-top:0; + margin-right: `).concat(u,"px ").concat(r,`; + `),n==="padding"&&"padding-right: ".concat(u,"px ").concat(r,";")].filter(Boolean).join(""),` + } + + .`).concat(Of,` { + right: `).concat(u,"px ").concat(r,`; + } + + .`).concat(Rf,` { + margin-right: `).concat(u,"px ").concat(r,`; + } + + .`).concat(Of," .").concat(Of,` { + right: 0 `).concat(r,`; + } + + .`).concat(Rf," .").concat(Rf,` { + margin-right: 0 `).concat(r,`; + } + + body { + `).concat(g9,": ").concat(u,`px; + } +`)},E9=function(e){var t=e.noRelative,n=e.noImportant,r=e.gapMode,o=r===void 0?"margin":r,s=p.useMemo(function(){return k9(o)},[o]);return p.createElement(_9,{styles:j9(s,!t,o,n?"":"!important")})},Dv=!1;if(typeof window<"u")try{var Wd=Object.defineProperty({},"passive",{get:function(){return Dv=!0,!0}});window.addEventListener("test",Wd,Wd),window.removeEventListener("test",Wd,Wd)}catch{Dv=!1}var xl=Dv?{passive:!1}:!1,I9=function(e){return e.tagName==="TEXTAREA"},M6=function(e,t){var n=window.getComputedStyle(e);return n[t]!=="hidden"&&!(n.overflowY===n.overflowX&&!I9(e)&&n[t]==="visible")},O9=function(e){return M6(e,"overflowY")},R9=function(e){return M6(e,"overflowX")},R2=function(e,t){var n=t.ownerDocument,r=t;do{typeof ShadowRoot<"u"&&r instanceof ShadowRoot&&(r=r.host);var o=T6(e,r);if(o){var s=D6(e,r),a=s[1],u=s[2];if(a>u)return!0}r=r.parentNode}while(r&&r!==n.body);return!1},M9=function(e){var t=e.scrollTop,n=e.scrollHeight,r=e.clientHeight;return[t,n,r]},T9=function(e){var t=e.scrollLeft,n=e.scrollWidth,r=e.clientWidth;return[t,n,r]},T6=function(e,t){return e==="v"?O9(t):R9(t)},D6=function(e,t){return e==="v"?M9(t):T9(t)},D9=function(e,t){return e==="h"&&t==="rtl"?-1:1},A9=function(e,t,n,r,o){var s=D9(e,window.getComputedStyle(t).direction),a=s*r,u=n.target,d=t.contains(u),f=!1,h=a>0,m=0,v=0;do{var b=D6(e,u),w=b[0],C=b[1],S=b[2],P=C-S-s*w;(w||P)&&T6(e,u)&&(m+=P,v+=w),u=u.parentNode}while(!d&&u!==document.body||d&&(t.contains(u)||t===u));return(h&&(o&&m===0||!o&&a>m)||!h&&(o&&v===0||!o&&-a>v))&&(f=!0),f},Vd=function(e){return"changedTouches"in e?[e.changedTouches[0].clientX,e.changedTouches[0].clientY]:[0,0]},M2=function(e){return[e.deltaX,e.deltaY]},T2=function(e){return e&&"current"in e?e.current:e},N9=function(e,t){return e[0]===t[0]&&e[1]===t[1]},z9=function(e){return` + .block-interactivity-`.concat(e,` {pointer-events: none;} + .allow-interactivity-`).concat(e,` {pointer-events: all;} +`)},$9=0,Sl=[];function L9(e){var t=p.useRef([]),n=p.useRef([0,0]),r=p.useRef(),o=p.useState($9++)[0],s=p.useState(R6)[0],a=p.useRef(e);p.useEffect(function(){a.current=e},[e]),p.useEffect(function(){if(e.inert){document.body.classList.add("block-interactivity-".concat(o));var C=jv([e.lockRef.current],(e.shards||[]).map(T2),!0).filter(Boolean);return C.forEach(function(S){return S.classList.add("allow-interactivity-".concat(o))}),function(){document.body.classList.remove("block-interactivity-".concat(o)),C.forEach(function(S){return S.classList.remove("allow-interactivity-".concat(o))})}}},[e.inert,e.lockRef.current,e.shards]);var u=p.useCallback(function(C,S){if("touches"in C&&C.touches.length===2)return!a.current.allowPinchZoom;var P=Vd(C),k=n.current,j="deltaX"in C?C.deltaX:k[0]-P[0],E="deltaY"in C?C.deltaY:k[1]-P[1],I,O=C.target,R=Math.abs(j)>Math.abs(E)?"h":"v";if("touches"in C&&R==="h"&&O.type==="range")return!1;var M=R2(R,O);if(!M)return!0;if(M?I=R:(I=R==="v"?"h":"v",M=R2(R,O)),!M)return!1;if(!r.current&&"changedTouches"in C&&(j||E)&&(r.current=I),!I)return!0;var A=r.current||I;return A9(A,S,C,A==="h"?j:E,!0)},[]),d=p.useCallback(function(C){var S=C;if(!(!Sl.length||Sl[Sl.length-1]!==s)){var P="deltaY"in S?M2(S):Vd(S),k=t.current.filter(function(I){return I.name===S.type&&I.target===S.target&&N9(I.delta,P)})[0];if(k&&k.should){S.cancelable&&S.preventDefault();return}if(!k){var j=(a.current.shards||[]).map(T2).filter(Boolean).filter(function(I){return I.contains(S.target)}),E=j.length>0?u(S,j[0]):!a.current.noIsolation;E&&S.cancelable&&S.preventDefault()}}},[]),f=p.useCallback(function(C,S,P,k){var j={name:C,delta:S,target:P,should:k};t.current.push(j),setTimeout(function(){t.current=t.current.filter(function(E){return E!==j})},1)},[]),h=p.useCallback(function(C){n.current=Vd(C),r.current=void 0},[]),m=p.useCallback(function(C){f(C.type,M2(C),C.target,u(C,e.lockRef.current))},[]),v=p.useCallback(function(C){f(C.type,Vd(C),C.target,u(C,e.lockRef.current))},[]);p.useEffect(function(){return Sl.push(s),e.setCallbacks({onScrollCapture:m,onWheelCapture:m,onTouchMoveCapture:v}),document.addEventListener("wheel",d,xl),document.addEventListener("touchmove",d,xl),document.addEventListener("touchstart",h,xl),function(){Sl=Sl.filter(function(C){return C!==s}),document.removeEventListener("wheel",d,xl),document.removeEventListener("touchmove",d,xl),document.removeEventListener("touchstart",h,xl)}},[]);var b=e.removeScrollBar,w=e.inert;return p.createElement(p.Fragment,null,w?p.createElement(s,{styles:z9(o)}):null,b?p.createElement(E9,{gapMode:e.gapMode}):null)}const F9=uT(O6,L9);var A6=p.forwardRef(function(e,t){return p.createElement(yh,Bs({},e,{ref:t,sideCar:F9}))});A6.classNames=yh.classNames;const B9=A6;function H9(e){const{autoFocus:t,trapFocus:n,dialogRef:r,initialFocusRef:o,blockScrollOnMount:s,allowPinchZoom:a,finalFocusRef:u,returnFocusOnClose:d,preserveScrollBarGap:f,lockFocusAcrossFrames:h,isOpen:m}=Wi(),[v,b]=fO();p.useEffect(()=>{!v&&b&&setTimeout(b)},[v,b]);const w=E6(r,m);return i.jsx(p6,{autoFocus:t,isDisabled:!n,initialFocusRef:o,finalFocusRef:u,restoreFocus:d,contentRef:r,lockFocusAcrossFrames:h,children:i.jsx(B9,{removeScrollBar:!f,allowPinchZoom:a,enabled:w===1&&s,forwardProps:!0,children:e.children})})}var Su=nt((e,t)=>{const{className:n,children:r,containerProps:o,motionProps:s,...a}=e,{getDialogProps:u,getDialogContainerProps:d}=Wi(),f=u(a,t),h=d(o),m=Ot("chakra-modal__content",n),v=vc(),b={display:"flex",flexDirection:"column",position:"relative",width:"100%",outline:0,...v.dialog},w={display:"flex",width:"100vw",height:"$100vh",position:"fixed",left:0,top:0,...v.dialogContainer},{motionPreset:C}=Wi();return i.jsx(H9,{children:i.jsx(Be.div,{...h,className:"chakra-modal__content-container",tabIndex:-1,__css:w,children:i.jsx(j6,{preset:C,motionProps:s,className:m,...f,__css:b,children:r})})})});Su.displayName="ModalContent";function bh(e){const{leastDestructiveRef:t,...n}=e;return i.jsx(xu,{...n,initialFocusRef:t})}var xh=nt((e,t)=>i.jsx(Su,{ref:t,role:"alertdialog",...e})),ei=nt((e,t)=>{const{className:n,...r}=e,o=Ot("chakra-modal__footer",n),a={display:"flex",alignItems:"center",justifyContent:"flex-end",...vc().footer};return i.jsx(Be.footer,{ref:t,...r,__css:a,className:o})});ei.displayName="ModalFooter";var ti=nt((e,t)=>{const{className:n,...r}=e,{headerId:o,setHeaderMounted:s}=Wi();p.useEffect(()=>(s(!0),()=>s(!1)),[s]);const a=Ot("chakra-modal__header",n),d={flex:0,...vc().header};return i.jsx(Be.header,{ref:t,className:a,id:o,...r,__css:d})});ti.displayName="ModalHeader";var W9=Be(bo.div),ni=nt((e,t)=>{const{className:n,transition:r,motionProps:o,...s}=e,a=Ot("chakra-modal__overlay",n),d={pos:"fixed",left:"0",top:"0",w:"100vw",h:"100vh",...vc().overlay},{motionPreset:f}=Wi(),m=o||(f==="none"?{}:h5);return i.jsx(W9,{...m,__css:d,ref:t,className:a,...s})});ni.displayName="ModalOverlay";var ri=nt((e,t)=>{const{className:n,...r}=e,{bodyId:o,setBodyMounted:s}=Wi();p.useEffect(()=>(s(!0),()=>s(!1)),[s]);const a=Ot("chakra-modal__body",n),u=vc();return i.jsx(Be.div,{ref:t,className:a,id:o,...r,__css:u.body})});ri.displayName="ModalBody";var u1=nt((e,t)=>{const{onClick:n,className:r,...o}=e,{onClose:s}=Wi(),a=Ot("chakra-modal__close-btn",r),u=vc();return i.jsx(pO,{ref:t,__css:u.closeButton,className:a,onClick:bt(n,d=>{d.stopPropagation(),s()}),...o})});u1.displayName="ModalCloseButton";var[V9,Uu]=ur({name:"PopoverContext",errorMessage:"usePopoverContext: `context` is undefined. Seems you forgot to wrap all popover components within ``"}),[U9,d1]=ur({name:"PopoverStylesContext",errorMessage:`usePopoverStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `});function f1(e){const t=p.Children.only(e.children),{getTriggerProps:n}=Uu();return p.cloneElement(t,n(t.props,t.ref))}f1.displayName="PopoverTrigger";var wl={click:"click",hover:"hover"};function G9(e={}){const{closeOnBlur:t=!0,closeOnEsc:n=!0,initialFocusRef:r,id:o,returnFocusOnClose:s=!0,autoFocus:a=!0,arrowSize:u,arrowShadowColor:d,trigger:f=wl.click,openDelay:h=200,closeDelay:m=200,isLazy:v,lazyBehavior:b="unmount",computePositionOnMount:w,...C}=e,{isOpen:S,onClose:P,onOpen:k,onToggle:j}=o3(e),E=p.useRef(null),I=p.useRef(null),O=p.useRef(null),R=p.useRef(!1),M=p.useRef(!1);S&&(M.current=!0);const[A,L]=p.useState(!1),[D,V]=p.useState(!1),$=p.useId(),F=o??$,[U,X,N,G]=["popover-trigger","popover-content","popover-header","popover-body"].map(Oe=>`${Oe}-${F}`),{referenceRef:W,getArrowProps:q,getPopperProps:ne,getArrowInnerProps:ve,forceUpdate:le}=s3({...C,enabled:S||!!w}),oe=S6({isOpen:S,ref:O});E5({enabled:S,ref:I}),b6(O,{focusRef:I,visible:S,shouldFocus:s&&f===wl.click}),OD(O,{focusRef:r,visible:S,shouldFocus:a&&f===wl.click});const Y=i1({wasSelected:M.current,enabled:v,mode:b,isSelected:oe.present}),ae=p.useCallback((Oe={},at=null)=>{const Fe={...Oe,style:{...Oe.style,transformOrigin:ag.transformOrigin.varRef,[ag.arrowSize.var]:u?`${u}px`:void 0,[ag.arrowShadowColor.var]:d},ref:Un(O,at),children:Y?Oe.children:null,id:X,tabIndex:-1,role:"dialog",onKeyDown:bt(Oe.onKeyDown,Ye=>{n&&Ye.key==="Escape"&&P()}),onBlur:bt(Oe.onBlur,Ye=>{const _t=D2(Ye),xt=kg(O.current,_t),Fn=kg(I.current,_t);S&&t&&(!xt&&!Fn)&&P()}),"aria-labelledby":A?N:void 0,"aria-describedby":D?G:void 0};return f===wl.hover&&(Fe.role="tooltip",Fe.onMouseEnter=bt(Oe.onMouseEnter,()=>{R.current=!0}),Fe.onMouseLeave=bt(Oe.onMouseLeave,Ye=>{Ye.nativeEvent.relatedTarget!==null&&(R.current=!1,setTimeout(()=>P(),m))})),Fe},[Y,X,A,N,D,G,f,n,P,S,t,m,d,u]),de=p.useCallback((Oe={},at=null)=>ne({...Oe,style:{visibility:S?"visible":"hidden",...Oe.style}},at),[S,ne]),xe=p.useCallback((Oe,at=null)=>({...Oe,ref:Un(at,E,W)}),[E,W]),se=p.useRef(),ge=p.useRef(),fe=p.useCallback(Oe=>{E.current==null&&W(Oe)},[W]),ke=p.useCallback((Oe={},at=null)=>{const Fe={...Oe,ref:Un(I,at,fe),id:U,"aria-haspopup":"dialog","aria-expanded":S,"aria-controls":X};return f===wl.click&&(Fe.onClick=bt(Oe.onClick,j)),f===wl.hover&&(Fe.onFocus=bt(Oe.onFocus,()=>{se.current===void 0&&k()}),Fe.onBlur=bt(Oe.onBlur,Ye=>{const _t=D2(Ye),xt=!kg(O.current,_t);S&&t&&xt&&P()}),Fe.onKeyDown=bt(Oe.onKeyDown,Ye=>{Ye.key==="Escape"&&P()}),Fe.onMouseEnter=bt(Oe.onMouseEnter,()=>{R.current=!0,se.current=window.setTimeout(()=>k(),h)}),Fe.onMouseLeave=bt(Oe.onMouseLeave,()=>{R.current=!1,se.current&&(clearTimeout(se.current),se.current=void 0),ge.current=window.setTimeout(()=>{R.current===!1&&P()},m)})),Fe},[U,S,X,f,fe,j,k,t,P,h,m]);p.useEffect(()=>()=>{se.current&&clearTimeout(se.current),ge.current&&clearTimeout(ge.current)},[]);const Ae=p.useCallback((Oe={},at=null)=>({...Oe,id:N,ref:Un(at,Fe=>{L(!!Fe)})}),[N]),ye=p.useCallback((Oe={},at=null)=>({...Oe,id:G,ref:Un(at,Fe=>{V(!!Fe)})}),[G]);return{forceUpdate:le,isOpen:S,onAnimationComplete:oe.onComplete,onClose:P,getAnchorProps:xe,getArrowProps:q,getArrowInnerProps:ve,getPopoverPositionerProps:de,getPopoverProps:ae,getTriggerProps:ke,getHeaderProps:Ae,getBodyProps:ye}}function kg(e,t){return e===t||(e==null?void 0:e.contains(t))}function D2(e){var t;const n=e.currentTarget.ownerDocument.activeElement;return(t=e.relatedTarget)!=null?t:n}function p1(e){const t=Xr("Popover",e),{children:n,...r}=xr(e),o=ah(),s=G9({...r,direction:o.direction});return i.jsx(V9,{value:s,children:i.jsx(U9,{value:t,children:T0(n,{isOpen:s.isOpen,onClose:s.onClose,forceUpdate:s.forceUpdate})})})}p1.displayName="Popover";var _g=(e,t)=>t?`${e}.${t}, ${t}`:void 0;function N6(e){var t;const{bg:n,bgColor:r,backgroundColor:o,shadow:s,boxShadow:a,shadowColor:u}=e,{getArrowProps:d,getArrowInnerProps:f}=Uu(),h=d1(),m=(t=n??r)!=null?t:o,v=s??a;return i.jsx(Be.div,{...d(),className:"chakra-popover__arrow-positioner",children:i.jsx(Be.div,{className:Ot("chakra-popover__arrow",e.className),...f(e),__css:{"--popper-arrow-shadow-color":_g("colors",u),"--popper-arrow-bg":_g("colors",m),"--popper-arrow-shadow":_g("shadows",v),...h.arrow}})})}N6.displayName="PopoverArrow";var z6=nt(function(t,n){const{getBodyProps:r}=Uu(),o=d1();return i.jsx(Be.div,{...r(t,n),className:Ot("chakra-popover__body",t.className),__css:o.body})});z6.displayName="PopoverBody";function q9(e){if(e)return{enter:{...e.enter,visibility:"visible"},exit:{...e.exit,transitionEnd:{visibility:"hidden"}}}}var K9={exit:{opacity:0,scale:.95,transition:{duration:.1,ease:[.4,0,1,1]}},enter:{scale:1,opacity:1,transition:{duration:.15,ease:[0,0,.2,1]}}},Y9=Be(bo.section),$6=nt(function(t,n){const{variants:r=K9,...o}=t,{isOpen:s}=Uu();return i.jsx(Y9,{ref:n,variants:q9(r),initial:!1,animate:s?"enter":"exit",...o})});$6.displayName="PopoverTransition";var h1=nt(function(t,n){const{rootProps:r,motionProps:o,...s}=t,{getPopoverProps:a,getPopoverPositionerProps:u,onAnimationComplete:d}=Uu(),f=d1(),h={position:"relative",display:"flex",flexDirection:"column",...f.content};return i.jsx(Be.div,{...u(r),__css:f.popper,className:"chakra-popover__popper",children:i.jsx($6,{...o,...a(s,n),onAnimationComplete:oh(d,s.onAnimationComplete),className:Ot("chakra-popover__content",t.className),__css:h})})});h1.displayName="PopoverContent";function X9(e,t,n){return(e-t)*100/(n-t)}xa({"0%":{strokeDasharray:"1, 400",strokeDashoffset:"0"},"50%":{strokeDasharray:"400, 400",strokeDashoffset:"-100"},"100%":{strokeDasharray:"400, 400",strokeDashoffset:"-260"}});xa({"0%":{transform:"rotate(0deg)"},"100%":{transform:"rotate(360deg)"}});var Q9=xa({"0%":{left:"-40%"},"100%":{left:"100%"}}),Z9=xa({from:{backgroundPosition:"1rem 0"},to:{backgroundPosition:"0 0"}});function J9(e){const{value:t=0,min:n,max:r,valueText:o,getValueText:s,isIndeterminate:a,role:u="progressbar"}=e,d=X9(t,n,r);return{bind:{"data-indeterminate":a?"":void 0,"aria-valuemax":r,"aria-valuemin":n,"aria-valuenow":a?void 0:t,"aria-valuetext":(()=>{if(t!=null)return typeof s=="function"?s(t,d):o})(),role:u},percent:d,value:t}}var[eA,tA]=ur({name:"ProgressStylesContext",errorMessage:`useProgressStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),nA=nt((e,t)=>{const{min:n,max:r,value:o,isIndeterminate:s,role:a,...u}=e,d=J9({value:o,min:n,max:r,isIndeterminate:s,role:a}),h={height:"100%",...tA().filledTrack};return i.jsx(Be.div,{ref:t,style:{width:`${d.percent}%`,...u.style},...d.bind,...u,__css:h})}),L6=nt((e,t)=>{var n;const{value:r,min:o=0,max:s=100,hasStripe:a,isAnimated:u,children:d,borderRadius:f,isIndeterminate:h,"aria-label":m,"aria-labelledby":v,"aria-valuetext":b,title:w,role:C,...S}=xr(e),P=Xr("Progress",e),k=f??((n=P.track)==null?void 0:n.borderRadius),j={animation:`${Z9} 1s linear infinite`},O={...!h&&a&&u&&j,...h&&{position:"absolute",willChange:"left",minWidth:"50%",animation:`${Q9} 1s ease infinite normal none running`}},R={overflow:"hidden",position:"relative",...P.track};return i.jsx(Be.div,{ref:t,borderRadius:k,__css:R,...S,children:i.jsxs(eA,{value:P,children:[i.jsx(nA,{"aria-label":m,"aria-labelledby":v,"aria-valuetext":b,min:o,max:s,value:r,isIndeterminate:h,css:O,borderRadius:k,title:w,role:C}),d]})})});L6.displayName="Progress";function rA(e){return e&&yx(e)&&yx(e.target)}function oA(e={}){const{onChange:t,value:n,defaultValue:r,name:o,isDisabled:s,isFocusable:a,isNative:u,...d}=e,[f,h]=p.useState(r||""),m=typeof n<"u",v=m?n:f,b=p.useRef(null),w=p.useCallback(()=>{const I=b.current;if(!I)return;let O="input:not(:disabled):checked";const R=I.querySelector(O);if(R){R.focus();return}O="input:not(:disabled)";const M=I.querySelector(O);M==null||M.focus()},[]),S=`radio-${p.useId()}`,P=o||S,k=p.useCallback(I=>{const O=rA(I)?I.target.value:I;m||h(O),t==null||t(String(O))},[t,m]),j=p.useCallback((I={},O=null)=>({...I,ref:Un(O,b),role:"radiogroup"}),[]),E=p.useCallback((I={},O=null)=>({...I,ref:O,name:P,[u?"checked":"isChecked"]:v!=null?I.value===v:void 0,onChange(M){k(M)},"data-radiogroup":!0}),[u,P,k,v]);return{getRootProps:j,getRadioProps:E,name:P,ref:b,focus:w,setValue:h,value:v,onChange:k,isDisabled:s,isFocusable:a,htmlProps:d}}var[sA,F6]=ur({name:"RadioGroupContext",strict:!1}),wu=nt((e,t)=>{const{colorScheme:n,size:r,variant:o,children:s,className:a,isDisabled:u,isFocusable:d,...f}=e,{value:h,onChange:m,getRootProps:v,name:b,htmlProps:w}=oA(f),C=p.useMemo(()=>({name:b,size:r,onChange:m,colorScheme:n,value:h,variant:o,isDisabled:u,isFocusable:d}),[b,r,m,n,h,o,u,d]);return i.jsx(sA,{value:C,children:i.jsx(Be.div,{...v(w,t),className:Ot("chakra-radio-group",a),children:s})})});wu.displayName="RadioGroup";var aA={border:"0",clip:"rect(0, 0, 0, 0)",height:"1px",width:"1px",margin:"-1px",padding:"0",overflow:"hidden",whiteSpace:"nowrap",position:"absolute"};function iA(e={}){const{defaultChecked:t,isChecked:n,isFocusable:r,isDisabled:o,isReadOnly:s,isRequired:a,onChange:u,isInvalid:d,name:f,value:h,id:m,"data-radiogroup":v,"aria-describedby":b,...w}=e,C=`radio-${p.useId()}`,S=R0(),k=!!F6()||!!v;let E=!!S&&!k?S.id:C;E=m??E;const I=o??(S==null?void 0:S.isDisabled),O=s??(S==null?void 0:S.isReadOnly),R=a??(S==null?void 0:S.isRequired),M=d??(S==null?void 0:S.isInvalid),[A,L]=p.useState(!1),[D,V]=p.useState(!1),[$,F]=p.useState(!1),[U,X]=p.useState(!1),[N,G]=p.useState(!!t),W=typeof n<"u",q=W?n:N;p.useEffect(()=>b5(L),[]);const ne=p.useCallback(fe=>{if(O||I){fe.preventDefault();return}W||G(fe.target.checked),u==null||u(fe)},[W,I,O,u]),ve=p.useCallback(fe=>{fe.key===" "&&X(!0)},[X]),le=p.useCallback(fe=>{fe.key===" "&&X(!1)},[X]),oe=p.useCallback((fe={},ke=null)=>({...fe,ref:ke,"data-active":on(U),"data-hover":on($),"data-disabled":on(I),"data-invalid":on(M),"data-checked":on(q),"data-focus":on(D),"data-focus-visible":on(D&&A),"data-readonly":on(O),"aria-hidden":!0,onMouseDown:bt(fe.onMouseDown,()=>X(!0)),onMouseUp:bt(fe.onMouseUp,()=>X(!1)),onMouseEnter:bt(fe.onMouseEnter,()=>F(!0)),onMouseLeave:bt(fe.onMouseLeave,()=>F(!1))}),[U,$,I,M,q,D,O,A]),{onFocus:Y,onBlur:ae}=S??{},de=p.useCallback((fe={},ke=null)=>{const Ae=I&&!r;return{...fe,id:E,ref:ke,type:"radio",name:f,value:h,onChange:bt(fe.onChange,ne),onBlur:bt(ae,fe.onBlur,()=>V(!1)),onFocus:bt(Y,fe.onFocus,()=>V(!0)),onKeyDown:bt(fe.onKeyDown,ve),onKeyUp:bt(fe.onKeyUp,le),checked:q,disabled:Ae,readOnly:O,required:R,"aria-invalid":Al(M),"aria-disabled":Al(Ae),"aria-required":Al(R),"data-readonly":on(O),"aria-describedby":b,style:aA}},[I,r,E,f,h,ne,ae,Y,ve,le,q,O,R,M,b]);return{state:{isInvalid:M,isFocused:D,isChecked:q,isActive:U,isHovered:$,isDisabled:I,isReadOnly:O,isRequired:R},getCheckboxProps:oe,getRadioProps:oe,getInputProps:de,getLabelProps:(fe={},ke=null)=>({...fe,ref:ke,onMouseDown:bt(fe.onMouseDown,lA),"data-disabled":on(I),"data-checked":on(q),"data-invalid":on(M)}),getRootProps:(fe,ke=null)=>({...fe,ref:ke,"data-disabled":on(I),"data-checked":on(q),"data-invalid":on(M)}),htmlProps:w}}function lA(e){e.preventDefault(),e.stopPropagation()}function cA(e,t){const n={},r={};for(const[o,s]of Object.entries(e))t.includes(o)?n[o]=s:r[o]=s;return[n,r]}var oo=nt((e,t)=>{var n;const r=F6(),{onChange:o,value:s}=e,a=Xr("Radio",{...r,...e}),u=xr(e),{spacing:d="0.5rem",children:f,isDisabled:h=r==null?void 0:r.isDisabled,isFocusable:m=r==null?void 0:r.isFocusable,inputProps:v,...b}=u;let w=e.isChecked;(r==null?void 0:r.value)!=null&&s!=null&&(w=r.value===s);let C=o;r!=null&&r.onChange&&s!=null&&(C=oh(r.onChange,o));const S=(n=e==null?void 0:e.name)!=null?n:r==null?void 0:r.name,{getInputProps:P,getCheckboxProps:k,getLabelProps:j,getRootProps:E,htmlProps:I}=iA({...b,isChecked:w,isFocusable:m,isDisabled:h,onChange:C,name:S}),[O,R]=cA(I,a3),M=k(R),A=P(v,t),L=j(),D=Object.assign({},O,E()),V={display:"inline-flex",alignItems:"center",verticalAlign:"top",cursor:"pointer",position:"relative",...a.container},$={display:"inline-flex",alignItems:"center",justifyContent:"center",flexShrink:0,...a.control},F={userSelect:"none",marginStart:d,...a.label};return i.jsxs(Be.label,{className:"chakra-radio",...D,__css:V,children:[i.jsx("input",{className:"chakra-radio__input",...A}),i.jsx(Be.span,{className:"chakra-radio__control",...M,__css:$}),f&&i.jsx(Be.span,{className:"chakra-radio__label",...L,__css:F,children:f})]})});oo.displayName="Radio";var B6=nt(function(t,n){const{children:r,placeholder:o,className:s,...a}=t;return i.jsxs(Be.select,{...a,ref:n,className:Ot("chakra-select",s),children:[o&&i.jsx("option",{value:"",children:o}),r]})});B6.displayName="SelectField";function uA(e,t){const n={},r={};for(const[o,s]of Object.entries(e))t.includes(o)?n[o]=s:r[o]=s;return[n,r]}var m1=nt((e,t)=>{var n;const r=Xr("Select",e),{rootProps:o,placeholder:s,icon:a,color:u,height:d,h:f,minH:h,minHeight:m,iconColor:v,iconSize:b,...w}=xr(e),[C,S]=uA(w,a3),P=D0(S),k={width:"100%",height:"fit-content",position:"relative",color:u},j={paddingEnd:"2rem",...r.field,_focus:{zIndex:"unset",...(n=r.field)==null?void 0:n._focus}};return i.jsxs(Be.div,{className:"chakra-select__wrapper",__css:k,...C,...o,children:[i.jsx(B6,{ref:t,height:f??d,minH:h??m,placeholder:s,...P,__css:j,children:e.children}),i.jsx(H6,{"data-disabled":on(P.disabled),...(v||u)&&{color:v||u},__css:r.icon,...b&&{fontSize:b},children:a})]})});m1.displayName="Select";var dA=e=>i.jsx("svg",{viewBox:"0 0 24 24",...e,children:i.jsx("path",{fill:"currentColor",d:"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"})}),fA=Be("div",{baseStyle:{position:"absolute",display:"inline-flex",alignItems:"center",justifyContent:"center",pointerEvents:"none",top:"50%",transform:"translateY(-50%)"}}),H6=e=>{const{children:t=i.jsx(dA,{}),...n}=e,r=p.cloneElement(t,{role:"presentation",className:"chakra-select__icon",focusable:!1,"aria-hidden":!0,style:{width:"1em",height:"1em",color:"currentColor"}});return i.jsx(fA,{...n,className:"chakra-select__icon-wrapper",children:p.isValidElement(t)?r:null})};H6.displayName="SelectIcon";function pA(){const e=p.useRef(!0);return p.useEffect(()=>{e.current=!1},[]),e.current}function hA(e){const t=p.useRef();return p.useEffect(()=>{t.current=e},[e]),t.current}var mA=Be("div",{baseStyle:{boxShadow:"none",backgroundClip:"padding-box",cursor:"default",color:"transparent",pointerEvents:"none",userSelect:"none","&::before, &::after, *":{visibility:"hidden"}}}),Av=i3("skeleton-start-color"),Nv=i3("skeleton-end-color"),gA=xa({from:{opacity:0},to:{opacity:1}}),vA=xa({from:{borderColor:Av.reference,background:Av.reference},to:{borderColor:Nv.reference,background:Nv.reference}}),g1=nt((e,t)=>{const n={...e,fadeDuration:typeof e.fadeDuration=="number"?e.fadeDuration:.4,speed:typeof e.speed=="number"?e.speed:.8},r=fc("Skeleton",n),o=pA(),{startColor:s="",endColor:a="",isLoaded:u,fadeDuration:d,speed:f,className:h,fitContent:m,...v}=xr(n),[b,w]=Ji("colors",[s,a]),C=hA(u),S=Ot("chakra-skeleton",h),P={...b&&{[Av.variable]:b},...w&&{[Nv.variable]:w}};if(u){const k=o||C?"none":`${gA} ${d}s`;return i.jsx(Be.div,{ref:t,className:S,__css:{animation:k},...v})}return i.jsx(mA,{ref:t,className:S,...v,__css:{width:m?"fit-content":void 0,...r,...P,_dark:{...r._dark,...P},animation:`${f}s linear infinite alternate ${vA}`}})});g1.displayName="Skeleton";function yA(e){const{min:t=0,max:n=100,onChange:r,value:o,defaultValue:s,isReversed:a,direction:u="ltr",orientation:d="horizontal",id:f,isDisabled:h,isReadOnly:m,onChangeStart:v,onChangeEnd:b,step:w=1,getAriaValueText:C,"aria-valuetext":S,"aria-label":P,"aria-labelledby":k,name:j,focusThumbOnChange:E=!0,minStepsBetweenThumbs:I=0,...O}=e,R=qa(v),M=qa(b),A=qa(C),L=xO({isReversed:a,direction:u,orientation:d}),[D,V]=Ru({value:o,defaultValue:s??[25,75],onChange:r});if(!Array.isArray(D))throw new TypeError(`[range-slider] You passed an invalid value for \`value\` or \`defaultValue\`, expected \`Array\` but got \`${typeof D}\``);const[$,F]=p.useState(!1),[U,X]=p.useState(!1),[N,G]=p.useState(-1),W=!(h||m),q=p.useRef(D),ne=D.map(Re=>bx(Re,t,n)),ve=I*w,le=bA(ne,t,n,ve),oe=p.useRef({eventSource:null,value:[],valueBounds:[]});oe.current.value=ne,oe.current.valueBounds=le;const Y=ne.map(Re=>n-Re+t),de=(L?Y:ne).map(Re=>xx(Re,t,n)),xe=d==="vertical",se=p.useRef(null),ge=p.useRef(null),fe=hO({getNodes(){const Re=ge.current,et=Re==null?void 0:Re.querySelectorAll("[role=slider]");return et?Array.from(et):[]}}),ke=p.useId(),ye=SO(f??ke),Oe=p.useCallback(Re=>{var et,it;if(!se.current)return;oe.current.eventSource="pointer";const ut=se.current.getBoundingClientRect(),{clientX:Nt,clientY:yr}=(it=(et=Re.touches)==null?void 0:et[0])!=null?it:Re,cn=xe?ut.bottom-yr:Nt-ut.left,xn=xe?ut.height:ut.width;let wr=cn/xn;return L&&(wr=1-wr),mO(wr,t,n)},[xe,L,n,t]),at=(n-t)/10,Fe=w||(n-t)/100,Ye=p.useMemo(()=>({setValueAtIndex(Re,et){if(!W)return;const it=oe.current.valueBounds[Re];et=parseFloat(gO(et,it.min,Fe)),et=bx(et,it.min,it.max);const ut=[...oe.current.value];ut[Re]=et,V(ut)},setActiveIndex:G,stepUp(Re,et=Fe){const it=oe.current.value[Re],ut=L?it-et:it+et;Ye.setValueAtIndex(Re,ut)},stepDown(Re,et=Fe){const it=oe.current.value[Re],ut=L?it+et:it-et;Ye.setValueAtIndex(Re,ut)},reset(){V(q.current)}}),[Fe,L,V,W]),_t=p.useCallback(Re=>{const et=Re.key,ut={ArrowRight:()=>Ye.stepUp(N),ArrowUp:()=>Ye.stepUp(N),ArrowLeft:()=>Ye.stepDown(N),ArrowDown:()=>Ye.stepDown(N),PageUp:()=>Ye.stepUp(N,at),PageDown:()=>Ye.stepDown(N,at),Home:()=>{const{min:Nt}=le[N];Ye.setValueAtIndex(N,Nt)},End:()=>{const{max:Nt}=le[N];Ye.setValueAtIndex(N,Nt)}}[et];ut&&(Re.preventDefault(),Re.stopPropagation(),ut(Re),oe.current.eventSource="keyboard")},[Ye,N,at,le]),{getThumbStyle:xt,rootStyle:Fn,trackStyle:Q,innerTrackStyle:we}=p.useMemo(()=>vO({isReversed:L,orientation:d,thumbRects:fe,thumbPercents:de}),[L,d,de,fe]),te=p.useCallback(Re=>{var et;const it=Re??N;if(it!==-1&&E){const ut=ye.getThumb(it),Nt=(et=ge.current)==null?void 0:et.ownerDocument.getElementById(ut);Nt&&setTimeout(()=>Nt.focus())}},[E,N,ye]);Zi(()=>{oe.current.eventSource==="keyboard"&&(M==null||M(oe.current.value))},[ne,M]);const pe=Re=>{const et=Oe(Re)||0,it=oe.current.value.map(xn=>Math.abs(xn-et)),ut=Math.min(...it);let Nt=it.indexOf(ut);const yr=it.filter(xn=>xn===ut);yr.length>1&&et>oe.current.value[Nt]&&(Nt=Nt+yr.length-1),G(Nt),Ye.setValueAtIndex(Nt,et),te(Nt)},Ne=Re=>{if(N==-1)return;const et=Oe(Re)||0;G(N),Ye.setValueAtIndex(N,et),te(N)};yO(ge,{onPanSessionStart(Re){W&&(F(!0),pe(Re),R==null||R(oe.current.value))},onPanSessionEnd(){W&&(F(!1),M==null||M(oe.current.value))},onPan(Re){W&&Ne(Re)}});const Xe=p.useCallback((Re={},et=null)=>({...Re,...O,id:ye.root,ref:Un(et,ge),tabIndex:-1,"aria-disabled":ig(h),"data-focused":ml(U),style:{...Re.style,...Fn}}),[O,h,U,Fn,ye]),yt=p.useCallback((Re={},et=null)=>({...Re,ref:Un(et,se),id:ye.track,"data-disabled":ml(h),style:{...Re.style,...Q}}),[h,Q,ye]),Xt=p.useCallback((Re={},et=null)=>({...Re,ref:et,id:ye.innerTrack,style:{...Re.style,...we}}),[we,ye]),an=p.useCallback((Re,et=null)=>{var it;const{index:ut,...Nt}=Re,yr=ne[ut];if(yr==null)throw new TypeError(`[range-slider > thumb] Cannot find value at index \`${ut}\`. The \`value\` or \`defaultValue\` length is : ${ne.length}`);const cn=le[ut];return{...Nt,ref:et,role:"slider",tabIndex:W?0:void 0,id:ye.getThumb(ut),"data-active":ml($&&N===ut),"aria-valuetext":(it=A==null?void 0:A(yr))!=null?it:S==null?void 0:S[ut],"aria-valuemin":cn.min,"aria-valuemax":cn.max,"aria-valuenow":yr,"aria-orientation":d,"aria-disabled":ig(h),"aria-readonly":ig(m),"aria-label":P==null?void 0:P[ut],"aria-labelledby":P!=null&&P[ut]||k==null?void 0:k[ut],style:{...Re.style,...xt(ut)},onKeyDown:lg(Re.onKeyDown,_t),onFocus:lg(Re.onFocus,()=>{X(!0),G(ut)}),onBlur:lg(Re.onBlur,()=>{X(!1),G(-1)})}},[ye,ne,le,W,$,N,A,S,d,h,m,P,k,xt,_t,X]),Pn=p.useCallback((Re={},et=null)=>({...Re,ref:et,id:ye.output,htmlFor:ne.map((it,ut)=>ye.getThumb(ut)).join(" "),"aria-live":"off"}),[ye,ne]),vr=p.useCallback((Re,et=null)=>{const{value:it,...ut}=Re,Nt=!(itn),yr=it>=ne[0]&&it<=ne[ne.length-1];let cn=xx(it,t,n);cn=L?100-cn:cn;const xn={position:"absolute",pointerEvents:"none",...bO({orientation:d,vertical:{bottom:`${cn}%`},horizontal:{left:`${cn}%`}})};return{...ut,ref:et,id:ye.getMarker(Re.value),role:"presentation","aria-hidden":!0,"data-disabled":ml(h),"data-invalid":ml(!Nt),"data-highlighted":ml(yr),style:{...Re.style,...xn}}},[h,L,n,t,d,ne,ye]),ln=p.useCallback((Re,et=null)=>{const{index:it,...ut}=Re;return{...ut,ref:et,id:ye.getInput(it),type:"hidden",value:ne[it],name:Array.isArray(j)?j[it]:`${j}-${it}`}},[j,ne,ye]);return{state:{value:ne,isFocused:U,isDragging:$,getThumbPercent:Re=>de[Re],getThumbMinValue:Re=>le[Re].min,getThumbMaxValue:Re=>le[Re].max},actions:Ye,getRootProps:Xe,getTrackProps:yt,getInnerTrackProps:Xt,getThumbProps:an,getMarkerProps:vr,getInputProps:ln,getOutputProps:Pn}}function bA(e,t,n,r){return e.map((o,s)=>{const a=s===0?t:e[s-1]+r,u=s===e.length-1?n:e[s+1]-r;return{min:a,max:u}})}var[xA,Sh]=ur({name:"SliderContext",errorMessage:"useSliderContext: `context` is undefined. Seems you forgot to wrap all slider components within "}),[SA,wh]=ur({name:"RangeSliderStylesContext",errorMessage:`useRangeSliderStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),W6=nt(function(t,n){const r={orientation:"horizontal",...t},o=Xr("Slider",r),s=xr(r),{direction:a}=ah();s.direction=a;const{getRootProps:u,...d}=yA(s),f=p.useMemo(()=>({...d,name:r.name}),[d,r.name]);return i.jsx(xA,{value:f,children:i.jsx(SA,{value:o,children:i.jsx(Be.div,{...u({},n),className:"chakra-slider",__css:o.container,children:r.children})})})});W6.displayName="RangeSlider";var zv=nt(function(t,n){const{getThumbProps:r,getInputProps:o,name:s}=Sh(),a=wh(),u=r(t,n);return i.jsxs(Be.div,{...u,className:A0("chakra-slider__thumb",t.className),__css:a.thumb,children:[u.children,s&&i.jsx("input",{...o({index:t.index})})]})});zv.displayName="RangeSliderThumb";var V6=nt(function(t,n){const{getTrackProps:r}=Sh(),o=wh(),s=r(t,n);return i.jsx(Be.div,{...s,className:A0("chakra-slider__track",t.className),__css:o.track,"data-testid":"chakra-range-slider-track"})});V6.displayName="RangeSliderTrack";var U6=nt(function(t,n){const{getInnerTrackProps:r}=Sh(),o=wh(),s=r(t,n);return i.jsx(Be.div,{...s,className:"chakra-slider__filled-track",__css:o.filledTrack})});U6.displayName="RangeSliderFilledTrack";var Mf=nt(function(t,n){const{getMarkerProps:r}=Sh(),o=wh(),s=r(t,n);return i.jsx(Be.div,{...s,className:A0("chakra-slider__marker",t.className),__css:o.mark})});Mf.displayName="RangeSliderMark";var v1=nt(function(t,n){const r=Xr("Switch",t),{spacing:o="0.5rem",children:s,...a}=xr(t),{state:u,getInputProps:d,getCheckboxProps:f,getRootProps:h,getLabelProps:m}=x5(a),v=p.useMemo(()=>({display:"inline-block",position:"relative",verticalAlign:"middle",lineHeight:0,...r.container}),[r.container]),b=p.useMemo(()=>({display:"inline-flex",flexShrink:0,justifyContent:"flex-start",boxSizing:"content-box",cursor:"pointer",...r.track}),[r.track]),w=p.useMemo(()=>({userSelect:"none",marginStart:o,...r.label}),[o,r.label]);return i.jsxs(Be.label,{...h(),className:Ot("chakra-switch",t.className),__css:v,children:[i.jsx("input",{className:"chakra-switch__input",...d({},n)}),i.jsx(Be.span,{...f(),className:"chakra-switch__track",__css:b,children:i.jsx(Be.span,{__css:r.thumb,className:"chakra-switch__thumb","data-checked":on(u.isChecked),"data-hover":on(u.isHovered)})}),s&&i.jsx(Be.span,{className:"chakra-switch__label",...m(),__css:w,children:s})]})});v1.displayName="Switch";var[wA,CA,PA,kA]=G0();function _A(e){var t;const{defaultIndex:n,onChange:r,index:o,isManual:s,isLazy:a,lazyBehavior:u="unmount",orientation:d="horizontal",direction:f="ltr",...h}=e,[m,v]=p.useState(n??0),[b,w]=Ru({defaultValue:n??0,value:o,onChange:r});p.useEffect(()=>{o!=null&&v(o)},[o]);const C=PA(),S=p.useId();return{id:`tabs-${(t=e.id)!=null?t:S}`,selectedIndex:b,focusedIndex:m,setSelectedIndex:w,setFocusedIndex:v,isManual:s,isLazy:a,lazyBehavior:u,orientation:d,descendants:C,direction:f,htmlProps:h}}var[jA,Ch]=ur({name:"TabsContext",errorMessage:"useTabsContext: `context` is undefined. Seems you forgot to wrap all tabs components within "});function EA(e){const{focusedIndex:t,orientation:n,direction:r}=Ch(),o=CA(),s=p.useCallback(a=>{const u=()=>{var k;const j=o.nextEnabled(t);j&&((k=j.node)==null||k.focus())},d=()=>{var k;const j=o.prevEnabled(t);j&&((k=j.node)==null||k.focus())},f=()=>{var k;const j=o.firstEnabled();j&&((k=j.node)==null||k.focus())},h=()=>{var k;const j=o.lastEnabled();j&&((k=j.node)==null||k.focus())},m=n==="horizontal",v=n==="vertical",b=a.key,w=r==="ltr"?"ArrowLeft":"ArrowRight",C=r==="ltr"?"ArrowRight":"ArrowLeft",P={[w]:()=>m&&d(),[C]:()=>m&&u(),ArrowDown:()=>v&&u(),ArrowUp:()=>v&&d(),Home:f,End:h}[b];P&&(a.preventDefault(),P(a))},[o,t,n,r]);return{...e,role:"tablist","aria-orientation":n,onKeyDown:bt(e.onKeyDown,s)}}function IA(e){const{isDisabled:t,isFocusable:n,...r}=e,{setSelectedIndex:o,isManual:s,id:a,setFocusedIndex:u,selectedIndex:d}=Ch(),{index:f,register:h}=kA({disabled:t&&!n}),m=f===d,v=()=>{o(f)},b=()=>{u(f),!s&&!(t&&n)&&o(f)},w=y6({...r,ref:Un(h,e.ref),isDisabled:t,isFocusable:n,onClick:bt(e.onClick,v)}),C="button";return{...w,id:G6(a,f),role:"tab",tabIndex:m?0:-1,type:C,"aria-selected":m,"aria-controls":q6(a,f),onFocus:t?void 0:bt(e.onFocus,b)}}var[OA,RA]=ur({});function MA(e){const t=Ch(),{id:n,selectedIndex:r}=t,s=sh(e.children).map((a,u)=>p.createElement(OA,{key:u,value:{isSelected:u===r,id:q6(n,u),tabId:G6(n,u),selectedIndex:r}},a));return{...e,children:s}}function TA(e){const{children:t,...n}=e,{isLazy:r,lazyBehavior:o}=Ch(),{isSelected:s,id:a,tabId:u}=RA(),d=p.useRef(!1);s&&(d.current=!0);const f=i1({wasSelected:d.current,isSelected:s,enabled:r,mode:o});return{tabIndex:0,...n,children:f?t:null,role:"tabpanel","aria-labelledby":u,hidden:!s,id:a}}function G6(e,t){return`${e}--tab-${t}`}function q6(e,t){return`${e}--tabpanel-${t}`}var[DA,Ph]=ur({name:"TabsStylesContext",errorMessage:`useTabsStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),y1=nt(function(t,n){const r=Xr("Tabs",t),{children:o,className:s,...a}=xr(t),{htmlProps:u,descendants:d,...f}=_A(a),h=p.useMemo(()=>f,[f]),{isFitted:m,...v}=u;return i.jsx(wA,{value:d,children:i.jsx(jA,{value:h,children:i.jsx(DA,{value:r,children:i.jsx(Be.div,{className:Ot("chakra-tabs",s),ref:n,...v,__css:r.root,children:o})})})})});y1.displayName="Tabs";var b1=nt(function(t,n){const r=EA({...t,ref:n}),s={display:"flex",...Ph().tablist};return i.jsx(Be.div,{...r,className:Ot("chakra-tabs__tablist",t.className),__css:s})});b1.displayName="TabList";var x1=nt(function(t,n){const r=TA({...t,ref:n}),o=Ph();return i.jsx(Be.div,{outline:"0",...r,className:Ot("chakra-tabs__tab-panel",t.className),__css:o.tabpanel})});x1.displayName="TabPanel";var S1=nt(function(t,n){const r=MA(t),o=Ph();return i.jsx(Be.div,{...r,width:"100%",ref:n,className:Ot("chakra-tabs__tab-panels",t.className),__css:o.tabpanels})});S1.displayName="TabPanels";var w1=nt(function(t,n){const r=Ph(),o=IA({...t,ref:n}),s={outline:"0",display:"flex",alignItems:"center",justifyContent:"center",...r.tab};return i.jsx(Be.button,{...o,className:Ot("chakra-tabs__tab",t.className),__css:s})});w1.displayName="Tab";function AA(e,t=[]){const n=Object.assign({},e);for(const r of t)r in n&&delete n[r];return n}var NA=["h","minH","height","minHeight"],K6=nt((e,t)=>{const n=fc("Textarea",e),{className:r,rows:o,...s}=xr(e),a=D0(s),u=o?AA(n,NA):n;return i.jsx(Be.textarea,{ref:t,rows:o,...a,className:Ot("chakra-textarea",r),__css:u})});K6.displayName="Textarea";const Y6=({id:e,x:t,y:n,width:r,height:o,style:s,color:a,strokeColor:u,strokeWidth:d,className:f,borderRadius:h,shapeRendering:m,onClick:v})=>{const{background:b,backgroundColor:w}=s||{},C=a||b||w;return i.jsx("rect",{className:ih(["react-flow__minimap-node",f]),x:t,y:n,rx:h,ry:h,width:r,height:o,fill:C,stroke:u,strokeWidth:d,shapeRendering:m,onClick:v?S=>v(S,e):void 0})};Y6.displayName="MiniMapNode";var zA=p.memo(Y6);const $A=e=>e.nodeOrigin,LA=e=>e.getNodes().filter(t=>!t.hidden&&t.width&&t.height),jg=e=>e instanceof Function?e:()=>e;function FA({nodeStrokeColor:e="transparent",nodeColor:t="#e2e2e2",nodeClassName:n="",nodeBorderRadius:r=5,nodeStrokeWidth:o=2,nodeComponent:s=zA,onClick:a}){const u=$f(LA,N0),d=$f($A),f=jg(t),h=jg(e),m=jg(n),v=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";return i.jsx(i.Fragment,{children:u.map(b=>{const{x:w,y:C}=wO(b,d).positionAbsolute;return i.jsx(s,{x:w,y:C,width:b.width,height:b.height,style:b.style,className:m(b),color:f(b),borderRadius:r,strokeColor:h(b),strokeWidth:o,shapeRendering:v,onClick:a,id:b.id},b.id)})})}var BA=p.memo(FA);const HA=200,WA=150,VA=e=>{const t=e.getNodes(),n={x:-e.transform[0]/e.transform[2],y:-e.transform[1]/e.transform[2],width:e.width/e.transform[2],height:e.height/e.transform[2]};return{viewBB:n,boundingRect:t.length>0?_O(jO(t,e.nodeOrigin),n):n,rfId:e.rfId}},UA="react-flow__minimap-desc";function X6({style:e,className:t,nodeStrokeColor:n="transparent",nodeColor:r="#e2e2e2",nodeClassName:o="",nodeBorderRadius:s=5,nodeStrokeWidth:a=2,nodeComponent:u,maskColor:d="rgb(240, 240, 240, 0.6)",maskStrokeColor:f="none",maskStrokeWidth:h=1,position:m="bottom-right",onClick:v,onNodeClick:b,pannable:w=!1,zoomable:C=!1,ariaLabel:S="React Flow mini map",inversePan:P=!1,zoomStep:k=10}){const j=l3(),E=p.useRef(null),{boundingRect:I,viewBB:O,rfId:R}=$f(VA,N0),M=(e==null?void 0:e.width)??HA,A=(e==null?void 0:e.height)??WA,L=I.width/M,D=I.height/A,V=Math.max(L,D),$=V*M,F=V*A,U=5*V,X=I.x-($-I.width)/2-U,N=I.y-(F-I.height)/2-U,G=$+U*2,W=F+U*2,q=`${UA}-${R}`,ne=p.useRef(0);ne.current=V,p.useEffect(()=>{if(E.current){const oe=c3(E.current),Y=xe=>{const{transform:se,d3Selection:ge,d3Zoom:fe}=j.getState();if(xe.sourceEvent.type!=="wheel"||!ge||!fe)return;const ke=-xe.sourceEvent.deltaY*(xe.sourceEvent.deltaMode===1?.05:xe.sourceEvent.deltaMode?1:.002)*k,Ae=se[2]*Math.pow(2,ke);fe.scaleTo(ge,Ae)},ae=xe=>{const{transform:se,d3Selection:ge,d3Zoom:fe,translateExtent:ke,width:Ae,height:ye}=j.getState();if(xe.sourceEvent.type!=="mousemove"||!ge||!fe)return;const Oe=ne.current*Math.max(1,se[2])*(P?-1:1),at={x:se[0]-xe.sourceEvent.movementX*Oe,y:se[1]-xe.sourceEvent.movementY*Oe},Fe=[[0,0],[Ae,ye]],Ye=PO.translate(at.x,at.y).scale(se[2]),_t=fe.constrain()(Ye,Fe,ke);fe.transform(ge,_t)},de=CO().on("zoom",w?ae:null).on("zoom.wheel",C?Y:null);return oe.call(de),()=>{oe.on("zoom",null)}}},[w,C,P,k]);const ve=v?oe=>{const Y=kO(oe);v(oe,{x:Y[0],y:Y[1]})}:void 0,le=b?(oe,Y)=>{const ae=j.getState().nodeInternals.get(Y);b(oe,ae)}:void 0;return i.jsx(Tu,{position:m,style:e,className:ih(["react-flow__minimap",t]),"data-testid":"rf__minimap",children:i.jsxs("svg",{width:M,height:A,viewBox:`${X} ${N} ${G} ${W}`,role:"img","aria-labelledby":q,ref:E,onClick:ve,children:[S&&i.jsx("title",{id:q,children:S}),i.jsx(BA,{onClick:le,nodeColor:r,nodeStrokeColor:n,nodeBorderRadius:s,nodeClassName:o,nodeStrokeWidth:a,nodeComponent:u}),i.jsx("path",{className:"react-flow__minimap-mask",d:`M${X-U},${N-U}h${G+U*2}v${W+U*2}h${-G-U*2}z + M${O.x},${O.y}h${O.width}v${O.height}h${-O.width}z`,fill:d,fillRule:"evenodd",stroke:f,strokeWidth:h,pointerEvents:"none"})]})})}X6.displayName="MiniMap";var GA=p.memo(X6),ys;(function(e){e.Lines="lines",e.Dots="dots",e.Cross="cross"})(ys||(ys={}));function qA({color:e,dimensions:t,lineWidth:n}){return i.jsx("path",{stroke:e,strokeWidth:n,d:`M${t[0]/2} 0 V${t[1]} M0 ${t[1]/2} H${t[0]}`})}function KA({color:e,radius:t}){return i.jsx("circle",{cx:t,cy:t,r:t,fill:e})}const YA={[ys.Dots]:"#91919a",[ys.Lines]:"#eee",[ys.Cross]:"#e2e2e2"},XA={[ys.Dots]:1,[ys.Lines]:1,[ys.Cross]:6},QA=e=>({transform:e.transform,patternId:`pattern-${e.rfId}`});function Q6({id:e,variant:t=ys.Dots,gap:n=20,size:r,lineWidth:o=1,offset:s=2,color:a,style:u,className:d}){const f=p.useRef(null),{transform:h,patternId:m}=$f(QA,N0),v=a||YA[t],b=r||XA[t],w=t===ys.Dots,C=t===ys.Cross,S=Array.isArray(n)?n:[n,n],P=[S[0]*h[2]||1,S[1]*h[2]||1],k=b*h[2],j=C?[k,k]:P,E=w?[k/s,k/s]:[j[0]/s,j[1]/s];return i.jsxs("svg",{className:ih(["react-flow__background",d]),style:{...u,position:"absolute",width:"100%",height:"100%",top:0,left:0},ref:f,"data-testid":"rf__background",children:[i.jsx("pattern",{id:m+e,x:h[0]%P[0],y:h[1]%P[1],width:P[0],height:P[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${E[0]},-${E[1]})`,children:w?i.jsx(KA,{color:v,radius:k/s}):i.jsx(qA,{dimensions:j,color:v,lineWidth:o})}),i.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${m+e})`})]})}Q6.displayName="Background";var ZA=p.memo(Q6),lu;(function(e){e.Line="line",e.Handle="handle"})(lu||(lu={}));function JA({width:e,prevWidth:t,height:n,prevHeight:r,invertX:o,invertY:s}){const a=e-t,u=n-r,d=[a>0?1:a<0?-1:0,u>0?1:u<0?-1:0];return a&&o&&(d[0]=d[0]*-1),u&&s&&(d[1]=d[1]*-1),d}const Z6={width:0,height:0,x:0,y:0},eN={...Z6,pointerX:0,pointerY:0,aspectRatio:1};function tN({nodeId:e,position:t,variant:n=lu.Handle,className:r,style:o={},children:s,color:a,minWidth:u=10,minHeight:d=10,maxWidth:f=Number.MAX_VALUE,maxHeight:h=Number.MAX_VALUE,keepAspectRatio:m=!1,shouldResize:v,onResizeStart:b,onResize:w,onResizeEnd:C}){const S=EO(),P=typeof e=="string"?e:S,k=l3(),j=p.useRef(null),E=p.useRef(eN),I=p.useRef(Z6),O=IO(),R=n===lu.Line?"right":"bottom-right",M=t??R;p.useEffect(()=>{if(!j.current||!P)return;const V=c3(j.current),$=M.includes("right")||M.includes("left"),F=M.includes("bottom")||M.includes("top"),U=M.includes("left"),X=M.includes("top"),N=OO().on("start",G=>{const W=k.getState().nodeInternals.get(P),{xSnapped:q,ySnapped:ne}=O(G);I.current={width:(W==null?void 0:W.width)??0,height:(W==null?void 0:W.height)??0,x:(W==null?void 0:W.position.x)??0,y:(W==null?void 0:W.position.y)??0},E.current={...I.current,pointerX:q,pointerY:ne,aspectRatio:I.current.width/I.current.height},b==null||b(G,{...I.current})}).on("drag",G=>{const{nodeInternals:W,triggerNodeChanges:q}=k.getState(),{xSnapped:ne,ySnapped:ve}=O(G),le=W.get(P);if(le){const oe=[],{pointerX:Y,pointerY:ae,width:de,height:xe,x:se,y:ge,aspectRatio:fe}=E.current,{x:ke,y:Ae,width:ye,height:Oe}=I.current,at=Math.floor($?ne-Y:0),Fe=Math.floor(F?ve-ae:0);let Ye=Sx(de+(U?-at:at),u,f),_t=Sx(xe+(X?-Fe:Fe),d,h);if(m){const pe=Ye/_t,Ne=$&&F,Xe=$&&!F,yt=F&&!$;Ye=pe<=fe&&Ne||yt?_t*fe:Ye,_t=pe>fe&&Ne||Xe?Ye/fe:_t,Ye>=f?(Ye=f,_t=f/fe):Ye<=u&&(Ye=u,_t=u/fe),_t>=h?(_t=h,Ye=h*fe):_t<=d&&(_t=d,Ye=d*fe)}const xt=Ye!==ye,Fn=_t!==Oe;if(U||X){const pe=U?se-(Ye-de):se,Ne=X?ge-(_t-xe):ge,Xe=pe!==ke&&xt,yt=Ne!==Ae&&Fn;if(Xe||yt){const Xt={id:le.id,type:"position",position:{x:Xe?pe:ke,y:yt?Ne:Ae}};oe.push(Xt),I.current.x=Xt.position.x,I.current.y=Xt.position.y}}if(xt||Fn){const pe={id:P,type:"dimensions",updateStyle:!0,resizing:!0,dimensions:{width:Ye,height:_t}};oe.push(pe),I.current.width=Ye,I.current.height=_t}if(oe.length===0)return;const Q=JA({width:I.current.width,prevWidth:ye,height:I.current.height,prevHeight:Oe,invertX:U,invertY:X}),we={...I.current,direction:Q};if((v==null?void 0:v(G,we))===!1)return;w==null||w(G,we),q(oe)}}).on("end",G=>{const W={id:P,type:"dimensions",resizing:!1};C==null||C(G,{...I.current}),k.getState().triggerNodeChanges([W])});return V.call(N),()=>{V.on(".drag",null)}},[P,M,u,d,f,h,m,O,b,w,C]);const A=M.split("-"),L=n===lu.Line?"borderColor":"backgroundColor",D=a?{...o,[L]:a}:o;return i.jsx("div",{className:ih(["react-flow__resize-control","nodrag",...A,n,r]),ref:j,style:D,children:s})}var nN=p.memo(tN);let A2=()=>{};const kh=()=>({setOpenUploaderFunction:p.useCallback(t=>{t&&(A2=t)},[]),openUploader:A2});var rN=new Map([["aac","audio/aac"],["abw","application/x-abiword"],["arc","application/x-freearc"],["avif","image/avif"],["avi","video/x-msvideo"],["azw","application/vnd.amazon.ebook"],["bin","application/octet-stream"],["bmp","image/bmp"],["bz","application/x-bzip"],["bz2","application/x-bzip2"],["cda","application/x-cdf"],["csh","application/x-csh"],["css","text/css"],["csv","text/csv"],["doc","application/msword"],["docx","application/vnd.openxmlformats-officedocument.wordprocessingml.document"],["eot","application/vnd.ms-fontobject"],["epub","application/epub+zip"],["gz","application/gzip"],["gif","image/gif"],["heic","image/heic"],["heif","image/heif"],["htm","text/html"],["html","text/html"],["ico","image/vnd.microsoft.icon"],["ics","text/calendar"],["jar","application/java-archive"],["jpeg","image/jpeg"],["jpg","image/jpeg"],["js","text/javascript"],["json","application/json"],["jsonld","application/ld+json"],["mid","audio/midi"],["midi","audio/midi"],["mjs","text/javascript"],["mp3","audio/mpeg"],["mp4","video/mp4"],["mpeg","video/mpeg"],["mpkg","application/vnd.apple.installer+xml"],["odp","application/vnd.oasis.opendocument.presentation"],["ods","application/vnd.oasis.opendocument.spreadsheet"],["odt","application/vnd.oasis.opendocument.text"],["oga","audio/ogg"],["ogv","video/ogg"],["ogx","application/ogg"],["opus","audio/opus"],["otf","font/otf"],["png","image/png"],["pdf","application/pdf"],["php","application/x-httpd-php"],["ppt","application/vnd.ms-powerpoint"],["pptx","application/vnd.openxmlformats-officedocument.presentationml.presentation"],["rar","application/vnd.rar"],["rtf","application/rtf"],["sh","application/x-sh"],["svg","image/svg+xml"],["swf","application/x-shockwave-flash"],["tar","application/x-tar"],["tif","image/tiff"],["tiff","image/tiff"],["ts","video/mp2t"],["ttf","font/ttf"],["txt","text/plain"],["vsd","application/vnd.visio"],["wav","audio/wav"],["weba","audio/webm"],["webm","video/webm"],["webp","image/webp"],["woff","font/woff"],["woff2","font/woff2"],["xhtml","application/xhtml+xml"],["xls","application/vnd.ms-excel"],["xlsx","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"],["xml","application/xml"],["xul","application/vnd.mozilla.xul+xml"],["zip","application/zip"],["7z","application/x-7z-compressed"],["mkv","video/x-matroska"],["mov","video/quicktime"],["msg","application/vnd.ms-outlook"]]);function Gu(e,t){var n=oN(e);if(typeof n.path!="string"){var r=e.webkitRelativePath;Object.defineProperty(n,"path",{value:typeof t=="string"?t:typeof r=="string"&&r.length>0?r:e.name,writable:!1,configurable:!1,enumerable:!0})}return n}function oN(e){var t=e.name,n=t&&t.lastIndexOf(".")!==-1;if(n&&!e.type){var r=t.split(".").pop().toLowerCase(),o=rN.get(r);o&&Object.defineProperty(e,"type",{value:o,writable:!1,configurable:!1,enumerable:!0})}return e}var sN=[".DS_Store","Thumbs.db"];function aN(e){return mc(this,void 0,void 0,function(){return gc(this,function(t){return ep(e)&&iN(e.dataTransfer)?[2,dN(e.dataTransfer,e.type)]:lN(e)?[2,cN(e)]:Array.isArray(e)&&e.every(function(n){return"getFile"in n&&typeof n.getFile=="function"})?[2,uN(e)]:[2,[]]})})}function iN(e){return ep(e)}function lN(e){return ep(e)&&ep(e.target)}function ep(e){return typeof e=="object"&&e!==null}function cN(e){return $v(e.target.files).map(function(t){return Gu(t)})}function uN(e){return mc(this,void 0,void 0,function(){var t;return gc(this,function(n){switch(n.label){case 0:return[4,Promise.all(e.map(function(r){return r.getFile()}))];case 1:return t=n.sent(),[2,t.map(function(r){return Gu(r)})]}})})}function dN(e,t){return mc(this,void 0,void 0,function(){var n,r;return gc(this,function(o){switch(o.label){case 0:return e.items?(n=$v(e.items).filter(function(s){return s.kind==="file"}),t!=="drop"?[2,n]:[4,Promise.all(n.map(fN))]):[3,2];case 1:return r=o.sent(),[2,N2(J6(r))];case 2:return[2,N2($v(e.files).map(function(s){return Gu(s)}))]}})})}function N2(e){return e.filter(function(t){return sN.indexOf(t.name)===-1})}function $v(e){if(e===null)return[];for(var t=[],n=0;ne.length)&&(t=e.length);for(var n=0,r=new Array(t);nn)return[!1,B2(n)];if(e.sizen)return[!1,B2(n)]}return[!0,null]}function Ei(e){return e!=null}function EN(e){var t=e.files,n=e.accept,r=e.minSize,o=e.maxSize,s=e.multiple,a=e.maxFiles,u=e.validator;return!s&&t.length>1||s&&a>=1&&t.length>a?!1:t.every(function(d){var f=rP(d,n),h=Cu(f,1),m=h[0],v=oP(d,r,o),b=Cu(v,1),w=b[0],C=u?u(d):null;return m&&w&&!C})}function tp(e){return typeof e.isPropagationStopped=="function"?e.isPropagationStopped():typeof e.cancelBubble<"u"?e.cancelBubble:!1}function Ud(e){return e.dataTransfer?Array.prototype.some.call(e.dataTransfer.types,function(t){return t==="Files"||t==="application/x-moz-file"}):!!e.target&&!!e.target.files}function W2(e){e.preventDefault()}function IN(e){return e.indexOf("MSIE")!==-1||e.indexOf("Trident/")!==-1}function ON(e){return e.indexOf("Edge/")!==-1}function RN(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:window.navigator.userAgent;return IN(e)||ON(e)}function $s(){for(var e=arguments.length,t=new Array(e),n=0;n1?o-1:0),a=1;ae.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}function KN(e,t){if(e==null)return{};var n={},r=Object.keys(e),o,s;for(s=0;s=0)&&(n[o]=e[o]);return n}var C1=p.forwardRef(function(e,t){var n=e.children,r=np(e,zN),o=P1(r),s=o.open,a=np(o,$N);return p.useImperativeHandle(t,function(){return{open:s}},[s]),z.createElement(p.Fragment,null,n(ar(ar({},a),{},{open:s})))});C1.displayName="Dropzone";var lP={disabled:!1,getFilesFromEvent:aN,maxSize:1/0,minSize:0,multiple:!0,maxFiles:0,preventDropOnDocument:!0,noClick:!1,noKeyboard:!1,noDrag:!1,noDragEventsBubbling:!1,validator:null,useFsAccessApi:!0,autoFocus:!1};C1.defaultProps=lP;C1.propTypes={children:An.func,accept:An.objectOf(An.arrayOf(An.string)),multiple:An.bool,preventDropOnDocument:An.bool,noClick:An.bool,noKeyboard:An.bool,noDrag:An.bool,noDragEventsBubbling:An.bool,minSize:An.number,maxSize:An.number,maxFiles:An.number,disabled:An.bool,getFilesFromEvent:An.func,onFileDialogCancel:An.func,onFileDialogOpen:An.func,useFsAccessApi:An.bool,autoFocus:An.bool,onDragEnter:An.func,onDragLeave:An.func,onDragOver:An.func,onDrop:An.func,onDropAccepted:An.func,onDropRejected:An.func,onError:An.func,validator:An.func};var Hv={isFocused:!1,isFileDialogActive:!1,isDragActive:!1,isDragAccept:!1,isDragReject:!1,acceptedFiles:[],fileRejections:[]};function P1(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},t=ar(ar({},lP),e),n=t.accept,r=t.disabled,o=t.getFilesFromEvent,s=t.maxSize,a=t.minSize,u=t.multiple,d=t.maxFiles,f=t.onDragEnter,h=t.onDragLeave,m=t.onDragOver,v=t.onDrop,b=t.onDropAccepted,w=t.onDropRejected,C=t.onFileDialogCancel,S=t.onFileDialogOpen,P=t.useFsAccessApi,k=t.autoFocus,j=t.preventDropOnDocument,E=t.noClick,I=t.noKeyboard,O=t.noDrag,R=t.noDragEventsBubbling,M=t.onError,A=t.validator,L=p.useMemo(function(){return DN(n)},[n]),D=p.useMemo(function(){return TN(n)},[n]),V=p.useMemo(function(){return typeof S=="function"?S:U2},[S]),$=p.useMemo(function(){return typeof C=="function"?C:U2},[C]),F=p.useRef(null),U=p.useRef(null),X=p.useReducer(YN,Hv),N=Eg(X,2),G=N[0],W=N[1],q=G.isFocused,ne=G.isFileDialogActive,ve=p.useRef(typeof window<"u"&&window.isSecureContext&&P&&MN()),le=function(){!ve.current&&ne&&setTimeout(function(){if(U.current){var pe=U.current.files;pe.length||(W({type:"closeDialog"}),$())}},300)};p.useEffect(function(){return window.addEventListener("focus",le,!1),function(){window.removeEventListener("focus",le,!1)}},[U,ne,$,ve]);var oe=p.useRef([]),Y=function(pe){F.current&&F.current.contains(pe.target)||(pe.preventDefault(),oe.current=[])};p.useEffect(function(){return j&&(document.addEventListener("dragover",W2,!1),document.addEventListener("drop",Y,!1)),function(){j&&(document.removeEventListener("dragover",W2),document.removeEventListener("drop",Y))}},[F,j]),p.useEffect(function(){return!r&&k&&F.current&&F.current.focus(),function(){}},[F,k,r]);var ae=p.useCallback(function(te){M?M(te):console.error(te)},[M]),de=p.useCallback(function(te){te.preventDefault(),te.persist(),xt(te),oe.current=[].concat(BN(oe.current),[te.target]),Ud(te)&&Promise.resolve(o(te)).then(function(pe){if(!(tp(te)&&!R)){var Ne=pe.length,Xe=Ne>0&&EN({files:pe,accept:L,minSize:a,maxSize:s,multiple:u,maxFiles:d,validator:A}),yt=Ne>0&&!Xe;W({isDragAccept:Xe,isDragReject:yt,isDragActive:!0,type:"setDraggedFiles"}),f&&f(te)}}).catch(function(pe){return ae(pe)})},[o,f,ae,R,L,a,s,u,d,A]),xe=p.useCallback(function(te){te.preventDefault(),te.persist(),xt(te);var pe=Ud(te);if(pe&&te.dataTransfer)try{te.dataTransfer.dropEffect="copy"}catch{}return pe&&m&&m(te),!1},[m,R]),se=p.useCallback(function(te){te.preventDefault(),te.persist(),xt(te);var pe=oe.current.filter(function(Xe){return F.current&&F.current.contains(Xe)}),Ne=pe.indexOf(te.target);Ne!==-1&&pe.splice(Ne,1),oe.current=pe,!(pe.length>0)&&(W({type:"setDraggedFiles",isDragActive:!1,isDragAccept:!1,isDragReject:!1}),Ud(te)&&h&&h(te))},[F,h,R]),ge=p.useCallback(function(te,pe){var Ne=[],Xe=[];te.forEach(function(yt){var Xt=rP(yt,L),an=Eg(Xt,2),Pn=an[0],vr=an[1],ln=oP(yt,a,s),Kn=Eg(ln,2),Re=Kn[0],et=Kn[1],it=A?A(yt):null;if(Pn&&Re&&!it)Ne.push(yt);else{var ut=[vr,et];it&&(ut=ut.concat(it)),Xe.push({file:yt,errors:ut.filter(function(Nt){return Nt})})}}),(!u&&Ne.length>1||u&&d>=1&&Ne.length>d)&&(Ne.forEach(function(yt){Xe.push({file:yt,errors:[jN]})}),Ne.splice(0)),W({acceptedFiles:Ne,fileRejections:Xe,type:"setFiles"}),v&&v(Ne,Xe,pe),Xe.length>0&&w&&w(Xe,pe),Ne.length>0&&b&&b(Ne,pe)},[W,u,L,a,s,d,v,b,w,A]),fe=p.useCallback(function(te){te.preventDefault(),te.persist(),xt(te),oe.current=[],Ud(te)&&Promise.resolve(o(te)).then(function(pe){tp(te)&&!R||ge(pe,te)}).catch(function(pe){return ae(pe)}),W({type:"reset"})},[o,ge,ae,R]),ke=p.useCallback(function(){if(ve.current){W({type:"openDialog"}),V();var te={multiple:u,types:D};window.showOpenFilePicker(te).then(function(pe){return o(pe)}).then(function(pe){ge(pe,null),W({type:"closeDialog"})}).catch(function(pe){AN(pe)?($(pe),W({type:"closeDialog"})):NN(pe)?(ve.current=!1,U.current?(U.current.value=null,U.current.click()):ae(new Error("Cannot open the file picker because the https://developer.mozilla.org/en-US/docs/Web/API/File_System_Access_API is not supported and no was provided."))):ae(pe)});return}U.current&&(W({type:"openDialog"}),V(),U.current.value=null,U.current.click())},[W,V,$,P,ge,ae,D,u]),Ae=p.useCallback(function(te){!F.current||!F.current.isEqualNode(te.target)||(te.key===" "||te.key==="Enter"||te.keyCode===32||te.keyCode===13)&&(te.preventDefault(),ke())},[F,ke]),ye=p.useCallback(function(){W({type:"focus"})},[]),Oe=p.useCallback(function(){W({type:"blur"})},[]),at=p.useCallback(function(){E||(RN()?setTimeout(ke,0):ke())},[E,ke]),Fe=function(pe){return r?null:pe},Ye=function(pe){return I?null:Fe(pe)},_t=function(pe){return O?null:Fe(pe)},xt=function(pe){R&&pe.stopPropagation()},Fn=p.useMemo(function(){return function(){var te=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},pe=te.refKey,Ne=pe===void 0?"ref":pe,Xe=te.role,yt=te.onKeyDown,Xt=te.onFocus,an=te.onBlur,Pn=te.onClick,vr=te.onDragEnter,ln=te.onDragOver,Kn=te.onDragLeave,Re=te.onDrop,et=np(te,LN);return ar(ar(Bv({onKeyDown:Ye($s(yt,Ae)),onFocus:Ye($s(Xt,ye)),onBlur:Ye($s(an,Oe)),onClick:Fe($s(Pn,at)),onDragEnter:_t($s(vr,de)),onDragOver:_t($s(ln,xe)),onDragLeave:_t($s(Kn,se)),onDrop:_t($s(Re,fe)),role:typeof Xe=="string"&&Xe!==""?Xe:"presentation"},Ne,F),!r&&!I?{tabIndex:0}:{}),et)}},[F,Ae,ye,Oe,at,de,xe,se,fe,I,O,r]),Q=p.useCallback(function(te){te.stopPropagation()},[]),we=p.useMemo(function(){return function(){var te=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},pe=te.refKey,Ne=pe===void 0?"ref":pe,Xe=te.onChange,yt=te.onClick,Xt=np(te,FN),an=Bv({accept:L,multiple:u,type:"file",style:{display:"none"},onChange:Fe($s(Xe,fe)),onClick:Fe($s(yt,Q)),tabIndex:-1},Ne,U);return ar(ar({},an),Xt)}},[U,n,u,fe,r]);return ar(ar({},G),{},{isFocused:q&&!r,getRootProps:Fn,getInputProps:we,rootRef:F,inputRef:U,open:Fe(ke)})}function YN(e,t){switch(t.type){case"focus":return ar(ar({},e),{},{isFocused:!0});case"blur":return ar(ar({},e),{},{isFocused:!1});case"openDialog":return ar(ar({},Hv),{},{isFileDialogActive:!0});case"closeDialog":return ar(ar({},e),{},{isFileDialogActive:!1});case"setDraggedFiles":return ar(ar({},e),{},{isDragActive:t.isDragActive,isDragAccept:t.isDragAccept,isDragReject:t.isDragReject});case"setFiles":return ar(ar({},e),{},{acceptedFiles:t.acceptedFiles,fileRejections:t.fileRejections});case"reset":return ar({},Hv);default:return e}}function U2(){}function Wv(){return Wv=Object.assign?Object.assign.bind():function(e){for(var t=1;t'),!0):t?e.some(function(n){return t.includes(n)})||e.includes("*"):!0}var nz=function(t,n,r){r===void 0&&(r=!1);var o=n.alt,s=n.meta,a=n.mod,u=n.shift,d=n.ctrl,f=n.keys,h=t.key,m=t.code,v=t.ctrlKey,b=t.metaKey,w=t.shiftKey,C=t.altKey,S=Ha(m),P=h.toLowerCase();if(!r){if(o===!C&&P!=="alt"||u===!w&&P!=="shift")return!1;if(a){if(!b&&!v)return!1}else if(s===!b&&P!=="meta"&&P!=="os"||d===!v&&P!=="ctrl"&&P!=="control")return!1}return f&&f.length===1&&(f.includes(P)||f.includes(S))?!0:f?uP(f):!f},rz=p.createContext(void 0),oz=function(){return p.useContext(rz)};function hP(e,t){return e&&t&&typeof e=="object"&&typeof t=="object"?Object.keys(e).length===Object.keys(t).length&&Object.keys(e).reduce(function(n,r){return n&&hP(e[r],t[r])},!0):e===t}var sz=p.createContext({hotkeys:[],enabledScopes:[],toggleScope:function(){},enableScope:function(){},disableScope:function(){}}),az=function(){return p.useContext(sz)};function iz(e){var t=p.useRef(void 0);return hP(t.current,e)||(t.current=e),t.current}var G2=function(t){t.stopPropagation(),t.preventDefault(),t.stopImmediatePropagation()},lz=typeof window<"u"?p.useLayoutEffect:p.useEffect;function Ge(e,t,n,r){var o=p.useRef(null),s=p.useRef(!1),a=n instanceof Array?r instanceof Array?void 0:r:n,u=e instanceof Array?e.join(a==null?void 0:a.splitKey):e,d=n instanceof Array?n:r instanceof Array?r:void 0,f=p.useCallback(t,d??[]),h=p.useRef(f);d?h.current=f:h.current=t;var m=iz(a),v=az(),b=v.enabledScopes,w=oz();return lz(function(){if(!((m==null?void 0:m.enabled)===!1||!tz(b,m==null?void 0:m.scopes))){var C=function(E,I){var O;if(I===void 0&&(I=!1),!(ez(E)&&!pP(E,m==null?void 0:m.enableOnFormTags))&&!(m!=null&&m.ignoreEventWhen!=null&&m.ignoreEventWhen(E))){if(o.current!==null&&document.activeElement!==o.current&&!o.current.contains(document.activeElement)){G2(E);return}(O=E.target)!=null&&O.isContentEditable&&!(m!=null&&m.enableOnContentEditable)||Ig(u,m==null?void 0:m.splitKey).forEach(function(R){var M,A=Og(R,m==null?void 0:m.combinationKey);if(nz(E,A,m==null?void 0:m.ignoreModifiers)||(M=A.keys)!=null&&M.includes("*")){if(I&&s.current)return;if(ZN(E,A,m==null?void 0:m.preventDefault),!JN(E,A,m==null?void 0:m.enabled)){G2(E);return}h.current(E,A),I||(s.current=!0)}})}},S=function(E){E.key!==void 0&&(dP(Ha(E.code)),((m==null?void 0:m.keydown)===void 0&&(m==null?void 0:m.keyup)!==!0||m!=null&&m.keydown)&&C(E))},P=function(E){E.key!==void 0&&(fP(Ha(E.code)),s.current=!1,m!=null&&m.keyup&&C(E,!0))},k=o.current||(a==null?void 0:a.document)||document;return k.addEventListener("keyup",P),k.addEventListener("keydown",S),w&&Ig(u,m==null?void 0:m.splitKey).forEach(function(j){return w.addHotkey(Og(j,m==null?void 0:m.combinationKey,m==null?void 0:m.description))}),function(){k.removeEventListener("keyup",P),k.removeEventListener("keydown",S),w&&Ig(u,m==null?void 0:m.splitKey).forEach(function(j){return w.removeHotkey(Og(j,m==null?void 0:m.combinationKey,m==null?void 0:m.description))})}}},[u,m,b]),o}const cz=e=>{const{isDragAccept:t,isDragReject:n,setIsHandlingUpload:r}=e;return Ge("esc",()=>{r(!1)}),i.jsx(qe,{sx:{position:"absolute",top:0,insetInlineStart:0,width:"100vw",height:"100vh",zIndex:999,backdropFilter:"blur(20px)"},children:i.jsx(H,{sx:{opacity:.4,width:"100%",height:"100%",flexDirection:"column",rowGap:4,alignItems:"center",justifyContent:"center",bg:"base.900",boxShadow:`inset 0 0 20rem 1rem var(--invokeai-colors-${t?"accent":"error"}-500)`},children:t?i.jsx(aa,{size:"lg",children:"Drop to Upload"}):i.jsxs(i.Fragment,{children:[i.jsx(aa,{size:"lg",children:"Invalid Upload"}),i.jsx(aa,{size:"md",children:"Must be single JPEG or PNG image"})]})})})},uz=Pe([ao,Sr],(e,t)=>{const{isConnected:n,isUploading:r}=e;return{isUploaderDisabled:!n||r,activeTabName:t}}),dz=e=>{const{children:t}=e,n=re(),{isUploaderDisabled:r,activeTabName:o}=B(uz),s=Du(),{t:a}=me(),[u,d]=p.useState(!1),{setOpenUploaderFunction:f}=kh(),h=p.useCallback(E=>{d(!0),s({title:a("toast.uploadFailed"),description:E.errors.map(I=>I.message).join(` +`),status:"error"})},[a,s]),m=p.useCallback(async E=>{n(u3({file:E,image_category:"user",is_intermediate:!1,postUploadAction:{type:"TOAST_UPLOADED"}}))},[n]),v=p.useCallback((E,I)=>{if(I.length>1){s({title:a("toast.uploadFailed"),description:a("toast.uploadFailedInvalidUploadDesc"),status:"error"});return}I.forEach(O=>{h(O)}),E.forEach(O=>{m(O)})},[a,s,m,h]),{getRootProps:b,getInputProps:w,isDragAccept:C,isDragReject:S,isDragActive:P,inputRef:k,open:j}=P1({accept:{"image/png":[".png"],"image/jpeg":[".jpg",".jpeg",".png"]},noClick:!0,onDrop:v,onDragOver:()=>d(!0),disabled:r,multiple:!1});return p.useEffect(()=>{const E=async I=>{var O,R;k.current&&(O=I.clipboardData)!=null&&O.files&&(k.current.files=I.clipboardData.files,(R=k.current)==null||R.dispatchEvent(new Event("change",{bubbles:!0})))};return f(j),document.addEventListener("paste",E),()=>{document.removeEventListener("paste",E),f(()=>{})}},[k,j,f]),i.jsxs(qe,{...b({style:{}}),onKeyDown:E=>{E.key},children:[i.jsx("input",{...w()}),t,P&&u&&i.jsx(cz,{isDragAccept:C,isDragReject:S,setIsHandlingUpload:d})]})},fz=p.memo(dz),mP=e=>e.gallery;const pz=e=>{const{triggerComponent:t,children:n,hasArrow:r=!0,isLazy:o=!0,...s}=e;return i.jsxs(p1,{isLazy:o,...s,children:[i.jsx(f1,{children:t}),i.jsxs(h1,{shadow:"dark-lg",children:[r&&i.jsx(N6,{}),n]})]})},la=p.memo(pz),Me=(e,t)=>n=>n==="light"?e:t,hz=e=>{const{label:t,...n}=e,{colorMode:r}=xo();return i.jsx(S5,{colorScheme:"accent",...n,children:i.jsx(Ue,{sx:{fontSize:"sm",color:Me("base.800","base.200")(r)},children:t})})},In=p.memo(hz);function gP(e){return st({tag:"svg",attr:{fill:"currentColor",viewBox:"0 0 16 16"},child:[{tag:"path",attr:{d:"M9.828.722a.5.5 0 0 1 .354.146l4.95 4.95a.5.5 0 0 1 0 .707c-.48.48-1.072.588-1.503.588-.177 0-.335-.018-.46-.039l-3.134 3.134a5.927 5.927 0 0 1 .16 1.013c.046.702-.032 1.687-.72 2.375a.5.5 0 0 1-.707 0l-2.829-2.828-3.182 3.182c-.195.195-1.219.902-1.414.707-.195-.195.512-1.22.707-1.414l3.182-3.182-2.828-2.829a.5.5 0 0 1 0-.707c.688-.688 1.673-.767 2.375-.72a5.922 5.922 0 0 1 1.013.16l3.134-3.133a2.772 2.772 0 0 1-.04-.461c0-.43.108-1.022.589-1.503a.5.5 0 0 1 .353-.146z"}}]})(e)}function vP(e){return st({tag:"svg",attr:{fill:"currentColor",viewBox:"0 0 16 16"},child:[{tag:"path",attr:{d:"M9.828.722a.5.5 0 0 1 .354.146l4.95 4.95a.5.5 0 0 1 0 .707c-.48.48-1.072.588-1.503.588-.177 0-.335-.018-.46-.039l-3.134 3.134a5.927 5.927 0 0 1 .16 1.013c.046.702-.032 1.687-.72 2.375a.5.5 0 0 1-.707 0l-2.829-2.828-3.182 3.182c-.195.195-1.219.902-1.414.707-.195-.195.512-1.22.707-1.414l3.182-3.182-2.828-2.829a.5.5 0 0 1 0-.707c.688-.688 1.673-.767 2.375-.72a5.922 5.922 0 0 1 1.013.16l3.134-3.133a2.772 2.772 0 0 1-.04-.461c0-.43.108-1.022.589-1.503a.5.5 0 0 1 .353-.146zm.122 2.112v-.002.002zm0-.002v.002a.5.5 0 0 1-.122.51L6.293 6.878a.5.5 0 0 1-.511.12H5.78l-.014-.004a4.507 4.507 0 0 0-.288-.076 4.922 4.922 0 0 0-.765-.116c-.422-.028-.836.008-1.175.15l5.51 5.509c.141-.34.177-.753.149-1.175a4.924 4.924 0 0 0-.192-1.054l-.004-.013v-.001a.5.5 0 0 1 .12-.512l3.536-3.535a.5.5 0 0 1 .532-.115l.096.022c.087.017.208.034.344.034.114 0 .23-.011.343-.04L9.927 2.028c-.029.113-.04.23-.04.343a1.779 1.779 0 0 0 .062.46z"}}]})(e)}function mz(e){return st({tag:"svg",attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M524.531,69.836a1.5,1.5,0,0,0-.764-.7A485.065,485.065,0,0,0,404.081,32.03a1.816,1.816,0,0,0-1.923.91,337.461,337.461,0,0,0-14.9,30.6,447.848,447.848,0,0,0-134.426,0,309.541,309.541,0,0,0-15.135-30.6,1.89,1.89,0,0,0-1.924-.91A483.689,483.689,0,0,0,116.085,69.137a1.712,1.712,0,0,0-.788.676C39.068,183.651,18.186,294.69,28.43,404.354a2.016,2.016,0,0,0,.765,1.375A487.666,487.666,0,0,0,176.02,479.918a1.9,1.9,0,0,0,2.063-.676A348.2,348.2,0,0,0,208.12,430.4a1.86,1.86,0,0,0-1.019-2.588,321.173,321.173,0,0,1-45.868-21.853,1.885,1.885,0,0,1-.185-3.126c3.082-2.309,6.166-4.711,9.109-7.137a1.819,1.819,0,0,1,1.9-.256c96.229,43.917,200.41,43.917,295.5,0a1.812,1.812,0,0,1,1.924.233c2.944,2.426,6.027,4.851,9.132,7.16a1.884,1.884,0,0,1-.162,3.126,301.407,301.407,0,0,1-45.89,21.83,1.875,1.875,0,0,0-1,2.611,391.055,391.055,0,0,0,30.014,48.815,1.864,1.864,0,0,0,2.063.7A486.048,486.048,0,0,0,610.7,405.729a1.882,1.882,0,0,0,.765-1.352C623.729,277.594,590.933,167.465,524.531,69.836ZM222.491,337.58c-28.972,0-52.844-26.587-52.844-59.239S193.056,219.1,222.491,219.1c29.665,0,53.306,26.82,52.843,59.239C275.334,310.993,251.924,337.58,222.491,337.58Zm195.38,0c-28.971,0-52.843-26.587-52.843-59.239S388.437,219.1,417.871,219.1c29.667,0,53.307,26.82,52.844,59.239C470.715,310.993,447.538,337.58,417.871,337.58Z"}}]})(e)}function gz(e){return st({tag:"svg",attr:{viewBox:"0 0 496 512"},child:[{tag:"path",attr:{d:"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"}}]})(e)}function vz(e){return st({tag:"svg",attr:{viewBox:"0 0 576 512"},child:[{tag:"path",attr:{d:"M528 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h480c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm-352 96c35.3 0 64 28.7 64 64s-28.7 64-64 64-64-28.7-64-64 28.7-64 64-64zm112 236.8c0 10.6-10 19.2-22.4 19.2H86.4C74 384 64 375.4 64 364.8v-19.2c0-31.8 30.1-57.6 67.2-57.6h5c12.3 5.1 25.7 8 39.8 8s27.6-2.9 39.8-8h5c37.1 0 67.2 25.8 67.2 57.6v19.2zM512 312c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-64c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16zm0-64c0 4.4-3.6 8-8 8H360c-4.4 0-8-3.6-8-8v-16c0-4.4 3.6-8 8-8h144c4.4 0 8 3.6 8 8v16z"}}]})(e)}function yz(e){return st({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34zm192-34l-136-136c-9.4-9.4-24.6-9.4-33.9 0l-22.6 22.6c-9.4 9.4-9.4 24.6 0 33.9l96.4 96.4-96.4 96.4c-9.4 9.4-9.4 24.6 0 33.9l22.6 22.6c9.4 9.4 24.6 9.4 33.9 0l136-136c9.4-9.2 9.4-24.4 0-33.8z"}}]})(e)}function bz(e){return st({tag:"svg",attr:{viewBox:"0 0 256 512"},child:[{tag:"path",attr:{d:"M31.7 239l136-136c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9L127.9 256l96.4 96.4c9.4 9.4 9.4 24.6 0 33.9L201.7 409c-9.4 9.4-24.6 9.4-33.9 0l-136-136c-9.5-9.4-9.5-24.6-.1-34z"}}]})(e)}function xz(e){return st({tag:"svg",attr:{viewBox:"0 0 256 512"},child:[{tag:"path",attr:{d:"M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z"}}]})(e)}function Sz(e){return st({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M257.5 445.1l-22.2 22.2c-9.4 9.4-24.6 9.4-33.9 0L7 273c-9.4-9.4-9.4-24.6 0-33.9L201.4 44.7c9.4-9.4 24.6-9.4 33.9 0l22.2 22.2c9.5 9.5 9.3 25-.4 34.3L136.6 216H424c13.3 0 24 10.7 24 24v32c0 13.3-10.7 24-24 24H136.6l120.5 114.8c9.8 9.3 10 24.8.4 34.3z"}}]})(e)}function wz(e){return st({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M190.5 66.9l22.2-22.2c9.4-9.4 24.6-9.4 33.9 0L441 239c9.4 9.4 9.4 24.6 0 33.9L246.6 467.3c-9.4 9.4-24.6 9.4-33.9 0l-22.2-22.2c-9.5-9.5-9.3-25 .4-34.3L311.4 296H24c-13.3 0-24-10.7-24-24v-32c0-13.3 10.7-24 24-24h287.4L190.9 101.2c-9.8-9.3-10-24.8-.4-34.3z"}}]})(e)}function yP(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M352.201 425.775l-79.196 79.196c-9.373 9.373-24.568 9.373-33.941 0l-79.196-79.196c-15.119-15.119-4.411-40.971 16.971-40.97h51.162L228 284H127.196v51.162c0 21.382-25.851 32.09-40.971 16.971L7.029 272.937c-9.373-9.373-9.373-24.569 0-33.941L86.225 159.8c15.119-15.119 40.971-4.411 40.971 16.971V228H228V127.196h-51.23c-21.382 0-32.09-25.851-16.971-40.971l79.196-79.196c9.373-9.373 24.568-9.373 33.941 0l79.196 79.196c15.119 15.119 4.411 40.971-16.971 40.971h-51.162V228h100.804v-51.162c0-21.382 25.851-32.09 40.97-16.971l79.196 79.196c9.373 9.373 9.373 24.569 0 33.941L425.773 352.2c-15.119 15.119-40.971 4.411-40.97-16.971V284H284v100.804h51.23c21.382 0 32.09 25.851 16.971 40.971z"}}]})(e)}function Cz(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M478.21 334.093L336 256l142.21-78.093c11.795-6.477 15.961-21.384 9.232-33.037l-19.48-33.741c-6.728-11.653-21.72-15.499-33.227-8.523L296 186.718l3.475-162.204C299.763 11.061 288.937 0 275.48 0h-38.96c-13.456 0-24.283 11.061-23.994 24.514L216 186.718 77.265 102.607c-11.506-6.976-26.499-3.13-33.227 8.523l-19.48 33.741c-6.728 11.653-2.562 26.56 9.233 33.037L176 256 33.79 334.093c-11.795 6.477-15.961 21.384-9.232 33.037l19.48 33.741c6.728 11.653 21.721 15.499 33.227 8.523L216 325.282l-3.475 162.204C212.237 500.939 223.064 512 236.52 512h38.961c13.456 0 24.283-11.061 23.995-24.514L296 325.282l138.735 84.111c11.506 6.976 26.499 3.13 33.227-8.523l19.48-33.741c6.728-11.653 2.563-26.559-9.232-33.036z"}}]})(e)}function Pz(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M511.988 288.9c-.478 17.43-15.217 31.1-32.653 31.1H424v16c0 21.864-4.882 42.584-13.6 61.145l60.228 60.228c12.496 12.497 12.496 32.758 0 45.255-12.498 12.497-32.759 12.496-45.256 0l-54.736-54.736C345.886 467.965 314.351 480 280 480V236c0-6.627-5.373-12-12-12h-24c-6.627 0-12 5.373-12 12v244c-34.351 0-65.886-12.035-90.636-32.108l-54.736 54.736c-12.498 12.497-32.759 12.496-45.256 0-12.496-12.497-12.496-32.758 0-45.255l60.228-60.228C92.882 378.584 88 357.864 88 336v-16H32.666C15.23 320 .491 306.33.013 288.9-.484 270.816 14.028 256 32 256h56v-58.745l-46.628-46.628c-12.496-12.497-12.496-32.758 0-45.255 12.498-12.497 32.758-12.497 45.256 0L141.255 160h229.489l54.627-54.627c12.498-12.497 32.758-12.497 45.256 0 12.496 12.497 12.496 32.758 0 45.255L424 197.255V256h56c17.972 0 32.484 14.816 31.988 32.9zM257 0c-61.856 0-112 50.144-112 112h224C369 50.144 318.856 0 257 0z"}}]})(e)}function kz(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"}}]})(e)}function _z(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8z"}}]})(e)}function k1(e){return st({tag:"svg",attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M278.9 511.5l-61-17.7c-6.4-1.8-10-8.5-8.2-14.9L346.2 8.7c1.8-6.4 8.5-10 14.9-8.2l61 17.7c6.4 1.8 10 8.5 8.2 14.9L293.8 503.3c-1.9 6.4-8.5 10.1-14.9 8.2zm-114-112.2l43.5-46.4c4.6-4.9 4.3-12.7-.8-17.2L117 256l90.6-79.7c5.1-4.5 5.5-12.3.8-17.2l-43.5-46.4c-4.5-4.8-12.1-5.1-17-.5L3.8 247.2c-5.1 4.7-5.1 12.8 0 17.5l144.1 135.1c4.9 4.6 12.5 4.4 17-.5zm327.2.6l144.1-135.1c5.1-4.7 5.1-12.8 0-17.5L492.1 112.1c-4.8-4.5-12.4-4.3-17 .5L431.6 159c-4.6 4.9-4.3 12.7.8 17.2L523 256l-90.6 79.7c-5.1 4.5-5.5 12.3-.8 17.2l43.5 46.4c4.5 4.9 12.1 5.1 17 .6z"}}]})(e)}function yc(e){return st({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M320 448v40c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24V120c0-13.255 10.745-24 24-24h72v296c0 30.879 25.121 56 56 56h168zm0-344V0H152c-13.255 0-24 10.745-24 24v368c0 13.255 10.745 24 24 24h272c13.255 0 24-10.745 24-24V128H344c-13.2 0-24-10.8-24-24zm120.971-31.029L375.029 7.029A24 24 0 0 0 358.059 0H352v96h96v-6.059a24 24 0 0 0-7.029-16.97z"}}]})(e)}function bP(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M500 224h-30.364C455.724 130.325 381.675 56.276 288 42.364V12c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v30.364C130.325 56.276 56.276 130.325 42.364 224H12c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h30.364C56.276 381.675 130.325 455.724 224 469.636V500c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-30.364C381.675 455.724 455.724 381.675 469.636 288H500c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12zM288 404.634V364c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40.634C165.826 392.232 119.783 346.243 107.366 288H148c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12h-40.634C119.768 165.826 165.757 119.783 224 107.366V148c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12v-40.634C346.174 119.768 392.217 165.757 404.634 224H364c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40.634C392.232 346.174 346.243 392.217 288 404.634zM288 256c0 17.673-14.327 32-32 32s-32-14.327-32-32c0-17.673 14.327-32 32-32s32 14.327 32 32z"}}]})(e)}function jz(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M239.1 6.3l-208 78c-18.7 7-31.1 25-31.1 45v225.1c0 18.2 10.3 34.8 26.5 42.9l208 104c13.5 6.8 29.4 6.8 42.9 0l208-104c16.3-8.1 26.5-24.8 26.5-42.9V129.3c0-20-12.4-37.9-31.1-44.9l-208-78C262 2.2 250 2.2 239.1 6.3zM256 68.4l192 72v1.1l-192 78-192-78v-1.1l192-72zm32 356V275.5l160-65v133.9l-160 80z"}}]})(e)}function _1(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M216 0h80c13.3 0 24 10.7 24 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3c-7.5 7.5-19.8 7.5-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24c0-13.3 10.7-24 24-24zm296 376v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h146.7l49 49c20.1 20.1 52.5 20.1 72.6 0l49-49H488c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z"}}]})(e)}function xP(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M497.941 273.941c18.745-18.745 18.745-49.137 0-67.882l-160-160c-18.745-18.745-49.136-18.746-67.883 0l-256 256c-18.745 18.745-18.745 49.137 0 67.882l96 96A48.004 48.004 0 0 0 144 480h356c6.627 0 12-5.373 12-12v-40c0-6.627-5.373-12-12-12H355.883l142.058-142.059zm-302.627-62.627l137.373 137.373L265.373 416H150.628l-80-80 124.686-124.686z"}}]})(e)}function Ez(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zm-248 50c-25.405 0-46 20.595-46 46s20.595 46 46 46 46-20.595 46-46-20.595-46-46-46zm-43.673-165.346l7.418 136c.347 6.364 5.609 11.346 11.982 11.346h48.546c6.373 0 11.635-4.982 11.982-11.346l7.418-136c.375-6.874-5.098-12.654-11.982-12.654h-63.383c-6.884 0-12.356 5.78-11.981 12.654z"}}]})(e)}function Iz(e){return st({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M448 344v112a23.94 23.94 0 0 1-24 24H312c-21.39 0-32.09-25.9-17-41l36.2-36.2L224 295.6 116.77 402.9 153 439c15.09 15.1 4.39 41-17 41H24a23.94 23.94 0 0 1-24-24V344c0-21.4 25.89-32.1 41-17l36.19 36.2L184.46 256 77.18 148.7 41 185c-15.1 15.1-41 4.4-41-17V56a23.94 23.94 0 0 1 24-24h112c21.39 0 32.09 25.9 17 41l-36.2 36.2L224 216.4l107.23-107.3L295 73c-15.09-15.1-4.39-41 17-41h112a23.94 23.94 0 0 1 24 24v112c0 21.4-25.89 32.1-41 17l-36.19-36.2L263.54 256l107.28 107.3L407 327.1c15.1-15.2 41-4.5 41 16.9z"}}]})(e)}function j1(e){return st({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M0 180V56c0-13.3 10.7-24 24-24h124c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H64v84c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12zM288 44v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V56c0-13.3-10.7-24-24-24H300c-6.6 0-12 5.4-12 12zm148 276h-40c-6.6 0-12 5.4-12 12v84h-84c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24V332c0-6.6-5.4-12-12-12zM160 468v-40c0-6.6-5.4-12-12-12H64v-84c0-6.6-5.4-12-12-12H12c-6.6 0-12 5.4-12 12v124c0 13.3 10.7 24 24 24h124c6.6 0 12-5.4 12-12z"}}]})(e)}function SP(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M50.75 333.25c-12 12-18.75 28.28-18.75 45.26V424L0 480l32 32 56-32h45.49c16.97 0 33.25-6.74 45.25-18.74l126.64-126.62-128-128L50.75 333.25zM483.88 28.12c-37.47-37.5-98.28-37.5-135.75 0l-77.09 77.09-13.1-13.1c-9.44-9.44-24.65-9.31-33.94 0l-40.97 40.97c-9.37 9.37-9.37 24.57 0 33.94l161.94 161.94c9.44 9.44 24.65 9.31 33.94 0L419.88 288c9.37-9.37 9.37-24.57 0-33.94l-13.1-13.1 77.09-77.09c37.51-37.48 37.51-98.26.01-135.75z"}}]})(e)}function Oz(e){return st({tag:"svg",attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M320 400c-75.85 0-137.25-58.71-142.9-133.11L72.2 185.82c-13.79 17.3-26.48 35.59-36.72 55.59a32.35 32.35 0 0 0 0 29.19C89.71 376.41 197.07 448 320 448c26.91 0 52.87-4 77.89-10.46L346 397.39a144.13 144.13 0 0 1-26 2.61zm313.82 58.1l-110.55-85.44a331.25 331.25 0 0 0 81.25-102.07 32.35 32.35 0 0 0 0-29.19C550.29 135.59 442.93 64 320 64a308.15 308.15 0 0 0-147.32 37.7L45.46 3.37A16 16 0 0 0 23 6.18L3.37 31.45A16 16 0 0 0 6.18 53.9l588.36 454.73a16 16 0 0 0 22.46-2.81l19.64-25.27a16 16 0 0 0-2.82-22.45zm-183.72-142l-39.3-30.38A94.75 94.75 0 0 0 416 256a94.76 94.76 0 0 0-121.31-92.21A47.65 47.65 0 0 1 304 192a46.64 46.64 0 0 1-1.54 10l-73.61-56.89A142.31 142.31 0 0 1 320 112a143.92 143.92 0 0 1 144 144c0 21.63-5.29 41.79-13.9 60.11z"}}]})(e)}function Rz(e){return st({tag:"svg",attr:{viewBox:"0 0 576 512"},child:[{tag:"path",attr:{d:"M572.52 241.4C518.29 135.59 410.93 64 288 64S57.68 135.64 3.48 241.41a32.35 32.35 0 0 0 0 29.19C57.71 376.41 165.07 448 288 448s230.32-71.64 284.52-177.41a32.35 32.35 0 0 0 0-29.19zM288 400a144 144 0 1 1 144-144 143.93 143.93 0 0 1-144 144zm0-240a95.31 95.31 0 0 0-25.31 3.79 47.85 47.85 0 0 1-66.9 66.9A95.78 95.78 0 1 0 288 160z"}}]})(e)}function wP(e){return st({tag:"svg",attr:{viewBox:"0 0 576 512"},child:[{tag:"path",attr:{d:"M512 320s-64 92.65-64 128c0 35.35 28.66 64 64 64s64-28.65 64-64-64-128-64-128zm-9.37-102.94L294.94 9.37C288.69 3.12 280.5 0 272.31 0s-16.38 3.12-22.62 9.37l-81.58 81.58L81.93 4.76c-6.25-6.25-16.38-6.25-22.62 0L36.69 27.38c-6.24 6.25-6.24 16.38 0 22.62l86.19 86.18-94.76 94.76c-37.49 37.48-37.49 98.26 0 135.75l117.19 117.19c18.74 18.74 43.31 28.12 67.87 28.12 24.57 0 49.13-9.37 67.87-28.12l221.57-221.57c12.5-12.5 12.5-32.75.01-45.25zm-116.22 70.97H65.93c1.36-3.84 3.57-7.98 7.43-11.83l13.15-13.15 81.61-81.61 58.6 58.6c12.49 12.49 32.75 12.49 45.24 0s12.49-32.75 0-45.24l-58.6-58.6 58.95-58.95 162.44 162.44-48.34 48.34z"}}]})(e)}function Tf(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M464 128H272l-64-64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48z"}}]})(e)}function Mz(e){return st({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M432 416h-23.41L277.88 53.69A32 32 0 0 0 247.58 32h-47.16a32 32 0 0 0-30.3 21.69L39.41 416H16a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16h-19.58l23.3-64h152.56l23.3 64H304a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h128a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zM176.85 272L224 142.51 271.15 272z"}}]})(e)}function Tz(e){return st({tag:"svg",attr:{viewBox:"0 0 496 512"},child:[{tag:"path",attr:{d:"M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zM94.6 168.9l34.9-5 15.5-31.6c2.9-5.8 11-5.8 13.9 0l15.5 31.6 34.9 5c6.2 1 8.9 8.6 4.3 13.2l-25.4 24.6 6 34.9c1 6.2-5.3 11-11 7.9L152 233.3l-31.3 16.3c-5.7 3.1-12-1.7-11-7.9l6-34.9-25.4-24.6c-4.6-4.7-1.9-12.3 4.3-13.3zM248 432c-60.6 0-134.5-38.3-143.8-93.3-2-11.8 9.3-21.5 20.7-17.9C155.1 330.5 200 336 248 336s92.9-5.5 123.1-15.2c11.5-3.7 22.6 6.1 20.7 17.9-9.3 55-83.2 93.3-143.8 93.3zm157.7-249.9l-25.4 24.6 6 34.9c1 6.2-5.3 11-11 7.9L344 233.3l-31.3 16.3c-5.7 3.1-12-1.7-11-7.9l6-34.9-25.4-24.6c-4.5-4.6-1.9-12.2 4.3-13.2l34.9-5 15.5-31.6c2.9-5.8 11-5.8 13.9 0l15.5 31.6 34.9 5c6.3.9 9 8.5 4.4 13.1z"}}]})(e)}function Dz(e){return st({tag:"svg",attr:{viewBox:"0 0 384 512"},child:[{tag:"path",attr:{d:"M360 0H24C10.745 0 0 10.745 0 24v16c0 13.255 10.745 24 24 24 0 90.965 51.016 167.734 120.842 192C75.016 280.266 24 357.035 24 448c-13.255 0-24 10.745-24 24v16c0 13.255 10.745 24 24 24h336c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24 0-90.965-51.016-167.734-120.842-192C308.984 231.734 360 154.965 360 64c13.255 0 24-10.745 24-24V24c0-13.255-10.745-24-24-24zm-75.078 384H99.08c17.059-46.797 52.096-80 92.92-80 40.821 0 75.862 33.196 92.922 80zm.019-256H99.078C91.988 108.548 88 86.748 88 64h208c0 22.805-3.987 44.587-11.059 64z"}}]})(e)}function qu(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z"}}]})(e)}function Az(e){return st({tag:"svg",attr:{viewBox:"0 0 576 512"},child:[{tag:"path",attr:{d:"M480 416v16c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V176c0-26.51 21.49-48 48-48h16v208c0 44.112 35.888 80 80 80h336zm96-80V80c0-26.51-21.49-48-48-48H144c-26.51 0-48 21.49-48 48v256c0 26.51 21.49 48 48 48h384c26.51 0 48-21.49 48-48zM256 128c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48 48 21.49 48 48zm-96 144l55.515-55.515c4.686-4.686 12.284-4.686 16.971 0L272 256l135.515-135.515c4.686-4.686 12.284-4.686 16.971 0L512 208v112H160v-48z"}}]})(e)}function Nz(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M256 8C119.043 8 8 119.083 8 256c0 136.997 111.043 248 248 248s248-111.003 248-248C504 119.083 392.957 8 256 8zm0 110c23.196 0 42 18.804 42 42s-18.804 42-42 42-42-18.804-42-42 18.804-42 42-42zm56 254c0 6.627-5.373 12-12 12h-88c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h12v-64h-12c-6.627 0-12-5.373-12-12v-24c0-6.627 5.373-12 12-12h64c6.627 0 12 5.373 12 12v100h12c6.627 0 12 5.373 12 12v24z"}}]})(e)}function zz(e){return st({tag:"svg",attr:{viewBox:"0 0 576 512"},child:[{tag:"path",attr:{d:"M528 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h480c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM128 180v-40c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm-336 96v-40c0-6.627-5.373-12-12-12H76c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12zm288 0v-40c0-6.627-5.373-12-12-12H172c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h232c6.627 0 12-5.373 12-12zm96 0v-40c0-6.627-5.373-12-12-12h-40c-6.627 0-12 5.373-12 12v40c0 6.627 5.373 12 12 12h40c6.627 0 12-5.373 12-12z"}}]})(e)}function CP(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M12.41 148.02l232.94 105.67c6.8 3.09 14.49 3.09 21.29 0l232.94-105.67c16.55-7.51 16.55-32.52 0-40.03L266.65 2.31a25.607 25.607 0 0 0-21.29 0L12.41 107.98c-16.55 7.51-16.55 32.53 0 40.04zm487.18 88.28l-58.09-26.33-161.64 73.27c-7.56 3.43-15.59 5.17-23.86 5.17s-16.29-1.74-23.86-5.17L70.51 209.97l-58.1 26.33c-16.55 7.5-16.55 32.5 0 40l232.94 105.59c6.8 3.08 14.49 3.08 21.29 0L499.59 276.3c16.55-7.5 16.55-32.5 0-40zm0 127.8l-57.87-26.23-161.86 73.37c-7.56 3.43-15.59 5.17-23.86 5.17s-16.29-1.74-23.86-5.17L70.29 337.87 12.41 364.1c-16.55 7.5-16.55 32.5 0 40l232.94 105.59c6.8 3.08 14.49 3.08 21.29 0L499.59 404.1c16.55-7.5 16.55-32.5 0-40z"}}]})(e)}function $z(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M80 368H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm0-320H16A16 16 0 0 0 0 64v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16V64a16 16 0 0 0-16-16zm0 160H16a16 16 0 0 0-16 16v64a16 16 0 0 0 16 16h64a16 16 0 0 0 16-16v-64a16 16 0 0 0-16-16zm416 176H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z"}}]})(e)}function Lz(e){return st({tag:"svg",attr:{viewBox:"0 0 640 512"},child:[{tag:"path",attr:{d:"M320.67 64c-442.6 0-357.57 384-158.46 384 39.9 0 77.47-20.69 101.42-55.86l25.73-37.79c15.66-22.99 46.97-22.99 62.63 0l25.73 37.79C401.66 427.31 439.23 448 479.13 448c189.86 0 290.63-384-158.46-384zM184 308.36c-41.06 0-67.76-25.66-80.08-41.05-5.23-6.53-5.23-16.09 0-22.63 12.32-15.4 39.01-41.05 80.08-41.05s67.76 25.66 80.08 41.05c5.23 6.53 5.23 16.09 0 22.63-12.32 15.4-39.02 41.05-80.08 41.05zm272 0c-41.06 0-67.76-25.66-80.08-41.05-5.23-6.53-5.23-16.09 0-22.63 12.32-15.4 39.01-41.05 80.08-41.05s67.76 25.66 80.08 41.05c5.23 6.53 5.23 16.09 0 22.63-12.32 15.4-39.02 41.05-80.08 41.05z"}}]})(e)}function Fz(e){return st({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z"}}]})(e)}function Bz(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z"}}]})(e)}function PP(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M167.02 309.34c-40.12 2.58-76.53 17.86-97.19 72.3-2.35 6.21-8 9.98-14.59 9.98-11.11 0-45.46-27.67-55.25-34.35C0 439.62 37.93 512 128 512c75.86 0 128-43.77 128-120.19 0-3.11-.65-6.08-.97-9.13l-88.01-73.34zM457.89 0c-15.16 0-29.37 6.71-40.21 16.45C213.27 199.05 192 203.34 192 257.09c0 13.7 3.25 26.76 8.73 38.7l63.82 53.18c7.21 1.8 14.64 3.03 22.39 3.03 62.11 0 98.11-45.47 211.16-256.46 7.38-14.35 13.9-29.85 13.9-45.99C512 20.64 486 0 457.89 0z"}}]})(e)}function kP(e){return st({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M424.4 214.7L72.4 6.6C43.8-10.3 0 6.1 0 47.9V464c0 37.5 40.7 60.1 72.4 41.3l352-208c31.4-18.5 31.5-64.1 0-82.6z"}}]})(e)}function _h(e){return st({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z"}}]})(e)}function Hz(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M464 32H336c-26.5 0-48 21.5-48 48v128c0 26.5 21.5 48 48 48h80v64c0 35.3-28.7 64-64 64h-8c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24h8c88.4 0 160-71.6 160-160V80c0-26.5-21.5-48-48-48zm-288 0H48C21.5 32 0 53.5 0 80v128c0 26.5 21.5 48 48 48h80v64c0 35.3-28.7 64-64 64h-8c-13.3 0-24 10.7-24 24v48c0 13.3 10.7 24 24 24h8c88.4 0 160-71.6 160-160V80c0-26.5-21.5-48-48-48z"}}]})(e)}function Wz(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M504.971 359.029c9.373 9.373 9.373 24.569 0 33.941l-80 79.984c-15.01 15.01-40.971 4.49-40.971-16.971V416h-58.785a12.004 12.004 0 0 1-8.773-3.812l-70.556-75.596 53.333-57.143L352 336h32v-39.981c0-21.438 25.943-31.998 40.971-16.971l80 79.981zM12 176h84l52.781 56.551 53.333-57.143-70.556-75.596A11.999 11.999 0 0 0 122.785 96H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12zm372 0v39.984c0 21.46 25.961 31.98 40.971 16.971l80-79.984c9.373-9.373 9.373-24.569 0-33.941l-80-79.981C409.943 24.021 384 34.582 384 56.019V96h-58.785a12.004 12.004 0 0 0-8.773 3.812L96 336H12c-6.627 0-12 5.373-12 12v56c0 6.627 5.373 12 12 12h110.785c3.326 0 6.503-1.381 8.773-3.812L352 176h32z"}}]})(e)}function Vz(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M500.33 0h-47.41a12 12 0 0 0-12 12.57l4 82.76A247.42 247.42 0 0 0 256 8C119.34 8 7.9 119.53 8 256.19 8.1 393.07 119.1 504 256 504a247.1 247.1 0 0 0 166.18-63.91 12 12 0 0 0 .48-17.43l-34-34a12 12 0 0 0-16.38-.55A176 176 0 1 1 402.1 157.8l-101.53-4.87a12 12 0 0 0-12.57 12v47.41a12 12 0 0 0 12 12h200.33a12 12 0 0 0 12-12V12a12 12 0 0 0-12-12z"}}]})(e)}function E1(e){return st({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM224 416c-35.346 0-64-28.654-64-64 0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64zm96-304.52V212c0 6.627-5.373 12-12 12H76c-6.627 0-12-5.373-12-12V108c0-6.627 5.373-12 12-12h228.52c3.183 0 6.235 1.264 8.485 3.515l3.48 3.48A11.996 11.996 0 0 1 320 111.48z"}}]})(e)}function q2(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"}}]})(e)}function Uz(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M64 96H0c0 123.7 100.3 224 224 224v144c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16V320C288 196.3 187.7 96 64 96zm384-64c-84.2 0-157.4 46.5-195.7 115.2 27.7 30.2 48.2 66.9 59 107.6C424 243.1 512 147.9 512 32h-64z"}}]})(e)}function Gz(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M480 160H32c-17.673 0-32-14.327-32-32V64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm112 248H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm112 248H32c-17.673 0-32-14.327-32-32v-64c0-17.673 14.327-32 32-32h448c17.673 0 32 14.327 32 32v64c0 17.673-14.327 32-32 32zm-48-88c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24zm-64 0c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24z"}}]})(e)}function qz(e){return st({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M352 320c-22.608 0-43.387 7.819-59.79 20.895l-102.486-64.054a96.551 96.551 0 0 0 0-41.683l102.486-64.054C308.613 184.181 329.392 192 352 192c53.019 0 96-42.981 96-96S405.019 0 352 0s-96 42.981-96 96c0 7.158.79 14.13 2.276 20.841L155.79 180.895C139.387 167.819 118.608 160 96 160c-53.019 0-96 42.981-96 96s42.981 96 96 96c22.608 0 43.387-7.819 59.79-20.895l102.486 64.054A96.301 96.301 0 0 0 256 416c0 53.019 42.981 96 96 96s96-42.981 96-96-42.981-96-96-96z"}}]})(e)}function rp(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M503.691 189.836L327.687 37.851C312.281 24.546 288 35.347 288 56.015v80.053C127.371 137.907 0 170.1 0 322.326c0 61.441 39.581 122.309 83.333 154.132 13.653 9.931 33.111-2.533 28.077-18.631C66.066 312.814 132.917 274.316 288 272.085V360c0 20.7 24.3 31.453 39.687 18.164l176.004-152c11.071-9.562 11.086-26.753 0-36.328z"}}]})(e)}function I1(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M496 384H160v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h80v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h336c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160h-80v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h336v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h80c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160H288V48c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16C7.2 64 0 71.2 0 80v32c0 8.8 7.2 16 16 16h208v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h208c8.8 0 16-7.2 16-16V80c0-8.8-7.2-16-16-16z"}}]})(e)}function Kz(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M256 160c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96zm246.4 80.5l-94.7-47.3 33.5-100.4c4.5-13.6-8.4-26.5-21.9-21.9l-100.4 33.5-47.4-94.8c-6.4-12.8-24.6-12.8-31 0l-47.3 94.7L92.7 70.8c-13.6-4.5-26.5 8.4-21.9 21.9l33.5 100.4-94.7 47.4c-12.8 6.4-12.8 24.6 0 31l94.7 47.3-33.5 100.5c-4.5 13.6 8.4 26.5 21.9 21.9l100.4-33.5 47.3 94.7c6.4 12.8 24.6 12.8 31 0l47.3-94.7 100.4 33.5c13.6 4.5 26.5-8.4 21.9-21.9l-33.5-100.4 94.7-47.3c13-6.5 13-24.7.2-31.1zm-155.9 106c-49.9 49.9-131.1 49.9-181 0-49.9-49.9-49.9-131.1 0-181 49.9-49.9 131.1-49.9 181 0 49.9 49.9 49.9 131.1 0 181z"}}]})(e)}function vo(e){return st({tag:"svg",attr:{viewBox:"0 0 448 512"},child:[{tag:"path",attr:{d:"M432 32H312l-9.4-18.7A24 24 0 0 0 281.1 0H166.8a23.72 23.72 0 0 0-21.4 13.3L136 32H16A16 16 0 0 0 0 48v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16V48a16 16 0 0 0-16-16zM53.2 467a48 48 0 0 0 47.9 45h245.8a48 48 0 0 0 47.9-45L416 128H32z"}}]})(e)}function O1(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M212.333 224.333H12c-6.627 0-12-5.373-12-12V12C0 5.373 5.373 0 12 0h48c6.627 0 12 5.373 12 12v78.112C117.773 39.279 184.26 7.47 258.175 8.007c136.906.994 246.448 111.623 246.157 248.532C504.041 393.258 393.12 504 256.333 504c-64.089 0-122.496-24.313-166.51-64.215-5.099-4.622-5.334-12.554-.467-17.42l33.967-33.967c4.474-4.474 11.662-4.717 16.401-.525C170.76 415.336 211.58 432 256.333 432c97.268 0 176-78.716 176-176 0-97.267-78.716-176-176-176-58.496 0-110.28 28.476-142.274 72.333h98.274c6.627 0 12 5.373 12 12v48c0 6.627-5.373 12-12 12z"}}]})(e)}function jh(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M296 384h-80c-13.3 0-24-10.7-24-24V192h-87.7c-17.8 0-26.7-21.5-14.1-34.1L242.3 5.7c7.5-7.5 19.8-7.5 27.3 0l152.2 152.2c12.6 12.6 3.7 34.1-14.1 34.1H320v168c0 13.3-10.7 24-24 24zm216-8v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h136v8c0 30.9 25.1 56 56 56h80c30.9 0 56-25.1 56-56v-8h136c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z"}}]})(e)}function R1(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M507.73 109.1c-2.24-9.03-13.54-12.09-20.12-5.51l-74.36 74.36-67.88-11.31-11.31-67.88 74.36-74.36c6.62-6.62 3.43-17.9-5.66-20.16-47.38-11.74-99.55.91-136.58 37.93-39.64 39.64-50.55 97.1-34.05 147.2L18.74 402.76c-24.99 24.99-24.99 65.51 0 90.5 24.99 24.99 65.51 24.99 90.5 0l213.21-213.21c50.12 16.71 107.47 5.68 147.37-34.22 37.07-37.07 49.7-89.32 37.91-136.73zM64 472c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z"}}]})(e)}var Yz=hc({displayName:"EditIcon",path:i.jsxs("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeWidth:"2",children:[i.jsx("path",{d:"M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"}),i.jsx("path",{d:"M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"})]})}),M1=hc({displayName:"ExternalLinkIcon",path:i.jsxs("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeWidth:"2",children:[i.jsx("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),i.jsx("path",{d:"M15 3h6v6"}),i.jsx("path",{d:"M10 14L21 3"})]})}),T1=hc({d:"M12 8l-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z",displayName:"ChevronUpIcon"}),Xz=hc({displayName:"CloseIcon",d:"M.439,21.44a1.5,1.5,0,0,0,2.122,2.121L11.823,14.3a.25.25,0,0,1,.354,0l9.262,9.263a1.5,1.5,0,1,0,2.122-2.121L14.3,12.177a.25.25,0,0,1,0-.354l9.263-9.262A1.5,1.5,0,0,0,21.439.44L12.177,9.7a.25.25,0,0,1-.354,0L2.561.44A1.5,1.5,0,0,0,.439,2.561L9.7,11.823a.25.25,0,0,1,0,.354Z"}),Qz=hc({displayName:"DeleteIcon",path:i.jsx("g",{fill:"currentColor",children:i.jsx("path",{d:"M19.452 7.5H4.547a.5.5 0 00-.5.545l1.287 14.136A2 2 0 007.326 24h9.347a2 2 0 001.992-1.819L19.95 8.045a.5.5 0 00-.129-.382.5.5 0 00-.369-.163zm-9.2 13a.75.75 0 01-1.5 0v-9a.75.75 0 011.5 0zm5 0a.75.75 0 01-1.5 0v-9a.75.75 0 011.5 0zM22 4h-4.75a.25.25 0 01-.25-.25V2.5A2.5 2.5 0 0014.5 0h-5A2.5 2.5 0 007 2.5v1.25a.25.25 0 01-.25.25H2a1 1 0 000 2h20a1 1 0 000-2zM9 3.75V2.5a.5.5 0 01.5-.5h5a.5.5 0 01.5.5v1.25a.25.25 0 01-.25.25h-5.5A.25.25 0 019 3.75z"})})}),Zz=hc({displayName:"ChevronDownIcon",d:"M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6z"});const Jz=D7(e=>{e(d3(!0))},300),ks=()=>(e,t)=>{Sr(t())==="unifiedCanvas"&&Jz(e)};var cu=globalThis&&globalThis.__assign||function(){return cu=Object.assign||function(e){for(var t,n=1,r=arguments.length;ne.image?i.jsx(g1,{sx:{w:`${e.image.width}px`,h:"auto",objectFit:"contain",aspectRatio:`${e.image.width}/${e.image.height}`}}):i.jsx(H,{sx:{opacity:.7,w:"full",h:"full",alignItems:"center",justifyContent:"center",borderRadius:"base",bg:"base.200",_dark:{bg:"base.900"}},children:i.jsx(ai,{size:"xl"})}),bc=e=>{const{icon:t=qu,boxSize:n=16}=e;return i.jsxs(H,{sx:{w:"full",h:"full",alignItems:"center",justifyContent:"center",borderRadius:"base",flexDir:"column",gap:2,userSelect:"none",color:"base.700",_dark:{color:"base.500"},...e.sx},children:[i.jsx(mo,{as:t,boxSize:n,opacity:.7}),e.label&&i.jsx(Ue,{textAlign:"center",children:e.label})]})};var jP={exports:{}},EP={};const Io=z0(RO),Bc=z0(MO),t$=z0(TO);(function(e){var t,n,r=gl&&gl.__generator||function(K,J){var ue,be,Se,Qe,pt={label:0,sent:function(){if(1&Se[0])throw Se[1];return Se[1]},trys:[],ops:[]};return Qe={next:zt(0),throw:zt(1),return:zt(2)},typeof Symbol=="function"&&(Qe[Symbol.iterator]=function(){return this}),Qe;function zt(lt){return function(He){return function(Ke){if(ue)throw new TypeError("Generator is already executing.");for(;pt;)try{if(ue=1,be&&(Se=2&Ke[0]?be.return:Ke[0]?be.throw||((Se=be.return)&&Se.call(be),0):be.next)&&!(Se=Se.call(be,Ke[1])).done)return Se;switch(be=0,Se&&(Ke=[2&Ke[0],Se.value]),Ke[0]){case 0:case 1:Se=Ke;break;case 4:return pt.label++,{value:Ke[1],done:!1};case 5:pt.label++,be=Ke[1],Ke=[0];continue;case 7:Ke=pt.ops.pop(),pt.trys.pop();continue;default:if(!((Se=(Se=pt.trys).length>0&&Se[Se.length-1])||Ke[0]!==6&&Ke[0]!==2)){pt=0;continue}if(Ke[0]===3&&(!Se||Ke[1]>Se[0]&&Ke[1]=200&&K.status<=299},V=function(K){return/ion\/(vnd\.api\+)?json/.test(K.get("content-type")||"")};function $(K){if(!(0,A.isPlainObject)(K))return K;for(var J=S({},K),ue=0,be=Object.entries(J);ue"u"&&pt===L&&console.warn("Warning: `fetch` is not available. Please supply a custom `fetchFn` property to use `fetchBaseQuery` on SSR environments."),function(Ft,je){return I(J,null,function(){var ht,Mt,Tt,$t,dn,Vt,Qt,Cn,Ir,Yn,wt,Sn,_n,Xn,dr,Rn,Mn,tn,gn,wn,fn,pn,Ve,Pt,gt,tt,mt,Dt,dt,Je,Ee,_e,Te,ze,Ze,jt;return r(this,function(kt){switch(kt.label){case 0:return ht=je.signal,Mt=je.getState,Tt=je.extra,$t=je.endpoint,dn=je.forced,Vt=je.type,Ir=(Cn=typeof Ft=="string"?{url:Ft}:Ft).url,wt=(Yn=Cn.headers)===void 0?new Headers(Lt.headers):Yn,_n=(Sn=Cn.params)===void 0?void 0:Sn,dr=(Xn=Cn.responseHandler)===void 0?Ct??"json":Xn,Mn=(Rn=Cn.validateStatus)===void 0?Rt??D:Rn,gn=(tn=Cn.timeout)===void 0?St:tn,wn=j(Cn,["url","headers","params","responseHandler","validateStatus","timeout"]),fn=S(P(S({},Lt),{signal:ht}),wn),wt=new Headers($(wt)),pn=fn,[4,Se(wt,{getState:Mt,extra:Tt,endpoint:$t,forced:dn,type:Vt})];case 1:pn.headers=kt.sent()||wt,Ve=function($e){return typeof $e=="object"&&((0,A.isPlainObject)($e)||Array.isArray($e)||typeof $e.toJSON=="function")},!fn.headers.has("content-type")&&Ve(fn.body)&&fn.headers.set("content-type",Ce),Ve(fn.body)&&He(fn.headers)&&(fn.body=JSON.stringify(fn.body,We)),_n&&(Pt=~Ir.indexOf("?")?"&":"?",gt=zt?zt(_n):new URLSearchParams($(_n)),Ir+=Pt+gt),Ir=function($e,Gt){if(!$e)return Gt;if(!Gt)return $e;if(function(rn){return new RegExp("(^|:)//").test(rn)}(Gt))return Gt;var hn=$e.endsWith("/")||!Gt.startsWith("?")?"/":"";return $e=function(rn){return rn.replace(/\/$/,"")}($e),""+$e+hn+function(rn){return rn.replace(/^\//,"")}(Gt)}(ue,Ir),tt=new Request(Ir,fn),mt=tt.clone(),Qt={request:mt},dt=!1,Je=gn&&setTimeout(function(){dt=!0,je.abort()},gn),kt.label=2;case 2:return kt.trys.push([2,4,5,6]),[4,pt(tt)];case 3:return Dt=kt.sent(),[3,6];case 4:return Ee=kt.sent(),[2,{error:{status:dt?"TIMEOUT_ERROR":"FETCH_ERROR",error:String(Ee)},meta:Qt}];case 5:return Je&&clearTimeout(Je),[7];case 6:_e=Dt.clone(),Qt.response=_e,ze="",kt.label=7;case 7:return kt.trys.push([7,9,,10]),[4,Promise.all([Ut(Dt,dr).then(function($e){return Te=$e},function($e){return Ze=$e}),_e.text().then(function($e){return ze=$e},function(){})])];case 8:if(kt.sent(),Ze)throw Ze;return[3,10];case 9:return jt=kt.sent(),[2,{error:{status:"PARSING_ERROR",originalStatus:Dt.status,data:ze,error:String(jt)},meta:Qt}];case 10:return[2,Mn(Dt,Te)?{data:Te,meta:Qt}:{error:{status:Dt.status,data:Te},meta:Qt}]}})})};function Ut(Ft,je){return I(this,null,function(){var ht;return r(this,function(Mt){switch(Mt.label){case 0:return typeof je=="function"?[2,je(Ft)]:(je==="content-type"&&(je=He(Ft.headers)?"json":"text"),je!=="json"?[3,2]:[4,Ft.text()]);case 1:return[2,(ht=Mt.sent()).length?JSON.parse(ht):null];case 2:return[2,Ft.text()]}})})}}var U=function(K,J){J===void 0&&(J=void 0),this.value=K,this.meta=J};function X(K,J){return K===void 0&&(K=0),J===void 0&&(J=5),I(this,null,function(){var ue,be;return r(this,function(Se){switch(Se.label){case 0:return ue=Math.min(K,J),be=~~((Math.random()+.4)*(300<=_e)}var wn=(0,Ye.createAsyncThunk)(_n+"/executeQuery",tn,{getPendingMeta:function(){var Ve;return(Ve={startedTimeStamp:Date.now()})[Ye.SHOULD_AUTOBATCH]=!0,Ve},condition:function(Ve,Pt){var gt,tt,mt,Dt=(0,Pt.getState)(),dt=(tt=(gt=Dt[_n])==null?void 0:gt.queries)==null?void 0:tt[Ve.queryCacheKey],Je=dt==null?void 0:dt.fulfilledTimeStamp,Ee=Ve.originalArgs,_e=dt==null?void 0:dt.originalArgs,Te=dr[Ve.endpointName];return!(!Oe(Ve)&&((dt==null?void 0:dt.status)==="pending"||!gn(Ve,Dt)&&(!se(Te)||!((mt=Te==null?void 0:Te.forceRefetch)!=null&&mt.call(Te,{currentArg:Ee,previousArg:_e,endpointState:dt,state:Dt})))&&Je))},dispatchConditionRejection:!0}),fn=(0,Ye.createAsyncThunk)(_n+"/executeMutation",tn,{getPendingMeta:function(){var Ve;return(Ve={startedTimeStamp:Date.now()})[Ye.SHOULD_AUTOBATCH]=!0,Ve}});function pn(Ve){return function(Pt){var gt,tt;return((tt=(gt=Pt==null?void 0:Pt.meta)==null?void 0:gt.arg)==null?void 0:tt.endpointName)===Ve}}return{queryThunk:wn,mutationThunk:fn,prefetch:function(Ve,Pt,gt){return function(tt,mt){var Dt=function(Te){return"force"in Te}(gt)&>.force,dt=function(Te){return"ifOlderThan"in Te}(gt)&>.ifOlderThan,Je=function(Te){return Te===void 0&&(Te=!0),Mn.endpoints[Ve].initiate(Pt,{forceRefetch:Te})},Ee=Mn.endpoints[Ve].select(Pt)(mt());if(Dt)tt(Je());else if(dt){var _e=Ee==null?void 0:Ee.fulfilledTimeStamp;if(!_e)return void tt(Je());(Number(new Date)-Number(new Date(_e)))/1e3>=dt&&tt(Je())}else tt(Je(!1))}},updateQueryData:function(Ve,Pt,gt){return function(tt,mt){var Dt,dt,Je=Mn.endpoints[Ve].select(Pt)(mt()),Ee={patches:[],inversePatches:[],undo:function(){return tt(Mn.util.patchQueryData(Ve,Pt,Ee.inversePatches))}};if(Je.status===t.uninitialized)return Ee;if("data"in Je)if((0,Fe.isDraftable)(Je.data)){var _e=(0,Fe.produceWithPatches)(Je.data,gt),Te=_e[2];(Dt=Ee.patches).push.apply(Dt,_e[1]),(dt=Ee.inversePatches).push.apply(dt,Te)}else{var ze=gt(Je.data);Ee.patches.push({op:"replace",path:[],value:ze}),Ee.inversePatches.push({op:"replace",path:[],value:Je.data})}return tt(Mn.util.patchQueryData(Ve,Pt,Ee.patches)),Ee}},upsertQueryData:function(Ve,Pt,gt){return function(tt){var mt;return tt(Mn.endpoints[Ve].initiate(Pt,((mt={subscribe:!1,forceRefetch:!0})[ye]=function(){return{data:gt}},mt)))}},patchQueryData:function(Ve,Pt,gt){return function(tt){tt(Mn.internalActions.queryResultPatched({queryCacheKey:Rn({queryArgs:Pt,endpointDefinition:dr[Ve],endpointName:Ve}),patches:gt}))}},buildMatchThunkActions:function(Ve,Pt){return{matchPending:(0,at.isAllOf)((0,at.isPending)(Ve),pn(Pt)),matchFulfilled:(0,at.isAllOf)((0,at.isFulfilled)(Ve),pn(Pt)),matchRejected:(0,at.isAllOf)((0,at.isRejected)(Ve),pn(Pt))}}}}({baseQuery:be,reducerPath:Se,context:ue,api:K,serializeQueryArgs:Qe}),We=Ce.queryThunk,St=Ce.mutationThunk,Ct=Ce.patchQueryData,Rt=Ce.updateQueryData,Lt=Ce.upsertQueryData,Ut=Ce.prefetch,Ft=Ce.buildMatchThunkActions,je=function(wt){var Sn=wt.reducerPath,_n=wt.queryThunk,Xn=wt.mutationThunk,dr=wt.context,Rn=dr.endpointDefinitions,Mn=dr.apiUid,tn=dr.extractRehydrationInfo,gn=dr.hasRehydrationInfo,wn=wt.assertTagType,fn=wt.config,pn=(0,ke.createAction)(Sn+"/resetApiState"),Ve=(0,ke.createSlice)({name:Sn+"/queries",initialState:Ne,reducers:{removeQueryResult:{reducer:function(Je,Ee){delete Je[Ee.payload.queryCacheKey]},prepare:(0,ke.prepareAutoBatched)()},queryResultPatched:function(Je,Ee){var _e=Ee.payload,Te=_e.patches;we(Je,_e.queryCacheKey,function(ze){ze.data=(0,Q.applyPatches)(ze.data,Te.concat())})}},extraReducers:function(Je){Je.addCase(_n.pending,function(Ee,_e){var Te,ze=_e.meta,Ze=_e.meta.arg,jt=Oe(Ze);(Ze.subscribe||jt)&&(Ee[Te=Ze.queryCacheKey]!=null||(Ee[Te]={status:t.uninitialized,endpointName:Ze.endpointName})),we(Ee,Ze.queryCacheKey,function(kt){kt.status=t.pending,kt.requestId=jt&&kt.requestId?kt.requestId:ze.requestId,Ze.originalArgs!==void 0&&(kt.originalArgs=Ze.originalArgs),kt.startedTimeStamp=ze.startedTimeStamp})}).addCase(_n.fulfilled,function(Ee,_e){var Te=_e.meta,ze=_e.payload;we(Ee,Te.arg.queryCacheKey,function(Ze){var jt;if(Ze.requestId===Te.requestId||Oe(Te.arg)){var kt=Rn[Te.arg.endpointName].merge;if(Ze.status=t.fulfilled,kt)if(Ze.data!==void 0){var $e=Te.fulfilledTimeStamp,Gt=Te.arg,hn=Te.baseQueryMeta,rn=Te.requestId,fr=(0,ke.createNextState)(Ze.data,function(Bn){return kt(Bn,ze,{arg:Gt.originalArgs,baseQueryMeta:hn,fulfilledTimeStamp:$e,requestId:rn})});Ze.data=fr}else Ze.data=ze;else Ze.data=(jt=Rn[Te.arg.endpointName].structuralSharing)==null||jt?M((0,Fn.isDraft)(Ze.data)?(0,Q.original)(Ze.data):Ze.data,ze):ze;delete Ze.error,Ze.fulfilledTimeStamp=Te.fulfilledTimeStamp}})}).addCase(_n.rejected,function(Ee,_e){var Te=_e.meta,ze=Te.condition,Ze=Te.requestId,jt=_e.error,kt=_e.payload;we(Ee,Te.arg.queryCacheKey,function($e){if(!ze){if($e.requestId!==Ze)return;$e.status=t.rejected,$e.error=kt??jt}})}).addMatcher(gn,function(Ee,_e){for(var Te=tn(_e).queries,ze=0,Ze=Object.entries(Te);ze"u"||navigator.onLine===void 0||navigator.onLine,focused:typeof document>"u"||document.visibilityState!=="hidden",middlewareRegistered:!1},fn),reducers:{middlewareRegistered:function(Je,Ee){Je.middlewareRegistered=Je.middlewareRegistered!=="conflict"&&Mn===Ee.payload||"conflict"}},extraReducers:function(Je){Je.addCase(ve,function(Ee){Ee.online=!0}).addCase(le,function(Ee){Ee.online=!1}).addCase(q,function(Ee){Ee.focused=!0}).addCase(ne,function(Ee){Ee.focused=!1}).addMatcher(gn,function(Ee){return S({},Ee)})}}),dt=(0,ke.combineReducers)({queries:Ve.reducer,mutations:Pt.reducer,provided:gt.reducer,subscriptions:mt.reducer,config:Dt.reducer});return{reducer:function(Je,Ee){return dt(pn.match(Ee)?void 0:Je,Ee)},actions:P(S(S(S(S(S({},Dt.actions),Ve.actions),tt.actions),mt.actions),Pt.actions),{unsubscribeMutationResult:Pt.actions.removeMutationResult,resetApiState:pn})}}({context:ue,queryThunk:We,mutationThunk:St,reducerPath:Se,assertTagType:Ke,config:{refetchOnFocus:lt,refetchOnReconnect:He,refetchOnMountOrArgChange:zt,keepUnusedDataFor:pt,reducerPath:Se}}),ht=je.reducer,Mt=je.actions;Er(K.util,{patchQueryData:Ct,updateQueryData:Rt,upsertQueryData:Lt,prefetch:Ut,resetApiState:Mt.resetApiState}),Er(K.internalActions,Mt);var Tt=function(wt){var Sn=wt.reducerPath,_n=wt.queryThunk,Xn=wt.api,dr=wt.context,Rn=dr.apiUid,Mn={invalidateTags:(0,yr.createAction)(Sn+"/invalidateTags")},tn=[$n,cn,wr,kn,un,$o];return{middleware:function(wn){var fn=!1,pn=P(S({},wt),{internalState:{currentSubscriptions:{}},refetchQuery:gn}),Ve=tn.map(function(tt){return tt(pn)}),Pt=function(tt){var mt=tt.api,Dt=tt.queryThunk,dt=tt.internalState,Je=mt.reducerPath+"/subscriptions",Ee=null,_e=!1,Te=mt.internalActions,ze=Te.updateSubscriptionOptions,Ze=Te.unsubscribeQueryResult;return function(jt,kt){var $e,Gt;if(Ee||(Ee=JSON.parse(JSON.stringify(dt.currentSubscriptions))),mt.util.resetApiState.match(jt))return Ee=dt.currentSubscriptions={},[!0,!1];if(mt.internalActions.internal_probeSubscription.match(jt)){var hn=jt.payload;return[!1,!!(($e=dt.currentSubscriptions[hn.queryCacheKey])!=null&&$e[hn.requestId])]}var rn=function(sn,Ln){var Zr,nn,Tn,$r,Or,ja,ed,ko,Js;if(ze.match(Ln)){var Rs=Ln.payload,ea=Rs.queryCacheKey,Jr=Rs.requestId;return(Zr=sn==null?void 0:sn[ea])!=null&&Zr[Jr]&&(sn[ea][Jr]=Rs.options),!0}if(Ze.match(Ln)){var eo=Ln.payload;return Jr=eo.requestId,sn[ea=eo.queryCacheKey]&&delete sn[ea][Jr],!0}if(mt.internalActions.removeQueryResult.match(Ln))return delete sn[Ln.payload.queryCacheKey],!0;if(Dt.pending.match(Ln)){var to=Ln.meta;if(Jr=to.requestId,(Hr=to.arg).subscribe)return(Fo=(Tn=sn[nn=Hr.queryCacheKey])!=null?Tn:sn[nn]={})[Jr]=(Or=($r=Hr.subscriptionOptions)!=null?$r:Fo[Jr])!=null?Or:{},!0}if(Dt.rejected.match(Ln)){var Fo,_o=Ln.meta,Hr=_o.arg;if(Jr=_o.requestId,_o.condition&&Hr.subscribe)return(Fo=(ed=sn[ja=Hr.queryCacheKey])!=null?ed:sn[ja]={})[Jr]=(Js=(ko=Hr.subscriptionOptions)!=null?ko:Fo[Jr])!=null?Js:{},!0}return!1}(dt.currentSubscriptions,jt);if(rn){_e||(ka(function(){var sn=JSON.parse(JSON.stringify(dt.currentSubscriptions)),Ln=(0,ls.produceWithPatches)(Ee,function(){return sn});kt.next(mt.internalActions.subscriptionsUpdated(Ln[1])),Ee=sn,_e=!1}),_e=!0);var fr=!!((Gt=jt.type)!=null&&Gt.startsWith(Je)),Bn=Dt.rejected.match(jt)&&jt.meta.condition&&!!jt.meta.arg.subscribe;return[!fr&&!Bn,!1]}return[!0,!1]}}(pn),gt=function(tt){var mt=tt.reducerPath,Dt=tt.context,dt=tt.refetchQuery,Je=tt.internalState,Ee=tt.api.internalActions.removeQueryResult;function _e(Te,ze){var Ze=Te.getState()[mt],jt=Ze.queries,kt=Je.currentSubscriptions;Dt.batch(function(){for(var $e=0,Gt=Object.keys(kt);$e{const{isOver:t,label:n="Drop"}=e,r=p.useRef(Ti()),{colorMode:o}=xo();return i.jsx(bo.div,{initial:{opacity:0},animate:{opacity:1,transition:{duration:.1}},exit:{opacity:0,transition:{duration:.1}},children:i.jsxs(H,{sx:{position:"absolute",top:0,insetInlineStart:0,w:"full",h:"full"},children:[i.jsx(H,{sx:{position:"absolute",top:0,insetInlineStart:0,w:"full",h:"full",bg:Me("base.700","base.900")(o),opacity:.7,borderRadius:"base",alignItems:"center",justifyContent:"center",transitionProperty:"common",transitionDuration:"0.1s"}}),i.jsx(H,{sx:{position:"absolute",top:0,insetInlineStart:0,w:"full",h:"full",opacity:1,borderWidth:3,borderColor:t?Me("base.50","base.200")(o):Me("base.100","base.500")(o),borderRadius:"base",borderStyle:"dashed",transitionProperty:"common",transitionDuration:"0.1s",alignItems:"center",justifyContent:"center"},children:i.jsx(Ue,{sx:{fontSize:"2xl",fontWeight:600,transform:t?"scale(1.02)":"scale(1)",color:t?Me("base.50","base.50")(o):Me("base.100","base.200")(o),transitionProperty:"common",transitionDuration:"0.1s"},children:n})})]})},r.current)},Ql=p.memo(n$),IP=p.memo(({board:e,isSelected:t})=>{const n=re(),{currentData:r}=Vs(e.cover_image_name??ga.skipToken),{colorMode:o}=xo(),{board_name:s,board_id:a}=e,{onClickDeleteBoardImages:u}=p.useContext(f3),d=p.useCallback(()=>{n(p3(a))},[a,n]),[f,{isLoading:h}]=DO(),[m,{isLoading:v}]=AO(),b=E=>{f({board_id:a,changes:{board_name:E}})},w=p.useCallback(()=>{m(a)},[a,m]),C=p.useCallback(()=>{console.log({board:e}),u(e)},[e,u]),S={id:a,actionType:"MOVE_BOARD",context:{boardId:a}},{isOver:P,setNodeRef:k,active:j}=Au({id:`board_droppable_${a}`,data:S});return i.jsx(qe,{sx:{touchAction:"none",height:"full"},children:i.jsx(_P,{menuProps:{size:"sm",isLazy:!0},renderMenu:()=>i.jsxs(Vu,{sx:{visibility:"visible !important"},children:[e.image_count>0&&i.jsx(ro,{sx:{color:"error.300"},icon:i.jsx(vo,{}),onClickCapture:C,children:"Delete Board and Images"}),i.jsx(ro,{sx:{color:Me("error.700","error.300")(o)},icon:i.jsx(vo,{}),onClickCapture:w,children:"Delete Board"})]}),children:E=>i.jsxs(H,{userSelect:"none",ref:E,sx:{flexDir:"column",justifyContent:"space-between",alignItems:"center",cursor:"pointer",w:"full",h:"full"},children:[i.jsxs(H,{ref:k,onClick:d,sx:{position:"relative",justifyContent:"center",alignItems:"center",borderRadius:"base",w:"full",aspectRatio:"1/1",overflow:"hidden",shadow:t?"selected.light":void 0,_dark:{shadow:t?"selected.dark":void 0},flexShrink:0},children:[e.cover_image_name&&(r==null?void 0:r.image_url)&&i.jsx(Nu,{src:r==null?void 0:r.image_url,draggable:!1}),!(e.cover_image_name&&(r!=null&&r.image_url))&&i.jsx(bc,{boxSize:8,icon:Tf,sx:{border:"2px solid var(--invokeai-colors-base-200)",_dark:{border:"2px solid var(--invokeai-colors-base-800)"}}}),i.jsx(H,{sx:{position:"absolute",insetInlineEnd:0,top:0,p:1},children:i.jsx(Xl,{variant:"solid",children:e.image_count})}),i.jsx(Ao,{children:Gl(S,j)&&i.jsx(Ql,{isOver:P})})]}),i.jsx(H,{sx:{width:"full",height:"full",justifyContent:"center",alignItems:"center"},children:i.jsxs(I5,{defaultValue:s,submitOnBlur:!1,onSubmit:I=>{b(I)},children:[i.jsx(_5,{sx:{color:t?Me("base.900","base.50")(o):Me("base.700","base.200")(o),fontWeight:t?600:void 0,fontSize:"xs",textAlign:"center",p:0},noOfLines:1}),i.jsx(k5,{sx:{color:Me("base.900","base.50")(o),fontSize:"xs",borderColor:Me("base.500","base.500")(o),p:0,outline:0}})]})})]},a)})})});IP.displayName="HoverableBoard";/*! + * OverlayScrollbars + * Version: 2.2.0 + * + * Copyright (c) Rene Haas | KingSora. + * https://github.com/KingSora + * + * Released under the MIT license. + */function bn(e,t){if(Ih(e))for(let n=0;nt(e[n],n,e));return e}function Kr(e,t){const n=ci(t);if(js(t)||n){let o=n?"":{};if(e){const s=window.getComputedStyle(e,null);o=n?Q2(e,s,t):t.reduce((a,u)=>(a[u]=Q2(e,s,u),a),o)}return o}e&&bn(Do(t),o=>y$(e,o,t[o]))}const ms=(e,t)=>{const{o:n,u:r,_:o}=e;let s=n,a;const u=(h,m)=>{const v=s,b=h,w=m||(r?!r(v,b):v!==b);return(w||o)&&(s=b,a=v),[s,w,a]};return[t?h=>u(t(s,a),h):u,h=>[s,!!h,a]]},Ku=()=>typeof window<"u",OP=Ku()&&Node.ELEMENT_NODE,{toString:r$,hasOwnProperty:Rg}=Object.prototype,Ca=e=>e===void 0,Eh=e=>e===null,o$=e=>Ca(e)||Eh(e)?`${e}`:r$.call(e).replace(/^\[object (.+)\]$/,"$1").toLowerCase(),Xa=e=>typeof e=="number",ci=e=>typeof e=="string",D1=e=>typeof e=="boolean",_s=e=>typeof e=="function",js=e=>Array.isArray(e),Pu=e=>typeof e=="object"&&!js(e)&&!Eh(e),Ih=e=>{const t=!!e&&e.length,n=Xa(t)&&t>-1&&t%1==0;return js(e)||!_s(e)&&n?t>0&&Pu(e)?t-1 in e:!0:!1},Vv=e=>{if(!e||!Pu(e)||o$(e)!=="object")return!1;let t;const n="constructor",r=e[n],o=r&&r.prototype,s=Rg.call(e,n),a=o&&Rg.call(o,"isPrototypeOf");if(r&&!s&&!a)return!1;for(t in e);return Ca(t)||Rg.call(e,t)},op=e=>{const t=HTMLElement;return e?t?e instanceof t:e.nodeType===OP:!1},Oh=e=>{const t=Element;return e?t?e instanceof t:e.nodeType===OP:!1},A1=(e,t,n)=>e.indexOf(t,n),On=(e,t,n)=>(!n&&!ci(t)&&Ih(t)?Array.prototype.push.apply(e,t):e.push(t),e),Vi=e=>{const t=Array.from,n=[];return t&&e?t(e):(e instanceof Set?e.forEach(r=>{On(n,r)}):bn(e,r=>{On(n,r)}),n)},N1=e=>!!e&&e.length===0,Xs=(e,t,n)=>{bn(e,o=>o&&o.apply(void 0,t||[])),!n&&(e.length=0)},Rh=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),Do=e=>e?Object.keys(e):[],lr=(e,t,n,r,o,s,a)=>{const u=[t,n,r,o,s,a];return(typeof e!="object"||Eh(e))&&!_s(e)&&(e={}),bn(u,d=>{bn(Do(d),f=>{const h=d[f];if(e===h)return!0;const m=js(h);if(h&&(Vv(h)||m)){const v=e[f];let b=v;m&&!js(v)?b=[]:!m&&!Vv(v)&&(b={}),e[f]=lr(b,h)}else e[f]=h})}),e},z1=e=>{for(const t in e)return!1;return!0},RP=(e,t,n,r)=>{if(Ca(r))return n?n[e]:t;n&&(ci(r)||Xa(r))&&(n[e]=r)},qr=(e,t,n)=>{if(Ca(n))return e?e.getAttribute(t):null;e&&e.setAttribute(t,n)},fo=(e,t)=>{e&&e.removeAttribute(t)},Ni=(e,t,n,r)=>{if(n){const o=qr(e,t)||"",s=new Set(o.split(" "));s[r?"add":"delete"](n);const a=Vi(s).join(" ").trim();qr(e,t,a)}},s$=(e,t,n)=>{const r=qr(e,t)||"";return new Set(r.split(" ")).has(n)},bs=(e,t)=>RP("scrollLeft",0,e,t),ca=(e,t)=>RP("scrollTop",0,e,t),Uv=Ku()&&Element.prototype,MP=(e,t)=>{const n=[],r=t?Oh(t)?t:null:document;return r?On(n,r.querySelectorAll(e)):n},a$=(e,t)=>{const n=t?Oh(t)?t:null:document;return n?n.querySelector(e):null},sp=(e,t)=>Oh(e)?(Uv.matches||Uv.msMatchesSelector).call(e,t):!1,$1=e=>e?Vi(e.childNodes):[],va=e=>e?e.parentElement:null,Ol=(e,t)=>{if(Oh(e)){const n=Uv.closest;if(n)return n.call(e,t);do{if(sp(e,t))return e;e=va(e)}while(e)}return null},i$=(e,t,n)=>{const r=e&&Ol(e,t),o=e&&a$(n,r),s=Ol(o,t)===r;return r&&o?r===e||o===e||s&&Ol(Ol(e,n),t)!==r:!1},L1=(e,t,n)=>{if(n&&e){let r=t,o;Ih(n)?(o=document.createDocumentFragment(),bn(n,s=>{s===r&&(r=s.previousSibling),o.appendChild(s)})):o=n,t&&(r?r!==t&&(r=r.nextSibling):r=e.firstChild),e.insertBefore(o,r||null)}},es=(e,t)=>{L1(e,null,t)},l$=(e,t)=>{L1(va(e),e,t)},K2=(e,t)=>{L1(va(e),e&&e.nextSibling,t)},Gs=e=>{if(Ih(e))bn(Vi(e),t=>Gs(t));else if(e){const t=va(e);t&&t.removeChild(e)}},zi=e=>{const t=document.createElement("div");return e&&qr(t,"class",e),t},TP=e=>{const t=zi();return t.innerHTML=e.trim(),bn($1(t),n=>Gs(n))},Gv=e=>e.charAt(0).toUpperCase()+e.slice(1),c$=()=>zi().style,u$=["-webkit-","-moz-","-o-","-ms-"],d$=["WebKit","Moz","O","MS","webkit","moz","o","ms"],Mg={},Tg={},f$=e=>{let t=Tg[e];if(Rh(Tg,e))return t;const n=Gv(e),r=c$();return bn(u$,o=>{const s=o.replace(/-/g,"");return!(t=[e,o+e,s+n,Gv(s)+n].find(u=>r[u]!==void 0))}),Tg[e]=t||""},Yu=e=>{if(Ku()){let t=Mg[e]||window[e];return Rh(Mg,e)||(bn(d$,n=>(t=t||window[n+Gv(e)],!t)),Mg[e]=t),t}},p$=Yu("MutationObserver"),Y2=Yu("IntersectionObserver"),Rl=Yu("ResizeObserver"),DP=Yu("cancelAnimationFrame"),AP=Yu("requestAnimationFrame"),ap=Ku()&&window.setTimeout,qv=Ku()&&window.clearTimeout,h$=/[^\x20\t\r\n\f]+/g,NP=(e,t,n)=>{const r=e&&e.classList;let o,s=0,a=!1;if(r&&t&&ci(t)){const u=t.match(h$)||[];for(a=u.length>0;o=u[s++];)a=!!n(r,o)&&a}return a},F1=(e,t)=>{NP(e,t,(n,r)=>n.remove(r))},ua=(e,t)=>(NP(e,t,(n,r)=>n.add(r)),F1.bind(0,e,t)),Mh=(e,t,n,r)=>{if(e&&t){let o=!0;return bn(n,s=>{const a=r?r(e[s]):e[s],u=r?r(t[s]):t[s];a!==u&&(o=!1)}),o}return!1},zP=(e,t)=>Mh(e,t,["w","h"]),$P=(e,t)=>Mh(e,t,["x","y"]),m$=(e,t)=>Mh(e,t,["t","r","b","l"]),X2=(e,t,n)=>Mh(e,t,["width","height"],n&&(r=>Math.round(r))),Jo=()=>{},El=e=>{let t;const n=e?ap:AP,r=e?qv:DP;return[o=>{r(t),t=n(o,_s(e)?e():e)},()=>r(t)]},B1=(e,t)=>{let n,r,o,s=Jo;const{v:a,g:u,p:d}=t||{},f=function(w){s(),qv(n),n=r=void 0,s=Jo,e.apply(this,w)},h=b=>d&&r?d(r,b):b,m=()=>{s!==Jo&&f(h(o)||o)},v=function(){const w=Vi(arguments),C=_s(a)?a():a;if(Xa(C)&&C>=0){const P=_s(u)?u():u,k=Xa(P)&&P>=0,j=C>0?ap:AP,E=C>0?qv:DP,O=h(w)||w,R=f.bind(0,O);s();const M=j(R,C);s=()=>E(M),k&&!n&&(n=ap(m,P)),r=o=O}else f(w)};return v.m=m,v},g$={opacity:1,zindex:1},Gd=(e,t)=>{const n=t?parseFloat(e):parseInt(e,10);return n===n?n:0},v$=(e,t)=>!g$[e.toLowerCase()]&&Xa(t)?`${t}px`:t,Q2=(e,t,n)=>t!=null?t[n]||t.getPropertyValue(n):e.style[n],y$=(e,t,n)=>{try{const{style:r}=e;Ca(r[t])?r.setProperty(t,n):r[t]=v$(t,n)}catch{}},ku=e=>Kr(e,"direction")==="rtl",Z2=(e,t,n)=>{const r=t?`${t}-`:"",o=n?`-${n}`:"",s=`${r}top${o}`,a=`${r}right${o}`,u=`${r}bottom${o}`,d=`${r}left${o}`,f=Kr(e,[s,a,u,d]);return{t:Gd(f[s],!0),r:Gd(f[a],!0),b:Gd(f[u],!0),l:Gd(f[d],!0)}},{round:J2}=Math,H1={w:0,h:0},Ui=e=>e?{w:e.offsetWidth,h:e.offsetHeight}:H1,Df=e=>e?{w:e.clientWidth,h:e.clientHeight}:H1,ip=e=>e?{w:e.scrollWidth,h:e.scrollHeight}:H1,lp=e=>{const t=parseFloat(Kr(e,"height"))||0,n=parseFloat(Kr(e,"width"))||0;return{w:n-J2(n),h:t-J2(t)}},Va=e=>e.getBoundingClientRect();let qd;const b$=()=>{if(Ca(qd)){qd=!1;try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get(){qd=!0}}))}catch{}}return qd},LP=e=>e.split(" "),x$=(e,t,n,r)=>{bn(LP(t),o=>{e.removeEventListener(o,n,r)})},Dr=(e,t,n,r)=>{var o;const s=b$(),a=(o=s&&r&&r.S)!=null?o:s,u=r&&r.$||!1,d=r&&r.C||!1,f=[],h=s?{passive:a,capture:u}:u;return bn(LP(t),m=>{const v=d?b=>{e.removeEventListener(m,v,u),n&&n(b)}:n;On(f,x$.bind(null,e,m,v,u)),e.addEventListener(m,v,h)}),Xs.bind(0,f)},FP=e=>e.stopPropagation(),BP=e=>e.preventDefault(),S$={x:0,y:0},Dg=e=>{const t=e?Va(e):0;return t?{x:t.left+window.pageYOffset,y:t.top+window.pageXOffset}:S$},eS=(e,t)=>{bn(js(t)?t:[t],e)},W1=e=>{const t=new Map,n=(s,a)=>{if(s){const u=t.get(s);eS(d=>{u&&u[d?"delete":"clear"](d)},a)}else t.forEach(u=>{u.clear()}),t.clear()},r=(s,a)=>{if(ci(s)){const f=t.get(s)||new Set;return t.set(s,f),eS(h=>{_s(h)&&f.add(h)},a),n.bind(0,s,a)}D1(a)&&a&&n();const u=Do(s),d=[];return bn(u,f=>{const h=s[f];h&&On(d,r(f,h))}),Xs.bind(0,d)},o=(s,a)=>{const u=t.get(s);bn(Vi(u),d=>{a&&!N1(a)?d.apply(0,a):d()})};return r(e||{}),[r,n,o]},tS=e=>JSON.stringify(e,(t,n)=>{if(_s(n))throw new Error;return n}),w$={paddingAbsolute:!1,showNativeOverlaidScrollbars:!1,update:{elementEvents:[["img","load"]],debounce:[0,33],attributes:null,ignoreMutation:null},overflow:{x:"scroll",y:"scroll"},scrollbars:{theme:"os-theme-dark",visibility:"auto",autoHide:"never",autoHideDelay:1300,dragScroll:!0,clickScroll:!1,pointers:["mouse","touch","pen"]}},HP=(e,t)=>{const n={},r=Do(t).concat(Do(e));return bn(r,o=>{const s=e[o],a=t[o];if(Pu(s)&&Pu(a))lr(n[o]={},HP(s,a)),z1(n[o])&&delete n[o];else if(Rh(t,o)&&a!==s){let u=!0;if(js(s)||js(a))try{tS(s)===tS(a)&&(u=!1)}catch{}u&&(n[o]=a)}}),n},WP="os-environment",VP=`${WP}-flexbox-glue`,C$=`${VP}-max`,UP="os-scrollbar-hidden",Ag="data-overlayscrollbars-initialize",gs="data-overlayscrollbars",GP=`${gs}-overflow-x`,qP=`${gs}-overflow-y`,Bl="overflowVisible",P$="scrollbarHidden",nS="scrollbarPressed",cp="updating",Fa="data-overlayscrollbars-viewport",Ng="arrange",KP="scrollbarHidden",Hl=Bl,Kv="data-overlayscrollbars-padding",k$=Hl,rS="data-overlayscrollbars-content",V1="os-size-observer",_$=`${V1}-appear`,j$=`${V1}-listener`,E$="os-trinsic-observer",I$="os-no-css-vars",O$="os-theme-none",wo="os-scrollbar",R$=`${wo}-rtl`,M$=`${wo}-horizontal`,T$=`${wo}-vertical`,YP=`${wo}-track`,U1=`${wo}-handle`,D$=`${wo}-visible`,A$=`${wo}-cornerless`,oS=`${wo}-transitionless`,sS=`${wo}-interaction`,aS=`${wo}-unusable`,iS=`${wo}-auto-hidden`,lS=`${wo}-wheel`,N$=`${YP}-interactive`,z$=`${U1}-interactive`,XP={},Gi=()=>XP,$$=e=>{const t=[];return bn(js(e)?e:[e],n=>{const r=Do(n);bn(r,o=>{On(t,XP[o]=n[o])})}),t},L$="__osOptionsValidationPlugin",F$="__osSizeObserverPlugin",G1="__osScrollbarsHidingPlugin",B$="__osClickScrollPlugin";let zg;const cS=(e,t,n,r)=>{es(e,t);const o=Df(t),s=Ui(t),a=lp(n);return r&&Gs(t),{x:s.h-o.h+a.h,y:s.w-o.w+a.w}},H$=e=>{let t=!1;const n=ua(e,UP);try{t=Kr(e,f$("scrollbar-width"))==="none"||window.getComputedStyle(e,"::-webkit-scrollbar").getPropertyValue("display")==="none"}catch{}return n(),t},W$=(e,t)=>{const n="hidden";Kr(e,{overflowX:n,overflowY:n,direction:"rtl"}),bs(e,0);const r=Dg(e),o=Dg(t);bs(e,-999);const s=Dg(t);return{i:r.x===o.x,n:o.x!==s.x}},V$=(e,t)=>{const n=ua(e,VP),r=Va(e),o=Va(t),s=X2(o,r,!0),a=ua(e,C$),u=Va(e),d=Va(t),f=X2(d,u,!0);return n(),a(),s&&f},U$=()=>{const{body:e}=document,n=TP(`
`)[0],r=n.firstChild,[o,,s]=W1(),[a,u]=ms({o:cS(e,n,r),u:$P},cS.bind(0,e,n,r,!0)),[d]=u(),f=H$(n),h={x:d.x===0,y:d.y===0},m={elements:{host:null,padding:!f,viewport:k=>f&&k===k.ownerDocument.body&&k,content:!1},scrollbars:{slot:!0},cancel:{nativeScrollbarsOverlaid:!1,body:null}},v=lr({},w$),b=lr.bind(0,{},v),w=lr.bind(0,{},m),C={k:d,A:h,I:f,L:Kr(n,"zIndex")==="-1",B:W$(n,r),V:V$(n,r),Y:o.bind(0,"z"),j:o.bind(0,"r"),N:w,q:k=>lr(m,k)&&w(),F:b,G:k=>lr(v,k)&&b(),X:lr({},m),U:lr({},v)},S=window.addEventListener,P=B1(k=>s(k?"z":"r"),{v:33,g:99});if(fo(n,"style"),Gs(n),S("resize",P.bind(0,!1)),!f&&(!h.x||!h.y)){let k;S("resize",()=>{const j=Gi()[G1];k=k||j&&j.R(),k&&k(C,a,P.bind(0,!0))})}return C},Co=()=>(zg||(zg=U$()),zg),q1=(e,t)=>_s(t)?t.apply(0,e):t,G$=(e,t,n,r)=>{const o=Ca(r)?n:r;return q1(e,o)||t.apply(0,e)},QP=(e,t,n,r)=>{const o=Ca(r)?n:r,s=q1(e,o);return!!s&&(op(s)?s:t.apply(0,e))},q$=(e,t,n)=>{const{nativeScrollbarsOverlaid:r,body:o}=n||{},{A:s,I:a}=Co(),{nativeScrollbarsOverlaid:u,body:d}=t,f=r??u,h=Ca(o)?d:o,m=(s.x||s.y)&&f,v=e&&(Eh(h)?!a:h);return!!m||!!v},K1=new WeakMap,K$=(e,t)=>{K1.set(e,t)},Y$=e=>{K1.delete(e)},ZP=e=>K1.get(e),uS=(e,t)=>e?t.split(".").reduce((n,r)=>n&&Rh(n,r)?n[r]:void 0,e):void 0,Yv=(e,t,n)=>r=>[uS(e,r),n||uS(t,r)!==void 0],JP=e=>{let t=e;return[()=>t,n=>{t=lr({},t,n)}]},Kd="tabindex",Yd=zi.bind(0,""),$g=e=>{es(va(e),$1(e)),Gs(e)},X$=e=>{const t=Co(),{N:n,I:r}=t,o=Gi()[G1],s=o&&o.T,{elements:a}=n(),{host:u,padding:d,viewport:f,content:h}=a,m=op(e),v=m?{}:e,{elements:b}=v,{host:w,padding:C,viewport:S,content:P}=b||{},k=m?e:v.target,j=sp(k,"textarea"),E=k.ownerDocument,I=E.documentElement,O=k===E.body,R=E.defaultView,M=G$.bind(0,[k]),A=QP.bind(0,[k]),L=q1.bind(0,[k]),D=M.bind(0,Yd,f),V=A.bind(0,Yd,h),$=D(S),F=$===k,U=F&&O,X=!F&&V(P),N=!F&&op($)&&$===X,G=N&&!!L(h),W=G?D():$,q=G?X:V(),ve=U?I:N?W:$,le=j?M(Yd,u,w):k,oe=U?ve:le,Y=N?q:X,ae=E.activeElement,de=!F&&R.top===R&&ae===k,xe={W:k,Z:oe,J:ve,K:!F&&A(Yd,d,C),tt:Y,nt:!F&&!r&&s&&s(t),ot:U?I:ve,st:U?E:ve,et:R,ct:E,rt:j,it:O,lt:m,ut:F,dt:N,ft:(Q,we)=>s$(ve,F?gs:Fa,F?we:Q),_t:(Q,we,te)=>Ni(ve,F?gs:Fa,F?we:Q,te)},se=Do(xe).reduce((Q,we)=>{const te=xe[we];return On(Q,te&&!va(te)?te:!1)},[]),ge=Q=>Q?A1(se,Q)>-1:null,{W:fe,Z:ke,K:Ae,J:ye,tt:Oe,nt:at}=xe,Fe=[()=>{fo(ke,gs),fo(ke,Ag),fo(fe,Ag),O&&(fo(I,gs),fo(I,Ag))}],Ye=j&&ge(ke);let _t=j?fe:$1([Oe,ye,Ae,ke,fe].find(Q=>ge(Q)===!1));const xt=U?fe:Oe||ye;return[xe,()=>{qr(ke,gs,F?"viewport":"host"),qr(Ae,Kv,""),qr(Oe,rS,""),F||qr(ye,Fa,"");const Q=O&&!F?ua(va(k),UP):Jo;if(Ye&&(K2(fe,ke),On(Fe,()=>{K2(ke,fe),Gs(ke)})),es(xt,_t),es(ke,Ae),es(Ae||ke,!F&&ye),es(ye,Oe),On(Fe,()=>{Q(),fo(Ae,Kv),fo(Oe,rS),fo(ye,GP),fo(ye,qP),fo(ye,Fa),ge(Oe)&&$g(Oe),ge(ye)&&$g(ye),ge(Ae)&&$g(Ae)}),r&&!F&&(Ni(ye,Fa,KP,!0),On(Fe,fo.bind(0,ye,Fa))),at&&(l$(ye,at),On(Fe,Gs.bind(0,at))),de){const we=qr(ye,Kd);qr(ye,Kd,"-1"),ye.focus();const te=()=>we?qr(ye,Kd,we):fo(ye,Kd),pe=Dr(E,"pointerdown keydown",()=>{te(),pe()});On(Fe,[te,pe])}else ae&&ae.focus&&ae.focus();_t=0},Xs.bind(0,Fe)]},Q$=(e,t)=>{const{tt:n}=e,[r]=t;return o=>{const{V:s}=Co(),{ht:a}=r(),{vt:u}=o,d=(n||!s)&&u;return d&&Kr(n,{height:a?"":"100%"}),{gt:d,wt:d}}},Z$=(e,t)=>{const[n,r]=t,{Z:o,K:s,J:a,ut:u}=e,[d,f]=ms({u:m$,o:Z2()},Z2.bind(0,o,"padding",""));return(h,m,v)=>{let[b,w]=f(v);const{I:C,V:S}=Co(),{bt:P}=n(),{gt:k,wt:j,yt:E}=h,[I,O]=m("paddingAbsolute");(k||w||!S&&j)&&([b,w]=d(v));const M=!u&&(O||E||w);if(M){const A=!I||!s&&!C,L=b.r+b.l,D=b.t+b.b,V={marginRight:A&&!P?-L:0,marginBottom:A?-D:0,marginLeft:A&&P?-L:0,top:A?-b.t:0,right:A?P?-b.r:"auto":0,left:A?P?"auto":-b.l:0,width:A?`calc(100% + ${L}px)`:""},$={paddingTop:A?b.t:0,paddingRight:A?b.r:0,paddingBottom:A?b.b:0,paddingLeft:A?b.l:0};Kr(s||a,V),Kr(a,$),r({K:b,St:!A,P:s?$:lr({},V,$)})}return{xt:M}}},{max:Xv}=Math,Ba=Xv.bind(0,0),ek="visible",dS="hidden",J$=42,Xd={u:zP,o:{w:0,h:0}},eL={u:$P,o:{x:dS,y:dS}},tL=(e,t)=>{const n=window.devicePixelRatio%1!==0?1:0,r={w:Ba(e.w-t.w),h:Ba(e.h-t.h)};return{w:r.w>n?r.w:0,h:r.h>n?r.h:0}},Qd=e=>e.indexOf(ek)===0,nL=(e,t)=>{const[n,r]=t,{Z:o,K:s,J:a,nt:u,ut:d,_t:f,it:h,et:m}=e,{k:v,V:b,I:w,A:C}=Co(),S=Gi()[G1],P=!d&&!w&&(C.x||C.y),k=h&&d,[j,E]=ms(Xd,lp.bind(0,a)),[I,O]=ms(Xd,ip.bind(0,a)),[R,M]=ms(Xd),[A,L]=ms(Xd),[D]=ms(eL),V=(G,W)=>{if(Kr(a,{height:""}),W){const{St:q,K:ne}=n(),{$t:ve,D:le}=G,oe=lp(o),Y=Df(o),ae=Kr(a,"boxSizing")==="content-box",de=q||ae?ne.b+ne.t:0,xe=!(C.x&&ae);Kr(a,{height:Y.h+oe.h+(ve.x&&xe?le.x:0)-de})}},$=(G,W)=>{const q=!w&&!G?J$:0,ne=(ge,fe,ke)=>{const Ae=Kr(a,ge),Oe=(W?W[ge]:Ae)==="scroll";return[Ae,Oe,Oe&&!w?fe?q:ke:0,fe&&!!q]},[ve,le,oe,Y]=ne("overflowX",C.x,v.x),[ae,de,xe,se]=ne("overflowY",C.y,v.y);return{Ct:{x:ve,y:ae},$t:{x:le,y:de},D:{x:oe,y:xe},M:{x:Y,y:se}}},F=(G,W,q,ne)=>{const ve=(de,xe)=>{const se=Qd(de),ge=xe&&se&&de.replace(`${ek}-`,"")||"";return[xe&&!se?de:"",Qd(ge)?"hidden":ge]},[le,oe]=ve(q.x,W.x),[Y,ae]=ve(q.y,W.y);return ne.overflowX=oe&&Y?oe:le,ne.overflowY=ae&&le?ae:Y,$(G,ne)},U=(G,W,q,ne)=>{const{D:ve,M:le}=G,{x:oe,y:Y}=le,{x:ae,y:de}=ve,{P:xe}=n(),se=W?"marginLeft":"marginRight",ge=W?"paddingLeft":"paddingRight",fe=xe[se],ke=xe.marginBottom,Ae=xe[ge],ye=xe.paddingBottom;ne.width=`calc(100% + ${de+-1*fe}px)`,ne[se]=-de+fe,ne.marginBottom=-ae+ke,q&&(ne[ge]=Ae+(Y?de:0),ne.paddingBottom=ye+(oe?ae:0))},[X,N]=S?S.H(P,b,a,u,n,$,U):[()=>P,()=>[Jo]];return(G,W,q)=>{const{gt:ne,Ot:ve,wt:le,xt:oe,vt:Y,yt:ae}=G,{ht:de,bt:xe}=n(),[se,ge]=W("showNativeOverlaidScrollbars"),[fe,ke]=W("overflow"),Ae=se&&C.x&&C.y,ye=!d&&!b&&(ne||le||ve||ge||Y),Oe=Qd(fe.x),at=Qd(fe.y),Fe=Oe||at;let Ye=E(q),_t=O(q),xt=M(q),Fn=L(q),Q;if(ge&&w&&f(KP,P$,!Ae),ye&&(Q=$(Ae),V(Q,de)),ne||oe||le||ae||ge){Fe&&f(Hl,Bl,!1);const[Re,et]=N(Ae,xe,Q),[it,ut]=Ye=j(q),[Nt,yr]=_t=I(q),cn=Df(a);let xn=Nt,wr=cn;Re(),(yr||ut||ge)&&et&&!Ae&&X(et,Nt,it,xe)&&(wr=Df(a),xn=ip(a));const kn={w:Ba(Xv(Nt.w,xn.w)+it.w),h:Ba(Xv(Nt.h,xn.h)+it.h)},En={w:Ba((k?m.innerWidth:wr.w+Ba(cn.w-Nt.w))+it.w),h:Ba((k?m.innerHeight+it.h:wr.h+Ba(cn.h-Nt.h))+it.h)};Fn=A(En),xt=R(tL(kn,En),q)}const[we,te]=Fn,[pe,Ne]=xt,[Xe,yt]=_t,[Xt,an]=Ye,Pn={x:pe.w>0,y:pe.h>0},vr=Oe&&at&&(Pn.x||Pn.y)||Oe&&Pn.x&&!Pn.y||at&&Pn.y&&!Pn.x;if(oe||ae||an||yt||te||Ne||ke||ge||ye){const Re={marginRight:0,marginBottom:0,marginLeft:0,width:"",overflowY:"",overflowX:""},et=F(Ae,Pn,fe,Re),it=X(et,Xe,Xt,xe);d||U(et,xe,it,Re),ye&&V(et,de),d?(qr(o,GP,Re.overflowX),qr(o,qP,Re.overflowY)):Kr(a,Re)}Ni(o,gs,Bl,vr),Ni(s,Kv,k$,vr),d||Ni(a,Fa,Hl,Fe);const[ln,Kn]=D($(Ae).Ct);return r({Ct:ln,zt:{x:we.w,y:we.h},Tt:{x:pe.w,y:pe.h},Et:Pn}),{It:Kn,At:te,Lt:Ne}}},fS=(e,t,n)=>{const r={},o=t||{},s=Do(e).concat(Do(o));return bn(s,a=>{const u=e[a],d=o[a];r[a]=!!(n||u||d)}),r},rL=(e,t)=>{const{W:n,J:r,_t:o,ut:s}=e,{I:a,A:u,V:d}=Co(),f=!a&&(u.x||u.y),h=[Q$(e,t),Z$(e,t),nL(e,t)];return(m,v,b)=>{const w=fS(lr({gt:!1,xt:!1,yt:!1,vt:!1,At:!1,Lt:!1,It:!1,Ot:!1,wt:!1},v),{},b),C=f||!d,S=C&&bs(r),P=C&&ca(r);o("",cp,!0);let k=w;return bn(h,j=>{k=fS(k,j(k,m,!!b)||{},b)}),bs(r,S),ca(r,P),o("",cp),s||(bs(n,0),ca(n,0)),k}},oL=(e,t,n)=>{let r,o=!1;const s=()=>{o=!0},a=u=>{if(n){const d=n.reduce((f,h)=>{if(h){const[m,v]=h,b=v&&m&&(u?u(m):MP(m,e));b&&b.length&&v&&ci(v)&&On(f,[b,v.trim()],!0)}return f},[]);bn(d,f=>bn(f[0],h=>{const m=f[1],v=r.get(h)||[];if(e.contains(h)){const w=Dr(h,m,C=>{o?(w(),r.delete(h)):t(C)});r.set(h,On(v,w))}else Xs(v),r.delete(h)}))}};return n&&(r=new WeakMap,a()),[s,a]},pS=(e,t,n,r)=>{let o=!1;const{Ht:s,Pt:a,Dt:u,Mt:d,Rt:f,kt:h}=r||{},m=B1(()=>{o&&n(!0)},{v:33,g:99}),[v,b]=oL(e,m,u),w=s||[],C=a||[],S=w.concat(C),P=(j,E)=>{const I=f||Jo,O=h||Jo,R=new Set,M=new Set;let A=!1,L=!1;if(bn(j,D=>{const{attributeName:V,target:$,type:F,oldValue:U,addedNodes:X,removedNodes:N}=D,G=F==="attributes",W=F==="childList",q=e===$,ne=G&&ci(V)?qr($,V):0,ve=ne!==0&&U!==ne,le=A1(C,V)>-1&&ve;if(t&&(W||!q)){const oe=!G,Y=G&&ve,ae=Y&&d&&sp($,d),xe=(ae?!I($,V,U,ne):oe||Y)&&!O(D,!!ae,e,r);bn(X,se=>R.add(se)),bn(N,se=>R.add(se)),L=L||xe}!t&&q&&ve&&!I($,V,U,ne)&&(M.add(V),A=A||le)}),R.size>0&&b(D=>Vi(R).reduce((V,$)=>(On(V,MP(D,$)),sp($,D)?On(V,$):V),[])),t)return!E&&L&&n(!1),[!1];if(M.size>0||A){const D=[Vi(M),A];return!E&&n.apply(0,D),D}},k=new p$(j=>P(j));return k.observe(e,{attributes:!0,attributeOldValue:!0,attributeFilter:S,subtree:t,childList:t,characterData:t}),o=!0,[()=>{o&&(v(),k.disconnect(),o=!1)},()=>{if(o){m.m();const j=k.takeRecords();return!N1(j)&&P(j,!0)}}]},Zd=3333333,Jd=e=>e&&(e.height||e.width),tk=(e,t,n)=>{const{Bt:r=!1,Vt:o=!1}=n||{},s=Gi()[F$],{B:a}=Co(),d=TP(`
`)[0],f=d.firstChild,h=ku.bind(0,e),[m]=ms({o:void 0,_:!0,u:(C,S)=>!(!C||!Jd(C)&&Jd(S))}),v=C=>{const S=js(C)&&C.length>0&&Pu(C[0]),P=!S&&D1(C[0]);let k=!1,j=!1,E=!0;if(S){const[I,,O]=m(C.pop().contentRect),R=Jd(I),M=Jd(O);k=!O||!R,j=!M&&R,E=!k}else P?[,E]=C:j=C===!0;if(r&&E){const I=P?C[0]:ku(d);bs(d,I?a.n?-Zd:a.i?0:Zd:Zd),ca(d,Zd)}k||t({gt:!P,Yt:P?C:void 0,Vt:!!j})},b=[];let w=o?v:!1;return[()=>{Xs(b),Gs(d)},()=>{if(Rl){const C=new Rl(v);C.observe(f),On(b,()=>{C.disconnect()})}else if(s){const[C,S]=s.O(f,v,o);w=C,On(b,S)}if(r){const[C]=ms({o:void 0},h);On(b,Dr(d,"scroll",S=>{const P=C(),[k,j,E]=P;j&&(F1(f,"ltr rtl"),k?ua(f,"rtl"):ua(f,"ltr"),v([!!k,j,E])),FP(S)}))}w&&(ua(d,_$),On(b,Dr(d,"animationstart",w,{C:!!Rl}))),(Rl||s)&&es(e,d)}]},sL=e=>e.h===0||e.isIntersecting||e.intersectionRatio>0,aL=(e,t)=>{let n;const r=zi(E$),o=[],[s]=ms({o:!1}),a=(d,f)=>{if(d){const h=s(sL(d)),[,m]=h;if(m)return!f&&t(h),[h]}},u=(d,f)=>{if(d&&d.length>0)return a(d.pop(),f)};return[()=>{Xs(o),Gs(r)},()=>{if(Y2)n=new Y2(d=>u(d),{root:e}),n.observe(r),On(o,()=>{n.disconnect()});else{const d=()=>{const m=Ui(r);a(m)},[f,h]=tk(r,d);On(o,f),h(),d()}es(e,r)},()=>{if(n)return u(n.takeRecords(),!0)}]},hS=`[${gs}]`,iL=`[${Fa}]`,Lg=["tabindex"],mS=["wrap","cols","rows"],Fg=["id","class","style","open"],lL=(e,t,n)=>{let r,o,s;const{Z:a,J:u,tt:d,rt:f,ut:h,ft:m,_t:v}=e,{V:b}=Co(),[w]=ms({u:zP,o:{w:0,h:0}},()=>{const F=m(Hl,Bl),U=m(Ng,""),X=U&&bs(u),N=U&&ca(u);v(Hl,Bl),v(Ng,""),v("",cp,!0);const G=ip(d),W=ip(u),q=lp(u);return v(Hl,Bl,F),v(Ng,"",U),v("",cp),bs(u,X),ca(u,N),{w:W.w+G.w+q.w,h:W.h+G.h+q.h}}),C=f?mS:Fg.concat(mS),S=B1(n,{v:()=>r,g:()=>o,p(F,U){const[X]=F,[N]=U;return[Do(X).concat(Do(N)).reduce((G,W)=>(G[W]=X[W]||N[W],G),{})]}}),P=F=>{bn(F||Lg,U=>{if(A1(Lg,U)>-1){const X=qr(a,U);ci(X)?qr(u,U,X):fo(u,U)}})},k=(F,U)=>{const[X,N]=F,G={vt:N};return t({ht:X}),!U&&n(G),G},j=({gt:F,Yt:U,Vt:X})=>{const N=!F||X?n:S;let G=!1;if(U){const[W,q]=U;G=q,t({bt:W})}N({gt:F,yt:G})},E=(F,U)=>{const[,X]=w(),N={wt:X};return X&&!U&&(F?n:S)(N),N},I=(F,U,X)=>{const N={Ot:U};return U?!X&&S(N):h||P(F),N},[O,R,M]=d||!b?aL(a,k):[Jo,Jo,Jo],[A,L]=h?[Jo,Jo]:tk(a,j,{Vt:!0,Bt:!0}),[D,V]=pS(a,!1,I,{Pt:Fg,Ht:Fg.concat(Lg)}),$=h&&Rl&&new Rl(j.bind(0,{gt:!0}));return $&&$.observe(a),P(),[()=>{O(),A(),s&&s[0](),$&&$.disconnect(),D()},()=>{L(),R()},()=>{const F={},U=V(),X=M(),N=s&&s[1]();return U&&lr(F,I.apply(0,On(U,!0))),X&&lr(F,k.apply(0,On(X,!0))),N&&lr(F,E.apply(0,On(N,!0))),F},F=>{const[U]=F("update.ignoreMutation"),[X,N]=F("update.attributes"),[G,W]=F("update.elementEvents"),[q,ne]=F("update.debounce"),ve=W||N,le=oe=>_s(U)&&U(oe);if(ve&&(s&&(s[1](),s[0]()),s=pS(d||u,!0,E,{Ht:C.concat(X||[]),Dt:G,Mt:hS,kt:(oe,Y)=>{const{target:ae,attributeName:de}=oe;return(!Y&&de&&!h?i$(ae,hS,iL):!1)||!!Ol(ae,`.${wo}`)||!!le(oe)}})),ne)if(S.m(),js(q)){const oe=q[0],Y=q[1];r=Xa(oe)&&oe,o=Xa(Y)&&Y}else Xa(q)?(r=q,o=!1):(r=!1,o=!1)}]},gS={x:0,y:0},cL=e=>({K:{t:0,r:0,b:0,l:0},St:!1,P:{marginRight:0,marginBottom:0,marginLeft:0,paddingTop:0,paddingRight:0,paddingBottom:0,paddingLeft:0},zt:gS,Tt:gS,Ct:{x:"hidden",y:"hidden"},Et:{x:!1,y:!1},ht:!1,bt:ku(e.Z)}),uL=(e,t)=>{const n=Yv(t,{}),[r,o,s]=W1(),[a,u,d]=X$(e),f=JP(cL(a)),[h,m]=f,v=rL(a,f),b=(j,E,I)=>{const R=Do(j).some(M=>j[M])||!z1(E)||I;return R&&s("u",[j,E,I]),R},[w,C,S,P]=lL(a,m,j=>b(v(n,j),{},!1)),k=h.bind(0);return k.jt=j=>r("u",j),k.Nt=()=>{const{W:j,J:E}=a,I=bs(j),O=ca(j);C(),u(),bs(E,I),ca(E,O)},k.qt=a,[(j,E)=>{const I=Yv(t,j,E);return P(I),b(v(I,S(),E),j,!!E)},k,()=>{o(),w(),d()}]},{round:vS}=Math,dL=e=>{const{width:t,height:n}=Va(e),{w:r,h:o}=Ui(e);return{x:vS(t)/r||1,y:vS(n)/o||1}},fL=(e,t,n)=>{const r=t.scrollbars,{button:o,isPrimary:s,pointerType:a}=e,{pointers:u}=r;return o===0&&s&&r[n?"dragScroll":"clickScroll"]&&(u||[]).includes(a)},pL=(e,t)=>Dr(e,"mousedown",Dr.bind(0,t,"click",FP,{C:!0,$:!0}),{$:!0}),yS="pointerup pointerleave pointercancel lostpointercapture",hL=(e,t,n,r,o,s,a)=>{const{B:u}=Co(),{Ft:d,Gt:f,Xt:h}=r,m=`scroll${a?"Left":"Top"}`,v=`client${a?"X":"Y"}`,b=a?"width":"height",w=a?"left":"top",C=a?"w":"h",S=a?"x":"y",P=(k,j)=>E=>{const{Tt:I}=s(),O=Ui(f)[C]-Ui(d)[C],M=j*E/O*I[S],L=ku(h)&&a?u.n||u.i?1:-1:1;o[m]=k+M*L};return Dr(f,"pointerdown",k=>{const j=Ol(k.target,`.${U1}`)===d,E=j?d:f;if(Ni(t,gs,nS,!0),fL(k,e,j)){const I=!j&&k.shiftKey,O=()=>Va(d),R=()=>Va(f),M=(W,q)=>(W||O())[w]-(q||R())[w],A=P(o[m]||0,1/dL(o)[S]),L=k[v],D=O(),V=R(),$=D[b],F=M(D,V)+$/2,U=L-V[w],X=j?0:U-F,N=W=>{Xs(G),E.releasePointerCapture(W.pointerId)},G=[Ni.bind(0,t,gs,nS),Dr(n,yS,N),Dr(n,"selectstart",W=>BP(W),{S:!1}),Dr(f,yS,N),Dr(f,"pointermove",W=>{const q=W[v]-L;(j||I)&&A(X+q)})];if(I)A(X);else if(!j){const W=Gi()[B$];W&&On(G,W.O(A,M,X,$,U))}E.setPointerCapture(k.pointerId)}})},mL=(e,t)=>(n,r,o,s,a,u)=>{const{Xt:d}=n,[f,h]=El(333),m=!!a.scrollBy;let v=!0;return Xs.bind(0,[Dr(d,"pointerenter",()=>{r(sS,!0)}),Dr(d,"pointerleave pointercancel",()=>{r(sS)}),Dr(d,"wheel",b=>{const{deltaX:w,deltaY:C,deltaMode:S}=b;m&&v&&S===0&&va(d)===s&&a.scrollBy({left:w,top:C,behavior:"smooth"}),v=!1,r(lS,!0),f(()=>{v=!0,r(lS)}),BP(b)},{S:!1,$:!0}),pL(d,o),hL(e,s,o,n,a,t,u),h])},{min:Qv,max:bS,abs:gL,round:vL}=Math,nk=(e,t,n,r)=>{if(r){const u=n?"x":"y",{Tt:d,zt:f}=r,h=f[u],m=d[u];return bS(0,Qv(1,h/(h+m)))}const o=n?"w":"h",s=Ui(e)[o],a=Ui(t)[o];return bS(0,Qv(1,s/a))},yL=(e,t,n,r,o,s)=>{const{B:a}=Co(),u=s?"x":"y",d=s?"Left":"Top",{Tt:f}=r,h=vL(f[u]),m=gL(n[`scroll${d}`]),v=s&&o,b=a.i?m:h-m,C=Qv(1,(v?b:m)/h),S=nk(e,t,s);return 1/S*(1-S)*C},bL=(e,t,n)=>{const{N:r,L:o}=Co(),{scrollbars:s}=r(),{slot:a}=s,{ct:u,W:d,Z:f,J:h,lt:m,ot:v,it:b,ut:w}=t,{scrollbars:C}=m?{}:e,{slot:S}=C||{},P=QP([d,f,h],()=>w&&b?d:f,a,S),k=(X,N,G)=>{const W=G?ua:F1;bn(X,q=>{W(q.Xt,N)})},j=(X,N)=>{bn(X,G=>{const[W,q]=N(G);Kr(W,q)})},E=(X,N,G)=>{j(X,W=>{const{Ft:q,Gt:ne}=W;return[q,{[G?"width":"height"]:`${(100*nk(q,ne,G,N)).toFixed(3)}%`}]})},I=(X,N,G)=>{const W=G?"X":"Y";j(X,q=>{const{Ft:ne,Gt:ve,Xt:le}=q,oe=yL(ne,ve,v,N,ku(le),G);return[ne,{transform:oe===oe?`translate${W}(${(100*oe).toFixed(3)}%)`:""}]})},O=[],R=[],M=[],A=(X,N,G)=>{const W=D1(G),q=W?G:!0,ne=W?!G:!0;q&&k(R,X,N),ne&&k(M,X,N)},L=X=>{E(R,X,!0),E(M,X)},D=X=>{I(R,X,!0),I(M,X)},V=X=>{const N=X?M$:T$,G=X?R:M,W=N1(G)?oS:"",q=zi(`${wo} ${N} ${W}`),ne=zi(YP),ve=zi(U1),le={Xt:q,Gt:ne,Ft:ve};return o||ua(q,I$),es(q,ne),es(ne,ve),On(G,le),On(O,[Gs.bind(0,q),n(le,A,u,f,v,X)]),le},$=V.bind(0,!0),F=V.bind(0,!1),U=()=>{es(P,R[0].Xt),es(P,M[0].Xt),ap(()=>{A(oS)},300)};return $(),F(),[{Ut:L,Wt:D,Zt:A,Jt:{Kt:R,Qt:$,tn:j.bind(0,R)},nn:{Kt:M,Qt:F,tn:j.bind(0,M)}},U,Xs.bind(0,O)]},xL=(e,t,n,r)=>{let o,s,a,u,d,f=0;const h=JP({}),[m]=h,[v,b]=El(),[w,C]=El(),[S,P]=El(100),[k,j]=El(100),[E,I]=El(()=>f),[O,R,M]=bL(e,n.qt,mL(t,n)),{Z:A,J:L,ot:D,st:V,ut:$,it:F}=n.qt,{Jt:U,nn:X,Zt:N,Ut:G,Wt:W}=O,{tn:q}=U,{tn:ne}=X,ve=de=>{const{Xt:xe}=de,se=$&&!F&&va(xe)===L&&xe;return[se,{transform:se?`translate(${bs(D)}px, ${ca(D)}px)`:""}]},le=(de,xe)=>{if(I(),de)N(iS);else{const se=()=>N(iS,!0);f>0&&!xe?E(se):se()}},oe=()=>{u=s,u&&le(!0)},Y=[P,I,j,C,b,M,Dr(A,"pointerover",oe,{C:!0}),Dr(A,"pointerenter",oe),Dr(A,"pointerleave",()=>{u=!1,s&&le(!1)}),Dr(A,"pointermove",()=>{o&&v(()=>{P(),le(!0),k(()=>{o&&le(!1)})})}),Dr(V,"scroll",de=>{w(()=>{W(n()),a&&le(!0),S(()=>{a&&!u&&le(!1)})}),r(de),$&&q(ve),$&&ne(ve)})],ae=m.bind(0);return ae.qt=O,ae.Nt=R,[(de,xe,se)=>{const{At:ge,Lt:fe,It:ke,yt:Ae}=se,{A:ye}=Co(),Oe=Yv(t,de,xe),at=n(),{Tt:Fe,Ct:Ye,bt:_t}=at,[xt,Fn]=Oe("showNativeOverlaidScrollbars"),[Q,we]=Oe("scrollbars.theme"),[te,pe]=Oe("scrollbars.visibility"),[Ne,Xe]=Oe("scrollbars.autoHide"),[yt]=Oe("scrollbars.autoHideDelay"),[Xt,an]=Oe("scrollbars.dragScroll"),[Pn,vr]=Oe("scrollbars.clickScroll"),ln=ge||fe||Ae,Kn=ke||pe,Re=xt&&ye.x&&ye.y,et=(it,ut)=>{const Nt=te==="visible"||te==="auto"&&it==="scroll";return N(D$,Nt,ut),Nt};if(f=yt,Fn&&N(O$,Re),we&&(N(d),N(Q,!0),d=Q),Xe&&(o=Ne==="move",s=Ne==="leave",a=Ne!=="never",le(!a,!0)),an&&N(z$,Xt),vr&&N(N$,Pn),Kn){const it=et(Ye.x,!0),ut=et(Ye.y,!1);N(A$,!(it&&ut))}ln&&(G(at),W(at),N(aS,!Fe.x,!0),N(aS,!Fe.y,!1),N(R$,_t&&!F))},ae,Xs.bind(0,Y)]},rk=(e,t,n)=>{_s(e)&&e(t||void 0,n||void 0)},Ua=(e,t,n)=>{const{F:r,N:o,Y:s,j:a}=Co(),u=Gi(),d=op(e),f=d?e:e.target,h=ZP(f);if(t&&!h){let m=!1;const v=$=>{const F=Gi()[L$],U=F&&F.O;return U?U($,!0):$},b=lr({},r(),v(t)),[w,C,S]=W1(n),[P,k,j]=uL(e,b),[E,I,O]=xL(e,b,k,$=>S("scroll",[V,$])),R=($,F)=>P($,!!F),M=R.bind(0,{},!0),A=s(M),L=a(M),D=$=>{Y$(f),A(),L(),O(),j(),m=!0,S("destroyed",[V,!!$]),C()},V={options($,F){if($){const U=F?r():{},X=HP(b,lr(U,v($)));z1(X)||(lr(b,X),R(X))}return lr({},b)},on:w,off:($,F)=>{$&&F&&C($,F)},state(){const{zt:$,Tt:F,Ct:U,Et:X,K:N,St:G,bt:W}=k();return lr({},{overflowEdge:$,overflowAmount:F,overflowStyle:U,hasOverflow:X,padding:N,paddingAbsolute:G,directionRTL:W,destroyed:m})},elements(){const{W:$,Z:F,K:U,J:X,tt:N,ot:G,st:W}=k.qt,{Jt:q,nn:ne}=I.qt,ve=oe=>{const{Ft:Y,Gt:ae,Xt:de}=oe;return{scrollbar:de,track:ae,handle:Y}},le=oe=>{const{Kt:Y,Qt:ae}=oe,de=ve(Y[0]);return lr({},de,{clone:()=>{const xe=ve(ae());return E({},!0,{}),xe}})};return lr({},{target:$,host:F,padding:U||X,viewport:X,content:N||X,scrollOffsetElement:G,scrollEventElement:W,scrollbarHorizontal:le(q),scrollbarVertical:le(ne)})},update:$=>R({},$),destroy:D.bind(0)};return k.jt(($,F,U)=>{E(F,U,$)}),K$(f,V),bn(Do(u),$=>rk(u[$],0,V)),q$(k.qt.it,o().cancel,!d&&e.cancel)?(D(!0),V):(k.Nt(),I.Nt(),S("initialized",[V]),k.jt(($,F,U)=>{const{gt:X,yt:N,vt:G,At:W,Lt:q,It:ne,wt:ve,Ot:le}=$;S("updated",[V,{updateHints:{sizeChanged:X,directionChanged:N,heightIntrinsicChanged:G,overflowEdgeChanged:W,overflowAmountChanged:q,overflowStyleChanged:ne,contentMutation:ve,hostMutation:le},changedOptions:F,force:U}])}),V.update(!0),V)}return h};Ua.plugin=e=>{bn($$(e),t=>rk(t,Ua))};Ua.valid=e=>{const t=e&&e.elements,n=_s(t)&&t();return Vv(n)&&!!ZP(n.target)};Ua.env=()=>{const{k:e,A:t,I:n,B:r,V:o,L:s,X:a,U:u,N:d,q:f,F:h,G:m}=Co();return lr({},{scrollbarsSize:e,scrollbarsOverlaid:t,scrollbarsHiding:n,rtlScrollBehavior:r,flexboxGlue:o,cssCustomProperties:s,staticDefaultInitialization:a,staticDefaultOptions:u,getDefaultInitialization:d,setDefaultInitialization:f,getDefaultOptions:h,setDefaultOptions:m})};const SL=()=>{if(typeof window>"u"){const f=()=>{};return[f,f]}let e,t;const n=window,r=typeof n.requestIdleCallback=="function",o=n.requestAnimationFrame,s=n.cancelAnimationFrame,a=r?n.requestIdleCallback:o,u=r?n.cancelIdleCallback:s,d=()=>{u(e),s(t)};return[(f,h)=>{d(),e=a(r?()=>{d(),t=o(f)}:f,typeof h=="object"?h:{timeout:2233})},d]},ok=e=>{const{options:t,events:n,defer:r}=e||{},[o,s]=p.useMemo(SL,[]),a=p.useRef(null),u=p.useRef(r),d=p.useRef(t),f=p.useRef(n);return p.useEffect(()=>{u.current=r},[r]),p.useEffect(()=>{const{current:h}=a;d.current=t,Ua.valid(h)&&h.options(t||{},!0)},[t]),p.useEffect(()=>{const{current:h}=a;f.current=n,Ua.valid(h)&&h.on(n||{},!0)},[n]),p.useEffect(()=>()=>{var h;s(),(h=a.current)==null||h.destroy()},[]),p.useMemo(()=>[h=>{const m=a.current;if(Ua.valid(m))return;const v=u.current,b=d.current||{},w=f.current||{},C=()=>a.current=Ua(h,b,w);v?o(C,v):C()},()=>a.current],[])},wL=(e,t)=>{const{element:n="div",options:r,events:o,defer:s,children:a,...u}=e,d=n,f=p.useRef(null),h=p.useRef(null),[m,v]=ok({options:r,events:o,defer:s});return p.useEffect(()=>{const{current:b}=f,{current:w}=h;return b&&w&&m({target:b,elements:{viewport:w,content:w}}),()=>{var C;return(C=v())==null?void 0:C.destroy()}},[m,n]),p.useImperativeHandle(t,()=>({osInstance:v,getElement:()=>f.current}),[]),z.createElement(d,{"data-overlayscrollbars-initialize":"",ref:f,...u},z.createElement("div",{ref:h},a))},sk=p.forwardRef(wL),CL=nt((e,t)=>{const{children:n,tooltip:r="",tooltipProps:{placement:o="top",hasArrow:s=!0,...a}={},isChecked:u,...d}=e;return i.jsx(Gn,{label:r,placement:o,hasArrow:s,...a,children:i.jsx(h3,{ref:t,colorScheme:u?"accent":"base",...d,children:n})})}),Yt=p.memo(CL),PL="My Board",kL=()=>{const[e,{isLoading:t}]=NO(),n=p.useCallback(()=>{e(PL)},[e]);return i.jsx(Yt,{isLoading:t,"aria-label":"Add Board",onClick:n,size:"sm",sx:{px:4},children:"Add Board"})},_L=({isSelected:e})=>{const t=zO(),{colorMode:n}=xo(),r=()=>{t(p3())},o={id:"all-images-board",actionType:"MOVE_BOARD",context:{boardId:null}},{isOver:s,setNodeRef:a,active:u}=Au({id:"board_droppable_all_images",data:o});return i.jsxs(H,{sx:{flexDir:"column",justifyContent:"space-between",alignItems:"center",cursor:"pointer",w:"full",h:"full",borderRadius:"base"},children:[i.jsxs(H,{ref:a,onClick:r,sx:{position:"relative",justifyContent:"center",alignItems:"center",borderRadius:"base",w:"full",aspectRatio:"1/1",overflow:"hidden",shadow:e?"selected.light":void 0,_dark:{shadow:e?"selected.dark":void 0},flexShrink:0},children:[i.jsx(bc,{boxSize:8,icon:Az,sx:{border:"2px solid var(--invokeai-colors-base-200)",_dark:{border:"2px solid var(--invokeai-colors-base-800)"}}}),i.jsx(Ao,{children:Gl(o,u)&&i.jsx(Ql,{isOver:s})})]}),i.jsx(H,{sx:{h:"full",alignItems:"center",color:e?Me("base.900","base.50")(n):Me("base.700","base.200")(n),fontWeight:e?600:void 0,fontSize:"xs"},children:"All Images"})]})},jL=Pe([mn],({boards:e,gallery:t})=>{const{searchText:n}=e,{selectedBoardId:r}=t;return{selectedBoardId:r,searchText:n}},Et),EL=e=>{const{isOpen:t}=e,n=re(),{selectedBoardId:r,searchText:o}=B(jL),{data:s}=lh(),a=o?s==null?void 0:s.filter(m=>m.board_name.toLowerCase().includes(o.toLowerCase())):s,[u,d]=p.useState(!1),f=m=>{d(m.length>0),n(wx(m))},h=()=>{d(!1),n(wx(""))};return i.jsx(fh,{in:t,animateOpacity:!0,children:i.jsxs(H,{layerStyle:"first",sx:{flexDir:"column",gap:2,p:2,mt:2,borderRadius:"base"},children:[i.jsxs(H,{sx:{gap:2,alignItems:"center"},children:[i.jsxs(h6,{children:[i.jsx(Bu,{placeholder:"Search Boards...",value:o,onChange:m=>{f(m.target.value)}}),o&&o.length&&i.jsx(s1,{children:i.jsx(Ka,{onClick:h,size:"xs",variant:"ghost","aria-label":"Clear Search",icon:i.jsx(Xz,{boxSize:3})})})]}),i.jsx(kL,{})]}),i.jsx(sk,{defer:!0,style:{height:"100%",width:"100%"},options:{scrollbars:{visibility:"auto",autoHide:"move",autoHideDelay:1300,theme:"os-theme-dark"}},children:i.jsxs(ma,{className:"list-container",sx:{gridTemplateRows:"6.5rem 6.5rem",gridAutoFlow:"column dense",gridAutoColumns:"5rem"},children:[!u&&i.jsx(Rv,{sx:{p:1.5},children:i.jsx(_L,{isSelected:!r})}),a&&a.map(m=>i.jsx(Rv,{sx:{p:1.5},children:i.jsx(IP,{board:m,isSelected:r===m.board_id})},m.board_id))]})})]})})},IL=p.memo(EL),OL=({image:e})=>{const t=p.useMemo(()=>{var n,r;if(ch((n=e.metadata)==null?void 0:n.model))return(r=e.metadata)==null?void 0:r.model},[e.metadata]);return i.jsxs(H,{sx:{pointerEvents:"none",flexDirection:"column",position:"absolute",top:0,insetInlineStart:0,p:2,alignItems:"flex-start",gap:2},children:[i.jsxs(Xl,{variant:"solid",colorScheme:"base",children:[e.width," × ",e.height]}),t&&i.jsx(Xl,{variant:"solid",colorScheme:"base",children:t})]})},ak=({postUploadAction:e,isDisabled:t})=>{const n=re(),r=p.useCallback(u=>{const d=u[0];d&&n(u3({file:d,image_category:"user",is_intermediate:!1,postUploadAction:e}))},[n,e]),{getRootProps:o,getInputProps:s,open:a}=P1({accept:{"image/png":[".png"],"image/jpeg":[".jpg",".jpeg",".png"]},onDropAccepted:r,disabled:t,noDrag:!0,multiple:!1});return{getUploadButtonProps:o,getUploadInputProps:s,openUploader:a}},RL=e=>{const{imageDTO:t,onClickReset:n,onError:r,onClick:o,withResetIcon:s=!1,withMetadataOverlay:a=!1,isDropDisabled:u=!1,isDragDisabled:d=!1,isUploadDisabled:f=!1,minSize:h=24,postUploadAction:m,imageSx:v,fitContainer:b=!1,droppableData:w,draggableData:C,dropLabel:S,isSelected:P=!1,thumbnail:k=!1,resetTooltip:j="Reset",resetIcon:E=i.jsx(O1,{}),noContentFallback:I=i.jsx(bc,{icon:qu})}=e,{colorMode:O}=xo(),R=p.useRef(Ti()),{attributes:M,listeners:A,setNodeRef:L,isDragging:D,active:V}=$O({id:R.current,disabled:d||!t,data:C}),{isOver:$,setNodeRef:F}=Au({id:R.current,disabled:u,data:w}),U=LO(F,L),{getUploadButtonProps:X,getUploadInputProps:N}=ak({postUploadAction:m,isDisabled:f}),G=Ef("drop-shadow(0px 0px 0.1rem var(--invokeai-colors-base-600))","drop-shadow(0px 0px 0.1rem var(--invokeai-colors-base-800))"),W=f?{}:{cursor:"pointer",bg:Me("base.200","base.800")(O),_hover:{bg:Me("base.300","base.650")(O),color:Me("base.500","base.300")(O)}};return i.jsxs(H,{sx:{width:"full",height:"full",alignItems:"center",justifyContent:"center",position:"relative",minW:h||void 0,minH:h||void 0,userSelect:"none",cursor:d||!t?"default":"pointer"},...M,...A,ref:U,children:[t&&i.jsxs(H,{sx:{w:"full",h:"full",position:b?"absolute":"relative",alignItems:"center",justifyContent:"center"},children:[i.jsx(Nu,{onClick:o,src:k?t.thumbnail_url:t.image_url,fallbackStrategy:"beforeLoadOrError",fallback:i.jsx(e$,{image:t}),onError:r,draggable:!1,sx:{objectFit:"contain",maxW:"full",maxH:"full",borderRadius:"base",shadow:P?"selected.light":void 0,_dark:{shadow:P?"selected.dark":void 0},...v}}),a&&i.jsx(OL,{image:t}),n&&s&&i.jsx(Ie,{onClick:n,"aria-label":j,tooltip:j,icon:E,size:"sm",variant:"link",sx:{position:"absolute",top:1,insetInlineEnd:1,p:0,minW:0,svg:{transitionProperty:"common",transitionDuration:"normal",fill:"base.100",_hover:{fill:"base.50"},filter:G}}})]}),!t&&!f&&i.jsx(i.Fragment,{children:i.jsxs(H,{sx:{minH:h,w:"full",h:"full",alignItems:"center",justifyContent:"center",borderRadius:"base",transitionProperty:"common",transitionDuration:"0.1s",color:Me("base.500","base.500")(O),...W},...X(),children:[i.jsx("input",{...N()}),i.jsx(mo,{as:jh,sx:{boxSize:16}})]})}),!t&&f&&I,i.jsx(Ao,{children:Gl(w,V)&&!D&&i.jsx(Ql,{isOver:$,label:S})})]})},qi=p.memo(RL),Y1=()=>{const e=re(),t=Du(),{t:n}=me(),r=p.useCallback(()=>{t({title:n("toast.parameterSet"),status:"info",duration:2500,isClosable:!0})},[n,t]),o=p.useCallback(()=>{t({title:n("toast.parameterNotSet"),status:"warning",duration:2500,isClosable:!0})},[n,t]),s=p.useCallback(()=>{t({title:n("toast.parametersSet"),status:"info",duration:2500,isClosable:!0})},[n,t]),a=p.useCallback(()=>{t({title:n("toast.parametersNotSet"),status:"warning",duration:2500,isClosable:!0})},[n,t]),u=p.useCallback((I,O)=>{if(zd(I)||$d(O)){zd(I)&&e(au(I)),$d(O)&&e(iu(O)),r();return}o()},[e,r,o]),d=p.useCallback(I=>{if(!zd(I)){o();return}e(au(I)),r()},[e,r,o]),f=p.useCallback(I=>{if(!$d(I)){o();return}e(iu(I)),r()},[e,r,o]),h=p.useCallback(I=>{if(!Cx(I)){o();return}e(Lf(I)),r()},[e,r,o]),m=p.useCallback(I=>{if(!Px(I)){o();return}e(Ff(I)),r()},[e,r,o]),v=p.useCallback(I=>{if(!kx(I)){o();return}e(gv((I==null?void 0:I.id)||"")),r()},[e,r,o]),b=p.useCallback(I=>{if(!_x(I)){o();return}e(vv(I)),r()},[e,r,o]),w=p.useCallback(I=>{if(!jx(I)){o();return}e(Bf(I)),r()},[e,r,o]),C=p.useCallback(I=>{if(!Ex(I)){o();return}e(ql(I)),r()},[e,r,o]),S=p.useCallback(I=>{if(!Ix(I)){o();return}e(Kl(I)),r()},[e,r,o]),P=p.useCallback(I=>{if(!Ox(I)){o();return}e(Hf(I)),r()},[e,r,o]),k=p.useCallback(async I=>{if(!FO(I)){o();return}e(Wf(I.image_name)),r()},[e,r,o]),j=p.useCallback(I=>{e(Wf(I))},[e]),E=p.useCallback(I=>{if(!I||!I.metadata){a();return}const{cfg_scale:O,height:R,model:M,positive_conditioning:A,negative_conditioning:L,scheduler:D,seed:V,steps:$,width:F,strength:U,clip:X,extra:N,latents:G,unet:W,vae:q}=I.metadata;Px(O)&&e(Ff(O)),kx(M)&&e(gv(M)),zd(A)&&e(au(A)),$d(L)&&e(iu(L)),_x(D)&&e(vv(D)),Cx(V)&&e(Lf(V)),jx($)&&e(Bf($)),Ex(F)&&e(ql(F)),Ix(R)&&e(Kl(R)),Ox(U)&&e(Hf(U)),s()},[a,s,e]);return{recallBothPrompts:u,recallPositivePrompt:d,recallNegativePrompt:f,recallSeed:h,recallInitialImage:k,recallCfgScale:m,recallModel:v,recallScheduler:b,recallSteps:w,recallWidth:C,recallHeight:S,recallStrength:P,recallAllParameters:E,sendToImageToImage:j}},cr=e=>{const t=B(a=>a.config.disabledTabs),n=B(a=>a.config.disabledFeatures),r=B(a=>a.config.disabledSDFeatures),o=p.useMemo(()=>n.includes(e)||r.includes(e)||t.includes(e),[n,r,t,e]),s=p.useMemo(()=>!(n.includes(e)||r.includes(e)||t.includes(e)),[n,r,t,e]);return{isFeatureDisabled:o,isFeatureEnabled:s}};function Af(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M245.09 327.74v-37.32c57.07 0 84.51 13.47 108.58 38.68 5.4 5.65 15 1.32 14.29-6.43-5.45-61.45-34.14-117.09-122.87-117.09v-37.32a8.32 8.32 0 00-14.05-6L146.58 242a8.2 8.2 0 000 11.94L231 333.71a8.32 8.32 0 0014.09-5.97z"}},{tag:"path",attr:{fill:"none",strokeMiterlimit:"10",strokeWidth:"32",d:"M256 64C150 64 64 150 64 256s86 192 192 192 192-86 192-192S362 64 256 64z"}}]})(e)}function ML(e){return st({tag:"svg",attr:{viewBox:"0 0 512 512"},child:[{tag:"path",attr:{d:"M478.33 433.6l-90-218a22 22 0 00-40.67 0l-90 218a22 22 0 1040.67 16.79L316.66 406h102.67l18.33 44.39A22 22 0 00458 464a22 22 0 0020.32-30.4zM334.83 362L368 281.65 401.17 362zm-66.99-19.08a22 22 0 00-4.89-30.7c-.2-.15-15-11.13-36.49-34.73 39.65-53.68 62.11-114.75 71.27-143.49H330a22 22 0 000-44H214V70a22 22 0 00-44 0v20H54a22 22 0 000 44h197.25c-9.52 26.95-27.05 69.5-53.79 108.36-31.41-41.68-43.08-68.65-43.17-68.87a22 22 0 00-40.58 17c.58 1.38 14.55 34.23 52.86 83.93.92 1.19 1.83 2.35 2.74 3.51-39.24 44.35-77.74 71.86-93.85 80.74a22 22 0 1021.07 38.63c2.16-1.18 48.6-26.89 101.63-85.59 22.52 24.08 38 35.44 38.93 36.1a22 22 0 0030.75-4.9z"}}]})(e)}const TL=({image:e,children:t})=>{var A,L;const n=p.useMemo(()=>Pe([mn],({gallery:D,batch:V})=>{const $=D.selection.length,F=V.imageNames.includes(e.image_name);return{selectionCount:$,isInBatch:F}},Et),[e.image_name]),{selectionCount:r,isInBatch:o}=B(n),s=re(),{t:a}=me(),u=Du(),d=cr("lightbox").isFeatureEnabled,f=cr("unifiedCanvas").isFeatureEnabled,{onClickAddToBoard:h}=p.useContext(m3),m=p.useCallback(()=>{e&&s($0(e))},[s,e]),{recallBothPrompts:v,recallSeed:b,recallAllParameters:w}=Y1(),[C]=BO(),S=p.useCallback(()=>{var D,V;v((D=e.metadata)==null?void 0:D.positive_conditioning,(V=e.metadata)==null?void 0:V.negative_conditioning)},[(A=e.metadata)==null?void 0:A.negative_conditioning,(L=e.metadata)==null?void 0:L.positive_conditioning,v]),P=p.useCallback(()=>{var D;b((D=e.metadata)==null?void 0:D.seed)},[e,b]),k=p.useCallback(()=>{s(g3()),s(Wf(e))},[s,e]),j=()=>{s(v3()),s(y3(e)),s(uh()),s(Oi("unifiedCanvas")),u({title:a("toast.sentToUnifiedCanvas"),status:"success",duration:2500,isClosable:!0})},E=p.useCallback(()=>{w(e)},[e,w]),I=()=>{},O=p.useCallback(()=>{h(e)},[e,h]),R=p.useCallback(()=>{e.board_id&&C({board_id:e.board_id,image_name:e.image_name})},[e.board_id,e.image_name,C]),M=()=>{window.open(e.image_url,"_blank")};return p.useCallback(()=>{s(HO())},[s]),p.useCallback(()=>{s(WO([e.image_name]))},[s,e.image_name]),i.jsx(_P,{menuProps:{size:"sm",isLazy:!0},renderMenu:()=>{var D,V,$;return i.jsx(Vu,{sx:{visibility:"visible !important"},children:r===1?i.jsxs(i.Fragment,{children:[i.jsx(ro,{icon:i.jsx(M1,{}),onClickCapture:M,children:a("common.openInNewTab")}),d&&i.jsx(ro,{icon:i.jsx(j1,{}),onClickCapture:I,children:a("parameters.openInViewer")}),i.jsx(ro,{icon:i.jsx(Af,{}),onClickCapture:S,isDisabled:((D=e==null?void 0:e.metadata)==null?void 0:D.positive_conditioning)===void 0,children:a("parameters.usePrompt")}),i.jsx(ro,{icon:i.jsx(Af,{}),onClickCapture:P,isDisabled:((V=e==null?void 0:e.metadata)==null?void 0:V.seed)===void 0,children:a("parameters.useSeed")}),i.jsx(ro,{icon:i.jsx(Af,{}),onClickCapture:E,isDisabled:!["t2l","l2l","inpaint"].includes(String(($=e==null?void 0:e.metadata)==null?void 0:$.type)),children:a("parameters.useAll")}),i.jsx(ro,{icon:i.jsx(rp,{}),onClickCapture:k,id:"send-to-img2img",children:a("parameters.sendToImg2Img")}),f&&i.jsx(ro,{icon:i.jsx(rp,{}),onClickCapture:j,id:"send-to-canvas",children:a("parameters.sendToUnifiedCanvas")}),i.jsx(ro,{icon:i.jsx(Tf,{}),onClickCapture:O,children:e.board_id?"Change Board":"Add to Board"}),e.board_id&&i.jsx(ro,{icon:i.jsx(Tf,{}),onClickCapture:R,children:"Remove from Board"}),i.jsx(ro,{sx:{color:"error.600",_dark:{color:"error.300"}},icon:i.jsx(vo,{}),onClickCapture:m,children:a("gallery.deleteImage")})]}):i.jsxs(i.Fragment,{children:[i.jsx(ro,{isDisabled:!0,icon:i.jsx(Tf,{}),onClickCapture:O,children:"Move Selection to Board"}),i.jsx(ro,{sx:{color:"error.600",_dark:{color:"error.300"}},icon:i.jsx(vo,{}),onClickCapture:m,children:"Delete Selection"})]})})},children:t})},DL=p.memo(TL),AL=e=>Pe([mn],({gallery:t})=>{const n=t.selection.includes(e),r=t.selection.length;return{isSelected:n,selectionCount:r}},Et),NL=e=>{const{imageDTO:t}=e,{image_url:n,thumbnail_url:r,image_name:o}=t,s=p.useMemo(()=>AL(o),[o]),{isSelected:a,selectionCount:u}=B(s),d=re();me();const f=p.useCallback(v=>{d(yv(e.imageDTO.image_name))},[d,e.imageDTO.image_name]),h=p.useCallback(v=>{v.stopPropagation(),t&&d($0(t))},[d,t]),m=p.useMemo(()=>{if(u>1)return{id:"gallery-image",payloadType:"GALLERY_SELECTION"};if(t)return{id:"gallery-image",payloadType:"IMAGE_DTO",payload:{imageDTO:t}}},[t,u]);return i.jsx(qe,{sx:{w:"full",h:"full",touchAction:"none"},children:i.jsx(DL,{image:t,children:v=>i.jsx(qe,{position:"relative",userSelect:"none",ref:v,sx:{display:"flex",justifyContent:"center",alignItems:"center",aspectRatio:"1/1"},children:i.jsx(qi,{onClick:f,imageDTO:t,draggableData:m,isSelected:a,minSize:0,onClickReset:h,resetIcon:i.jsx(vo,{}),resetTooltip:"Delete image",imageSx:{w:"full",h:"full"},isDropDisabled:!0,isUploadDisabled:!0,thumbnail:!0})},o)})})},zL=p.memo(NL),Th=0,el=1,xc=2,ik=4;function $L(e,t){return n=>e(t(n))}function LL(e,t){return t(e)}function lk(e,t){return n=>e(t,n)}function xS(e,t){return()=>e(t)}function X1(e,t){return t(e),e}function tl(...e){return e}function FL(e){e()}function SS(e){return()=>e}function BL(...e){return()=>{e.map(FL)}}function HL(e){return e!==void 0}function Dh(){}function ns(e,t){return e(el,t)}function ki(e,t){e(Th,t)}function Q1(e){e(xc)}function Ah(e){return e(ik)}function Vn(e,t){return ns(e,lk(t,Th))}function Tr(){const e=[];return(t,n)=>{switch(t){case xc:e.splice(0,e.length);return;case el:return e.push(n),()=>{const r=e.indexOf(n);r>-1&&e.splice(r,1)};case Th:e.slice().forEach(r=>{r(n)});return;default:throw new Error(`unrecognized action ${t}`)}}}function qt(e){let t=e;const n=Tr();return(r,o)=>{switch(r){case el:o(t);break;case Th:t=o;break;case ik:return t}return n(r,o)}}function WL(e){let t,n;const r=()=>t&&t();return function(o,s){switch(o){case el:return s?n===s?void 0:(r(),n=s,t=ns(e,s),t):(r(),Dh);case xc:r(),n=null;return;default:throw new Error(`unrecognized action ${o}`)}}}function uu(e){return X1(Tr(),t=>Vn(e,t))}function Wl(e,t){return X1(qt(t),n=>Vn(e,n))}function VL(...e){return t=>e.reduceRight(LL,t)}function Jt(e,...t){const n=VL(...t);return(r,o)=>{switch(r){case el:return ns(e,n(o));case xc:Q1(e);return}}}function ck(e,t){return e===t}function go(e=ck){let t;return n=>r=>{e(t,r)||(t=r,n(r))}}function Qo(e){return t=>n=>{e(n)&&t(n)}}function er(e){return t=>$L(t,e)}function _i(e){return t=>()=>t(e)}function ef(e,t){return n=>r=>n(t=e(t,r))}function wS(e){return t=>n=>{e>0?e--:t(n)}}function tf(e){let t=null,n;return r=>o=>{t=o,!n&&(n=setTimeout(()=>{n=void 0,r(t)},e))}}function CS(e){let t,n;return r=>o=>{t=o,n&&clearTimeout(n),n=setTimeout(()=>{r(t)},e)}}function Ga(...e){const t=new Array(e.length);let n=0,r=null;const o=Math.pow(2,e.length)-1;return e.forEach((s,a)=>{const u=Math.pow(2,a);ns(s,d=>{const f=n;n=n|u,t[a]=d,f!==o&&n===o&&r&&(r(),r=null)})}),s=>a=>{const u=()=>s([a].concat(t));n===o?u():r=u}}function PS(...e){return function(t,n){switch(t){case el:return BL(...e.map(r=>ns(r,n)));case xc:return;default:throw new Error(`unrecognized action ${t}`)}}}function tr(e,t=ck){return Jt(e,go(t))}function Ki(...e){const t=Tr(),n=new Array(e.length);let r=0;const o=Math.pow(2,e.length)-1;return e.forEach((s,a)=>{const u=Math.pow(2,a);ns(s,d=>{n[a]=d,r=r|u,r===o&&ki(t,n)})}),function(s,a){switch(s){case el:return r===o&&a(n),ns(t,a);case xc:return Q1(t);default:throw new Error(`unrecognized action ${s}`)}}}function Qs(e,t=[],{singleton:n}={singleton:!0}){return{id:UL(),constructor:e,dependencies:t,singleton:n}}const UL=()=>Symbol();function GL(e){const t=new Map,n=({id:r,constructor:o,dependencies:s,singleton:a})=>{if(a&&t.has(r))return t.get(r);const u=o(s.map(d=>n(d)));return a&&t.set(r,u),u};return n(e)}function qL(e,t){const n={},r={};let o=0;const s=e.length;for(;o(S[P]=k=>{const j=C[t.methods[P]];ki(j,k)},S),{})}function h(C){return a.reduce((S,P)=>(S[P]=WL(C[t.events[P]]),S),{})}return{Component:z.forwardRef((C,S)=>{const{children:P,...k}=C,[j]=z.useState(()=>X1(GL(e),I=>d(I,k))),[E]=z.useState(xS(h,j));return nf(()=>{for(const I of a)I in k&&ns(E[I],k[I]);return()=>{Object.values(E).map(Q1)}},[k,E,j]),nf(()=>{d(j,k)}),z.useImperativeHandle(S,SS(f(j))),z.createElement(u.Provider,{value:j},n?z.createElement(n,qL([...r,...o,...a],k),P):P)}),usePublisher:C=>z.useCallback(lk(ki,z.useContext(u)[C]),[C]),useEmitterValue:C=>{const P=z.useContext(u)[C],[k,j]=z.useState(xS(Ah,P));return nf(()=>ns(P,E=>{E!==k&&j(SS(E))}),[P,k]),k},useEmitter:(C,S)=>{const k=z.useContext(u)[C];nf(()=>ns(k,S),[S,k])}}}const YL=typeof document<"u"?z.useLayoutEffect:z.useEffect,XL=YL;var Z1=(e=>(e[e.DEBUG=0]="DEBUG",e[e.INFO=1]="INFO",e[e.WARN=2]="WARN",e[e.ERROR=3]="ERROR",e))(Z1||{});const QL={[0]:"debug",[1]:"log",[2]:"warn",[3]:"error"},ZL=()=>typeof globalThis>"u"?window:globalThis,uk=Qs(()=>{const e=qt(3);return{log:qt((n,r,o=1)=>{var s;const a=(s=ZL().VIRTUOSO_LOG_LEVEL)!=null?s:Ah(e);o>=a&&console[QL[o]]("%creact-virtuoso: %c%s %o","color: #0253b3; font-weight: bold","color: initial",n,r)}),logLevel:e}},[],{singleton:!0});function dk(e,t=!0){const n=z.useRef(null);let r=o=>{};if(typeof ResizeObserver<"u"){const o=z.useMemo(()=>new ResizeObserver(s=>{const a=s[0].target;a.offsetParent!==null&&e(a)}),[e]);r=s=>{s&&t?(o.observe(s),n.current=s):(n.current&&o.unobserve(n.current),n.current=null)}}return{ref:n,callbackRef:r}}function Nh(e,t=!0){return dk(e,t).callbackRef}function up(e,t){return Math.round(e.getBoundingClientRect()[t])}function fk(e,t){return Math.abs(e-t)<1.01}function pk(e,t,n,r=Dh,o){const s=z.useRef(null),a=z.useRef(null),u=z.useRef(null),d=z.useCallback(m=>{const v=m.target,b=v===window||v===document,w=b?window.pageYOffset||document.documentElement.scrollTop:v.scrollTop,C=b?document.documentElement.scrollHeight:v.scrollHeight,S=b?window.innerHeight:v.offsetHeight,P=()=>{e({scrollTop:Math.max(w,0),scrollHeight:C,viewportHeight:S})};m.suppressFlushSync?P():VO.flushSync(P),a.current!==null&&(w===a.current||w<=0||w===C-S)&&(a.current=null,t(!0),u.current&&(clearTimeout(u.current),u.current=null))},[e,t]);z.useEffect(()=>{const m=o||s.current;return r(o||s.current),d({target:m,suppressFlushSync:!0}),m.addEventListener("scroll",d,{passive:!0}),()=>{r(null),m.removeEventListener("scroll",d)}},[s,d,n,r,o]);function f(m){const v=s.current;if(!v||"offsetHeight"in v&&v.offsetHeight===0)return;const b=m.behavior==="smooth";let w,C,S;v===window?(C=Math.max(up(document.documentElement,"height"),document.documentElement.scrollHeight),w=window.innerHeight,S=document.documentElement.scrollTop):(C=v.scrollHeight,w=up(v,"height"),S=v.scrollTop);const P=C-w;if(m.top=Math.ceil(Math.max(Math.min(P,m.top),0)),fk(w,C)||m.top===S){e({scrollTop:S,scrollHeight:C,viewportHeight:w}),b&&t(!0);return}b?(a.current=m.top,u.current&&clearTimeout(u.current),u.current=setTimeout(()=>{u.current=null,a.current=null,t(!0)},1e3)):a.current=null,v.scrollTo(m)}function h(m){s.current.scrollBy(m)}return{scrollerRef:s,scrollByCallback:h,scrollToCallback:f}}const zh=Qs(()=>{const e=Tr(),t=Tr(),n=qt(0),r=Tr(),o=qt(0),s=Tr(),a=Tr(),u=qt(0),d=qt(0),f=qt(0),h=qt(0),m=Tr(),v=Tr(),b=qt(!1);return Vn(Jt(e,er(({scrollTop:w})=>w)),t),Vn(Jt(e,er(({scrollHeight:w})=>w)),a),Vn(t,o),{scrollContainerState:e,scrollTop:t,viewportHeight:s,headerHeight:u,fixedHeaderHeight:d,fixedFooterHeight:f,footerHeight:h,scrollHeight:a,smoothScrollTargetReached:r,scrollTo:m,scrollBy:v,statefulScrollTop:o,deviation:n,scrollingInProgress:b}},[],{singleton:!0}),JL=typeof document<"u"&&"scrollBehavior"in document.documentElement.style;function eF(e){const t=typeof e=="number"?{index:e}:e;return t.align||(t.align="start"),(!t.behavior||!JL)&&(t.behavior="auto"),t.offset||(t.offset=0),t}const dp="up",du="down",tF="none",nF={atBottom:!1,notAtBottomBecause:"NOT_SHOWING_LAST_ITEM",state:{offsetBottom:0,scrollTop:0,viewportHeight:0,scrollHeight:0}},rF=0,hk=Qs(([{scrollContainerState:e,scrollTop:t,viewportHeight:n,headerHeight:r,footerHeight:o,scrollBy:s}])=>{const a=qt(!1),u=qt(!0),d=Tr(),f=Tr(),h=qt(4),m=qt(rF),v=Wl(Jt(PS(Jt(tr(t),wS(1),_i(!0)),Jt(tr(t),wS(1),_i(!1),CS(100))),go()),!1),b=Wl(Jt(PS(Jt(s,_i(!0)),Jt(s,_i(!1),CS(200))),go()),!1);Vn(Jt(Ki(tr(t),tr(m)),er(([k,j])=>k<=j),go()),u),Vn(Jt(u,tf(50)),f);const w=uu(Jt(Ki(e,tr(n),tr(r),tr(o),tr(h)),ef((k,[{scrollTop:j,scrollHeight:E},I,O,R,M])=>{const A=j+I-E>-M,L={viewportHeight:I,scrollTop:j,scrollHeight:E};if(A){let V,$;return j>k.state.scrollTop?(V="SCROLLED_DOWN",$=k.state.scrollTop-j):(V="SIZE_DECREASED",$=k.state.scrollTop-j||k.scrollTopDelta),{atBottom:!0,state:L,atBottomBecause:V,scrollTopDelta:$}}let D;return L.scrollHeight>k.state.scrollHeight?D="SIZE_INCREASED":Ik&&k.atBottom===j.atBottom))),C=Wl(Jt(e,ef((k,{scrollTop:j,scrollHeight:E,viewportHeight:I})=>{if(fk(k.scrollHeight,E))return{scrollTop:j,scrollHeight:E,jump:0,changed:!1};{const O=E-(j+I)<1;return k.scrollTop!==j&&O?{scrollHeight:E,scrollTop:j,jump:k.scrollTop-j,changed:!0}:{scrollHeight:E,scrollTop:j,jump:0,changed:!0}}},{scrollHeight:0,jump:0,scrollTop:0,changed:!1}),Qo(k=>k.changed),er(k=>k.jump)),0);Vn(Jt(w,er(k=>k.atBottom)),a),Vn(Jt(a,tf(50)),d);const S=qt(du);Vn(Jt(e,er(({scrollTop:k})=>k),go(),ef((k,j)=>Ah(b)?{direction:k.direction,prevScrollTop:j}:{direction:jk.direction)),S),Vn(Jt(e,tf(50),_i(tF)),S);const P=qt(0);return Vn(Jt(v,Qo(k=>!k),_i(0)),P),Vn(Jt(t,tf(100),Ga(v),Qo(([k,j])=>!!j),ef(([k,j],[E])=>[j,E],[0,0]),er(([k,j])=>j-k)),P),{isScrolling:v,isAtTop:u,isAtBottom:a,atBottomState:w,atTopStateChange:f,atBottomStateChange:d,scrollDirection:S,atBottomThreshold:h,atTopThreshold:m,scrollVelocity:P,lastJumpDueToItemResize:C}},tl(zh)),oF=Qs(([{log:e}])=>{const t=qt(!1),n=uu(Jt(t,Qo(r=>r),go()));return ns(t,r=>{r&&Ah(e)("props updated",{},Z1.DEBUG)}),{propsReady:t,didMount:n}},tl(uk),{singleton:!0});function Zv(e,t){return!!(e&&e[0]===t[0]&&e[1]===t[1])}function sF(e,t){return!!(e&&e.startIndex===t.startIndex&&e.endIndex===t.endIndex)}const fp="top",pp="bottom",kS="none";function _S(e,t,n){return typeof e=="number"?n===dp&&t===fp||n===du&&t===pp?e:0:n===dp?t===fp?e.main:e.reverse:t===pp?e.main:e.reverse}function jS(e,t){return typeof e=="number"?e:e[t]||0}const aF=Qs(([{scrollTop:e,viewportHeight:t,deviation:n,headerHeight:r,fixedHeaderHeight:o}])=>{const s=Tr(),a=qt(0),u=qt(0),d=qt(0),f=Wl(Jt(Ki(tr(e),tr(t),tr(r),tr(s,Zv),tr(d),tr(a),tr(o),tr(n),tr(u)),er(([h,m,v,[b,w],C,S,P,k,j])=>{const E=h-k,I=S+P,O=Math.max(v-E,0);let R=kS;const M=jS(j,fp),A=jS(j,pp);return b-=k,b+=v+P,w+=v+P,w-=k,b>h+I-M&&(R=dp),wh!=null),go(Zv)),[0,0]);return{listBoundary:s,overscan:d,topListHeight:a,increaseViewportBy:u,visibleRange:f}},tl(zh),{singleton:!0}),iF=Qs(([{scrollVelocity:e}])=>{const t=qt(!1),n=Tr(),r=qt(!1);return Vn(Jt(e,Ga(r,t,n),Qo(([o,s])=>!!s),er(([o,s,a,u])=>{const{exit:d,enter:f}=s;if(a){if(d(o,u))return!1}else if(f(o,u))return!0;return a}),go()),t),ns(Jt(Ki(t,e,n),Ga(r)),([[o,s,a],u])=>o&&u&&u.change&&u.change(s,a)),{isSeeking:t,scrollSeekConfiguration:r,scrollVelocity:e,scrollSeekRangeChanged:n}},tl(hk),{singleton:!0});function lF(e){let t=!1,n;return()=>(t||(t=!0,n=e()),n)}const cF=Qs(([{scrollTo:e,scrollContainerState:t}])=>{const n=Tr(),r=Tr(),o=Tr(),s=qt(!1),a=qt(void 0);return Vn(Jt(Ki(n,r),er(([{viewportHeight:u,scrollTop:d,scrollHeight:f},{offsetTop:h}])=>({scrollTop:Math.max(0,d-h),scrollHeight:f,viewportHeight:u}))),t),Vn(Jt(e,Ga(r),er(([u,{offsetTop:d}])=>({...u,top:u.top+d}))),o),{useWindowScroll:s,customScrollParent:a,windowScrollContainerState:n,windowViewportRect:r,windowScrollTo:o}},tl(zh)),Bg="-webkit-sticky",ES="sticky",mk=lF(()=>{if(typeof document>"u")return ES;const e=document.createElement("div");return e.style.position=Bg,e.style.position===Bg?Bg:ES});function uF(e,t){const n=z.useRef(null),r=z.useCallback(u=>{if(u===null||!u.offsetParent)return;const d=u.getBoundingClientRect(),f=d.width;let h,m;if(t){const v=t.getBoundingClientRect(),b=d.top-v.top;h=v.height-Math.max(0,b),m=b+t.scrollTop}else h=window.innerHeight-Math.max(0,d.top),m=d.top+window.pageYOffset;n.current={offsetTop:m,visibleHeight:h,visibleWidth:f},e(n.current)},[e,t]),{callbackRef:o,ref:s}=dk(r),a=z.useCallback(()=>{r(s.current)},[r,s]);return z.useEffect(()=>{if(t){t.addEventListener("scroll",a);const u=new ResizeObserver(a);return u.observe(t),()=>{t.removeEventListener("scroll",a),u.unobserve(t)}}else return window.addEventListener("scroll",a),window.addEventListener("resize",a),()=>{window.removeEventListener("scroll",a),window.removeEventListener("resize",a)}},[a,t]),o}z.createContext(void 0);const gk=z.createContext(void 0);function dF(e){return e}mk();const fF={height:"100%",outline:"none",overflowY:"auto",position:"relative",WebkitOverflowScrolling:"touch"},vk={width:"100%",height:"100%",position:"absolute",top:0};mk();function $i(e,t){if(typeof e!="string")return{context:t}}function pF({usePublisher:e,useEmitter:t,useEmitterValue:n}){return z.memo(function({style:s,children:a,...u}){const d=e("scrollContainerState"),f=n("ScrollerComponent"),h=e("smoothScrollTargetReached"),m=n("scrollerRef"),v=n("context"),{scrollerRef:b,scrollByCallback:w,scrollToCallback:C}=pk(d,h,f,m);return t("scrollTo",C),t("scrollBy",w),z.createElement(f,{ref:b,style:{...fF,...s},"data-test-id":"virtuoso-scroller","data-virtuoso-scroller":!0,tabIndex:0,...u,...$i(f,v)},a)})}function hF({usePublisher:e,useEmitter:t,useEmitterValue:n}){return z.memo(function({style:s,children:a,...u}){const d=e("windowScrollContainerState"),f=n("ScrollerComponent"),h=e("smoothScrollTargetReached"),m=n("totalListHeight"),v=n("deviation"),b=n("customScrollParent"),w=n("context"),{scrollerRef:C,scrollByCallback:S,scrollToCallback:P}=pk(d,h,f,Dh,b);return XL(()=>(C.current=b||window,()=>{C.current=null}),[C,b]),t("windowScrollTo",P),t("scrollBy",S),z.createElement(f,{style:{position:"relative",...s,...m!==0?{height:m+v}:{}},"data-virtuoso-scroller":!0,...u,...$i(f,w)},a)})}const IS={items:[],offsetBottom:0,offsetTop:0,top:0,bottom:0,itemHeight:0,itemWidth:0},mF={items:[{index:0}],offsetBottom:0,offsetTop:0,top:0,bottom:0,itemHeight:0,itemWidth:0},{round:OS,ceil:RS,floor:hp,min:Hg,max:fu}=Math;function gF(e){return{...mF,items:e}}function Wg(e,t,n){return Array.from({length:t-e+1}).map((r,o)=>({index:o+e,data:n==null?void 0:n[o+e]}))}function vF(e,t){return e&&e.column===t.column&&e.row===t.row}function MS(e,t){return e&&e.width===t.width&&e.height===t.height}const yF=Qs(([{overscan:e,visibleRange:t,listBoundary:n},{scrollTop:r,viewportHeight:o,scrollBy:s,scrollTo:a,smoothScrollTargetReached:u,scrollContainerState:d,footerHeight:f,headerHeight:h},m,v,{propsReady:b,didMount:w},{windowViewportRect:C,windowScrollTo:S,useWindowScroll:P,customScrollParent:k,windowScrollContainerState:j},E])=>{const I=qt(0),O=qt(0),R=qt(IS),M=qt({height:0,width:0}),A=qt({height:0,width:0}),L=Tr(),D=Tr(),V=qt(0),$=qt(void 0),F=qt({row:0,column:0});Vn(Jt(w,Ga(O,$),Qo(([q,ne])=>q&&ne!==0),er(([,q,ne])=>({items:Wg(0,q-1,ne),top:0,bottom:0,offsetBottom:0,offsetTop:0,itemHeight:0,itemWidth:0}))),R),Vn(Jt(Ki(tr(I),t,tr(F,vF),tr(A,MS),tr(M,MS),$),er(([q,[ne,ve],le,oe,Y,ae])=>{const{row:de,column:xe}=le,{height:se,width:ge}=oe,{width:fe}=Y;if(q===0||fe===0)return IS;if(ge===0)return gF(Wg(0,0,ae));const ke=yk(fe,ge,xe);let Ae=ke*hp((ne+de)/(se+de)),ye=ke*RS((ve+de)/(se+de))-1;ye=Hg(q-1,fu(ye,ke-1)),Ae=Hg(ye,fu(0,Ae));const Oe=Wg(Ae,ye,ae),{top:at,bottom:Fe}=TS(Y,le,oe,Oe),Ye=RS(q/ke),xt=Ye*se+(Ye-1)*de-Fe;return{items:Oe,offsetTop:at,offsetBottom:xt,top:at,bottom:Fe,itemHeight:se,itemWidth:ge}})),R),Vn(Jt($,Qo(HL),er(q=>q.length)),I),Vn(Jt(M,er(({height:q})=>q)),o),Vn(Jt(Ki(M,A,R,F),er(([q,ne,{items:ve},le])=>{const{top:oe,bottom:Y}=TS(q,le,ne,ve);return[oe,Y]}),go(Zv)),n);const U=qt(!1);Vn(Jt(r,Ga(U),er(([q,ne])=>ne||q!==0)),U);const X=uu(Jt(tr(R),Qo(({items:q})=>q.length>0),Ga(I,U),Qo(([{items:q},ne,ve])=>ve&&q[q.length-1].index===ne-1),er(([,q])=>q-1),go())),N=uu(Jt(tr(R),Qo(({items:q})=>q.length>0&&q[0].index===0),_i(0),go())),G=uu(Jt(tr(R),Qo(({items:q})=>q.length>0),er(({items:q})=>({startIndex:q[0].index,endIndex:q[q.length-1].index})),go(sF)));Vn(G,v.scrollSeekRangeChanged),Vn(Jt(L,Ga(M,A,I,F),er(([q,ne,ve,le,oe])=>{const Y=eF(q),{align:ae,behavior:de,offset:xe}=Y;let se=Y.index;se==="LAST"&&(se=le-1),se=fu(0,se,Hg(le-1,se));let ge=Jv(ne,oe,ve,se);return ae==="end"?ge=OS(ge-ne.height+ve.height):ae==="center"&&(ge=OS(ge-ne.height/2+ve.height/2)),xe&&(ge+=xe),{top:ge,behavior:de}})),a);const W=Wl(Jt(R,er(q=>q.offsetBottom+q.bottom)),0);return Vn(Jt(C,er(q=>({width:q.visibleWidth,height:q.visibleHeight}))),M),{data:$,totalCount:I,viewportDimensions:M,itemDimensions:A,scrollTop:r,scrollHeight:D,overscan:e,scrollBy:s,scrollTo:a,scrollToIndex:L,smoothScrollTargetReached:u,windowViewportRect:C,windowScrollTo:S,useWindowScroll:P,customScrollParent:k,windowScrollContainerState:j,deviation:V,scrollContainerState:d,footerHeight:f,headerHeight:h,initialItemCount:O,gap:F,...v,gridState:R,totalListHeight:W,...m,startReached:N,endReached:X,rangeChanged:G,propsReady:b,...E}},tl(aF,zh,hk,iF,oF,cF,uk));function TS(e,t,n,r){const{height:o}=n;if(o===void 0||r.length===0)return{top:0,bottom:0};const s=Jv(e,t,n,r[0].index),a=Jv(e,t,n,r[r.length-1].index)+o;return{top:s,bottom:a}}function Jv(e,t,n,r){const o=yk(e.width,n.width,t.column),s=hp(r/o),a=s*n.height+fu(0,s-1)*t.row;return a>0?a+t.row:a}function yk(e,t,n){return fu(1,hp((e+n)/(hp(t)+n)))}const bF=Qs(()=>{const e=qt(f=>`Item ${f}`),t=qt({}),n=qt(null),r=qt("virtuoso-grid-item"),o=qt("virtuoso-grid-list"),s=qt(dF),a=qt("div"),u=qt(Dh),d=(f,h=null)=>Wl(Jt(t,er(m=>m[f]),go()),h);return{context:n,itemContent:e,components:t,computeItemKey:s,itemClassName:r,listClassName:o,headerFooterTag:a,scrollerRef:u,FooterComponent:d("Footer"),HeaderComponent:d("Header"),ListComponent:d("List","div"),ItemComponent:d("Item","div"),ScrollerComponent:d("Scroller","div"),ScrollSeekPlaceholder:d("ScrollSeekPlaceholder","div")}}),xF=Qs(([e,t])=>({...e,...t}),tl(yF,bF)),SF=z.memo(function(){const t=hr("gridState"),n=hr("listClassName"),r=hr("itemClassName"),o=hr("itemContent"),s=hr("computeItemKey"),a=hr("isSeeking"),u=xs("scrollHeight"),d=hr("ItemComponent"),f=hr("ListComponent"),h=hr("ScrollSeekPlaceholder"),m=hr("context"),v=xs("itemDimensions"),b=xs("gap"),w=hr("log"),C=Nh(S=>{const P=S.parentElement.parentElement.scrollHeight;u(P);const k=S.firstChild;k&&v(k.getBoundingClientRect()),b({row:DS("row-gap",getComputedStyle(S).rowGap,w),column:DS("column-gap",getComputedStyle(S).columnGap,w)})});return z.createElement(f,{ref:C,className:n,...$i(f,m),style:{paddingTop:t.offsetTop,paddingBottom:t.offsetBottom},"data-test-id":"virtuoso-item-list"},t.items.map(S=>{const P=s(S.index,S.data,m);return a?z.createElement(h,{key:P,...$i(h,m),index:S.index,height:t.itemHeight,width:t.itemWidth}):z.createElement(d,{...$i(d,m),className:r,"data-index":S.index,key:P},o(S.index,S.data,m))}))}),wF=z.memo(function(){const t=hr("HeaderComponent"),n=xs("headerHeight"),r=hr("headerFooterTag"),o=Nh(a=>n(up(a,"height"))),s=hr("context");return t?z.createElement(r,{ref:o},z.createElement(t,$i(t,s))):null}),CF=z.memo(function(){const t=hr("FooterComponent"),n=xs("footerHeight"),r=hr("headerFooterTag"),o=Nh(a=>n(up(a,"height"))),s=hr("context");return t?z.createElement(r,{ref:o},z.createElement(t,$i(t,s))):null}),PF=({children:e})=>{const t=z.useContext(gk),n=xs("itemDimensions"),r=xs("viewportDimensions"),o=Nh(s=>{r(s.getBoundingClientRect())});return z.useEffect(()=>{t&&(r({height:t.viewportHeight,width:t.viewportWidth}),n({height:t.itemHeight,width:t.itemWidth}))},[t,r,n]),z.createElement("div",{style:vk,ref:o},e)},kF=({children:e})=>{const t=z.useContext(gk),n=xs("windowViewportRect"),r=xs("itemDimensions"),o=hr("customScrollParent"),s=uF(n,o);return z.useEffect(()=>{t&&(r({height:t.itemHeight,width:t.itemWidth}),n({offsetTop:0,visibleHeight:t.viewportHeight,visibleWidth:t.viewportWidth}))},[t,n,r]),z.createElement("div",{ref:s,style:vk},e)},_F=z.memo(function({...t}){const n=hr("useWindowScroll"),r=hr("customScrollParent"),o=r||n?IF:EF,s=r||n?kF:PF;return z.createElement(o,{...t},z.createElement(s,null,z.createElement(wF,null),z.createElement(SF,null),z.createElement(CF,null)))}),{Component:jF,usePublisher:xs,useEmitterValue:hr,useEmitter:bk}=KL(xF,{optional:{context:"context",totalCount:"totalCount",overscan:"overscan",itemContent:"itemContent",components:"components",computeItemKey:"computeItemKey",data:"data",initialItemCount:"initialItemCount",scrollSeekConfiguration:"scrollSeekConfiguration",headerFooterTag:"headerFooterTag",listClassName:"listClassName",itemClassName:"itemClassName",useWindowScroll:"useWindowScroll",customScrollParent:"customScrollParent",scrollerRef:"scrollerRef",logLevel:"logLevel"},methods:{scrollTo:"scrollTo",scrollBy:"scrollBy",scrollToIndex:"scrollToIndex"},events:{isScrolling:"isScrolling",endReached:"endReached",startReached:"startReached",rangeChanged:"rangeChanged",atBottomStateChange:"atBottomStateChange",atTopStateChange:"atTopStateChange"}},_F),EF=pF({usePublisher:xs,useEmitterValue:hr,useEmitter:bk}),IF=hF({usePublisher:xs,useEmitterValue:hr,useEmitter:bk});function DS(e,t,n){return t!=="normal"&&!(t!=null&&t.endsWith("px"))&&n(`${e} was not resolved to pixel value correctly`,t,Z1.WARN),t==="normal"?0:parseInt(t??"0",10)}const OF=jF,RF=Pe([mn,b3],(e,t)=>{const{categories:n,total:r,isLoading:o,isFetching:s,selectedBoardId:a}=e.gallery;let u=t;return!o&&s&&(u=u.concat(Array(UO).fill("loading"))),{images:u,allImagesTotal:r,isLoading:o,isFetching:s,categories:n,selectedBoardId:a}},Et),MF=()=>{const e=re(),{t}=me(),n=p.useRef(null),[r,o]=p.useState(null),[s,a]=ok({defer:!0,options:{scrollbars:{visibility:"auto",autoHide:"leave",autoHideDelay:1300,theme:"os-theme-dark"},overflow:{x:"hidden"}}}),{images:u,isLoading:d,isFetching:f,allImagesTotal:h,categories:m,selectedBoardId:v}=B(RF),{selectedBoard:b}=lh(void 0,{selectFromResult:({data:k})=>({selectedBoard:k==null?void 0:k.find(j=>j.board_id===v)})}),w=p.useMemo(()=>(b==null?void 0:b.image_count)??h,[h,b==null?void 0:b.image_count]),C=p.useMemo(()=>u.length{e(x3({categories:m,board_id:v,is_intermediate:!1}))},[m,e,v]),P=p.useMemo(()=>{if(C&&!d)return S},[C,S,d]);return p.useEffect(()=>{const{current:k}=n;return r&&k&&s({target:k,elements:{viewport:r}}),()=>{var j;return(j=a())==null?void 0:j.destroy()}},[r,s,a]),d?i.jsx(H,{sx:{w:"full",h:"full",alignItems:"center",justifyContent:"center"},children:i.jsx(ai,{size:"xl",sx:{color:"base.300",_dark:{color:"base.700"}}})}):u.length?i.jsxs(i.Fragment,{children:[i.jsx(qe,{ref:n,"data-overlayscrollbars":"",h:"100%",children:i.jsx(OF,{style:{height:"100%"},data:u,endReached:P,components:{Item:TF,List:DF},scrollerRef:o,itemContent:(k,j)=>typeof j=="string"?i.jsx(g1,{sx:{w:"full",h:"full",aspectRatio:"1/1"}}):i.jsx(zL,{imageDTO:j},`${j.image_name}-${j.thumbnail_url}`)})}),i.jsx(Yt,{onClick:S,isDisabled:!C,isLoading:f,loadingText:"Loading",flexShrink:0,children:t(C?"gallery.loadMore":"gallery.allImagesLoaded")})]}):i.jsx(bc,{label:t("gallery.noImagesInGallery"),icon:qu})},TF=nt((e,t)=>i.jsx(qe,{className:"item-container",ref:t,p:1.5,children:e.children})),DF=nt((e,t)=>{const n=B(r=>r.gallery.galleryImageMinimumWidth);return i.jsx(ma,{...e,className:"list-container",ref:t,sx:{gridTemplateColumns:`repeat(auto-fill, minmax(${n}px, 1fr));`},children:e.children})}),AF=p.memo(MF),NF=Pe([mn],e=>{const{selectedBoardId:t,galleryImageMinimumWidth:n,galleryView:r,shouldAutoSwitch:o}=e.gallery,{shouldPinGallery:s}=e.ui;return{selectedBoardId:t,shouldPinGallery:s,galleryImageMinimumWidth:n,shouldAutoSwitch:o,galleryView:r}},Et),zF=()=>{const e=re(),{t}=me(),n=p.useRef(null),{colorMode:r}=xo(),{selectedBoardId:o,shouldPinGallery:s,galleryImageMinimumWidth:a,shouldAutoSwitch:u,galleryView:d}=B(NF),{selectedBoard:f}=lh(void 0,{selectFromResult:({data:S})=>({selectedBoard:S==null?void 0:S.find(P=>P.board_id===o)})}),{isOpen:h,onToggle:m}=Ja(),v=S=>{e(Vf(S))},b=()=>{e(S3()),e(ks())},w=p.useCallback(()=>{e(Rx(GO)),e(Mx("images"))},[e]),C=p.useCallback(()=>{e(Rx(qO)),e(Mx("assets"))},[e]);return i.jsxs(_r,{sx:{flexDirection:"column",h:"full",w:"full",borderRadius:"base"},children:[i.jsxs(qe,{sx:{w:"full"},children:[i.jsxs(H,{ref:n,sx:{alignItems:"center",justifyContent:"space-between",gap:2},children:[i.jsxs(gr,{isAttached:!0,children:[i.jsx(Ie,{tooltip:t("gallery.images"),"aria-label":t("gallery.images"),onClick:w,isChecked:d==="images",size:"sm",icon:i.jsx(qu,{})}),i.jsx(Ie,{tooltip:t("gallery.assets"),"aria-label":t("gallery.assets"),onClick:C,isChecked:d==="assets",size:"sm",icon:i.jsx(Gz,{})})]}),i.jsxs(H,{as:h3,onClick:m,size:"sm",variant:"ghost",sx:{w:"full",justifyContent:"center",alignItems:"center",px:2,_hover:{bg:Me("base.100","base.800")(r)}},children:[i.jsx(Ue,{noOfLines:1,sx:{w:"full",color:Me("base.800","base.200")(r),fontWeight:600},children:f?f.board_name:"All Images"}),i.jsx(T1,{sx:{transform:h?"rotate(0deg)":"rotate(180deg)",transitionProperty:"common",transitionDuration:"normal"}})]}),i.jsx(la,{triggerComponent:i.jsx(Ie,{tooltip:t("gallery.gallerySettings"),"aria-label":t("gallery.gallerySettings"),size:"sm",icon:i.jsx(R1,{})}),children:i.jsxs(H,{direction:"column",gap:2,children:[i.jsx(vt,{value:a,onChange:v,min:32,max:256,hideTooltip:!0,label:t("gallery.galleryImageSize"),withReset:!0,handleReset:()=>e(Vf(64))}),i.jsx(In,{label:t("gallery.autoSwitchNewImages"),isChecked:u,onChange:S=>e(KO(S.target.checked))})]})}),i.jsx(Ie,{size:"sm","aria-label":t("gallery.pinGallery"),tooltip:`${t("gallery.pinGallery")} (Shift+G)`,onClick:b,icon:s?i.jsx(gP,{}):i.jsx(vP,{})})]}),i.jsx(qe,{children:i.jsx(IL,{isOpen:h})})]}),i.jsx(H,{direction:"column",gap:2,h:"full",w:"full",children:i.jsx(AF,{})})]})},xk=p.memo(zF);var $F=globalThis&&globalThis.__extends||function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,o){r.__proto__=o}||function(r,o){for(var s in o)Object.prototype.hasOwnProperty.call(o,s)&&(r[s]=o[s])},e(t,n)};return function(t,n){e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}(),kr=globalThis&&globalThis.__assign||function(){return kr=Object.assign||function(e){for(var t,n=1,r=arguments.length;n"u"?void 0:Number(r),maxHeight:typeof o>"u"?void 0:Number(o),minWidth:typeof s>"u"?void 0:Number(s),minHeight:typeof a>"u"?void 0:Number(a)}},UF=["as","style","className","grid","snap","bounds","boundsByDirection","size","defaultSize","minWidth","minHeight","maxWidth","maxHeight","lockAspectRatio","lockAspectRatioExtraWidth","lockAspectRatioExtraHeight","enable","handleStyles","handleClasses","handleWrapperStyle","handleWrapperClass","children","onResizeStart","onResize","onResizeStop","handleComponent","scale","resizeRatio","snapGap"],LS="__resizable_base__",GF=function(e){BF(t,e);function t(n){var r=e.call(this,n)||this;return r.ratio=1,r.resizable=null,r.parentLeft=0,r.parentTop=0,r.resizableLeft=0,r.resizableRight=0,r.resizableTop=0,r.resizableBottom=0,r.targetLeft=0,r.targetTop=0,r.appendBase=function(){if(!r.resizable||!r.window)return null;var o=r.parentNode;if(!o)return null;var s=r.window.document.createElement("div");return s.style.width="100%",s.style.height="100%",s.style.position="absolute",s.style.transform="scale(0, 0)",s.style.left="0",s.style.flex="0 0 100%",s.classList?s.classList.add(LS):s.className+=LS,o.appendChild(s),s},r.removeBase=function(o){var s=r.parentNode;s&&s.removeChild(o)},r.ref=function(o){o&&(r.resizable=o)},r.state={isResizing:!1,width:typeof(r.propsSize&&r.propsSize.width)>"u"?"auto":r.propsSize&&r.propsSize.width,height:typeof(r.propsSize&&r.propsSize.height)>"u"?"auto":r.propsSize&&r.propsSize.height,direction:"right",original:{x:0,y:0,width:0,height:0},backgroundStyle:{height:"100%",width:"100%",backgroundColor:"rgba(0,0,0,0)",cursor:"auto",opacity:0,position:"fixed",zIndex:9999,top:"0",left:"0",bottom:"0",right:"0"},flexBasis:void 0},r.onResizeStart=r.onResizeStart.bind(r),r.onMouseMove=r.onMouseMove.bind(r),r.onMouseUp=r.onMouseUp.bind(r),r}return Object.defineProperty(t.prototype,"parentNode",{get:function(){return this.resizable?this.resizable.parentNode:null},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"window",{get:function(){return!this.resizable||!this.resizable.ownerDocument?null:this.resizable.ownerDocument.defaultView},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"propsSize",{get:function(){return this.props.size||this.props.defaultSize||HF},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"size",{get:function(){var n=0,r=0;if(this.resizable&&this.window){var o=this.resizable.offsetWidth,s=this.resizable.offsetHeight,a=this.resizable.style.position;a!=="relative"&&(this.resizable.style.position="relative"),n=this.resizable.style.width!=="auto"?this.resizable.offsetWidth:o,r=this.resizable.style.height!=="auto"?this.resizable.offsetHeight:s,this.resizable.style.position=a}return{width:n,height:r}},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"sizeStyle",{get:function(){var n=this,r=this.props.size,o=function(u){if(typeof n.state[u]>"u"||n.state[u]==="auto")return"auto";if(n.propsSize&&n.propsSize[u]&&n.propsSize[u].toString().endsWith("%")){if(n.state[u].toString().endsWith("%"))return n.state[u].toString();var d=n.getParentSize(),f=Number(n.state[u].toString().replace("px","")),h=f/d[u]*100;return h+"%"}return Vg(n.state[u])},s=r&&typeof r.width<"u"&&!this.state.isResizing?Vg(r.width):o("width"),a=r&&typeof r.height<"u"&&!this.state.isResizing?Vg(r.height):o("height");return{width:s,height:a}},enumerable:!1,configurable:!0}),t.prototype.getParentSize=function(){if(!this.parentNode)return this.window?{width:this.window.innerWidth,height:this.window.innerHeight}:{width:0,height:0};var n=this.appendBase();if(!n)return{width:0,height:0};var r=!1,o=this.parentNode.style.flexWrap;o!=="wrap"&&(r=!0,this.parentNode.style.flexWrap="wrap"),n.style.position="relative",n.style.minWidth="100%",n.style.minHeight="100%";var s={width:n.offsetWidth,height:n.offsetHeight};return r&&(this.parentNode.style.flexWrap=o),this.removeBase(n),s},t.prototype.bindEvents=function(){this.window&&(this.window.addEventListener("mouseup",this.onMouseUp),this.window.addEventListener("mousemove",this.onMouseMove),this.window.addEventListener("mouseleave",this.onMouseUp),this.window.addEventListener("touchmove",this.onMouseMove,{capture:!0,passive:!1}),this.window.addEventListener("touchend",this.onMouseUp))},t.prototype.unbindEvents=function(){this.window&&(this.window.removeEventListener("mouseup",this.onMouseUp),this.window.removeEventListener("mousemove",this.onMouseMove),this.window.removeEventListener("mouseleave",this.onMouseUp),this.window.removeEventListener("touchmove",this.onMouseMove,!0),this.window.removeEventListener("touchend",this.onMouseUp))},t.prototype.componentDidMount=function(){if(!(!this.resizable||!this.window)){var n=this.window.getComputedStyle(this.resizable);this.setState({width:this.state.width||this.size.width,height:this.state.height||this.size.height,flexBasis:n.flexBasis!=="auto"?n.flexBasis:void 0})}},t.prototype.componentWillUnmount=function(){this.window&&this.unbindEvents()},t.prototype.createSizeForCssProperty=function(n,r){var o=this.propsSize&&this.propsSize[r];return this.state[r]==="auto"&&this.state.original[r]===n&&(typeof o>"u"||o==="auto")?"auto":n},t.prototype.calculateNewMaxFromBoundary=function(n,r){var o=this.props.boundsByDirection,s=this.state.direction,a=o&&Cl("left",s),u=o&&Cl("top",s),d,f;if(this.props.bounds==="parent"){var h=this.parentNode;h&&(d=a?this.resizableRight-this.parentLeft:h.offsetWidth+(this.parentLeft-this.resizableLeft),f=u?this.resizableBottom-this.parentTop:h.offsetHeight+(this.parentTop-this.resizableTop))}else this.props.bounds==="window"?this.window&&(d=a?this.resizableRight:this.window.innerWidth-this.resizableLeft,f=u?this.resizableBottom:this.window.innerHeight-this.resizableTop):this.props.bounds&&(d=a?this.resizableRight-this.targetLeft:this.props.bounds.offsetWidth+(this.targetLeft-this.resizableLeft),f=u?this.resizableBottom-this.targetTop:this.props.bounds.offsetHeight+(this.targetTop-this.resizableTop));return d&&Number.isFinite(d)&&(n=n&&n"u"?10:s.width,m=typeof o.width>"u"||o.width<0?n:o.width,v=typeof s.height>"u"?10:s.height,b=typeof o.height>"u"||o.height<0?r:o.height,w=d||0,C=f||0;if(u){var S=(v-w)*this.ratio+C,P=(b-w)*this.ratio+C,k=(h-C)/this.ratio+w,j=(m-C)/this.ratio+w,E=Math.max(h,S),I=Math.min(m,P),O=Math.max(v,k),R=Math.min(b,j);n=of(n,E,I),r=of(r,O,R)}else n=of(n,h,m),r=of(r,v,b);return{newWidth:n,newHeight:r}},t.prototype.setBoundingClientRect=function(){if(this.props.bounds==="parent"){var n=this.parentNode;if(n){var r=n.getBoundingClientRect();this.parentLeft=r.left,this.parentTop=r.top}}if(this.props.bounds&&typeof this.props.bounds!="string"){var o=this.props.bounds.getBoundingClientRect();this.targetLeft=o.left,this.targetTop=o.top}if(this.resizable){var s=this.resizable.getBoundingClientRect(),a=s.left,u=s.top,d=s.right,f=s.bottom;this.resizableLeft=a,this.resizableRight=d,this.resizableTop=u,this.resizableBottom=f}},t.prototype.onResizeStart=function(n,r){if(!(!this.resizable||!this.window)){var o=0,s=0;if(n.nativeEvent&&WF(n.nativeEvent)?(o=n.nativeEvent.clientX,s=n.nativeEvent.clientY):n.nativeEvent&&sf(n.nativeEvent)&&(o=n.nativeEvent.touches[0].clientX,s=n.nativeEvent.touches[0].clientY),this.props.onResizeStart&&this.resizable){var a=this.props.onResizeStart(n,r,this.resizable);if(a===!1)return}this.props.size&&(typeof this.props.size.height<"u"&&this.props.size.height!==this.state.height&&this.setState({height:this.props.size.height}),typeof this.props.size.width<"u"&&this.props.size.width!==this.state.width&&this.setState({width:this.props.size.width})),this.ratio=typeof this.props.lockAspectRatio=="number"?this.props.lockAspectRatio:this.size.width/this.size.height;var u,d=this.window.getComputedStyle(this.resizable);if(d.flexBasis!=="auto"){var f=this.parentNode;if(f){var h=this.window.getComputedStyle(f).flexDirection;this.flexDir=h.startsWith("row")?"row":"column",u=d.flexBasis}}this.setBoundingClientRect(),this.bindEvents();var m={original:{x:o,y:s,width:this.size.width,height:this.size.height},isResizing:!0,backgroundStyle:Ls(Ls({},this.state.backgroundStyle),{cursor:this.window.getComputedStyle(n.target).cursor||"auto"}),direction:r,flexBasis:u};this.setState(m)}},t.prototype.onMouseMove=function(n){var r=this;if(!(!this.state.isResizing||!this.resizable||!this.window)){if(this.window.TouchEvent&&sf(n))try{n.preventDefault(),n.stopPropagation()}catch{}var o=this.props,s=o.maxWidth,a=o.maxHeight,u=o.minWidth,d=o.minHeight,f=sf(n)?n.touches[0].clientX:n.clientX,h=sf(n)?n.touches[0].clientY:n.clientY,m=this.state,v=m.direction,b=m.original,w=m.width,C=m.height,S=this.getParentSize(),P=VF(S,this.window.innerWidth,this.window.innerHeight,s,a,u,d);s=P.maxWidth,a=P.maxHeight,u=P.minWidth,d=P.minHeight;var k=this.calculateNewSizeFromDirection(f,h),j=k.newHeight,E=k.newWidth,I=this.calculateNewMaxFromBoundary(s,a);this.props.snap&&this.props.snap.x&&(E=$S(E,this.props.snap.x,this.props.snapGap)),this.props.snap&&this.props.snap.y&&(j=$S(j,this.props.snap.y,this.props.snapGap));var O=this.calculateNewSizeFromAspectRatio(E,j,{width:I.maxWidth,height:I.maxHeight},{width:u,height:d});if(E=O.newWidth,j=O.newHeight,this.props.grid){var R=zS(E,this.props.grid[0]),M=zS(j,this.props.grid[1]),A=this.props.snapGap||0;E=A===0||Math.abs(R-E)<=A?R:E,j=A===0||Math.abs(M-j)<=A?M:j}var L={width:E-b.width,height:j-b.height};if(w&&typeof w=="string"){if(w.endsWith("%")){var D=E/S.width*100;E=D+"%"}else if(w.endsWith("vw")){var V=E/this.window.innerWidth*100;E=V+"vw"}else if(w.endsWith("vh")){var $=E/this.window.innerHeight*100;E=$+"vh"}}if(C&&typeof C=="string"){if(C.endsWith("%")){var D=j/S.height*100;j=D+"%"}else if(C.endsWith("vw")){var V=j/this.window.innerWidth*100;j=V+"vw"}else if(C.endsWith("vh")){var $=j/this.window.innerHeight*100;j=$+"vh"}}var F={width:this.createSizeForCssProperty(E,"width"),height:this.createSizeForCssProperty(j,"height")};this.flexDir==="row"?F.flexBasis=F.width:this.flexDir==="column"&&(F.flexBasis=F.height),pc.flushSync(function(){r.setState(F)}),this.props.onResize&&this.props.onResize(n,v,this.resizable,L)}},t.prototype.onMouseUp=function(n){var r=this.state,o=r.isResizing,s=r.direction,a=r.original;if(!(!o||!this.resizable)){var u={width:this.size.width-a.width,height:this.size.height-a.height};this.props.onResizeStop&&this.props.onResizeStop(n,s,this.resizable,u),this.props.size&&this.setState(this.props.size),this.unbindEvents(),this.setState({isResizing:!1,backgroundStyle:Ls(Ls({},this.state.backgroundStyle),{cursor:"auto"})})}},t.prototype.updateSize=function(n){this.setState({width:n.width,height:n.height})},t.prototype.renderResizer=function(){var n=this,r=this.props,o=r.enable,s=r.handleStyles,a=r.handleClasses,u=r.handleWrapperStyle,d=r.handleWrapperClass,f=r.handleComponent;if(!o)return null;var h=Object.keys(o).map(function(m){return o[m]!==!1?p.createElement(FF,{key:m,direction:m,onResizeStart:n.onResizeStart,replaceStyles:s&&s[m],className:a&&a[m]},f&&f[m]?f[m]:null):null});return p.createElement("div",{className:d,style:u},h)},t.prototype.render=function(){var n=this,r=Object.keys(this.props).reduce(function(a,u){return UF.indexOf(u)!==-1||(a[u]=n.props[u]),a},{}),o=Ls(Ls(Ls({position:"relative",userSelect:this.state.isResizing?"none":"auto"},this.props.style),this.sizeStyle),{maxWidth:this.props.maxWidth,maxHeight:this.props.maxHeight,minWidth:this.props.minWidth,minHeight:this.props.minHeight,boxSizing:"border-box",flexShrink:0});this.state.flexBasis&&(o.flexBasis=this.state.flexBasis);var s=this.props.as||"div";return p.createElement(s,Ls({ref:this.ref,style:o,className:this.props.className},r),this.state.isResizing&&p.createElement("div",{style:this.state.backgroundStyle}),this.props.children,this.renderResizer())},t.defaultProps={as:"div",onResizeStart:function(){},onResize:function(){},onResizeStop:function(){},enable:{top:!0,right:!0,bottom:!0,left:!0,topRight:!0,bottomRight:!0,bottomLeft:!0,topLeft:!0},style:{},grid:[1,1],lockAspectRatio:!1,lockAspectRatioExtraWidth:0,lockAspectRatioExtraHeight:0,scale:1,resizeRatio:1,snapGap:0},t}(p.PureComponent);const qF=({direction:e,langDirection:t})=>({top:e==="bottom",right:t!=="rtl"&&e==="left"||t==="rtl"&&e==="right",bottom:e==="top",left:t!=="rtl"&&e==="right"||t==="rtl"&&e==="left"}),KF=({direction:e,minWidth:t,maxWidth:n,minHeight:r,maxHeight:o})=>{const s=t??(["left","right"].includes(e)?10:void 0),a=n??(["left","right"].includes(e)?"95vw":void 0),u=r??(["top","bottom"].includes(e)?10:void 0),d=o??(["top","bottom"].includes(e)?"95vh":void 0);return{...s?{minWidth:s}:{},...a?{maxWidth:a}:{},...u?{minHeight:u}:{},...d?{maxHeight:d}:{}}},sa="0.75rem",lf="1rem",Hc="5px",YF=({isResizable:e,direction:t})=>{const n=`calc((2 * ${sa} + ${Hc}) / -2)`;return t==="top"?{containerStyles:{borderBottomWidth:Hc,paddingBottom:lf},handleStyles:e?{top:{paddingTop:sa,paddingBottom:sa,bottom:n}}:{}}:t==="left"?{containerStyles:{borderInlineEndWidth:Hc,paddingInlineEnd:lf},handleStyles:e?{right:{paddingInlineStart:sa,paddingInlineEnd:sa,insetInlineEnd:n}}:{}}:t==="bottom"?{containerStyles:{borderTopWidth:Hc,paddingTop:lf},handleStyles:e?{bottom:{paddingTop:sa,paddingBottom:sa,top:n}}:{}}:t==="right"?{containerStyles:{borderInlineStartWidth:Hc,paddingInlineStart:lf},handleStyles:e?{left:{paddingInlineStart:sa,paddingInlineEnd:sa,insetInlineStart:n}}:{}}:{containerStyles:{},handleStyles:{}}},XF=(e,t)=>["top","bottom"].includes(e)?e:e==="left"?t==="rtl"?"right":"left":e==="right"?t==="rtl"?"left":"right":"left",QF=Be(GF,{shouldForwardProp:e=>!["sx"].includes(e)}),Sk=({direction:e="left",isResizable:t,isOpen:n,onClose:r,children:o,initialWidth:s,minWidth:a,maxWidth:u,initialHeight:d,minHeight:f,maxHeight:h,onResizeStart:m,onResizeStop:v,onResize:b,sx:w={}})=>{const C=ah().direction,{colorMode:S}=xo(),P=p.useRef(null),k=p.useMemo(()=>s??a??(["left","right"].includes(e)?"auto":"100%"),[s,a,e]),j=p.useMemo(()=>d??f??(["top","bottom"].includes(e)?"auto":"100%"),[d,f,e]),[E,I]=p.useState(k),[O,R]=p.useState(j);gD({ref:P,handler:()=>{r()},enabled:n});const M=p.useMemo(()=>t?qF({direction:e,langDirection:C}):{},[t,C,e]),A=p.useMemo(()=>KF({direction:e,minWidth:a,maxWidth:u,minHeight:f,maxHeight:h}),[a,u,f,h,e]),{containerStyles:L,handleStyles:D}=p.useMemo(()=>YF({isResizable:t,direction:e}),[t,e]),V=p.useMemo(()=>XF(e,C),[e,C]);return p.useEffect(()=>{["left","right"].includes(e)&&R("100vh"),["top","bottom"].includes(e)&&I("100vw")},[e]),i.jsx(g5,{direction:V,in:n,motionProps:{initial:!1},style:{width:"full"},children:i.jsx(qe,{ref:P,sx:{width:"full",height:"full"},children:i.jsx(QF,{size:{width:t?E:k,height:t?O:j},enable:M,handleStyles:D,...A,sx:{borderColor:Me("base.200","base.800")(S),p:4,bg:Me("base.100","base.900")(S),height:"full",shadow:n?"dark-lg":void 0,...L,...w},onResizeStart:($,F,U)=>{m&&m($,F,U)},onResize:($,F,U,X)=>{b&&b($,F,U,X)},onResizeStop:($,F,U,X)=>{["left","right"].includes(F)&&I(Number(E)+X.width),["top","bottom"].includes(F)&&R(Number(O)+X.height),v&&v($,F,U,X)},children:o})})})},wk=Pe(e=>e.lightbox,e=>e,{memoizeOptions:{equalityCheck:Wt}}),ZF=Pe([Sr,So,mP,rr,wk],(e,t,n,r,o)=>{const{shouldPinGallery:s,shouldShowGallery:a}=t,{galleryImageMinimumWidth:u}=n,{isLightboxOpen:d}=o;return{activeTabName:e,isStaging:r,shouldPinGallery:s,shouldShowGallery:a,galleryImageMinimumWidth:u,isResizable:e!=="unifiedCanvas",isLightboxOpen:d}},{memoizeOptions:{resultEqualityCheck:Wt}}),JF=()=>{const e=re(),{shouldPinGallery:t,shouldShowGallery:n,galleryImageMinimumWidth:r}=B(ZF),o=()=>{e(bv(!1)),t&&e(ks())};Ge("esc",()=>{e(bv(!1))},{enabled:()=>!t,preventDefault:!0},[t]);const s=32;return Ge("shift+up",()=>{if(r<256){const a=Us(r+s,32,256);e(Vf(a))}},[r]),Ge("shift+down",()=>{if(r>32){const a=Us(r-s,32,256);e(Vf(a))}},[r]),t?null:i.jsx(Sk,{direction:"right",isResizable:!0,isOpen:n,onClose:o,minWidth:337,children:i.jsx(xk,{})})},eB=p.memo(JF),tB=e=>{const{label:t,isDisabled:n=!1,width:r="auto",formControlProps:o,formLabelProps:s,tooltip:a,...u}=e;return i.jsx(Gn,{label:a,hasArrow:!0,placement:"top",isDisabled:!a,children:i.jsxs(ir,{isDisabled:n,width:r,display:"flex",alignItems:"center",...o,children:[t&&i.jsx(mr,{my:1,flexGrow:1,sx:{cursor:n?"not-allowed":"pointer",...s==null?void 0:s.sx,pe:4},...s,children:t}),i.jsx(v1,{...u})]})})},jn=p.memo(tB),nB=e=>{const{imageUsage:t}=e;return!t||!w3(t)?null:i.jsxs(i.Fragment,{children:[i.jsx(Ue,{children:"This image is currently in use in the following features:"}),i.jsxs(mh,{sx:{paddingInlineStart:6},children:[t.isInitialImage&&i.jsx(To,{children:"Image to Image"}),t.isCanvasImage&&i.jsx(To,{children:"Unified Canvas"}),t.isControlNetImage&&i.jsx(To,{children:"ControlNet"}),t.isNodesImage&&i.jsx(To,{children:"Node Editor"})]}),i.jsx(Ue,{children:"If you delete this image, those features will immediately be reset."})]})},rB=p.memo(nB),oB=Pe([mn,YO],({system:e,config:t,imageDeletion:n},r)=>{const{shouldConfirmOnDelete:o}=e,{canRestoreDeletedImagesFromBin:s}=t,{imageToDelete:a,isModalOpen:u}=n;return{shouldConfirmOnDelete:o,canRestoreDeletedImagesFromBin:s,imageToDelete:a,imageUsage:r,isModalOpen:u}},Et),sB=()=>{const e=re(),{t}=me(),{shouldConfirmOnDelete:n,canRestoreDeletedImagesFromBin:r,imageToDelete:o,imageUsage:s,isModalOpen:a}=B(oB),u=p.useCallback(m=>e(C3(!m.target.checked)),[e]),d=p.useCallback(()=>{e(Tx()),e(XO(!1))},[e]),f=p.useCallback(()=>{!o||!s||(e(Tx()),e(QO({imageDTO:o,imageUsage:s})))},[e,o,s]),h=p.useRef(null);return i.jsx(bh,{isOpen:a,onClose:d,leastDestructiveRef:h,isCentered:!0,children:i.jsx(ni,{children:i.jsxs(xh,{children:[i.jsx(ti,{fontSize:"lg",fontWeight:"bold",children:t("gallery.deleteImage")}),i.jsx(ri,{children:i.jsxs(H,{direction:"column",gap:3,children:[i.jsx(rB,{imageUsage:s}),i.jsx(wa,{}),i.jsx(Ue,{children:t(r?"gallery.deleteImageBin":"gallery.deleteImagePermanent")}),i.jsx(Ue,{children:t("common.areYouSure")}),i.jsx(jn,{label:t("common.dontAskMeAgain"),isChecked:!n,onChange:u})]})}),i.jsxs(ei,{children:[i.jsx(Yt,{ref:h,onClick:d,children:"Cancel"}),i.jsx(Yt,{colorScheme:"error",onClick:f,ml:3,children:"Delete"})]})]})})})},aB=p.memo(sB),iB=Pe([mn],({system:e})=>{const{isProcessing:t,isConnected:n}=e;return n&&!t}),lB=e=>{const{onClick:t,isDisabled:n}=e,{t:r}=me(),o=B(iB);return i.jsx(Ie,{onClick:t,icon:i.jsx(vo,{}),tooltip:`${r("gallery.deleteImage")} (Del)`,"aria-label":`${r("gallery.deleteImage")} (Del)`,isDisabled:n||!o,colorScheme:"error"})};function cB(e){const t=p.createContext(null);return[({children:o,value:s})=>z.createElement(t.Provider,{value:s},o),()=>{const o=p.useContext(t);if(o===null)throw new Error(e);return o}]}function Ck(e){return Array.isArray(e)?e:[e]}const uB=()=>{};function dB(e,t={active:!0}){return typeof e!="function"||!t.active?t.onKeyDown||uB:n=>{var r;n.key==="Escape"&&(e(n),(r=t.onTrigger)==null||r.call(t))}}function Pk({data:e}){const t=[],n=[],r=e.reduce((o,s,a)=>(s.group?o[s.group]?o[s.group].push(a):o[s.group]=[a]:n.push(a),o),{});return Object.keys(r).forEach(o=>{t.push(...r[o].map(s=>e[s]))}),t.push(...n.map(o=>e[o])),t}function kk(e){return Array.isArray(e)||e===null?!1:typeof e=="object"?e.type!==z.Fragment:!1}function _k(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+=e;else if(typeof e=="object")if(Array.isArray(e))for(t=0;tr===t[o]).indexOf(!1)>=0)&&(n.current={v:e(),prevDeps:[...t]}),n.current.v}const hB=ZO({key:"mantine",prepend:!0});function mB(){return d5()||hB}var gB=Object.defineProperty,FS=Object.getOwnPropertySymbols,vB=Object.prototype.hasOwnProperty,yB=Object.prototype.propertyIsEnumerable,BS=(e,t,n)=>t in e?gB(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,bB=(e,t)=>{for(var n in t||(t={}))vB.call(t,n)&&BS(e,n,t[n]);if(FS)for(var n of FS(t))yB.call(t,n)&&BS(e,n,t[n]);return e};const Ug="ref";function xB(e){let t;if(e.length!==1)return{args:e,ref:t};const[n]=e;if(!(n instanceof Object))return{args:e,ref:t};if(!(Ug in n))return{args:e,ref:t};t=n[Ug];const r=bB({},n);return delete r[Ug],{args:[r],ref:t}}const{cssFactory:SB}=(()=>{function e(n,r,o){const s=[],a=t8(n,s,o);return s.length<2?o:a+r(s)}function t(n){const{cache:r}=n,o=(...a)=>{const{ref:u,args:d}=xB(a),f=JO(d,r.registered);return e8(r,f,!1),`${r.key}-${f.name}${u===void 0?"":` ${u}`}`};return{css:o,cx:(...a)=>e(r.registered,o,jk(a))}}return{cssFactory:t}})();function Ek(){const e=mB();return pB(()=>SB({cache:e}),[e])}function wB({cx:e,classes:t,context:n,classNames:r,name:o,cache:s}){const a=n.reduce((u,d)=>(Object.keys(d.classNames).forEach(f=>{typeof u[f]!="string"?u[f]=`${d.classNames[f]}`:u[f]=`${u[f]} ${d.classNames[f]}`}),u),{});return Object.keys(t).reduce((u,d)=>(u[d]=e(t[d],a[d],r!=null&&r[d],Array.isArray(o)?o.filter(Boolean).map(f=>`${(s==null?void 0:s.key)||"mantine"}-${f}-${d}`).join(" "):o?`${(s==null?void 0:s.key)||"mantine"}-${o}-${d}`:null),u),{})}var CB=Object.defineProperty,HS=Object.getOwnPropertySymbols,PB=Object.prototype.hasOwnProperty,kB=Object.prototype.propertyIsEnumerable,WS=(e,t,n)=>t in e?CB(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Gg=(e,t)=>{for(var n in t||(t={}))PB.call(t,n)&&WS(e,n,t[n]);if(HS)for(var n of HS(t))kB.call(t,n)&&WS(e,n,t[n]);return e};function e0(e,t){return t&&Object.keys(t).forEach(n=>{e[n]?e[n]=Gg(Gg({},e[n]),t[n]):e[n]=Gg({},t[n])}),e}function VS(e,t,n,r){const o=s=>typeof s=="function"?s(t,n||{},r):s||{};return Array.isArray(e)?e.map(s=>o(s.styles)).reduce((s,a)=>e0(s,a),{}):o(e)}function _B({ctx:e,theme:t,params:n,variant:r,size:o}){return e.reduce((s,a)=>(a.variants&&r in a.variants&&e0(s,a.variants[r](t,n,{variant:r,size:o})),a.sizes&&o in a.sizes&&e0(s,a.sizes[o](t,n,{variant:r,size:o})),s),{})}function Qr(e){const t=typeof e=="function"?e:()=>e;function n(r,o){const s=Sa(),a=k7(o==null?void 0:o.name),u=d5(),d={variant:o==null?void 0:o.variant,size:o==null?void 0:o.size},{css:f,cx:h}=Ek(),m=t(s,r,d),v=VS(o==null?void 0:o.styles,s,r,d),b=VS(a,s,r,d),w=_B({ctx:a,theme:s,params:r,variant:o==null?void 0:o.variant,size:o==null?void 0:o.size}),C=Object.fromEntries(Object.keys(m).map(S=>{const P=h({[f(m[S])]:!(o!=null&&o.unstyled)},f(w[S]),f(b[S]),f(v[S]));return[S,P]}));return{classes:wB({cx:h,classes:C,context:a,classNames:o==null?void 0:o.classNames,name:o==null?void 0:o.name,cache:u}),cx:h,theme:s}}return n}function US(e){return`___ref-${e||""}`}var jB=Object.defineProperty,EB=Object.defineProperties,IB=Object.getOwnPropertyDescriptors,GS=Object.getOwnPropertySymbols,OB=Object.prototype.hasOwnProperty,RB=Object.prototype.propertyIsEnumerable,qS=(e,t,n)=>t in e?jB(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Wc=(e,t)=>{for(var n in t||(t={}))OB.call(t,n)&&qS(e,n,t[n]);if(GS)for(var n of GS(t))RB.call(t,n)&&qS(e,n,t[n]);return e},Vc=(e,t)=>EB(e,IB(t));const Uc={in:{opacity:1,transform:"scale(1)"},out:{opacity:0,transform:`scale(.9) translateY(${Le(10)})`},transitionProperty:"transform, opacity"},cf={fade:{in:{opacity:1},out:{opacity:0},transitionProperty:"opacity"},scale:{in:{opacity:1,transform:"scale(1)"},out:{opacity:0,transform:"scale(0)"},common:{transformOrigin:"top"},transitionProperty:"transform, opacity"},"scale-y":{in:{opacity:1,transform:"scaleY(1)"},out:{opacity:0,transform:"scaleY(0)"},common:{transformOrigin:"top"},transitionProperty:"transform, opacity"},"scale-x":{in:{opacity:1,transform:"scaleX(1)"},out:{opacity:0,transform:"scaleX(0)"},common:{transformOrigin:"left"},transitionProperty:"transform, opacity"},"skew-up":{in:{opacity:1,transform:"translateY(0) skew(0deg, 0deg)"},out:{opacity:0,transform:`translateY(-${Le(20)}) skew(-10deg, -5deg)`},common:{transformOrigin:"top"},transitionProperty:"transform, opacity"},"skew-down":{in:{opacity:1,transform:"translateY(0) skew(0deg, 0deg)"},out:{opacity:0,transform:`translateY(${Le(20)}) skew(-10deg, -5deg)`},common:{transformOrigin:"bottom"},transitionProperty:"transform, opacity"},"rotate-left":{in:{opacity:1,transform:"translateY(0) rotate(0deg)"},out:{opacity:0,transform:`translateY(${Le(20)}) rotate(-5deg)`},common:{transformOrigin:"bottom"},transitionProperty:"transform, opacity"},"rotate-right":{in:{opacity:1,transform:"translateY(0) rotate(0deg)"},out:{opacity:0,transform:`translateY(${Le(20)}) rotate(5deg)`},common:{transformOrigin:"top"},transitionProperty:"transform, opacity"},"slide-down":{in:{opacity:1,transform:"translateY(0)"},out:{opacity:0,transform:"translateY(-100%)"},common:{transformOrigin:"top"},transitionProperty:"transform, opacity"},"slide-up":{in:{opacity:1,transform:"translateY(0)"},out:{opacity:0,transform:"translateY(100%)"},common:{transformOrigin:"bottom"},transitionProperty:"transform, opacity"},"slide-left":{in:{opacity:1,transform:"translateX(0)"},out:{opacity:0,transform:"translateX(100%)"},common:{transformOrigin:"left"},transitionProperty:"transform, opacity"},"slide-right":{in:{opacity:1,transform:"translateX(0)"},out:{opacity:0,transform:"translateX(-100%)"},common:{transformOrigin:"right"},transitionProperty:"transform, opacity"},pop:Vc(Wc({},Uc),{common:{transformOrigin:"center center"}}),"pop-bottom-left":Vc(Wc({},Uc),{common:{transformOrigin:"bottom left"}}),"pop-bottom-right":Vc(Wc({},Uc),{common:{transformOrigin:"bottom right"}}),"pop-top-left":Vc(Wc({},Uc),{common:{transformOrigin:"top left"}}),"pop-top-right":Vc(Wc({},Uc),{common:{transformOrigin:"top right"}})},KS=["mousedown","touchstart"];function MB(e,t,n){const r=p.useRef();return p.useEffect(()=>{const o=s=>{const{target:a}=s??{};if(Array.isArray(n)){const u=(a==null?void 0:a.hasAttribute("data-ignore-outside-clicks"))||!document.body.contains(a)&&a.tagName!=="HTML";n.every(f=>!!f&&!s.composedPath().includes(f))&&!u&&e()}else r.current&&!r.current.contains(a)&&e()};return(t||KS).forEach(s=>document.addEventListener(s,o)),()=>{(t||KS).forEach(s=>document.removeEventListener(s,o))}},[r,e,n]),r}function TB(e,t){try{return e.addEventListener("change",t),()=>e.removeEventListener("change",t)}catch{return e.addListener(t),()=>e.removeListener(t)}}function DB(e,t){return typeof t=="boolean"?t:typeof window<"u"&&"matchMedia"in window?window.matchMedia(e).matches:!1}function AB(e,t,{getInitialValueInEffect:n}={getInitialValueInEffect:!0}){const[r,o]=p.useState(n?t:DB(e,t)),s=p.useRef();return p.useEffect(()=>{if("matchMedia"in window)return s.current=window.matchMedia(e),o(s.current.matches),TB(s.current,a=>o(a.matches))},[e]),r}const Ik=typeof document<"u"?p.useLayoutEffect:p.useEffect;function Ss(e,t){const n=p.useRef(!1);p.useEffect(()=>()=>{n.current=!1},[]),p.useEffect(()=>{if(n.current)return e();n.current=!0},t)}function NB({opened:e,shouldReturnFocus:t=!0}){const n=p.useRef(),r=()=>{var o;n.current&&"focus"in n.current&&typeof n.current.focus=="function"&&((o=n.current)==null||o.focus({preventScroll:!0}))};return Ss(()=>{let o=-1;const s=a=>{a.key==="Tab"&&window.clearTimeout(o)};return document.addEventListener("keydown",s),e?n.current=document.activeElement:t&&(o=window.setTimeout(r,10)),()=>{window.clearTimeout(o),document.removeEventListener("keydown",s)}},[e,t]),r}const zB=/input|select|textarea|button|object/,Ok="a, input, select, textarea, button, object, [tabindex]";function $B(e){return e.style.display==="none"}function LB(e){if(e.getAttribute("aria-hidden")||e.getAttribute("hidden")||e.getAttribute("type")==="hidden")return!1;let n=e;for(;n&&!(n===document.body||n.nodeType===11);){if($B(n))return!1;n=n.parentNode}return!0}function Rk(e){let t=e.getAttribute("tabindex");return t===null&&(t=void 0),parseInt(t,10)}function t0(e){const t=e.nodeName.toLowerCase(),n=!Number.isNaN(Rk(e));return(zB.test(t)&&!e.disabled||e instanceof HTMLAnchorElement&&e.href||n)&&LB(e)}function Mk(e){const t=Rk(e);return(Number.isNaN(t)||t>=0)&&t0(e)}function FB(e){return Array.from(e.querySelectorAll(Ok)).filter(Mk)}function BB(e,t){const n=FB(e);if(!n.length){t.preventDefault();return}const r=n[t.shiftKey?0:n.length-1],o=e.getRootNode();if(!(r===o.activeElement||e===o.activeElement))return;t.preventDefault();const a=n[t.shiftKey?n.length-1:0];a&&a.focus()}function ey(){return`mantine-${Math.random().toString(36).slice(2,11)}`}function HB(e,t="body > :not(script)"){const n=ey(),r=Array.from(document.querySelectorAll(t)).map(o=>{var s;if((s=o==null?void 0:o.shadowRoot)!=null&&s.contains(e)||o.contains(e))return;const a=o.getAttribute("aria-hidden"),u=o.getAttribute("data-hidden"),d=o.getAttribute("data-focus-id");return o.setAttribute("data-focus-id",n),a===null||a==="false"?o.setAttribute("aria-hidden","true"):!u&&!d&&o.setAttribute("data-hidden",a),{node:o,ariaHidden:u||null}});return()=>{r.forEach(o=>{!o||n!==o.node.getAttribute("data-focus-id")||(o.ariaHidden===null?o.node.removeAttribute("aria-hidden"):o.node.setAttribute("aria-hidden",o.ariaHidden),o.node.removeAttribute("data-focus-id"),o.node.removeAttribute("data-hidden"))})}}function WB(e=!0){const t=p.useRef(),n=p.useRef(null),r=s=>{let a=s.querySelector("[data-autofocus]");if(!a){const u=Array.from(s.querySelectorAll(Ok));a=u.find(Mk)||u.find(t0)||null,!a&&t0(s)&&(a=s)}a&&a.focus({preventScroll:!0})},o=p.useCallback(s=>{if(e){if(s===null){n.current&&(n.current(),n.current=null);return}n.current=HB(s),t.current!==s&&(s?(setTimeout(()=>{s.getRootNode()&&r(s)}),t.current=s):t.current=null)}},[e]);return p.useEffect(()=>{if(!e)return;t.current&&setTimeout(()=>r(t.current));const s=a=>{a.key==="Tab"&&t.current&&BB(t.current,a)};return document.addEventListener("keydown",s),()=>{document.removeEventListener("keydown",s),n.current&&n.current()}},[e]),o}const VB=z["useId".toString()]||(()=>{});function UB(){const e=VB();return e?`mantine-${e.replace(/:/g,"")}`:""}function ty(e){const t=UB(),[n,r]=p.useState(t);return Ik(()=>{r(ey())},[]),typeof e=="string"?e:typeof window>"u"?t:n}function YS(e,t,n){p.useEffect(()=>(window.addEventListener(e,t,n),()=>window.removeEventListener(e,t,n)),[e,t])}function GB(e,t){typeof e=="function"?e(t):typeof e=="object"&&e!==null&&"current"in e&&(e.current=t)}function qB(...e){return t=>{e.forEach(n=>GB(n,t))}}function $h(...e){return p.useCallback(qB(...e),e)}function _u({value:e,defaultValue:t,finalValue:n,onChange:r=()=>{}}){const[o,s]=p.useState(t!==void 0?t:n),a=u=>{s(u),r==null||r(u)};return e!==void 0?[e,r,!0]:[o,a,!1]}function Tk(e,t){return AB("(prefers-reduced-motion: reduce)",e,t)}const KB=e=>e<.5?2*e*e:-1+(4-2*e)*e,YB=({axis:e,target:t,parent:n,alignment:r,offset:o,isList:s})=>{if(!t||!n&&typeof document>"u")return 0;const a=!!n,d=(n||document.body).getBoundingClientRect(),f=t.getBoundingClientRect(),h=m=>f[m]-d[m];if(e==="y"){const m=h("top");if(m===0)return 0;if(r==="start"){const b=m-o;return b<=f.height*(s?0:1)||!s?b:0}const v=a?d.height:window.innerHeight;if(r==="end"){const b=m+o-v+f.height;return b>=-f.height*(s?0:1)||!s?b:0}return r==="center"?m-v/2+f.height/2:0}if(e==="x"){const m=h("left");if(m===0)return 0;if(r==="start"){const b=m-o;return b<=f.width||!s?b:0}const v=a?d.width:window.innerWidth;if(r==="end"){const b=m+o-v+f.width;return b>=-f.width||!s?b:0}return r==="center"?m-v/2+f.width/2:0}return 0},XB=({axis:e,parent:t})=>{if(!t&&typeof document>"u")return 0;const n=e==="y"?"scrollTop":"scrollLeft";if(t)return t[n];const{body:r,documentElement:o}=document;return r[n]+o[n]},QB=({axis:e,parent:t,distance:n})=>{if(!t&&typeof document>"u")return;const r=e==="y"?"scrollTop":"scrollLeft";if(t)t[r]=n;else{const{body:o,documentElement:s}=document;o[r]=n,s[r]=n}};function Dk({duration:e=1250,axis:t="y",onScrollFinish:n,easing:r=KB,offset:o=0,cancelable:s=!0,isList:a=!1}={}){const u=p.useRef(0),d=p.useRef(0),f=p.useRef(!1),h=p.useRef(null),m=p.useRef(null),v=Tk(),b=()=>{u.current&&cancelAnimationFrame(u.current)},w=p.useCallback(({alignment:S="start"}={})=>{var P;f.current=!1,u.current&&b();const k=(P=XB({parent:h.current,axis:t}))!=null?P:0,j=YB({parent:h.current,target:m.current,axis:t,alignment:S,offset:o,isList:a})-(h.current?0:k);function E(){d.current===0&&(d.current=performance.now());const O=performance.now()-d.current,R=v||e===0?1:O/e,M=k+j*r(R);QB({parent:h.current,axis:t,distance:M}),!f.current&&R<1?u.current=requestAnimationFrame(E):(typeof n=="function"&&n(),d.current=0,u.current=0,b())}E()},[t,e,r,a,o,n,v]),C=()=>{s&&(f.current=!0)};return YS("wheel",C,{passive:!0}),YS("touchmove",C,{passive:!0}),p.useEffect(()=>b,[]),{scrollableRef:h,targetRef:m,scrollIntoView:w,cancel:b}}var XS=Object.getOwnPropertySymbols,ZB=Object.prototype.hasOwnProperty,JB=Object.prototype.propertyIsEnumerable,eH=(e,t)=>{var n={};for(var r in e)ZB.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&XS)for(var r of XS(e))t.indexOf(r)<0&&JB.call(e,r)&&(n[r]=e[r]);return n};function Lh(e){const t=e,{m:n,mx:r,my:o,mt:s,mb:a,ml:u,mr:d,p:f,px:h,py:m,pt:v,pb:b,pl:w,pr:C,bg:S,c:P,opacity:k,ff:j,fz:E,fw:I,lts:O,ta:R,lh:M,fs:A,tt:L,td:D,w:V,miw:$,maw:F,h:U,mih:X,mah:N,bgsz:G,bgp:W,bgr:q,bga:ne,pos:ve,top:le,left:oe,bottom:Y,right:ae,inset:de,display:xe}=t,se=eH(t,["m","mx","my","mt","mb","ml","mr","p","px","py","pt","pb","pl","pr","bg","c","opacity","ff","fz","fw","lts","ta","lh","fs","tt","td","w","miw","maw","h","mih","mah","bgsz","bgp","bgr","bga","pos","top","left","bottom","right","inset","display"]);return{systemStyles:_7({m:n,mx:r,my:o,mt:s,mb:a,ml:u,mr:d,p:f,px:h,py:m,pt:v,pb:b,pl:w,pr:C,bg:S,c:P,opacity:k,ff:j,fz:E,fw:I,lts:O,ta:R,lh:M,fs:A,tt:L,td:D,w:V,miw:$,maw:F,h:U,mih:X,mah:N,bgsz:G,bgp:W,bgr:q,bga:ne,pos:ve,top:le,left:oe,bottom:Y,right:ae,inset:de,display:xe}),rest:se}}function tH(e,t){const n=Object.keys(e).filter(r=>r!=="base").sort((r,o)=>i2(At({size:r,sizes:t.breakpoints}))-i2(At({size:o,sizes:t.breakpoints})));return"base"in e?["base",...n]:n}function nH({value:e,theme:t,getValue:n,property:r}){if(e==null)return;if(typeof e=="object")return tH(e,t).reduce((a,u)=>{if(u==="base"&&e.base!==void 0){const f=n(e.base,t);return Array.isArray(r)?(r.forEach(h=>{a[h]=f}),a):(a[r]=f,a)}const d=n(e[u],t);return Array.isArray(r)?(a[t.fn.largerThan(u)]={},r.forEach(f=>{a[t.fn.largerThan(u)][f]=d}),a):(a[t.fn.largerThan(u)]={[r]:d},a)},{});const o=n(e,t);return Array.isArray(r)?r.reduce((s,a)=>(s[a]=o,s),{}):{[r]:o}}function rH(e,t){return e==="dimmed"?t.colorScheme==="dark"?t.colors.dark[2]:t.colors.gray[6]:t.fn.variant({variant:"filled",color:e,primaryFallback:!1}).background}function oH(e){return Le(e)}function sH(e){return e}function aH(e,t){return At({size:e,sizes:t.fontSizes})}const iH=["-xs","-sm","-md","-lg","-xl"];function lH(e,t){return iH.includes(e)?`calc(${At({size:e.replace("-",""),sizes:t.spacing})} * -1)`:At({size:e,sizes:t.spacing})}const cH={identity:sH,color:rH,size:oH,fontSize:aH,spacing:lH},uH={m:{type:"spacing",property:"margin"},mt:{type:"spacing",property:"marginTop"},mb:{type:"spacing",property:"marginBottom"},ml:{type:"spacing",property:"marginLeft"},mr:{type:"spacing",property:"marginRight"},mx:{type:"spacing",property:["marginRight","marginLeft"]},my:{type:"spacing",property:["marginTop","marginBottom"]},p:{type:"spacing",property:"padding"},pt:{type:"spacing",property:"paddingTop"},pb:{type:"spacing",property:"paddingBottom"},pl:{type:"spacing",property:"paddingLeft"},pr:{type:"spacing",property:"paddingRight"},px:{type:"spacing",property:["paddingRight","paddingLeft"]},py:{type:"spacing",property:["paddingTop","paddingBottom"]},bg:{type:"color",property:"background"},c:{type:"color",property:"color"},opacity:{type:"identity",property:"opacity"},ff:{type:"identity",property:"fontFamily"},fz:{type:"fontSize",property:"fontSize"},fw:{type:"identity",property:"fontWeight"},lts:{type:"size",property:"letterSpacing"},ta:{type:"identity",property:"textAlign"},lh:{type:"identity",property:"lineHeight"},fs:{type:"identity",property:"fontStyle"},tt:{type:"identity",property:"textTransform"},td:{type:"identity",property:"textDecoration"},w:{type:"spacing",property:"width"},miw:{type:"spacing",property:"minWidth"},maw:{type:"spacing",property:"maxWidth"},h:{type:"spacing",property:"height"},mih:{type:"spacing",property:"minHeight"},mah:{type:"spacing",property:"maxHeight"},bgsz:{type:"size",property:"backgroundSize"},bgp:{type:"identity",property:"backgroundPosition"},bgr:{type:"identity",property:"backgroundRepeat"},bga:{type:"identity",property:"backgroundAttachment"},pos:{type:"identity",property:"position"},top:{type:"identity",property:"top"},left:{type:"size",property:"left"},bottom:{type:"size",property:"bottom"},right:{type:"size",property:"right"},inset:{type:"size",property:"inset"},display:{type:"identity",property:"display"}};var dH=Object.defineProperty,QS=Object.getOwnPropertySymbols,fH=Object.prototype.hasOwnProperty,pH=Object.prototype.propertyIsEnumerable,ZS=(e,t,n)=>t in e?dH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,JS=(e,t)=>{for(var n in t||(t={}))fH.call(t,n)&&ZS(e,n,t[n]);if(QS)for(var n of QS(t))pH.call(t,n)&&ZS(e,n,t[n]);return e};function ew(e,t,n=uH){return Object.keys(n).reduce((o,s)=>(s in e&&e[s]!==void 0&&o.push(nH({value:e[s],getValue:cH[n[s].type],property:n[s].property,theme:t})),o),[]).reduce((o,s)=>(Object.keys(s).forEach(a=>{typeof s[a]=="object"&&s[a]!==null&&a in o?o[a]=JS(JS({},o[a]),s[a]):o[a]=s[a]}),o),{})}function tw(e,t){return typeof e=="function"?e(t):e}function hH(e,t,n){const r=Sa(),{css:o,cx:s}=Ek();return Array.isArray(e)?s(n,o(ew(t,r)),e.map(a=>o(tw(a,r)))):s(n,o(tw(e,r)),o(ew(t,r)))}var mH=Object.defineProperty,mp=Object.getOwnPropertySymbols,Ak=Object.prototype.hasOwnProperty,Nk=Object.prototype.propertyIsEnumerable,nw=(e,t,n)=>t in e?mH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,gH=(e,t)=>{for(var n in t||(t={}))Ak.call(t,n)&&nw(e,n,t[n]);if(mp)for(var n of mp(t))Nk.call(t,n)&&nw(e,n,t[n]);return e},vH=(e,t)=>{var n={};for(var r in e)Ak.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&mp)for(var r of mp(e))t.indexOf(r)<0&&Nk.call(e,r)&&(n[r]=e[r]);return n};const zk=p.forwardRef((e,t)=>{var n=e,{className:r,component:o,style:s,sx:a}=n,u=vH(n,["className","component","style","sx"]);const{systemStyles:d,rest:f}=Lh(u),h=o||"div";return z.createElement(h,gH({ref:t,className:hH(a,d,r),style:s},f))});zk.displayName="@mantine/core/Box";const yo=zk;var yH=Object.defineProperty,bH=Object.defineProperties,xH=Object.getOwnPropertyDescriptors,rw=Object.getOwnPropertySymbols,SH=Object.prototype.hasOwnProperty,wH=Object.prototype.propertyIsEnumerable,ow=(e,t,n)=>t in e?yH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,sw=(e,t)=>{for(var n in t||(t={}))SH.call(t,n)&&ow(e,n,t[n]);if(rw)for(var n of rw(t))wH.call(t,n)&&ow(e,n,t[n]);return e},CH=(e,t)=>bH(e,xH(t)),PH=Qr(e=>({root:CH(sw(sw({},e.fn.focusStyles()),e.fn.fontStyles()),{cursor:"pointer",border:0,padding:0,appearance:"none",fontSize:e.fontSizes.md,backgroundColor:"transparent",textAlign:"left",color:e.colorScheme==="dark"?e.colors.dark[0]:e.black,textDecoration:"none",boxSizing:"border-box"})}));const kH=PH;var _H=Object.defineProperty,gp=Object.getOwnPropertySymbols,$k=Object.prototype.hasOwnProperty,Lk=Object.prototype.propertyIsEnumerable,aw=(e,t,n)=>t in e?_H(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,jH=(e,t)=>{for(var n in t||(t={}))$k.call(t,n)&&aw(e,n,t[n]);if(gp)for(var n of gp(t))Lk.call(t,n)&&aw(e,n,t[n]);return e},EH=(e,t)=>{var n={};for(var r in e)$k.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&gp)for(var r of gp(e))t.indexOf(r)<0&&Lk.call(e,r)&&(n[r]=e[r]);return n};const Fk=p.forwardRef((e,t)=>{const n=jr("UnstyledButton",{},e),{className:r,component:o="button",unstyled:s,variant:a}=n,u=EH(n,["className","component","unstyled","variant"]),{classes:d,cx:f}=kH(null,{name:"UnstyledButton",unstyled:s,variant:a});return z.createElement(yo,jH({component:o,ref:t,className:f(d.root,r),type:o==="button"?"button":void 0},u))});Fk.displayName="@mantine/core/UnstyledButton";const IH=Fk;var OH=Object.defineProperty,RH=Object.defineProperties,MH=Object.getOwnPropertyDescriptors,iw=Object.getOwnPropertySymbols,TH=Object.prototype.hasOwnProperty,DH=Object.prototype.propertyIsEnumerable,lw=(e,t,n)=>t in e?OH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,n0=(e,t)=>{for(var n in t||(t={}))TH.call(t,n)&&lw(e,n,t[n]);if(iw)for(var n of iw(t))DH.call(t,n)&&lw(e,n,t[n]);return e},cw=(e,t)=>RH(e,MH(t));const AH=["subtle","filled","outline","light","default","transparent","gradient"],uf={xs:Le(18),sm:Le(22),md:Le(28),lg:Le(34),xl:Le(44)};function NH({variant:e,theme:t,color:n,gradient:r}){const o=t.fn.variant({color:n,variant:e,gradient:r});return e==="gradient"?{border:0,backgroundImage:o.background,color:o.color,"&:hover":t.fn.hover({backgroundSize:"200%"})}:AH.includes(e)?n0({border:`${Le(1)} solid ${o.border}`,backgroundColor:o.background,color:o.color},t.fn.hover({backgroundColor:o.hover})):null}var zH=Qr((e,{radius:t,color:n,gradient:r},{variant:o,size:s})=>({root:cw(n0({position:"relative",borderRadius:e.fn.radius(t),padding:0,lineHeight:1,display:"flex",alignItems:"center",justifyContent:"center",height:At({size:s,sizes:uf}),minHeight:At({size:s,sizes:uf}),width:At({size:s,sizes:uf}),minWidth:At({size:s,sizes:uf})},NH({variant:o,theme:e,color:n,gradient:r})),{"&:active":e.activeStyles,"& [data-action-icon-loader]":{maxWidth:"70%"},"&:disabled, &[data-disabled]":{color:e.colors.gray[e.colorScheme==="dark"?6:4],cursor:"not-allowed",backgroundColor:o==="transparent"?void 0:e.fn.themeColor("gray",e.colorScheme==="dark"?8:1),borderColor:o==="transparent"?void 0:e.fn.themeColor("gray",e.colorScheme==="dark"?8:1),backgroundImage:"none",pointerEvents:"none","&:active":{transform:"none"}},"&[data-loading]":{pointerEvents:"none","&::before":cw(n0({content:'""'},e.fn.cover(Le(-1))),{backgroundColor:e.colorScheme==="dark"?e.fn.rgba(e.colors.dark[7],.5):"rgba(255, 255, 255, .5)",borderRadius:e.fn.radius(t),cursor:"not-allowed"})}})}));const $H=zH;var LH=Object.defineProperty,vp=Object.getOwnPropertySymbols,Bk=Object.prototype.hasOwnProperty,Hk=Object.prototype.propertyIsEnumerable,uw=(e,t,n)=>t in e?LH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,FH=(e,t)=>{for(var n in t||(t={}))Bk.call(t,n)&&uw(e,n,t[n]);if(vp)for(var n of vp(t))Hk.call(t,n)&&uw(e,n,t[n]);return e},BH=(e,t)=>{var n={};for(var r in e)Bk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&vp)for(var r of vp(e))t.indexOf(r)<0&&Hk.call(e,r)&&(n[r]=e[r]);return n};function HH(e){var t=e,{size:n,color:r}=t,o=BH(t,["size","color"]);return z.createElement("svg",FH({viewBox:"0 0 135 140",xmlns:"http://www.w3.org/2000/svg",fill:r,width:n},o),z.createElement("rect",{y:"10",width:"15",height:"120",rx:"6"},z.createElement("animate",{attributeName:"height",begin:"0.5s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),z.createElement("animate",{attributeName:"y",begin:"0.5s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})),z.createElement("rect",{x:"30",y:"10",width:"15",height:"120",rx:"6"},z.createElement("animate",{attributeName:"height",begin:"0.25s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),z.createElement("animate",{attributeName:"y",begin:"0.25s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})),z.createElement("rect",{x:"60",width:"15",height:"140",rx:"6"},z.createElement("animate",{attributeName:"height",begin:"0s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),z.createElement("animate",{attributeName:"y",begin:"0s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})),z.createElement("rect",{x:"90",y:"10",width:"15",height:"120",rx:"6"},z.createElement("animate",{attributeName:"height",begin:"0.25s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),z.createElement("animate",{attributeName:"y",begin:"0.25s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})),z.createElement("rect",{x:"120",y:"10",width:"15",height:"120",rx:"6"},z.createElement("animate",{attributeName:"height",begin:"0.5s",dur:"1s",values:"120;110;100;90;80;70;60;50;40;140;120",calcMode:"linear",repeatCount:"indefinite"}),z.createElement("animate",{attributeName:"y",begin:"0.5s",dur:"1s",values:"10;15;20;25;30;35;40;45;50;0;10",calcMode:"linear",repeatCount:"indefinite"})))}var WH=Object.defineProperty,yp=Object.getOwnPropertySymbols,Wk=Object.prototype.hasOwnProperty,Vk=Object.prototype.propertyIsEnumerable,dw=(e,t,n)=>t in e?WH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,VH=(e,t)=>{for(var n in t||(t={}))Wk.call(t,n)&&dw(e,n,t[n]);if(yp)for(var n of yp(t))Vk.call(t,n)&&dw(e,n,t[n]);return e},UH=(e,t)=>{var n={};for(var r in e)Wk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&yp)for(var r of yp(e))t.indexOf(r)<0&&Vk.call(e,r)&&(n[r]=e[r]);return n};function GH(e){var t=e,{size:n,color:r}=t,o=UH(t,["size","color"]);return z.createElement("svg",VH({width:n,height:n,viewBox:"0 0 38 38",xmlns:"http://www.w3.org/2000/svg",stroke:r},o),z.createElement("g",{fill:"none",fillRule:"evenodd"},z.createElement("g",{transform:"translate(2.5 2.5)",strokeWidth:"5"},z.createElement("circle",{strokeOpacity:".5",cx:"16",cy:"16",r:"16"}),z.createElement("path",{d:"M32 16c0-9.94-8.06-16-16-16"},z.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 16 16",to:"360 16 16",dur:"1s",repeatCount:"indefinite"})))))}var qH=Object.defineProperty,bp=Object.getOwnPropertySymbols,Uk=Object.prototype.hasOwnProperty,Gk=Object.prototype.propertyIsEnumerable,fw=(e,t,n)=>t in e?qH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,KH=(e,t)=>{for(var n in t||(t={}))Uk.call(t,n)&&fw(e,n,t[n]);if(bp)for(var n of bp(t))Gk.call(t,n)&&fw(e,n,t[n]);return e},YH=(e,t)=>{var n={};for(var r in e)Uk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&bp)for(var r of bp(e))t.indexOf(r)<0&&Gk.call(e,r)&&(n[r]=e[r]);return n};function XH(e){var t=e,{size:n,color:r}=t,o=YH(t,["size","color"]);return z.createElement("svg",KH({width:n,viewBox:"0 0 120 30",xmlns:"http://www.w3.org/2000/svg",fill:r},o),z.createElement("circle",{cx:"15",cy:"15",r:"15"},z.createElement("animate",{attributeName:"r",from:"15",to:"15",begin:"0s",dur:"0.8s",values:"15;9;15",calcMode:"linear",repeatCount:"indefinite"}),z.createElement("animate",{attributeName:"fill-opacity",from:"1",to:"1",begin:"0s",dur:"0.8s",values:"1;.5;1",calcMode:"linear",repeatCount:"indefinite"})),z.createElement("circle",{cx:"60",cy:"15",r:"9",fillOpacity:"0.3"},z.createElement("animate",{attributeName:"r",from:"9",to:"9",begin:"0s",dur:"0.8s",values:"9;15;9",calcMode:"linear",repeatCount:"indefinite"}),z.createElement("animate",{attributeName:"fill-opacity",from:"0.5",to:"0.5",begin:"0s",dur:"0.8s",values:".5;1;.5",calcMode:"linear",repeatCount:"indefinite"})),z.createElement("circle",{cx:"105",cy:"15",r:"15"},z.createElement("animate",{attributeName:"r",from:"15",to:"15",begin:"0s",dur:"0.8s",values:"15;9;15",calcMode:"linear",repeatCount:"indefinite"}),z.createElement("animate",{attributeName:"fill-opacity",from:"1",to:"1",begin:"0s",dur:"0.8s",values:"1;.5;1",calcMode:"linear",repeatCount:"indefinite"})))}var QH=Object.defineProperty,xp=Object.getOwnPropertySymbols,qk=Object.prototype.hasOwnProperty,Kk=Object.prototype.propertyIsEnumerable,pw=(e,t,n)=>t in e?QH(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,ZH=(e,t)=>{for(var n in t||(t={}))qk.call(t,n)&&pw(e,n,t[n]);if(xp)for(var n of xp(t))Kk.call(t,n)&&pw(e,n,t[n]);return e},JH=(e,t)=>{var n={};for(var r in e)qk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&xp)for(var r of xp(e))t.indexOf(r)<0&&Kk.call(e,r)&&(n[r]=e[r]);return n};const qg={bars:HH,oval:GH,dots:XH},eW={xs:Le(18),sm:Le(22),md:Le(36),lg:Le(44),xl:Le(58)},tW={size:"md"};function Yk(e){const t=jr("Loader",tW,e),{size:n,color:r,variant:o}=t,s=JH(t,["size","color","variant"]),a=Sa(),u=o in qg?o:a.loader;return z.createElement(yo,ZH({role:"presentation",component:qg[u]||qg.bars,size:At({size:n,sizes:eW}),color:a.fn.variant({variant:"filled",primaryFallback:!1,color:r||a.primaryColor}).background},s))}Yk.displayName="@mantine/core/Loader";var nW=Object.defineProperty,Sp=Object.getOwnPropertySymbols,Xk=Object.prototype.hasOwnProperty,Qk=Object.prototype.propertyIsEnumerable,hw=(e,t,n)=>t in e?nW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,mw=(e,t)=>{for(var n in t||(t={}))Xk.call(t,n)&&hw(e,n,t[n]);if(Sp)for(var n of Sp(t))Qk.call(t,n)&&hw(e,n,t[n]);return e},rW=(e,t)=>{var n={};for(var r in e)Xk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Sp)for(var r of Sp(e))t.indexOf(r)<0&&Qk.call(e,r)&&(n[r]=e[r]);return n};const oW={color:"gray",size:"md",variant:"subtle"},Zk=p.forwardRef((e,t)=>{const n=jr("ActionIcon",oW,e),{className:r,color:o,children:s,radius:a,size:u,variant:d,gradient:f,disabled:h,loaderProps:m,loading:v,unstyled:b,__staticSelector:w}=n,C=rW(n,["className","color","children","radius","size","variant","gradient","disabled","loaderProps","loading","unstyled","__staticSelector"]),{classes:S,cx:P,theme:k}=$H({radius:a,color:o,gradient:f},{name:["ActionIcon",w],unstyled:b,size:u,variant:d}),j=z.createElement(Yk,mw({color:k.fn.variant({color:o,variant:d}).color,size:"100%","data-action-icon-loader":!0},m));return z.createElement(IH,mw({className:P(S.root,r),ref:t,disabled:h,"data-disabled":h||void 0,"data-loading":v||void 0,unstyled:b},C),v?j:s)});Zk.displayName="@mantine/core/ActionIcon";const sW=Zk;var aW=Object.defineProperty,iW=Object.defineProperties,lW=Object.getOwnPropertyDescriptors,wp=Object.getOwnPropertySymbols,Jk=Object.prototype.hasOwnProperty,e_=Object.prototype.propertyIsEnumerable,gw=(e,t,n)=>t in e?aW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,cW=(e,t)=>{for(var n in t||(t={}))Jk.call(t,n)&&gw(e,n,t[n]);if(wp)for(var n of wp(t))e_.call(t,n)&&gw(e,n,t[n]);return e},uW=(e,t)=>iW(e,lW(t)),dW=(e,t)=>{var n={};for(var r in e)Jk.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&wp)for(var r of wp(e))t.indexOf(r)<0&&e_.call(e,r)&&(n[r]=e[r]);return n};function t_(e){const t=jr("Portal",{},e),{children:n,target:r,className:o,innerRef:s}=t,a=dW(t,["children","target","className","innerRef"]),u=Sa(),[d,f]=p.useState(!1),h=p.useRef();return Ik(()=>(f(!0),h.current=r?typeof r=="string"?document.querySelector(r):r:document.createElement("div"),r||document.body.appendChild(h.current),()=>{!r&&document.body.removeChild(h.current)}),[r]),d?pc.createPortal(z.createElement("div",uW(cW({className:o,dir:u.dir},a),{ref:s}),n),h.current):null}t_.displayName="@mantine/core/Portal";var fW=Object.defineProperty,Cp=Object.getOwnPropertySymbols,n_=Object.prototype.hasOwnProperty,r_=Object.prototype.propertyIsEnumerable,vw=(e,t,n)=>t in e?fW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,pW=(e,t)=>{for(var n in t||(t={}))n_.call(t,n)&&vw(e,n,t[n]);if(Cp)for(var n of Cp(t))r_.call(t,n)&&vw(e,n,t[n]);return e},hW=(e,t)=>{var n={};for(var r in e)n_.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Cp)for(var r of Cp(e))t.indexOf(r)<0&&r_.call(e,r)&&(n[r]=e[r]);return n};function o_(e){var t=e,{withinPortal:n=!0,children:r}=t,o=hW(t,["withinPortal","children"]);return n?z.createElement(t_,pW({},o),r):z.createElement(z.Fragment,null,r)}o_.displayName="@mantine/core/OptionalPortal";var mW=Object.defineProperty,yw=Object.getOwnPropertySymbols,gW=Object.prototype.hasOwnProperty,vW=Object.prototype.propertyIsEnumerable,bw=(e,t,n)=>t in e?mW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,yW=(e,t)=>{for(var n in t||(t={}))gW.call(t,n)&&bw(e,n,t[n]);if(yw)for(var n of yw(t))vW.call(t,n)&&bw(e,n,t[n]);return e};function s_(e){return z.createElement("svg",yW({viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},e),z.createElement("path",{d:"M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z",fill:"currentColor",fillRule:"evenodd",clipRule:"evenodd"}))}s_.displayName="@mantine/core/CloseIcon";var bW=Object.defineProperty,Pp=Object.getOwnPropertySymbols,a_=Object.prototype.hasOwnProperty,i_=Object.prototype.propertyIsEnumerable,xw=(e,t,n)=>t in e?bW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,xW=(e,t)=>{for(var n in t||(t={}))a_.call(t,n)&&xw(e,n,t[n]);if(Pp)for(var n of Pp(t))i_.call(t,n)&&xw(e,n,t[n]);return e},SW=(e,t)=>{var n={};for(var r in e)a_.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Pp)for(var r of Pp(e))t.indexOf(r)<0&&i_.call(e,r)&&(n[r]=e[r]);return n};const wW={xs:Le(12),sm:Le(16),md:Le(20),lg:Le(28),xl:Le(34)},CW={size:"sm"},l_=p.forwardRef((e,t)=>{const n=jr("CloseButton",CW,e),{iconSize:r,size:o,children:s}=n,a=SW(n,["iconSize","size","children"]),u=Le(r||wW[o]);return z.createElement(sW,xW({ref:t,__staticSelector:"CloseButton",size:o},a),s||z.createElement(s_,{width:u,height:u}))});l_.displayName="@mantine/core/CloseButton";const c_=l_;var PW=Object.defineProperty,kW=Object.defineProperties,_W=Object.getOwnPropertyDescriptors,Sw=Object.getOwnPropertySymbols,jW=Object.prototype.hasOwnProperty,EW=Object.prototype.propertyIsEnumerable,ww=(e,t,n)=>t in e?PW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,df=(e,t)=>{for(var n in t||(t={}))jW.call(t,n)&&ww(e,n,t[n]);if(Sw)for(var n of Sw(t))EW.call(t,n)&&ww(e,n,t[n]);return e},IW=(e,t)=>kW(e,_W(t));function OW({underline:e,strikethrough:t}){const n=[];return e&&n.push("underline"),t&&n.push("line-through"),n.length>0?n.join(" "):"none"}function RW({theme:e,color:t}){return t==="dimmed"?e.fn.dimmed():typeof t=="string"&&(t in e.colors||t.split(".")[0]in e.colors)?e.fn.variant({variant:"filled",color:t}).background:t||"inherit"}function MW(e){return typeof e=="number"?{overflow:"hidden",textOverflow:"ellipsis",display:"-webkit-box",WebkitLineClamp:e,WebkitBoxOrient:"vertical"}:null}function TW({theme:e,truncate:t}){return t==="start"?{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",direction:e.dir==="ltr"?"rtl":"ltr",textAlign:e.dir==="ltr"?"right":"left"}:t?{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}:null}var DW=Qr((e,{color:t,lineClamp:n,truncate:r,inline:o,inherit:s,underline:a,gradient:u,weight:d,transform:f,align:h,strikethrough:m,italic:v},{size:b})=>{const w=e.fn.variant({variant:"gradient",gradient:u});return{root:IW(df(df(df(df({},e.fn.fontStyles()),e.fn.focusStyles()),MW(n)),TW({theme:e,truncate:r})),{color:RW({color:t,theme:e}),fontFamily:s?"inherit":e.fontFamily,fontSize:s||b===void 0?"inherit":At({size:b,sizes:e.fontSizes}),lineHeight:s?"inherit":o?1:e.lineHeight,textDecoration:OW({underline:a,strikethrough:m}),WebkitTapHighlightColor:"transparent",fontWeight:s?"inherit":d,textTransform:f,textAlign:h,fontStyle:v?"italic":void 0}),gradient:{backgroundImage:w.background,WebkitBackgroundClip:"text",WebkitTextFillColor:"transparent"}}});const AW=DW;var NW=Object.defineProperty,kp=Object.getOwnPropertySymbols,u_=Object.prototype.hasOwnProperty,d_=Object.prototype.propertyIsEnumerable,Cw=(e,t,n)=>t in e?NW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,zW=(e,t)=>{for(var n in t||(t={}))u_.call(t,n)&&Cw(e,n,t[n]);if(kp)for(var n of kp(t))d_.call(t,n)&&Cw(e,n,t[n]);return e},$W=(e,t)=>{var n={};for(var r in e)u_.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&kp)for(var r of kp(e))t.indexOf(r)<0&&d_.call(e,r)&&(n[r]=e[r]);return n};const LW={variant:"text"},f_=p.forwardRef((e,t)=>{const n=jr("Text",LW,e),{className:r,size:o,weight:s,transform:a,color:u,align:d,variant:f,lineClamp:h,truncate:m,gradient:v,inline:b,inherit:w,underline:C,strikethrough:S,italic:P,classNames:k,styles:j,unstyled:E,span:I,__staticSelector:O}=n,R=$W(n,["className","size","weight","transform","color","align","variant","lineClamp","truncate","gradient","inline","inherit","underline","strikethrough","italic","classNames","styles","unstyled","span","__staticSelector"]),{classes:M,cx:A}=AW({color:u,lineClamp:h,truncate:m,inline:b,inherit:w,underline:C,strikethrough:S,italic:P,weight:s,transform:a,align:d,gradient:v},{unstyled:E,name:O||"Text",variant:f,size:o});return z.createElement(yo,zW({ref:t,className:A(M.root,{[M.gradient]:f==="gradient"},r),component:I?"span":"div"},R))});f_.displayName="@mantine/core/Text";const Zl=f_,ff={xs:Le(1),sm:Le(2),md:Le(3),lg:Le(4),xl:Le(5)};function pf(e,t){const n=e.fn.variant({variant:"outline",color:t}).border;return typeof t=="string"&&(t in e.colors||t.split(".")[0]in e.colors)?n:t===void 0?e.colorScheme==="dark"?e.colors.dark[4]:e.colors.gray[4]:t}var FW=Qr((e,{color:t},{size:n,variant:r})=>({root:{},withLabel:{borderTop:"0 !important"},left:{"&::before":{display:"none"}},right:{"&::after":{display:"none"}},label:{display:"flex",alignItems:"center","&::before":{content:'""',flex:1,height:Le(1),borderTop:`${At({size:n,sizes:ff})} ${r} ${pf(e,t)}`,marginRight:e.spacing.xs},"&::after":{content:'""',flex:1,borderTop:`${At({size:n,sizes:ff})} ${r} ${pf(e,t)}`,marginLeft:e.spacing.xs}},labelDefaultStyles:{color:t==="dark"?e.colors.dark[1]:e.fn.themeColor(t,e.colorScheme==="dark"?5:e.fn.primaryShade(),!1)},horizontal:{border:0,borderTopWidth:Le(At({size:n,sizes:ff})),borderTopColor:pf(e,t),borderTopStyle:r,margin:0},vertical:{border:0,alignSelf:"stretch",height:"auto",borderLeftWidth:Le(At({size:n,sizes:ff})),borderLeftColor:pf(e,t),borderLeftStyle:r}}));const BW=FW;var HW=Object.defineProperty,WW=Object.defineProperties,VW=Object.getOwnPropertyDescriptors,_p=Object.getOwnPropertySymbols,p_=Object.prototype.hasOwnProperty,h_=Object.prototype.propertyIsEnumerable,Pw=(e,t,n)=>t in e?HW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,kw=(e,t)=>{for(var n in t||(t={}))p_.call(t,n)&&Pw(e,n,t[n]);if(_p)for(var n of _p(t))h_.call(t,n)&&Pw(e,n,t[n]);return e},UW=(e,t)=>WW(e,VW(t)),GW=(e,t)=>{var n={};for(var r in e)p_.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&_p)for(var r of _p(e))t.indexOf(r)<0&&h_.call(e,r)&&(n[r]=e[r]);return n};const qW={orientation:"horizontal",size:"xs",labelPosition:"left",variant:"solid"},r0=p.forwardRef((e,t)=>{const n=jr("Divider",qW,e),{className:r,color:o,orientation:s,size:a,label:u,labelPosition:d,labelProps:f,variant:h,styles:m,classNames:v,unstyled:b}=n,w=GW(n,["className","color","orientation","size","label","labelPosition","labelProps","variant","styles","classNames","unstyled"]),{classes:C,cx:S}=BW({color:o},{classNames:v,styles:m,unstyled:b,name:"Divider",variant:h,size:a}),P=s==="vertical",k=s==="horizontal",j=!!u&&k,E=!(f!=null&&f.color);return z.createElement(yo,kw({ref:t,className:S(C.root,{[C.vertical]:P,[C.horizontal]:k,[C.withLabel]:j},r),role:"separator"},w),j&&z.createElement(Zl,UW(kw({},f),{size:(f==null?void 0:f.size)||"xs",mt:Le(2),className:S(C.label,C[d],{[C.labelDefaultStyles]:E})}),u))});r0.displayName="@mantine/core/Divider";var KW=Object.defineProperty,YW=Object.defineProperties,XW=Object.getOwnPropertyDescriptors,_w=Object.getOwnPropertySymbols,QW=Object.prototype.hasOwnProperty,ZW=Object.prototype.propertyIsEnumerable,jw=(e,t,n)=>t in e?KW(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ew=(e,t)=>{for(var n in t||(t={}))QW.call(t,n)&&jw(e,n,t[n]);if(_w)for(var n of _w(t))ZW.call(t,n)&&jw(e,n,t[n]);return e},JW=(e,t)=>YW(e,XW(t)),eV=Qr((e,t,{size:n})=>({item:JW(Ew({},e.fn.fontStyles()),{boxSizing:"border-box",wordBreak:"break-all",textAlign:"left",width:"100%",padding:`calc(${At({size:n,sizes:e.spacing})} / 1.5) ${At({size:n,sizes:e.spacing})}`,cursor:"pointer",fontSize:At({size:n,sizes:e.fontSizes}),color:e.colorScheme==="dark"?e.colors.dark[0]:e.black,borderRadius:e.fn.radius(),"&[data-hovered]":{backgroundColor:e.colorScheme==="dark"?e.colors.dark[4]:e.colors.gray[1]},"&[data-selected]":Ew({backgroundColor:e.fn.variant({variant:"filled"}).background,color:e.fn.variant({variant:"filled"}).color},e.fn.hover({backgroundColor:e.fn.variant({variant:"filled"}).hover})),"&[data-disabled]":{cursor:"default",color:e.colors.dark[2]}}),nothingFound:{boxSizing:"border-box",color:e.colors.gray[6],paddingTop:`calc(${At({size:n,sizes:e.spacing})} / 2)`,paddingBottom:`calc(${At({size:n,sizes:e.spacing})} / 2)`,textAlign:"center"},separator:{boxSizing:"border-box",textAlign:"left",width:"100%",padding:`calc(${At({size:n,sizes:e.spacing})} / 1.5) ${At({size:n,sizes:e.spacing})}`},separatorLabel:{color:e.colorScheme==="dark"?e.colors.dark[3]:e.colors.gray[5]}}));const tV=eV;var nV=Object.defineProperty,Iw=Object.getOwnPropertySymbols,rV=Object.prototype.hasOwnProperty,oV=Object.prototype.propertyIsEnumerable,Ow=(e,t,n)=>t in e?nV(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,sV=(e,t)=>{for(var n in t||(t={}))rV.call(t,n)&&Ow(e,n,t[n]);if(Iw)for(var n of Iw(t))oV.call(t,n)&&Ow(e,n,t[n]);return e};function ny({data:e,hovered:t,classNames:n,styles:r,isItemSelected:o,uuid:s,__staticSelector:a,onItemHover:u,onItemSelect:d,itemsRefs:f,itemComponent:h,size:m,nothingFound:v,creatable:b,createLabel:w,unstyled:C,variant:S}){const{classes:P}=tV(null,{classNames:n,styles:r,unstyled:C,name:a,variant:S,size:m}),k=[],j=[];let E=null;const I=(R,M)=>{const A=typeof o=="function"?o(R.value):!1;return z.createElement(h,sV({key:R.value,className:P.item,"data-disabled":R.disabled||void 0,"data-hovered":!R.disabled&&t===M||void 0,"data-selected":!R.disabled&&A||void 0,selected:A,onMouseEnter:()=>u(M),id:`${s}-${M}`,role:"option",tabIndex:-1,"aria-selected":t===M,ref:L=>{f&&f.current&&(f.current[R.value]=L)},onMouseDown:R.disabled?null:L=>{L.preventDefault(),d(R)},disabled:R.disabled,variant:S},R))};let O=null;if(e.forEach((R,M)=>{R.creatable?E=M:R.group?(O!==R.group&&(O=R.group,j.push(z.createElement("div",{className:P.separator,key:`__mantine-divider-${M}`},z.createElement(r0,{classNames:{label:P.separatorLabel},label:R.group})))),j.push(I(R,M))):k.push(I(R,M))}),b){const R=e[E];k.push(z.createElement("div",{key:ey(),className:P.item,"data-hovered":t===E||void 0,onMouseEnter:()=>u(E),onMouseDown:M=>{M.preventDefault(),d(R)},tabIndex:-1,ref:M=>{f&&f.current&&(f.current[R.value]=M)}},w))}return j.length>0&&k.length>0&&k.unshift(z.createElement("div",{className:P.separator,key:"empty-group-separator"},z.createElement(r0,null))),j.length>0||k.length>0?z.createElement(z.Fragment,null,j,k):z.createElement(Zl,{size:m,unstyled:C,className:P.nothingFound},v)}ny.displayName="@mantine/core/SelectItems";var aV=Object.defineProperty,jp=Object.getOwnPropertySymbols,m_=Object.prototype.hasOwnProperty,g_=Object.prototype.propertyIsEnumerable,Rw=(e,t,n)=>t in e?aV(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,iV=(e,t)=>{for(var n in t||(t={}))m_.call(t,n)&&Rw(e,n,t[n]);if(jp)for(var n of jp(t))g_.call(t,n)&&Rw(e,n,t[n]);return e},lV=(e,t)=>{var n={};for(var r in e)m_.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&jp)for(var r of jp(e))t.indexOf(r)<0&&g_.call(e,r)&&(n[r]=e[r]);return n};const ry=p.forwardRef((e,t)=>{var n=e,{label:r,value:o}=n,s=lV(n,["label","value"]);return z.createElement("div",iV({ref:t},s),r||o)});ry.displayName="@mantine/core/DefaultItem";function cV(e,t){typeof e=="function"?e(t):e!=null&&(e.current=t)}function v_(...e){return t=>e.forEach(n=>cV(n,t))}function nl(...e){return p.useCallback(v_(...e),e)}const y_=p.forwardRef((e,t)=>{const{children:n,...r}=e,o=p.Children.toArray(n),s=o.find(dV);if(s){const a=s.props.children,u=o.map(d=>d===s?p.Children.count(a)>1?p.Children.only(null):p.isValidElement(a)?a.props.children:null:d);return p.createElement(o0,nr({},r,{ref:t}),p.isValidElement(a)?p.cloneElement(a,void 0,u):null)}return p.createElement(o0,nr({},r,{ref:t}),n)});y_.displayName="Slot";const o0=p.forwardRef((e,t)=>{const{children:n,...r}=e;return p.isValidElement(n)?p.cloneElement(n,{...fV(r,n.props),ref:v_(t,n.ref)}):p.Children.count(n)>1?p.Children.only(null):null});o0.displayName="SlotClone";const uV=({children:e})=>p.createElement(p.Fragment,null,e);function dV(e){return p.isValidElement(e)&&e.type===uV}function fV(e,t){const n={...t};for(const r in t){const o=e[r],s=t[r];/^on[A-Z]/.test(r)?o&&s?n[r]=(...u)=>{s(...u),o(...u)}:o&&(n[r]=o):r==="style"?n[r]={...o,...s}:r==="className"&&(n[r]=[o,s].filter(Boolean).join(" "))}return{...e,...n}}const pV=["a","button","div","h2","h3","img","label","li","nav","ol","p","span","svg","ul"],Xu=pV.reduce((e,t)=>{const n=p.forwardRef((r,o)=>{const{asChild:s,...a}=r,u=s?y_:t;return p.useEffect(()=>{window[Symbol.for("radix-ui")]=!0},[]),p.createElement(u,nr({},a,{ref:o}))});return n.displayName=`Primitive.${t}`,{...e,[t]:n}},{}),s0=globalThis!=null&&globalThis.document?p.useLayoutEffect:()=>{};function hV(e,t){return p.useReducer((n,r)=>{const o=t[n][r];return o??n},e)}const Qu=e=>{const{present:t,children:n}=e,r=mV(t),o=typeof n=="function"?n({present:r.isPresent}):p.Children.only(n),s=nl(r.ref,o.ref);return typeof n=="function"||r.isPresent?p.cloneElement(o,{ref:s}):null};Qu.displayName="Presence";function mV(e){const[t,n]=p.useState(),r=p.useRef({}),o=p.useRef(e),s=p.useRef("none"),a=e?"mounted":"unmounted",[u,d]=hV(a,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return p.useEffect(()=>{const f=hf(r.current);s.current=u==="mounted"?f:"none"},[u]),s0(()=>{const f=r.current,h=o.current;if(h!==e){const v=s.current,b=hf(f);e?d("MOUNT"):b==="none"||(f==null?void 0:f.display)==="none"?d("UNMOUNT"):d(h&&v!==b?"ANIMATION_OUT":"UNMOUNT"),o.current=e}},[e,d]),s0(()=>{if(t){const f=m=>{const b=hf(r.current).includes(m.animationName);m.target===t&&b&&pc.flushSync(()=>d("ANIMATION_END"))},h=m=>{m.target===t&&(s.current=hf(r.current))};return t.addEventListener("animationstart",h),t.addEventListener("animationcancel",f),t.addEventListener("animationend",f),()=>{t.removeEventListener("animationstart",h),t.removeEventListener("animationcancel",f),t.removeEventListener("animationend",f)}}else d("ANIMATION_END")},[t,d]),{isPresent:["mounted","unmountSuspended"].includes(u),ref:p.useCallback(f=>{f&&(r.current=getComputedStyle(f)),n(f)},[])}}function hf(e){return(e==null?void 0:e.animationName)||"none"}function gV(e,t=[]){let n=[];function r(s,a){const u=p.createContext(a),d=n.length;n=[...n,a];function f(m){const{scope:v,children:b,...w}=m,C=(v==null?void 0:v[e][d])||u,S=p.useMemo(()=>w,Object.values(w));return p.createElement(C.Provider,{value:S},b)}function h(m,v){const b=(v==null?void 0:v[e][d])||u,w=p.useContext(b);if(w)return w;if(a!==void 0)return a;throw new Error(`\`${m}\` must be used within \`${s}\``)}return f.displayName=s+"Provider",[f,h]}const o=()=>{const s=n.map(a=>p.createContext(a));return function(u){const d=(u==null?void 0:u[e])||s;return p.useMemo(()=>({[`__scope${e}`]:{...u,[e]:d}}),[u,d])}};return o.scopeName=e,[r,vV(o,...t)]}function vV(...e){const t=e[0];if(e.length===1)return t;const n=()=>{const r=e.map(o=>({useScope:o(),scopeName:o.scopeName}));return function(s){const a=r.reduce((u,{useScope:d,scopeName:f})=>{const m=d(s)[`__scope${f}`];return{...u,...m}},{});return p.useMemo(()=>({[`__scope${t.scopeName}`]:a}),[a])}};return n.scopeName=t.scopeName,n}function Ii(e){const t=p.useRef(e);return p.useEffect(()=>{t.current=e}),p.useMemo(()=>(...n)=>{var r;return(r=t.current)===null||r===void 0?void 0:r.call(t,...n)},[])}const yV=p.createContext(void 0);function bV(e){const t=p.useContext(yV);return e||t||"ltr"}function xV(e,[t,n]){return Math.min(n,Math.max(t,e))}function Li(e,t,{checkForDefaultPrevented:n=!0}={}){return function(o){if(e==null||e(o),n===!1||!o.defaultPrevented)return t==null?void 0:t(o)}}function SV(e,t){return p.useReducer((n,r)=>{const o=t[n][r];return o??n},e)}const b_="ScrollArea",[x_,Lae]=gV(b_),[wV,as]=x_(b_),CV=p.forwardRef((e,t)=>{const{__scopeScrollArea:n,type:r="hover",dir:o,scrollHideDelay:s=600,...a}=e,[u,d]=p.useState(null),[f,h]=p.useState(null),[m,v]=p.useState(null),[b,w]=p.useState(null),[C,S]=p.useState(null),[P,k]=p.useState(0),[j,E]=p.useState(0),[I,O]=p.useState(!1),[R,M]=p.useState(!1),A=nl(t,D=>d(D)),L=bV(o);return p.createElement(wV,{scope:n,type:r,dir:L,scrollHideDelay:s,scrollArea:u,viewport:f,onViewportChange:h,content:m,onContentChange:v,scrollbarX:b,onScrollbarXChange:w,scrollbarXEnabled:I,onScrollbarXEnabledChange:O,scrollbarY:C,onScrollbarYChange:S,scrollbarYEnabled:R,onScrollbarYEnabledChange:M,onCornerWidthChange:k,onCornerHeightChange:E},p.createElement(Xu.div,nr({dir:L},a,{ref:A,style:{position:"relative",["--radix-scroll-area-corner-width"]:P+"px",["--radix-scroll-area-corner-height"]:j+"px",...e.style}})))}),PV="ScrollAreaViewport",kV=p.forwardRef((e,t)=>{const{__scopeScrollArea:n,children:r,...o}=e,s=as(PV,n),a=p.useRef(null),u=nl(t,a,s.onViewportChange);return p.createElement(p.Fragment,null,p.createElement("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"}}),p.createElement(Xu.div,nr({"data-radix-scroll-area-viewport":""},o,{ref:u,style:{overflowX:s.scrollbarXEnabled?"scroll":"hidden",overflowY:s.scrollbarYEnabled?"scroll":"hidden",...e.style}}),p.createElement("div",{ref:s.onContentChange,style:{minWidth:"100%",display:"table"}},r)))}),Pa="ScrollAreaScrollbar",_V=p.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=as(Pa,e.__scopeScrollArea),{onScrollbarXEnabledChange:s,onScrollbarYEnabledChange:a}=o,u=e.orientation==="horizontal";return p.useEffect(()=>(u?s(!0):a(!0),()=>{u?s(!1):a(!1)}),[u,s,a]),o.type==="hover"?p.createElement(jV,nr({},r,{ref:t,forceMount:n})):o.type==="scroll"?p.createElement(EV,nr({},r,{ref:t,forceMount:n})):o.type==="auto"?p.createElement(S_,nr({},r,{ref:t,forceMount:n})):o.type==="always"?p.createElement(oy,nr({},r,{ref:t})):null}),jV=p.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=as(Pa,e.__scopeScrollArea),[s,a]=p.useState(!1);return p.useEffect(()=>{const u=o.scrollArea;let d=0;if(u){const f=()=>{window.clearTimeout(d),a(!0)},h=()=>{d=window.setTimeout(()=>a(!1),o.scrollHideDelay)};return u.addEventListener("pointerenter",f),u.addEventListener("pointerleave",h),()=>{window.clearTimeout(d),u.removeEventListener("pointerenter",f),u.removeEventListener("pointerleave",h)}}},[o.scrollArea,o.scrollHideDelay]),p.createElement(Qu,{present:n||s},p.createElement(S_,nr({"data-state":s?"visible":"hidden"},r,{ref:t})))}),EV=p.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=as(Pa,e.__scopeScrollArea),s=e.orientation==="horizontal",a=Bh(()=>d("SCROLL_END"),100),[u,d]=SV("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}});return p.useEffect(()=>{if(u==="idle"){const f=window.setTimeout(()=>d("HIDE"),o.scrollHideDelay);return()=>window.clearTimeout(f)}},[u,o.scrollHideDelay,d]),p.useEffect(()=>{const f=o.viewport,h=s?"scrollLeft":"scrollTop";if(f){let m=f[h];const v=()=>{const b=f[h];m!==b&&(d("SCROLL"),a()),m=b};return f.addEventListener("scroll",v),()=>f.removeEventListener("scroll",v)}},[o.viewport,s,d,a]),p.createElement(Qu,{present:n||u!=="hidden"},p.createElement(oy,nr({"data-state":u==="hidden"?"hidden":"visible"},r,{ref:t,onPointerEnter:Li(e.onPointerEnter,()=>d("POINTER_ENTER")),onPointerLeave:Li(e.onPointerLeave,()=>d("POINTER_LEAVE"))})))}),S_=p.forwardRef((e,t)=>{const n=as(Pa,e.__scopeScrollArea),{forceMount:r,...o}=e,[s,a]=p.useState(!1),u=e.orientation==="horizontal",d=Bh(()=>{if(n.viewport){const f=n.viewport.offsetWidth{const{orientation:n="vertical",...r}=e,o=as(Pa,e.__scopeScrollArea),s=p.useRef(null),a=p.useRef(0),[u,d]=p.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),f=k_(u.viewport,u.content),h={...r,sizes:u,onSizesChange:d,hasThumb:f>0&&f<1,onThumbChange:v=>s.current=v,onThumbPointerUp:()=>a.current=0,onThumbPointerDown:v=>a.current=v};function m(v,b){return NV(v,a.current,u,b)}return n==="horizontal"?p.createElement(IV,nr({},h,{ref:t,onThumbPositionChange:()=>{if(o.viewport&&s.current){const v=o.viewport.scrollLeft,b=Mw(v,u,o.dir);s.current.style.transform=`translate3d(${b}px, 0, 0)`}},onWheelScroll:v=>{o.viewport&&(o.viewport.scrollLeft=v)},onDragScroll:v=>{o.viewport&&(o.viewport.scrollLeft=m(v,o.dir))}})):n==="vertical"?p.createElement(OV,nr({},h,{ref:t,onThumbPositionChange:()=>{if(o.viewport&&s.current){const v=o.viewport.scrollTop,b=Mw(v,u);s.current.style.transform=`translate3d(0, ${b}px, 0)`}},onWheelScroll:v=>{o.viewport&&(o.viewport.scrollTop=v)},onDragScroll:v=>{o.viewport&&(o.viewport.scrollTop=m(v))}})):null}),IV=p.forwardRef((e,t)=>{const{sizes:n,onSizesChange:r,...o}=e,s=as(Pa,e.__scopeScrollArea),[a,u]=p.useState(),d=p.useRef(null),f=nl(t,d,s.onScrollbarXChange);return p.useEffect(()=>{d.current&&u(getComputedStyle(d.current))},[d]),p.createElement(C_,nr({"data-orientation":"horizontal"},o,{ref:f,sizes:n,style:{bottom:0,left:s.dir==="rtl"?"var(--radix-scroll-area-corner-width)":0,right:s.dir==="ltr"?"var(--radix-scroll-area-corner-width)":0,["--radix-scroll-area-thumb-width"]:Fh(n)+"px",...e.style},onThumbPointerDown:h=>e.onThumbPointerDown(h.x),onDragScroll:h=>e.onDragScroll(h.x),onWheelScroll:(h,m)=>{if(s.viewport){const v=s.viewport.scrollLeft+h.deltaX;e.onWheelScroll(v),j_(v,m)&&h.preventDefault()}},onResize:()=>{d.current&&s.viewport&&a&&r({content:s.viewport.scrollWidth,viewport:s.viewport.offsetWidth,scrollbar:{size:d.current.clientWidth,paddingStart:Ep(a.paddingLeft),paddingEnd:Ep(a.paddingRight)}})}}))}),OV=p.forwardRef((e,t)=>{const{sizes:n,onSizesChange:r,...o}=e,s=as(Pa,e.__scopeScrollArea),[a,u]=p.useState(),d=p.useRef(null),f=nl(t,d,s.onScrollbarYChange);return p.useEffect(()=>{d.current&&u(getComputedStyle(d.current))},[d]),p.createElement(C_,nr({"data-orientation":"vertical"},o,{ref:f,sizes:n,style:{top:0,right:s.dir==="ltr"?0:void 0,left:s.dir==="rtl"?0:void 0,bottom:"var(--radix-scroll-area-corner-height)",["--radix-scroll-area-thumb-height"]:Fh(n)+"px",...e.style},onThumbPointerDown:h=>e.onThumbPointerDown(h.y),onDragScroll:h=>e.onDragScroll(h.y),onWheelScroll:(h,m)=>{if(s.viewport){const v=s.viewport.scrollTop+h.deltaY;e.onWheelScroll(v),j_(v,m)&&h.preventDefault()}},onResize:()=>{d.current&&s.viewport&&a&&r({content:s.viewport.scrollHeight,viewport:s.viewport.offsetHeight,scrollbar:{size:d.current.clientHeight,paddingStart:Ep(a.paddingTop),paddingEnd:Ep(a.paddingBottom)}})}}))}),[RV,w_]=x_(Pa),C_=p.forwardRef((e,t)=>{const{__scopeScrollArea:n,sizes:r,hasThumb:o,onThumbChange:s,onThumbPointerUp:a,onThumbPointerDown:u,onThumbPositionChange:d,onDragScroll:f,onWheelScroll:h,onResize:m,...v}=e,b=as(Pa,n),[w,C]=p.useState(null),S=nl(t,A=>C(A)),P=p.useRef(null),k=p.useRef(""),j=b.viewport,E=r.content-r.viewport,I=Ii(h),O=Ii(d),R=Bh(m,10);function M(A){if(P.current){const L=A.clientX-P.current.left,D=A.clientY-P.current.top;f({x:L,y:D})}}return p.useEffect(()=>{const A=L=>{const D=L.target;(w==null?void 0:w.contains(D))&&I(L,E)};return document.addEventListener("wheel",A,{passive:!1}),()=>document.removeEventListener("wheel",A,{passive:!1})},[j,w,E,I]),p.useEffect(O,[r,O]),Jl(w,R),Jl(b.content,R),p.createElement(RV,{scope:n,scrollbar:w,hasThumb:o,onThumbChange:Ii(s),onThumbPointerUp:Ii(a),onThumbPositionChange:O,onThumbPointerDown:Ii(u)},p.createElement(Xu.div,nr({},v,{ref:S,style:{position:"absolute",...v.style},onPointerDown:Li(e.onPointerDown,A=>{A.button===0&&(A.target.setPointerCapture(A.pointerId),P.current=w.getBoundingClientRect(),k.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",M(A))}),onPointerMove:Li(e.onPointerMove,M),onPointerUp:Li(e.onPointerUp,A=>{const L=A.target;L.hasPointerCapture(A.pointerId)&&L.releasePointerCapture(A.pointerId),document.body.style.webkitUserSelect=k.current,P.current=null})})))}),a0="ScrollAreaThumb",MV=p.forwardRef((e,t)=>{const{forceMount:n,...r}=e,o=w_(a0,e.__scopeScrollArea);return p.createElement(Qu,{present:n||o.hasThumb},p.createElement(TV,nr({ref:t},r)))}),TV=p.forwardRef((e,t)=>{const{__scopeScrollArea:n,style:r,...o}=e,s=as(a0,n),a=w_(a0,n),{onThumbPositionChange:u}=a,d=nl(t,m=>a.onThumbChange(m)),f=p.useRef(),h=Bh(()=>{f.current&&(f.current(),f.current=void 0)},100);return p.useEffect(()=>{const m=s.viewport;if(m){const v=()=>{if(h(),!f.current){const b=zV(m,u);f.current=b,u()}};return u(),m.addEventListener("scroll",v),()=>m.removeEventListener("scroll",v)}},[s.viewport,h,u]),p.createElement(Xu.div,nr({"data-state":a.hasThumb?"visible":"hidden"},o,{ref:d,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...r},onPointerDownCapture:Li(e.onPointerDownCapture,m=>{const b=m.target.getBoundingClientRect(),w=m.clientX-b.left,C=m.clientY-b.top;a.onThumbPointerDown({x:w,y:C})}),onPointerUp:Li(e.onPointerUp,a.onThumbPointerUp)}))}),P_="ScrollAreaCorner",DV=p.forwardRef((e,t)=>{const n=as(P_,e.__scopeScrollArea),r=!!(n.scrollbarX&&n.scrollbarY);return n.type!=="scroll"&&r?p.createElement(AV,nr({},e,{ref:t})):null}),AV=p.forwardRef((e,t)=>{const{__scopeScrollArea:n,...r}=e,o=as(P_,n),[s,a]=p.useState(0),[u,d]=p.useState(0),f=!!(s&&u);return Jl(o.scrollbarX,()=>{var h;const m=((h=o.scrollbarX)===null||h===void 0?void 0:h.offsetHeight)||0;o.onCornerHeightChange(m),d(m)}),Jl(o.scrollbarY,()=>{var h;const m=((h=o.scrollbarY)===null||h===void 0?void 0:h.offsetWidth)||0;o.onCornerWidthChange(m),a(m)}),f?p.createElement(Xu.div,nr({},r,{ref:t,style:{width:s,height:u,position:"absolute",right:o.dir==="ltr"?0:void 0,left:o.dir==="rtl"?0:void 0,bottom:0,...e.style}})):null});function Ep(e){return e?parseInt(e,10):0}function k_(e,t){const n=e/t;return isNaN(n)?0:n}function Fh(e){const t=k_(e.viewport,e.content),n=e.scrollbar.paddingStart+e.scrollbar.paddingEnd,r=(e.scrollbar.size-n)*t;return Math.max(r,18)}function NV(e,t,n,r="ltr"){const o=Fh(n),s=o/2,a=t||s,u=o-a,d=n.scrollbar.paddingStart+a,f=n.scrollbar.size-n.scrollbar.paddingEnd-u,h=n.content-n.viewport,m=r==="ltr"?[0,h]:[h*-1,0];return __([d,f],m)(e)}function Mw(e,t,n="ltr"){const r=Fh(t),o=t.scrollbar.paddingStart+t.scrollbar.paddingEnd,s=t.scrollbar.size-o,a=t.content-t.viewport,u=s-r,d=n==="ltr"?[0,a]:[a*-1,0],f=xV(e,d);return __([0,a],[0,u])(f)}function __(e,t){return n=>{if(e[0]===e[1]||t[0]===t[1])return t[0];const r=(t[1]-t[0])/(e[1]-e[0]);return t[0]+r*(n-e[0])}}function j_(e,t){return e>0&&e{})=>{let n={left:e.scrollLeft,top:e.scrollTop},r=0;return function o(){const s={left:e.scrollLeft,top:e.scrollTop},a=n.left!==s.left,u=n.top!==s.top;(a||u)&&t(),n=s,r=window.requestAnimationFrame(o)}(),()=>window.cancelAnimationFrame(r)};function Bh(e,t){const n=Ii(e),r=p.useRef(0);return p.useEffect(()=>()=>window.clearTimeout(r.current),[]),p.useCallback(()=>{window.clearTimeout(r.current),r.current=window.setTimeout(n,t)},[n,t])}function Jl(e,t){const n=Ii(t);s0(()=>{let r=0;if(e){const o=new ResizeObserver(()=>{cancelAnimationFrame(r),r=window.requestAnimationFrame(n)});return o.observe(e),()=>{window.cancelAnimationFrame(r),o.unobserve(e)}}},[e,n])}const $V=CV,LV=kV,Tw=_V,Dw=MV,FV=DV;var BV=Qr((e,{scrollbarSize:t,offsetScrollbars:n,scrollbarHovered:r,hidden:o})=>({root:{overflow:"hidden"},viewport:{width:"100%",height:"100%",paddingRight:n?Le(t):void 0,paddingBottom:n?Le(t):void 0},scrollbar:{display:o?"none":"flex",userSelect:"none",touchAction:"none",boxSizing:"border-box",padding:`calc(${Le(t)} / 5)`,transition:"background-color 150ms ease, opacity 150ms ease","&:hover":{backgroundColor:e.colorScheme==="dark"?e.colors.dark[8]:e.colors.gray[0],[`& .${US("thumb")}`]:{backgroundColor:e.colorScheme==="dark"?e.fn.rgba(e.white,.5):e.fn.rgba(e.black,.5)}},'&[data-orientation="vertical"]':{width:Le(t)},'&[data-orientation="horizontal"]':{flexDirection:"column",height:Le(t)},'&[data-state="hidden"]':{display:"none",opacity:0}},thumb:{ref:US("thumb"),flex:1,backgroundColor:e.colorScheme==="dark"?e.fn.rgba(e.white,.4):e.fn.rgba(e.black,.4),borderRadius:Le(t),position:"relative",transition:"background-color 150ms ease",display:o?"none":void 0,overflow:"hidden","&::before":{content:'""',position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",width:"100%",height:"100%",minWidth:Le(44),minHeight:Le(44)}},corner:{backgroundColor:e.colorScheme==="dark"?e.colors.dark[6]:e.colors.gray[0],transition:"opacity 150ms ease",opacity:r?1:0,display:o?"none":void 0}}));const HV=BV;var WV=Object.defineProperty,VV=Object.defineProperties,UV=Object.getOwnPropertyDescriptors,Ip=Object.getOwnPropertySymbols,E_=Object.prototype.hasOwnProperty,I_=Object.prototype.propertyIsEnumerable,Aw=(e,t,n)=>t in e?WV(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,i0=(e,t)=>{for(var n in t||(t={}))E_.call(t,n)&&Aw(e,n,t[n]);if(Ip)for(var n of Ip(t))I_.call(t,n)&&Aw(e,n,t[n]);return e},O_=(e,t)=>VV(e,UV(t)),R_=(e,t)=>{var n={};for(var r in e)E_.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Ip)for(var r of Ip(e))t.indexOf(r)<0&&I_.call(e,r)&&(n[r]=e[r]);return n};const M_={scrollbarSize:12,scrollHideDelay:1e3,type:"hover",offsetScrollbars:!1},Hh=p.forwardRef((e,t)=>{const n=jr("ScrollArea",M_,e),{children:r,className:o,classNames:s,styles:a,scrollbarSize:u,scrollHideDelay:d,type:f,dir:h,offsetScrollbars:m,viewportRef:v,onScrollPositionChange:b,unstyled:w,variant:C,viewportProps:S}=n,P=R_(n,["children","className","classNames","styles","scrollbarSize","scrollHideDelay","type","dir","offsetScrollbars","viewportRef","onScrollPositionChange","unstyled","variant","viewportProps"]),[k,j]=p.useState(!1),E=Sa(),{classes:I,cx:O}=HV({scrollbarSize:u,offsetScrollbars:m,scrollbarHovered:k,hidden:f==="never"},{name:"ScrollArea",classNames:s,styles:a,unstyled:w,variant:C});return z.createElement($V,{type:f==="never"?"always":f,scrollHideDelay:d,dir:h||E.dir,ref:t,asChild:!0},z.createElement(yo,i0({className:O(I.root,o)},P),z.createElement(LV,O_(i0({},S),{className:I.viewport,ref:v,onScroll:typeof b=="function"?({currentTarget:R})=>b({x:R.scrollLeft,y:R.scrollTop}):void 0}),r),z.createElement(Tw,{orientation:"horizontal",className:I.scrollbar,forceMount:!0,onMouseEnter:()=>j(!0),onMouseLeave:()=>j(!1)},z.createElement(Dw,{className:I.thumb})),z.createElement(Tw,{orientation:"vertical",className:I.scrollbar,forceMount:!0,onMouseEnter:()=>j(!0),onMouseLeave:()=>j(!1)},z.createElement(Dw,{className:I.thumb})),z.createElement(FV,{className:I.corner})))}),T_=p.forwardRef((e,t)=>{const n=jr("ScrollAreaAutosize",M_,e),{children:r,classNames:o,styles:s,scrollbarSize:a,scrollHideDelay:u,type:d,dir:f,offsetScrollbars:h,viewportRef:m,onScrollPositionChange:v,unstyled:b,sx:w,variant:C,viewportProps:S}=n,P=R_(n,["children","classNames","styles","scrollbarSize","scrollHideDelay","type","dir","offsetScrollbars","viewportRef","onScrollPositionChange","unstyled","sx","variant","viewportProps"]);return z.createElement(yo,O_(i0({},P),{ref:t,sx:[{display:"flex"},...Ck(w)]}),z.createElement(yo,{sx:{display:"flex",flexDirection:"column",flex:1}},z.createElement(Hh,{classNames:o,styles:s,scrollHideDelay:u,scrollbarSize:a,type:d,dir:f,offsetScrollbars:h,viewportRef:m,onScrollPositionChange:v,unstyled:b,variant:C,viewportProps:S},r)))});T_.displayName="@mantine/core/ScrollAreaAutosize";Hh.displayName="@mantine/core/ScrollArea";Hh.Autosize=T_;const GV=Hh;var qV=Object.defineProperty,KV=Object.defineProperties,YV=Object.getOwnPropertyDescriptors,Op=Object.getOwnPropertySymbols,D_=Object.prototype.hasOwnProperty,A_=Object.prototype.propertyIsEnumerable,Nw=(e,t,n)=>t in e?qV(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,zw=(e,t)=>{for(var n in t||(t={}))D_.call(t,n)&&Nw(e,n,t[n]);if(Op)for(var n of Op(t))A_.call(t,n)&&Nw(e,n,t[n]);return e},XV=(e,t)=>KV(e,YV(t)),QV=(e,t)=>{var n={};for(var r in e)D_.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Op)for(var r of Op(e))t.indexOf(r)<0&&A_.call(e,r)&&(n[r]=e[r]);return n};const Wh=p.forwardRef((e,t)=>{var n=e,{style:r}=n,o=QV(n,["style"]);return z.createElement(GV,XV(zw({},o),{style:zw({width:"100%"},r),viewportProps:{tabIndex:-1},viewportRef:t}),o.children)});Wh.displayName="@mantine/core/SelectScrollArea";var ZV=Qr(()=>({dropdown:{},itemsWrapper:{padding:Le(4),display:"flex",width:"100%",boxSizing:"border-box"}}));const JV=ZV;function Sc(e){return e.split("-")[1]}function sy(e){return e==="y"?"height":"width"}function ws(e){return e.split("-")[0]}function ui(e){return["top","bottom"].includes(ws(e))?"x":"y"}function $w(e,t,n){let{reference:r,floating:o}=e;const s=r.x+r.width/2-o.width/2,a=r.y+r.height/2-o.height/2,u=ui(t),d=sy(u),f=r[d]/2-o[d]/2,h=u==="x";let m;switch(ws(t)){case"top":m={x:s,y:r.y-o.height};break;case"bottom":m={x:s,y:r.y+r.height};break;case"right":m={x:r.x+r.width,y:a};break;case"left":m={x:r.x-o.width,y:a};break;default:m={x:r.x,y:r.y}}switch(Sc(t)){case"start":m[u]-=f*(n&&h?-1:1);break;case"end":m[u]+=f*(n&&h?-1:1)}return m}const eU=async(e,t,n)=>{const{placement:r="bottom",strategy:o="absolute",middleware:s=[],platform:a}=n,u=s.filter(Boolean),d=await(a.isRTL==null?void 0:a.isRTL(t));let f=await a.getElementRects({reference:e,floating:t,strategy:o}),{x:h,y:m}=$w(f,r,d),v=r,b={},w=0;for(let C=0;C({name:"arrow",options:e,async fn(t){const{x:n,y:r,placement:o,rects:s,platform:a,elements:u}=t,{element:d,padding:f=0}=ya(e,t)||{};if(d==null)return{};const h=ay(f),m={x:n,y:r},v=ui(o),b=sy(v),w=await a.getDimensions(d),C=v==="y",S=C?"top":"left",P=C?"bottom":"right",k=C?"clientHeight":"clientWidth",j=s.reference[b]+s.reference[v]-m[v]-s.floating[b],E=m[v]-s.reference[v],I=await(a.getOffsetParent==null?void 0:a.getOffsetParent(d));let O=I?I[k]:0;O&&await(a.isElement==null?void 0:a.isElement(I))||(O=u.floating[k]||s.floating[b]);const R=j/2-E/2,M=O/2-w[b]/2-1,A=oi(h[S],M),L=oi(h[P],M),D=A,V=O-w[b]-L,$=O/2-w[b]/2+R,F=l0(D,$,V),U=Sc(o)!=null&&$!=F&&s.reference[b]/2-($e.concat(t,t+"-start",t+"-end"),[]);const nU={left:"right",right:"left",bottom:"top",top:"bottom"};function Rp(e){return e.replace(/left|right|bottom|top/g,t=>nU[t])}function rU(e,t,n){n===void 0&&(n=!1);const r=Sc(e),o=ui(e),s=sy(o);let a=o==="x"?r===(n?"end":"start")?"right":"left":r==="start"?"bottom":"top";return t.reference[s]>t.floating[s]&&(a=Rp(a)),{main:a,cross:Rp(a)}}const oU={start:"end",end:"start"};function Kg(e){return e.replace(/start|end/g,t=>oU[t])}const sU=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var n;const{placement:r,middlewareData:o,rects:s,initialPlacement:a,platform:u,elements:d}=t,{mainAxis:f=!0,crossAxis:h=!0,fallbackPlacements:m,fallbackStrategy:v="bestFit",fallbackAxisSideDirection:b="none",flipAlignment:w=!0,...C}=ya(e,t),S=ws(r),P=ws(a)===a,k=await(u.isRTL==null?void 0:u.isRTL(d.floating)),j=m||(P||!w?[Rp(a)]:function(D){const V=Rp(D);return[Kg(D),V,Kg(V)]}(a));m||b==="none"||j.push(...function(D,V,$,F){const U=Sc(D);let X=function(N,G,W){const q=["left","right"],ne=["right","left"],ve=["top","bottom"],le=["bottom","top"];switch(N){case"top":case"bottom":return W?G?ne:q:G?q:ne;case"left":case"right":return G?ve:le;default:return[]}}(ws(D),$==="start",F);return U&&(X=X.map(N=>N+"-"+U),V&&(X=X.concat(X.map(Kg)))),X}(a,w,b,k));const E=[a,...j],I=await iy(t,C),O=[];let R=((n=o.flip)==null?void 0:n.overflows)||[];if(f&&O.push(I[S]),h){const{main:D,cross:V}=rU(r,s,k);O.push(I[D],I[V])}if(R=[...R,{placement:r,overflows:O}],!O.every(D=>D<=0)){var M,A;const D=(((M=o.flip)==null?void 0:M.index)||0)+1,V=E[D];if(V)return{data:{index:D,overflows:R},reset:{placement:V}};let $=(A=R.filter(F=>F.overflows[0]<=0).sort((F,U)=>F.overflows[1]-U.overflows[1])[0])==null?void 0:A.placement;if(!$)switch(v){case"bestFit":{var L;const F=(L=R.map(U=>[U.placement,U.overflows.filter(X=>X>0).reduce((X,N)=>X+N,0)]).sort((U,X)=>U[1]-X[1])[0])==null?void 0:L[0];F&&($=F);break}case"initialPlacement":$=a}if(r!==$)return{reset:{placement:$}}}return{}}}};function Fw(e){const t=oi(...e.map(r=>r.left)),n=oi(...e.map(r=>r.top));return{x:t,y:n,width:Fs(...e.map(r=>r.right))-t,height:Fs(...e.map(r=>r.bottom))-n}}const aU=function(e){return e===void 0&&(e={}),{name:"inline",options:e,async fn(t){const{placement:n,elements:r,rects:o,platform:s,strategy:a}=t,{padding:u=2,x:d,y:f}=ya(e,t),h=Array.from(await(s.getClientRects==null?void 0:s.getClientRects(r.reference))||[]),m=function(C){const S=C.slice().sort((j,E)=>j.y-E.y),P=[];let k=null;for(let j=0;jk.height/2?P.push([E]):P[P.length-1].push(E),k=E}return P.map(j=>ec(Fw(j)))}(h),v=ec(Fw(h)),b=ay(u),w=await s.getElementRects({reference:{getBoundingClientRect:function(){if(m.length===2&&m[0].left>m[1].right&&d!=null&&f!=null)return m.find(C=>d>C.left-b.left&&dC.top-b.top&&f=2){if(ui(n)==="x"){const I=m[0],O=m[m.length-1],R=ws(n)==="top",M=I.top,A=O.bottom,L=R?I.left:O.left,D=R?I.right:O.right;return{top:M,bottom:A,left:L,right:D,width:D-L,height:A-M,x:L,y:M}}const C=ws(n)==="left",S=Fs(...m.map(I=>I.right)),P=oi(...m.map(I=>I.left)),k=m.filter(I=>C?I.left===P:I.right===S),j=k[0].top,E=k[k.length-1].bottom;return{top:j,bottom:E,left:P,right:S,width:S-P,height:E-j,x:P,y:j}}return v}},floating:r.floating,strategy:a});return o.reference.x!==w.reference.x||o.reference.y!==w.reference.y||o.reference.width!==w.reference.width||o.reference.height!==w.reference.height?{reset:{rects:w}}:{}}}},iU=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){const{x:n,y:r}=t,o=await async function(s,a){const{placement:u,platform:d,elements:f}=s,h=await(d.isRTL==null?void 0:d.isRTL(f.floating)),m=ws(u),v=Sc(u),b=ui(u)==="x",w=["left","top"].includes(m)?-1:1,C=h&&b?-1:1,S=ya(a,s);let{mainAxis:P,crossAxis:k,alignmentAxis:j}=typeof S=="number"?{mainAxis:S,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...S};return v&&typeof j=="number"&&(k=v==="end"?-1*j:j),b?{x:k*C,y:P*w}:{x:P*w,y:k*C}}(t,e);return{x:n+o.x,y:r+o.y,data:o}}}};function N_(e){return e==="x"?"y":"x"}const lU=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:n,y:r,placement:o}=t,{mainAxis:s=!0,crossAxis:a=!1,limiter:u={fn:S=>{let{x:P,y:k}=S;return{x:P,y:k}}},...d}=ya(e,t),f={x:n,y:r},h=await iy(t,d),m=ui(ws(o)),v=N_(m);let b=f[m],w=f[v];if(s){const S=m==="y"?"bottom":"right";b=l0(b+h[m==="y"?"top":"left"],b,b-h[S])}if(a){const S=v==="y"?"bottom":"right";w=l0(w+h[v==="y"?"top":"left"],w,w-h[S])}const C=u.fn({...t,[m]:b,[v]:w});return{...C,data:{x:C.x-n,y:C.y-r}}}}},cU=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:n,y:r,placement:o,rects:s,middlewareData:a}=t,{offset:u=0,mainAxis:d=!0,crossAxis:f=!0}=ya(e,t),h={x:n,y:r},m=ui(o),v=N_(m);let b=h[m],w=h[v];const C=ya(u,t),S=typeof C=="number"?{mainAxis:C,crossAxis:0}:{mainAxis:0,crossAxis:0,...C};if(d){const j=m==="y"?"height":"width",E=s.reference[m]-s.floating[j]+S.mainAxis,I=s.reference[m]+s.reference[j]-S.mainAxis;bI&&(b=I)}if(f){var P,k;const j=m==="y"?"width":"height",E=["top","left"].includes(ws(o)),I=s.reference[v]-s.floating[j]+(E&&((P=a.offset)==null?void 0:P[v])||0)+(E?0:S.crossAxis),O=s.reference[v]+s.reference[j]+(E?0:((k=a.offset)==null?void 0:k[v])||0)-(E?S.crossAxis:0);wO&&(w=O)}return{[m]:b,[v]:w}}}},uU=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){const{placement:n,rects:r,platform:o,elements:s}=t,{apply:a=()=>{},...u}=ya(e,t),d=await iy(t,u),f=ws(n),h=Sc(n),m=ui(n)==="x",{width:v,height:b}=r.floating;let w,C;f==="top"||f==="bottom"?(w=f,C=h===(await(o.isRTL==null?void 0:o.isRTL(s.floating))?"start":"end")?"left":"right"):(C=f,w=h==="end"?"top":"bottom");const S=b-d[w],P=v-d[C],k=!t.middlewareData.shift;let j=S,E=P;if(m){const O=v-d.left-d.right;E=h||k?oi(P,O):O}else{const O=b-d.top-d.bottom;j=h||k?oi(S,O):O}if(k&&!h){const O=Fs(d.left,0),R=Fs(d.right,0),M=Fs(d.top,0),A=Fs(d.bottom,0);m?E=v-2*(O!==0||R!==0?O+R:Fs(d.left,d.right)):j=b-2*(M!==0||A!==0?M+A:Fs(d.top,d.bottom))}await a({...t,availableWidth:E,availableHeight:j});const I=await o.getDimensions(s.floating);return v!==I.width||b!==I.height?{reset:{rects:!0}}:{}}}};function rs(e){var t;return((t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Cs(e){return rs(e).getComputedStyle(e)}function z_(e){return e instanceof rs(e).Node}function si(e){return z_(e)?(e.nodeName||"").toLowerCase():"#document"}function Es(e){return e instanceof rs(e).HTMLElement}function da(e){return e instanceof rs(e).Element}function Bw(e){return typeof ShadowRoot<"u"&&(e instanceof rs(e).ShadowRoot||e instanceof ShadowRoot)}function ju(e){const{overflow:t,overflowX:n,overflowY:r,display:o}=Cs(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&!["inline","contents"].includes(o)}function dU(e){return["table","td","th"].includes(si(e))}function c0(e){const t=ly(),n=Cs(e);return n.transform!=="none"||n.perspective!=="none"||!t&&!!n.backdropFilter&&n.backdropFilter!=="none"||!t&&!!n.filter&&n.filter!=="none"||["transform","perspective","filter"].some(r=>(n.willChange||"").includes(r))||["paint","layout","strict","content"].some(r=>(n.contain||"").includes(r))}function ly(){return!(typeof CSS>"u"||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}function Vh(e){return["html","body","#document"].includes(si(e))}const u0=Math.min,Vl=Math.max,Mp=Math.round,mf=Math.floor,Yi=e=>({x:e,y:e});function $_(e){const t=Cs(e);let n=parseFloat(t.width)||0,r=parseFloat(t.height)||0;const o=Es(e),s=o?e.offsetWidth:n,a=o?e.offsetHeight:r,u=Mp(n)!==s||Mp(r)!==a;return u&&(n=s,r=a),{width:n,height:r,$:u}}function cy(e){return da(e)?e:e.contextElement}function Ul(e){const t=cy(e);if(!Es(t))return Yi(1);const n=t.getBoundingClientRect(),{width:r,height:o,$:s}=$_(t);let a=(s?Mp(n.width):n.width)/r,u=(s?Mp(n.height):n.height)/o;return a&&Number.isFinite(a)||(a=1),u&&Number.isFinite(u)||(u=1),{x:a,y:u}}const Hw=Yi(0);function L_(e,t,n){var r,o;if(t===void 0&&(t=!0),!ly())return Hw;const s=e?rs(e):window;return!n||t&&n!==s?Hw:{x:((r=s.visualViewport)==null?void 0:r.offsetLeft)||0,y:((o=s.visualViewport)==null?void 0:o.offsetTop)||0}}function Xi(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const o=e.getBoundingClientRect(),s=cy(e);let a=Yi(1);t&&(r?da(r)&&(a=Ul(r)):a=Ul(e));const u=L_(s,n,r);let d=(o.left+u.x)/a.x,f=(o.top+u.y)/a.y,h=o.width/a.x,m=o.height/a.y;if(s){const v=rs(s),b=r&&da(r)?rs(r):r;let w=v.frameElement;for(;w&&r&&b!==v;){const C=Ul(w),S=w.getBoundingClientRect(),P=getComputedStyle(w),k=S.left+(w.clientLeft+parseFloat(P.paddingLeft))*C.x,j=S.top+(w.clientTop+parseFloat(P.paddingTop))*C.y;d*=C.x,f*=C.y,h*=C.x,m*=C.y,d+=k,f+=j,w=rs(w).frameElement}}return ec({width:h,height:m,x:d,y:f})}function fa(e){return((z_(e)?e.ownerDocument:e.document)||window.document).documentElement}function Uh(e){return da(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function F_(e){return Xi(fa(e)).left+Uh(e).scrollLeft}function tc(e){if(si(e)==="html")return e;const t=e.assignedSlot||e.parentNode||Bw(e)&&e.host||fa(e);return Bw(t)?t.host:t}function B_(e){const t=tc(e);return Vh(t)?e.ownerDocument?e.ownerDocument.body:e.body:Es(t)&&ju(t)?t:B_(t)}function Tp(e,t){var n;t===void 0&&(t=[]);const r=B_(e),o=r===((n=e.ownerDocument)==null?void 0:n.body),s=rs(r);return o?t.concat(s,s.visualViewport||[],ju(r)?r:[]):t.concat(r,Tp(r))}function Ww(e,t,n){let r;if(t==="viewport")r=function(o,s){const a=rs(o),u=fa(o),d=a.visualViewport;let f=u.clientWidth,h=u.clientHeight,m=0,v=0;if(d){f=d.width,h=d.height;const b=ly();(!b||b&&s==="fixed")&&(m=d.offsetLeft,v=d.offsetTop)}return{width:f,height:h,x:m,y:v}}(e,n);else if(t==="document")r=function(o){const s=fa(o),a=Uh(o),u=o.ownerDocument.body,d=Vl(s.scrollWidth,s.clientWidth,u.scrollWidth,u.clientWidth),f=Vl(s.scrollHeight,s.clientHeight,u.scrollHeight,u.clientHeight);let h=-a.scrollLeft+F_(o);const m=-a.scrollTop;return Cs(u).direction==="rtl"&&(h+=Vl(s.clientWidth,u.clientWidth)-d),{width:d,height:f,x:h,y:m}}(fa(e));else if(da(t))r=function(o,s){const a=Xi(o,!0,s==="fixed"),u=a.top+o.clientTop,d=a.left+o.clientLeft,f=Es(o)?Ul(o):Yi(1);return{width:o.clientWidth*f.x,height:o.clientHeight*f.y,x:d*f.x,y:u*f.y}}(t,n);else{const o=L_(e);r={...t,x:t.x-o.x,y:t.y-o.y}}return ec(r)}function H_(e,t){const n=tc(e);return!(n===t||!da(n)||Vh(n))&&(Cs(n).position==="fixed"||H_(n,t))}function Vw(e,t){return Es(e)&&Cs(e).position!=="fixed"?t?t(e):e.offsetParent:null}function Uw(e,t){const n=rs(e);if(!Es(e))return n;let r=Vw(e,t);for(;r&&dU(r)&&Cs(r).position==="static";)r=Vw(r,t);return r&&(si(r)==="html"||si(r)==="body"&&Cs(r).position==="static"&&!c0(r))?n:r||function(o){let s=tc(o);for(;Es(s)&&!Vh(s);){if(c0(s))return s;s=tc(s)}return null}(e)||n}function fU(e,t,n){const r=Es(t),o=fa(t),s=n==="fixed",a=Xi(e,!0,s,t);let u={scrollLeft:0,scrollTop:0};const d=Yi(0);if(r||!r&&!s)if((si(t)!=="body"||ju(o))&&(u=Uh(t)),Es(t)){const f=Xi(t,!0,s,t);d.x=f.x+t.clientLeft,d.y=f.y+t.clientTop}else o&&(d.x=F_(o));return{x:a.left+u.scrollLeft-d.x,y:a.top+u.scrollTop-d.y,width:a.width,height:a.height}}const pU={getClippingRect:function(e){let{element:t,boundary:n,rootBoundary:r,strategy:o}=e;const s=n==="clippingAncestors"?function(f,h){const m=h.get(f);if(m)return m;let v=Tp(f).filter(S=>da(S)&&si(S)!=="body"),b=null;const w=Cs(f).position==="fixed";let C=w?tc(f):f;for(;da(C)&&!Vh(C);){const S=Cs(C),P=c0(C);P||S.position!=="fixed"||(b=null),(w?!P&&!b:!P&&S.position==="static"&&b&&["absolute","fixed"].includes(b.position)||ju(C)&&!P&&H_(f,C))?v=v.filter(k=>k!==C):b=S,C=tc(C)}return h.set(f,v),v}(t,this._c):[].concat(n),a=[...s,r],u=a[0],d=a.reduce((f,h)=>{const m=Ww(t,h,o);return f.top=Vl(m.top,f.top),f.right=u0(m.right,f.right),f.bottom=u0(m.bottom,f.bottom),f.left=Vl(m.left,f.left),f},Ww(t,u,o));return{width:d.right-d.left,height:d.bottom-d.top,x:d.left,y:d.top}},convertOffsetParentRelativeRectToViewportRelativeRect:function(e){let{rect:t,offsetParent:n,strategy:r}=e;const o=Es(n),s=fa(n);if(n===s)return t;let a={scrollLeft:0,scrollTop:0},u=Yi(1);const d=Yi(0);if((o||!o&&r!=="fixed")&&((si(n)!=="body"||ju(s))&&(a=Uh(n)),Es(n))){const f=Xi(n);u=Ul(n),d.x=f.x+n.clientLeft,d.y=f.y+n.clientTop}return{width:t.width*u.x,height:t.height*u.y,x:t.x*u.x-a.scrollLeft*u.x+d.x,y:t.y*u.y-a.scrollTop*u.y+d.y}},isElement:da,getDimensions:function(e){return $_(e)},getOffsetParent:Uw,getDocumentElement:fa,getScale:Ul,async getElementRects(e){let{reference:t,floating:n,strategy:r}=e;const o=this.getOffsetParent||Uw,s=this.getDimensions;return{reference:fU(t,await o(n),r),floating:{x:0,y:0,...await s(n)}}},getClientRects:e=>Array.from(e.getClientRects()),isRTL:e=>Cs(e).direction==="rtl"};function hU(e,t,n,r){r===void 0&&(r={});const{ancestorScroll:o=!0,ancestorResize:s=!0,elementResize:a=!0,layoutShift:u=typeof IntersectionObserver=="function",animationFrame:d=!1}=r,f=cy(e),h=o||s?[...f?Tp(f):[],...Tp(t)]:[];h.forEach(C=>{o&&C.addEventListener("scroll",n,{passive:!0}),s&&C.addEventListener("resize",n)});const m=f&&u?function(C,S){let P,k=null;const j=fa(C);function E(){clearTimeout(P),k&&k.disconnect(),k=null}return function I(O,R){O===void 0&&(O=!1),R===void 0&&(R=1),E();const{left:M,top:A,width:L,height:D}=C.getBoundingClientRect();if(O||S(),!L||!D)return;const V=mf(A),$=mf(j.clientWidth-(M+L)),F=mf(j.clientHeight-(A+D)),U=mf(M);let X=!0;k=new IntersectionObserver(N=>{const G=N[0].intersectionRatio;if(G!==R){if(!X)return I();G?I(!1,G):P=setTimeout(()=>{I(!1,1e-7)},100)}X=!1},{rootMargin:-V+"px "+-$+"px "+-F+"px "+-U+"px",threshold:Vl(0,u0(1,R))||1}),k.observe(C)}(!0),E}(f,n):null;let v,b=null;a&&(b=new ResizeObserver(n),f&&!d&&b.observe(f),b.observe(t));let w=d?Xi(e):null;return d&&function C(){const S=Xi(e);!w||S.x===w.x&&S.y===w.y&&S.width===w.width&&S.height===w.height||n(),w=S,v=requestAnimationFrame(C)}(),n(),()=>{h.forEach(C=>{o&&C.removeEventListener("scroll",n),s&&C.removeEventListener("resize",n)}),m&&m(),b&&b.disconnect(),b=null,d&&cancelAnimationFrame(v)}}const mU=(e,t,n)=>{const r=new Map,o={platform:pU,...n},s={...o.platform,_c:r};return eU(e,t,{...o,platform:s})},gU=e=>{const{element:t,padding:n}=e;function r(o){return Object.prototype.hasOwnProperty.call(o,"current")}return{name:"arrow",options:e,fn(o){return r(t)?t.current!=null?Lw({element:t.current,padding:n}).fn(o):{}:t?Lw({element:t,padding:n}).fn(o):{}}}};var Nf=typeof document<"u"?p.useLayoutEffect:p.useEffect;function Dp(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let n,r,o;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(!Dp(e[r],t[r]))return!1;return!0}if(o=Object.keys(e),n=o.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!Object.prototype.hasOwnProperty.call(t,o[r]))return!1;for(r=n;r--!==0;){const s=o[r];if(!(s==="_owner"&&e.$$typeof)&&!Dp(e[s],t[s]))return!1}return!0}return e!==e&&t!==t}function Gw(e){const t=p.useRef(e);return Nf(()=>{t.current=e}),t}function vU(e){e===void 0&&(e={});const{placement:t="bottom",strategy:n="absolute",middleware:r=[],platform:o,whileElementsMounted:s,open:a}=e,[u,d]=p.useState({x:null,y:null,strategy:n,placement:t,middlewareData:{},isPositioned:!1}),[f,h]=p.useState(r);Dp(f,r)||h(r);const m=p.useRef(null),v=p.useRef(null),b=p.useRef(u),w=Gw(s),C=Gw(o),[S,P]=p.useState(null),[k,j]=p.useState(null),E=p.useCallback(L=>{m.current!==L&&(m.current=L,P(L))},[]),I=p.useCallback(L=>{v.current!==L&&(v.current=L,j(L))},[]),O=p.useCallback(()=>{if(!m.current||!v.current)return;const L={placement:t,strategy:n,middleware:f};C.current&&(L.platform=C.current),mU(m.current,v.current,L).then(D=>{const V={...D,isPositioned:!0};R.current&&!Dp(b.current,V)&&(b.current=V,pc.flushSync(()=>{d(V)}))})},[f,t,n,C]);Nf(()=>{a===!1&&b.current.isPositioned&&(b.current.isPositioned=!1,d(L=>({...L,isPositioned:!1})))},[a]);const R=p.useRef(!1);Nf(()=>(R.current=!0,()=>{R.current=!1}),[]),Nf(()=>{if(S&&k){if(w.current)return w.current(S,k,O);O()}},[S,k,O,w]);const M=p.useMemo(()=>({reference:m,floating:v,setReference:E,setFloating:I}),[E,I]),A=p.useMemo(()=>({reference:S,floating:k}),[S,k]);return p.useMemo(()=>({...u,update:O,refs:M,elements:A,reference:E,floating:I}),[u,O,M,A,E,I])}var yU=typeof document<"u"?p.useLayoutEffect:p.useEffect;function bU(){const e=new Map;return{emit(t,n){var r;(r=e.get(t))==null||r.forEach(o=>o(n))},on(t,n){e.set(t,[...e.get(t)||[],n])},off(t,n){e.set(t,(e.get(t)||[]).filter(r=>r!==n))}}}const xU=p.createContext(null),SU=()=>p.useContext(xU);function wU(e){return(e==null?void 0:e.ownerDocument)||document}function CU(e){return wU(e).defaultView||window}function gf(e){return e?e instanceof CU(e).Element:!1}const PU=L0["useInsertionEffect".toString()],kU=PU||(e=>e());function _U(e){const t=p.useRef(()=>{});return kU(()=>{t.current=e}),p.useCallback(function(){for(var n=arguments.length,r=new Array(n),o=0;obU())[0],[f,h]=p.useState(null),m=p.useCallback(P=>{const k=gf(P)?{getBoundingClientRect:()=>P.getBoundingClientRect(),contextElement:P}:P;o.refs.setReference(k)},[o.refs]),v=p.useCallback(P=>{(gf(P)||P===null)&&(a.current=P,h(P)),(gf(o.refs.reference.current)||o.refs.reference.current===null||P!==null&&!gf(P))&&o.refs.setReference(P)},[o.refs]),b=p.useMemo(()=>({...o.refs,setReference:v,setPositionReference:m,domReference:a}),[o.refs,v,m]),w=p.useMemo(()=>({...o.elements,domReference:f}),[o.elements,f]),C=_U(n),S=p.useMemo(()=>({...o,refs:b,elements:w,dataRef:u,nodeId:r,events:d,open:t,onOpenChange:C}),[o,r,d,t,C,b,w]);return yU(()=>{const P=s==null?void 0:s.nodesRef.current.find(k=>k.id===r);P&&(P.context=S)}),p.useMemo(()=>({...o,context:S,refs:b,reference:v,positionReference:m}),[o,b,S,v,m])}function EU({opened:e,floating:t,position:n,positionDependencies:r}){const[o,s]=p.useState(0);p.useEffect(()=>{if(t.refs.reference.current&&t.refs.floating.current)return hU(t.refs.reference.current,t.refs.floating.current,t.update)},[t.refs.reference.current,t.refs.floating.current,e,o,n]),Ss(()=>{t.update()},r),Ss(()=>{s(a=>a+1)},[e])}function IU(e){const t=[iU(e.offset)];return e.middlewares.shift&&t.push(lU({limiter:cU()})),e.middlewares.flip&&t.push(sU()),e.middlewares.inline&&t.push(aU()),t.push(gU({element:e.arrowRef,padding:e.arrowOffset})),t}function OU(e){const[t,n]=_u({value:e.opened,defaultValue:e.defaultOpened,finalValue:!1,onChange:e.onChange}),r=()=>{var a;(a=e.onClose)==null||a.call(e),n(!1)},o=()=>{var a,u;t?((a=e.onClose)==null||a.call(e),n(!1)):((u=e.onOpen)==null||u.call(e),n(!0))},s=jU({placement:e.position,middleware:[...IU(e),...e.width==="target"?[uU({apply({rects:a}){var u,d;Object.assign((d=(u=s.refs.floating.current)==null?void 0:u.style)!=null?d:{},{width:`${a.reference.width}px`})}})]:[]]});return EU({opened:e.opened,position:e.position,positionDependencies:e.positionDependencies,floating:s}),Ss(()=>{var a;(a=e.onPositionChange)==null||a.call(e,s.placement)},[s.placement]),Ss(()=>{var a,u;e.opened?(u=e.onOpen)==null||u.call(e):(a=e.onClose)==null||a.call(e)},[e.opened]),{floating:s,controlled:typeof e.opened=="boolean",opened:t,onClose:r,onToggle:o}}const W_={context:"Popover component was not found in the tree",children:"Popover.Target component children should be an element or a component that accepts ref. Fragments, strings, numbers and other primitive values are not supported"},[RU,V_]=cB(W_.context);var MU=Object.defineProperty,TU=Object.defineProperties,DU=Object.getOwnPropertyDescriptors,Ap=Object.getOwnPropertySymbols,U_=Object.prototype.hasOwnProperty,G_=Object.prototype.propertyIsEnumerable,qw=(e,t,n)=>t in e?MU(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,vf=(e,t)=>{for(var n in t||(t={}))U_.call(t,n)&&qw(e,n,t[n]);if(Ap)for(var n of Ap(t))G_.call(t,n)&&qw(e,n,t[n]);return e},AU=(e,t)=>TU(e,DU(t)),NU=(e,t)=>{var n={};for(var r in e)U_.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Ap)for(var r of Ap(e))t.indexOf(r)<0&&G_.call(e,r)&&(n[r]=e[r]);return n};const zU={refProp:"ref",popupType:"dialog"},q_=p.forwardRef((e,t)=>{const n=jr("PopoverTarget",zU,e),{children:r,refProp:o,popupType:s}=n,a=NU(n,["children","refProp","popupType"]);if(!kk(r))throw new Error(W_.children);const u=a,d=V_(),f=$h(d.reference,r.ref,t),h=d.withRoles?{"aria-haspopup":s,"aria-expanded":d.opened,"aria-controls":d.getDropdownId(),id:d.getTargetId()}:{};return p.cloneElement(r,vf(AU(vf(vf(vf({},u),h),d.targetProps),{className:jk(d.targetProps.className,u.className,r.props.className),[o]:f}),d.controlled?null:{onClick:d.onToggle}))});q_.displayName="@mantine/core/PopoverTarget";var $U=Qr((e,{radius:t,shadow:n})=>({dropdown:{position:"absolute",backgroundColor:e.white,background:e.colorScheme==="dark"?e.colors.dark[6]:e.white,border:`${Le(1)} solid ${e.colorScheme==="dark"?e.colors.dark[4]:e.colors.gray[2]}`,padding:`${e.spacing.sm} ${e.spacing.md}`,boxShadow:e.shadows[n]||n||"none",borderRadius:e.fn.radius(t),"&:focus":{outline:0}},arrow:{backgroundColor:"inherit",border:`${Le(1)} solid ${e.colorScheme==="dark"?e.colors.dark[4]:e.colors.gray[2]}`,zIndex:1}}));const LU=$U;var FU=Object.defineProperty,Kw=Object.getOwnPropertySymbols,BU=Object.prototype.hasOwnProperty,HU=Object.prototype.propertyIsEnumerable,Yw=(e,t,n)=>t in e?FU(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Pl=(e,t)=>{for(var n in t||(t={}))BU.call(t,n)&&Yw(e,n,t[n]);if(Kw)for(var n of Kw(t))HU.call(t,n)&&Yw(e,n,t[n]);return e};const Xw={entering:"in",entered:"in",exiting:"out",exited:"out","pre-exiting":"out","pre-entering":"out"};function WU({transition:e,state:t,duration:n,timingFunction:r}){const o={transitionDuration:`${n}ms`,transitionTimingFunction:r};return typeof e=="string"?e in cf?Pl(Pl(Pl({transitionProperty:cf[e].transitionProperty},o),cf[e].common),cf[e][Xw[t]]):null:Pl(Pl(Pl({transitionProperty:e.transitionProperty},o),e.common),e[Xw[t]])}function VU({duration:e,exitDuration:t,timingFunction:n,mounted:r,onEnter:o,onExit:s,onEntered:a,onExited:u}){const d=Sa(),f=Tk(),h=d.respectReducedMotion?f:!1,[m,v]=p.useState(h?0:e),[b,w]=p.useState(r?"entered":"exited"),C=p.useRef(-1),S=P=>{const k=P?o:s,j=P?a:u;w(P?"pre-entering":"pre-exiting"),window.clearTimeout(C.current);const E=h?0:P?e:t;if(v(E),E===0)typeof k=="function"&&k(),typeof j=="function"&&j(),w(P?"entered":"exited");else{const I=window.setTimeout(()=>{typeof k=="function"&&k(),w(P?"entering":"exiting")},10);C.current=window.setTimeout(()=>{window.clearTimeout(I),typeof j=="function"&&j(),w(P?"entered":"exited")},E)}};return Ss(()=>{S(r)},[r]),p.useEffect(()=>()=>window.clearTimeout(C.current),[]),{transitionDuration:m,transitionStatus:b,transitionTimingFunction:n||d.transitionTimingFunction}}function K_({keepMounted:e,transition:t,duration:n=250,exitDuration:r=n,mounted:o,children:s,timingFunction:a,onExit:u,onEntered:d,onEnter:f,onExited:h}){const{transitionDuration:m,transitionStatus:v,transitionTimingFunction:b}=VU({mounted:o,exitDuration:r,duration:n,timingFunction:a,onExit:u,onEntered:d,onEnter:f,onExited:h});return m===0?o?z.createElement(z.Fragment,null,s({})):e?s({display:"none"}):null:v==="exited"?e?s({display:"none"}):null:z.createElement(z.Fragment,null,s(WU({transition:t,duration:m,state:v,timingFunction:b})))}K_.displayName="@mantine/core/Transition";function Y_({children:e,active:t=!0,refProp:n="ref"}){const r=WB(t),o=$h(r,e==null?void 0:e.ref);return kk(e)?p.cloneElement(e,{[n]:o}):e}Y_.displayName="@mantine/core/FocusTrap";var UU=Object.defineProperty,GU=Object.defineProperties,qU=Object.getOwnPropertyDescriptors,Qw=Object.getOwnPropertySymbols,KU=Object.prototype.hasOwnProperty,YU=Object.prototype.propertyIsEnumerable,Zw=(e,t,n)=>t in e?UU(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Na=(e,t)=>{for(var n in t||(t={}))KU.call(t,n)&&Zw(e,n,t[n]);if(Qw)for(var n of Qw(t))YU.call(t,n)&&Zw(e,n,t[n]);return e},yf=(e,t)=>GU(e,qU(t));function Jw(e,t,n,r){return e==="center"||r==="center"?{top:t}:e==="end"?{bottom:n}:e==="start"?{top:n}:{}}function eC(e,t,n,r,o){return e==="center"||r==="center"?{left:t}:e==="end"?{[o==="ltr"?"right":"left"]:n}:e==="start"?{[o==="ltr"?"left":"right"]:n}:{}}const XU={bottom:"borderTopLeftRadius",left:"borderTopRightRadius",right:"borderBottomLeftRadius",top:"borderBottomRightRadius"};function QU({position:e,arrowSize:t,arrowOffset:n,arrowRadius:r,arrowPosition:o,arrowX:s,arrowY:a,dir:u}){const[d,f="center"]=e.split("-"),h={width:Le(t),height:Le(t),transform:"rotate(45deg)",position:"absolute",[XU[d]]:Le(r)},m=Le(-t/2);return d==="left"?yf(Na(Na({},h),Jw(f,a,n,o)),{right:m,borderLeftColor:"transparent",borderBottomColor:"transparent"}):d==="right"?yf(Na(Na({},h),Jw(f,a,n,o)),{left:m,borderRightColor:"transparent",borderTopColor:"transparent"}):d==="top"?yf(Na(Na({},h),eC(f,s,n,o,u)),{bottom:m,borderTopColor:"transparent",borderLeftColor:"transparent"}):d==="bottom"?yf(Na(Na({},h),eC(f,s,n,o,u)),{top:m,borderBottomColor:"transparent",borderRightColor:"transparent"}):{}}var ZU=Object.defineProperty,JU=Object.defineProperties,eG=Object.getOwnPropertyDescriptors,Np=Object.getOwnPropertySymbols,X_=Object.prototype.hasOwnProperty,Q_=Object.prototype.propertyIsEnumerable,tC=(e,t,n)=>t in e?ZU(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,tG=(e,t)=>{for(var n in t||(t={}))X_.call(t,n)&&tC(e,n,t[n]);if(Np)for(var n of Np(t))Q_.call(t,n)&&tC(e,n,t[n]);return e},nG=(e,t)=>JU(e,eG(t)),rG=(e,t)=>{var n={};for(var r in e)X_.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Np)for(var r of Np(e))t.indexOf(r)<0&&Q_.call(e,r)&&(n[r]=e[r]);return n};const Z_=p.forwardRef((e,t)=>{var n=e,{position:r,arrowSize:o,arrowOffset:s,arrowRadius:a,arrowPosition:u,visible:d,arrowX:f,arrowY:h}=n,m=rG(n,["position","arrowSize","arrowOffset","arrowRadius","arrowPosition","visible","arrowX","arrowY"]);const v=Sa();return d?z.createElement("div",nG(tG({},m),{ref:t,style:QU({position:r,arrowSize:o,arrowOffset:s,arrowRadius:a,arrowPosition:u,dir:v.dir,arrowX:f,arrowY:h})})):null});Z_.displayName="@mantine/core/FloatingArrow";var oG=Object.defineProperty,sG=Object.defineProperties,aG=Object.getOwnPropertyDescriptors,zp=Object.getOwnPropertySymbols,J_=Object.prototype.hasOwnProperty,ej=Object.prototype.propertyIsEnumerable,nC=(e,t,n)=>t in e?oG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,kl=(e,t)=>{for(var n in t||(t={}))J_.call(t,n)&&nC(e,n,t[n]);if(zp)for(var n of zp(t))ej.call(t,n)&&nC(e,n,t[n]);return e},bf=(e,t)=>sG(e,aG(t)),iG=(e,t)=>{var n={};for(var r in e)J_.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&zp)for(var r of zp(e))t.indexOf(r)<0&&ej.call(e,r)&&(n[r]=e[r]);return n};const lG={};function tj(e){var t;const n=jr("PopoverDropdown",lG,e),{style:r,className:o,children:s,onKeyDownCapture:a}=n,u=iG(n,["style","className","children","onKeyDownCapture"]),d=V_(),{classes:f,cx:h}=LU({radius:d.radius,shadow:d.shadow},{name:d.__staticSelector,classNames:d.classNames,styles:d.styles,unstyled:d.unstyled,variant:d.variant}),m=NB({opened:d.opened,shouldReturnFocus:d.returnFocus}),v=d.withRoles?{"aria-labelledby":d.getTargetId(),id:d.getDropdownId(),role:"dialog"}:{};return d.disabled?null:z.createElement(o_,bf(kl({},d.portalProps),{withinPortal:d.withinPortal}),z.createElement(K_,bf(kl({mounted:d.opened},d.transitionProps),{transition:d.transitionProps.transition||"fade",duration:(t=d.transitionProps.duration)!=null?t:150,keepMounted:d.keepMounted,exitDuration:typeof d.transitionProps.exitDuration=="number"?d.transitionProps.exitDuration:d.transitionProps.duration}),b=>{var w,C;return z.createElement(Y_,{active:d.trapFocus},z.createElement(yo,kl(bf(kl({},v),{tabIndex:-1,ref:d.floating,style:bf(kl(kl({},r),b),{zIndex:d.zIndex,top:(w=d.y)!=null?w:0,left:(C=d.x)!=null?C:0,width:d.width==="target"?void 0:Le(d.width)}),className:h(f.dropdown,o),onKeyDownCapture:dB(d.onClose,{active:d.closeOnEscape,onTrigger:m,onKeyDown:a}),"data-position":d.placement}),u),s,z.createElement(Z_,{ref:d.arrowRef,arrowX:d.arrowX,arrowY:d.arrowY,visible:d.withArrow,position:d.placement,arrowSize:d.arrowSize,arrowRadius:d.arrowRadius,arrowOffset:d.arrowOffset,arrowPosition:d.arrowPosition,className:f.arrow})))}))}tj.displayName="@mantine/core/PopoverDropdown";function cG(e,t){if(e==="rtl"&&(t.includes("right")||t.includes("left"))){const[n,r]=t.split("-"),o=n==="right"?"left":"right";return r===void 0?o:`${o}-${r}`}return t}var rC=Object.getOwnPropertySymbols,uG=Object.prototype.hasOwnProperty,dG=Object.prototype.propertyIsEnumerable,fG=(e,t)=>{var n={};for(var r in e)uG.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&rC)for(var r of rC(e))t.indexOf(r)<0&&dG.call(e,r)&&(n[r]=e[r]);return n};const pG={position:"bottom",offset:8,positionDependencies:[],transitionProps:{transition:"fade",duration:150},middlewares:{flip:!0,shift:!0,inline:!1},arrowSize:7,arrowOffset:5,arrowRadius:0,arrowPosition:"side",closeOnClickOutside:!0,withinPortal:!1,closeOnEscape:!0,trapFocus:!1,withRoles:!0,returnFocus:!1,clickOutsideEvents:["mousedown","touchstart"],zIndex:J1("popover"),__staticSelector:"Popover",width:"max-content"};function wc(e){var t,n,r,o,s,a;const u=p.useRef(null),d=jr("Popover",pG,e),{children:f,position:h,offset:m,onPositionChange:v,positionDependencies:b,opened:w,transitionProps:C,width:S,middlewares:P,withArrow:k,arrowSize:j,arrowOffset:E,arrowRadius:I,arrowPosition:O,unstyled:R,classNames:M,styles:A,closeOnClickOutside:L,withinPortal:D,portalProps:V,closeOnEscape:$,clickOutsideEvents:F,trapFocus:U,onClose:X,onOpen:N,onChange:G,zIndex:W,radius:q,shadow:ne,id:ve,defaultOpened:le,__staticSelector:oe,withRoles:Y,disabled:ae,returnFocus:de,variant:xe,keepMounted:se}=d,ge=fG(d,["children","position","offset","onPositionChange","positionDependencies","opened","transitionProps","width","middlewares","withArrow","arrowSize","arrowOffset","arrowRadius","arrowPosition","unstyled","classNames","styles","closeOnClickOutside","withinPortal","portalProps","closeOnEscape","clickOutsideEvents","trapFocus","onClose","onOpen","onChange","zIndex","radius","shadow","id","defaultOpened","__staticSelector","withRoles","disabled","returnFocus","variant","keepMounted"]),[fe,ke]=p.useState(null),[Ae,ye]=p.useState(null),Oe=ty(ve),at=Sa(),Fe=OU({middlewares:P,width:S,position:cG(at.dir,h),offset:typeof m=="number"?m+(k?j/2:0):m,arrowRef:u,arrowOffset:E,onPositionChange:v,positionDependencies:b,opened:w,defaultOpened:le,onChange:G,onOpen:N,onClose:X});MB(()=>Fe.opened&&L&&Fe.onClose(),F,[fe,Ae]);const Ye=p.useCallback(xt=>{ke(xt),Fe.floating.reference(xt)},[Fe.floating.reference]),_t=p.useCallback(xt=>{ye(xt),Fe.floating.floating(xt)},[Fe.floating.floating]);return z.createElement(RU,{value:{returnFocus:de,disabled:ae,controlled:Fe.controlled,reference:Ye,floating:_t,x:Fe.floating.x,y:Fe.floating.y,arrowX:(r=(n=(t=Fe.floating)==null?void 0:t.middlewareData)==null?void 0:n.arrow)==null?void 0:r.x,arrowY:(a=(s=(o=Fe.floating)==null?void 0:o.middlewareData)==null?void 0:s.arrow)==null?void 0:a.y,opened:Fe.opened,arrowRef:u,transitionProps:C,width:S,withArrow:k,arrowSize:j,arrowOffset:E,arrowRadius:I,arrowPosition:O,placement:Fe.floating.placement,trapFocus:U,withinPortal:D,portalProps:V,zIndex:W,radius:q,shadow:ne,closeOnEscape:$,onClose:Fe.onClose,onToggle:Fe.onToggle,getTargetId:()=>`${Oe}-target`,getDropdownId:()=>`${Oe}-dropdown`,withRoles:Y,targetProps:ge,__staticSelector:oe,classNames:M,styles:A,unstyled:R,variant:xe,keepMounted:se}},f)}wc.Target=q_;wc.Dropdown=tj;wc.displayName="@mantine/core/Popover";var hG=Object.defineProperty,$p=Object.getOwnPropertySymbols,nj=Object.prototype.hasOwnProperty,rj=Object.prototype.propertyIsEnumerable,oC=(e,t,n)=>t in e?hG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,mG=(e,t)=>{for(var n in t||(t={}))nj.call(t,n)&&oC(e,n,t[n]);if($p)for(var n of $p(t))rj.call(t,n)&&oC(e,n,t[n]);return e},gG=(e,t)=>{var n={};for(var r in e)nj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&$p)for(var r of $p(e))t.indexOf(r)<0&&rj.call(e,r)&&(n[r]=e[r]);return n};function vG(e){var t=e,{children:n,component:r="div",maxHeight:o=220,direction:s="column",id:a,innerRef:u,__staticSelector:d,styles:f,classNames:h,unstyled:m}=t,v=gG(t,["children","component","maxHeight","direction","id","innerRef","__staticSelector","styles","classNames","unstyled"]);const{classes:b}=JV(null,{name:d,styles:f,classNames:h,unstyled:m});return z.createElement(wc.Dropdown,mG({p:0,onMouseDown:w=>w.preventDefault()},v),z.createElement("div",{style:{maxHeight:Le(o),display:"flex"}},z.createElement(yo,{component:r||"div",id:`${a}-items`,"aria-labelledby":`${a}-label`,role:"listbox",onMouseDown:w=>w.preventDefault(),style:{flex:1,overflowY:r!==Wh?"auto":void 0},"data-combobox-popover":!0,tabIndex:-1,ref:u},z.createElement("div",{className:b.itemsWrapper,style:{flexDirection:s}},n))))}function Qa({opened:e,transitionProps:t={transition:"fade",duration:0},shadow:n,withinPortal:r,portalProps:o,children:s,__staticSelector:a,onDirectionChange:u,switchDirectionOnFlip:d,zIndex:f,dropdownPosition:h,positionDependencies:m=[],classNames:v,styles:b,unstyled:w,readOnly:C,variant:S}){return z.createElement(wc,{unstyled:w,classNames:v,styles:b,width:"target",withRoles:!1,opened:e,middlewares:{flip:h==="flip",shift:!1},position:h==="flip"?"bottom":h,positionDependencies:m,zIndex:f,__staticSelector:a,withinPortal:r,portalProps:o,transitionProps:t,shadow:n,disabled:C,onPositionChange:P=>d&&(u==null?void 0:u(P==="top"?"column-reverse":"column")),variant:S},s)}Qa.Target=wc.Target;Qa.Dropdown=vG;var yG=Object.defineProperty,bG=Object.defineProperties,xG=Object.getOwnPropertyDescriptors,Lp=Object.getOwnPropertySymbols,oj=Object.prototype.hasOwnProperty,sj=Object.prototype.propertyIsEnumerable,sC=(e,t,n)=>t in e?yG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,xf=(e,t)=>{for(var n in t||(t={}))oj.call(t,n)&&sC(e,n,t[n]);if(Lp)for(var n of Lp(t))sj.call(t,n)&&sC(e,n,t[n]);return e},SG=(e,t)=>bG(e,xG(t)),wG=(e,t)=>{var n={};for(var r in e)oj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Lp)for(var r of Lp(e))t.indexOf(r)<0&&sj.call(e,r)&&(n[r]=e[r]);return n};function CG(e,t,n){const r=jr(e,t,n),{label:o,description:s,error:a,required:u,classNames:d,styles:f,className:h,unstyled:m,__staticSelector:v,sx:b,errorProps:w,labelProps:C,descriptionProps:S,wrapperProps:P,id:k,size:j,style:E,inputContainer:I,inputWrapperOrder:O,withAsterisk:R,variant:M}=r,A=wG(r,["label","description","error","required","classNames","styles","className","unstyled","__staticSelector","sx","errorProps","labelProps","descriptionProps","wrapperProps","id","size","style","inputContainer","inputWrapperOrder","withAsterisk","variant"]),L=ty(k),{systemStyles:D,rest:V}=Lh(A),$=xf({label:o,description:s,error:a,required:u,classNames:d,className:h,__staticSelector:v,sx:b,errorProps:w,labelProps:C,descriptionProps:S,unstyled:m,styles:f,id:L,size:j,style:E,inputContainer:I,inputWrapperOrder:O,withAsterisk:R,variant:M},P);return SG(xf({},V),{classNames:d,styles:f,unstyled:m,wrapperProps:xf(xf({},$),D),inputProps:{required:u,classNames:d,styles:f,unstyled:m,id:L,size:j,__staticSelector:v,error:a,variant:M}})}var PG=Qr((e,t,{size:n})=>({label:{display:"inline-block",fontSize:At({size:n,sizes:e.fontSizes}),fontWeight:500,color:e.colorScheme==="dark"?e.colors.dark[0]:e.colors.gray[9],wordBreak:"break-word",cursor:"default",WebkitTapHighlightColor:"transparent"},required:{color:e.fn.variant({variant:"filled",color:"red"}).background}}));const kG=PG;var _G=Object.defineProperty,Fp=Object.getOwnPropertySymbols,aj=Object.prototype.hasOwnProperty,ij=Object.prototype.propertyIsEnumerable,aC=(e,t,n)=>t in e?_G(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,jG=(e,t)=>{for(var n in t||(t={}))aj.call(t,n)&&aC(e,n,t[n]);if(Fp)for(var n of Fp(t))ij.call(t,n)&&aC(e,n,t[n]);return e},EG=(e,t)=>{var n={};for(var r in e)aj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Fp)for(var r of Fp(e))t.indexOf(r)<0&&ij.call(e,r)&&(n[r]=e[r]);return n};const IG={labelElement:"label",size:"sm"},uy=p.forwardRef((e,t)=>{const n=jr("InputLabel",IG,e),{labelElement:r,children:o,required:s,size:a,classNames:u,styles:d,unstyled:f,className:h,htmlFor:m,__staticSelector:v,variant:b,onMouseDown:w}=n,C=EG(n,["labelElement","children","required","size","classNames","styles","unstyled","className","htmlFor","__staticSelector","variant","onMouseDown"]),{classes:S,cx:P}=kG(null,{name:["InputWrapper",v],classNames:u,styles:d,unstyled:f,variant:b,size:a});return z.createElement(yo,jG({component:r,ref:t,className:P(S.label,h),htmlFor:r==="label"?m:void 0,onMouseDown:k=>{w==null||w(k),!k.defaultPrevented&&k.detail>1&&k.preventDefault()}},C),o,s&&z.createElement("span",{className:S.required,"aria-hidden":!0}," *"))});uy.displayName="@mantine/core/InputLabel";var OG=Qr((e,t,{size:n})=>({error:{wordBreak:"break-word",color:e.fn.variant({variant:"filled",color:"red"}).background,fontSize:`calc(${At({size:n,sizes:e.fontSizes})} - ${Le(2)})`,lineHeight:1.2,display:"block"}}));const RG=OG;var MG=Object.defineProperty,Bp=Object.getOwnPropertySymbols,lj=Object.prototype.hasOwnProperty,cj=Object.prototype.propertyIsEnumerable,iC=(e,t,n)=>t in e?MG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,TG=(e,t)=>{for(var n in t||(t={}))lj.call(t,n)&&iC(e,n,t[n]);if(Bp)for(var n of Bp(t))cj.call(t,n)&&iC(e,n,t[n]);return e},DG=(e,t)=>{var n={};for(var r in e)lj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Bp)for(var r of Bp(e))t.indexOf(r)<0&&cj.call(e,r)&&(n[r]=e[r]);return n};const AG={size:"sm"},dy=p.forwardRef((e,t)=>{const n=jr("InputError",AG,e),{children:r,className:o,classNames:s,styles:a,unstyled:u,size:d,__staticSelector:f,variant:h}=n,m=DG(n,["children","className","classNames","styles","unstyled","size","__staticSelector","variant"]),{classes:v,cx:b}=RG(null,{name:["InputWrapper",f],classNames:s,styles:a,unstyled:u,variant:h,size:d});return z.createElement(Zl,TG({className:b(v.error,o),ref:t},m),r)});dy.displayName="@mantine/core/InputError";var NG=Qr((e,t,{size:n})=>({description:{wordBreak:"break-word",color:e.colorScheme==="dark"?e.colors.dark[2]:e.colors.gray[6],fontSize:`calc(${At({size:n,sizes:e.fontSizes})} - ${Le(2)})`,lineHeight:1.2,display:"block"}}));const zG=NG;var $G=Object.defineProperty,Hp=Object.getOwnPropertySymbols,uj=Object.prototype.hasOwnProperty,dj=Object.prototype.propertyIsEnumerable,lC=(e,t,n)=>t in e?$G(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,LG=(e,t)=>{for(var n in t||(t={}))uj.call(t,n)&&lC(e,n,t[n]);if(Hp)for(var n of Hp(t))dj.call(t,n)&&lC(e,n,t[n]);return e},FG=(e,t)=>{var n={};for(var r in e)uj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Hp)for(var r of Hp(e))t.indexOf(r)<0&&dj.call(e,r)&&(n[r]=e[r]);return n};const BG={size:"sm"},fy=p.forwardRef((e,t)=>{const n=jr("InputDescription",BG,e),{children:r,className:o,classNames:s,styles:a,unstyled:u,size:d,__staticSelector:f,variant:h}=n,m=FG(n,["children","className","classNames","styles","unstyled","size","__staticSelector","variant"]),{classes:v,cx:b}=zG(null,{name:["InputWrapper",f],classNames:s,styles:a,unstyled:u,variant:h,size:d});return z.createElement(Zl,LG({color:"dimmed",className:b(v.description,o),ref:t,unstyled:u},m),r)});fy.displayName="@mantine/core/InputDescription";const fj=p.createContext({offsetBottom:!1,offsetTop:!1,describedBy:void 0}),HG=fj.Provider,WG=()=>p.useContext(fj);function VG(e,{hasDescription:t,hasError:n}){const r=e.findIndex(d=>d==="input"),o=e[r-1],s=e[r+1];return{offsetBottom:t&&s==="description"||n&&s==="error",offsetTop:t&&o==="description"||n&&o==="error"}}var UG=Object.defineProperty,GG=Object.defineProperties,qG=Object.getOwnPropertyDescriptors,cC=Object.getOwnPropertySymbols,KG=Object.prototype.hasOwnProperty,YG=Object.prototype.propertyIsEnumerable,uC=(e,t,n)=>t in e?UG(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,XG=(e,t)=>{for(var n in t||(t={}))KG.call(t,n)&&uC(e,n,t[n]);if(cC)for(var n of cC(t))YG.call(t,n)&&uC(e,n,t[n]);return e},QG=(e,t)=>GG(e,qG(t)),ZG=Qr(e=>({root:QG(XG({},e.fn.fontStyles()),{lineHeight:e.lineHeight})}));const JG=ZG;var eq=Object.defineProperty,tq=Object.defineProperties,nq=Object.getOwnPropertyDescriptors,Wp=Object.getOwnPropertySymbols,pj=Object.prototype.hasOwnProperty,hj=Object.prototype.propertyIsEnumerable,dC=(e,t,n)=>t in e?eq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,za=(e,t)=>{for(var n in t||(t={}))pj.call(t,n)&&dC(e,n,t[n]);if(Wp)for(var n of Wp(t))hj.call(t,n)&&dC(e,n,t[n]);return e},fC=(e,t)=>tq(e,nq(t)),rq=(e,t)=>{var n={};for(var r in e)pj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Wp)for(var r of Wp(e))t.indexOf(r)<0&&hj.call(e,r)&&(n[r]=e[r]);return n};const oq={labelElement:"label",size:"sm",inputContainer:e=>e,inputWrapperOrder:["label","description","input","error"]},mj=p.forwardRef((e,t)=>{const n=jr("InputWrapper",oq,e),{className:r,label:o,children:s,required:a,id:u,error:d,description:f,labelElement:h,labelProps:m,descriptionProps:v,errorProps:b,classNames:w,styles:C,size:S,inputContainer:P,__staticSelector:k,unstyled:j,inputWrapperOrder:E,withAsterisk:I,variant:O}=n,R=rq(n,["className","label","children","required","id","error","description","labelElement","labelProps","descriptionProps","errorProps","classNames","styles","size","inputContainer","__staticSelector","unstyled","inputWrapperOrder","withAsterisk","variant"]),{classes:M,cx:A}=JG(null,{classNames:w,styles:C,name:["InputWrapper",k],unstyled:j,variant:O,size:S}),L={classNames:w,styles:C,unstyled:j,size:S,variant:O,__staticSelector:k},D=typeof I=="boolean"?I:a,V=u?`${u}-error`:b==null?void 0:b.id,$=u?`${u}-description`:v==null?void 0:v.id,U=`${!!d&&typeof d!="boolean"?V:""} ${f?$:""}`,X=U.trim().length>0?U.trim():void 0,N=o&&z.createElement(uy,za(za({key:"label",labelElement:h,id:u?`${u}-label`:void 0,htmlFor:u,required:D},L),m),o),G=f&&z.createElement(fy,fC(za(za({key:"description"},v),L),{size:(v==null?void 0:v.size)||L.size,id:(v==null?void 0:v.id)||$}),f),W=z.createElement(p.Fragment,{key:"input"},P(s)),q=typeof d!="boolean"&&d&&z.createElement(dy,fC(za(za({},b),L),{size:(b==null?void 0:b.size)||L.size,key:"error",id:(b==null?void 0:b.id)||V}),d),ne=E.map(ve=>{switch(ve){case"label":return N;case"input":return W;case"description":return G;case"error":return q;default:return null}});return z.createElement(HG,{value:za({describedBy:X},VG(E,{hasDescription:!!G,hasError:!!q}))},z.createElement(yo,za({className:A(M.root,r),ref:t},R),ne))});mj.displayName="@mantine/core/InputWrapper";var sq=Object.defineProperty,Vp=Object.getOwnPropertySymbols,gj=Object.prototype.hasOwnProperty,vj=Object.prototype.propertyIsEnumerable,pC=(e,t,n)=>t in e?sq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,aq=(e,t)=>{for(var n in t||(t={}))gj.call(t,n)&&pC(e,n,t[n]);if(Vp)for(var n of Vp(t))vj.call(t,n)&&pC(e,n,t[n]);return e},iq=(e,t)=>{var n={};for(var r in e)gj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Vp)for(var r of Vp(e))t.indexOf(r)<0&&vj.call(e,r)&&(n[r]=e[r]);return n};const lq={},yj=p.forwardRef((e,t)=>{const n=jr("InputPlaceholder",lq,e),{sx:r}=n,o=iq(n,["sx"]);return z.createElement(yo,aq({component:"span",sx:[s=>s.fn.placeholderStyles(),...Ck(r)],ref:t},o))});yj.displayName="@mantine/core/InputPlaceholder";var cq=Object.defineProperty,uq=Object.defineProperties,dq=Object.getOwnPropertyDescriptors,hC=Object.getOwnPropertySymbols,fq=Object.prototype.hasOwnProperty,pq=Object.prototype.propertyIsEnumerable,mC=(e,t,n)=>t in e?cq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Sf=(e,t)=>{for(var n in t||(t={}))fq.call(t,n)&&mC(e,n,t[n]);if(hC)for(var n of hC(t))pq.call(t,n)&&mC(e,n,t[n]);return e},Yg=(e,t)=>uq(e,dq(t));const Yo={xs:Le(30),sm:Le(36),md:Le(42),lg:Le(50),xl:Le(60)},hq=["default","filled","unstyled"];function mq({theme:e,variant:t}){return hq.includes(t)?t==="default"?{border:`${Le(1)} solid ${e.colorScheme==="dark"?e.colors.dark[4]:e.colors.gray[4]}`,backgroundColor:e.colorScheme==="dark"?e.colors.dark[6]:e.white,transition:"border-color 100ms ease","&:focus, &:focus-within":e.focusRingStyles.inputStyles(e)}:t==="filled"?{border:`${Le(1)} solid transparent`,backgroundColor:e.colorScheme==="dark"?e.colors.dark[5]:e.colors.gray[1],"&:focus, &:focus-within":e.focusRingStyles.inputStyles(e)}:{borderWidth:0,color:e.colorScheme==="dark"?e.colors.dark[0]:e.black,backgroundColor:"transparent",minHeight:Le(28),outline:0,"&:focus, &:focus-within":{outline:"none",borderColor:"transparent"},"&:disabled":{backgroundColor:"transparent","&:focus, &:focus-within":{outline:"none",borderColor:"transparent"}}}:null}var gq=Qr((e,{multiline:t,radius:n,invalid:r,rightSectionWidth:o,withRightSection:s,iconWidth:a,offsetBottom:u,offsetTop:d,pointer:f},{variant:h,size:m})=>{const v=e.fn.variant({variant:"filled",color:"red"}).background,b=h==="default"||h==="filled"?{minHeight:At({size:m,sizes:Yo}),paddingLeft:`calc(${At({size:m,sizes:Yo})} / 3)`,paddingRight:s?o||At({size:m,sizes:Yo}):`calc(${At({size:m,sizes:Yo})} / 3)`,borderRadius:e.fn.radius(n)}:h==="unstyled"&&s?{paddingRight:o||At({size:m,sizes:Yo})}:null;return{wrapper:{position:"relative",marginTop:d?`calc(${e.spacing.xs} / 2)`:void 0,marginBottom:u?`calc(${e.spacing.xs} / 2)`:void 0,"&:has(input:disabled)":{"& .mantine-Input-rightSection":{display:"none"}}},input:Yg(Sf(Sf(Yg(Sf({},e.fn.fontStyles()),{height:t?h==="unstyled"?void 0:"auto":At({size:m,sizes:Yo}),WebkitTapHighlightColor:"transparent",lineHeight:t?e.lineHeight:`calc(${At({size:m,sizes:Yo})} - ${Le(2)})`,appearance:"none",resize:"none",boxSizing:"border-box",fontSize:At({size:m,sizes:e.fontSizes}),width:"100%",color:e.colorScheme==="dark"?e.colors.dark[0]:e.black,display:"block",textAlign:"left",cursor:f?"pointer":void 0}),mq({theme:e,variant:h})),b),{"&:disabled, &[data-disabled]":{backgroundColor:e.colorScheme==="dark"?e.colors.dark[6]:e.colors.gray[1],color:e.colors.dark[2],opacity:.6,cursor:"not-allowed",pointerEvents:"none","&::placeholder":{color:e.colors.dark[2]}},"&[data-invalid]":{color:v,borderColor:v,"&::placeholder":{opacity:1,color:v}},"&[data-with-icon]":{paddingLeft:typeof a=="number"?Le(a):At({size:m,sizes:Yo})},"&::placeholder":Yg(Sf({},e.fn.placeholderStyles()),{opacity:1}),"&::-webkit-inner-spin-button, &::-webkit-outer-spin-button, &::-webkit-search-decoration, &::-webkit-search-cancel-button, &::-webkit-search-results-button, &::-webkit-search-results-decoration":{appearance:"none"},"&[type=number]":{MozAppearance:"textfield"}}),icon:{pointerEvents:"none",position:"absolute",zIndex:1,left:0,top:0,bottom:0,display:"flex",alignItems:"center",justifyContent:"center",width:a?Le(a):At({size:m,sizes:Yo}),color:r?e.colors.red[e.colorScheme==="dark"?6:7]:e.colorScheme==="dark"?e.colors.dark[2]:e.colors.gray[5]},rightSection:{position:"absolute",top:0,bottom:0,right:0,display:"flex",alignItems:"center",justifyContent:"center",width:o||At({size:m,sizes:Yo})}}});const vq=gq;var yq=Object.defineProperty,bq=Object.defineProperties,xq=Object.getOwnPropertyDescriptors,Up=Object.getOwnPropertySymbols,bj=Object.prototype.hasOwnProperty,xj=Object.prototype.propertyIsEnumerable,gC=(e,t,n)=>t in e?yq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,wf=(e,t)=>{for(var n in t||(t={}))bj.call(t,n)&&gC(e,n,t[n]);if(Up)for(var n of Up(t))xj.call(t,n)&&gC(e,n,t[n]);return e},vC=(e,t)=>bq(e,xq(t)),Sq=(e,t)=>{var n={};for(var r in e)bj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Up)for(var r of Up(e))t.indexOf(r)<0&&xj.call(e,r)&&(n[r]=e[r]);return n};const wq={size:"sm",variant:"default"},rl=p.forwardRef((e,t)=>{const n=jr("Input",wq,e),{className:r,error:o,required:s,disabled:a,variant:u,icon:d,style:f,rightSectionWidth:h,iconWidth:m,rightSection:v,rightSectionProps:b,radius:w,size:C,wrapperProps:S,classNames:P,styles:k,__staticSelector:j,multiline:E,sx:I,unstyled:O,pointer:R}=n,M=Sq(n,["className","error","required","disabled","variant","icon","style","rightSectionWidth","iconWidth","rightSection","rightSectionProps","radius","size","wrapperProps","classNames","styles","__staticSelector","multiline","sx","unstyled","pointer"]),{offsetBottom:A,offsetTop:L,describedBy:D}=WG(),{classes:V,cx:$}=vq({radius:w,multiline:E,invalid:!!o,rightSectionWidth:h?Le(h):void 0,iconWidth:m,withRightSection:!!v,offsetBottom:A,offsetTop:L,pointer:R},{classNames:P,styles:k,name:["Input",j],unstyled:O,variant:u,size:C}),{systemStyles:F,rest:U}=Lh(M);return z.createElement(yo,wf(wf({className:$(V.wrapper,r),sx:I,style:f},F),S),d&&z.createElement("div",{className:V.icon},d),z.createElement(yo,vC(wf({component:"input"},U),{ref:t,required:s,"aria-invalid":!!o,"aria-describedby":D,disabled:a,"data-disabled":a||void 0,"data-with-icon":!!d||void 0,"data-invalid":!!o||void 0,className:V.input})),v&&z.createElement("div",vC(wf({},b),{className:V.rightSection}),v))});rl.displayName="@mantine/core/Input";rl.Wrapper=mj;rl.Label=uy;rl.Description=fy;rl.Error=dy;rl.Placeholder=yj;const Gp=rl,Sj={xs:Le(16),sm:Le(22),md:Le(26),lg:Le(30),xl:Le(36)},Cq={xs:Le(10),sm:Le(12),md:Le(14),lg:Le(16),xl:Le(18)};var Pq=Qr((e,{disabled:t,radius:n,readOnly:r},{size:o,variant:s})=>({defaultValue:{display:"flex",alignItems:"center",backgroundColor:t?e.colorScheme==="dark"?e.colors.dark[5]:e.colors.gray[3]:e.colorScheme==="dark"?e.colors.dark[7]:s==="filled"?e.white:e.colors.gray[1],color:t?e.colorScheme==="dark"?e.colors.dark[1]:e.colors.gray[7]:e.colorScheme==="dark"?e.colors.dark[0]:e.colors.gray[7],height:At({size:o,sizes:Sj}),paddingLeft:`calc(${At({size:o,sizes:e.spacing})} / 1.5)`,paddingRight:t||r?At({size:o,sizes:e.spacing}):0,fontWeight:500,fontSize:At({size:o,sizes:Cq}),borderRadius:At({size:n,sizes:e.radius}),cursor:t?"not-allowed":"default",userSelect:"none",maxWidth:`calc(100% - ${Le(10)})`},defaultValueRemove:{color:e.colorScheme==="dark"?e.colors.dark[0]:e.colors.gray[7],marginLeft:`calc(${At({size:o,sizes:e.spacing})} / 6)`},defaultValueLabel:{display:"block",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}}));const kq=Pq;var _q=Object.defineProperty,qp=Object.getOwnPropertySymbols,wj=Object.prototype.hasOwnProperty,Cj=Object.prototype.propertyIsEnumerable,yC=(e,t,n)=>t in e?_q(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,jq=(e,t)=>{for(var n in t||(t={}))wj.call(t,n)&&yC(e,n,t[n]);if(qp)for(var n of qp(t))Cj.call(t,n)&&yC(e,n,t[n]);return e},Eq=(e,t)=>{var n={};for(var r in e)wj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&qp)for(var r of qp(e))t.indexOf(r)<0&&Cj.call(e,r)&&(n[r]=e[r]);return n};const Iq={xs:16,sm:22,md:24,lg:26,xl:30};function Pj(e){var t=e,{label:n,classNames:r,styles:o,className:s,onRemove:a,disabled:u,readOnly:d,size:f,radius:h="sm",variant:m,unstyled:v}=t,b=Eq(t,["label","classNames","styles","className","onRemove","disabled","readOnly","size","radius","variant","unstyled"]);const{classes:w,cx:C}=kq({disabled:u,readOnly:d,radius:h},{name:"MultiSelect",classNames:r,styles:o,unstyled:v,size:f,variant:m});return z.createElement("div",jq({className:C(w.defaultValue,s)},b),z.createElement("span",{className:w.defaultValueLabel},n),!u&&!d&&z.createElement(c_,{"aria-hidden":!0,onMouseDown:a,size:Iq[f],radius:2,color:"blue",variant:"transparent",iconSize:"70%",className:w.defaultValueRemove,tabIndex:-1,unstyled:v}))}Pj.displayName="@mantine/core/MultiSelect/DefaultValue";function Oq({data:e,searchable:t,limit:n,searchValue:r,filter:o,value:s,disableSelectedItemFiltering:a}){if(!t&&s.length===0)return e;if(!t){const d=[];for(let f=0;fh===e[f].value&&!e[f].disabled))&&d.push(e[f]);return d}const u=[];for(let d=0;df===e[d].value&&!e[d].disabled),e[d])&&u.push(e[d]),!(u.length>=n));d+=1);return u}var Rq=Object.defineProperty,Kp=Object.getOwnPropertySymbols,kj=Object.prototype.hasOwnProperty,_j=Object.prototype.propertyIsEnumerable,bC=(e,t,n)=>t in e?Rq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,xC=(e,t)=>{for(var n in t||(t={}))kj.call(t,n)&&bC(e,n,t[n]);if(Kp)for(var n of Kp(t))_j.call(t,n)&&bC(e,n,t[n]);return e},Mq=(e,t)=>{var n={};for(var r in e)kj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Kp)for(var r of Kp(e))t.indexOf(r)<0&&_j.call(e,r)&&(n[r]=e[r]);return n};const Tq={xs:Le(14),sm:Le(18),md:Le(20),lg:Le(24),xl:Le(28)};function Dq(e){var t=e,{size:n,error:r,style:o}=t,s=Mq(t,["size","error","style"]);const a=Sa(),u=At({size:n,sizes:Tq});return z.createElement("svg",xC({width:u,height:u,viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg",style:xC({color:r?a.colors.red[6]:a.colors.gray[6]},o),"data-chevron":!0},s),z.createElement("path",{d:"M4.93179 5.43179C4.75605 5.60753 4.75605 5.89245 4.93179 6.06819C5.10753 6.24392 5.39245 6.24392 5.56819 6.06819L7.49999 4.13638L9.43179 6.06819C9.60753 6.24392 9.89245 6.24392 10.0682 6.06819C10.2439 5.89245 10.2439 5.60753 10.0682 5.43179L7.81819 3.18179C7.73379 3.0974 7.61933 3.04999 7.49999 3.04999C7.38064 3.04999 7.26618 3.0974 7.18179 3.18179L4.93179 5.43179ZM10.0682 9.56819C10.2439 9.39245 10.2439 9.10753 10.0682 8.93179C9.89245 8.75606 9.60753 8.75606 9.43179 8.93179L7.49999 10.8636L5.56819 8.93179C5.39245 8.75606 5.10753 8.75606 4.93179 8.93179C4.75605 9.10753 4.75605 9.39245 4.93179 9.56819L7.18179 11.8182C7.35753 11.9939 7.64245 11.9939 7.81819 11.8182L10.0682 9.56819Z",fill:"currentColor",fillRule:"evenodd",clipRule:"evenodd"}))}var Aq=Object.defineProperty,Nq=Object.defineProperties,zq=Object.getOwnPropertyDescriptors,SC=Object.getOwnPropertySymbols,$q=Object.prototype.hasOwnProperty,Lq=Object.prototype.propertyIsEnumerable,wC=(e,t,n)=>t in e?Aq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Fq=(e,t)=>{for(var n in t||(t={}))$q.call(t,n)&&wC(e,n,t[n]);if(SC)for(var n of SC(t))Lq.call(t,n)&&wC(e,n,t[n]);return e},Bq=(e,t)=>Nq(e,zq(t));function jj({shouldClear:e,clearButtonProps:t,onClear:n,size:r,error:o}){return e?z.createElement(c_,Bq(Fq({},t),{variant:"transparent",onClick:n,size:r,onMouseDown:s=>s.preventDefault()})):z.createElement(Dq,{error:o,size:r})}jj.displayName="@mantine/core/SelectRightSection";var Hq=Object.defineProperty,Wq=Object.defineProperties,Vq=Object.getOwnPropertyDescriptors,Yp=Object.getOwnPropertySymbols,Ej=Object.prototype.hasOwnProperty,Ij=Object.prototype.propertyIsEnumerable,CC=(e,t,n)=>t in e?Hq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Xg=(e,t)=>{for(var n in t||(t={}))Ej.call(t,n)&&CC(e,n,t[n]);if(Yp)for(var n of Yp(t))Ij.call(t,n)&&CC(e,n,t[n]);return e},PC=(e,t)=>Wq(e,Vq(t)),Uq=(e,t)=>{var n={};for(var r in e)Ej.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Yp)for(var r of Yp(e))t.indexOf(r)<0&&Ij.call(e,r)&&(n[r]=e[r]);return n};function Oj(e){var t=e,{styles:n,rightSection:r,rightSectionWidth:o,theme:s}=t,a=Uq(t,["styles","rightSection","rightSectionWidth","theme"]);if(r)return{rightSection:r,rightSectionWidth:o,styles:n};const u=typeof n=="function"?n(s):n;return{rightSection:!a.readOnly&&!(a.disabled&&a.shouldClear)&&z.createElement(jj,Xg({},a)),styles:PC(Xg({},u),{rightSection:PC(Xg({},u==null?void 0:u.rightSection),{pointerEvents:a.shouldClear?void 0:"none"})})}}var Gq=Object.defineProperty,qq=Object.defineProperties,Kq=Object.getOwnPropertyDescriptors,kC=Object.getOwnPropertySymbols,Yq=Object.prototype.hasOwnProperty,Xq=Object.prototype.propertyIsEnumerable,_C=(e,t,n)=>t in e?Gq(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Qq=(e,t)=>{for(var n in t||(t={}))Yq.call(t,n)&&_C(e,n,t[n]);if(kC)for(var n of kC(t))Xq.call(t,n)&&_C(e,n,t[n]);return e},Zq=(e,t)=>qq(e,Kq(t)),Jq=Qr((e,{invalid:t},{size:n})=>({wrapper:{position:"relative","&:has(input:disabled)":{cursor:"not-allowed",pointerEvents:"none","& .mantine-MultiSelect-input":{backgroundColor:e.colorScheme==="dark"?e.colors.dark[6]:e.colors.gray[1],color:e.colors.dark[2],opacity:.6,"&::placeholder":{color:e.colors.dark[2]}},"& .mantine-MultiSelect-defaultValue":{backgroundColor:e.colorScheme==="dark"?e.colors.dark[5]:e.colors.gray[3],color:e.colorScheme==="dark"?e.colors.dark[1]:e.colors.gray[7]}}},values:{minHeight:`calc(${At({size:n,sizes:Yo})} - ${Le(2)})`,display:"flex",alignItems:"center",flexWrap:"wrap",marginLeft:`calc(-${e.spacing.xs} / 2)`,boxSizing:"border-box","&[data-clearable]":{marginRight:At({size:n,sizes:Yo})}},value:{margin:`calc(${e.spacing.xs} / 2 - ${Le(2)}) calc(${e.spacing.xs} / 2)`},searchInput:Zq(Qq({},e.fn.fontStyles()),{flex:1,minWidth:Le(60),backgroundColor:"transparent",border:0,outline:0,fontSize:At({size:n,sizes:e.fontSizes}),padding:0,marginLeft:`calc(${e.spacing.xs} / 2)`,appearance:"none",color:"inherit",maxHeight:At({size:n,sizes:Sj}),"&::placeholder":{opacity:1,color:t?e.colors.red[e.fn.primaryShade()]:e.colorScheme==="dark"?e.colors.dark[3]:e.colors.gray[5]},"&:disabled":{cursor:"not-allowed",pointerEvents:"none"}}),searchInputEmpty:{width:"100%"},searchInputInputHidden:{flex:0,width:0,minWidth:0,margin:0,overflow:"hidden"},searchInputPointer:{cursor:"pointer","&:disabled":{cursor:"not-allowed",pointerEvents:"none"}},input:{cursor:"pointer","&:disabled":{cursor:"not-allowed",pointerEvents:"none"}}}));const eK=Jq;var tK=Object.defineProperty,nK=Object.defineProperties,rK=Object.getOwnPropertyDescriptors,Xp=Object.getOwnPropertySymbols,Rj=Object.prototype.hasOwnProperty,Mj=Object.prototype.propertyIsEnumerable,jC=(e,t,n)=>t in e?tK(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,_l=(e,t)=>{for(var n in t||(t={}))Rj.call(t,n)&&jC(e,n,t[n]);if(Xp)for(var n of Xp(t))Mj.call(t,n)&&jC(e,n,t[n]);return e},EC=(e,t)=>nK(e,rK(t)),oK=(e,t)=>{var n={};for(var r in e)Rj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Xp)for(var r of Xp(e))t.indexOf(r)<0&&Mj.call(e,r)&&(n[r]=e[r]);return n};function sK(e,t,n){return t?!1:n.label.toLowerCase().trim().includes(e.toLowerCase().trim())}function aK(e,t){return!!e&&!t.some(n=>n.value.toLowerCase()===e.toLowerCase())}function IC(e,t){if(!Array.isArray(e))return;if(t.length===0)return[];const n=t.map(r=>typeof r=="object"?r.value:r);return e.filter(r=>n.includes(r))}const iK={size:"sm",valueComponent:Pj,itemComponent:ry,transitionProps:{transition:"fade",duration:0},maxDropdownHeight:220,shadow:"sm",searchable:!1,filter:sK,limit:1/0,clearSearchOnChange:!0,clearable:!1,clearSearchOnBlur:!1,disabled:!1,initiallyOpened:!1,creatable:!1,shouldCreate:aK,switchDirectionOnFlip:!1,zIndex:J1("popover"),selectOnBlur:!1,positionDependencies:[],dropdownPosition:"flip"},Tj=p.forwardRef((e,t)=>{const n=jr("MultiSelect",iK,e),{className:r,style:o,required:s,label:a,description:u,size:d,error:f,classNames:h,styles:m,wrapperProps:v,value:b,defaultValue:w,data:C,onChange:S,valueComponent:P,itemComponent:k,id:j,transitionProps:E,maxDropdownHeight:I,shadow:O,nothingFound:R,onFocus:M,onBlur:A,searchable:L,placeholder:D,filter:V,limit:$,clearSearchOnChange:F,clearable:U,clearSearchOnBlur:X,variant:N,onSearchChange:G,searchValue:W,disabled:q,initiallyOpened:ne,radius:ve,icon:le,rightSection:oe,rightSectionWidth:Y,creatable:ae,getCreateLabel:de,shouldCreate:xe,onCreate:se,sx:ge,dropdownComponent:fe,onDropdownClose:ke,onDropdownOpen:Ae,maxSelectedValues:ye,withinPortal:Oe,switchDirectionOnFlip:at,zIndex:Fe,selectOnBlur:Ye,name:_t,dropdownPosition:xt,errorProps:Fn,labelProps:Q,descriptionProps:we,form:te,positionDependencies:pe,onKeyDown:Ne,unstyled:Xe,inputContainer:yt,inputWrapperOrder:Xt,readOnly:an,withAsterisk:Pn,clearButtonProps:vr,hoverOnSearchChange:ln,disableSelectedItemFiltering:Kn}=n,Re=oK(n,["className","style","required","label","description","size","error","classNames","styles","wrapperProps","value","defaultValue","data","onChange","valueComponent","itemComponent","id","transitionProps","maxDropdownHeight","shadow","nothingFound","onFocus","onBlur","searchable","placeholder","filter","limit","clearSearchOnChange","clearable","clearSearchOnBlur","variant","onSearchChange","searchValue","disabled","initiallyOpened","radius","icon","rightSection","rightSectionWidth","creatable","getCreateLabel","shouldCreate","onCreate","sx","dropdownComponent","onDropdownClose","onDropdownOpen","maxSelectedValues","withinPortal","switchDirectionOnFlip","zIndex","selectOnBlur","name","dropdownPosition","errorProps","labelProps","descriptionProps","form","positionDependencies","onKeyDown","unstyled","inputContainer","inputWrapperOrder","readOnly","withAsterisk","clearButtonProps","hoverOnSearchChange","disableSelectedItemFiltering"]),{classes:et,cx:it,theme:ut}=eK({invalid:!!f},{name:"MultiSelect",classNames:h,styles:m,unstyled:Xe,size:d,variant:N}),{systemStyles:Nt,rest:yr}=Lh(Re),cn=p.useRef(),xn=p.useRef({}),wr=ty(j),[kn,En]=p.useState(ne),[is,un]=p.useState(-1),[zo,$o]=p.useState("column"),[$n,ls]=_u({value:W,defaultValue:"",finalValue:void 0,onChange:G}),[ka,Er]=p.useState(!1),{scrollIntoView:Lo,targetRef:Zs,scrollableRef:_a}=Dk({duration:0,offset:5,cancelable:!1,isList:!0}),cs=ae&&typeof de=="function";let K=null;const J=C.map(je=>typeof je=="string"?{label:je,value:je}:je),ue=Pk({data:J}),[be,Se]=_u({value:IC(b,C),defaultValue:IC(w,C),finalValue:[],onChange:S}),Qe=p.useRef(!!ye&&ye{if(!an){const ht=be.filter(Mt=>Mt!==je);Se(ht),ye&&ht.length{ls(je.currentTarget.value),!q&&!Qe.current&&L&&En(!0)},lt=je=>{typeof M=="function"&&M(je),!q&&!Qe.current&&L&&En(!0)},He=Oq({data:ue,searchable:L,searchValue:$n,limit:$,filter:V,value:be,disableSelectedItemFiltering:Kn});cs&&xe($n,ue)&&(K=de($n),He.push({label:$n,value:$n,creatable:!0}));const Ke=Math.min(is,He.length-1),Ce=(je,ht,Mt)=>{let Tt=je;for(;Mt(Tt);)if(Tt=ht(Tt),!He[Tt].disabled)return Tt;return je};Ss(()=>{un(ln&&$n?0:-1)},[$n,ln]),Ss(()=>{!q&&be.length>C.length&&En(!1),ye&&be.length=ye&&(Qe.current=!0,En(!1))},[be]);const We=je=>{if(!an)if(F&&ls(""),be.includes(je.value))pt(je.value);else{if(je.creatable&&typeof se=="function"){const ht=se(je.value);typeof ht<"u"&&ht!==null&&Se(typeof ht=="string"?[...be,ht]:[...be,ht.value])}else Se([...be,je.value]);be.length===ye-1&&(Qe.current=!0,En(!1)),He.length===1&&En(!1)}},St=je=>{typeof A=="function"&&A(je),Ye&&He[Ke]&&kn&&We(He[Ke]),X&&ls(""),En(!1)},Ct=je=>{if(ka||(Ne==null||Ne(je),an)||je.key!=="Backspace"&&ye&&Qe.current)return;const ht=zo==="column",Mt=()=>{un($t=>{var dn;const Vt=Ce($t,Qt=>Qt+1,Qt=>Qt{un($t=>{var dn;const Vt=Ce($t,Qt=>Qt-1,Qt=>Qt>0);return kn&&(Zs.current=xn.current[(dn=He[Vt])==null?void 0:dn.value],Lo({alignment:ht?"start":"end"})),Vt})};switch(je.key){case"ArrowUp":{je.preventDefault(),En(!0),ht?Tt():Mt();break}case"ArrowDown":{je.preventDefault(),En(!0),ht?Mt():Tt();break}case"Enter":{je.preventDefault(),He[Ke]&&kn?We(He[Ke]):En(!0);break}case" ":{L||(je.preventDefault(),He[Ke]&&kn?We(He[Ke]):En(!0));break}case"Backspace":{be.length>0&&$n.length===0&&(Se(be.slice(0,-1)),En(!0),ye&&(Qe.current=!1));break}case"Home":{if(!L){je.preventDefault(),kn||En(!0);const $t=He.findIndex(dn=>!dn.disabled);un($t),Lo({alignment:ht?"end":"start"})}break}case"End":{if(!L){je.preventDefault(),kn||En(!0);const $t=He.map(dn=>!!dn.disabled).lastIndexOf(!1);un($t),Lo({alignment:ht?"end":"start"})}break}case"Escape":En(!1)}},Rt=be.map(je=>{let ht=ue.find(Mt=>Mt.value===je&&!Mt.disabled);return!ht&&cs&&(ht={value:je,label:je}),ht}).filter(je=>!!je).map((je,ht)=>z.createElement(P,EC(_l({},je),{variant:N,disabled:q,className:et.value,readOnly:an,onRemove:Mt=>{Mt.preventDefault(),Mt.stopPropagation(),pt(je.value)},key:je.value,size:d,styles:m,classNames:h,radius:ve,index:ht}))),Lt=je=>be.includes(je),Ut=()=>{var je;ls(""),Se([]),(je=cn.current)==null||je.focus(),ye&&(Qe.current=!1)},Ft=!an&&(He.length>0?kn:kn&&!!R);return Ss(()=>{const je=Ft?Ae:ke;typeof je=="function"&&je()},[Ft]),z.createElement(Gp.Wrapper,_l(_l({required:s,id:wr,label:a,error:f,description:u,size:d,className:r,style:o,classNames:h,styles:m,__staticSelector:"MultiSelect",sx:ge,errorProps:Fn,descriptionProps:we,labelProps:Q,inputContainer:yt,inputWrapperOrder:Xt,unstyled:Xe,withAsterisk:Pn,variant:N},Nt),v),z.createElement(Qa,{opened:Ft,transitionProps:E,shadow:"sm",withinPortal:Oe,__staticSelector:"MultiSelect",onDirectionChange:$o,switchDirectionOnFlip:at,zIndex:Fe,dropdownPosition:xt,positionDependencies:[...pe,$n],classNames:h,styles:m,unstyled:Xe,variant:N},z.createElement(Qa.Target,null,z.createElement("div",{className:et.wrapper,role:"combobox","aria-haspopup":"listbox","aria-owns":kn&&Ft?`${wr}-items`:null,"aria-controls":wr,"aria-expanded":kn,onMouseLeave:()=>un(-1),tabIndex:-1},z.createElement("input",{type:"hidden",name:_t,value:be.join(","),form:te,disabled:q}),z.createElement(Gp,_l({__staticSelector:"MultiSelect",style:{overflow:"hidden"},component:"div",multiline:!0,size:d,variant:N,disabled:q,error:f,required:s,radius:ve,icon:le,unstyled:Xe,onMouseDown:je=>{var ht;je.preventDefault(),!q&&!Qe.current&&En(!kn),(ht=cn.current)==null||ht.focus()},classNames:EC(_l({},h),{input:it({[et.input]:!L},h==null?void 0:h.input)})},Oj({theme:ut,rightSection:oe,rightSectionWidth:Y,styles:m,size:d,shouldClear:U&&be.length>0,onClear:Ut,error:f,disabled:q,clearButtonProps:vr,readOnly:an})),z.createElement("div",{className:et.values,"data-clearable":U||void 0},Rt,z.createElement("input",_l({ref:$h(t,cn),type:"search",id:wr,className:it(et.searchInput,{[et.searchInputPointer]:!L,[et.searchInputInputHidden]:!kn&&be.length>0||!L&&be.length>0,[et.searchInputEmpty]:be.length===0}),onKeyDown:Ct,value:$n,onChange:zt,onFocus:lt,onBlur:St,readOnly:!L||Qe.current||an,placeholder:be.length===0?D:void 0,disabled:q,"data-mantine-stop-propagation":kn,autoComplete:"off",onCompositionStart:()=>Er(!0),onCompositionEnd:()=>Er(!1)},yr)))))),z.createElement(Qa.Dropdown,{component:fe||Wh,maxHeight:I,direction:zo,id:wr,innerRef:_a,__staticSelector:"MultiSelect",classNames:h,styles:m},z.createElement(ny,{data:He,hovered:Ke,classNames:h,styles:m,uuid:wr,__staticSelector:"MultiSelect",onItemHover:un,onItemSelect:We,itemsRefs:xn,itemComponent:k,size:d,nothingFound:R,isItemSelected:Lt,creatable:ae&&!!K,createLabel:K,unstyled:Xe,variant:N}))))});Tj.displayName="@mantine/core/MultiSelect";function lK({data:e,searchable:t,limit:n,searchValue:r,filter:o,value:s,filterDataOnExactSearchMatch:a}){if(!t)return e;const u=s!=null&&e.find(f=>f.value===s)||null;if(u&&!a&&(u==null?void 0:u.label)===r){if(n){if(n>=e.length)return e;const f=e.indexOf(u),h=f+n,m=h-e.length;return m>0?e.slice(f-m):e.slice(f,h)}return e}const d=[];for(let f=0;f=n));f+=1);return d}var cK=Qr(()=>({input:{"&:not(:disabled)":{cursor:"pointer","&::selection":{backgroundColor:"transparent"}}}}));const uK=cK;var dK=Object.defineProperty,fK=Object.defineProperties,pK=Object.getOwnPropertyDescriptors,Qp=Object.getOwnPropertySymbols,Dj=Object.prototype.hasOwnProperty,Aj=Object.prototype.propertyIsEnumerable,OC=(e,t,n)=>t in e?dK(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Gc=(e,t)=>{for(var n in t||(t={}))Dj.call(t,n)&&OC(e,n,t[n]);if(Qp)for(var n of Qp(t))Aj.call(t,n)&&OC(e,n,t[n]);return e},Qg=(e,t)=>fK(e,pK(t)),hK=(e,t)=>{var n={};for(var r in e)Dj.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Qp)for(var r of Qp(e))t.indexOf(r)<0&&Aj.call(e,r)&&(n[r]=e[r]);return n};function mK(e,t){return t.label.toLowerCase().trim().includes(e.toLowerCase().trim())}function gK(e,t){return!!e&&!t.some(n=>n.label.toLowerCase()===e.toLowerCase())}const vK={required:!1,size:"sm",shadow:"sm",itemComponent:ry,transitionProps:{transition:"fade",duration:0},initiallyOpened:!1,filter:mK,maxDropdownHeight:220,searchable:!1,clearable:!1,limit:1/0,disabled:!1,creatable:!1,shouldCreate:gK,selectOnBlur:!1,switchDirectionOnFlip:!1,filterDataOnExactSearchMatch:!1,zIndex:J1("popover"),positionDependencies:[],dropdownPosition:"flip"},Nj=p.forwardRef((e,t)=>{const n=CG("Select",vK,e),{inputProps:r,wrapperProps:o,shadow:s,data:a,value:u,defaultValue:d,onChange:f,itemComponent:h,onKeyDown:m,onBlur:v,onFocus:b,transitionProps:w,initiallyOpened:C,unstyled:S,classNames:P,styles:k,filter:j,maxDropdownHeight:E,searchable:I,clearable:O,nothingFound:R,limit:M,disabled:A,onSearchChange:L,searchValue:D,rightSection:V,rightSectionWidth:$,creatable:F,getCreateLabel:U,shouldCreate:X,selectOnBlur:N,onCreate:G,dropdownComponent:W,onDropdownClose:q,onDropdownOpen:ne,withinPortal:ve,portalProps:le,switchDirectionOnFlip:oe,zIndex:Y,name:ae,dropdownPosition:de,allowDeselect:xe,placeholder:se,filterDataOnExactSearchMatch:ge,form:fe,positionDependencies:ke,readOnly:Ae,clearButtonProps:ye,hoverOnSearchChange:Oe}=n,at=hK(n,["inputProps","wrapperProps","shadow","data","value","defaultValue","onChange","itemComponent","onKeyDown","onBlur","onFocus","transitionProps","initiallyOpened","unstyled","classNames","styles","filter","maxDropdownHeight","searchable","clearable","nothingFound","limit","disabled","onSearchChange","searchValue","rightSection","rightSectionWidth","creatable","getCreateLabel","shouldCreate","selectOnBlur","onCreate","dropdownComponent","onDropdownClose","onDropdownOpen","withinPortal","portalProps","switchDirectionOnFlip","zIndex","name","dropdownPosition","allowDeselect","placeholder","filterDataOnExactSearchMatch","form","positionDependencies","readOnly","clearButtonProps","hoverOnSearchChange"]),{classes:Fe,cx:Ye,theme:_t}=uK(),[xt,Fn]=p.useState(C),[Q,we]=p.useState(-1),te=p.useRef(),pe=p.useRef({}),[Ne,Xe]=p.useState("column"),yt=Ne==="column",{scrollIntoView:Xt,targetRef:an,scrollableRef:Pn}=Dk({duration:0,offset:5,cancelable:!1,isList:!0}),vr=xe===void 0?O:xe,ln=J=>{if(xt!==J){Fn(J);const ue=J?ne:q;typeof ue=="function"&&ue()}},Kn=F&&typeof U=="function";let Re=null;const et=a.map(J=>typeof J=="string"?{label:J,value:J}:J),it=Pk({data:et}),[ut,Nt,yr]=_u({value:u,defaultValue:d,finalValue:null,onChange:f}),cn=it.find(J=>J.value===ut),[xn,wr]=_u({value:D,defaultValue:(cn==null?void 0:cn.label)||"",finalValue:void 0,onChange:L}),kn=J=>{wr(J),I&&typeof L=="function"&&L(J)},En=()=>{var J;Ae||(Nt(null),yr||kn(""),(J=te.current)==null||J.focus())};p.useEffect(()=>{const J=it.find(ue=>ue.value===ut);J?kn(J.label):(!Kn||!ut)&&kn("")},[ut]),p.useEffect(()=>{cn&&(!I||!xt)&&kn(cn.label)},[cn==null?void 0:cn.label]);const is=J=>{if(!Ae)if(vr&&(cn==null?void 0:cn.value)===J.value)Nt(null),ln(!1);else{if(J.creatable&&typeof G=="function"){const ue=G(J.value);typeof ue<"u"&&ue!==null&&Nt(typeof ue=="string"?ue:ue.value)}else Nt(J.value);yr||kn(J.label),we(-1),ln(!1),te.current.focus()}},un=lK({data:it,searchable:I,limit:M,searchValue:xn,filter:j,filterDataOnExactSearchMatch:ge,value:ut});Kn&&X(xn,un)&&(Re=U(xn),un.push({label:xn,value:xn,creatable:!0}));const zo=(J,ue,be)=>{let Se=J;for(;be(Se);)if(Se=ue(Se),!un[Se].disabled)return Se;return J};Ss(()=>{we(Oe&&xn?0:-1)},[xn,Oe]);const $o=ut?un.findIndex(J=>J.value===ut):0,$n=!Ae&&(un.length>0?xt:xt&&!!R),ls=()=>{we(J=>{var ue;const be=zo(J,Se=>Se-1,Se=>Se>0);return an.current=pe.current[(ue=un[be])==null?void 0:ue.value],$n&&Xt({alignment:yt?"start":"end"}),be})},ka=()=>{we(J=>{var ue;const be=zo(J,Se=>Se+1,Se=>Sewindow.setTimeout(()=>{var J;an.current=pe.current[(J=un[$o])==null?void 0:J.value],Xt({alignment:yt?"end":"start"})},50);Ss(()=>{$n&&Er()},[$n]);const Lo=J=>{switch(typeof m=="function"&&m(J),J.key){case"ArrowUp":{J.preventDefault(),xt?yt?ls():ka():(we($o),ln(!0),Er());break}case"ArrowDown":{J.preventDefault(),xt?yt?ka():ls():(we($o),ln(!0),Er());break}case"Home":{if(!I){J.preventDefault(),xt||ln(!0);const ue=un.findIndex(be=>!be.disabled);we(ue),$n&&Xt({alignment:yt?"end":"start"})}break}case"End":{if(!I){J.preventDefault(),xt||ln(!0);const ue=un.map(be=>!!be.disabled).lastIndexOf(!1);we(ue),$n&&Xt({alignment:yt?"end":"start"})}break}case"Escape":{J.preventDefault(),ln(!1),we(-1);break}case" ":{I||(J.preventDefault(),un[Q]&&xt?is(un[Q]):(ln(!0),we($o),Er()));break}case"Enter":I||J.preventDefault(),un[Q]&&xt&&(J.preventDefault(),is(un[Q]))}},Zs=J=>{typeof v=="function"&&v(J);const ue=it.find(be=>be.value===ut);N&&un[Q]&&xt&&is(un[Q]),kn((ue==null?void 0:ue.label)||""),ln(!1)},_a=J=>{typeof b=="function"&&b(J),I&&ln(!0)},cs=J=>{Ae||(kn(J.currentTarget.value),O&&J.currentTarget.value===""&&Nt(null),we(-1),ln(!0))},K=()=>{Ae||(ln(!xt),ut&&!xt&&we($o))};return z.createElement(Gp.Wrapper,Qg(Gc({},o),{__staticSelector:"Select"}),z.createElement(Qa,{opened:$n,transitionProps:w,shadow:s,withinPortal:ve,portalProps:le,__staticSelector:"Select",onDirectionChange:Xe,switchDirectionOnFlip:oe,zIndex:Y,dropdownPosition:de,positionDependencies:[...ke,xn],classNames:P,styles:k,unstyled:S,variant:r.variant},z.createElement(Qa.Target,null,z.createElement("div",{role:"combobox","aria-haspopup":"listbox","aria-owns":$n?`${r.id}-items`:null,"aria-controls":r.id,"aria-expanded":$n,onMouseLeave:()=>we(-1),tabIndex:-1},z.createElement("input",{type:"hidden",name:ae,value:ut||"",form:fe,disabled:A}),z.createElement(Gp,Gc(Qg(Gc(Gc({autoComplete:"off",type:"search"},r),at),{ref:$h(t,te),onKeyDown:Lo,__staticSelector:"Select",value:xn,placeholder:se,onChange:cs,"aria-autocomplete":"list","aria-controls":$n?`${r.id}-items`:null,"aria-activedescendant":Q>=0?`${r.id}-${Q}`:null,onMouseDown:K,onBlur:Zs,onFocus:_a,readOnly:!I||Ae,disabled:A,"data-mantine-stop-propagation":$n,name:null,classNames:Qg(Gc({},P),{input:Ye({[Fe.input]:!I},P==null?void 0:P.input)})}),Oj({theme:_t,rightSection:V,rightSectionWidth:$,styles:k,size:r.size,shouldClear:O&&!!cn,onClear:En,error:o.error,clearButtonProps:ye,disabled:A,readOnly:Ae}))))),z.createElement(Qa.Dropdown,{component:W||Wh,maxHeight:E,direction:Ne,id:r.id,innerRef:Pn,__staticSelector:"Select",classNames:P,styles:k},z.createElement(ny,{data:un,hovered:Q,classNames:P,styles:k,isItemSelected:J=>J===ut,uuid:r.id,__staticSelector:"Select",onItemHover:we,onItemSelect:is,itemsRefs:pe,itemComponent:h,size:r.size,nothingFound:R,creatable:Kn&&!!Re,createLabel:Re,"aria-label":o.label,unstyled:S,variant:r.variant}))))});Nj.displayName="@mantine/core/Select";const zj=()=>{const[e,t,n,r,o,s,a,u,d,f,h,m,v,b,w,C,S,P,k,j,E,I,O,R,M,A,L,D,V,$,F,U,X,N,G,W,q,ne]=Ji("colors",["base.50","base.100","base.150","base.200","base.250","base.300","base.350","base.400","base.450","base.500","base.550","base.600","base.650","base.700","base.750","base.800","base.850","base.900","base.950","accent.50","accent.100","accent.150","accent.200","accent.250","accent.300","accent.350","accent.400","accent.450","accent.500","accent.550","accent.600","accent.650","accent.700","accent.750","accent.800","accent.850","accent.900","accent.950"]);return{base50:e,base100:t,base150:n,base200:r,base250:o,base300:s,base350:a,base400:u,base450:d,base500:f,base550:h,base600:m,base650:v,base700:b,base750:w,base800:C,base850:S,base900:P,base950:k,accent50:j,accent100:E,accent150:I,accent200:O,accent250:R,accent300:M,accent350:A,accent400:L,accent450:D,accent500:V,accent550:$,accent600:F,accent650:U,accent700:X,accent750:N,accent800:G,accent850:W,accent900:q,accent950:ne}},yK=e=>{const{searchable:t=!0,tooltip:n,inputRef:r,onChange:o,...s}=e,a=re(),{base50:u,base100:d,base200:f,base300:h,base400:m,base500:v,base600:b,base700:w,base800:C,base900:S,accent200:P,accent300:k,accent400:j,accent500:E,accent600:I}=zj(),{colorMode:O}=xo(),[R,M]=p.useState(""),A=p.useCallback($=>{$.shiftKey&&a(os(!0))},[a]),L=p.useCallback($=>{$.shiftKey||a(os(!1))},[a]),D=p.useCallback($=>{M(""),o&&o($)},[o]),[V]=Ji("shadows",["dark-lg"]);return i.jsx(Gn,{label:n,placement:"top",hasArrow:!0,children:i.jsx(Nj,{ref:r,searchValue:R,onSearchChange:M,onChange:D,onKeyDown:A,onKeyUp:L,searchable:t,maxDropdownHeight:300,styles:()=>({label:{color:Me(w,h)(O),fontWeight:"normal"},input:{backgroundColor:Me(u,S)(O),borderWidth:"2px",borderColor:Me(f,C)(O),color:Me(S,d)(O),paddingRight:24,fontWeight:600,"&:hover":{borderColor:Me(h,b)(O)},"&:focus":{borderColor:Me(k,I)(O)},"&:is(:focus, :hover)":{borderColor:Me(m,v)(O)},"&:focus-within":{borderColor:Me(P,I)(O)},"&[data-disabled]":{backgroundColor:Me(h,w)(O),color:Me(b,m)(O),cursor:"not-allowed"}},value:{backgroundColor:Me(d,S)(O),color:Me(S,d)(O),button:{color:Me(S,d)(O)},"&:hover":{backgroundColor:Me(h,w)(O),cursor:"pointer"}},dropdown:{backgroundColor:Me(f,C)(O),borderColor:Me(f,C)(O),boxShadow:V},item:{backgroundColor:Me(f,C)(O),color:Me(C,f)(O),padding:6,"&[data-hovered]":{color:Me(S,d)(O),backgroundColor:Me(h,w)(O)},"&[data-active]":{backgroundColor:Me(h,w)(O),"&:hover":{color:Me(S,d)(O),backgroundColor:Me(h,w)(O)}},"&[data-selected]":{backgroundColor:Me(j,I)(O),color:Me(u,d)(O),fontWeight:600,"&:hover":{backgroundColor:Me(E,E)(O),color:Me("white",u)(O)}},"&[data-disabled]":{color:Me(v,b)(O),cursor:"not-allowed"}},rightSection:{width:32,button:{color:Me(S,d)(O)}}}),...s})})},qn=p.memo(yK);function bK(){const e=B(o=>o.postprocessing.facetoolType),t=re(),{t:n}=me(),r=o=>t(r8(o));return i.jsx(qn,{label:n("parameters.type"),data:n8.concat(),value:e,onChange:r})}function xK(){const e=B(o=>o.system.isGFPGANAvailable),t=B(o=>o.postprocessing.facetoolStrength),{t:n}=me(),r=re();return i.jsx(vt,{isDisabled:!e,label:n("parameters.strength"),step:.05,min:0,max:1,onChange:o=>r(Dx(o)),handleReset:()=>r(Dx(.75)),value:t,withReset:!0,withSliderMarks:!0,withInput:!0})}function SK(){const e=B(o=>o.system.isGFPGANAvailable),t=B(o=>o.postprocessing.codeformerFidelity),{t:n}=me(),r=re();return i.jsx(vt,{isDisabled:!e,label:n("parameters.codeformerFidelity"),step:.05,min:0,max:1,onChange:o=>r(Ax(o)),handleReset:()=>r(Ax(1)),value:t,withReset:!0,withSliderMarks:!0,withInput:!0})}const wK=()=>{const e=B(t=>t.postprocessing.facetoolType);return i.jsxs(_r,{gap:2,alignItems:"stretch",children:[i.jsx(bK,{}),i.jsx(xK,{}),e==="codeformer"&&i.jsx(SK,{})]})};function CK(){const e=B(o=>o.system.isESRGANAvailable),t=B(o=>o.postprocessing.upscalingDenoising),{t:n}=me(),r=re();return i.jsx(vt,{label:n("parameters.denoisingStrength"),value:t,min:0,max:1,step:.01,onChange:o=>{r(Nx(o))},handleReset:()=>r(Nx(.75)),withSliderMarks:!0,withInput:!0,withReset:!0,isDisabled:!e})}function PK(){const e=B(o=>o.system.isESRGANAvailable),t=B(o=>o.postprocessing.upscalingStrength),{t:n}=me(),r=re();return i.jsx(vt,{label:`${n("parameters.upscale")} ${n("parameters.strength")}`,value:t,min:0,max:1,step:.05,onChange:o=>r(zx(o)),handleReset:()=>r(zx(.75)),withSliderMarks:!0,withInput:!0,withReset:!0,isDisabled:!e})}function kK(){const e=B(s=>s.system.isESRGANAvailable),t=B(s=>s.postprocessing.upscalingLevel),{t:n}=me(),r=re(),o=s=>r(s8(Number(s)));return i.jsx(qn,{disabled:!e,label:n("parameters.scale"),value:String(t),onChange:o,data:o8})}const _K=()=>i.jsxs(_r,{gap:2,alignItems:"stretch",children:[i.jsx(kK,{}),i.jsx(CK,{}),i.jsx(PK,{})]}),jK=Pe([mn,Sr],({gallery:e,system:t,postprocessing:n,ui:r,lightbox:o},s)=>{const{isProcessing:a,isConnected:u,isGFPGANAvailable:d,isESRGANAvailable:f,shouldConfirmOnDelete:h,progressImage:m}=t,{upscalingLevel:v,facetoolStrength:b}=n,{isLightboxOpen:w}=o,{shouldShowImageDetails:C,shouldHidePreview:S,shouldShowProgressInViewer:P}=r,k=e.selection[e.selection.length-1];return{canDeleteImage:u&&!a,shouldConfirmOnDelete:h,isProcessing:a,isConnected:u,isGFPGANAvailable:d,isESRGANAvailable:f,upscalingLevel:v,facetoolStrength:b,shouldDisableToolbarButtons:!!m||!k,shouldShowImageDetails:C,activeTabName:s,isLightboxOpen:w,shouldHidePreview:S,shouldShowProgressInViewer:P,lastSelectedImage:k}},{memoizeOptions:{resultEqualityCheck:Wt}}),$j=e=>{var ne,ve,le;const t=re(),{isProcessing:n,isConnected:r,isGFPGANAvailable:o,isESRGANAvailable:s,upscalingLevel:a,facetoolStrength:u,shouldDisableToolbarButtons:d,shouldShowImageDetails:f,isLightboxOpen:h,activeTabName:m,shouldHidePreview:v,lastSelectedImage:b,shouldShowProgressInViewer:w}=B(jK),C=cr("lightbox").isFeatureEnabled,S=cr("unifiedCanvas").isFeatureEnabled,P=cr("upscaling").isFeatureEnabled,k=cr("faceRestore").isFeatureEnabled,j=Du(),{t:E}=me(),{recallBothPrompts:I,recallSeed:O,recallAllParameters:R}=Y1(),{currentData:M}=Vs(b??ga.skipToken),A=p.useCallback(()=>{const Y=(()=>{if(M)return M.image_url.startsWith("http")?M.image_url:window.location.toString()+M.image_url})();if(!Y){j({title:E("toast.problemCopyingImageLink"),status:"error",duration:2500,isClosable:!0});return}navigator.clipboard.writeText(Y).then(()=>{j({title:E("toast.imageLinkCopied"),status:"success",duration:2500,isClosable:!0})})},[j,E,M]),L=p.useCallback(()=>{R(M)},[M,R]);Ge("a",()=>{},[M,R]);const D=p.useCallback(()=>{var oe;O((oe=M==null?void 0:M.metadata)==null?void 0:oe.seed)},[M,O]);Ge("s",D,[M]);const V=p.useCallback(()=>{var oe,Y;I((oe=M==null?void 0:M.metadata)==null?void 0:oe.positive_conditioning,(Y=M==null?void 0:M.metadata)==null?void 0:Y.negative_conditioning)},[M,I]);Ge("p",V,[M]);const $=p.useCallback(()=>{t(g3()),t(Wf(M))},[t,M]);Ge("shift+i",$,[M]);const F=p.useCallback(()=>{},[]),U=p.useCallback(()=>{M&&t($0(M))},[t,M]);Ge("Shift+U",()=>{F()},{enabled:()=>!!(P&&s&&!d&&r&&!n&&a)},[P,M,s,d,r,n,a]);const X=p.useCallback(()=>{},[]);Ge("Shift+R",()=>{X()},{enabled:()=>!!(k&&o&&!d&&r&&!n&&u)},[k,M,o,d,r,n,u]);const N=p.useCallback(()=>t(P3(!f)),[t,f]),G=p.useCallback(()=>{M&&(t(v3()),h&&t(mu(!1)),t(y3(M)),t(ks()),m!=="unifiedCanvas"&&t(Oi("unifiedCanvas")),j({title:E("toast.sentToUnifiedCanvas"),status:"success",duration:2500,isClosable:!0}))},[M,h,t,m,j,E]);Ge("i",()=>{M?N():j({title:E("toast.metadataLoadFailed"),status:"error",duration:2500,isClosable:!0})},[M,f,j]);const W=p.useCallback(()=>{t(k3(!w))},[t,w]),q=p.useCallback(()=>{t(mu(!h))},[t,h]);return i.jsx(i.Fragment,{children:i.jsxs(H,{sx:{flexWrap:"wrap",justifyContent:"center",alignItems:"center",gap:2},...e,children:[i.jsxs(gr,{isAttached:!0,isDisabled:d,children:[i.jsx(la,{triggerComponent:i.jsx(Ie,{"aria-label":`${E("parameters.sendTo")}...`,tooltip:`${E("parameters.sendTo")}...`,isDisabled:!M,icon:i.jsx(qz,{})}),children:i.jsxs(H,{sx:{flexDirection:"column",rowGap:2},children:[i.jsx(Yt,{size:"sm",onClick:$,leftIcon:i.jsx(rp,{}),id:"send-to-img2img",children:E("parameters.sendToImg2Img")}),S&&i.jsx(Yt,{size:"sm",onClick:G,leftIcon:i.jsx(rp,{}),id:"send-to-canvas",children:E("parameters.sendToUnifiedCanvas")}),i.jsx(Yt,{size:"sm",onClick:A,leftIcon:i.jsx(yc,{}),children:E("parameters.copyImageToLink")}),i.jsx(Ai,{download:!0,href:M==null?void 0:M.image_url,target:"_blank",children:i.jsx(Yt,{leftIcon:i.jsx(_1,{}),size:"sm",w:"100%",children:E("parameters.downloadImage")})})]})}),C&&i.jsx(Ie,{icon:i.jsx(j1,{}),tooltip:h?`${E("parameters.closeViewer")} (Z)`:`${E("parameters.openInViewer")} (Z)`,"aria-label":h?`${E("parameters.closeViewer")} (Z)`:`${E("parameters.openInViewer")} (Z)`,isChecked:h,onClick:q,isDisabled:d})]}),i.jsxs(gr,{isAttached:!0,isDisabled:d,children:[i.jsx(Ie,{icon:i.jsx(Hz,{}),tooltip:`${E("parameters.usePrompt")} (P)`,"aria-label":`${E("parameters.usePrompt")} (P)`,isDisabled:!((ne=M==null?void 0:M.metadata)!=null&&ne.positive_conditioning),onClick:V}),i.jsx(Ie,{icon:i.jsx(Uz,{}),tooltip:`${E("parameters.useSeed")} (S)`,"aria-label":`${E("parameters.useSeed")} (S)`,isDisabled:!((ve=M==null?void 0:M.metadata)!=null&&ve.seed),onClick:D}),i.jsx(Ie,{icon:i.jsx(Cz,{}),tooltip:`${E("parameters.useAll")} (A)`,"aria-label":`${E("parameters.useAll")} (A)`,isDisabled:!["t2l","l2l","inpaint"].includes(String((le=M==null?void 0:M.metadata)==null?void 0:le.type)),onClick:L})]}),(P||k)&&i.jsxs(gr,{isAttached:!0,isDisabled:d,children:[k&&i.jsx(la,{triggerComponent:i.jsx(Ie,{icon:i.jsx(Tz,{}),"aria-label":E("parameters.restoreFaces")}),children:i.jsxs(H,{sx:{flexDirection:"column",rowGap:4},children:[i.jsx(wK,{}),i.jsx(Yt,{isDisabled:!o||!M||!(r&&!n)||!u,onClick:X,children:E("parameters.restoreFaces")})]})}),P&&i.jsx(la,{triggerComponent:i.jsx(Ie,{icon:i.jsx(Iz,{}),"aria-label":E("parameters.upscale")}),children:i.jsxs(H,{sx:{flexDirection:"column",gap:4},children:[i.jsx(_K,{}),i.jsx(Yt,{isDisabled:!s||!M||!(r&&!n)||!a,onClick:F,children:E("parameters.upscaleImage")})]})})]}),i.jsx(gr,{isAttached:!0,isDisabled:d,children:i.jsx(Ie,{icon:i.jsx(k1,{}),tooltip:`${E("parameters.info")} (I)`,"aria-label":`${E("parameters.info")} (I)`,isChecked:f,onClick:N})}),i.jsx(gr,{isAttached:!0,children:i.jsx(Ie,{"aria-label":E("settings.displayInProgress"),tooltip:E("settings.displayInProgress"),icon:i.jsx(Dz,{}),isChecked:w,onClick:W})}),i.jsx(gr,{isAttached:!0,children:i.jsx(lB,{onClick:U,isDisabled:d})})]})})},qo=({label:e,value:t,onClick:n,isLink:r,labelPosition:o,withCopy:s=!1})=>{const{t:a}=me();return t?i.jsxs(H,{gap:2,children:[n&&i.jsx(Gn,{label:`Recall ${e}`,children:i.jsx(Ka,{"aria-label":a("accessibility.useThisParameter"),icon:i.jsx(Af,{}),size:"xs",variant:"ghost",fontSize:20,onClick:n})}),s&&i.jsx(Gn,{label:`Copy ${e}`,children:i.jsx(Ka,{"aria-label":`Copy ${e}`,icon:i.jsx(yc,{}),size:"xs",variant:"ghost",fontSize:14,onClick:()=>navigator.clipboard.writeText(t.toString())})}),i.jsxs(H,{direction:o?"column":"row",children:[i.jsxs(Ue,{fontWeight:"semibold",whiteSpace:"pre-wrap",pr:2,children:[e,":"]}),r?i.jsxs(Ai,{href:t.toString(),isExternal:!0,wordBreak:"break-all",children:[t.toString()," ",i.jsx(M1,{mx:"2px"})]}):i.jsx(Ue,{overflowY:"scroll",wordBreak:"break-all",children:t.toString()})]})]}):null},EK=({image:e})=>{const t=re(),{recallBothPrompts:n,recallPositivePrompt:r,recallNegativePrompt:o,recallSeed:s,recallInitialImage:a,recallCfgScale:u,recallModel:d,recallScheduler:f,recallSteps:h,recallWidth:m,recallHeight:v,recallStrength:b,recallAllParameters:w}=Y1();Ge("esc",()=>{t(P3(!1))});const C=e==null?void 0:e.session_id,S=e==null?void 0:e.metadata,{t:P}=me(),k=JSON.stringify(e,null,2);return i.jsxs(H,{sx:{padding:4,gap:1,flexDirection:"column",width:"full",height:"full",backdropFilter:"blur(20px)",bg:"whiteAlpha.600",_dark:{bg:"blackAlpha.600"},overflow:"scroll"},children:[i.jsxs(H,{gap:2,children:[i.jsx(Ue,{fontWeight:"semibold",children:"File:"}),i.jsxs(Ai,{href:e.image_url,isExternal:!0,maxW:"calc(100% - 3rem)",children:[e.image_name,i.jsx(M1,{mx:"2px"})]})]}),S&&Object.keys(S).length>0?i.jsxs(i.Fragment,{children:[S.type&&i.jsx(qo,{label:"Invocation type",value:S.type}),C&&i.jsx(qo,{label:"Session ID",value:C}),S.positive_conditioning&&i.jsx(qo,{label:"Positive Prompt",labelPosition:"top",value:S.positive_conditioning,onClick:()=>r(S.positive_conditioning)}),S.negative_conditioning&&i.jsx(qo,{label:"Negative Prompt",labelPosition:"top",value:S.negative_conditioning,onClick:()=>o(S.negative_conditioning)}),S.seed!==void 0&&i.jsx(qo,{label:"Seed",value:S.seed,onClick:()=>s(S.seed)}),S.model!==void 0&&i.jsx(qo,{label:"Model",value:S.model,onClick:()=>d(S.model)}),S.width&&i.jsx(qo,{label:"Width",value:S.width,onClick:()=>m(S.width)}),S.height&&i.jsx(qo,{label:"Height",value:S.height,onClick:()=>v(S.height)}),S.scheduler&&i.jsx(qo,{label:"Scheduler",value:S.scheduler,onClick:()=>f(S.scheduler)}),S.steps&&i.jsx(qo,{label:"Steps",value:S.steps,onClick:()=>h(S.steps)}),S.cfg_scale!==void 0&&i.jsx(qo,{label:"CFG scale",value:S.cfg_scale,onClick:()=>u(S.cfg_scale)}),S.strength&&i.jsx(qo,{label:"Image to image strength",value:S.strength,onClick:()=>b(S.strength)})]}):i.jsx(v6,{width:"100%",pt:10,children:i.jsx(Ue,{fontSize:"lg",fontWeight:"semibold",children:"No metadata available"})}),i.jsxs(H,{gap:2,direction:"column",overflow:"auto",children:[i.jsxs(H,{gap:2,children:[i.jsx(Gn,{label:"Copy metadata JSON",children:i.jsx(Ka,{"aria-label":P("accessibility.copyMetadataJson"),icon:i.jsx(yc,{}),size:"xs",variant:"ghost",fontSize:14,onClick:()=>navigator.clipboard.writeText(k)})}),i.jsx(Ue,{fontWeight:"semibold",children:"Metadata JSON:"})]}),i.jsx(sk,{defer:!0,children:i.jsx(qe,{sx:{padding:4,borderRadius:"base",bg:"whiteAlpha.500",_dark:{bg:"blackAlpha.500"},w:"full"},children:i.jsx("pre",{children:k})})})]})]})},Lj=p.memo(EK),RC={height:"100%",width:"15%",alignItems:"center",pointerEvents:"auto"},Zg={color:"base.100"},IK=Pe([mn,b3],(e,t)=>{const{total:n,isFetching:r}=e.gallery,o=e.gallery.selection[e.gallery.selection.length-1];if(!o||t.length===0)return{isOnFirstImage:!0,isOnLastImage:!0};const s=t.findIndex(b=>b.image_name===o),a=Us(s+1,0,t.length-1),u=Us(s-1,0,t.length-1),d=t[a].image_name,f=t[u].image_name,h=$x(e,d),m=$x(e,f),v=t.length;return{isOnFirstImage:s===0,isOnLastImage:!isNaN(s)&&s===v-1,areMoreImagesAvailable:n>v,isFetching:r,nextImage:h,prevImage:m,nextImageId:d,prevImageId:f}},{memoizeOptions:{resultEqualityCheck:Wt}}),OK=()=>{const e=re(),{t}=me(),{isOnFirstImage:n,isOnLastImage:r,nextImageId:o,prevImageId:s,areMoreImagesAvailable:a,isFetching:u}=B(IK),[d,f]=p.useState(!1),h=p.useCallback(()=>{f(!0)},[]),m=p.useCallback(()=>{f(!1)},[]),v=p.useCallback(()=>{s&&e(yv(s))},[e,s]),b=p.useCallback(()=>{o&&e(yv(o))},[e,o]),w=p.useCallback(()=>{e(x3({is_intermediate:!1}))},[e]);return Ge("left",()=>{v()},[s]),Ge("right",()=>{if(r&&a&&!u){w();return}r||b()},[o,r,a,w,u]),i.jsxs(H,{sx:{justifyContent:"space-between",height:"100%",width:"100%",pointerEvents:"none"},children:[i.jsx(ma,{sx:{...RC,justifyContent:"flex-start"},onMouseOver:h,onMouseOut:m,children:d&&!n&&i.jsx(Ka,{"aria-label":t("accessibility.previousImage"),icon:i.jsx(bz,{size:64}),variant:"unstyled",onClick:v,boxSize:16,sx:Zg})}),i.jsxs(ma,{sx:{...RC,justifyContent:"flex-end"},onMouseOver:h,onMouseOut:m,children:[d&&!r&&i.jsx(Ka,{"aria-label":t("accessibility.nextImage"),icon:i.jsx(xz,{size:64}),variant:"unstyled",onClick:b,boxSize:16,sx:Zg}),d&&r&&a&&!u&&i.jsx(Ka,{"aria-label":t("accessibility.loadMore"),icon:i.jsx(yz,{size:64}),variant:"unstyled",onClick:w,boxSize:16,sx:Zg}),d&&r&&a&&u&&i.jsx(H,{sx:{w:16,h:16,alignItems:"center",justifyContent:"center"},children:i.jsx(ai,{opacity:.5,size:"xl"})})]})]})},Fj=p.memo(OK);var ts=function(e,t){return Number(e.toFixed(t))},RK=function(e,t){return typeof e=="number"?e:t},Jn=function(e,t,n){n&&typeof n=="function"&&n(e,t)},MK=function(e){return-Math.cos(e*Math.PI)/2+.5},TK=function(e){return e},DK=function(e){return e*e},AK=function(e){return e*(2-e)},NK=function(e){return e<.5?2*e*e:-1+(4-2*e)*e},zK=function(e){return e*e*e},$K=function(e){return--e*e*e+1},LK=function(e){return e<.5?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1},FK=function(e){return e*e*e*e},BK=function(e){return 1- --e*e*e*e},HK=function(e){return e<.5?8*e*e*e*e:1-8*--e*e*e*e},WK=function(e){return e*e*e*e*e},VK=function(e){return 1+--e*e*e*e*e},UK=function(e){return e<.5?16*e*e*e*e*e:1+16*--e*e*e*e*e},Bj={easeOut:MK,linear:TK,easeInQuad:DK,easeOutQuad:AK,easeInOutQuad:NK,easeInCubic:zK,easeOutCubic:$K,easeInOutCubic:LK,easeInQuart:FK,easeOutQuart:BK,easeInOutQuart:HK,easeInQuint:WK,easeOutQuint:VK,easeInOutQuint:UK},Hj=function(e){typeof e=="number"&&cancelAnimationFrame(e)},Hs=function(e){e.mounted&&(Hj(e.animation),e.animate=!1,e.animation=null,e.velocity=null)};function Wj(e,t,n,r){if(e.mounted){var o=new Date().getTime(),s=1;Hs(e),e.animation=function(){if(!e.mounted)return Hj(e.animation);var a=new Date().getTime()-o,u=a/n,d=Bj[t],f=d(u);a>=n?(r(s),e.animation=null):e.animation&&(r(f),requestAnimationFrame(e.animation))},requestAnimationFrame(e.animation)}}function GK(e){var t=e.scale,n=e.positionX,r=e.positionY;return!(Number.isNaN(t)||Number.isNaN(n)||Number.isNaN(r))}function di(e,t,n,r){var o=GK(t);if(!(!e.mounted||!o)){var s=e.setTransformState,a=e.transformState,u=a.scale,d=a.positionX,f=a.positionY,h=t.scale-u,m=t.positionX-d,v=t.positionY-f;n===0?s(t.scale,t.positionX,t.positionY):Wj(e,r,n,function(b){var w=u+h*b,C=d+m*b,S=f+v*b;s(w,C,S)})}}function qK(e,t,n){var r=e.offsetWidth,o=e.offsetHeight,s=t.offsetWidth,a=t.offsetHeight,u=s*n,d=a*n,f=r-u,h=o-d;return{wrapperWidth:r,wrapperHeight:o,newContentWidth:u,newDiffWidth:f,newContentHeight:d,newDiffHeight:h}}var KK=function(e,t,n,r,o,s,a){var u=e>t?n*(a?1:.5):0,d=r>o?s*(a?1:.5):0,f=e-t-u,h=u,m=r-o-d,v=d;return{minPositionX:f,maxPositionX:h,minPositionY:m,maxPositionY:v}},py=function(e,t){var n=e.wrapperComponent,r=e.contentComponent,o=e.setup.centerZoomedOut;if(!n||!r)throw new Error("Components are not mounted");var s=qK(n,r,t),a=s.wrapperWidth,u=s.wrapperHeight,d=s.newContentWidth,f=s.newDiffWidth,h=s.newContentHeight,m=s.newDiffHeight,v=KK(a,d,f,u,h,m,!!o);return v},d0=function(e,t,n,r){return r?en?ts(n,2):ts(e,2):ts(e,2)},nc=function(e,t){var n=py(e,t);return e.bounds=n,n};function Gh(e,t,n,r,o,s,a){var u=n.minPositionX,d=n.minPositionY,f=n.maxPositionX,h=n.maxPositionY,m=0,v=0;a&&(m=o,v=s);var b=d0(e,u-m,f+m,r),w=d0(t,d-v,h+v,r);return{x:b,y:w}}function qh(e,t,n,r,o,s){var a=e.transformState,u=a.scale,d=a.positionX,f=a.positionY,h=r-u;if(typeof t!="number"||typeof n!="number")return console.error("Mouse X and Y position were not provided!"),{x:d,y:f};var m=d-t*h,v=f-n*h,b=Gh(m,v,o,s,0,0,null);return b}function Zu(e,t,n,r,o){var s=o?r:0,a=t-s;return!Number.isNaN(n)&&e>=n?n:!Number.isNaN(t)&&e<=a?a:e}var MC=function(e,t){var n=e.setup.panning.excluded,r=e.isInitialized,o=e.wrapperComponent,s=t.target,a=o==null?void 0:o.contains(s),u=r&&s&&a;if(!u)return!1;var d=Kh(s,n);return!d},TC=function(e){var t=e.isInitialized,n=e.isPanning,r=e.setup,o=r.panning.disabled,s=t&&n&&!o;return!!s},YK=function(e,t){var n=e.transformState,r=n.positionX,o=n.positionY;e.isPanning=!0;var s=t.clientX,a=t.clientY;e.startCoords={x:s-r,y:a-o}},XK=function(e,t){var n=t.touches,r=e.transformState,o=r.positionX,s=r.positionY;e.isPanning=!0;var a=n.length===1;if(a){var u=n[0].clientX,d=n[0].clientY;e.startCoords={x:u-o,y:d-s}}};function QK(e){var t=e.transformState,n=t.positionX,r=t.positionY,o=t.scale,s=e.setup,a=s.disabled,u=s.limitToBounds,d=s.centerZoomedOut,f=e.wrapperComponent;if(!(a||!f||!e.bounds)){var h=e.bounds,m=h.maxPositionX,v=h.minPositionX,b=h.maxPositionY,w=h.minPositionY,C=n>m||nb||rm?f.offsetWidth:e.setup.minPositionX||0,k=r>b?f.offsetHeight:e.setup.minPositionY||0,j=qh(e,P,k,o,e.bounds,u||d),E=j.x,I=j.y;return{scale:o,positionX:C?E:n,positionY:S?I:r}}}function ZK(e,t,n,r,o){var s=e.setup.limitToBounds,a=e.wrapperComponent,u=e.bounds,d=e.transformState,f=d.scale,h=d.positionX,m=d.positionY;if(!(a===null||u===null||t===h&&n===m)){var v=Gh(t,n,u,s,r,o,a),b=v.x,w=v.y;e.setTransformState(f,b,w)}}var JK=function(e,t,n){var r=e.startCoords,o=e.transformState,s=e.setup.panning,a=s.lockAxisX,u=s.lockAxisY,d=o.positionX,f=o.positionY;if(!r)return{x:d,y:f};var h=t-r.x,m=n-r.y,v=a?d:h,b=u?f:m;return{x:v,y:b}},Zp=function(e,t){var n=e.setup,r=e.transformState,o=r.scale,s=n.minScale,a=n.disablePadding;return t>0&&o>=s&&!a?t:0},eY=function(e){var t=e.mounted,n=e.setup,r=n.disabled,o=n.velocityAnimation,s=e.transformState.scale,a=o.disabled,u=!a||s>1||!r||t;return!!u},tY=function(e){var t=e.mounted,n=e.velocity,r=e.bounds,o=e.setup,s=o.disabled,a=o.velocityAnimation,u=e.transformState.scale,d=a.disabled,f=!d||u>1||!s||t;return!(!f||!n||!r)};function nY(e,t){var n=e.setup.velocityAnimation,r=n.equalToMove,o=n.animationTime,s=n.sensitivity;return r?o*t*s:o}function DC(e,t,n,r,o,s,a,u,d,f){if(o){if(t>a&&n>a){var h=a+(e-a)*f;return h>d?d:hs?s:h}}return r?t:d0(e,s,a,o)}function rY(e,t){var n=1;return t?Math.min(n,e.offsetWidth/window.innerWidth):n}function oY(e,t){var n=eY(e);if(n){var r=e.lastMousePosition,o=e.velocityTime,s=e.setup,a=e.wrapperComponent,u=s.velocityAnimation.equalToMove,d=Date.now();if(r&&o&&a){var f=rY(a,u),h=t.x-r.x,m=t.y-r.y,v=h/f,b=m/f,w=d-o,C=h*h+m*m,S=Math.sqrt(C)/w;e.velocity={velocityX:v,velocityY:b,total:S}}e.lastMousePosition=t,e.velocityTime=d}}function sY(e){var t=e.velocity,n=e.bounds,r=e.setup,o=e.wrapperComponent,s=tY(e);if(!(!s||!t||!n||!o)){var a=t.velocityX,u=t.velocityY,d=t.total,f=n.maxPositionX,h=n.minPositionX,m=n.maxPositionY,v=n.minPositionY,b=r.limitToBounds,w=r.alignmentAnimation,C=r.zoomAnimation,S=r.panning,P=S.lockAxisY,k=S.lockAxisX,j=C.animationType,E=w.sizeX,I=w.sizeY,O=w.velocityAlignmentTime,R=O,M=nY(e,d),A=Math.max(M,R),L=Zp(e,E),D=Zp(e,I),V=L*o.offsetWidth/100,$=D*o.offsetHeight/100,F=f+V,U=h-V,X=m+$,N=v-$,G=e.transformState,W=new Date().getTime();Wj(e,j,A,function(q){var ne=e.transformState,ve=ne.scale,le=ne.positionX,oe=ne.positionY,Y=new Date().getTime()-W,ae=Y/R,de=Bj[w.animationType],xe=1-de(Math.min(1,ae)),se=1-q,ge=le+a*se,fe=oe+u*se,ke=DC(ge,G.positionX,le,k,b,h,f,U,F,xe),Ae=DC(fe,G.positionY,oe,P,b,v,m,N,X,xe);(le!==ge||oe!==fe)&&e.setTransformState(ve,ke,Ae)})}}function AC(e,t){var n=e.transformState.scale;Hs(e),nc(e,n),window.TouchEvent!==void 0&&t instanceof TouchEvent?XK(e,t):YK(e,t)}function Vj(e){var t=e.transformState.scale,n=e.setup,r=n.minScale,o=n.alignmentAnimation,s=o.disabled,a=o.sizeX,u=o.sizeY,d=o.animationTime,f=o.animationType,h=s||t.1&&m;v?sY(e):Vj(e)}}function hy(e,t,n,r){var o=e.setup,s=o.minScale,a=o.maxScale,u=o.limitToBounds,d=Zu(ts(t,2),s,a,0,!1),f=nc(e,d),h=qh(e,n,r,d,f,u),m=h.x,v=h.y;return{scale:d,positionX:m,positionY:v}}function Uj(e,t,n){var r=e.transformState.scale,o=e.wrapperComponent,s=e.setup,a=s.minScale,u=s.limitToBounds,d=s.zoomAnimation,f=d.disabled,h=d.animationTime,m=d.animationType,v=f||r>=a;if((r>=1||u)&&Vj(e),!(v||!o||!e.mounted)){var b=t||o.offsetWidth/2,w=n||o.offsetHeight/2,C=hy(e,a,b,w);C&&di(e,C,h,m)}}var Za=function(){return Za=Object.assign||function(t){for(var n,r=1,o=arguments.length;ra||Math.sign(n.deltaY)!==Math.sign(t.deltaY)||n.deltaY>0&&n.deltaYt.deltaY||Math.sign(n.deltaY)!==Math.sign(t.deltaY):!1},CY=function(e,t){var n=e.setup.pinch,r=n.disabled,o=n.excluded,s=e.isInitialized,a=t.target,u=s&&!r&&a;if(!u)return!1;var d=Kh(a,o);return!d},PY=function(e){var t=e.setup.pinch.disabled,n=e.isInitialized,r=e.pinchStartDistance,o=n&&!t&&r;return!!o},kY=function(e,t,n){var r=n.getBoundingClientRect(),o=e.touches,s=ts(o[0].clientX-r.left,5),a=ts(o[0].clientY-r.top,5),u=ts(o[1].clientX-r.left,5),d=ts(o[1].clientY-r.top,5);return{x:(s+u)/2/t,y:(a+d)/2/t}},Zj=function(e){return Math.sqrt(Math.pow(e.touches[0].pageX-e.touches[1].pageX,2)+Math.pow(e.touches[0].pageY-e.touches[1].pageY,2))},_Y=function(e,t){var n=e.pinchStartScale,r=e.pinchStartDistance,o=e.setup,s=o.maxScale,a=o.minScale,u=o.zoomAnimation,d=o.disablePadding,f=u.size,h=u.disabled;if(!n||r===null||!t)throw new Error("Pinch touches distance was not provided");if(t<0)return e.transformState.scale;var m=t/r,v=m*n;return Zu(ts(v,2),a,s,f,!h&&!d)},jY=160,EY=100,IY=function(e,t){var n=e.props,r=n.onWheelStart,o=n.onZoomStart;e.wheelStopEventTimer||(Hs(e),Jn(Nn(e),t,r),Jn(Nn(e),t,o))},OY=function(e,t){var n=e.props,r=n.onWheel,o=n.onZoom,s=e.contentComponent,a=e.setup,u=e.transformState,d=u.scale,f=a.limitToBounds,h=a.centerZoomedOut,m=a.zoomAnimation,v=a.wheel,b=a.disablePadding,w=m.size,C=m.disabled,S=v.step;if(!s)throw new Error("Component not mounted");t.preventDefault(),t.stopPropagation();var P=xY(t,null),k=SY(e,P,S,!t.ctrlKey);if(d!==k){var j=nc(e,k),E=Qj(t,s,d),I=C||w===0||h||b,O=f&&I,R=qh(e,E.x,E.y,k,j,O),M=R.x,A=R.y;e.previousWheelEvent=t,e.setTransformState(k,M,A),Jn(Nn(e),t,r),Jn(Nn(e),t,o)}},RY=function(e,t){var n=e.props,r=n.onWheelStop,o=n.onZoomStop;p0(e.wheelAnimationTimer),e.wheelAnimationTimer=setTimeout(function(){e.mounted&&(Uj(e,t.x,t.y),e.wheelAnimationTimer=null)},EY);var s=wY(e,t);s&&(p0(e.wheelStopEventTimer),e.wheelStopEventTimer=setTimeout(function(){e.mounted&&(e.wheelStopEventTimer=null,Jn(Nn(e),t,r),Jn(Nn(e),t,o))},jY))},MY=function(e,t){var n=Zj(t);e.pinchStartDistance=n,e.lastDistance=n,e.pinchStartScale=e.transformState.scale,e.isPanning=!1,Hs(e)},TY=function(e,t){var n=e.contentComponent,r=e.pinchStartDistance,o=e.transformState.scale,s=e.setup,a=s.limitToBounds,u=s.centerZoomedOut,d=s.zoomAnimation,f=d.disabled,h=d.size;if(!(r===null||!n)){var m=kY(t,o,n);if(!(!Number.isFinite(m.x)||!Number.isFinite(m.y))){var v=Zj(t),b=_Y(e,v);if(b!==o){var w=nc(e,b),C=f||h===0||u,S=a&&C,P=qh(e,m.x,m.y,b,w,S),k=P.x,j=P.y;e.pinchMidpoint=m,e.lastDistance=v,e.setTransformState(b,k,j)}}}},DY=function(e){var t=e.pinchMidpoint;e.velocity=null,e.lastDistance=null,e.pinchMidpoint=null,e.pinchStartScale=null,e.pinchStartDistance=null,Uj(e,t==null?void 0:t.x,t==null?void 0:t.y)},Jj=function(e,t){var n=e.props.onZoomStop,r=e.setup.doubleClick.animationTime;p0(e.doubleClickStopEventTimer),e.doubleClickStopEventTimer=setTimeout(function(){e.doubleClickStopEventTimer=null,Jn(Nn(e),t,n)},r)},AY=function(e,t){var n=e.props,r=n.onZoomStart,o=n.onZoom,s=e.setup.doubleClick,a=s.animationTime,u=s.animationType;Jn(Nn(e),t,r),Yj(e,a,u,function(){return Jn(Nn(e),t,o)}),Jj(e,t)};function NY(e,t){var n=e.setup,r=e.doubleClickStopEventTimer,o=e.transformState,s=e.contentComponent,a=o.scale,u=e.props,d=u.onZoomStart,f=u.onZoom,h=n.doubleClick,m=h.disabled,v=h.mode,b=h.step,w=h.animationTime,C=h.animationType;if(!m&&!r){if(v==="reset")return AY(e,t);if(!s)return console.error("No ContentComponent found");var S=v==="zoomOut"?-1:1,P=qj(e,S,b);if(a!==P){Jn(Nn(e),t,d);var k=Qj(t,s,a),j=hy(e,P,k.x,k.y);if(!j)return console.error("Error during zoom event. New transformation state was not calculated.");Jn(Nn(e),t,f),di(e,j,w,C),Jj(e,t)}}}var zY=function(e,t){var n=e.isInitialized,r=e.setup,o=e.wrapperComponent,s=r.doubleClick,a=s.disabled,u=s.excluded,d=t.target,f=o==null?void 0:o.contains(d),h=n&&d&&f&&!a;if(!h)return!1;var m=Kh(d,u);return!m},$Y=function(){function e(t){var n=this;this.mounted=!0,this.onChangeCallbacks=new Set,this.onInitCallbacks=new Set,this.wrapperComponent=null,this.contentComponent=null,this.isInitialized=!1,this.bounds=null,this.previousWheelEvent=null,this.wheelStopEventTimer=null,this.wheelAnimationTimer=null,this.isPanning=!1,this.startCoords=null,this.lastTouch=null,this.distance=null,this.lastDistance=null,this.pinchStartDistance=null,this.pinchStartScale=null,this.pinchMidpoint=null,this.doubleClickStopEventTimer=null,this.velocity=null,this.velocityTime=null,this.lastMousePosition=null,this.animate=!1,this.animation=null,this.maxBounds=null,this.pressedKeys={},this.mount=function(){n.initializeWindowEvents()},this.unmount=function(){n.cleanupWindowEvents()},this.update=function(r){nc(n,n.transformState.scale),n.setup=$C(r)},this.initializeWindowEvents=function(){var r,o=ev(),s=(r=n.wrapperComponent)===null||r===void 0?void 0:r.ownerDocument,a=s==null?void 0:s.defaultView;a==null||a.addEventListener("mousedown",n.onPanningStart,o),a==null||a.addEventListener("mousemove",n.onPanning,o),a==null||a.addEventListener("mouseup",n.onPanningStop,o),s==null||s.addEventListener("mouseleave",n.clearPanning,o),a==null||a.addEventListener("keyup",n.setKeyUnPressed,o),a==null||a.addEventListener("keydown",n.setKeyPressed,o)},this.cleanupWindowEvents=function(){var r,o,s=ev(),a=(r=n.wrapperComponent)===null||r===void 0?void 0:r.ownerDocument,u=a==null?void 0:a.defaultView;u==null||u.removeEventListener("mousedown",n.onPanningStart,s),u==null||u.removeEventListener("mousemove",n.onPanning,s),u==null||u.removeEventListener("mouseup",n.onPanningStop,s),a==null||a.removeEventListener("mouseleave",n.clearPanning,s),u==null||u.removeEventListener("keyup",n.setKeyUnPressed,s),u==null||u.removeEventListener("keydown",n.setKeyPressed,s),document.removeEventListener("mouseleave",n.clearPanning,s),Hs(n),(o=n.observer)===null||o===void 0||o.disconnect()},this.handleInitializeWrapperEvents=function(r){var o=ev();r.addEventListener("wheel",n.onWheelZoom,o),r.addEventListener("dblclick",n.onDoubleClick,o),r.addEventListener("touchstart",n.onTouchPanningStart,o),r.addEventListener("touchmove",n.onTouchPanning,o),r.addEventListener("touchend",n.onTouchPanningStop,o)},this.handleInitialize=function(r){var o=n.setup.centerOnInit;n.applyTransformation(),n.onInitCallbacks.forEach(function(s){return s(Nn(n))}),o&&(n.setCenter(),n.observer=new ResizeObserver(function(){var s;n.onInitCallbacks.forEach(function(a){return a(Nn(n))}),n.setCenter(),(s=n.observer)===null||s===void 0||s.disconnect()}),n.observer.observe(r))},this.onWheelZoom=function(r){var o=n.setup.disabled;if(!o){var s=yY(n,r);if(s){var a=n.isPressingKeys(n.setup.wheel.activationKeys);a&&(IY(n,r),OY(n,r),RY(n,r))}}},this.onPanningStart=function(r){var o=n.setup.disabled,s=n.props.onPanningStart;if(!o){var a=MC(n,r);if(a){var u=n.isPressingKeys(n.setup.panning.activationKeys);u&&(r.preventDefault(),r.stopPropagation(),Hs(n),AC(n,r),Jn(Nn(n),r,s))}}},this.onPanning=function(r){var o=n.setup.disabled,s=n.props.onPanning;if(!o){var a=TC(n);if(a){var u=n.isPressingKeys(n.setup.panning.activationKeys);u&&(r.preventDefault(),r.stopPropagation(),NC(n,r.clientX,r.clientY),Jn(Nn(n),r,s))}}},this.onPanningStop=function(r){var o=n.props.onPanningStop;n.isPanning&&(aY(n),Jn(Nn(n),r,o))},this.onPinchStart=function(r){var o=n.setup.disabled,s=n.props,a=s.onPinchingStart,u=s.onZoomStart;if(!o){var d=CY(n,r);d&&(MY(n,r),Hs(n),Jn(Nn(n),r,a),Jn(Nn(n),r,u))}},this.onPinch=function(r){var o=n.setup.disabled,s=n.props,a=s.onPinching,u=s.onZoom;if(!o){var d=PY(n);d&&(r.preventDefault(),r.stopPropagation(),TY(n,r),Jn(Nn(n),r,a),Jn(Nn(n),r,u))}},this.onPinchStop=function(r){var o=n.props,s=o.onPinchingStop,a=o.onZoomStop;n.pinchStartScale&&(DY(n),Jn(Nn(n),r,s),Jn(Nn(n),r,a))},this.onTouchPanningStart=function(r){var o=n.setup.disabled,s=n.props.onPanningStart;if(!o){var a=MC(n,r);if(a){var u=n.lastTouch&&+new Date-n.lastTouch<200;if(u&&r.touches.length===1)n.onDoubleClick(r);else{n.lastTouch=+new Date,Hs(n);var d=r.touches,f=d.length===1,h=d.length===2;f&&(Hs(n),AC(n,r),Jn(Nn(n),r,s)),h&&n.onPinchStart(r)}}}},this.onTouchPanning=function(r){var o=n.setup.disabled,s=n.props.onPanning;if(n.isPanning&&r.touches.length===1){if(o)return;var a=TC(n);if(!a)return;r.preventDefault(),r.stopPropagation();var u=r.touches[0];NC(n,u.clientX,u.clientY),Jn(Nn(n),r,s)}else r.touches.length>1&&n.onPinch(r)},this.onTouchPanningStop=function(r){n.onPanningStop(r),n.onPinchStop(r)},this.onDoubleClick=function(r){var o=n.setup.disabled;if(!o){var s=zY(n,r);s&&NY(n,r)}},this.clearPanning=function(r){n.isPanning&&n.onPanningStop(r)},this.setKeyPressed=function(r){n.pressedKeys[r.key]=!0},this.setKeyUnPressed=function(r){n.pressedKeys[r.key]=!1},this.isPressingKeys=function(r){return r.length?!!r.find(function(o){return n.pressedKeys[o]}):!0},this.setTransformState=function(r,o,s){var a=n.props.onTransformed;if(!Number.isNaN(r)&&!Number.isNaN(o)&&!Number.isNaN(s)){r!==n.transformState.scale&&(n.transformState.previousScale=n.transformState.scale,n.transformState.scale=r),n.transformState.positionX=o,n.transformState.positionY=s,n.applyTransformation();var u=Nn(n);n.onChangeCallbacks.forEach(function(d){return d(u)}),Jn(u,{scale:r,positionX:o,positionY:s},a)}else console.error("Detected NaN set state values")},this.setCenter=function(){if(n.wrapperComponent&&n.contentComponent){var r=Xj(n.transformState.scale,n.wrapperComponent,n.contentComponent);n.setTransformState(r.scale,r.positionX,r.positionY)}},this.handleTransformStyles=function(r,o,s){return n.props.customTransform?n.props.customTransform(r,o,s):gY(r,o,s)},this.applyTransformation=function(){if(!(!n.mounted||!n.contentComponent)){var r=n.transformState,o=r.scale,s=r.positionX,a=r.positionY,u=n.handleTransformStyles(s,a,o);n.contentComponent.style.transform=u}},this.getContext=function(){return Nn(n)},this.onChange=function(r){return n.onChangeCallbacks.has(r)||n.onChangeCallbacks.add(r),function(){n.onChangeCallbacks.delete(r)}},this.onInit=function(r){return n.onInitCallbacks.has(r)||n.onInitCallbacks.add(r),function(){n.onInitCallbacks.delete(r)}},this.init=function(r,o){n.cleanupWindowEvents(),n.wrapperComponent=r,n.contentComponent=o,nc(n,n.transformState.scale),n.handleInitializeWrapperEvents(r),n.handleInitialize(o),n.initializeWindowEvents(),n.isInitialized=!0;var s=Nn(n);Jn(s,void 0,n.props.onInit)},this.props=t,this.setup=$C(this.props),this.transformState=Gj(this.props)}return e}(),Yh=z.createContext(null),LY=function(e,t){return typeof e=="function"?e(t):e},FY=z.forwardRef(function(e,t){var n=p.useRef(new $Y(e)).current,r=LY(e.children,f0(n));return p.useImperativeHandle(t,function(){return f0(n)},[n]),p.useEffect(function(){n.update(e)},[n,e]),z.createElement(Yh.Provider,{value:n},r)});z.forwardRef(function(e,t){var n=p.useRef(null),r=p.useContext(Yh);return p.useEffect(function(){return r.onChange(function(o){if(n.current){var s=0,a=0;n.current.style.transform=r.handleTransformStyles(s,a,1/o.instance.transformState.scale)}})},[r]),z.createElement("div",Za({},e,{ref:vY([n,t])}))});function BY(e,t){t===void 0&&(t={});var n=t.insertAt;if(!(!e||typeof document>"u")){var r=document.head||document.getElementsByTagName("head")[0],o=document.createElement("style");o.type="text/css",n==="top"&&r.firstChild?r.insertBefore(o,r.firstChild):r.appendChild(o),o.styleSheet?o.styleSheet.cssText=e:o.appendChild(document.createTextNode(e))}}var HY=`.transform-component-module_wrapper__SPB86 { + position: relative; + width: -moz-fit-content; + width: fit-content; + height: -moz-fit-content; + height: fit-content; + overflow: hidden; + -webkit-touch-callout: none; /* iOS Safari */ + -webkit-user-select: none; /* Safari */ + -khtml-user-select: none; /* Konqueror HTML */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* Internet Explorer/Edge */ + user-select: none; + margin: 0; + padding: 0; +} +.transform-component-module_content__FBWxo { + display: flex; + flex-wrap: wrap; + width: -moz-fit-content; + width: fit-content; + height: -moz-fit-content; + height: fit-content; + margin: 0; + padding: 0; + transform-origin: 0% 0%; +} +.transform-component-module_content__FBWxo img { + pointer-events: none; +} +`,LC={wrapper:"transform-component-module_wrapper__SPB86",content:"transform-component-module_content__FBWxo"};BY(HY);var WY=function(e){var t=e.children,n=e.wrapperClass,r=n===void 0?"":n,o=e.contentClass,s=o===void 0?"":o,a=e.wrapperStyle,u=e.contentStyle,d=e.wrapperProps,f=d===void 0?{}:d,h=e.contentProps,m=h===void 0?{}:h,v=p.useContext(Yh).init,b=p.useRef(null),w=p.useRef(null);return p.useEffect(function(){var C=b.current,S=w.current;C!==null&&S!==null&&v&&v(C,S)},[]),z.createElement("div",Za({},f,{ref:b,className:"react-transform-wrapper ".concat(LC.wrapper," ").concat(r),style:a}),z.createElement("div",Za({},m,{ref:w,className:"react-transform-component ".concat(LC.content," ").concat(s),style:u}),t))},eE=function(){var e=p.useContext(Yh);if(!e)throw new Error("Transform context must be placed inside TransformWrapper");return e};const FC=1.5,my="28rem",VY=()=>{const[e,t]=p.useState(0),[n,r]=p.useState(1),[o,s]=p.useState(1);return{rotation:e,scaleX:n,scaleY:o,flipHorizontally:()=>{r(n*-1)},flipVertically:()=>{s(o*-1)},rotateCounterClockwise:()=>{t(e===-270?0:e-90)},rotateClockwise:()=>{t(e===270?0:e+90)},reset:()=>{t(0),r(1),s(1)}}};function UY(e){return st({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"}},{tag:"path",attr:{d:"M16.5 9c-.42 0-.83.04-1.24.11L1.01 3 1 10l9 2-9 2 .01 7 8.07-3.46C9.59 21.19 12.71 24 16.5 24c4.14 0 7.5-3.36 7.5-7.5S20.64 9 16.5 9zm0 13c-3.03 0-5.5-2.47-5.5-5.5s2.47-5.5 5.5-5.5 5.5 2.47 5.5 5.5-2.47 5.5-5.5 5.5z"}},{tag:"path",attr:{d:"M18.27 14.03l-1.77 1.76-1.77-1.76-.7.7 1.76 1.77-1.76 1.77.7.7 1.77-1.76 1.77 1.76.7-.7-1.76-1.77 1.76-1.77z"}}]})(e)}function GY(e){return st({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"}},{tag:"path",attr:{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58a.49.49 0 00.12-.61l-1.92-3.32a.488.488 0 00-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54a.484.484 0 00-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58a.49.49 0 00-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61l-2.01-1.58zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6z"}}]})(e)}function qY(e){return st({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"}},{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"}},{tag:"path",attr:{d:"M17 16l-4-4V8.82C14.16 8.4 15 7.3 15 6c0-1.66-1.34-3-3-3S9 4.34 9 6c0 1.3.84 2.4 2 2.82V12l-4 4H3v5h5v-3.05l4-4.2 4 4.2V21h5v-5h-4z"}}]})(e)}function BC(e){return st({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"}},{tag:"path",attr:{d:"M15 21h2v-2h-2v2zm4-12h2V7h-2v2zM3 5v14c0 1.1.9 2 2 2h4v-2H5V5h4V3H5c-1.1 0-2 .9-2 2zm16-2v2h2c0-1.1-.9-2-2-2zm-8 20h2V1h-2v22zm8-6h2v-2h-2v2zM15 5h2V3h-2v2zm4 8h2v-2h-2v2zm0 8c1.1 0 2-.9 2-2h-2v2z"}}]})(e)}function KY(e){return st({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"}},{tag:"path",attr:{d:"M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 20H4v-4h4v4zm0-6H4v-4h4v4zm0-6H4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4z"}}]})(e)}function YY(e){return st({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"}},{tag:"path",attr:{d:"M22 16V4c0-1.1-.9-2-2-2H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2zm-11-4l2.03 2.71L16 11l4 5H8l3-4zM2 6v14c0 1.1.9 2 2 2h14v-2H4V6H2z"}}]})(e)}function XY(e){return st({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0z"}},{tag:"path",attr:{d:"M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"}}]})(e)}function QY(e){return st({tag:"svg",attr:{viewBox:"0 0 24 24"},child:[{tag:"path",attr:{fill:"none",d:"M0 0h24v24H0V0z"}},{tag:"path",attr:{d:"M16 17.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3L5 6.99h3V14h2V6.99h3L9 3zm7 14.01V10h-2v7.01h-3L15 21l4-3.99h-3zM9 3L5 6.99h3V14h2V6.99h3L9 3z"}}]})(e)}const ZY=({flipHorizontally:e,flipVertically:t,rotateCounterClockwise:n,rotateClockwise:r,reset:o})=>{const{zoomIn:s,zoomOut:a,resetTransform:u}=eE(),{t:d}=me();return i.jsxs(gr,{isAttached:!0,orientation:"vertical",children:[i.jsx(Ie,{icon:i.jsx(a8,{}),"aria-label":d("accessibility.zoomIn"),tooltip:d("accessibility.zoomIn"),onClick:()=>s(),fontSize:20}),i.jsx(Ie,{icon:i.jsx(i8,{}),"aria-label":d("accessibility.zoomOut"),tooltip:d("accessibility.zoomOut"),onClick:()=>a(),fontSize:20}),i.jsx(Ie,{icon:i.jsx(l8,{}),"aria-label":d("accessibility.rotateCounterClockwise"),tooltip:d("accessibility.rotateCounterClockwise"),onClick:n,fontSize:20}),i.jsx(Ie,{icon:i.jsx(c8,{}),"aria-label":d("accessibility.rotateClockwise"),tooltip:d("accessibility.rotateClockwise"),onClick:r,fontSize:20}),i.jsx(Ie,{icon:i.jsx(BC,{}),"aria-label":d("accessibility.flipHorizontally"),tooltip:d("accessibility.flipHorizontally"),onClick:e,fontSize:20}),i.jsx(Ie,{icon:i.jsx(BC,{style:{transform:"rotate(90deg)"}}),"aria-label":d("accessibility.flipVertically"),tooltip:d("accessibility.flipVertically"),onClick:t,fontSize:20}),i.jsx(Ie,{icon:i.jsx(u8,{}),"aria-label":d("accessibility.reset"),tooltip:d("accessibility.reset"),onClick:()=>{u(),o()},fontSize:20})]})};function JY({image:e,alt:t,ref:n,styleClass:r,rotation:o,scaleX:s,scaleY:a}){const{centerView:u}=eE();return i.jsx(WY,{wrapperStyle:{width:"100%",height:"100%"},children:i.jsx("img",{style:{transform:`rotate(${o}deg) scaleX(${s}) scaleY(${a})`,width:"100%"},src:e.image_url,alt:t,ref:n,className:r||"",onLoad:()=>u(1,0,"easeOut")})})}const eX=Pe([mP,So],(e,t)=>{const{currentImage:n}=e,{shouldShowImageDetails:r}=t;return{viewerImageToDisplay:n,shouldShowImageDetails:r}},{memoizeOptions:{resultEqualityCheck:Wt}});function tX(){const e=re(),t=B(v=>v.lightbox.isLightboxOpen),{rotation:n,scaleX:r,scaleY:o,flipHorizontally:s,flipVertically:a,rotateCounterClockwise:u,rotateClockwise:d,reset:f}=VY(),{viewerImageToDisplay:h,shouldShowImageDetails:m}=B(eX);return Ge("Esc",()=>{t&&e(mu(!1))},[t]),i.jsx(Ao,{children:t&&i.jsx(bo.div,{initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.15,ease:"easeInOut"},style:{display:"flex",width:"100vw",height:`calc(100vh - ${FC*4}px)`,position:"fixed",top:`${FC*4}px`,background:"var(--invokeai-colors-base-900)",zIndex:99},children:i.jsxs(FY,{centerOnInit:!0,minScale:.1,initialPositionX:50,initialPositionY:50,children:[i.jsxs(H,{sx:{flexDir:"column",position:"absolute",insetInlineStart:4,gap:4,zIndex:3,top:4},children:[i.jsx(Ie,{icon:i.jsx(d8,{}),"aria-label":"Exit Viewer",className:"lightbox-close-btn",onClick:()=>{e(mu(!1))},fontSize:20}),i.jsx(ZY,{flipHorizontally:s,flipVertically:a,rotateCounterClockwise:u,rotateClockwise:d,reset:f})]}),i.jsx(H,{sx:{position:"absolute",top:4,zIndex:3,insetInlineStart:"50%",transform:"translate(-50%, 0)"},children:i.jsx($j,{})}),h&&i.jsxs(i.Fragment,{children:[i.jsx(JY,{rotation:n,scaleX:r,scaleY:o,image:h,styleClass:"lightbox-image"}),m&&i.jsx(Lj,{image:h}),!m&&i.jsx(qe,{sx:{position:"absolute",top:0,insetInlineStart:0,w:"100vw",h:"100vh",px:16,pointerEvents:"none"},children:i.jsx(Fj,{})})]})]})},"lightbox")})}function HC(e){for(var t=[],n=1;n{const{isConnected:t,isProcessing:n,statusTranslationKey:r,currentIteration:o,totalIterations:s,currentStatusHasSteps:a}=e;return{isConnected:t,isProcessing:n,currentIteration:o,totalIterations:s,statusTranslationKey:r,currentStatusHasSteps:a}},Et),VC={ok:"green.400",working:"yellow.400",error:"red.400"},UC={ok:"green.600",working:"yellow.500",error:"red.500"},iX=()=>{const{isConnected:e,isProcessing:t,currentIteration:n,totalIterations:r,statusTranslationKey:o}=B(aX),{t:s}=me(),a=p.useRef(null),u=p.useMemo(()=>t?"working":e?"ok":"error",[t,e]),d=p.useMemo(()=>{if(n&&r)return` (${n}/${r})`},[n,r]),f=tE(a);return i.jsxs(H,{ref:a,h:"full",px:2,alignItems:"center",gap:5,children:[i.jsx(Ao,{children:f&&i.jsx(bo.div,{initial:{opacity:0},animate:{opacity:1,transition:{duration:.15}},exit:{opacity:0,transition:{delay:.8}},children:i.jsxs(Ue,{sx:{fontSize:"sm",fontWeight:"600",pb:"1px",userSelect:"none",color:UC[u],_dark:{color:VC[u]}},children:[s(o),d]})},"statusText")}),i.jsx(mo,{as:_z,sx:{boxSize:"0.5rem",color:UC[u],_dark:{color:VC[u]}}})]})},lX=()=>{const{colorMode:e,toggleColorMode:t}=xo(),{t:n}=me();return i.jsx(Ie,{"aria-label":n(e==="dark"?"common.lightMode":"common.darkMode"),tooltip:n(e==="dark"?"common.lightMode":"common.darkMode"),size:"sm",icon:e==="dark"?i.jsx(Kz,{fontSize:19}):i.jsx(Bz,{fontSize:18}),onClick:t,variant:"link"})};function cX(e){const{title:t,hotkey:n,description:r}=e;return i.jsxs(ma,{sx:{gridTemplateColumns:"auto max-content",justifyContent:"space-between",alignItems:"center"},children:[i.jsxs(ma,{children:[i.jsx(Ue,{fontWeight:600,children:t}),r&&i.jsx(Ue,{sx:{fontSize:"sm"},variant:"subtext",children:r})]}),i.jsx(qe,{sx:{fontSize:"sm",fontWeight:600,px:2,py:1},children:n})]})}function uX({children:e}){const{isOpen:t,onOpen:n,onClose:r}=Ja(),{t:o}=me(),s=[{title:o("hotkeys.invoke.title"),desc:o("hotkeys.invoke.desc"),hotkey:"Ctrl+Enter"},{title:o("hotkeys.cancel.title"),desc:o("hotkeys.cancel.desc"),hotkey:"Shift+X"},{title:o("hotkeys.focusPrompt.title"),desc:o("hotkeys.focusPrompt.desc"),hotkey:"Alt+A"},{title:o("hotkeys.toggleOptions.title"),desc:o("hotkeys.toggleOptions.desc"),hotkey:"O"},{title:o("hotkeys.pinOptions.title"),desc:o("hotkeys.pinOptions.desc"),hotkey:"Shift+O"},{title:o("hotkeys.toggleViewer.title"),desc:o("hotkeys.toggleViewer.desc"),hotkey:"Z"},{title:o("hotkeys.toggleGallery.title"),desc:o("hotkeys.toggleGallery.desc"),hotkey:"G"},{title:o("hotkeys.maximizeWorkSpace.title"),desc:o("hotkeys.maximizeWorkSpace.desc"),hotkey:"F"},{title:o("hotkeys.changeTabs.title"),desc:o("hotkeys.changeTabs.desc"),hotkey:"1-5"},{title:o("hotkeys.consoleToggle.title"),desc:o("hotkeys.consoleToggle.desc"),hotkey:"`"}],a=[{title:o("hotkeys.setPrompt.title"),desc:o("hotkeys.setPrompt.desc"),hotkey:"P"},{title:o("hotkeys.setSeed.title"),desc:o("hotkeys.setSeed.desc"),hotkey:"S"},{title:o("hotkeys.setParameters.title"),desc:o("hotkeys.setParameters.desc"),hotkey:"A"},{title:o("hotkeys.restoreFaces.title"),desc:o("hotkeys.restoreFaces.desc"),hotkey:"Shift+R"},{title:o("hotkeys.upscale.title"),desc:o("hotkeys.upscale.desc"),hotkey:"Shift+U"},{title:o("hotkeys.showInfo.title"),desc:o("hotkeys.showInfo.desc"),hotkey:"I"},{title:o("hotkeys.sendToImageToImage.title"),desc:o("hotkeys.sendToImageToImage.desc"),hotkey:"Shift+I"},{title:o("hotkeys.deleteImage.title"),desc:o("hotkeys.deleteImage.desc"),hotkey:"Del"},{title:o("hotkeys.closePanels.title"),desc:o("hotkeys.closePanels.desc"),hotkey:"Esc"}],u=[{title:o("hotkeys.previousImage.title"),desc:o("hotkeys.previousImage.desc"),hotkey:"Arrow Left"},{title:o("hotkeys.nextImage.title"),desc:o("hotkeys.nextImage.desc"),hotkey:"Arrow Right"},{title:o("hotkeys.toggleGalleryPin.title"),desc:o("hotkeys.toggleGalleryPin.desc"),hotkey:"Shift+G"},{title:o("hotkeys.increaseGalleryThumbSize.title"),desc:o("hotkeys.increaseGalleryThumbSize.desc"),hotkey:"Shift+Up"},{title:o("hotkeys.decreaseGalleryThumbSize.title"),desc:o("hotkeys.decreaseGalleryThumbSize.desc"),hotkey:"Shift+Down"}],d=[{title:o("hotkeys.selectBrush.title"),desc:o("hotkeys.selectBrush.desc"),hotkey:"B"},{title:o("hotkeys.selectEraser.title"),desc:o("hotkeys.selectEraser.desc"),hotkey:"E"},{title:o("hotkeys.decreaseBrushSize.title"),desc:o("hotkeys.decreaseBrushSize.desc"),hotkey:"["},{title:o("hotkeys.increaseBrushSize.title"),desc:o("hotkeys.increaseBrushSize.desc"),hotkey:"]"},{title:o("hotkeys.decreaseBrushOpacity.title"),desc:o("hotkeys.decreaseBrushOpacity.desc"),hotkey:"Shift + ["},{title:o("hotkeys.increaseBrushOpacity.title"),desc:o("hotkeys.increaseBrushOpacity.desc"),hotkey:"Shift + ]"},{title:o("hotkeys.moveTool.title"),desc:o("hotkeys.moveTool.desc"),hotkey:"V"},{title:o("hotkeys.fillBoundingBox.title"),desc:o("hotkeys.fillBoundingBox.desc"),hotkey:"Shift + F"},{title:o("hotkeys.eraseBoundingBox.title"),desc:o("hotkeys.eraseBoundingBox.desc"),hotkey:"Delete / Backspace"},{title:o("hotkeys.colorPicker.title"),desc:o("hotkeys.colorPicker.desc"),hotkey:"C"},{title:o("hotkeys.toggleSnap.title"),desc:o("hotkeys.toggleSnap.desc"),hotkey:"N"},{title:o("hotkeys.quickToggleMove.title"),desc:o("hotkeys.quickToggleMove.desc"),hotkey:"Hold Space"},{title:o("hotkeys.toggleLayer.title"),desc:o("hotkeys.toggleLayer.desc"),hotkey:"Q"},{title:o("hotkeys.clearMask.title"),desc:o("hotkeys.clearMask.desc"),hotkey:"Shift+C"},{title:o("hotkeys.hideMask.title"),desc:o("hotkeys.hideMask.desc"),hotkey:"H"},{title:o("hotkeys.showHideBoundingBox.title"),desc:o("hotkeys.showHideBoundingBox.desc"),hotkey:"Shift+H"},{title:o("hotkeys.mergeVisible.title"),desc:o("hotkeys.mergeVisible.desc"),hotkey:"Shift+M"},{title:o("hotkeys.saveToGallery.title"),desc:o("hotkeys.saveToGallery.desc"),hotkey:"Shift+S"},{title:o("hotkeys.copyToClipboard.title"),desc:o("hotkeys.copyToClipboard.desc"),hotkey:"Ctrl+C"},{title:o("hotkeys.downloadImage.title"),desc:o("hotkeys.downloadImage.desc"),hotkey:"Shift+D"},{title:o("hotkeys.undoStroke.title"),desc:o("hotkeys.undoStroke.desc"),hotkey:"Ctrl+Z"},{title:o("hotkeys.redoStroke.title"),desc:o("hotkeys.redoStroke.desc"),hotkey:"Ctrl+Shift+Z, Ctrl+Y"},{title:o("hotkeys.resetView.title"),desc:o("hotkeys.resetView.desc"),hotkey:"R"},{title:o("hotkeys.previousStagingImage.title"),desc:o("hotkeys.previousStagingImage.desc"),hotkey:"Arrow Left"},{title:o("hotkeys.nextStagingImage.title"),desc:o("hotkeys.nextStagingImage.desc"),hotkey:"Arrow Right"},{title:o("hotkeys.acceptStagingImage.title"),desc:o("hotkeys.acceptStagingImage.desc"),hotkey:"Enter"}],f=h=>i.jsx(H,{flexDir:"column",gap:4,children:h.map((m,v)=>i.jsxs(H,{flexDir:"column",px:2,gap:4,children:[i.jsx(cX,{title:m.title,description:m.desc,hotkey:m.hotkey}),v({getAppVersion:e.query({query:()=>({url:"app/version",method:"GET"})})})}),{useGetAppVersionQuery:fX}=dX,nE=()=>{const{data:e}=fX(),t=p.useRef(null),n=tE(t);return i.jsxs(H,{alignItems:"center",gap:3,ps:1,ref:t,children:[i.jsx(Nu,{src:f8,alt:"invoke-ai-logo",sx:{w:"32px",h:"32px",minW:"32px",minH:"32px",userSelect:"none"}}),i.jsxs(H,{sx:{gap:3,alignItems:"center"},children:[i.jsxs(Ue,{sx:{fontSize:"xl",userSelect:"none"},children:["invoke ",i.jsx("strong",{children:"ai"})]}),i.jsx(Ao,{children:n&&e&&i.jsx(bo.div,{initial:{opacity:0},animate:{opacity:1,transition:{duration:.15}},exit:{opacity:0,transition:{delay:.8}},children:i.jsx(Ue,{sx:{fontWeight:600,marginTop:1,color:"base.300",fontSize:14},variant:"subtext",children:e.version})},"statusText")})]})]})},pX={ar:Pr.t("common.langArabic",{lng:"ar"}),nl:Pr.t("common.langDutch",{lng:"nl"}),en:Pr.t("common.langEnglish",{lng:"en"}),fr:Pr.t("common.langFrench",{lng:"fr"}),de:Pr.t("common.langGerman",{lng:"de"}),he:Pr.t("common.langHebrew",{lng:"he"}),it:Pr.t("common.langItalian",{lng:"it"}),ja:Pr.t("common.langJapanese",{lng:"ja"}),ko:Pr.t("common.langKorean",{lng:"ko"}),pl:Pr.t("common.langPolish",{lng:"pl"}),pt_BR:Pr.t("common.langBrPortuguese",{lng:"pt_BR"}),pt:Pr.t("common.langPortuguese",{lng:"pt"}),ru:Pr.t("common.langRussian",{lng:"ru"}),zh_CN:Pr.t("common.langSimplifiedChinese",{lng:"zh_CN"}),es:Pr.t("common.langSpanish",{lng:"es"}),uk:Pr.t("common.langUkranian",{lng:"ua"})};function hX(){const{t:e}=me(),t=re(),n=B(j3);return i.jsxs(gh,{closeOnSelect:!1,children:[i.jsx(Gn,{label:e("common.languagePickerLabel"),hasArrow:!0,children:i.jsx(vh,{as:Ka,icon:i.jsx(ML,{}),variant:"link","aria-label":e("common.languagePickerLabel"),fontSize:22,minWidth:8})}),i.jsx(Vu,{children:i.jsx(c1,{value:n,children:Ks(pX,(r,o)=>i.jsx(bu,{value:o,onClick:()=>t(p8(o)),children:r},o))})})]})}const mX=e=>{const{searchable:t=!0,tooltip:n,inputRef:r,...o}=e,s=re(),{base50:a,base100:u,base200:d,base300:f,base400:h,base500:m,base600:v,base700:b,base800:w,base900:C,accent200:S,accent300:P,accent400:k,accent500:j,accent600:E}=zj(),[I]=Ji("shadows",["dark-lg"]),{colorMode:O}=xo(),R=p.useCallback(A=>{A.shiftKey&&s(os(!0))},[s]),M=p.useCallback(A=>{A.shiftKey||s(os(!1))},[s]);return i.jsx(Gn,{label:n,placement:"top",hasArrow:!0,isOpen:!0,children:i.jsx(Tj,{ref:r,onKeyDown:R,onKeyUp:M,searchable:t,maxDropdownHeight:300,styles:()=>({label:{color:Me(b,f)(O),fontWeight:"normal"},searchInput:{":placeholder":{color:Me(f,b)(O)}},input:{backgroundColor:Me(a,C)(O),borderWidth:"2px",borderColor:Me(d,w)(O),color:Me(C,u)(O),paddingRight:24,fontWeight:600,"&:hover":{borderColor:Me(f,v)(O)},"&:focus":{borderColor:Me(P,E)(O)},"&:is(:focus, :hover)":{borderColor:Me(h,m)(O)},"&:focus-within":{borderColor:Me(S,E)(O)},"&[data-disabled]":{backgroundColor:Me(f,b)(O),color:Me(v,h)(O),cursor:"not-allowed"}},value:{backgroundColor:Me(d,w)(O),color:Me(C,u)(O),button:{color:Me(C,u)(O)},"&:hover":{backgroundColor:Me(f,b)(O),cursor:"pointer"}},dropdown:{backgroundColor:Me(d,w)(O),borderColor:Me(d,w)(O),boxShadow:I},item:{backgroundColor:Me(d,w)(O),color:Me(w,d)(O),padding:6,"&[data-hovered]":{color:Me(C,u)(O),backgroundColor:Me(f,b)(O)},"&[data-active]":{backgroundColor:Me(f,b)(O),"&:hover":{color:Me(C,u)(O),backgroundColor:Me(f,b)(O)}},"&[data-selected]":{backgroundColor:Me(k,E)(O),color:Me(a,u)(O),fontWeight:600,"&:hover":{backgroundColor:Me(j,j)(O),color:Me("white",a)(O)}},"&[data-disabled]":{color:Me(m,v)(O),cursor:"not-allowed"}},rightSection:{width:24,padding:20,button:{color:Me(C,u)(O)}}}),...o})})},gX=p.memo(mX),vX=Ks(E3,e=>({value:e,label:I3[e]})).sort((e,t)=>e.label.localeCompare(t.label));function yX(){const e=re(),{t}=me(),n=B(o=>o.ui.favoriteSchedulers),r=p.useCallback(o=>{e(h8(o))},[e]);return i.jsx(gX,{label:t("settings.favoriteSchedulers"),value:n,data:vX,onChange:r,clearable:!0,searchable:!0,maxSelectedValues:99,placeholder:t("settings.favoriteSchedulersPlaceholder")})}const bX=Pe([ao,So],(e,t)=>{const{shouldConfirmOnDelete:n,shouldDisplayGuides:r,enableImageDebugging:o,consoleLogLevel:s,shouldLogToConsole:a,shouldAntialiasProgressImage:u}=e,{shouldUseCanvasBetaLayout:d,shouldUseSliders:f,shouldShowProgressInViewer:h,shouldShowAdvancedOptions:m}=t;return{shouldConfirmOnDelete:n,shouldDisplayGuides:r,enableImageDebugging:o,shouldUseCanvasBetaLayout:d,shouldUseSliders:f,shouldShowProgressInViewer:h,consoleLogLevel:s,shouldLogToConsole:a,shouldAntialiasProgressImage:u,shouldShowAdvancedOptions:m}},{memoizeOptions:{resultEqualityCheck:Wt}}),xX=({children:e,config:t})=>{const n=re(),{t:r}=me(),o=(t==null?void 0:t.shouldShowBetaLayout)??!0,s=(t==null?void 0:t.shouldShowDeveloperSettings)??!0,a=(t==null?void 0:t.shouldShowResetWebUiText)??!0,u=(t==null?void 0:t.shouldShowAdvancedOptionsSettings)??!0;p.useEffect(()=>{s||n(Lx(!1))},[s,n]);const{isOpen:d,onOpen:f,onClose:h}=Ja(),{isOpen:m,onOpen:v,onClose:b}=Ja(),{shouldConfirmOnDelete:w,shouldDisplayGuides:C,enableImageDebugging:S,shouldUseCanvasBetaLayout:P,shouldUseSliders:k,shouldShowProgressInViewer:j,consoleLogLevel:E,shouldLogToConsole:I,shouldAntialiasProgressImage:O,shouldShowAdvancedOptions:R}=B(bX),M=p.useCallback(()=>{Object.keys(window.localStorage).forEach(D=>{(m8.includes(D)||D.startsWith(g8))&&localStorage.removeItem(D)}),h(),v()},[h,v]),A=p.useCallback(D=>{n(v8(D))},[n]),L=p.useCallback(D=>{n(Lx(D.target.checked))},[n]);return i.jsxs(i.Fragment,{children:[p.cloneElement(e,{onClick:f}),i.jsxs(xu,{isOpen:d,onClose:h,size:"xl",isCentered:!0,children:[i.jsx(ni,{}),i.jsxs(Su,{children:[i.jsx(ti,{children:r("common.settingsLabel")}),i.jsx(u1,{}),i.jsx(ri,{children:i.jsxs(H,{sx:{gap:4,flexDirection:"column"},children:[i.jsxs(Kc,{children:[i.jsx(aa,{size:"sm",children:r("settings.general")}),i.jsx(jn,{label:r("settings.confirmOnDelete"),isChecked:w,onChange:D=>n(C3(D.target.checked))}),u&&i.jsx(jn,{label:r("settings.showAdvancedOptions"),isChecked:R,onChange:D=>n(y8(D.target.checked))})]}),i.jsxs(Kc,{children:[i.jsx(aa,{size:"sm",children:r("settings.generation")}),i.jsx(yX,{})]}),i.jsxs(Kc,{children:[i.jsx(aa,{size:"sm",children:r("settings.ui")}),i.jsx(jn,{label:r("settings.displayHelpIcons"),isChecked:C,onChange:D=>n(b8(D.target.checked))}),o&&i.jsx(jn,{label:r("settings.useCanvasBeta"),isChecked:P,onChange:D=>n(x8(D.target.checked))}),i.jsx(jn,{label:r("settings.useSlidersForAll"),isChecked:k,onChange:D=>n(S8(D.target.checked))}),i.jsx(jn,{label:r("settings.showProgressInViewer"),isChecked:j,onChange:D=>n(k3(D.target.checked))}),i.jsx(jn,{label:r("settings.antialiasProgressImages"),isChecked:O,onChange:D=>n(w8(D.target.checked))})]}),s&&i.jsxs(Kc,{children:[i.jsx(aa,{size:"sm",children:r("settings.developer")}),i.jsx(jn,{label:r("settings.shouldLogToConsole"),isChecked:I,onChange:L}),i.jsx(qn,{disabled:!I,label:r("settings.consoleLogLevel"),onChange:A,value:E,data:C8.concat()}),i.jsx(jn,{label:r("settings.enableImageDebugging"),isChecked:S,onChange:D=>n(P8(D.target.checked))})]}),i.jsxs(Kc,{children:[i.jsx(aa,{size:"sm",children:r("settings.resetWebUI")}),i.jsx(Yt,{colorScheme:"error",onClick:M,children:r("settings.resetWebUI")}),a&&i.jsxs(i.Fragment,{children:[i.jsx(Ue,{children:r("settings.resetWebUIDesc1")}),i.jsx(Ue,{children:r("settings.resetWebUIDesc2")})]})]})]})}),i.jsx(ei,{children:i.jsx(Yt,{onClick:h,children:r("common.close")})})]})]}),i.jsxs(xu,{closeOnOverlayClick:!1,isOpen:m,onClose:b,isCentered:!0,children:[i.jsx(ni,{backdropFilter:"blur(40px)"}),i.jsxs(Su,{children:[i.jsx(ti,{}),i.jsx(ri,{children:i.jsx(H,{justifyContent:"center",children:i.jsx(Ue,{fontSize:"lg",children:i.jsx(Ue,{children:r("settings.resetComplete")})})})}),i.jsx(ei,{})]})]})]})},Kc=e=>i.jsx(H,{layerStyle:"second",sx:{flexDirection:"column",gap:2,p:4,borderRadius:"base"},children:e.children}),SX=()=>{const{t:e}=me(),t=cr("localization").isFeatureEnabled,n=cr("bugLink").isFeatureEnabled,r=cr("discordLink").isFeatureEnabled,o=cr("githubLink").isFeatureEnabled;return i.jsxs(H,{sx:{gap:2,alignItems:"center"},children:[i.jsx(nE,{}),i.jsx(li,{}),i.jsx(iX,{}),i.jsx(uX,{children:i.jsx(Ie,{"aria-label":e("common.hotkeysLabel"),tooltip:e("common.hotkeysLabel"),size:"sm",variant:"link","data-variant":"link",fontSize:20,icon:i.jsx(zz,{})})}),t&&i.jsx(hX,{}),n&&i.jsx(Ai,{isExternal:!0,href:"http://github.com/invoke-ai/InvokeAI/issues",marginBottom:"-0.25rem",children:i.jsx(Ie,{"aria-label":e("common.reportBugLabel"),tooltip:e("common.reportBugLabel"),variant:"link","data-variant":"link",fontSize:20,size:"sm",icon:i.jsx(Pz,{})})}),o&&i.jsx(Ai,{isExternal:!0,href:"http://github.com/invoke-ai/InvokeAI",marginBottom:"-0.25rem",children:i.jsx(Ie,{"aria-label":e("common.githubLabel"),tooltip:e("common.githubLabel"),variant:"link","data-variant":"link",fontSize:20,size:"sm",icon:i.jsx(gz,{})})}),r&&i.jsx(Ai,{isExternal:!0,href:"https://discord.gg/ZmtBAhwWhy",marginBottom:"-0.25rem",children:i.jsx(Ie,{"aria-label":e("common.discordLabel"),tooltip:e("common.discordLabel"),variant:"link","data-variant":"link",fontSize:20,size:"sm",icon:i.jsx(mz,{})})}),i.jsx(lX,{}),i.jsx(xX,{children:i.jsx(Ie,{"aria-label":e("common.settingsLabel"),tooltip:e("common.settingsLabel"),variant:"link","data-variant":"link",fontSize:22,size:"sm",icon:i.jsx(GY,{})})})]})},wX=p.memo(SX),CX=Pe(ao,e=>{const{isUploading:t}=e;let n="";return t&&(n="Uploading..."),{tooltip:n,shouldShow:t}}),PX=()=>{const{shouldShow:e,tooltip:t}=B(CX);return e?i.jsx(H,{sx:{alignItems:"center",justifyContent:"center",color:"base.600"},children:i.jsx(Gn,{label:t,placement:"right",hasArrow:!0,children:i.jsx(ai,{})})}):null},kX=p.memo(PX),fi=e=>e.config,{createElement:rc,createContext:_X,forwardRef:rE,useCallback:La,useContext:oE,useEffect:pa,useImperativeHandle:sE,useLayoutEffect:jX,useMemo:EX,useRef:Zo,useState:pu}=L0,GC=L0["useId".toString()],IX=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",Jp=IX?jX:()=>{},OX=typeof GC=="function"?GC:()=>null;let RX=0;function gy(e=null){const t=OX(),n=Zo(e||t||null);return n.current===null&&(n.current=""+RX++),n.current}const Xh=_X(null);Xh.displayName="PanelGroupContext";function aE({children:e=null,className:t="",collapsedSize:n=0,collapsible:r=!1,defaultSize:o=null,forwardedRef:s,id:a=null,maxSize:u=100,minSize:d=10,onCollapse:f=null,onResize:h=null,order:m=null,style:v={},tagName:b="div"}){const w=oE(Xh);if(w===null)throw Error("Panel components must be rendered within a PanelGroup container");const C=gy(a),{collapsePanel:S,expandPanel:P,getPanelStyle:k,registerPanel:j,resizePanel:E,unregisterPanel:I}=w,O=Zo({onCollapse:f,onResize:h});if(pa(()=>{O.current.onCollapse=f,O.current.onResize=h}),d<0||d>100)throw Error(`Panel minSize must be between 0 and 100, but was ${d}`);if(u<0||u>100)throw Error(`Panel maxSize must be between 0 and 100, but was ${u}`);if(o!==null){if(o<0||o>100)throw Error(`Panel defaultSize must be between 0 and 100, but was ${o}`);d>o&&!r&&(console.error(`Panel minSize ${d} cannot be greater than defaultSize ${o}`),o=d)}const R=k(C,o),M=Zo({size:qC(R)}),A=Zo({callbacksRef:O,collapsedSize:n,collapsible:r,defaultSize:o,id:C,maxSize:u,minSize:d,order:m});return Jp(()=>{M.current.size=qC(R),A.current.callbacksRef=O,A.current.collapsedSize=n,A.current.collapsible=r,A.current.defaultSize=o,A.current.id=C,A.current.maxSize=u,A.current.minSize=d,A.current.order=m}),Jp(()=>(j(C,A),()=>{I(C)}),[m,C,j,I]),sE(s,()=>({collapse:()=>S(C),expand:()=>P(C),getCollapsed(){return M.current.size===0},getSize(){return M.current.size},resize:L=>E(C,L)}),[S,P,C,E]),rc(b,{children:e,className:t,"data-panel":"","data-panel-collapsible":r||void 0,"data-panel-id":C,"data-panel-size":parseFloat(""+R.flexGrow).toFixed(1),id:`data-panel-id-${C}`,style:{...R,...v}})}const Eu=rE((e,t)=>rc(aE,{...e,forwardedRef:t}));aE.displayName="Panel";Eu.displayName="forwardRef(Panel)";function qC(e){const{flexGrow:t}=e;return typeof t=="string"?parseFloat(t):t}const Qi=10;function nu(e,t,n,r,o,s,a,u){const{sizes:d}=u||{},f=d||s;if(o===0)return f;const h=Xo(t),m=f.concat();let v=0;{const C=o<0?r:n,S=h.findIndex(E=>E.current.id===C),P=h[S],k=f[S],j=KC(P,Math.abs(o),k,e);if(k===j)return f;j===0&&k>0&&a.set(C,k),o=o<0?k-j:j-k}let b=o<0?n:r,w=h.findIndex(C=>C.current.id===b);for(;;){const C=h[w],S=f[w],P=Math.abs(o)-Math.abs(v),k=KC(C,0-P,S,e);if(S!==k&&(k===0&&S>0&&a.set(C.current.id,S),v+=S-k,m[w]=k,v.toPrecision(Qi).localeCompare(Math.abs(o).toPrecision(Qi),void 0,{numeric:!0})>=0))break;if(o<0){if(--w<0)break}else if(++w>=h.length)break}return v===0?f:(b=o<0?r:n,w=h.findIndex(C=>C.current.id===b),m[w]=f[w]+v,m)}function jl(e,t,n){t.forEach((r,o)=>{const{callbacksRef:s,collapsedSize:a,collapsible:u,id:d}=e[o].current,f=n[d];if(f!==r){n[d]=r;const{onCollapse:h,onResize:m}=s.current;m&&m(r,f),u&&h&&((f==null||f===a)&&r!==a?h(!1):f!==a&&r===a&&h(!0))}})}function tv(e,t){if(t.length<2)return[null,null];const n=t.findIndex(a=>a.current.id===e);if(n<0)return[null,null];const r=n===t.length-1,o=r?t[n-1].current.id:e,s=r?e:t[n+1].current.id;return[o,s]}function iE(e,t,n){if(e.size===1)return"100";const o=Xo(e).findIndex(a=>a.current.id===t),s=n[o];return s==null?"0":s.toPrecision(Qi)}function MX(e){const t=document.querySelector(`[data-panel-id="${e}"]`);return t||null}function vy(e){const t=document.querySelector(`[data-panel-group-id="${e}"]`);return t||null}function Qh(e){const t=document.querySelector(`[data-panel-resize-handle-id="${e}"]`);return t||null}function TX(e){return lE().findIndex(r=>r.getAttribute("data-panel-resize-handle-id")===e)??null}function lE(){return Array.from(document.querySelectorAll("[data-panel-resize-handle-id]"))}function cE(e){return Array.from(document.querySelectorAll(`[data-panel-resize-handle-id][data-panel-group-id="${e}"]`))}function yy(e,t,n){var d,f,h,m;const r=Qh(t),o=cE(e),s=r?o.indexOf(r):-1,a=((f=(d=n[s])==null?void 0:d.current)==null?void 0:f.id)??null,u=((m=(h=n[s+1])==null?void 0:h.current)==null?void 0:m.id)??null;return[a,u]}function Xo(e){return Array.from(e.values()).sort((t,n)=>{const r=t.current.order,o=n.current.order;return r==null&&o==null?0:r==null?-1:o==null?1:r-o})}function KC(e,t,n,r){var h;const o=n+t,{collapsedSize:s,collapsible:a,maxSize:u,minSize:d}=e.current;if(a){if(n>s){if(o<=d/2+s)return s}else if(!((h=r==null?void 0:r.type)==null?void 0:h.startsWith("key"))&&o{const{direction:a,panels:u}=e.current,d=vy(t),{height:f,width:h}=d.getBoundingClientRect(),v=cE(t).map(b=>{const w=b.getAttribute("data-panel-resize-handle-id"),C=Xo(u),[S,P]=yy(t,w,C);if(S==null||P==null)return()=>{};let k=0,j=100,E=0,I=0;C.forEach(D=>{D.current.id===S?(j=D.current.maxSize,k=D.current.minSize):(E+=D.current.minSize,I+=D.current.maxSize)});const O=Math.min(j,100-E),R=Math.max(k,(C.length-1)*100-I),M=iE(u,S,o);b.setAttribute("aria-valuemax",""+Math.round(O)),b.setAttribute("aria-valuemin",""+Math.round(R)),b.setAttribute("aria-valuenow",""+Math.round(parseInt(M)));const A=D=>{if(!D.defaultPrevented)switch(D.key){case"Enter":{D.preventDefault();const V=C.findIndex($=>$.current.id===S);if(V>=0){const $=C[V],F=o[V];if(F!=null){let U=0;F.toPrecision(Qi)<=$.current.minSize.toPrecision(Qi)?U=a==="horizontal"?h:f:U=-(a==="horizontal"?h:f);const X=nu(D,u,S,P,U,o,s.current,null);o!==X&&r(X)}}break}}};b.addEventListener("keydown",A);const L=MX(S);return L!=null&&b.setAttribute("aria-controls",L.id),()=>{b.removeAttribute("aria-valuemax"),b.removeAttribute("aria-valuemin"),b.removeAttribute("aria-valuenow"),b.removeEventListener("keydown",A),L!=null&&b.removeAttribute("aria-controls")}});return()=>{v.forEach(b=>b())}},[e,t,n,s,r,o])}function AX({disabled:e,handleId:t,resizeHandler:n}){pa(()=>{if(e||n==null)return;const r=Qh(t);if(r==null)return;const o=s=>{if(!s.defaultPrevented)switch(s.key){case"ArrowDown":case"ArrowLeft":case"ArrowRight":case"ArrowUp":case"End":case"Home":{s.preventDefault(),n(s);break}case"F6":{s.preventDefault();const a=lE(),u=TX(t);uE(u!==null);const d=s.shiftKey?u>0?u-1:a.length-1:u+1{r.removeEventListener("keydown",o)}},[e,t,n])}function NX(e,t){if(e.length!==t.length)return!1;for(let n=0;nR.current.id===E),O=r[I];if(O.current.collapsible){const R=h[I];(R===0||R.toPrecision(Qi)===O.current.minSize.toPrecision(Qi))&&(P=P<0?-O.current.minSize*w:O.current.minSize*w)}return P}else return dE(e,n,o,u,d)}function $X(e){return e.type==="keydown"}function h0(e){return e.type.startsWith("mouse")}function m0(e){return e.type.startsWith("touch")}let g0=null,Mi=null;function fE(e){switch(e){case"horizontal":return"ew-resize";case"horizontal-max":return"w-resize";case"horizontal-min":return"e-resize";case"vertical":return"ns-resize";case"vertical-max":return"n-resize";case"vertical-min":return"s-resize"}}function LX(){Mi!==null&&(document.head.removeChild(Mi),g0=null,Mi=null)}function nv(e){if(g0===e)return;g0=e;const t=fE(e);Mi===null&&(Mi=document.createElement("style"),document.head.appendChild(Mi)),Mi.innerHTML=`*{cursor: ${t}!important;}`}function FX(e,t=10){let n=null;return(...o)=>{n!==null&&clearTimeout(n),n=setTimeout(()=>{e(...o)},t)}}function pE(e){return e.map(t=>{const{minSize:n,order:r}=t.current;return r?`${r}:${n}`:`${n}`}).sort((t,n)=>t.localeCompare(n)).join(",")}function hE(e,t){try{const n=t.getItem(`PanelGroup:sizes:${e}`);if(n){const r=JSON.parse(n);if(typeof r=="object"&&r!=null)return r}}catch{}return null}function BX(e,t,n){const r=hE(e,n);if(r){const o=pE(t);return r[o]??null}return null}function HX(e,t,n,r){const o=pE(t),s=hE(e,r)||{};s[o]=n;try{r.setItem(`PanelGroup:sizes:${e}`,JSON.stringify(s))}catch(a){console.error(a)}}const rv={};function YC(e){try{if(typeof localStorage<"u")e.getItem=t=>localStorage.getItem(t),e.setItem=(t,n)=>{localStorage.setItem(t,n)};else throw new Error("localStorage not supported in this environment")}catch(t){console.error(t),e.getItem=()=>null,e.setItem=()=>{}}}const ru={getItem:e=>(YC(ru),ru.getItem(e)),setItem:(e,t)=>{YC(ru),ru.setItem(e,t)}};function mE({autoSaveId:e,children:t=null,className:n="",direction:r,disablePointerEventsDuringResize:o=!1,forwardedRef:s,id:a=null,onLayout:u,storage:d=ru,style:f={},tagName:h="div"}){const m=gy(a),[v,b]=pu(null),[w,C]=pu(new Map),S=Zo(null),P=Zo({onLayout:u});pa(()=>{P.current.onLayout=u});const k=Zo({}),[j,E]=pu([]),I=Zo(new Map),O=Zo(0),R=Zo({direction:r,panels:w,sizes:j});sE(s,()=>({getLayout:()=>{const{sizes:N}=R.current;return N},setLayout:N=>{const G=N.reduce((ve,le)=>ve+le,0);uE(G===100,"Panel sizes must add up to 100%");const{panels:W}=R.current,q=k.current,ne=Xo(W);E(N),jl(ne,N,q)}}),[]),Jp(()=>{R.current.direction=r,R.current.panels=w,R.current.sizes=j}),DX({committedValuesRef:R,groupId:m,panels:w,setSizes:E,sizes:j,panelSizeBeforeCollapse:I}),pa(()=>{const{onLayout:N}=P.current,{panels:G,sizes:W}=R.current;if(W.length>0){N&&N(W);const q=k.current,ne=Xo(G);jl(ne,W,q)}},[j]),Jp(()=>{if(R.current.sizes.length===w.size)return;let G=null;if(e){const W=Xo(w);G=BX(e,W,d)}if(G!=null)E(G);else{const W=Xo(w);let q=0,ne=0,ve=0;if(W.forEach(le=>{ve+=le.current.minSize,le.current.defaultSize===null?q++:ne+=le.current.defaultSize}),ne>100)throw new Error("Default panel sizes cannot exceed 100%");if(W.length>1&&q===0&&ne!==100)throw new Error("Invalid default sizes specified for panels");if(ve>100)throw new Error("Minimum panel sizes cannot exceed 100%");E(W.map(le=>le.current.defaultSize===null?(100-ne)/q:le.current.defaultSize))}},[e,w,d]),pa(()=>{if(e){if(j.length===0||j.length!==w.size)return;const N=Xo(w);rv[e]||(rv[e]=FX(HX,100)),rv[e](e,N,j,d)}},[e,w,j,d]);const M=La((N,G)=>{const{panels:W}=R.current;return W.size===0?{flexBasis:0,flexGrow:G??void 0,flexShrink:1,overflow:"hidden"}:{flexBasis:0,flexGrow:iE(W,N,j),flexShrink:1,overflow:"hidden",pointerEvents:o&&v!==null?"none":void 0}},[v,o,j]),A=La((N,G)=>{C(W=>{if(W.has(N))return W;const q=new Map(W);return q.set(N,G),q})},[]),L=La(N=>W=>{W.preventDefault();const{direction:q,panels:ne,sizes:ve}=R.current,le=Xo(ne),[oe,Y]=yy(m,N,le);if(oe==null||Y==null)return;let ae=zX(W,m,N,le,q,ve,S.current);if(ae===0)return;const xe=vy(m).getBoundingClientRect(),se=q==="horizontal";document.dir==="rtl"&&se&&(ae=-ae);const ge=se?xe.width:xe.height,fe=ae/ge*100,ke=nu(W,ne,oe,Y,fe,ve,I.current,S.current),Ae=!NX(ve,ke);if((h0(W)||m0(W))&&O.current!=fe&&nv(Ae?se?"horizontal":"vertical":se?ae<0?"horizontal-min":"horizontal-max":ae<0?"vertical-min":"vertical-max"),Ae){const ye=k.current;E(ke),jl(le,ke,ye)}O.current=fe},[m]),D=La(N=>{C(G=>{if(!G.has(N))return G;const W=new Map(G);return W.delete(N),W})},[]),V=La(N=>{const{panels:G,sizes:W}=R.current,q=G.get(N);if(q==null)return;const{collapsedSize:ne,collapsible:ve}=q.current;if(!ve)return;const le=Xo(G),oe=le.indexOf(q);if(oe<0)return;const Y=W[oe];if(Y===ne)return;I.current.set(N,Y);const[ae,de]=tv(N,le);if(ae==null||de==null)return;const se=oe===le.length-1?Y:ne-Y,ge=nu(null,G,ae,de,se,W,I.current,null);if(W!==ge){const fe=k.current;E(ge),jl(le,ge,fe)}},[]),$=La(N=>{const{panels:G,sizes:W}=R.current,q=G.get(N);if(q==null)return;const{collapsedSize:ne,minSize:ve}=q.current,le=I.current.get(N)||ve;if(!le)return;const oe=Xo(G),Y=oe.indexOf(q);if(Y<0||W[Y]!==ne)return;const[de,xe]=tv(N,oe);if(de==null||xe==null)return;const ge=Y===oe.length-1?ne-le:le,fe=nu(null,G,de,xe,ge,W,I.current,null);if(W!==fe){const ke=k.current;E(fe),jl(oe,fe,ke)}},[]),F=La((N,G)=>{const{panels:W,sizes:q}=R.current,ne=W.get(N);if(ne==null)return;const{collapsedSize:ve,collapsible:le,maxSize:oe,minSize:Y}=ne.current,ae=Xo(W),de=ae.indexOf(ne);if(de<0)return;const xe=q[de];if(xe===G)return;le&&G===ve||(G=Math.min(oe,Math.max(Y,G)));const[se,ge]=tv(N,ae);if(se==null||ge==null)return;const ke=de===ae.length-1?xe-G:G-xe,Ae=nu(null,W,se,ge,ke,q,I.current,null);if(q!==Ae){const ye=k.current;E(Ae),jl(ae,Ae,ye)}},[]),U=EX(()=>({activeHandleId:v,collapsePanel:V,direction:r,expandPanel:$,getPanelStyle:M,groupId:m,registerPanel:A,registerResizeHandle:L,resizePanel:F,startDragging:(N,G)=>{if(b(N),h0(G)||m0(G)){const W=Qh(N);S.current={dragHandleRect:W.getBoundingClientRect(),dragOffset:dE(G,N,r),sizes:R.current.sizes}}},stopDragging:()=>{LX(),b(null),S.current=null},unregisterPanel:D}),[v,V,r,$,M,m,A,L,F,D]),X={display:"flex",flexDirection:r==="horizontal"?"row":"column",height:"100%",overflow:"hidden",width:"100%"};return rc(Xh.Provider,{children:rc(h,{children:t,className:n,"data-panel-group":"","data-panel-group-direction":r,"data-panel-group-id":m,style:{...X,...f}}),value:U})}const by=rE((e,t)=>rc(mE,{...e,forwardedRef:t}));mE.displayName="PanelGroup";by.displayName="forwardRef(PanelGroup)";function v0({children:e=null,className:t="",disabled:n=!1,id:r=null,onDragging:o,style:s={},tagName:a="div"}){const u=Zo(null),d=Zo({onDragging:o});pa(()=>{d.current.onDragging=o});const f=oE(Xh);if(f===null)throw Error("PanelResizeHandle components must be rendered within a PanelGroup container");const{activeHandleId:h,direction:m,groupId:v,registerResizeHandle:b,startDragging:w,stopDragging:C}=f,S=gy(r),P=h===S,[k,j]=pu(!1),[E,I]=pu(null),O=La(()=>{u.current.blur(),C();const{onDragging:A}=d.current;A&&A(!1)},[C]);pa(()=>{if(n)I(null);else{const M=b(S);I(()=>M)}},[n,S,b]),pa(()=>{if(n||E==null||!P)return;const M=V=>{E(V)},A=V=>{E(V)},D=u.current.ownerDocument;return D.body.addEventListener("contextmenu",O),D.body.addEventListener("mousemove",M),D.body.addEventListener("touchmove",M),D.body.addEventListener("mouseleave",A),window.addEventListener("mouseup",O),window.addEventListener("touchend",O),()=>{D.body.removeEventListener("contextmenu",O),D.body.removeEventListener("mousemove",M),D.body.removeEventListener("touchmove",M),D.body.removeEventListener("mouseleave",A),window.removeEventListener("mouseup",O),window.removeEventListener("touchend",O)}},[m,n,P,E,O]),AX({disabled:n,handleId:S,resizeHandler:E});const R={cursor:fE(m),touchAction:"none",userSelect:"none"};return rc(a,{children:e,className:t,"data-resize-handle-active":P?"pointer":k?"keyboard":void 0,"data-panel-group-direction":m,"data-panel-group-id":v,"data-panel-resize-handle-enabled":!n,"data-panel-resize-handle-id":S,onBlur:()=>j(!1),onFocus:()=>j(!0),onMouseDown:M=>{w(S,M.nativeEvent);const{onDragging:A}=d.current;A&&A(!0)},onMouseUp:O,onTouchCancel:O,onTouchEnd:O,onTouchStart:M=>{w(S,M.nativeEvent);const{onDragging:A}=d.current;A&&A(!0)},ref:u,role:"separator",style:{...R,...s},tabIndex:0})}v0.displayName="PanelResizeHandle";const WX=(e,t,n,r="horizontal")=>{const o=p.useRef(null),[s,a]=p.useState(t),u=p.useCallback(()=>{var f,h;const d=(f=o.current)==null?void 0:f.getSize();d!==void 0&&d{const d=document.querySelector(`[data-panel-group-id="${n}"]`),f=document.querySelectorAll("[data-panel-resize-handle-id]");if(!d)return;const h=new ResizeObserver(()=>{let m=r==="horizontal"?d.getBoundingClientRect().width:d.getBoundingClientRect().height;f.forEach(v=>{m-=r==="horizontal"?v.getBoundingClientRect().width:v.getBoundingClientRect().height}),a(e/m*100)});return h.observe(d),f.forEach(m=>{h.observe(m)}),window.addEventListener("resize",u),()=>{h.disconnect(),window.removeEventListener("resize",u)}},[n,u,s,e,r]),{ref:o,minSizePct:s}},VX=Pe([mn],e=>{const{initialImage:t}=e.generation,{asInitialImage:n,imageNames:r}=e.batch;return{initialImage:t,useBatchAsInitialImage:n,isResetButtonDisabled:n?r.length===0:!t}},Et),UX=()=>{const{initialImage:e}=B(VX),{currentData:t,isLoading:n,isError:r,isSuccess:o}=Vs((e==null?void 0:e.imageName)??ga.skipToken),s=p.useMemo(()=>{if(t)return{id:"initial-image",payloadType:"IMAGE_DTO",payload:{imageDTO:t}}},[t]),a=p.useMemo(()=>({id:"initial-image",actionType:"SET_INITIAL_IMAGE"}),[]);return i.jsx(qi,{imageDTO:t,droppableData:a,draggableData:s,isUploadDisabled:!0,fitContainer:!0,dropLabel:"Set as Initial Image",noContentFallback:i.jsx(bc,{label:"No initial image selected"})})},GX=Pe([mn],e=>{const{initialImage:t}=e.generation,{asInitialImage:n,imageNames:r}=e.batch;return{initialImage:t,useBatchAsInitialImage:n,isResetButtonDisabled:n?r.length===0:!t}},Et),qX=()=>{const{initialImage:e,useBatchAsInitialImage:t,isResetButtonDisabled:n}=B(GX),r=re(),{openUploader:o}=kh();Vs((e==null?void 0:e.imageName)??ga.skipToken);const s=p.useMemo(()=>t?{type:"ADD_TO_BATCH"}:{type:"SET_INITIAL_IMAGE"},[t]),{getUploadButtonProps:a,getUploadInputProps:u}=ak({postUploadAction:s}),d=p.useCallback(()=>{r(t?k8():_8())},[r,t]),f=p.useCallback(()=>{o()},[o]);return p.useCallback(()=>{r(j8())},[r]),i.jsxs(H,{layerStyle:"first",sx:{position:"relative",flexDirection:"column",height:"full",width:"full",alignItems:"center",justifyContent:"center",borderRadius:"base",p:4,gap:4},children:[i.jsxs(H,{sx:{w:"full",flexWrap:"wrap",justifyContent:"center",alignItems:"center",gap:2},children:[i.jsx(Ue,{sx:{fontWeight:600,userSelect:"none",color:"base.700",_dark:{color:"base.200"}},children:"Initial Image"}),i.jsx(li,{}),i.jsx(Ie,{tooltip:t?"Upload to Batch":"Upload Initial Image","aria-label":t?"Upload to Batch":"Upload Initial Image",icon:i.jsx(jh,{}),onClick:f,...a()}),i.jsx(Ie,{tooltip:t?"Reset Batch":"Reset Initial Image","aria-label":t?"Reset Batch":"Reset Initial Image",icon:i.jsx(O1,{}),onClick:d,isDisabled:n})]}),i.jsx(UX,{}),i.jsx("input",{...u()})]})},gE=e=>{const{sx:t}=e,n=re(),r=B(a=>a.ui.shouldPinParametersPanel),{t:o}=me(),s=()=>{n(E8(!r)),n(ks())};return i.jsx(Ie,{...e,tooltip:o("common.pinOptionsPanel"),"aria-label":o("common.pinOptionsPanel"),onClick:s,icon:r?i.jsx(gP,{}):i.jsx(vP,{}),variant:"ghost",size:"sm",sx:{color:"base.500",_hover:{color:"base.600"},_active:{color:"base.700"},_dark:{color:"base.500",_hover:{color:"base.400"},_active:{color:"base.300"}},...t}})},KX=Pe(So,e=>{const{shouldPinParametersPanel:t,shouldShowParametersPanel:n}=e;return{shouldPinParametersPanel:t,shouldShowParametersPanel:n}}),YX=e=>{const{shouldPinParametersPanel:t,shouldShowParametersPanel:n}=B(KX);return t&&n?i.jsxs(qe,{sx:{position:"relative",h:"full",w:my,flexShrink:0},children:[i.jsx(H,{sx:{gap:2,flexDirection:"column",h:"full",w:"full",position:"absolute",overflowY:"auto"},children:e.children}),i.jsx(gE,{sx:{position:"absolute",top:0,insetInlineEnd:0}})]}):null},xy=p.memo(YX),XX=e=>{const{direction:t="horizontal",...n}=e,{colorMode:r}=xo();return t==="horizontal"?i.jsx(v0,{children:i.jsx(H,{sx:{w:6,h:"full",justifyContent:"center",alignItems:"center"},...n,children:i.jsx(qe,{sx:{w:.5,h:"calc(100% - 4px)",bg:Me("base.100","base.850")(r)}})})}):i.jsx(v0,{children:i.jsx(H,{sx:{w:"full",h:6,justifyContent:"center",alignItems:"center"},...n,children:i.jsx(qe,{sx:{w:"calc(100% - 4px)",h:.5,bg:Me("base.100","base.850")(r)}})})})},vE=p.memo(XX),QX=Pe([mn,I8],({ui:e,system:t},n)=>{const{shouldShowImageDetails:r,shouldHidePreview:o,shouldShowProgressInViewer:s}=e,{progressImage:a,shouldAntialiasProgressImage:u}=t;return{shouldShowImageDetails:r,shouldHidePreview:o,imageName:n,progressImage:a,shouldShowProgressInViewer:s,shouldAntialiasProgressImage:u}},{memoizeOptions:{resultEqualityCheck:Wt}}),ZX=()=>{const{shouldShowImageDetails:e,imageName:t,progressImage:n,shouldShowProgressInViewer:r,shouldAntialiasProgressImage:o}=B(QX),{currentData:s,isLoading:a,isError:u,isSuccess:d}=Vs(t??ga.skipToken),f=p.useMemo(()=>{if(s)return{id:"current-image",payloadType:"IMAGE_DTO",payload:{imageDTO:s}}},[s]),h=p.useMemo(()=>({id:"current-image",actionType:"SET_CURRENT_IMAGE"}),[]);return i.jsxs(H,{sx:{width:"full",height:"full",alignItems:"center",justifyContent:"center",position:"relative"},children:[n&&r?i.jsx(Nu,{src:n.dataURL,width:n.width,height:n.height,draggable:!1,sx:{objectFit:"contain",maxWidth:"full",maxHeight:"full",height:"auto",position:"absolute",borderRadius:"base",imageRendering:o?"auto":"pixelated"}}):i.jsx(qi,{imageDTO:s,droppableData:h,draggableData:f,isUploadDisabled:!0,fitContainer:!0,dropLabel:"Set as Current Image"}),e&&s&&i.jsx(qe,{sx:{position:"absolute",top:"0",width:"full",height:"full",borderRadius:"base",overflow:"scroll"},children:i.jsx(Lj,{image:s})}),!e&&s&&i.jsx(qe,{sx:{position:"absolute",top:"0",width:"full",height:"full",pointerEvents:"none"},children:i.jsx(Fj,{})})]})},JX=p.memo(ZX),eQ=()=>i.jsxs(H,{sx:{position:"relative",flexDirection:"column",height:"100%",width:"100%",rowGap:4,alignItems:"center",justifyContent:"center"},children:[i.jsx($j,{}),i.jsx(JX,{})]}),yE=()=>i.jsx(qe,{layerStyle:"first",sx:{position:"relative",width:"100%",height:"100%",p:4,borderRadius:"base"},children:i.jsx(H,{sx:{width:"100%",height:"100%"},children:i.jsx(eQ,{})})}),tQ=e=>{const{label:t,activeLabel:n,children:r,defaultIsOpen:o=!1}=e,{isOpen:s,onToggle:a}=Ja({defaultIsOpen:o}),{colorMode:u}=xo();return i.jsxs(qe,{children:[i.jsxs(H,{onClick:a,sx:{alignItems:"center",p:2,px:4,gap:2,borderTopRadius:"base",borderBottomRadius:s?0:"base",bg:s?Me("base.200","base.750")(u):Me("base.150","base.800")(u),color:Me("base.900","base.100")(u),_hover:{bg:s?Me("base.250","base.700")(u):Me("base.200","base.750")(u)},fontSize:"sm",fontWeight:600,cursor:"pointer",transitionProperty:"common",transitionDuration:"normal",userSelect:"none"},children:[t,i.jsx(Ao,{children:n&&i.jsx(bo.div,{initial:{opacity:0},animate:{opacity:1,transition:{duration:.1}},exit:{opacity:0,transition:{duration:.1}},children:i.jsx(Ue,{sx:{color:"accent.500",_dark:{color:"accent.300"}},children:n})},"statusText")}),i.jsx(li,{}),i.jsx(T1,{sx:{w:"1rem",h:"1rem",transform:s?"rotate(0deg)":"rotate(180deg)",transitionProperty:"common",transitionDuration:"normal"}})]}),i.jsx(fh,{in:s,animateOpacity:!0,style:{overflow:"unset"},children:i.jsx(qe,{sx:{p:4,borderBottomRadius:"base",bg:Me("base.100","base.800")(u)},children:r})})]})},Po=p.memo(tQ),nQ=Pe(mn,e=>{const{combinatorial:t,isEnabled:n}=e.dynamicPrompts;return{combinatorial:t,isDisabled:!n}},Et),rQ=()=>{const{combinatorial:e,isDisabled:t}=B(nQ),n=re(),r=p.useCallback(()=>{n(O8())},[n]);return i.jsx(jn,{isDisabled:t,label:"Combinatorial Generation",isChecked:e,onChange:r})},oQ=Pe(mn,e=>{const{isEnabled:t}=e.dynamicPrompts;return{isEnabled:t}},Et),sQ=()=>{const e=re(),{isEnabled:t}=B(oQ),n=p.useCallback(()=>{e(R8())},[e]);return i.jsx(jn,{label:"Enable Dynamic Prompts",isChecked:t,onChange:n})},aQ=Pe(mn,e=>{const{maxPrompts:t,combinatorial:n,isEnabled:r}=e.dynamicPrompts,{min:o,sliderMax:s,inputMax:a}=e.config.sd.dynamicPrompts.maxPrompts;return{maxPrompts:t,min:o,sliderMax:s,inputMax:a,isDisabled:!r||!n}},Et),iQ=()=>{const{maxPrompts:e,min:t,sliderMax:n,inputMax:r,isDisabled:o}=B(aQ),s=re(),a=p.useCallback(d=>{s(M8(d))},[s]),u=p.useCallback(()=>{s(T8())},[s]);return i.jsx(vt,{label:"Max Prompts",isDisabled:o,min:t,max:n,value:e,onChange:a,sliderNumberInputProps:{max:r},withSliderMarks:!0,withInput:!0,withReset:!0,handleReset:u})},lQ=Pe(mn,e=>{const{isEnabled:t}=e.dynamicPrompts;return{activeLabel:t?"Enabled":void 0}},Et),Sy=()=>{const{activeLabel:e}=B(lQ);return cr("dynamicPrompting").isFeatureEnabled?i.jsx(Po,{label:"Dynamic Prompts",activeLabel:e,children:i.jsxs(H,{sx:{gap:2,flexDir:"column"},children:[i.jsx(sQ,{}),i.jsx(rQ,{}),i.jsx(iQ,{})]})}):null},cQ=e=>{const t=re(),{lora:n}=e,r=p.useCallback(a=>{t(D8({id:n.id,weight:a}))},[t,n.id]),o=p.useCallback(()=>{t(A8(n.id))},[t,n.id]),s=p.useCallback(()=>{t(N8(n.id))},[t,n.id]);return i.jsxs(H,{sx:{gap:2.5,alignItems:"flex-end"},children:[i.jsx(vt,{label:n.name,value:n.weight,onChange:r,min:-1,max:2,step:.01,withInput:!0,withReset:!0,handleReset:o,withSliderMarks:!0,sliderMarks:[-1,0,1,2]}),i.jsx(Ie,{size:"sm",onClick:s,tooltip:"Remove LoRA","aria-label":"Remove LoRA",icon:i.jsx(vo,{}),colorScheme:"error"})]})},uQ=p.memo(cQ),dQ=Pe(mn,({lora:e})=>{const{loras:t}=e;return{loras:t}},Et),fQ=()=>{const{loras:e}=B(dQ);return Ks(e,t=>i.jsx(uQ,{lora:t},t.name))},bE=p.forwardRef(({label:e,tooltip:t,description:n,disabled:r,...o},s)=>i.jsx(Gn,{label:t,placement:"top",hasArrow:!0,children:i.jsx(qe,{ref:s,...o,children:i.jsxs(qe,{children:[i.jsx(Zl,{children:e}),n&&i.jsx(Zl,{size:"xs",color:"base.600",children:n})]})})}));bE.displayName="IAIMantineSelectItemWithTooltip";const wy=p.memo(bE),XC=zu({sortComparer:(e,t)=>e.name.localeCompare(t.name)}),QC=zu({sortComparer:(e,t)=>e.name.localeCompare(t.name)}),ZC=zu({sortComparer:(e,t)=>e.name.localeCompare(t.name)}),JC=zu({sortComparer:(e,t)=>e.name.localeCompare(t.name)}),e4=zu({sortComparer:(e,t)=>e.name.localeCompare(t.name)}),pQ=({base_model:e,type:t,name:n})=>`${e}/${t}/${n}`,Yc=e=>{const t=[];return e.forEach(n=>{const r={...z8(n),id:pQ(n)};t.push(r)}),t},xE=_3.injectEndpoints({endpoints:e=>({getMainModels:e.query({query:()=>({url:"models/",params:{model_type:"main"}}),providesTags:(t,n,r)=>{const o=[{id:"MainModel",type:Lc}];return t&&o.push(...t.ids.map(s=>({type:"MainModel",id:s}))),o},transformResponse:(t,n,r)=>{const o=Yc(t.models);return XC.setAll(XC.getInitialState(),o)}}),getLoRAModels:e.query({query:()=>({url:"models/",params:{model_type:"lora"}}),providesTags:(t,n,r)=>{const o=[{id:"LoRAModel",type:Lc}];return t&&o.push(...t.ids.map(s=>({type:"LoRAModel",id:s}))),o},transformResponse:(t,n,r)=>{const o=Yc(t.models);return QC.setAll(QC.getInitialState(),o)}}),getControlNetModels:e.query({query:()=>({url:"models/",params:{model_type:"controlnet"}}),providesTags:(t,n,r)=>{const o=[{id:"ControlNetModel",type:Lc}];return t&&o.push(...t.ids.map(s=>({type:"ControlNetModel",id:s}))),o},transformResponse:(t,n,r)=>{const o=Yc(t.models);return ZC.setAll(ZC.getInitialState(),o)}}),getVaeModels:e.query({query:()=>({url:"models/",params:{model_type:"vae"}}),providesTags:(t,n,r)=>{const o=[{id:"VaeModel",type:Lc}];return t&&o.push(...t.ids.map(s=>({type:"VaeModel",id:s}))),o},transformResponse:(t,n,r)=>{const o=Yc(t.models);return e4.setAll(e4.getInitialState(),o)}}),getTextualInversionModels:e.query({query:()=>({url:"models/",params:{model_type:"embedding"}}),providesTags:(t,n,r)=>{const o=[{id:"TextualInversionModel",type:Lc}];return t&&o.push(...t.ids.map(s=>({type:"TextualInversionModel",id:s}))),o},transformResponse:(t,n,r)=>{const o=Yc(t.models);return JC.setAll(JC.getInitialState(),o)}})})}),{useGetMainModelsQuery:Ju,useGetControlNetModelsQuery:Fae,useGetLoRAModelsQuery:SE,useGetTextualInversionModelsQuery:hQ,useGetVaeModelsQuery:wE}=xE,Yr={"sd-1":"Stable Diffusion 1.x","sd-2":"Stable Diffusion 2.x"},mQ=()=>{const e=re(),{t}=me(),n=B(d=>d.generation.model),{data:r,isLoading:o}=Ju(),s=p.useMemo(()=>{if(!r)return[];const d=[];return ii(r.entities,(f,h)=>{f&&d.push({value:h,label:f.name,group:Yr[f.base_model]})}),d},[r]),a=p.useMemo(()=>r==null?void 0:r.entities[(n==null?void 0:n.id)||""],[r==null?void 0:r.entities,n]),u=p.useCallback(d=>{d&&e(gv(d))},[e]);return p.useEffect(()=>{if(o||a&&(r!=null&&r.ids.includes(a==null?void 0:a.id)))return;const d=r==null?void 0:r.ids[0];ch(d)&&u(d)},[u,o,r==null?void 0:r.ids,a]),o?i.jsx(qn,{label:t("modelManager.model"),placeholder:"Loading...",disabled:!0,data:[]}):i.jsx(qn,{tooltip:a==null?void 0:a.description,label:t("modelManager.model"),value:a==null?void 0:a.id,placeholder:s.length>0?"Select a model":"No models detected!",data:s,error:s.length===0,onChange:u})},gQ=p.memo(mQ),vQ=Pe(mn,({lora:e})=>({loras:e.loras}),Et),yQ=()=>{const e=re(),{loras:t}=B(vQ),{data:n}=SE(),r=B(a=>a.generation.model),o=p.useMemo(()=>{if(!n)return[];const a=[];return ii(n.entities,(u,d)=>{if(!u||d in t)return;const f=(r==null?void 0:r.base_model)!==u.base_model;a.push({value:d,label:u.name,disabled:f,group:Yr[u.base_model],tooltip:f?`Incompatible base model: ${u.base_model}`:void 0})}),a.sort((u,d)=>u.disabled&&!d.disabled?1:-1)},[t,n,r==null?void 0:r.base_model]),s=p.useCallback(a=>{if(!a)return;const u=n==null?void 0:n.entities[a];u&&e($8(u))},[e,n==null?void 0:n.entities]);return(n==null?void 0:n.ids.length)===0?i.jsx(H,{sx:{justifyContent:"center",p:2},children:i.jsx(Ue,{sx:{fontSize:"sm",color:"base.500",_dark:"base.700"},children:"No LoRAs Loaded"})}):i.jsx(qn,{placeholder:o.length===0?"All LoRAs added":"Add LoRA",value:null,data:o,nothingFound:"No matching LoRAs",itemComponent:wy,disabled:o.length===0,filter:(a,u)=>{var d;return((d=u.label)==null?void 0:d.toLowerCase().includes(a.toLowerCase().trim()))||u.value.toLowerCase().includes(a.toLowerCase().trim())},onChange:s})},bQ=Pe(mn,e=>{const t=L8(e.lora.loras);return{activeLabel:t>0?`${t} Active`:void 0}},Et),xQ=()=>{const{activeLabel:e}=B(bQ);return cr("lora").isFeatureEnabled?i.jsx(Po,{label:"LoRA",activeLabel:e,children:i.jsxs(H,{sx:{flexDir:"column",gap:2},children:[i.jsx(yQ,{}),i.jsx(fQ,{})]})}):null},Cy=p.memo(xQ),SQ=Pe(mn,e=>({activeLabel:e.generation.clipSkip>0?"Clip Skip":void 0}),Et);function Py(){const{activeLabel:e}=B(SQ);return B(n=>n.ui.shouldShowAdvancedOptions)&&i.jsx(Po,{label:"Advanced",activeLabel:e,children:i.jsx(H,{sx:{flexDir:"column",gap:2},children:i.jsx(F8,{})})})}const wQ=e=>{const r=e.split(",").map(o=>o.split(":")).map(o=>({seed:Number(o[0]),weight:Number(o[1])}));return ky(r)?r:!1},ky=e=>typeof e=="string"?!!wQ(e):!!(e.length&&!e.some(t=>{const{seed:n,weight:r}=t,o=!isNaN(parseInt(n.toString(),10)),s=!isNaN(parseInt(r.toString(),10))&&r>=0&&r<=1;return!(o&&s)})),CQ=Pe([mn,Sr],(e,t)=>{const{generation:n,system:r,batch:o}=e,{shouldGenerateVariations:s,seedWeights:a,initialImage:u,seed:d}=n,{isProcessing:f,isConnected:h}=r,{isEnabled:m,asInitialImage:v,imageNames:b}=o;let w=!0;const C=[];t==="img2img"&&!u&&!(v&&b.length>1)&&(w=!1,C.push("No initial image selected"));const{isSuccess:S}=xE.endpoints.getMainModels.select()(e);return S||(w=!1,C.push("Models are not loaded")),f&&(w=!1,C.push("System Busy")),h||(w=!1,C.push("System Disconnected")),s&&(!(ky(a)||a==="")||d===-1)&&(w=!1,C.push("Seed-Weights badly formatted.")),{isReady:w,reasonsWhyNotReady:C}},Et),Br=()=>{const{isReady:e}=B(CQ);return e},PQ=Pe(fi,e=>Ks(B8,n=>({label:n.label,value:n.type})).filter(n=>!e.sd.disabledControlNetModels.includes(n.value))),kQ=e=>{const{controlNetId:t,model:n}=e,r=B(PQ),o=re(),s=Br(),a=p.useCallback(u=>{o(H8({controlNetId:t,model:u}))},[t,o]);return i.jsx(qn,{data:r,value:n,onChange:a,disabled:!s,tooltip:n})},_Q=p.memo(kQ),jQ=e=>{const{controlNetId:t,weight:n,mini:r=!1}=e,o=re(),s=p.useCallback(a=>{o(W8({controlNetId:t,weight:a}))},[t,o]);return i.jsx(vt,{label:"Weight",sliderFormLabelProps:{pb:2},value:n,onChange:s,min:-1,max:1,step:.01,withSliderMarks:!r,sliderMarks:[-1,0,1]})},EQ=p.memo(jQ),IQ=Pe(O3,e=>{const{pendingControlImages:t}=e;return{pendingControlImages:t}},Et),OQ=e=>{const{height:t}=e,{controlNetId:n,controlImage:r,processedControlImage:o,processorType:s}=e.controlNet,a=re(),{pendingControlImages:u}=B(IQ),[d,f]=p.useState(!1),{currentData:h,isLoading:m,isError:v,isSuccess:b}=Vs(r??ga.skipToken),{currentData:w,isLoading:C,isError:S,isSuccess:P}=Vs(o??ga.skipToken),k=p.useCallback(()=>{a(V8({controlNetId:n,controlImage:null}))},[n,a]),j=p.useCallback(()=>{f(!0)},[]),E=p.useCallback(()=>{f(!1)},[]),I=p.useMemo(()=>{if(h)return{id:n,payloadType:"IMAGE_DTO",payload:{imageDTO:h}}},[h,n]),O=p.useMemo(()=>({id:n,actionType:"SET_CONTROLNET_IMAGE",context:{controlNetId:n}}),[n]),R=p.useMemo(()=>({type:"SET_CONTROLNET_IMAGE",controlNetId:n}),[n]),M=h&&w&&!d&&!u.includes(n)&&s!=="none";return i.jsxs(H,{onMouseEnter:j,onMouseLeave:E,sx:{position:"relative",w:"full",h:t,alignItems:"center",justifyContent:"center"},children:[i.jsx(qi,{draggableData:I,droppableData:O,imageDTO:h,isDropDisabled:M,onClickReset:k,postUploadAction:R,resetTooltip:"Reset Control Image",withResetIcon:!!h}),i.jsx(qe,{sx:{position:"absolute",top:0,insetInlineStart:0,w:"full",h:"full",opacity:M?1:0,transitionProperty:"common",transitionDuration:"normal",pointerEvents:"none"},children:i.jsx(qi,{draggableData:I,droppableData:O,imageDTO:w,isUploadDisabled:!0,onClickReset:k,resetTooltip:"Reset Control Image",withResetIcon:!!h})}),u.includes(n)&&i.jsx(H,{sx:{position:"absolute",top:0,insetInlineStart:0,w:"full",h:"full",alignItems:"center",justifyContent:"center",opacity:.8,borderRadius:"base",bg:"base.400",_dark:{bg:"base.900"}},children:i.jsx(ai,{size:"xl",sx:{color:"base.100",_dark:{color:"base.400"}}})})]})},t4=p.memo(OQ),Is=()=>{const e=re();return p.useCallback((n,r)=>{e(U8({controlNetId:n,changes:r}))},[e])};function Os(e){return i.jsx(H,{sx:{flexDirection:"column",gap:2},children:e.children})}const n4=ss.canny_image_processor.default,RQ=e=>{const{controlNetId:t,processorNode:n}=e,{low_threshold:r,high_threshold:o}=n,s=Br(),a=Is(),u=p.useCallback(m=>{a(t,{low_threshold:m})},[t,a]),d=p.useCallback(()=>{a(t,{low_threshold:n4.low_threshold})},[t,a]),f=p.useCallback(m=>{a(t,{high_threshold:m})},[t,a]),h=p.useCallback(()=>{a(t,{high_threshold:n4.high_threshold})},[t,a]);return i.jsxs(Os,{children:[i.jsx(vt,{isDisabled:!s,label:"Low Threshold",value:r,onChange:u,handleReset:d,withReset:!0,min:0,max:255,withInput:!0,withSliderMarks:!0}),i.jsx(vt,{isDisabled:!s,label:"High Threshold",value:o,onChange:f,handleReset:h,withReset:!0,min:0,max:255,withInput:!0,withSliderMarks:!0})]})},MQ=p.memo(RQ),r4=ss.hed_image_processor.default,TQ=e=>{const{controlNetId:t,processorNode:{detect_resolution:n,image_resolution:r,scribble:o}}=e,s=Br(),a=Is(),u=p.useCallback(v=>{a(t,{detect_resolution:v})},[t,a]),d=p.useCallback(v=>{a(t,{image_resolution:v})},[t,a]),f=p.useCallback(v=>{a(t,{scribble:v.target.checked})},[t,a]),h=p.useCallback(()=>{a(t,{detect_resolution:r4.detect_resolution})},[t,a]),m=p.useCallback(()=>{a(t,{image_resolution:r4.image_resolution})},[t,a]);return i.jsxs(Os,{children:[i.jsx(vt,{label:"Detect Resolution",value:n,onChange:u,handleReset:h,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!s}),i.jsx(vt,{label:"Image Resolution",value:r,onChange:d,handleReset:m,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!s}),i.jsx(jn,{label:"Scribble",isChecked:o,onChange:f,isDisabled:!s})]})},DQ=p.memo(TQ),o4=ss.lineart_image_processor.default,AQ=e=>{const{controlNetId:t,processorNode:n}=e,{image_resolution:r,detect_resolution:o,coarse:s}=n,a=Is(),u=Br(),d=p.useCallback(b=>{a(t,{detect_resolution:b})},[t,a]),f=p.useCallback(b=>{a(t,{image_resolution:b})},[t,a]),h=p.useCallback(()=>{a(t,{detect_resolution:o4.detect_resolution})},[t,a]),m=p.useCallback(()=>{a(t,{image_resolution:o4.image_resolution})},[t,a]),v=p.useCallback(b=>{a(t,{coarse:b.target.checked})},[t,a]);return i.jsxs(Os,{children:[i.jsx(vt,{label:"Detect Resolution",value:o,onChange:d,handleReset:h,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!u}),i.jsx(vt,{label:"Image Resolution",value:r,onChange:f,handleReset:m,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!u}),i.jsx(jn,{label:"Coarse",isChecked:s,onChange:v,isDisabled:!u})]})},NQ=p.memo(AQ),s4=ss.lineart_anime_image_processor.default,zQ=e=>{const{controlNetId:t,processorNode:n}=e,{image_resolution:r,detect_resolution:o}=n,s=Is(),a=Br(),u=p.useCallback(m=>{s(t,{detect_resolution:m})},[t,s]),d=p.useCallback(m=>{s(t,{image_resolution:m})},[t,s]),f=p.useCallback(()=>{s(t,{detect_resolution:s4.detect_resolution})},[t,s]),h=p.useCallback(()=>{s(t,{image_resolution:s4.image_resolution})},[t,s]);return i.jsxs(Os,{children:[i.jsx(vt,{label:"Detect Resolution",value:o,onChange:u,handleReset:f,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!a}),i.jsx(vt,{label:"Image Resolution",value:r,onChange:d,handleReset:h,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!a})]})},$Q=p.memo(zQ),Xc=ss.content_shuffle_image_processor.default,LQ=e=>{const{controlNetId:t,processorNode:n}=e,{image_resolution:r,detect_resolution:o,w:s,h:a,f:u}=n,d=Is(),f=Br(),h=p.useCallback(E=>{d(t,{detect_resolution:E})},[t,d]),m=p.useCallback(()=>{d(t,{detect_resolution:Xc.detect_resolution})},[t,d]),v=p.useCallback(E=>{d(t,{image_resolution:E})},[t,d]),b=p.useCallback(()=>{d(t,{image_resolution:Xc.image_resolution})},[t,d]),w=p.useCallback(E=>{d(t,{w:E})},[t,d]),C=p.useCallback(()=>{d(t,{w:Xc.w})},[t,d]),S=p.useCallback(E=>{d(t,{h:E})},[t,d]),P=p.useCallback(()=>{d(t,{h:Xc.h})},[t,d]),k=p.useCallback(E=>{d(t,{f:E})},[t,d]),j=p.useCallback(()=>{d(t,{f:Xc.f})},[t,d]);return i.jsxs(Os,{children:[i.jsx(vt,{label:"Detect Resolution",value:o,onChange:h,handleReset:m,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!f}),i.jsx(vt,{label:"Image Resolution",value:r,onChange:v,handleReset:b,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!f}),i.jsx(vt,{label:"W",value:s,onChange:w,handleReset:C,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!f}),i.jsx(vt,{label:"H",value:a,onChange:S,handleReset:P,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!f}),i.jsx(vt,{label:"F",value:u,onChange:k,handleReset:j,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!f})]})},FQ=p.memo(LQ),a4=ss.mediapipe_face_processor.default,BQ=e=>{const{controlNetId:t,processorNode:n}=e,{max_faces:r,min_confidence:o}=n,s=Is(),a=Br(),u=p.useCallback(m=>{s(t,{max_faces:m})},[t,s]),d=p.useCallback(m=>{s(t,{min_confidence:m})},[t,s]),f=p.useCallback(()=>{s(t,{max_faces:a4.max_faces})},[t,s]),h=p.useCallback(()=>{s(t,{min_confidence:a4.min_confidence})},[t,s]);return i.jsxs(Os,{children:[i.jsx(vt,{label:"Max Faces",value:r,onChange:u,handleReset:f,withReset:!0,min:1,max:20,withInput:!0,withSliderMarks:!0,isDisabled:!a}),i.jsx(vt,{label:"Min Confidence",value:o,onChange:d,handleReset:h,withReset:!0,min:0,max:1,step:.01,withInput:!0,withSliderMarks:!0,isDisabled:!a})]})},HQ=p.memo(BQ),i4=ss.midas_depth_image_processor.default,WQ=e=>{const{controlNetId:t,processorNode:n}=e,{a_mult:r,bg_th:o}=n,s=Is(),a=Br(),u=p.useCallback(m=>{s(t,{a_mult:m})},[t,s]),d=p.useCallback(m=>{s(t,{bg_th:m})},[t,s]),f=p.useCallback(()=>{s(t,{a_mult:i4.a_mult})},[t,s]),h=p.useCallback(()=>{s(t,{bg_th:i4.bg_th})},[t,s]);return i.jsxs(Os,{children:[i.jsx(vt,{label:"a_mult",value:r,onChange:u,handleReset:f,withReset:!0,min:0,max:20,step:.01,withInput:!0,withSliderMarks:!0,isDisabled:!a}),i.jsx(vt,{label:"bg_th",value:o,onChange:d,handleReset:h,withReset:!0,min:0,max:20,step:.01,withInput:!0,withSliderMarks:!0,isDisabled:!a})]})},VQ=p.memo(WQ),Pf=ss.mlsd_image_processor.default,UQ=e=>{const{controlNetId:t,processorNode:n}=e,{image_resolution:r,detect_resolution:o,thr_d:s,thr_v:a}=n,u=Is(),d=Br(),f=p.useCallback(P=>{u(t,{detect_resolution:P})},[t,u]),h=p.useCallback(P=>{u(t,{image_resolution:P})},[t,u]),m=p.useCallback(P=>{u(t,{thr_d:P})},[t,u]),v=p.useCallback(P=>{u(t,{thr_v:P})},[t,u]),b=p.useCallback(()=>{u(t,{detect_resolution:Pf.detect_resolution})},[t,u]),w=p.useCallback(()=>{u(t,{image_resolution:Pf.image_resolution})},[t,u]),C=p.useCallback(()=>{u(t,{thr_d:Pf.thr_d})},[t,u]),S=p.useCallback(()=>{u(t,{thr_v:Pf.thr_v})},[t,u]);return i.jsxs(Os,{children:[i.jsx(vt,{label:"Detect Resolution",value:o,onChange:f,handleReset:b,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!d}),i.jsx(vt,{label:"Image Resolution",value:r,onChange:h,handleReset:w,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!d}),i.jsx(vt,{label:"W",value:s,onChange:m,handleReset:C,withReset:!0,min:0,max:1,step:.01,withInput:!0,withSliderMarks:!0,isDisabled:!d}),i.jsx(vt,{label:"H",value:a,onChange:v,handleReset:S,withReset:!0,min:0,max:1,step:.01,withInput:!0,withSliderMarks:!0,isDisabled:!d})]})},GQ=p.memo(UQ),l4=ss.normalbae_image_processor.default,qQ=e=>{const{controlNetId:t,processorNode:n}=e,{image_resolution:r,detect_resolution:o}=n,s=Is(),a=Br(),u=p.useCallback(m=>{s(t,{detect_resolution:m})},[t,s]),d=p.useCallback(m=>{s(t,{image_resolution:m})},[t,s]),f=p.useCallback(()=>{s(t,{detect_resolution:l4.detect_resolution})},[t,s]),h=p.useCallback(()=>{s(t,{image_resolution:l4.image_resolution})},[t,s]);return i.jsxs(Os,{children:[i.jsx(vt,{label:"Detect Resolution",value:o,onChange:u,handleReset:f,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!a}),i.jsx(vt,{label:"Image Resolution",value:r,onChange:d,handleReset:h,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!a})]})},KQ=p.memo(qQ),c4=ss.openpose_image_processor.default,YQ=e=>{const{controlNetId:t,processorNode:n}=e,{image_resolution:r,detect_resolution:o,hand_and_face:s}=n,a=Is(),u=Br(),d=p.useCallback(b=>{a(t,{detect_resolution:b})},[t,a]),f=p.useCallback(b=>{a(t,{image_resolution:b})},[t,a]),h=p.useCallback(()=>{a(t,{detect_resolution:c4.detect_resolution})},[t,a]),m=p.useCallback(()=>{a(t,{image_resolution:c4.image_resolution})},[t,a]),v=p.useCallback(b=>{a(t,{hand_and_face:b.target.checked})},[t,a]);return i.jsxs(Os,{children:[i.jsx(vt,{label:"Detect Resolution",value:o,onChange:d,handleReset:h,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!u}),i.jsx(vt,{label:"Image Resolution",value:r,onChange:f,handleReset:m,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!u}),i.jsx(jn,{label:"Hand and Face",isChecked:s,onChange:v,isDisabled:!u})]})},XQ=p.memo(YQ),u4=ss.pidi_image_processor.default,QQ=e=>{const{controlNetId:t,processorNode:n}=e,{image_resolution:r,detect_resolution:o,scribble:s,safe:a}=n,u=Is(),d=Br(),f=p.useCallback(C=>{u(t,{detect_resolution:C})},[t,u]),h=p.useCallback(C=>{u(t,{image_resolution:C})},[t,u]),m=p.useCallback(()=>{u(t,{detect_resolution:u4.detect_resolution})},[t,u]),v=p.useCallback(()=>{u(t,{image_resolution:u4.image_resolution})},[t,u]),b=p.useCallback(C=>{u(t,{scribble:C.target.checked})},[t,u]),w=p.useCallback(C=>{u(t,{safe:C.target.checked})},[t,u]);return i.jsxs(Os,{children:[i.jsx(vt,{label:"Detect Resolution",value:o,onChange:f,handleReset:m,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!d}),i.jsx(vt,{label:"Image Resolution",value:r,onChange:h,handleReset:v,withReset:!0,min:0,max:4096,withInput:!0,withSliderMarks:!0,isDisabled:!d}),i.jsx(jn,{label:"Scribble",isChecked:s,onChange:b}),i.jsx(jn,{label:"Safe",isChecked:a,onChange:w,isDisabled:!d})]})},ZQ=p.memo(QQ),JQ=e=>null,eZ=p.memo(JQ),tZ=e=>{const{controlNetId:t,processorNode:n}=e;return n.type==="canny_image_processor"?i.jsx(MQ,{controlNetId:t,processorNode:n}):n.type==="hed_image_processor"?i.jsx(DQ,{controlNetId:t,processorNode:n}):n.type==="lineart_image_processor"?i.jsx(NQ,{controlNetId:t,processorNode:n}):n.type==="content_shuffle_image_processor"?i.jsx(FQ,{controlNetId:t,processorNode:n}):n.type==="lineart_anime_image_processor"?i.jsx($Q,{controlNetId:t,processorNode:n}):n.type==="mediapipe_face_processor"?i.jsx(HQ,{controlNetId:t,processorNode:n}):n.type==="midas_depth_image_processor"?i.jsx(VQ,{controlNetId:t,processorNode:n}):n.type==="mlsd_image_processor"?i.jsx(GQ,{controlNetId:t,processorNode:n}):n.type==="normalbae_image_processor"?i.jsx(KQ,{controlNetId:t,processorNode:n}):n.type==="openpose_image_processor"?i.jsx(XQ,{controlNetId:t,processorNode:n}):n.type==="pidi_image_processor"?i.jsx(ZQ,{controlNetId:t,processorNode:n}):n.type==="zoe_depth_image_processor"?i.jsx(eZ,{controlNetId:t,processorNode:n}):null},nZ=p.memo(tZ),rZ=e=>{const{controlNetId:t,shouldAutoConfig:n}=e,r=re(),o=Br(),s=p.useCallback(()=>{r(G8({controlNetId:t}))},[t,r]);return i.jsx(jn,{label:"Auto configure processor","aria-label":"Auto configure processor",isChecked:n,onChange:s,isDisabled:!o})},oZ=p.memo(rZ),ov={mt:1.5,fontSize:"2xs",fontWeight:"500",color:"base.400"},d4=e=>`${Math.round(e*100)}%`,sZ=e=>{const{controlNetId:t,beginStepPct:n,mini:r=!1,endStepPct:o}=e,s=re();me();const a=p.useCallback(u=>{s(Fx({controlNetId:t,beginStepPct:u[0]})),s(Bx({controlNetId:t,endStepPct:u[1]}))},[t,s]);return p.useCallback(()=>{s(Fx({controlNetId:t,beginStepPct:0})),s(Bx({controlNetId:t,endStepPct:1}))},[t,s]),i.jsxs(ir,{children:[i.jsx(mr,{children:"Begin / End Step Percentage"}),i.jsx(Ya,{w:"100%",gap:2,alignItems:"center",children:i.jsxs(W6,{"aria-label":["Begin Step %","End Step %"],value:[n,o],onChange:a,min:0,max:1,step:.01,minStepsBetweenThumbs:5,children:[i.jsx(V6,{children:i.jsx(U6,{})}),i.jsx(Gn,{label:d4(n),placement:"top",hasArrow:!0,children:i.jsx(zv,{index:0})}),i.jsx(Gn,{label:d4(o),placement:"top",hasArrow:!0,children:i.jsx(zv,{index:1})}),!r&&i.jsxs(i.Fragment,{children:[i.jsx(Mf,{value:0,sx:{insetInlineStart:"0 !important",insetInlineEnd:"unset !important",...ov},children:"0%"}),i.jsx(Mf,{value:.5,sx:{...ov},children:"50%"}),i.jsx(Mf,{value:1,sx:{insetInlineStart:"unset !important",insetInlineEnd:"0 !important",...ov},children:"100%"})]})]})})]})},aZ=p.memo(sZ),iZ=[{label:"Balanced",value:"balanced"},{label:"Prompt",value:"more_prompt"},{label:"Control",value:"more_control"},{label:"Mega Control",value:"unbalanced"}];function lZ(e){const{controlNetId:t,controlMode:n=!1}=e,r=re(),{t:o}=me(),s=p.useCallback(a=>{r(q8({controlNetId:t,controlMode:a}))},[t,r]);return i.jsx(qn,{label:o("parameters.controlNetControlMode"),data:iZ,value:String(n),onChange:s})}const cZ=Pe(fi,e=>Ks(ss,n=>({value:n.type,label:n.label})).sort((n,r)=>n.value==="none"?-1:r.value==="none"?1:n.label.localeCompare(r.label)).filter(n=>!e.sd.disabledControlNetProcessors.includes(n.value)),Et),uZ=e=>{const{controlNetId:t,processorNode:n}=e,r=re(),o=Br(),s=B(cZ),a=p.useCallback(u=>{r(K8({controlNetId:t,processorType:u}))},[t,r]);return i.jsx(qn,{label:"Processor",value:n.type??"canny_image_processor",data:s,onChange:a,disabled:!o})},dZ=p.memo(uZ),fZ=e=>{const{controlNetId:t,isEnabled:n,model:r,weight:o,beginStepPct:s,endStepPct:a,controlMode:u,controlImage:d,processedControlImage:f,processorNode:h,processorType:m,shouldAutoConfig:v}=e.controlNet,b=re(),[w,C]=oX(!1),{colorMode:S}=xo(),P=p.useCallback(()=>{b(Y8({controlNetId:t}))},[t,b]),k=p.useCallback(()=>{b(R3({controlNetId:Ti(),controlNet:e.controlNet}))},[b,e.controlNet]),j=p.useCallback(()=>{b(X8({controlNetId:t}))},[t,b]);return i.jsxs(H,{sx:{flexDir:"column",gap:2,p:3,bg:Me("base.200","base.850")(S),borderRadius:"base",position:"relative"},children:[i.jsxs(H,{sx:{gap:2},children:[i.jsx(jn,{tooltip:"Toggle","aria-label":"Toggle",isChecked:n,onChange:j}),i.jsx(qe,{sx:{w:"full",minW:0,opacity:n?1:.5,pointerEvents:n?"auto":"none",transitionProperty:"common",transitionDuration:"0.1s"},children:i.jsx(_Q,{controlNetId:t,model:r})}),i.jsx(Ie,{size:"sm",tooltip:"Duplicate","aria-label":"Duplicate",onClick:k,icon:i.jsx(yc,{})}),i.jsx(Ie,{size:"sm",tooltip:"Delete","aria-label":"Delete",colorScheme:"error",onClick:P,icon:i.jsx(vo,{})}),i.jsx(Ie,{size:"sm","aria-label":"Show All Options",onClick:C,variant:"link",icon:i.jsx(T1,{sx:{boxSize:4,color:Me("base.700","base.300")(S),transform:w?"rotate(0deg)":"rotate(180deg)",transitionProperty:"common",transitionDuration:"normal"}})}),!v&&i.jsx(qe,{sx:{position:"absolute",w:1.5,h:1.5,borderRadius:"full",bg:Me("error.700","error.200")(S),top:4,insetInlineEnd:4}})]}),n&&i.jsxs(i.Fragment,{children:[i.jsxs(H,{sx:{w:"full",flexDirection:"column"},children:[i.jsxs(H,{sx:{gap:4,w:"full"},children:[i.jsxs(H,{sx:{flexDir:"column",gap:3,w:"full",paddingInlineStart:1,paddingInlineEnd:w?1:0,pb:2,justifyContent:"space-between"},children:[i.jsx(EQ,{controlNetId:t,weight:o,mini:!w}),i.jsx(aZ,{controlNetId:t,beginStepPct:s,endStepPct:a,mini:!w})]}),!w&&i.jsx(H,{sx:{alignItems:"center",justifyContent:"center",h:24,w:24,aspectRatio:"1/1"},children:i.jsx(t4,{controlNet:e.controlNet,height:24})})]}),i.jsx(lZ,{controlNetId:t,controlMode:u})]}),w&&i.jsxs(i.Fragment,{children:[i.jsx(qe,{mt:2,children:i.jsx(t4,{controlNet:e.controlNet,height:96})}),i.jsx(dZ,{controlNetId:t,processorNode:h}),i.jsx(nZ,{controlNetId:t,processorNode:h}),i.jsx(oZ,{controlNetId:t,shouldAutoConfig:v})]})]})]})},pZ=p.memo(fZ),hZ=Pe(mn,e=>{const{isEnabled:t}=e.controlNet;return{isEnabled:t}},Et),mZ=()=>{const{isEnabled:e}=B(hZ),t=re(),n=p.useCallback(()=>{t(Q8())},[t]);return i.jsx(jn,{label:"Enable ControlNet",isChecked:e,onChange:n})},gZ=Pe(O3,e=>{const{controlNets:t,isEnabled:n}=e,r=Z8(t),o=n&&r.length>0?`${r.length} Active`:void 0;return{controlNetsArray:Ks(t),activeLabel:o}},Et),vZ=()=>{me();const{controlNetsArray:e,activeLabel:t}=B(gZ),n=cr("controlNet").isFeatureDisabled,r=re(),o=p.useCallback(()=>{r(R3({controlNetId:Ti()}))},[r]);return n?null:i.jsx(Po,{label:"ControlNet",activeLabel:t,children:i.jsxs(H,{sx:{flexDir:"column",gap:3},children:[i.jsx(mZ,{}),e.map((s,a)=>i.jsxs(p.Fragment,{children:[a>0&&i.jsx(wa,{}),i.jsx(pZ,{controlNet:s})]},s.controlNetId)),i.jsx(Yt,{flexGrow:1,onClick:o,children:"Add ControlNet"})]})})},_y=p.memo(vZ),jy=e=>{e.stopPropagation()},yZ=nt((e,t)=>{const n=re(),r=p.useCallback(s=>{s.shiftKey&&n(os(!0))},[n]),o=p.useCallback(s=>{s.shiftKey||n(os(!1))},[n]);return i.jsx(K6,{ref:t,onPaste:jy,onKeyDown:r,onKeyUp:o,...e})}),CE=p.memo(yZ),bZ=e=>{const{onClick:t}=e;return i.jsx(Ie,{size:"sm","aria-label":"Add Embedding",tooltip:"Add Embedding",icon:i.jsx(k1,{}),sx:{p:2,color:"base.500",_hover:{color:"base.600"},_active:{color:"base.700"},_dark:{color:"base.500",_hover:{color:"base.400"},_active:{color:"base.300"}}},variant:"link",onClick:t})},PE=p.memo(bZ),kE=e=>{const{onSelect:t,isOpen:n,onClose:r,children:o}=e,{data:s}=hQ(),a=p.useRef(null),u=B(h=>h.generation.model),d=p.useMemo(()=>{if(!s)return[];const h=[];return ii(s.entities,(m,v)=>{if(!m)return;const b=(u==null?void 0:u.base_model)!==m.base_model;h.push({value:m.name,label:m.name,group:Yr[m.base_model],disabled:b,tooltip:b?`Incompatible base model: ${m.base_model}`:void 0})}),h.sort((m,v)=>m.disabled&&!v.disabled?1:-1)},[s,u==null?void 0:u.base_model]),f=p.useCallback(h=>{h&&t(h)},[t]);return i.jsxs(p1,{initialFocusRef:a,isOpen:n,onClose:r,placement:"bottom",openDelay:0,closeDelay:0,closeOnBlur:!0,returnFocusOnClose:!0,children:[i.jsx(f1,{children:o}),i.jsx(h1,{sx:{p:0,top:-1,shadow:"dark-lg",borderColor:"accent.300",borderWidth:"2px",borderStyle:"solid",_dark:{borderColor:"accent.400"}},children:i.jsx(z6,{sx:{p:0,w:`calc(${my} - 2rem )`},children:d.length===0?i.jsx(H,{sx:{justifyContent:"center",p:2},children:i.jsx(Ue,{sx:{fontSize:"sm",color:"base.500",_dark:"base.700"},children:"No Embeddings Loaded"})}):i.jsx(qn,{inputRef:a,autoFocus:!0,placeholder:"Add Embedding",value:null,data:d,nothingFound:"No matching Embeddings",itemComponent:wy,disabled:d.length===0,onDropdownClose:r,filter:(h,m)=>{var v;return((v=m.label)==null?void 0:v.toLowerCase().includes(h.toLowerCase().trim()))||m.value.toLowerCase().includes(h.toLowerCase().trim())},onChange:f})})})]})},Ey=()=>{const e=B(m=>m.generation.negativePrompt),t=p.useRef(null),{isOpen:n,onClose:r,onOpen:o}=Ja(),s=re(),{t:a}=me(),u=p.useCallback(m=>{s(iu(m.target.value))},[s]),d=p.useCallback(m=>{m.key==="<"&&o()},[o]),f=p.useCallback(m=>{if(!t.current)return;const v=t.current.selectionStart;if(v===void 0)return;let b=e.slice(0,v);b[b.length-1]!=="<"&&(b+="<"),b+=`${m}>`;const w=b.length;b+=e.slice(v),pc.flushSync(()=>{s(iu(b))}),t.current.selectionEnd=w,r()},[s,r,e]),h=cr("embedding").isFeatureEnabled;return i.jsxs(ir,{children:[i.jsx(kE,{isOpen:n,onClose:r,onSelect:f,children:i.jsx(CE,{id:"negativePrompt",name:"negativePrompt",ref:t,value:e,placeholder:a("parameters.negativePromptPlaceholder"),onChange:u,resize:"vertical",fontSize:"sm",minH:16,...h&&{onKeyDown:d}})}),!n&&h&&i.jsx(qe,{sx:{position:"absolute",top:0,insetInlineEnd:0},children:i.jsx(PE,{onClick:o})})]})},xZ=Pe([mn,Sr],({generation:e,ui:t},n)=>({shouldPinParametersPanel:t.shouldPinParametersPanel,prompt:e.positivePrompt,activeTabName:n}),{memoizeOptions:{resultEqualityCheck:Wt}}),Iy=()=>{const e=re(),{prompt:t,shouldPinParametersPanel:n,activeTabName:r}=B(xZ),o=Br(),s=p.useRef(null),{isOpen:a,onClose:u,onOpen:d}=Ja(),{t:f}=me(),h=p.useCallback(w=>{e(au(w.target.value))},[e]);Ge("alt+a",()=>{var w;(w=s.current)==null||w.focus()},[]);const m=p.useCallback(w=>{if(!s.current)return;const C=s.current.selectionStart;if(C===void 0)return;let S=t.slice(0,C);S[S.length-1]!=="<"&&(S+="<"),S+=`${w}>`;const P=S.length;S+=t.slice(C),pc.flushSync(()=>{e(au(S))}),s.current.selectionStart=P,s.current.selectionEnd=P,u()},[e,u,t]),v=cr("embedding").isFeatureEnabled,b=p.useCallback(w=>{w.key==="Enter"&&w.shiftKey===!1&&o&&(w.preventDefault(),e(F0()),e(B0(r))),v&&w.key==="<"&&d()},[o,e,r,d,v]);return i.jsxs(qe,{position:"relative",children:[i.jsx(ir,{children:i.jsx(kE,{isOpen:a,onClose:u,onSelect:m,children:i.jsx(CE,{id:"prompt",name:"prompt",ref:s,value:t,placeholder:f("parameters.positivePromptPlaceholder"),onChange:h,onKeyDown:b,resize:"vertical",minH:32})})}),!a&&v&&i.jsx(qe,{sx:{position:"absolute",top:n?6:0,insetInlineEnd:0},children:i.jsx(PE,{onClick:d})})]})},SZ=Pe(mn,e=>{const{shouldUseNoiseSettings:t,shouldUseCpuNoise:n}=e.generation;return{isDisabled:!t,shouldUseCpuNoise:n}},Et),wZ=()=>{const e=re(),{isDisabled:t,shouldUseCpuNoise:n}=B(SZ);me();const r=o=>e(J8(o.target.checked));return i.jsx(jn,{isDisabled:t,label:"Use CPU Noise",isChecked:n,onChange:r})},CZ=Pe(mn,e=>{const{shouldUseNoiseSettings:t,threshold:n}=e.generation;return{isDisabled:!t,threshold:n}},Et);function PZ(){const e=re(),{threshold:t,isDisabled:n}=B(CZ),{t:r}=me();return i.jsx(vt,{isDisabled:n,label:r("parameters.noiseThreshold"),min:0,max:20,step:.1,onChange:o=>e(Hx(o)),handleReset:()=>e(Hx(0)),value:t,withInput:!0,withReset:!0,withSliderMarks:!0})}const kZ=()=>{const e=re(),t=B(r=>r.generation.shouldUseNoiseSettings);me();const n=r=>e(eR(r.target.checked));return i.jsx(jn,{label:"Enable Noise Settings",isChecked:t,onChange:n})},_Z=Pe(mn,e=>{const{shouldUseNoiseSettings:t,perlin:n}=e.generation;return{isDisabled:!t,perlin:n}},Et);function jZ(){const e=re(),{perlin:t,isDisabled:n}=B(_Z),{t:r}=me();return i.jsx(vt,{isDisabled:n,label:r("parameters.perlinNoise"),min:0,max:1,step:.05,onChange:o=>e(Wx(o)),handleReset:()=>e(Wx(0)),value:t,withInput:!0,withReset:!0,withSliderMarks:!0})}const EZ=Pe(mn,e=>{const{shouldUseNoiseSettings:t}=e.generation;return{activeLabel:t?"Enabled":void 0}},Et),IZ=()=>{const{t:e}=me(),t=cr("noise").isFeatureEnabled,{activeLabel:n}=B(EZ);return t?i.jsx(Po,{label:e("parameters.noiseSettings"),activeLabel:n,children:i.jsxs(H,{sx:{gap:2,flexDirection:"column"},children:[i.jsx(kZ,{}),i.jsx(wZ,{}),i.jsx(jZ,{}),i.jsx(PZ,{})]})}):null},_E=p.memo(IZ),OZ=Pe(No,e=>{const{seamlessXAxis:t}=e;return{seamlessXAxis:t}},Et),RZ=()=>{const{t:e}=me(),{seamlessXAxis:t}=B(OZ),n=re(),r=p.useCallback(o=>{n(tR(o.target.checked))},[n]);return i.jsx(jn,{label:e("parameters.seamlessXAxis"),"aria-label":e("parameters.seamlessXAxis"),isChecked:t,onChange:r})},MZ=p.memo(RZ),TZ=Pe(No,e=>{const{seamlessYAxis:t}=e;return{seamlessYAxis:t}},Et),DZ=()=>{const{t:e}=me(),{seamlessYAxis:t}=B(TZ),n=re(),r=p.useCallback(o=>{n(nR(o.target.checked))},[n]);return i.jsx(jn,{label:e("parameters.seamlessYAxis"),"aria-label":e("parameters.seamlessYAxis"),isChecked:t,onChange:r})},AZ=p.memo(DZ),NZ=(e,t)=>{if(e&&t)return"X & Y";if(e)return"X";if(t)return"Y"},zZ=Pe(No,e=>{const{seamlessXAxis:t,seamlessYAxis:n}=e;return{activeLabel:NZ(t,n)}},Et),$Z=()=>{const{t:e}=me(),{activeLabel:t}=B(zZ);return cr("seamless").isFeatureEnabled?i.jsx(Po,{label:e("parameters.seamlessTiling"),activeLabel:t,children:i.jsxs(H,{sx:{gap:5},children:[i.jsx(qe,{flexGrow:1,children:i.jsx(MZ,{})}),i.jsx(qe,{flexGrow:1,children:i.jsx(AZ,{})})]})}):null},jE=p.memo($Z);function LZ(){const e=B(o=>o.generation.horizontalSymmetrySteps),t=B(o=>o.generation.steps),n=re(),{t:r}=me();return i.jsx(vt,{label:r("parameters.hSymmetryStep"),value:e,onChange:o=>n(Vx(o)),min:0,max:t,step:1,withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:()=>n(Vx(0))})}function FZ(){const e=B(o=>o.generation.verticalSymmetrySteps),t=B(o=>o.generation.steps),n=re(),{t:r}=me();return i.jsx(vt,{label:r("parameters.vSymmetryStep"),value:e,onChange:o=>n(Ux(o)),min:0,max:t,step:1,withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:()=>n(Ux(0))})}function BZ(){const e=B(n=>n.generation.shouldUseSymmetry),t=re();return i.jsx(jn,{label:"Enable Symmetry",isChecked:e,onChange:n=>t(rR(n.target.checked))})}const HZ=Pe(mn,e=>({activeLabel:e.generation.shouldUseSymmetry?"Enabled":void 0}),Et),WZ=()=>{const{t:e}=me(),{activeLabel:t}=B(HZ);return cr("symmetry").isFeatureEnabled?i.jsx(Po,{label:e("parameters.symmetry"),activeLabel:t,children:i.jsxs(H,{sx:{gap:2,flexDirection:"column"},children:[i.jsx(BZ,{}),i.jsx(LZ,{}),i.jsx(FZ,{})]})}):null},Oy=p.memo(WZ);function VZ(){const e=B(o=>o.generation.variationAmount),t=B(o=>o.generation.shouldGenerateVariations),{t:n}=me(),r=re();return i.jsx(vt,{label:n("parameters.variationAmount"),value:e,step:.01,min:0,max:1,isDisabled:!t,onChange:o=>r(Gx(o)),handleReset:()=>r(Gx(.1)),withInput:!0,withReset:!0,withSliderMarks:!0})}const UZ=()=>{const e=re(),t=B(r=>r.generation.shouldGenerateVariations);me();const n=r=>e(oR(r.target.checked));return i.jsx(jn,{label:"Enable Variations",isChecked:t,onChange:n})},GZ=e=>{const{label:t="",isDisabled:n=!1,isInvalid:r,formControlProps:o,...s}=e,a=re(),u=p.useCallback(f=>{f.shiftKey&&a(os(!0))},[a]),d=p.useCallback(f=>{f.shiftKey||a(os(!1))},[a]);return i.jsxs(ir,{isInvalid:r,isDisabled:n,...o,children:[t!==""&&i.jsx(mr,{children:t}),i.jsx(Bu,{...s,onPaste:jy,onKeyDown:u,onKeyUp:d})]})},zn=p.memo(GZ);function qZ(){const e=B(s=>s.generation.seedWeights),t=B(s=>s.generation.shouldGenerateVariations),{t:n}=me(),r=re(),o=s=>r(sR(s.target.value));return i.jsx(zn,{label:n("parameters.seedWeights"),value:e,isInvalid:t&&!(ky(e)||e===""),isDisabled:!t,onChange:o})}const KZ=Pe(mn,e=>({activeLabel:e.generation.shouldGenerateVariations?"Enabled":void 0}),Et),YZ=()=>{const{t:e}=me(),{activeLabel:t}=B(KZ);return cr("variation").isFeatureEnabled?i.jsx(Po,{label:e("parameters.variations"),activeLabel:t,children:i.jsxs(H,{sx:{gap:2,flexDirection:"column"},children:[i.jsx(UZ,{}),i.jsx(VZ,{}),i.jsx(qZ,{})]})}):null},Ry=p.memo(YZ),XZ=Pe(ao,e=>({isProcessing:e.isProcessing,isConnected:e.isConnected,isCancelable:e.isCancelable,currentIteration:e.currentIteration,totalIterations:e.totalIterations,sessionId:e.sessionId,cancelType:e.cancelType,isCancelScheduled:e.isCancelScheduled}),{memoizeOptions:{resultEqualityCheck:Wt}}),QZ=e=>{const t=re(),{btnGroupWidth:n="auto",...r}=e,{isProcessing:o,isConnected:s,isCancelable:a,cancelType:u,isCancelScheduled:d,sessionId:f}=B(XZ),h=p.useCallback(()=>{if(f){if(u==="scheduled"){t(aR());return}t(iR({session_id:f}))}},[t,f,u]),{t:m}=me(),v=p.useCallback(C=>{const S=Array.isArray(C)?C[0]:C;t(lR(S))},[t]);Ge("shift+x",()=>{(s||o)&&a&&h()},[s,o,a]);const b=p.useMemo(()=>m(d?"parameters.cancel.isScheduled":u==="immediate"?"parameters.cancel.immediate":"parameters.cancel.schedule"),[m,u,d]),w=p.useMemo(()=>d?i.jsx(cR,{}):u==="immediate"?i.jsx(XY,{}):i.jsx(UY,{}),[u,d]);return i.jsxs(gr,{isAttached:!0,width:n,children:[i.jsx(Ie,{icon:w,tooltip:b,"aria-label":b,isDisabled:!s||!o||!a,onClick:h,colorScheme:"error",id:"cancel-button",...r}),i.jsxs(gh,{closeOnSelect:!1,children:[i.jsx(vh,{as:Ie,tooltip:m("parameters.cancel.setType"),"aria-label":m("parameters.cancel.setType"),icon:i.jsx(Zz,{w:"1em",h:"1em"}),paddingX:0,paddingY:0,colorScheme:"error",minWidth:5,...r}),i.jsx(Vu,{minWidth:"240px",children:i.jsxs(c1,{value:u,title:"Cancel Type",type:"radio",onChange:v,children:[i.jsx(bu,{value:"immediate",children:m("parameters.cancel.immediate")}),i.jsx(bu,{value:"scheduled",children:m("parameters.cancel.schedule")})]})})]})]})},Zh=p.memo(QZ),ZZ=Pe(ao,e=>({isProcessing:e.isProcessing,currentStep:e.currentStep,totalSteps:e.totalSteps,currentStatusHasSteps:e.currentStatusHasSteps}),{memoizeOptions:{resultEqualityCheck:Wt}}),JZ=()=>{const{t:e}=me(),{isProcessing:t,currentStep:n,totalSteps:r,currentStatusHasSteps:o}=B(ZZ),s=n?Math.round(n*100/r):0;return i.jsx(L6,{value:s,"aria-label":e("accessibility.invokeProgressBar"),isIndeterminate:t&&!o,height:"full",colorScheme:"accent"})},EE=p.memo(JZ),f4={_disabled:{bg:"none",cursor:"not-allowed",_hover:{bg:"none"}}};function My(e){const{iconButton:t=!1,...n}=e,r=re(),o=Br(),s=B(Sr),a=B(f=>f.system.isProcessing),u=p.useCallback(()=>{r(F0()),r(B0(s))},[r,s]),{t:d}=me();return Ge(["ctrl+enter","meta+enter"],u,{enabled:()=>o,preventDefault:!0,enableOnFormTags:["input","textarea","select"]},[o,s]),i.jsx(qe,{style:{flexGrow:4},position:"relative",children:i.jsxs(qe,{style:{position:"relative"},children:[!o&&i.jsx(qe,{borderRadius:"base",style:{position:"absolute",bottom:"0",left:"0",right:"0",height:"100%",overflow:"clip"},...n,children:i.jsx(EE,{})}),t?i.jsx(Ie,{"aria-label":d("parameters.invoke"),type:"submit",icon:i.jsx(kP,{}),isDisabled:!o||a,onClick:u,tooltip:d("parameters.invoke"),tooltipProps:{placement:"top"},colorScheme:"accent",id:"invoke-button",...n,sx:{w:"full",flexGrow:1,...a?f4:{}}}):i.jsx(Yt,{"aria-label":d("parameters.invoke"),type:"submit",isDisabled:!o||a,onClick:u,colorScheme:"accent",id:"invoke-button",...n,sx:{w:"full",flexGrow:1,fontWeight:700,...a?f4:{}},children:"Invoke"})]})})}const Ty=()=>i.jsxs(H,{gap:2,children:[i.jsx(My,{}),i.jsx(Zh,{})]}),p4=/^-?(0\.)?\.?$/,eJ=e=>{const{label:t,isDisabled:n=!1,showStepper:r=!0,isInvalid:o,value:s,onChange:a,min:u,max:d,isInteger:f=!0,formControlProps:h,formLabelProps:m,numberInputFieldProps:v,numberInputStepperProps:b,tooltipProps:w,...C}=e,S=re(),[P,k]=p.useState(String(s));p.useEffect(()=>{!P.match(p4)&&s!==Number(P)&&k(String(s))},[s,P]);const j=R=>{k(R),R.match(p4)||a(f?Math.floor(Number(R)):Number(R))},E=R=>{const M=Us(f?Math.floor(Number(R.target.value)):Number(R.target.value),u,d);k(String(M)),a(M)},I=p.useCallback(R=>{R.shiftKey&&S(os(!0))},[S]),O=p.useCallback(R=>{R.shiftKey||S(os(!1))},[S]);return i.jsx(Gn,{...w,children:i.jsxs(ir,{isDisabled:n,isInvalid:o,...h,children:[t&&i.jsx(mr,{...m,children:t}),i.jsxs(M3,{value:P,min:u,max:d,keepWithinRange:!0,clampValueOnBlur:!1,onChange:j,onBlur:E,...C,onPaste:jy,children:[i.jsx(T3,{...v,onKeyDown:I,onKeyUp:O}),r&&i.jsxs(D3,{children:[i.jsx(A3,{...b}),i.jsx(N3,{...b})]})]})]})})},oc=p.memo(eJ),tJ=Pe([No,fi,So,$u],(e,t,n,r)=>{const{initial:o,min:s,sliderMax:a,inputMax:u}=t.sd.guidance,{cfgScale:d}=e,{shouldUseSliders:f}=n,{shift:h}=r;return{cfgScale:d,initial:o,min:s,sliderMax:a,inputMax:u,shouldUseSliders:f,shift:h}},Et),nJ=()=>{const{cfgScale:e,initial:t,min:n,sliderMax:r,inputMax:o,shouldUseSliders:s,shift:a}=B(tJ),u=re(),{t:d}=me(),f=p.useCallback(m=>u(Ff(m)),[u]),h=p.useCallback(()=>u(Ff(t)),[u,t]);return s?i.jsx(vt,{label:d("parameters.cfgScale"),step:a?.1:.5,min:n,max:r,onChange:f,handleReset:h,value:e,sliderNumberInputProps:{max:o},withInput:!0,withReset:!0,withSliderMarks:!0,isInteger:!1}):i.jsx(oc,{label:d("parameters.cfgScale"),step:.5,min:n,max:o,onChange:f,value:e,isInteger:!1,numberInputFieldProps:{textAlign:"center"}})},sc=p.memo(nJ),rJ=Pe([mn],e=>{const{initial:t,min:n,sliderMax:r,inputMax:o,fineStep:s,coarseStep:a}=e.config.sd.iterations,{iterations:u}=e.generation,{shouldUseSliders:d}=e.ui,f=e.dynamicPrompts.isEnabled&&e.dynamicPrompts.combinatorial,h=e.hotkeys.shift?s:a;return{iterations:u,initial:t,min:n,sliderMax:r,inputMax:o,step:h,shouldUseSliders:d,isDisabled:f}},Et),oJ=()=>{const{iterations:e,initial:t,min:n,sliderMax:r,inputMax:o,step:s,shouldUseSliders:a,isDisabled:u}=B(rJ),d=re(),{t:f}=me(),h=p.useCallback(v=>{d(qx(v))},[d]),m=p.useCallback(()=>{d(qx(t))},[d,t]);return a?i.jsx(vt,{isDisabled:u,label:f("parameters.images"),step:s,min:n,max:r,onChange:h,handleReset:m,value:e,withInput:!0,withReset:!0,withSliderMarks:!0,sliderNumberInputProps:{max:o}}):i.jsx(oc,{isDisabled:u,label:f("parameters.images"),step:s,min:n,max:o,onChange:h,value:e,numberInputFieldProps:{textAlign:"center"}})},ac=p.memo(oJ),sJ=()=>{const e=re(),{t}=me(),{data:n}=wE(),r=B(d=>d.generation.model),o=B(d=>d.generation.vae),s=p.useMemo(()=>{if(!n)return[];const d=[{value:"default",label:"Default",group:"Default"}];return ii(n.entities,(f,h)=>{if(!f)return;const m=(r==null?void 0:r.base_model)!==f.base_model;d.push({value:h,label:f.name,group:Yr[f.base_model],disabled:m,tooltip:m?`Incompatible base model: ${f.base_model}`:void 0})}),d.sort((f,h)=>f.disabled&&!h.disabled?1:-1)},[n,r==null?void 0:r.base_model]),a=p.useMemo(()=>o!=null&&o.id?n==null?void 0:n.entities[o==null?void 0:o.id]:null,[n==null?void 0:n.entities,o]),u=p.useCallback(d=>{if(!d||d==="default"){e(cg(null));return}const[f,h,m]=d.split("/"),v=uR.parse({id:d,name:m,base_model:f});e(cg(v))},[e]);return p.useEffect(()=>{o&&(n!=null&&n.ids.includes(o.id))||e(cg(null))},[u,n==null?void 0:n.ids,o,e]),i.jsx(qn,{itemComponent:wy,tooltip:a==null?void 0:a.description,label:t("modelManager.vae"),value:(o==null?void 0:o.id)??"default",placeholder:"Default",data:s,onChange:u,disabled:s.length===0,clearable:!0})},aJ=p.memo(sJ),iJ=Pe([So,No],(e,t)=>{const{scheduler:n}=t,{favoriteSchedulers:r}=e,o=E3.map(s=>({value:s,label:I3[s],group:r.includes(s)?"Favorites":void 0})).sort((s,a)=>s.label.localeCompare(a.label));return{scheduler:n,data:o}},Et),lJ=()=>{const e=re(),{t}=me(),{scheduler:n,data:r}=B(iJ),o=p.useCallback(s=>{s&&e(vv(s))},[e]);return i.jsx(qn,{label:t("parameters.scheduler"),value:n,data:r,onChange:o})},cJ=p.memo(lJ),uJ=()=>{const e=cr("vae").isFeatureEnabled;return i.jsxs(H,{gap:3,w:"full",flexWrap:e?"wrap":"nowrap",children:[i.jsx(qe,{w:"full",children:i.jsx(gQ,{})}),i.jsxs(H,{gap:3,w:"full",children:[e&&i.jsx(qe,{w:"full",children:i.jsx(aJ,{})}),i.jsx(qe,{w:"full",children:i.jsx(cJ,{})})]})]})},ic=p.memo(uJ),dJ=[{name:"Free",value:null},{name:"Portrait",value:.67/1},{name:"Wide",value:16/9},{name:"Square",value:1/1}];function fJ(){const e=B(o=>o.ui.aspectRatio),t=re(),n=B(o=>o.generation.shouldFitToWidthHeight),r=B(Sr);return i.jsx(H,{gap:2,flexGrow:1,children:i.jsx(gr,{isAttached:!0,children:dJ.map(o=>i.jsx(Yt,{size:"sm",isChecked:e===o.value,isDisabled:r==="img2img"?!n:!1,onClick:()=>t(dR(o.value)),children:o.name},o.name))})})}const pJ=Pe([No,$u,fi,So],(e,t,n,r)=>{const{initial:o,min:s,sliderMax:a,inputMax:u,fineStep:d,coarseStep:f}=n.sd.height,{height:h}=e,{aspectRatio:m}=r,v=t.shift?d:f;return{height:h,initial:o,min:s,sliderMax:a,inputMax:u,step:v,aspectRatio:m}},Et),hJ=e=>{const{height:t,initial:n,min:r,sliderMax:o,inputMax:s,step:a,aspectRatio:u}=B(pJ),d=re(),{t:f}=me(),h=p.useCallback(v=>{if(d(Kl(v)),u){const b=Yl(v*u,8);d(ql(b))}},[d,u]),m=p.useCallback(()=>{if(d(Kl(n)),u){const v=Yl(n*u,8);d(ql(v))}},[d,n,u]);return i.jsx(vt,{label:f("parameters.height"),value:t,min:r,step:a,max:o,onChange:h,handleReset:m,withInput:!0,withReset:!0,withSliderMarks:!0,sliderNumberInputProps:{max:s},...e})},mJ=p.memo(hJ),gJ=Pe([No,$u,fi,So],(e,t,n,r)=>{const{initial:o,min:s,sliderMax:a,inputMax:u,fineStep:d,coarseStep:f}=n.sd.width,{width:h}=e,{aspectRatio:m}=r,v=t.shift?d:f;return{width:h,initial:o,min:s,sliderMax:a,inputMax:u,step:v,aspectRatio:m}},Et),vJ=e=>{const{width:t,initial:n,min:r,sliderMax:o,inputMax:s,step:a,aspectRatio:u}=B(gJ),d=re(),{t:f}=me(),h=p.useCallback(v=>{if(d(ql(v)),u){const b=Yl(v/u,8);d(Kl(b))}},[d,u]),m=p.useCallback(()=>{if(d(ql(n)),u){const v=Yl(n/u,8);d(Kl(v))}},[d,n,u]);return i.jsx(vt,{label:f("parameters.width"),value:t,min:r,step:a,max:o,onChange:h,handleReset:m,withInput:!0,withReset:!0,withSliderMarks:!0,sliderNumberInputProps:{max:s},...e})},yJ=p.memo(vJ);function eh(){const{t:e}=me(),t=re(),n=B(o=>o.generation.shouldFitToWidthHeight),r=B(Sr);return i.jsxs(H,{sx:{gap:2,p:4,borderRadius:4,flexDirection:"column",w:"full",bg:"base.150",_dark:{bg:"base.750"}},children:[i.jsxs(H,{alignItems:"center",gap:2,children:[i.jsx(Ue,{sx:{fontSize:"sm",width:"full",color:"base.700",_dark:{color:"base.300"}},children:e("parameters.aspectRatio")}),i.jsx(li,{}),i.jsx(fJ,{}),i.jsx(Ie,{tooltip:e("ui.swapSizes"),"aria-label":e("ui.swapSizes"),size:"sm",icon:i.jsx(QY,{}),fontSize:20,isDisabled:r==="img2img"?!n:!1,onClick:()=>t(fR())})]}),i.jsx(H,{gap:2,alignItems:"center",children:i.jsxs(H,{gap:2,flexDirection:"column",width:"full",children:[i.jsx(yJ,{isDisabled:r==="img2img"?!n:!1}),i.jsx(mJ,{isDisabled:r==="img2img"?!n:!1})]})})]})}const bJ=Pe([No,fi,So,$u],(e,t,n,r)=>{const{initial:o,min:s,sliderMax:a,inputMax:u,fineStep:d,coarseStep:f}=t.sd.steps,{steps:h}=e,{shouldUseSliders:m}=n,v=r.shift?d:f;return{steps:h,initial:o,min:s,sliderMax:a,inputMax:u,step:v,shouldUseSliders:m}},Et),xJ=()=>{const{steps:e,initial:t,min:n,sliderMax:r,inputMax:o,step:s,shouldUseSliders:a}=B(bJ),u=re(),{t:d}=me(),f=p.useCallback(v=>{u(Bf(v))},[u]),h=p.useCallback(()=>{u(Bf(t))},[u,t]),m=p.useCallback(()=>{u(F0())},[u]);return a?i.jsx(vt,{label:d("parameters.steps"),min:n,max:r,step:s,onChange:f,handleReset:h,value:e,withInput:!0,withReset:!0,withSliderMarks:!0,sliderNumberInputProps:{max:o}}):i.jsx(oc,{label:d("parameters.steps"),min:n,max:o,step:s,onChange:f,value:e,numberInputFieldProps:{textAlign:"center"},onBlur:m})},lc=p.memo(xJ);function SJ(){const e=re(),t=B(o=>o.generation.shouldFitToWidthHeight),n=o=>e(pR(o.target.checked)),{t:r}=me();return i.jsx(jn,{label:r("parameters.imageFit"),isChecked:t,onChange:n})}const wJ=Pe([No,$u,fi],(e,t,n)=>{const{initial:r,min:o,sliderMax:s,inputMax:a,fineStep:u,coarseStep:d}=n.sd.img2imgStrength,{img2imgStrength:f}=e,h=t.shift?u:d;return{img2imgStrength:f,initial:r,min:o,sliderMax:s,inputMax:a,step:h}},Et),CJ=()=>{const{img2imgStrength:e,initial:t,min:n,sliderMax:r,inputMax:o,step:s}=B(wJ),a=re(),{t:u}=me(),d=p.useCallback(h=>a(Hf(h)),[a]),f=p.useCallback(()=>{a(Hf(t))},[a,t]);return i.jsx(vt,{label:`${u("parameters.denoisingStrength")}`,step:s,min:n,max:r,onChange:d,handleReset:f,value:e,isInteger:!1,withInput:!0,withSliderMarks:!0,withReset:!0,sliderNumberInputProps:{max:o}})},IE=p.memo(CJ);function PJ(){const e=B(a=>a.generation.seed),t=B(a=>a.generation.shouldRandomizeSeed),n=B(a=>a.generation.shouldGenerateVariations),{t:r}=me(),o=re(),s=a=>o(Lf(a));return i.jsx(oc,{label:r("parameters.seed"),step:1,precision:0,flexGrow:1,min:z3,max:$3,isDisabled:t,isInvalid:e<0&&n,onChange:s,value:e,formControlProps:{display:"flex",alignItems:"center",gap:3}})}const kJ=(e,t)=>Math.floor(Math.random()*(t-e+1)+e);function _J(){const e=re(),t=B(o=>o.generation.shouldRandomizeSeed),{t:n}=me(),r=()=>e(Lf(kJ(z3,$3)));return i.jsx(Ie,{size:"sm",isDisabled:t,"aria-label":n("parameters.shuffle"),tooltip:n("parameters.shuffle"),onClick:r,icon:i.jsx(Wz,{})})}const jJ=()=>{const e=re(),{t}=me(),n=B(o=>o.generation.shouldRandomizeSeed),r=o=>e(hR(o.target.checked));return i.jsx(jn,{label:t("common.random"),isChecked:n,onChange:r})},EJ=p.memo(jJ),IJ=()=>i.jsxs(H,{sx:{gap:4,alignItems:"center"},children:[i.jsx(PJ,{}),i.jsx(_J,{}),i.jsx(EJ,{})]}),cc=p.memo(IJ),OJ=Pe([So,No],(e,t)=>{const{shouldUseSliders:n}=e,{shouldFitToWidthHeight:r,shouldRandomizeSeed:o}=t;return{shouldUseSliders:n,shouldFitToWidthHeight:r,activeLabel:o?void 0:"Manual Seed"}},Et),RJ=()=>{const{shouldUseSliders:e,shouldFitToWidthHeight:t,activeLabel:n}=B(OJ);return i.jsx(Po,{label:"General",activeLabel:n,defaultIsOpen:!0,children:i.jsxs(H,{sx:{flexDirection:"column",gap:3},children:[e?i.jsxs(i.Fragment,{children:[i.jsx(ac,{}),i.jsx(lc,{}),i.jsx(sc,{}),i.jsx(ic,{}),i.jsx(qe,{pt:2,children:i.jsx(cc,{})}),i.jsx(eh,{})]}):i.jsxs(i.Fragment,{children:[i.jsxs(H,{gap:3,children:[i.jsx(ac,{}),i.jsx(lc,{}),i.jsx(sc,{})]}),i.jsx(ic,{}),i.jsx(qe,{pt:2,children:i.jsx(cc,{})}),i.jsx(eh,{})]}),i.jsx(IE,{}),i.jsx(SJ,{})]})})},MJ=p.memo(RJ),TJ=()=>i.jsxs(i.Fragment,{children:[i.jsx(Iy,{}),i.jsx(Ey,{}),i.jsx(Ty,{}),i.jsx(MJ,{}),i.jsx(Cy,{}),i.jsx(Sy,{}),i.jsx(_y,{}),i.jsx(Ry,{}),i.jsx(_E,{}),i.jsx(Oy,{}),i.jsx(jE,{}),i.jsx(Py,{})]}),OE=p.memo(TJ),DJ=()=>{const e=re(),t=p.useRef(null),n=p.useCallback(()=>{t.current&&t.current.setLayout([50,50])},[]);return i.jsxs(H,{sx:{gap:4,w:"full",h:"full"},children:[i.jsx(xy,{children:i.jsx(OE,{})}),i.jsx(qe,{sx:{w:"full",h:"full"},children:i.jsxs(by,{ref:t,autoSaveId:"imageTab.content",direction:"horizontal",style:{height:"100%",width:"100%"},children:[i.jsx(Eu,{id:"imageTab.content.initImage",order:0,defaultSize:50,minSize:25,style:{position:"relative"},children:i.jsx(qX,{})}),i.jsx(vE,{onDoubleClick:n}),i.jsx(Eu,{id:"imageTab.content.selectedImage",order:1,defaultSize:50,minSize:25,onResize:()=>{e(ks())},children:i.jsx(yE,{})})]})})]})},AJ=p.memo(DJ);var NJ=function(t){return zJ(t)&&!$J(t)};function zJ(e){return!!e&&typeof e=="object"}function $J(e){var t=Object.prototype.toString.call(e);return t==="[object RegExp]"||t==="[object Date]"||BJ(e)}var LJ=typeof Symbol=="function"&&Symbol.for,FJ=LJ?Symbol.for("react.element"):60103;function BJ(e){return e.$$typeof===FJ}function HJ(e){return Array.isArray(e)?[]:{}}function th(e,t){return t.clone!==!1&&t.isMergeableObject(e)?Iu(HJ(e),e,t):e}function WJ(e,t,n){return e.concat(t).map(function(r){return th(r,n)})}function VJ(e,t,n){var r={};return n.isMergeableObject(e)&&Object.keys(e).forEach(function(o){r[o]=th(e[o],n)}),Object.keys(t).forEach(function(o){!n.isMergeableObject(t[o])||!e[o]?r[o]=th(t[o],n):r[o]=Iu(e[o],t[o],n)}),r}function Iu(e,t,n){n=n||{},n.arrayMerge=n.arrayMerge||WJ,n.isMergeableObject=n.isMergeableObject||NJ;var r=Array.isArray(t),o=Array.isArray(e),s=r===o;return s?r?n.arrayMerge(e,t,n):VJ(e,t,n):th(t,n)}Iu.all=function(t,n){if(!Array.isArray(t))throw new Error("first argument should be an array");return t.reduce(function(r,o){return Iu(r,o,n)},{})};var y0=Iu,h4=Array.isArray,m4=Object.keys,UJ=Object.prototype.hasOwnProperty,GJ=typeof Element<"u";function b0(e,t){if(e===t)return!0;if(e&&t&&typeof e=="object"&&typeof t=="object"){var n=h4(e),r=h4(t),o,s,a;if(n&&r){if(s=e.length,s!=t.length)return!1;for(o=s;o--!==0;)if(!b0(e[o],t[o]))return!1;return!0}if(n!=r)return!1;var u=e instanceof Date,d=t instanceof Date;if(u!=d)return!1;if(u&&d)return e.getTime()==t.getTime();var f=e instanceof RegExp,h=t instanceof RegExp;if(f!=h)return!1;if(f&&h)return e.toString()==t.toString();var m=m4(e);if(s=m.length,s!==m4(t).length)return!1;for(o=s;o--!==0;)if(!UJ.call(t,m[o]))return!1;if(GJ&&e instanceof Element&&t instanceof Element)return e===t;for(o=s;o--!==0;)if(a=m[o],!(a==="_owner"&&e.$$typeof)&&!b0(e[a],t[a]))return!1;return!0}return e!==e&&t!==t}var qJ=function(t,n){try{return b0(t,n)}catch(r){if(r.message&&r.message.match(/stack|recursion/i)||r.number===-2146828260)return console.warn("Warning: react-fast-compare does not handle circular references.",r.name,r.message),!1;throw r}};const ji=dc(qJ);var KJ=!0;function YJ(e,t){if(!KJ){if(e)return;var n="Warning: "+t;typeof console<"u"&&console.warn(n);try{throw Error(n)}catch{}}}function Wn(){return Wn=Object.assign||function(e){for(var t=1;t=0)&&(n[o]=e[o]);return n}var Jh=p.createContext(void 0);Jh.displayName="FormikContext";var XJ=Jh.Provider;Jh.Consumer;function RE(){var e=p.useContext(Jh);return e||YJ(!1),e}var Ro=function(t){return typeof t=="function"},em=function(t){return t!==null&&typeof t=="object"},QJ=function(t){return String(Math.floor(Number(t)))===t},sv=function(t){return Object.prototype.toString.call(t)==="[object String]"},ZJ=function(t){return p.Children.count(t)===0},av=function(t){return em(t)&&Ro(t.then)};function Oo(e,t,n,r){r===void 0&&(r=0);for(var o=f5(t);e&&r=0?[]:{}}}return(s===0?e:o)[a[s]]===n?e:(n===void 0?delete o[a[s]]:o[a[s]]=n,s===0&&n===void 0&&delete r[a[s]],r)}function ME(e,t,n,r){n===void 0&&(n=new WeakMap),r===void 0&&(r={});for(var o=0,s=Object.keys(e);o0?we.map(function(pe){return L(pe,Oo(Q,pe))}):[Promise.resolve("DO_NOT_DELETE_YOU_WILL_BE_FIRED")];return Promise.all(te).then(function(pe){return pe.reduce(function(Ne,Xe,yt){return Xe==="DO_NOT_DELETE_YOU_WILL_BE_FIRED"||Xe&&(Ne=Fi(Ne,we[yt],Xe)),Ne},{})})},[L]),V=p.useCallback(function(Q){return Promise.all([D(Q),v.validationSchema?A(Q):{},v.validate?M(Q):{}]).then(function(we){var te=we[0],pe=we[1],Ne=we[2],Xe=y0.all([te,pe,Ne],{arrayMerge:ree});return Xe})},[v.validate,v.validationSchema,D,M,A]),$=Ko(function(Q){return Q===void 0&&(Q=O.values),R({type:"SET_ISVALIDATING",payload:!0}),V(Q).then(function(we){return P.current&&(R({type:"SET_ISVALIDATING",payload:!1}),R({type:"SET_ERRORS",payload:we})),we})});p.useEffect(function(){a&&P.current===!0&&ji(b.current,v.initialValues)&&$(b.current)},[a,$]);var F=p.useCallback(function(Q){var we=Q&&Q.values?Q.values:b.current,te=Q&&Q.errors?Q.errors:w.current?w.current:v.initialErrors||{},pe=Q&&Q.touched?Q.touched:C.current?C.current:v.initialTouched||{},Ne=Q&&Q.status?Q.status:S.current?S.current:v.initialStatus;b.current=we,w.current=te,C.current=pe,S.current=Ne;var Xe=function(){R({type:"RESET_FORM",payload:{isSubmitting:!!Q&&!!Q.isSubmitting,errors:te,touched:pe,status:Ne,values:we,isValidating:!!Q&&!!Q.isValidating,submitCount:Q&&Q.submitCount&&typeof Q.submitCount=="number"?Q.submitCount:0}})};if(v.onReset){var yt=v.onReset(O.values,Ae);av(yt)?yt.then(Xe):Xe()}else Xe()},[v.initialErrors,v.initialStatus,v.initialTouched]);p.useEffect(function(){P.current===!0&&!ji(b.current,v.initialValues)&&f&&(b.current=v.initialValues,F(),a&&$(b.current))},[f,v.initialValues,F,a,$]),p.useEffect(function(){f&&P.current===!0&&!ji(w.current,v.initialErrors)&&(w.current=v.initialErrors||wi,R({type:"SET_ERRORS",payload:v.initialErrors||wi}))},[f,v.initialErrors]),p.useEffect(function(){f&&P.current===!0&&!ji(C.current,v.initialTouched)&&(C.current=v.initialTouched||kf,R({type:"SET_TOUCHED",payload:v.initialTouched||kf}))},[f,v.initialTouched]),p.useEffect(function(){f&&P.current===!0&&!ji(S.current,v.initialStatus)&&(S.current=v.initialStatus,R({type:"SET_STATUS",payload:v.initialStatus}))},[f,v.initialStatus,v.initialTouched]);var U=Ko(function(Q){if(k.current[Q]&&Ro(k.current[Q].validate)){var we=Oo(O.values,Q),te=k.current[Q].validate(we);return av(te)?(R({type:"SET_ISVALIDATING",payload:!0}),te.then(function(pe){return pe}).then(function(pe){R({type:"SET_FIELD_ERROR",payload:{field:Q,value:pe}}),R({type:"SET_ISVALIDATING",payload:!1})})):(R({type:"SET_FIELD_ERROR",payload:{field:Q,value:te}}),Promise.resolve(te))}else if(v.validationSchema)return R({type:"SET_ISVALIDATING",payload:!0}),A(O.values,Q).then(function(pe){return pe}).then(function(pe){R({type:"SET_FIELD_ERROR",payload:{field:Q,value:Oo(pe,Q)}}),R({type:"SET_ISVALIDATING",payload:!1})});return Promise.resolve()}),X=p.useCallback(function(Q,we){var te=we.validate;k.current[Q]={validate:te}},[]),N=p.useCallback(function(Q){delete k.current[Q]},[]),G=Ko(function(Q,we){R({type:"SET_TOUCHED",payload:Q});var te=we===void 0?o:we;return te?$(O.values):Promise.resolve()}),W=p.useCallback(function(Q){R({type:"SET_ERRORS",payload:Q})},[]),q=Ko(function(Q,we){var te=Ro(Q)?Q(O.values):Q;R({type:"SET_VALUES",payload:te});var pe=we===void 0?n:we;return pe?$(te):Promise.resolve()}),ne=p.useCallback(function(Q,we){R({type:"SET_FIELD_ERROR",payload:{field:Q,value:we}})},[]),ve=Ko(function(Q,we,te){R({type:"SET_FIELD_VALUE",payload:{field:Q,value:we}});var pe=te===void 0?n:te;return pe?$(Fi(O.values,Q,we)):Promise.resolve()}),le=p.useCallback(function(Q,we){var te=we,pe=Q,Ne;if(!sv(Q)){Q.persist&&Q.persist();var Xe=Q.target?Q.target:Q.currentTarget,yt=Xe.type,Xt=Xe.name,an=Xe.id,Pn=Xe.value,vr=Xe.checked,ln=Xe.outerHTML,Kn=Xe.options,Re=Xe.multiple;te=we||Xt||an,pe=/number|range/.test(yt)?(Ne=parseFloat(Pn),isNaN(Ne)?"":Ne):/checkbox/.test(yt)?see(Oo(O.values,te),vr,Pn):Kn&&Re?oee(Kn):Pn}te&&ve(te,pe)},[ve,O.values]),oe=Ko(function(Q){if(sv(Q))return function(we){return le(we,Q)};le(Q)}),Y=Ko(function(Q,we,te){we===void 0&&(we=!0),R({type:"SET_FIELD_TOUCHED",payload:{field:Q,value:we}});var pe=te===void 0?o:te;return pe?$(O.values):Promise.resolve()}),ae=p.useCallback(function(Q,we){Q.persist&&Q.persist();var te=Q.target,pe=te.name,Ne=te.id,Xe=te.outerHTML,yt=we||pe||Ne;Y(yt,!0)},[Y]),de=Ko(function(Q){if(sv(Q))return function(we){return ae(we,Q)};ae(Q)}),xe=p.useCallback(function(Q){Ro(Q)?R({type:"SET_FORMIK_STATE",payload:Q}):R({type:"SET_FORMIK_STATE",payload:function(){return Q}})},[]),se=p.useCallback(function(Q){R({type:"SET_STATUS",payload:Q})},[]),ge=p.useCallback(function(Q){R({type:"SET_ISSUBMITTING",payload:Q})},[]),fe=Ko(function(){return R({type:"SUBMIT_ATTEMPT"}),$().then(function(Q){var we=Q instanceof Error,te=!we&&Object.keys(Q).length===0;if(te){var pe;try{if(pe=ye(),pe===void 0)return}catch(Ne){throw Ne}return Promise.resolve(pe).then(function(Ne){return P.current&&R({type:"SUBMIT_SUCCESS"}),Ne}).catch(function(Ne){if(P.current)throw R({type:"SUBMIT_FAILURE"}),Ne})}else if(P.current&&(R({type:"SUBMIT_FAILURE"}),we))throw Q})}),ke=Ko(function(Q){Q&&Q.preventDefault&&Ro(Q.preventDefault)&&Q.preventDefault(),Q&&Q.stopPropagation&&Ro(Q.stopPropagation)&&Q.stopPropagation(),fe().catch(function(we){console.warn("Warning: An unhandled error was caught from submitForm()",we)})}),Ae={resetForm:F,validateForm:$,validateField:U,setErrors:W,setFieldError:ne,setFieldTouched:Y,setFieldValue:ve,setStatus:se,setSubmitting:ge,setTouched:G,setValues:q,setFormikState:xe,submitForm:fe},ye=Ko(function(){return h(O.values,Ae)}),Oe=Ko(function(Q){Q&&Q.preventDefault&&Ro(Q.preventDefault)&&Q.preventDefault(),Q&&Q.stopPropagation&&Ro(Q.stopPropagation)&&Q.stopPropagation(),F()}),at=p.useCallback(function(Q){return{value:Oo(O.values,Q),error:Oo(O.errors,Q),touched:!!Oo(O.touched,Q),initialValue:Oo(b.current,Q),initialTouched:!!Oo(C.current,Q),initialError:Oo(w.current,Q)}},[O.errors,O.touched,O.values]),Fe=p.useCallback(function(Q){return{setValue:function(te,pe){return ve(Q,te,pe)},setTouched:function(te,pe){return Y(Q,te,pe)},setError:function(te){return ne(Q,te)}}},[ve,Y,ne]),Ye=p.useCallback(function(Q){var we=em(Q),te=we?Q.name:Q,pe=Oo(O.values,te),Ne={name:te,value:pe,onChange:oe,onBlur:de};if(we){var Xe=Q.type,yt=Q.value,Xt=Q.as,an=Q.multiple;Xe==="checkbox"?yt===void 0?Ne.checked=!!pe:(Ne.checked=!!(Array.isArray(pe)&&~pe.indexOf(yt)),Ne.value=yt):Xe==="radio"?(Ne.checked=pe===yt,Ne.value=yt):Xt==="select"&&an&&(Ne.value=Ne.value||[],Ne.multiple=!0)}return Ne},[de,oe,O.values]),_t=p.useMemo(function(){return!ji(b.current,O.values)},[b.current,O.values]),xt=p.useMemo(function(){return typeof u<"u"?_t?O.errors&&Object.keys(O.errors).length===0:u!==!1&&Ro(u)?u(v):u:O.errors&&Object.keys(O.errors).length===0},[u,_t,O.errors,v]),Fn=Wn({},O,{initialValues:b.current,initialErrors:w.current,initialTouched:C.current,initialStatus:S.current,handleBlur:de,handleChange:oe,handleReset:Oe,handleSubmit:ke,resetForm:F,setErrors:W,setFormikState:xe,setFieldTouched:Y,setFieldValue:ve,setFieldError:ne,setStatus:se,setSubmitting:ge,setTouched:G,setValues:q,submitForm:fe,validateForm:$,validateField:U,isValid:xt,dirty:_t,unregisterField:N,registerField:X,getFieldProps:Ye,getFieldMeta:at,getFieldHelpers:Fe,validateOnBlur:o,validateOnChange:n,validateOnMount:a});return Fn}function Dy(e){var t=eee(e),n=e.component,r=e.children,o=e.render,s=e.innerRef;return p.useImperativeHandle(s,function(){return t}),p.createElement(XJ,{value:t},n?p.createElement(n,t):o?o(t):r?Ro(r)?r(t):ZJ(r)?null:p.Children.only(r):null)}function tee(e){var t={};if(e.inner){if(e.inner.length===0)return Fi(t,e.path,e.message);for(var o=e.inner,n=Array.isArray(o),r=0,o=n?o:o[Symbol.iterator]();;){var s;if(n){if(r>=o.length)break;s=o[r++]}else{if(r=o.next(),r.done)break;s=r.value}var a=s;Oo(t,a.path)||(t=Fi(t,a.path,a.message))}}return t}function nee(e,t,n,r){n===void 0&&(n=!1);var o=x0(e);return t[n?"validateSync":"validate"](o,{abortEarly:!1,context:r||o})}function x0(e){var t=Array.isArray(e)?[]:{};for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=String(n);Array.isArray(e[r])===!0?t[r]=e[r].map(function(o){return Array.isArray(o)===!0||Kx(o)?x0(o):o!==""?o:void 0}):Kx(e[r])?t[r]=x0(e[r]):t[r]=e[r]!==""?e[r]:void 0}return t}function ree(e,t,n){var r=e.slice();return t.forEach(function(s,a){if(typeof r[a]>"u"){var u=n.clone!==!1,d=u&&n.isMergeableObject(s);r[a]=d?y0(Array.isArray(s)?[]:{},s,n):s}else n.isMergeableObject(s)?r[a]=y0(e[a],s,n):e.indexOf(s)===-1&&r.push(s)}),r}function oee(e){return Array.from(e).filter(function(t){return t.selected}).map(function(t){return t.value})}function see(e,t,n){if(typeof e=="boolean")return!!t;var r=[],o=!1,s=-1;if(Array.isArray(e))r=e,s=e.indexOf(n),o=s>=0;else if(!n||n=="true"||n=="false")return!!t;return t&&n&&!o?r.concat(n):o?r.slice(0,s).concat(r.slice(s+1)):r}var aee=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u"?p.useLayoutEffect:p.useEffect;function Ko(e){var t=p.useRef(e);return aee(function(){t.current=e}),p.useCallback(function(){for(var n=arguments.length,r=new Array(n),o=0;o{const{model_list:t}=e,n=[];return ii(t,r=>{n.push(r.weights)}),n});function g4({model:e,modelsToAdd:t,setModelsToAdd:n}){const{t:r}=me(),o=B(TE),s=a=>{t.includes(a.target.value)?n(U7(t,u=>u!==a.target.value)):n([...t,a.target.value])};return i.jsxs(H,{flexDirection:"column",gap:2,backgroundColor:t.includes(e.name)?"accent.650":"base.800",paddingX:4,paddingY:2,borderRadius:4,children:[i.jsxs(H,{gap:4,alignItems:"center",justifyContent:"space-between",children:[i.jsx(In,{value:e.name,label:i.jsx(Ue,{fontWeight:500,children:e.name}),isChecked:t.includes(e.name),isDisabled:o.includes(e.location),onChange:s}),o.includes(e.location)&&i.jsx(Xl,{colorScheme:"accent",children:r("modelManager.modelExists")})]}),i.jsx(Ue,{fontStyle:"italic",variant:"subtext",children:e.location})]})}function lee(){const e=re(),{t}=me(),n=B(j=>j.system.searchFolder),r=B(j=>j.system.foundModels),o=B(TE),s=B(j=>j.ui.shouldShowExistingModelsInSearch),a=B(j=>j.system.isProcessing),[u,d]=z.useState([]),[f,h]=z.useState("v1"),[m,v]=z.useState(""),b=()=>{e(gR(null)),e(vR(null)),d([])},w=j=>{e(searchForModels(j.checkpointFolder))},C=()=>{d([]),r&&r.forEach(j=>{o.includes(j.location)||d(E=>[...E,j.name])})},S=()=>{d([])},P=()=>{const j=r==null?void 0:r.filter(I=>u.includes(I.name)),E={v1:"configs/stable-diffusion/v1-inference.yaml",v2_base:"configs/stable-diffusion/v2-inference-v.yaml",v2_768:"configs/stable-diffusion/v2-inference-v.yaml",inpainting:"configs/stable-diffusion/v1-inpainting-inference.yaml",custom:m};j==null||j.forEach(I=>{const O={name:I.name,description:"",config:E[f],weights:I.location,vae:"",width:512,height:512,default:!1,format:"ckpt"};e(addNewModel(O))}),d([])},k=()=>{const j=[],E=[];return r&&r.forEach((I,O)=>{o.includes(I.location)?E.push(i.jsx(g4,{model:I,modelsToAdd:u,setModelsToAdd:d},O)):j.push(i.jsx(g4,{model:I,modelsToAdd:u,setModelsToAdd:d},O))}),i.jsxs(H,{flexDirection:"column",rowGap:4,children:[j,s&&E]})};return i.jsxs(i.Fragment,{children:[n?i.jsxs(H,{sx:{padding:4,gap:2,position:"relative",borderRadius:"base",alignItems:"center",w:"full",bg:"base.900"},children:[i.jsxs(H,{sx:{flexDir:"column",gap:2},children:[i.jsx(Ue,{sx:{fontWeight:500},variant:"subtext",children:t("modelManager.checkpointFolder")}),i.jsx(Ue,{sx:{fontWeight:500},children:n})]}),i.jsx(li,{}),i.jsx(Ie,{"aria-label":t("modelManager.scanAgain"),tooltip:t("modelManager.scanAgain"),icon:i.jsx(q2,{}),fontSize:18,disabled:a,onClick:()=>e(searchForModels(n))}),i.jsx(Ie,{"aria-label":t("modelManager.clearCheckpointFolder"),tooltip:t("modelManager.clearCheckpointFolder"),icon:i.jsx(vo,{}),onClick:b})]}):i.jsx(Dy,{initialValues:{checkpointFolder:""},onSubmit:j=>{w(j)},children:({handleSubmit:j})=>i.jsx(Ay,{onSubmit:j,width:"100%",children:i.jsxs(Ya,{columnGap:2,alignItems:"flex-end",children:[i.jsx(ir,{flexGrow:1,children:i.jsx(ho,{as:zn,id:"checkpointFolder",name:"checkpointFolder",type:"text",size:"md",label:t("modelManager.checkpointFolder")})}),i.jsx(Yt,{leftIcon:i.jsx(q2,{}),"aria-label":t("modelManager.findModels"),tooltip:t("modelManager.findModels"),type:"submit",disabled:a,px:8,children:t("modelManager.findModels")})]})})}),r&&i.jsxs(H,{flexDirection:"column",rowGap:4,width:"full",children:[i.jsxs(H,{justifyContent:"space-between",alignItems:"center",children:[i.jsxs("p",{children:[t("modelManager.modelsFound"),": ",r.length]}),i.jsxs("p",{children:[t("modelManager.selected"),": ",u.length]})]}),i.jsxs(H,{columnGap:2,justifyContent:"space-between",children:[i.jsxs(H,{columnGap:2,children:[i.jsx(Yt,{isDisabled:u.length===r.length,onClick:C,children:t("modelManager.selectAll")}),i.jsx(Yt,{isDisabled:u.length===0,onClick:S,children:t("modelManager.deselectAll")}),i.jsx(In,{label:t("modelManager.showExisting"),isChecked:s,onChange:()=>e(mR(!s))})]}),i.jsx(Yt,{isDisabled:u.length===0,onClick:P,colorScheme:"accent",children:t("modelManager.addSelected")})]}),i.jsxs(H,{sx:{flexDirection:"column",padding:4,rowGap:4,borderRadius:"base",width:"full",bg:"base.900"},children:[i.jsxs(H,{gap:4,children:[i.jsx(Ue,{fontWeight:500,variant:"subtext",children:t("modelManager.pickModelType")}),i.jsx(wu,{value:f,onChange:j=>h(j),defaultValue:"v1",name:"model_type",children:i.jsxs(H,{gap:4,children:[i.jsx(oo,{value:"v1",children:i.jsx(Ue,{fontSize:"sm",children:t("modelManager.v1")})}),i.jsx(oo,{value:"v2_base",children:i.jsx(Ue,{fontSize:"sm",children:t("modelManager.v2_base")})}),i.jsx(oo,{value:"v2_768",children:i.jsx(Ue,{fontSize:"sm",children:t("modelManager.v2_768")})}),i.jsx(oo,{value:"inpainting",children:i.jsx(Ue,{fontSize:"sm",children:t("modelManager.inpainting")})}),i.jsx(oo,{value:"custom",children:i.jsx(Ue,{fontSize:"sm",children:t("modelManager.customConfig")})})]})})]}),f==="custom"&&i.jsxs(H,{flexDirection:"column",rowGap:2,children:[i.jsx(Ue,{fontWeight:"500",fontSize:"sm",variant:"subtext",children:t("modelManager.pathToCustomConfig")}),i.jsx(zn,{value:m,onChange:j=>{j.target.value!==""&&v(j.target.value)},width:"full"})]})]}),i.jsx(H,{flexDirection:"column",maxHeight:72,overflowY:"scroll",borderRadius:"sm",gap:2,children:r.length>0?k():i.jsx(Ue,{fontWeight:"500",padding:2,borderRadius:"sm",textAlign:"center",variant:"subtext",children:t("modelManager.noModelsFound")})})]})]})}const v4=64,y4=2048;function cee(){const e=re(),{t}=me(),n=B(f=>f.system.isProcessing);function r(f){return/\s/.test(f)}function o(f){let h;return r(f)&&(h=t("modelManager.cannotUseSpaces")),h}const s={name:"",description:"",config:"configs/stable-diffusion/v1-inference.yaml",weights:"",vae:"",width:512,height:512,format:"ckpt",default:!1},a=f=>{e(addNewModel(f)),e(Uf(null))},[u,d]=z.useState(!1);return i.jsxs(_r,{gap:2,alignItems:"flex-start",children:[i.jsxs(H,{columnGap:4,children:[i.jsx(In,{isChecked:!u,label:t("modelManager.scanForModels"),onChange:()=>d(!u)}),i.jsx(In,{label:t("modelManager.addManually"),isChecked:u,onChange:()=>d(!u)})]}),u?i.jsx(Dy,{initialValues:s,onSubmit:a,children:({handleSubmit:f,errors:h,touched:m})=>i.jsx(Ay,{onSubmit:f,sx:{w:"full"},children:i.jsxs(_r,{rowGap:2,children:[i.jsx(Ue,{fontSize:20,fontWeight:"bold",alignSelf:"start",children:t("modelManager.manual")}),i.jsx(hs,{children:i.jsxs(ir,{isInvalid:!!h.name&&m.name,isRequired:!0,children:[i.jsx(mr,{htmlFor:"name",fontSize:"sm",children:t("modelManager.name")}),i.jsxs(_r,{alignItems:"start",children:[i.jsx(ho,{as:zn,id:"name",name:"name",type:"text",validate:o,width:"full"}),h.name&&m.name?i.jsx(po,{children:h.name}):i.jsx(Mo,{margin:0,children:t("modelManager.nameValidationMsg")})]})]})}),i.jsx(hs,{children:i.jsxs(ir,{isInvalid:!!h.description&&m.description,isRequired:!0,children:[i.jsx(mr,{htmlFor:"description",fontSize:"sm",children:t("modelManager.description")}),i.jsxs(_r,{alignItems:"start",children:[i.jsx(ho,{as:zn,id:"description",name:"description",type:"text",width:"full"}),h.description&&m.description?i.jsx(po,{children:h.description}):i.jsx(Mo,{margin:0,children:t("modelManager.descriptionValidationMsg")})]})]})}),i.jsx(hs,{children:i.jsxs(ir,{isInvalid:!!h.config&&m.config,isRequired:!0,children:[i.jsx(mr,{htmlFor:"config",fontSize:"sm",children:t("modelManager.config")}),i.jsxs(_r,{alignItems:"start",children:[i.jsx(ho,{as:zn,id:"config",name:"config",type:"text",width:"full"}),h.config&&m.config?i.jsx(po,{children:h.config}):i.jsx(Mo,{margin:0,children:t("modelManager.configValidationMsg")})]})]})}),i.jsx(hs,{children:i.jsxs(ir,{isInvalid:!!h.weights&&m.weights,isRequired:!0,children:[i.jsx(mr,{htmlFor:"config",fontSize:"sm",children:t("modelManager.modelLocation")}),i.jsxs(_r,{alignItems:"start",children:[i.jsx(ho,{as:zn,id:"weights",name:"weights",type:"text",width:"full"}),h.weights&&m.weights?i.jsx(po,{children:h.weights}):i.jsx(Mo,{margin:0,children:t("modelManager.modelLocationValidationMsg")})]})]})}),i.jsx(hs,{children:i.jsxs(ir,{isInvalid:!!h.vae&&m.vae,children:[i.jsx(mr,{htmlFor:"vae",fontSize:"sm",children:t("modelManager.vaeLocation")}),i.jsxs(_r,{alignItems:"start",children:[i.jsx(ho,{as:zn,id:"vae",name:"vae",type:"text",width:"full"}),h.vae&&m.vae?i.jsx(po,{children:h.vae}):i.jsx(Mo,{margin:0,children:t("modelManager.vaeLocationValidationMsg")})]})]})}),i.jsxs(Ya,{width:"100%",children:[i.jsx(hs,{children:i.jsxs(ir,{isInvalid:!!h.width&&m.width,children:[i.jsx(mr,{htmlFor:"width",fontSize:"sm",children:t("modelManager.width")}),i.jsxs(_r,{alignItems:"start",children:[i.jsx(ho,{id:"width",name:"width",children:({field:v,form:b})=>i.jsx(oc,{id:"width",name:"width",min:v4,max:y4,step:64,value:b.values.width,onChange:w=>b.setFieldValue(v.name,Number(w))})}),h.width&&m.width?i.jsx(po,{children:h.width}):i.jsx(Mo,{margin:0,children:t("modelManager.widthValidationMsg")})]})]})}),i.jsx(hs,{children:i.jsxs(ir,{isInvalid:!!h.height&&m.height,children:[i.jsx(mr,{htmlFor:"height",fontSize:"sm",children:t("modelManager.height")}),i.jsxs(_r,{alignItems:"start",children:[i.jsx(ho,{id:"height",name:"height",children:({field:v,form:b})=>i.jsx(oc,{id:"height",name:"height",min:v4,max:y4,step:64,value:b.values.height,onChange:w=>b.setFieldValue(v.name,Number(w))})}),h.height&&m.height?i.jsx(po,{children:h.height}):i.jsx(Mo,{margin:0,children:t("modelManager.heightValidationMsg")})]})]})})]}),i.jsx(Yt,{type:"submit",className:"modal-close-btn",isLoading:n,children:t("modelManager.addModel")})]})})}):i.jsx(lee,{})]})}function uee(){const e=re(),{t}=me(),n=B(u=>u.system.isProcessing);function r(u){return/\s/.test(u)}function o(u){let d;return r(u)&&(d=t("modelManager.cannotUseSpaces")),d}const s={name:"",description:"",repo_id:"",path:"",format:"diffusers",default:!1,vae:{repo_id:"",path:""}},a=u=>{const d=u;u.path===""&&delete d.path,u.repo_id===""&&delete d.repo_id,u.vae.path===""&&delete d.vae.path,u.vae.repo_id===""&&delete d.vae.repo_id,e(addNewModel(d)),e(Uf(null))};return i.jsx(H,{overflow:"scroll",maxHeight:window.innerHeight-270,children:i.jsx(Dy,{initialValues:s,onSubmit:a,children:({handleSubmit:u,errors:d,touched:f})=>{var h,m,v,b,w,C,S,P,k,j;return i.jsx(Ay,{onSubmit:u,children:i.jsxs(_r,{rowGap:2,children:[i.jsx(hs,{children:i.jsxs(ir,{isInvalid:!!d.name&&f.name,isRequired:!0,children:[i.jsx(mr,{htmlFor:"name",fontSize:"sm",children:t("modelManager.name")}),i.jsxs(_r,{alignItems:"start",children:[i.jsx(ho,{as:zn,id:"name",name:"name",type:"text",validate:o,width:"2xl",isRequired:!0}),d.name&&f.name?i.jsx(po,{children:d.name}):i.jsx(Mo,{margin:0,children:t("modelManager.nameValidationMsg")})]})]})}),i.jsx(hs,{children:i.jsxs(ir,{isInvalid:!!d.description&&f.description,isRequired:!0,children:[i.jsx(mr,{htmlFor:"description",fontSize:"sm",children:t("modelManager.description")}),i.jsxs(_r,{alignItems:"start",children:[i.jsx(ho,{as:zn,id:"description",name:"description",type:"text",width:"2xl",isRequired:!0}),d.description&&f.description?i.jsx(po,{children:d.description}):i.jsx(Mo,{margin:0,children:t("modelManager.descriptionValidationMsg")})]})]})}),i.jsxs(hs,{children:[i.jsx(Ue,{fontWeight:"bold",fontSize:"sm",children:t("modelManager.formMessageDiffusersModelLocation")}),i.jsx(Ue,{sx:{fontSize:"sm",fontStyle:"italic"},variant:"subtext",children:t("modelManager.formMessageDiffusersModelLocationDesc")}),i.jsxs(ir,{isInvalid:!!d.path&&f.path,children:[i.jsx(mr,{htmlFor:"path",fontSize:"sm",children:t("modelManager.modelLocation")}),i.jsxs(_r,{alignItems:"start",children:[i.jsx(ho,{as:zn,id:"path",name:"path",type:"text",width:"2xl"}),d.path&&f.path?i.jsx(po,{children:d.path}):i.jsx(Mo,{margin:0,children:t("modelManager.modelLocationValidationMsg")})]})]}),i.jsxs(ir,{isInvalid:!!d.repo_id&&f.repo_id,children:[i.jsx(mr,{htmlFor:"repo_id",fontSize:"sm",children:t("modelManager.repo_id")}),i.jsxs(_r,{alignItems:"start",children:[i.jsx(ho,{as:zn,id:"repo_id",name:"repo_id",type:"text",width:"2xl"}),d.repo_id&&f.repo_id?i.jsx(po,{children:d.repo_id}):i.jsx(Mo,{margin:0,children:t("modelManager.repoIDValidationMsg")})]})]})]}),i.jsxs(hs,{children:[i.jsx(Ue,{fontWeight:"bold",children:t("modelManager.formMessageDiffusersVAELocation")}),i.jsx(Ue,{sx:{fontSize:"sm",fontStyle:"italic"},variant:"subtext",children:t("modelManager.formMessageDiffusersVAELocationDesc")}),i.jsxs(ir,{isInvalid:!!((h=d.vae)!=null&&h.path)&&((m=f.vae)==null?void 0:m.path),children:[i.jsx(mr,{htmlFor:"vae.path",fontSize:"sm",children:t("modelManager.vaeLocation")}),i.jsxs(_r,{alignItems:"start",children:[i.jsx(ho,{as:zn,id:"vae.path",name:"vae.path",type:"text",width:"2xl"}),(v=d.vae)!=null&&v.path&&((b=f.vae)!=null&&b.path)?i.jsx(po,{children:(w=d.vae)==null?void 0:w.path}):i.jsx(Mo,{margin:0,children:t("modelManager.vaeLocationValidationMsg")})]})]}),i.jsxs(ir,{isInvalid:!!((C=d.vae)!=null&&C.repo_id)&&((S=f.vae)==null?void 0:S.repo_id),children:[i.jsx(mr,{htmlFor:"vae.repo_id",fontSize:"sm",children:t("modelManager.vaeRepoID")}),i.jsxs(_r,{alignItems:"start",children:[i.jsx(ho,{as:zn,id:"vae.repo_id",name:"vae.repo_id",type:"text",width:"2xl"}),(P=d.vae)!=null&&P.repo_id&&((k=f.vae)!=null&&k.repo_id)?i.jsx(po,{children:(j=d.vae)==null?void 0:j.repo_id}):i.jsx(Mo,{margin:0,children:t("modelManager.vaeRepoIDValidationMsg")})]})]})]}),i.jsx(Yt,{type:"submit",isLoading:n,children:t("modelManager.addModel")})]})})}})})}function dee(){const e=B(r=>r.ui.addNewModelUIOption),t=re(),{t:n}=me();return i.jsxs(H,{flexDirection:"column",gap:4,children:[i.jsxs(H,{columnGap:4,children:[i.jsx(Yt,{onClick:()=>t(Uf("ckpt")),sx:{backgroundColor:e=="ckpt"?"accent.700":"base.700","&:hover":{backgroundColor:e=="ckpt"?"accent.700":"base.600"}},children:n("modelManager.addCheckpointModel")}),i.jsx(Yt,{onClick:()=>t(Uf("diffusers")),sx:{backgroundColor:e=="diffusers"?"accent.700":"base.700","&:hover":{backgroundColor:e=="diffusers"?"accent.700":"base.600"}},children:n("modelManager.addDiffuserModel")})]}),i.jsx(wa,{}),e=="ckpt"&&i.jsx(cee,{}),e=="diffusers"&&i.jsx(uee,{})]})}function b4(e){const{children:t,value:n}=e,[r,o]=Ji("colors",["base.800","base.200"]);return i.jsx("option",{value:n,style:{background:r,color:o},children:t})}const fee=e=>{const{label:t,isDisabled:n,validValues:r,tooltip:o,tooltipProps:s,horizontal:a,spaceEvenly:u,...d}=e;return i.jsxs(ir,{isDisabled:n,onClick:f=>{f.stopPropagation(),f.nativeEvent.stopImmediatePropagation(),f.nativeEvent.stopPropagation(),f.nativeEvent.cancelBubble=!0},sx:a?{display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"space-between",gap:4}:{},children:[t&&i.jsx(mr,{sx:u?{flexBasis:0,flexGrow:1}:{},children:t}),i.jsx(Gn,{label:o,...s,children:i.jsx(m1,{...d,rootProps:{sx:u?{flexBasis:0,flexGrow:1}:{}},children:r.map(f=>typeof f=="string"||typeof f=="number"?i.jsx(b4,{value:f,children:f},f):i.jsx(b4,{value:f.value,children:f.key},f.value))})})]})},iv=p.memo(fee);function pee(){const{t:e}=me(),t=re(),{data:n}=Ju(),r=yR(n==null?void 0:n.entities,(D,V)=>(D==null?void 0:D.model_format)==="diffusers"),[o,s]=p.useState(Object.keys(r)[0]),[a,u]=p.useState(Object.keys(r)[1]),[d,f]=p.useState("none"),[h,m]=p.useState(""),[v,b]=p.useState(.5),[w,C]=p.useState("weighted_sum"),[S,P]=p.useState("root"),[k,j]=p.useState(""),[E,I]=p.useState(!1),O=Object.keys(r).filter(D=>D!==a&&D!==d),R=Object.keys(r).filter(D=>D!==o&&D!==d),M=[{key:e("modelManager.none"),value:"none"},...Object.keys(r).filter(D=>D!==o&&D!==a).map(D=>({key:D,value:D}))],A=B(D=>D.system.isProcessing),L=()=>{let D=[o,a,d];D=D.filter($=>$!=="none");const V={models_to_merge:D,merged_model_name:h!==""?h:D.join("-"),alpha:v,interp:w,model_merge_save_path:S==="root"?null:k,force:E};t(mergeDiffusersModels(V))};return i.jsxs(H,{flexDirection:"column",rowGap:4,children:[i.jsxs(H,{sx:{flexDirection:"column",rowGap:1,bg:"base.900"},children:[i.jsx(Ue,{children:e("modelManager.modelMergeHeaderHelp1")}),i.jsx(Ue,{fontSize:"sm",variant:"subtext",children:e("modelManager.modelMergeHeaderHelp2")})]}),i.jsxs(H,{columnGap:4,children:[i.jsx(iv,{label:e("modelManager.modelOne"),validValues:O,onChange:D=>s(D.target.value)}),i.jsx(iv,{label:e("modelManager.modelTwo"),validValues:R,onChange:D=>u(D.target.value)}),i.jsx(iv,{label:e("modelManager.modelThree"),validValues:M,onChange:D=>{D.target.value!=="none"?(f(D.target.value),C("add_difference")):(f("none"),C("weighted_sum"))}})]}),i.jsx(zn,{label:e("modelManager.mergedModelName"),value:h,onChange:D=>m(D.target.value)}),i.jsxs(H,{sx:{flexDirection:"column",padding:4,borderRadius:"base",gap:4,bg:"base.900"},children:[i.jsx(vt,{label:e("modelManager.alpha"),min:.01,max:.99,step:.01,value:v,onChange:D=>b(D),withInput:!0,withReset:!0,handleReset:()=>b(.5),withSliderMarks:!0}),i.jsx(Ue,{variant:"subtext",fontSize:"sm",children:e("modelManager.modelMergeAlphaHelp")})]}),i.jsxs(H,{sx:{padding:4,borderRadius:"base",gap:4,bg:"base.900"},children:[i.jsx(Ue,{fontWeight:500,fontSize:"sm",variant:"subtext",children:e("modelManager.interpolationType")}),i.jsx(wu,{value:w,onChange:D=>C(D),children:i.jsx(H,{columnGap:4,children:d==="none"?i.jsxs(i.Fragment,{children:[i.jsx(oo,{value:"weighted_sum",children:i.jsx(Ue,{fontSize:"sm",children:e("modelManager.weightedSum")})}),i.jsx(oo,{value:"sigmoid",children:i.jsx(Ue,{fontSize:"sm",children:e("modelManager.sigmoid")})}),i.jsx(oo,{value:"inv_sigmoid",children:i.jsx(Ue,{fontSize:"sm",children:e("modelManager.inverseSigmoid")})})]}):i.jsx(oo,{value:"add_difference",children:i.jsx(Gn,{label:e("modelManager.modelMergeInterpAddDifferenceHelp"),children:i.jsx(Ue,{fontSize:"sm",children:e("modelManager.addDifference")})})})})})]}),i.jsxs(H,{sx:{flexDirection:"column",padding:4,borderRadius:"base",gap:4,bg:"base.900"},children:[i.jsxs(H,{columnGap:4,children:[i.jsx(Ue,{fontWeight:"500",fontSize:"sm",variant:"subtext",children:e("modelManager.mergedModelSaveLocation")}),i.jsx(wu,{value:S,onChange:D=>P(D),children:i.jsxs(H,{columnGap:4,children:[i.jsx(oo,{value:"root",children:i.jsx(Ue,{fontSize:"sm",children:e("modelManager.invokeAIFolder")})}),i.jsx(oo,{value:"custom",children:i.jsx(Ue,{fontSize:"sm",children:e("modelManager.custom")})})]})})]}),S==="custom"&&i.jsx(zn,{label:e("modelManager.mergedModelCustomSaveLocation"),value:k,onChange:D=>j(D.target.value)})]}),i.jsx(In,{label:e("modelManager.ignoreMismatch"),isChecked:E,onChange:D=>I(D.target.checked),fontWeight:"500"}),i.jsx(Yt,{onClick:L,isLoading:A,isDisabled:S==="custom"&&k==="",children:e("modelManager.merge")})]})}var hee=function e(t,n){if(t===n)return!0;if(t&&n&&typeof t=="object"&&typeof n=="object"){if(t.constructor!==n.constructor)return!1;var r,o,s;if(Array.isArray(t)){if(r=t.length,r!=n.length)return!1;for(o=r;o--!==0;)if(!e(t[o],n[o]))return!1;return!0}if(t.constructor===RegExp)return t.source===n.source&&t.flags===n.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===n.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===n.toString();if(s=Object.keys(t),r=s.length,r!==Object.keys(n).length)return!1;for(o=r;o--!==0;)if(!Object.prototype.hasOwnProperty.call(n,s[o]))return!1;for(o=r;o--!==0;){var a=s[o];if(!e(t[a],n[a]))return!1}return!0}return t!==t&&n!==n};const x4=dc(hee);function S0(e){return e===null||typeof e!="object"?{}:Object.keys(e).reduce((t,n)=>{const r=e[n];return r!=null&&r!==!1&&(t[n]=r),t},{})}var mee=Object.defineProperty,S4=Object.getOwnPropertySymbols,gee=Object.prototype.hasOwnProperty,vee=Object.prototype.propertyIsEnumerable,w4=(e,t,n)=>t in e?mee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,yee=(e,t)=>{for(var n in t||(t={}))gee.call(t,n)&&w4(e,n,t[n]);if(S4)for(var n of S4(t))vee.call(t,n)&&w4(e,n,t[n]);return e};function DE(e,t){if(t===null||typeof t!="object")return{};const n=yee({},t);return Object.keys(t).forEach(r=>{r.includes(`${String(e)}.`)&&delete n[r]}),n}const bee="__MANTINE_FORM_INDEX__";function C4(e,t){return t?typeof t=="boolean"?t:Array.isArray(t)?t.includes(e.replace(/[.][0-9]/g,`.${bee}`)):!1:!1}function P4(e,t,n){typeof n.value=="object"&&(n.value=Tl(n.value)),!n.enumerable||n.get||n.set||!n.configurable||!n.writable||t==="__proto__"?Object.defineProperty(e,t,n):e[t]=n.value}function Tl(e){if(typeof e!="object")return e;var t=0,n,r,o,s=Object.prototype.toString.call(e);if(s==="[object Object]"?o=Object.create(e.__proto__||null):s==="[object Array]"?o=Array(e.length):s==="[object Set]"?(o=new Set,e.forEach(function(a){o.add(Tl(a))})):s==="[object Map]"?(o=new Map,e.forEach(function(a,u){o.set(Tl(u),Tl(a))})):s==="[object Date]"?o=new Date(+e):s==="[object RegExp]"?o=new RegExp(e.source,e.flags):s==="[object DataView]"?o=new e.constructor(Tl(e.buffer)):s==="[object ArrayBuffer]"?o=e.slice(0):s.slice(-6)==="Array]"&&(o=new e.constructor(e)),o){for(r=Object.getOwnPropertySymbols(e);t0,errors:t}}function w0(e,t,n="",r={}){return typeof e!="object"||e===null?r:Object.keys(e).reduce((o,s)=>{const a=e[s],u=`${n===""?"":`${n}.`}${s}`,d=ia(u,t);let f=!1;return typeof a=="function"&&(o[u]=a(d,t,u)),typeof a=="object"&&Array.isArray(d)&&(f=!0,d.forEach((h,m)=>w0(a,t,`${u}.${m}`,o))),typeof a=="object"&&typeof d=="object"&&d!==null&&(f||w0(a,t,u,o)),o},r)}function C0(e,t){return k4(typeof e=="function"?e(t):w0(e,t))}function _f(e,t,n){if(typeof e!="string")return{hasError:!1,error:null};const r=C0(t,n),o=Object.keys(r.errors).find(s=>e.split(".").every((a,u)=>a===s.split(".")[u]));return{hasError:!!o,error:o?r.errors[o]:null}}function xee(e,{from:t,to:n},r){const o=ia(e,r);if(!Array.isArray(o))return r;const s=[...o],a=o[t];return s.splice(t,1),s.splice(n,0,a),tm(e,s,r)}var See=Object.defineProperty,_4=Object.getOwnPropertySymbols,wee=Object.prototype.hasOwnProperty,Cee=Object.prototype.propertyIsEnumerable,j4=(e,t,n)=>t in e?See(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Pee=(e,t)=>{for(var n in t||(t={}))wee.call(t,n)&&j4(e,n,t[n]);if(_4)for(var n of _4(t))Cee.call(t,n)&&j4(e,n,t[n]);return e};function kee(e,{from:t,to:n},r){const o=`${e}.${t}`,s=`${e}.${n}`,a=Pee({},r);return Object.keys(r).every(u=>{let d,f;if(u.startsWith(o)&&(d=u,f=u.replace(o,s)),u.startsWith(s)&&(d=u.replace(s,o),f=u),d&&f){const h=a[d],m=a[f];return m===void 0?delete a[d]:a[d]=m,h===void 0?delete a[f]:a[f]=h,!1}return!0}),a}function _ee(e,t,n){const r=ia(e,n);return Array.isArray(r)?tm(e,r.filter((o,s)=>s!==t),n):n}var jee=Object.defineProperty,E4=Object.getOwnPropertySymbols,Eee=Object.prototype.hasOwnProperty,Iee=Object.prototype.propertyIsEnumerable,I4=(e,t,n)=>t in e?jee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Oee=(e,t)=>{for(var n in t||(t={}))Eee.call(t,n)&&I4(e,n,t[n]);if(E4)for(var n of E4(t))Iee.call(t,n)&&I4(e,n,t[n]);return e};function O4(e,t){const n=e.substring(t.length+1).split(".")[0];return parseInt(n,10)}function R4(e,t,n,r){if(t===void 0)return n;const o=`${String(e)}`;let s=n;r===-1&&(s=DE(`${o}.${t}`,s));const a=Oee({},s),u=new Set;return Object.entries(s).filter(([d])=>{if(!d.startsWith(`${o}.`))return!1;const f=O4(d,o);return Number.isNaN(f)?!1:f>=t}).forEach(([d,f])=>{const h=O4(d,o),m=d.replace(`${o}.${h}`,`${o}.${h+r}`);a[m]=f,u.add(m),u.has(d)||delete a[d]}),a}function Ree(e,t,n,r){const o=ia(e,r);if(!Array.isArray(o))return r;const s=[...o];return s.splice(typeof n=="number"?n:s.length,0,t),tm(e,s,r)}function M4(e,t){const n=Object.keys(e);if(typeof t=="string"){const r=n.filter(o=>o.startsWith(`${t}.`));return e[t]||r.some(o=>e[o])||!1}return n.some(r=>e[r])}function Mee(e){return t=>{if(!t)e(t);else if(typeof t=="function")e(t);else if(typeof t=="object"&&"nativeEvent"in t){const{currentTarget:n}=t;n instanceof HTMLInputElement?n.type==="checkbox"?e(n.checked):e(n.value):(n instanceof HTMLTextAreaElement||n instanceof HTMLSelectElement)&&e(n.value)}else e(t)}}var Tee=Object.defineProperty,Dee=Object.defineProperties,Aee=Object.getOwnPropertyDescriptors,T4=Object.getOwnPropertySymbols,Nee=Object.prototype.hasOwnProperty,zee=Object.prototype.propertyIsEnumerable,D4=(e,t,n)=>t in e?Tee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,$a=(e,t)=>{for(var n in t||(t={}))Nee.call(t,n)&&D4(e,n,t[n]);if(T4)for(var n of T4(t))zee.call(t,n)&&D4(e,n,t[n]);return e},lv=(e,t)=>Dee(e,Aee(t));function NE({initialValues:e={},initialErrors:t={},initialDirty:n={},initialTouched:r={},clearInputErrorOnChange:o=!0,validateInputOnChange:s=!1,validateInputOnBlur:a=!1,transformValues:u=f=>f,validate:d}={}){const[f,h]=p.useState(r),[m,v]=p.useState(n),[b,w]=p.useState(e),[C,S]=p.useState(S0(t)),P=p.useRef(e),k=Y=>{P.current=Y},j=p.useCallback(()=>h({}),[]),E=Y=>{const ae=Y?$a($a({},b),Y):b;k(ae),v({})},I=p.useCallback(Y=>S(ae=>S0(typeof Y=="function"?Y(ae):Y)),[]),O=p.useCallback(()=>S({}),[]),R=p.useCallback(()=>{w(e),O(),k(e),v({}),j()},[]),M=p.useCallback((Y,ae)=>I(de=>lv($a({},de),{[Y]:ae})),[]),A=p.useCallback(Y=>I(ae=>{if(typeof Y!="string")return ae;const de=$a({},ae);return delete de[Y],de}),[]),L=p.useCallback(Y=>v(ae=>{if(typeof Y!="string")return ae;const de=DE(Y,ae);return delete de[Y],de}),[]),D=p.useCallback((Y,ae)=>{const de=C4(Y,s);L(Y),h(xe=>lv($a({},xe),{[Y]:!0})),w(xe=>{const se=tm(Y,ae,xe);if(de){const ge=_f(Y,d,se);ge.hasError?M(Y,ge.error):A(Y)}return se}),!de&&o&&M(Y,null)},[]),V=p.useCallback(Y=>{w(ae=>{const de=typeof Y=="function"?Y(ae):Y;return $a($a({},ae),de)}),o&&O()},[]),$=p.useCallback((Y,ae)=>{L(Y),w(de=>xee(Y,ae,de)),S(de=>kee(Y,ae,de))},[]),F=p.useCallback((Y,ae)=>{L(Y),w(de=>_ee(Y,ae,de)),S(de=>R4(Y,ae,de,-1))},[]),U=p.useCallback((Y,ae,de)=>{L(Y),w(xe=>Ree(Y,ae,de,xe)),S(xe=>R4(Y,de,xe,1))},[]),X=p.useCallback(()=>{const Y=C0(d,b);return S(Y.errors),Y},[b,d]),N=p.useCallback(Y=>{const ae=_f(Y,d,b);return ae.hasError?M(Y,ae.error):A(Y),ae},[b,d]),G=(Y,{type:ae="input",withError:de=!0,withFocus:xe=!0}={})=>{const ge={onChange:Mee(fe=>D(Y,fe))};return de&&(ge.error=C[Y]),ae==="checkbox"?ge.checked=ia(Y,b):ge.value=ia(Y,b),xe&&(ge.onFocus=()=>h(fe=>lv($a({},fe),{[Y]:!0})),ge.onBlur=()=>{if(C4(Y,a)){const fe=_f(Y,d,b);fe.hasError?M(Y,fe.error):A(Y)}}),ge},W=(Y,ae)=>de=>{de==null||de.preventDefault();const xe=X();xe.hasErrors?ae==null||ae(xe.errors,b,de):Y==null||Y(u(b),de)},q=Y=>u(Y||b),ne=p.useCallback(Y=>{Y.preventDefault(),R()},[]),ve=Y=>{if(Y){const de=ia(Y,m);if(typeof de=="boolean")return de;const xe=ia(Y,b),se=ia(Y,P.current);return!x4(xe,se)}return Object.keys(m).length>0?M4(m):!x4(b,P.current)},le=p.useCallback(Y=>M4(f,Y),[f]),oe=p.useCallback(Y=>Y?!_f(Y,d,b).hasError:!C0(d,b).hasErrors,[b,d]);return{values:b,errors:C,setValues:V,setErrors:I,setFieldValue:D,setFieldError:M,clearFieldError:A,clearErrors:O,reset:R,validate:X,validateField:N,reorderListItem:$,removeListItem:F,insertListItem:U,getInputProps:G,onSubmit:W,onReset:ne,isDirty:ve,isTouched:le,setTouched:h,setDirty:v,resetTouched:j,resetDirty:E,isValid:oe,getTransformedValues:q}}const $ee=nt((e,t)=>{const{t:n}=me(),{acceptButtonText:r=n("common.accept"),acceptCallback:o,cancelButtonText:s=n("common.cancel"),cancelCallback:a,children:u,title:d,triggerComponent:f}=e,{isOpen:h,onOpen:m,onClose:v}=Ja(),b=p.useRef(null),w=()=>{o(),v()},C=()=>{a&&a(),v()};return i.jsxs(i.Fragment,{children:[p.cloneElement(f,{onClick:m,ref:t}),i.jsx(bh,{isOpen:h,leastDestructiveRef:b,onClose:v,isCentered:!0,children:i.jsx(ni,{children:i.jsxs(xh,{children:[i.jsx(ti,{fontSize:"lg",fontWeight:"bold",children:d}),i.jsx(ri,{children:u}),i.jsxs(ei,{children:[i.jsx(Yt,{ref:b,onClick:C,children:s}),i.jsx(Yt,{colorScheme:"error",onClick:w,ml:3,children:r})]})]})})})]})}),Ny=p.memo($ee);function Lee(e){const{model:t}=e,n=re(),{t:r}=me(),[o,s]=p.useState("same"),[a,u]=p.useState("");p.useEffect(()=>{s("same")},[t]);const d=()=>{s("same")},f=()=>{const h={model_name:t,save_location:o,custom_location:o==="custom"&&a!==""?a:null};n(convertToDiffusers(h))};return i.jsxs(Ny,{title:`${r("modelManager.convert")} ${t.name}`,acceptCallback:f,cancelCallback:d,acceptButtonText:`${r("modelManager.convert")}`,triggerComponent:i.jsxs(Yt,{size:"sm","aria-label":r("modelManager.convertToDiffusers"),className:" modal-close-btn",children:["🧨 ",r("modelManager.convertToDiffusers")]}),motionPreset:"slideInBottom",children:[i.jsxs(H,{flexDirection:"column",rowGap:4,children:[i.jsx(Ue,{children:r("modelManager.convertToDiffusersHelpText1")}),i.jsxs(mh,{children:[i.jsx(To,{children:r("modelManager.convertToDiffusersHelpText2")}),i.jsx(To,{children:r("modelManager.convertToDiffusersHelpText3")}),i.jsx(To,{children:r("modelManager.convertToDiffusersHelpText4")}),i.jsx(To,{children:r("modelManager.convertToDiffusersHelpText5")})]}),i.jsx(Ue,{children:r("modelManager.convertToDiffusersHelpText6")})]}),i.jsxs(H,{flexDir:"column",gap:4,children:[i.jsxs(H,{marginTop:4,flexDir:"column",gap:2,children:[i.jsx(Ue,{fontWeight:"600",children:r("modelManager.convertToDiffusersSaveLocation")}),i.jsx(wu,{value:o,onChange:h=>s(h),children:i.jsxs(H,{gap:4,children:[i.jsx(oo,{value:"same",children:i.jsx(Gn,{label:"Save converted model in the same folder",children:r("modelManager.sameFolder")})}),i.jsx(oo,{value:"root",children:i.jsx(Gn,{label:"Save converted model in the InvokeAI root folder",children:r("modelManager.invokeRoot")})}),i.jsx(oo,{value:"custom",children:i.jsx(Gn,{label:"Save converted model in a custom folder",children:r("modelManager.custom")})})]})})]}),o==="custom"&&i.jsxs(H,{flexDirection:"column",rowGap:2,children:[i.jsx(Ue,{fontWeight:"500",fontSize:"sm",variant:"subtext",children:r("modelManager.customSaveLocation")}),i.jsx(zn,{value:a,onChange:h=>{h.target.value!==""&&u(h.target.value)},width:"full"})]})]})]})}const Fee=[{value:"sd-1",label:Yr["sd-1"]},{value:"sd-2",label:Yr["sd-2"]}],Bee=[{value:"normal",label:"Normal"},{value:"inpaint",label:"Inpaint"},{value:"depth",label:"Depth"}];function Hee(e){const t=B(u=>u.system.isProcessing),{modelToEdit:n,retrievedModel:r}=e;re();const{t:o}=me(),s=NE({initialValues:{name:r.name,base_model:r.base_model,type:"main",path:r.path,description:r.description,model_format:"checkpoint",vae:r.vae,config:r.config,variant:r.variant}}),a=u=>{console.log(u)};return n?i.jsxs(H,{flexDirection:"column",rowGap:4,width:"100%",children:[i.jsxs(H,{justifyContent:"space-between",alignItems:"center",children:[i.jsxs(H,{flexDirection:"column",children:[i.jsx(Ue,{fontSize:"lg",fontWeight:"bold",children:r.name}),i.jsxs(Ue,{fontSize:"sm",color:"base.400",children:[Yr[r.base_model]," Model"]})]}),i.jsx(Lee,{model:r})]}),i.jsx(wa,{}),i.jsx(H,{flexDirection:"column",maxHeight:window.innerHeight-270,overflowY:"scroll",children:i.jsx("form",{onSubmit:s.onSubmit(u=>a(u)),children:i.jsxs(H,{flexDirection:"column",overflowY:"scroll",gap:4,children:[i.jsx(zn,{label:o("modelManager.name"),...s.getInputProps("name")}),i.jsx(zn,{label:o("modelManager.description"),...s.getInputProps("description")}),i.jsx(qn,{label:o("modelManager.baseModel"),data:Fee,...s.getInputProps("base_model")}),i.jsx(qn,{label:o("modelManager.variant"),data:Bee,...s.getInputProps("variant")}),i.jsx(zn,{label:o("modelManager.modelLocation"),...s.getInputProps("path")}),i.jsx(zn,{label:o("modelManager.vaeLocation"),...s.getInputProps("vae")}),i.jsx(zn,{label:o("modelManager.config"),...s.getInputProps("config")}),i.jsx(Yt,{disabled:t,type:"submit",children:o("modelManager.updateModel")})]})})})]}):i.jsx(H,{sx:{width:"100%",justifyContent:"center",alignItems:"center",borderRadius:"base",bg:"base.900"},children:i.jsx(Ue,{fontWeight:500,children:"Pick A Model To Edit"})})}const Wee=[{value:"sd-1",label:Yr["sd-1"]},{value:"sd-2",label:Yr["sd-2"]}],Vee=[{value:"normal",label:"Normal"},{value:"inpaint",label:"Inpaint"},{value:"depth",label:"Depth"}];function Uee(e){const t=B(u=>u.system.isProcessing),{retrievedModel:n,modelToEdit:r}=e;re();const{t:o}=me(),s=NE({initialValues:{name:n.name,base_model:n.base_model,type:"main",path:n.path,description:n.description,model_format:"diffusers",vae:n.vae,variant:n.variant}}),a=u=>{console.log(u)};return r?i.jsxs(H,{flexDirection:"column",rowGap:4,width:"100%",children:[i.jsxs(H,{flexDirection:"column",children:[i.jsx(Ue,{fontSize:"lg",fontWeight:"bold",children:n.name}),i.jsxs(Ue,{fontSize:"sm",color:"base.400",children:[Yr[n.base_model]," Model"]})]}),i.jsx(wa,{}),i.jsx("form",{onSubmit:s.onSubmit(u=>a(u)),children:i.jsxs(H,{flexDirection:"column",overflowY:"scroll",gap:4,children:[i.jsx(zn,{label:o("modelManager.name"),...s.getInputProps("name")}),i.jsx(zn,{label:o("modelManager.description"),...s.getInputProps("description")}),i.jsx(qn,{label:o("modelManager.baseModel"),data:Wee,...s.getInputProps("base_model")}),i.jsx(qn,{label:o("modelManager.variant"),data:Vee,...s.getInputProps("variant")}),i.jsx(zn,{label:o("modelManager.modelLocation"),...s.getInputProps("path")}),i.jsx(zn,{label:o("modelManager.vaeLocation"),...s.getInputProps("vae")}),i.jsx(Yt,{disabled:t,type:"submit",children:o("modelManager.updateModel")})]})})]}):i.jsx(H,{sx:{width:"100%",justifyContent:"center",alignItems:"center",borderRadius:"base",bg:"base.900"},children:i.jsx(Ue,{fontWeight:"500",children:"Pick A Model To Edit"})})}function jf(e){const{isProcessing:t,isConnected:n}=B(m=>m.system),r=B(m=>m.system.openModel),{t:o}=me(),s=re(),{modelKey:a,name:u,description:d}=e,f=()=>{s(Yx(a))},h=()=>{s(deleteModel(a)),s(Yx(null))};return i.jsxs(H,{alignItems:"center",p:2,borderRadius:"base",sx:a===r?{bg:"accent.750",_hover:{bg:"accent.750"}}:{_hover:{bg:"base.750"}},children:[i.jsx(qe,{onClick:f,cursor:"pointer",children:i.jsx(Gn,{label:d,hasArrow:!0,placement:"bottom",children:i.jsx(Ue,{fontWeight:"600",children:u})})}),i.jsx(li,{onClick:f,cursor:"pointer"}),i.jsxs(H,{gap:2,alignItems:"center",children:[i.jsx(Ie,{icon:i.jsx(Yz,{}),size:"sm",onClick:f,"aria-label":o("accessibility.modifyConfig"),isDisabled:status==="active"||t||!n}),i.jsx(Ny,{title:o("modelManager.deleteModel"),acceptCallback:h,acceptButtonText:o("modelManager.delete"),triggerComponent:i.jsx(Ie,{icon:i.jsx(Qz,{}),size:"sm","aria-label":o("modelManager.deleteConfig"),isDisabled:status==="active"||t||!n,colorScheme:"error"}),children:i.jsxs(H,{rowGap:4,flexDirection:"column",children:[i.jsx("p",{style:{fontWeight:"bold"},children:o("modelManager.deleteMsg1")}),i.jsx("p",{children:o("modelManager.deleteMsg2")})]})})]})]})}function cv({label:e,isActive:t,onClick:n}){return i.jsx(Yt,{onClick:n,isActive:t,sx:{_active:{bg:"accent.750"}},size:"sm",children:e})}const Gee=()=>{const{data:e}=Ju(),[t,n]=z.useState(!1);z.useEffect(()=>{const v=setTimeout(()=>{n(!0)},200);return()=>clearTimeout(v)},[]);const[r,o]=p.useState(""),[s,a]=p.useState("all"),[u,d]=p.useTransition(),{t:f}=me(),h=v=>{d(()=>{o(v.target.value)})},m=p.useMemo(()=>{const v=[],b=[],w=[],C=[];if(!e)return;const S=e.entities;return Object.keys(S).forEach((P,k)=>{var j,E;S[P].name.toLowerCase().includes(r.toLowerCase())&&(w.push(i.jsx(jf,{modelKey:P,name:S[P].name,description:S[P].description},k)),((j=S[P])==null?void 0:j.model_format)===s&&C.push(i.jsx(jf,{modelKey:P,name:S[P].name,description:S[P].description},k))),((E=S[P])==null?void 0:E.model_format)!=="diffusers"?v.push(i.jsx(jf,{modelKey:P,name:S[P].name,description:S[P].description},k)):b.push(i.jsx(jf,{modelKey:P,name:S[P].name,description:S[P].description},k))}),r!==""?s==="all"?i.jsx(qe,{marginTop:4,children:w}):i.jsx(qe,{marginTop:4,children:C}):i.jsxs(H,{flexDirection:"column",rowGap:6,children:[s==="all"&&i.jsxs(i.Fragment,{children:[i.jsxs(qe,{children:[i.jsx(Ue,{sx:{fontWeight:"500",py:2,px:4,mb:4,borderRadius:"base",width:"max-content",fontSize:"sm",bg:"base.750"},children:f("modelManager.diffusersModels")}),b]}),i.jsxs(qe,{children:[i.jsx(Ue,{sx:{fontWeight:"500",py:2,px:4,my:4,mx:0,borderRadius:"base",width:"max-content",fontSize:"sm",bg:"base.750"},children:f("modelManager.checkpointModels")}),v]})]}),s==="diffusers"&&i.jsx(H,{flexDirection:"column",marginTop:4,children:b}),s==="ckpt"&&i.jsx(H,{flexDirection:"column",marginTop:4,children:v})]})},[e,r,f,s]);return i.jsxs(H,{flexDirection:"column",rowGap:4,width:"50%",minWidth:"50%",children:[i.jsx(zn,{onChange:h,label:f("modelManager.search")}),i.jsxs(H,{flexDirection:"column",gap:4,maxHeight:window.innerHeight-240,overflow:"scroll",paddingInlineEnd:4,children:[i.jsxs(H,{columnGap:2,children:[i.jsx(cv,{label:f("modelManager.allModels"),onClick:()=>a("all"),isActive:s==="all"}),i.jsx(cv,{label:f("modelManager.diffusersModels"),onClick:()=>a("diffusers"),isActive:s==="diffusers"}),i.jsx(cv,{label:f("modelManager.checkpointModels"),onClick:()=>a("ckpt"),isActive:s==="ckpt"})]}),t?m:i.jsx(H,{width:"100%",minHeight:96,justifyContent:"center",alignItems:"center",children:i.jsx(ai,{})})]})]})};function qee(){const{data:e}=Ju(),t=B(r=>r.system.openModel),n=()=>{if(!(!t||!e))return e.entities[t].model_format==="diffusers"?i.jsx(Uee,{modelToEdit:t,retrievedModel:e.entities[t]},t):i.jsx(Hee,{modelToEdit:t,retrievedModel:e.entities[t]},t)};return i.jsxs(H,{width:"100%",columnGap:8,children:[i.jsx(Gee,{}),n()]})}const zE=[{id:"modelManager",label:Pr.t("modelManager.modelManager"),content:i.jsx(qee,{})},{id:"addModels",label:Pr.t("modelManager.addModel"),content:i.jsx(dee,{})},{id:"mergeModels",label:Pr.t("modelManager.mergeModels"),content:i.jsx(pee,{})}],Kee=()=>{const e=[];return zE.forEach(t=>{e.push(i.jsx(w1,{children:t.label},t.id))}),i.jsx(b1,{sx:{w:"100%",color:"base.200",flexDirection:"row",borderBottomWidth:2,borderColor:"accent.700"},children:e})},Yee=()=>{const e=[];return zE.forEach(t=>{e.push(i.jsx(x1,{children:t.content},t.id))}),i.jsx(S1,{sx:{p:2},children:e})},Xee=()=>i.jsxs(y1,{isLazy:!0,variant:"invokeAI",sx:{w:"full",h:"full",p:2,gap:4,flexDirection:"column"},children:[Kee(),Yee()]}),Qee=p.memo(Xee);const Zee=e=>Pe([t=>t.nodes],t=>{const n=t.invocationTemplates[e];if(n)return n},{memoizeOptions:{resultEqualityCheck:(t,n)=>t!==void 0&&n!==void 0&&t.type===n.type}}),Jee=e=>{const{nodeId:t,title:n,description:r}=e;return i.jsxs(H,{sx:{borderTopRadius:"md",alignItems:"center",justifyContent:"space-between",px:2,py:1,bg:"base.300",_dark:{bg:"base.700"}},children:[i.jsx(Gn,{label:t,children:i.jsx(aa,{size:"xs",sx:{fontWeight:600,color:"base.900",_dark:{color:"base.100"}},children:n})}),i.jsx(Gn,{label:r,placement:"top",hasArrow:!0,shouldWrapChildren:!0,children:i.jsx(mo,{sx:{h:"min-content",color:"base.700",_dark:{color:"base.300"}},as:Nz})})]})},$E=p.memo(Jee),ete={position:"absolute",width:"1rem",height:"1rem",borderWidth:0},tte={left:"-1rem"},nte={right:"-0.5rem"},rte=e=>{const{field:t,isValidConnection:n,handleType:r,styles:o}=e,{name:s,type:a}=t;return i.jsx(Gn,{label:a,placement:r==="target"?"start":"end",hasArrow:!0,openDelay:L3,children:i.jsx(bR,{type:r,id:s,isValidConnection:n,position:r==="target"?Xx.Left:Xx.Right,style:{backgroundColor:F3[a].colorCssVar,...o,...ete,...r==="target"?tte:nte}})})},LE=p.memo(rte),FE=()=>{const e=H0();return p.useCallback(({source:n,sourceHandle:r,target:o,targetHandle:s})=>(e.getEdges(),e.getNodes(),!0),[e])},ote=e=>i.jsx($z,{}),ste=p.memo(ote),ate=e=>{const{nodeId:t,field:n}=e,r=re(),o=s=>{r(Ps({nodeId:t,fieldName:n.name,value:s.target.checked}))};return i.jsx(v1,{onChange:o,isChecked:n.value})},ite=p.memo(ate),lte=e=>null,cte=p.memo(lte);function nm(){return(nm=Object.assign||function(e){for(var t=1;t=0||(o[n]=e[n]);return o}function P0(e){var t=p.useRef(e),n=p.useRef(function(r){t.current&&t.current(r)});return t.current=e,n.current}var uc=function(e,t,n){return t===void 0&&(t=0),n===void 0&&(n=1),e>n?n:e0:S.buttons>0)&&o.current?s(A4(o.current,S,u.current)):C(!1)},w=function(){return C(!1)};function C(S){var P=d.current,k=k0(o.current),j=S?k.addEventListener:k.removeEventListener;j(P?"touchmove":"mousemove",b),j(P?"touchend":"mouseup",w)}return[function(S){var P=S.nativeEvent,k=o.current;if(k&&(N4(P),!function(E,I){return I&&!hu(E)}(P,d.current)&&k)){if(hu(P)){d.current=!0;var j=P.changedTouches||[];j.length&&(u.current=j[0].identifier)}k.focus(),s(A4(k,P,u.current)),C(!0)}},function(S){var P=S.which||S.keyCode;P<37||P>40||(S.preventDefault(),a({left:P===39?.05:P===37?-.05:0,top:P===40?.05:P===38?-.05:0}))},C]},[a,s]),h=f[0],m=f[1],v=f[2];return p.useEffect(function(){return v},[v]),z.createElement("div",nm({},r,{onTouchStart:h,onMouseDown:h,className:"react-colorful__interactive",ref:o,onKeyDown:m,tabIndex:0,role:"slider"}))}),rm=function(e){return e.filter(Boolean).join(" ")},$y=function(e){var t=e.color,n=e.left,r=e.top,o=r===void 0?.5:r,s=rm(["react-colorful__pointer",e.className]);return z.createElement("div",{className:s,style:{top:100*o+"%",left:100*n+"%"}},z.createElement("div",{className:"react-colorful__pointer-fill",style:{backgroundColor:t}}))},so=function(e,t,n){return t===void 0&&(t=0),n===void 0&&(n=Math.pow(10,t)),Math.round(n*e)/n},HE=function(e){var t=e.s,n=e.v,r=e.a,o=(200-t)*n/100;return{h:so(e.h),s:so(o>0&&o<200?t*n/100/(o<=100?o:200-o)*100:0),l:so(o/2),a:so(r,2)}},_0=function(e){var t=HE(e);return"hsl("+t.h+", "+t.s+"%, "+t.l+"%)"},uv=function(e){var t=HE(e);return"hsla("+t.h+", "+t.s+"%, "+t.l+"%, "+t.a+")"},ute=function(e){var t=e.h,n=e.s,r=e.v,o=e.a;t=t/360*6,n/=100,r/=100;var s=Math.floor(t),a=r*(1-n),u=r*(1-(t-s)*n),d=r*(1-(1-t+s)*n),f=s%6;return{r:so(255*[r,u,a,a,d,r][f]),g:so(255*[d,r,r,u,a,a][f]),b:so(255*[a,a,d,r,r,u][f]),a:so(o,2)}},dte=function(e){var t=e.r,n=e.g,r=e.b,o=e.a,s=Math.max(t,n,r),a=s-Math.min(t,n,r),u=a?s===t?(n-r)/a:s===n?2+(r-t)/a:4+(t-n)/a:0;return{h:so(60*(u<0?u+6:u)),s:so(s?a/s*100:0),v:so(s/255*100),a:o}},fte=z.memo(function(e){var t=e.hue,n=e.onChange,r=rm(["react-colorful__hue",e.className]);return z.createElement("div",{className:r},z.createElement(zy,{onMove:function(o){n({h:360*o.left})},onKey:function(o){n({h:uc(t+360*o.left,0,360)})},"aria-label":"Hue","aria-valuenow":so(t),"aria-valuemax":"360","aria-valuemin":"0"},z.createElement($y,{className:"react-colorful__hue-pointer",left:t/360,color:_0({h:t,s:100,v:100,a:1})})))}),pte=z.memo(function(e){var t=e.hsva,n=e.onChange,r={backgroundColor:_0({h:t.h,s:100,v:100,a:1})};return z.createElement("div",{className:"react-colorful__saturation",style:r},z.createElement(zy,{onMove:function(o){n({s:100*o.left,v:100-100*o.top})},onKey:function(o){n({s:uc(t.s+100*o.left,0,100),v:uc(t.v-100*o.top,0,100)})},"aria-label":"Color","aria-valuetext":"Saturation "+so(t.s)+"%, Brightness "+so(t.v)+"%"},z.createElement($y,{className:"react-colorful__saturation-pointer",top:1-t.v/100,left:t.s/100,color:_0(t)})))}),WE=function(e,t){if(e===t)return!0;for(var n in e)if(e[n]!==t[n])return!1;return!0};function hte(e,t,n){var r=P0(n),o=p.useState(function(){return e.toHsva(t)}),s=o[0],a=o[1],u=p.useRef({color:t,hsva:s});p.useEffect(function(){if(!e.equal(t,u.current.color)){var f=e.toHsva(t);u.current={hsva:f,color:t},a(f)}},[t,e]),p.useEffect(function(){var f;WE(s,u.current.hsva)||e.equal(f=e.fromHsva(s),u.current.color)||(u.current={hsva:s,color:f},r(f))},[s,e,r]);var d=p.useCallback(function(f){a(function(h){return Object.assign({},h,f)})},[]);return[s,d]}var mte=typeof window<"u"?p.useLayoutEffect:p.useEffect,gte=function(){return typeof __webpack_nonce__<"u"?__webpack_nonce__:void 0},z4=new Map,vte=function(e){mte(function(){var t=e.current?e.current.ownerDocument:document;if(t!==void 0&&!z4.has(t)){var n=t.createElement("style");n.innerHTML=`.react-colorful{position:relative;display:flex;flex-direction:column;width:200px;height:200px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.react-colorful__saturation{position:relative;flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(0deg,#000,transparent),linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.react-colorful__alpha-gradient,.react-colorful__pointer-fill{content:"";position:absolute;left:0;top:0;right:0;bottom:0;pointer-events:none;border-radius:inherit}.react-colorful__alpha-gradient,.react-colorful__saturation{box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}.react-colorful__alpha,.react-colorful__hue{position:relative;height:24px}.react-colorful__hue{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.react-colorful__last-control{border-radius:0 0 8px 8px}.react-colorful__interactive{position:absolute;left:0;top:0;right:0;bottom:0;border-radius:inherit;outline:none;touch-action:none}.react-colorful__pointer{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}.react-colorful__interactive:focus .react-colorful__pointer{transform:translate(-50%,-50%) scale(1.1)}.react-colorful__alpha,.react-colorful__alpha-pointer{background-color:#fff;background-image:url('data:image/svg+xml;charset=utf-8,')}.react-colorful__saturation-pointer{z-index:3}.react-colorful__hue-pointer{z-index:2}`,z4.set(t,n);var r=gte();r&&n.setAttribute("nonce",r),t.head.appendChild(n)}},[])},yte=function(e){var t=e.className,n=e.hsva,r=e.onChange,o={backgroundImage:"linear-gradient(90deg, "+uv(Object.assign({},n,{a:0}))+", "+uv(Object.assign({},n,{a:1}))+")"},s=rm(["react-colorful__alpha",t]),a=so(100*n.a);return z.createElement("div",{className:s},z.createElement("div",{className:"react-colorful__alpha-gradient",style:o}),z.createElement(zy,{onMove:function(u){r({a:u.left})},onKey:function(u){r({a:uc(n.a+u.left)})},"aria-label":"Alpha","aria-valuetext":a+"%","aria-valuenow":a,"aria-valuemin":"0","aria-valuemax":"100"},z.createElement($y,{className:"react-colorful__alpha-pointer",left:n.a,color:uv(n)})))},bte=function(e){var t=e.className,n=e.colorModel,r=e.color,o=r===void 0?n.defaultColor:r,s=e.onChange,a=BE(e,["className","colorModel","color","onChange"]),u=p.useRef(null);vte(u);var d=hte(n,o,s),f=d[0],h=d[1],m=rm(["react-colorful",t]);return z.createElement("div",nm({},a,{ref:u,className:m}),z.createElement(pte,{hsva:f,onChange:h}),z.createElement(fte,{hue:f.h,onChange:h}),z.createElement(yte,{hsva:f,onChange:h,className:"react-colorful__last-control"}))},xte={defaultColor:{r:0,g:0,b:0,a:1},toHsva:dte,fromHsva:ute,equal:WE},VE=function(e){return z.createElement(bte,nm({},e,{colorModel:xte}))};const Ste=e=>{const{nodeId:t,field:n}=e,r=re(),o=s=>{r(Ps({nodeId:t,fieldName:n.name,value:s}))};return i.jsx(VE,{className:"nodrag",color:n.value,onChange:o})},wte=p.memo(Ste),Cte=e=>null,Pte=p.memo(Cte),kte=e=>null,_te=p.memo(kte),jte=e=>{const{nodeId:t,field:n,template:r}=e,o=re(),s=a=>{o(Ps({nodeId:t,fieldName:n.name,value:a.target.value}))};return i.jsx(m1,{onChange:s,value:n.value,children:r.options.map(a=>i.jsx("option",{children:a},a))})},Ete=p.memo(jte),Ite=e=>{var f;const{nodeId:t,field:n}=e,r=re();p.useCallback(({image_name:h})=>{r(Ps({nodeId:t,fieldName:n.name,value:xR([...n.value??[],{image_name:h}],"image_name")}))},[r,n.name,n.value,t]);const o={id:`node-${t}-${n.name}`,actionType:"SET_MULTI_NODES_IMAGE",context:{nodeId:t,fieldName:n.name}},{isOver:s,setNodeRef:a,active:u,over:d}=Au({id:`node_${t}`,data:o});return p.useCallback(()=>{r(Ps({nodeId:t,fieldName:n.name,value:void 0}))},[r,n.name,t]),i.jsxs(H,{ref:a,sx:{w:"full",h:"full",alignItems:"center",justifyContent:"center",position:"relative",minH:"10rem"},children:[(f=n.value)==null?void 0:f.map(({image_name:h})=>i.jsx(Rte,{imageName:h},h)),Gl(o,u)&&i.jsx(Ql,{isOver:s})]})},Ote=p.memo(Ite),Rte=e=>{const{currentData:t}=Vs(e.imageName);return i.jsx(qi,{imageDTO:t,isDropDisabled:!0,isDragDisabled:!0})},Mte=e=>{var v;const{nodeId:t,field:n}=e,r=re(),{currentData:o,isLoading:s,isError:a,isSuccess:u}=Vs(((v=n.value)==null?void 0:v.image_name)??ga.skipToken),d=p.useCallback(()=>{r(Ps({nodeId:t,fieldName:n.name,value:void 0}))},[r,n.name,t]),f=p.useMemo(()=>{if(o)return{id:`node-${t}-${n.name}`,payloadType:"IMAGE_DTO",payload:{imageDTO:o}}},[n.name,o,t]),h=p.useMemo(()=>({id:`node-${t}-${n.name}`,actionType:"SET_NODES_IMAGE",context:{nodeId:t,fieldName:n.name}}),[n.name,t]),m=p.useMemo(()=>({type:"SET_NODES_IMAGE",nodeId:t,fieldName:n.name}),[t,n.name]);return i.jsx(H,{sx:{w:"full",h:"full",alignItems:"center",justifyContent:"center"},children:i.jsx(qi,{imageDTO:o,droppableData:h,draggableData:f,onClickReset:d,postUploadAction:m})})},Tte=p.memo(Mte),Dte=e=>i.jsx(vz,{}),$4=p.memo(Dte),Ate=e=>null,Nte=p.memo(Ate),zte=e=>{const{nodeId:t,field:n}=e,r=re();me();const{data:o}=SE(),s=p.useMemo(()=>o==null?void 0:o.entities[n.value??o.ids[0]],[o==null?void 0:o.entities,o==null?void 0:o.ids,n.value]),a=p.useMemo(()=>{if(!o)return[];const d=[];return ii(o.entities,(f,h)=>{f&&d.push({value:h,label:f.name,group:Yr[f.base_model]})}),d},[o]),u=p.useCallback(d=>{d&&r(Ps({nodeId:t,fieldName:n.name,value:d}))},[r,n.name,t]);return p.useEffect(()=>{if(n.value&&(o!=null&&o.ids.includes(n.value)))return;const d=o==null?void 0:o.ids[0];ch(d)&&u(d)},[n.value,u,o==null?void 0:o.ids]),i.jsx(qn,{tooltip:s==null?void 0:s.description,label:(s==null?void 0:s.base_model)&&Yr[s==null?void 0:s.base_model],value:n.value,placeholder:"Pick one",data:a,onChange:u})},$te=p.memo(zte),Lte=e=>{const{nodeId:t,field:n}=e,r=re();me();const{data:o}=Ju(),s=p.useMemo(()=>{if(!o)return[];const d=[];return ii(o.entities,(f,h)=>{f&&d.push({value:h,label:f.name,group:Yr[f.base_model]})}),d},[o]),a=p.useMemo(()=>o==null?void 0:o.entities[n.value??o.ids[0]],[o==null?void 0:o.entities,o==null?void 0:o.ids,n.value]),u=p.useCallback(d=>{d&&r(Ps({nodeId:t,fieldName:n.name,value:d}))},[r,n.name,t]);return p.useEffect(()=>{if(n.value&&(o!=null&&o.ids.includes(n.value)))return;const d=o==null?void 0:o.ids[0];ch(d)&&u(d)},[n.value,u,o==null?void 0:o.ids]),i.jsx(qn,{tooltip:a==null?void 0:a.description,label:(a==null?void 0:a.base_model)&&Yr[a==null?void 0:a.base_model],value:n.value,placeholder:"Pick one",data:s,onChange:u})},Fte=p.memo(Lte),Bte=e=>{const{nodeId:t,field:n}=e,r=re(),o=(s,a)=>{r(Ps({nodeId:t,fieldName:n.name,value:a}))};return i.jsxs(M3,{onChange:o,value:n.value,step:e.template.type==="integer"?1:.1,precision:e.template.type==="integer"?0:3,children:[i.jsx(T3,{}),i.jsxs(D3,{children:[i.jsx(A3,{}),i.jsx(N3,{})]})]})},Hte=p.memo(Bte),Wte=e=>{const{nodeId:t,field:n}=e,r=re(),o=s=>{r(Ps({nodeId:t,fieldName:n.name,value:s.target.value}))};return i.jsx(Bu,{onChange:o,value:n.value})},Vte=p.memo(Wte),Ute=e=>null,Gte=p.memo(Ute),qte=e=>null,Kte=p.memo(qte),Yte=e=>{const{nodeId:t,field:n}=e,r=re();me();const{data:o}=wE(),s=p.useMemo(()=>o==null?void 0:o.entities[n.value??o.ids[0]],[o==null?void 0:o.entities,o==null?void 0:o.ids,n.value]),a=p.useMemo(()=>{if(!o)return[];const d=[];return ii(o.entities,(f,h)=>{f&&d.push({value:h,label:f.name,group:Yr[f.base_model]})}),d},[o]),u=p.useCallback(d=>{d&&r(Ps({nodeId:t,fieldName:n.name,value:d}))},[r,n.name,t]);return p.useEffect(()=>{n.value&&(o!=null&&o.ids.includes(n.value))||u("auto")},[n.value,u,o==null?void 0:o.ids]),i.jsx(qn,{tooltip:s==null?void 0:s.description,label:(s==null?void 0:s.base_model)&&Yr[s==null?void 0:s.base_model],value:n.value,placeholder:"Pick one",data:a,onChange:u})},Xte=p.memo(Yte),Qte=e=>{const{nodeId:t,field:n,template:r}=e,{type:o}=n;return o==="string"&&r.type==="string"?i.jsx(Vte,{nodeId:t,field:n,template:r}):o==="boolean"&&r.type==="boolean"?i.jsx(ite,{nodeId:t,field:n,template:r}):o==="integer"&&r.type==="integer"||o==="float"&&r.type==="float"?i.jsx(Hte,{nodeId:t,field:n,template:r}):o==="enum"&&r.type==="enum"?i.jsx(Ete,{nodeId:t,field:n,template:r}):o==="image"&&r.type==="image"?i.jsx(Tte,{nodeId:t,field:n,template:r}):o==="latents"&&r.type==="latents"?i.jsx(Nte,{nodeId:t,field:n,template:r}):o==="conditioning"&&r.type==="conditioning"?i.jsx(Pte,{nodeId:t,field:n,template:r}):o==="unet"&&r.type==="unet"?i.jsx(Gte,{nodeId:t,field:n,template:r}):o==="clip"&&r.type==="clip"?i.jsx(cte,{nodeId:t,field:n,template:r}):o==="vae"&&r.type==="vae"?i.jsx(Kte,{nodeId:t,field:n,template:r}):o==="control"&&r.type==="control"?i.jsx(_te,{nodeId:t,field:n,template:r}):o==="model"&&r.type==="model"?i.jsx(Fte,{nodeId:t,field:n,template:r}):o==="vae_model"&&r.type==="vae_model"?i.jsx(Xte,{nodeId:t,field:n,template:r}):o==="lora_model"&&r.type==="lora_model"?i.jsx($te,{nodeId:t,field:n,template:r}):o==="array"&&r.type==="array"?i.jsx(ste,{nodeId:t,field:n,template:r}):o==="item"&&r.type==="item"?i.jsx($4,{nodeId:t,field:n,template:r}):o==="color"&&r.type==="color"?i.jsx(wte,{nodeId:t,field:n,template:r}):o==="item"&&r.type==="item"?i.jsx($4,{nodeId:t,field:n,template:r}):o==="image_collection"&&r.type==="image_collection"?i.jsx(Ote,{nodeId:t,field:n,template:r}):i.jsxs(qe,{p:2,children:["Unknown field type: ",o]})},Zte=p.memo(Qte);function Jte(e){const{nodeId:t,input:n,template:r,connected:o}=e,s=FE();return i.jsx(qe,{position:"relative",borderColor:r?!o&&["always","connectionOnly"].includes(String(r==null?void 0:r.inputRequirement))&&n.value===void 0?"warning.400":void 0:"error.400",children:i.jsx(ir,{isDisabled:r?o:!0,pl:2,children:r?i.jsxs(i.Fragment,{children:[i.jsxs(Ya,{justifyContent:"space-between",alignItems:"center",children:[i.jsx(Ya,{children:i.jsx(Gn,{label:r==null?void 0:r.description,placement:"top",hasArrow:!0,shouldWrapChildren:!0,openDelay:L3,children:i.jsx(mr,{children:r==null?void 0:r.title})})}),i.jsx(Zte,{nodeId:t,field:n,template:r})]}),!["never","directOnly"].includes((r==null?void 0:r.inputRequirement)??"")&&i.jsx(LE,{nodeId:t,field:r,isValidConnection:s,handleType:"target"})]}):i.jsx(Ya,{justifyContent:"space-between",alignItems:"center",children:i.jsxs(mr,{children:["Unknown input: ",n.name]})})})})}const ene=e=>{const{nodeId:t,template:n,inputs:r}=e,o=B(a=>a.nodes.edges);return p.useCallback(()=>{const a=[],u=Ks(r);return u.forEach((d,f)=>{const h=n.inputs[d.name],m=!!o.filter(v=>v.target===t&&v.targetHandle===d.name).length;f{const{nodeId:t,template:n,outputs:r}=e,o=B(a=>a.nodes.edges);return p.useCallback(()=>{const a=[];return Ks(r).forEach(d=>{const f=n.outputs[d.name],h=!!o.filter(m=>m.source===t&&m.sourceHandle===d.name).length;a.push(i.jsx(nne,{nodeId:t,output:d,template:f,connected:h},d.id))}),i.jsx(H,{flexDir:"column",children:a})},[o,t,r,n.outputs])()},one=p.memo(rne),sne=e=>{const{...t}=e;return i.jsx(nN,{style:{position:"absolute",border:"none",background:"transparent",width:15,height:15,bottom:0,right:0},minWidth:B3,...t})},j0=p.memo(sne),E0=e=>{const[t,n]=Ji("shadows",["nodeSelectedOutline","dark-lg"]);return i.jsx(qe,{sx:{position:"relative",borderRadius:"md",minWidth:B3,shadow:e.selected?`${t}, ${n}`:`${n}`},children:e.children})},UE=p.memo(e=>{const{id:t,data:n,selected:r}=e,{type:o,inputs:s,outputs:a}=n,u=p.useMemo(()=>Zee(o),[o]),d=B(u);return d?i.jsxs(E0,{selected:r,children:[i.jsx($E,{nodeId:t,title:d.title,description:d.description}),i.jsxs(H,{sx:{flexDirection:"column",borderBottomRadius:"md",py:2,bg:"base.200",_dark:{bg:"base.800"}},children:[i.jsx(one,{nodeId:t,outputs:a,template:d}),i.jsx(tne,{nodeId:t,inputs:s,template:d})]}),i.jsx(j0,{})]}):i.jsx(E0,{selected:r,children:i.jsxs(H,{sx:{alignItems:"center",justifyContent:"center"},children:[i.jsx(mo,{as:Ez,sx:{boxSize:32,color:"base.600",_dark:{color:"base.400"}}}),i.jsx(j0,{})]})})});UE.displayName="InvocationComponent";const ane=e=>{const t=B(r=>r.system.progressImage),{selected:n}=e;return i.jsxs(E0,{selected:n,children:[i.jsx($E,{title:"Progress Image",description:"Displays the progress image in the Node Editor"}),i.jsx(H,{sx:{flexDirection:"column",borderBottomRadius:"md",p:2,bg:"base.200",_dark:{bg:"base.800"}},children:t?i.jsx(Nu,{src:t.dataURL,sx:{w:"full",h:"full",objectFit:"contain"}}):i.jsx(H,{sx:{w:"full",h:"full",minW:32,minH:32,alignItems:"center",justifyContent:"center"},children:i.jsx(bc,{})})}),i.jsx(j0,{maxHeight:(t==null?void 0:t.height)??512,maxWidth:(t==null?void 0:t.width)??512})]})},ine=p.memo(ane),lne=()=>{const{zoomIn:e,zoomOut:t,fitView:n}=H0(),r=re(),o=B(f=>f.nodes.shouldShowGraphOverlay),s=p.useCallback(()=>{e()},[e]),a=p.useCallback(()=>{t()},[t]),u=p.useCallback(()=>{n()},[n]),d=p.useCallback(()=>{r(SR(!o))},[o,r]);return i.jsxs(gr,{isAttached:!0,orientation:"vertical",children:[i.jsx(Ie,{onClick:s,"aria-label":"Zoom In",icon:i.jsx(_h,{})}),i.jsx(Ie,{onClick:a,"aria-label":"Zoom Out",icon:i.jsx(Fz,{})}),i.jsx(Ie,{onClick:u,"aria-label":"Fit to Viewport",icon:i.jsx(j1,{})}),i.jsx(Ie,{isChecked:o,onClick:d,"aria-label":"Show/Hide Graph",icon:i.jsx(k1,{})})]})},cne=p.memo(lne),une=()=>i.jsx(Tu,{position:"bottom-left",children:i.jsx(cne,{})}),dne=p.memo(une),fne=()=>{const e=Ef({background:"var(--invokeai-colors-base-200)"},{background:"var(--invokeai-colors-base-500)"}),t=Ef("var(--invokeai-colors-accent-300)","var(--invokeai-colors-accent-700)"),n=Ef("var(--invokeai-colors-blackAlpha-300)","var(--invokeai-colors-blackAlpha-600)");return i.jsx(GA,{nodeStrokeWidth:3,pannable:!0,zoomable:!0,nodeBorderRadius:30,style:e,nodeColor:t,maskColor:n})},pne=p.memo(fne);function hne(e){const{iconButton:t=!1,...n}=e,r=re(),o=B(Sr),s=Br(),a=p.useCallback(()=>{r(B0("nodes"))},[r]),{t:u}=me();return Ge(["ctrl+enter","meta+enter"],a,{enabled:()=>s,preventDefault:!0,enableOnFormTags:["input","textarea","select"]},[s,o]),i.jsx(qe,{style:{flexGrow:4},position:"relative",children:i.jsxs(qe,{style:{position:"relative"},children:[!s&&i.jsx(qe,{borderRadius:"base",style:{position:"absolute",bottom:"0",left:"0",right:"0",height:"100%",overflow:"clip"},children:i.jsx(EE,{})}),t?i.jsx(Ie,{"aria-label":u("parameters.invoke"),type:"submit",icon:i.jsx(kP,{}),isDisabled:!s,onClick:a,flexGrow:1,w:"100%",tooltip:u("parameters.invoke"),tooltipProps:{placement:"bottom"},colorScheme:"accent",id:"invoke-button",_disabled:{background:"none",_hover:{background:"none"}},...n}):i.jsx(Yt,{"aria-label":u("parameters.invoke"),type:"submit",isDisabled:!s,onClick:a,flexGrow:1,w:"100%",colorScheme:"accent",id:"invoke-button",fontWeight:700,_disabled:{background:"none",_hover:{background:"none"}},...n,children:"Invoke"})]})})}const mne=()=>{const e=re(),t=p.useCallback(()=>{e(wR())},[e]);return i.jsx(Tu,{position:"top-center",children:i.jsxs(Ya,{children:[i.jsx(hne,{}),i.jsx(Zh,{}),i.jsx(Yt,{onClick:t,children:"Reload Schema"})]})})},gne=p.memo(mne),vne=(e,t)=>{const n={id:e,name:t.name,type:t.type};return t.inputRequirement!=="never"&&(t.type==="string"&&(n.value=t.default??""),t.type==="integer"&&(n.value=t.default??0),t.type==="float"&&(n.value=t.default??0),t.type==="boolean"&&(n.value=t.default??!1),t.type==="enum"&&(t.enumType==="number"&&(n.value=t.default??0),t.enumType==="string"&&(n.value=t.default??"")),t.type==="array"&&(n.value=t.default??1),t.type==="image"&&(n.value=void 0),t.type==="image_collection"&&(n.value=[]),t.type==="latents"&&(n.value=void 0),t.type==="conditioning"&&(n.value=void 0),t.type==="unet"&&(n.value=void 0),t.type==="clip"&&(n.value=void 0),t.type==="vae"&&(n.value=void 0),t.type==="control"&&(n.value=void 0),t.type==="model"&&(n.value=void 0),t.type==="vae_model"&&(n.value=void 0),t.type==="lora_model"&&(n.value=void 0)),n},yne=Pe([e=>e.nodes],e=>e.invocationTemplates),bne=()=>{const e=B(yne),t=H0();return p.useCallback(n=>{if(n==="progress_image"){const{x:h,y:m}=t.project({x:window.innerWidth/2.5,y:window.innerHeight/8});return{id:"progress_image",type:"progress_image",position:{x:h,y:m},data:{}}}const r=e[n];if(r===void 0){console.error(`Unable to find template ${n}.`);return}const o=Ti(),s=Qx(r.inputs,(h,m,v)=>{const b=Ti(),w=vne(b,m);return h[v]=w,h},{}),a=Qx(r.outputs,(h,m,v)=>{const w={id:Ti(),name:v,type:m.type};return h[v]=w,h},{}),{x:u,y:d}=t.project({x:window.innerWidth/2.5,y:window.innerHeight/8});return{id:o,type:"invocation",position:{x:u,y:d},data:{id:o,type:n,inputs:s,outputs:a}}},[e,t])},xne=Pe(CR,e=>{const t=Ks(e.invocationTemplates,n=>({label:n.title,value:n.type,description:n.description}));return t.push({label:"Progress Image",value:"progress_image",description:"Displays the progress image in the Node Editor"}),{data:t}},Et),Sne=()=>{const e=re(),{data:t}=B(xne),n=bne(),r=Du(),o=p.useCallback(a=>{const u=n(a);if(!u){r({status:"error",title:`Unknown Invocation type ${a}`});return}e(PR(u))},[e,n,r]),s=p.useCallback(a=>{a&&o(a)},[o]);return i.jsx(H,{sx:{gap:2,alignItems:"center"},children:i.jsx(qn,{selectOnBlur:!1,placeholder:"Add Node",value:null,data:t,maxDropdownHeight:400,nothingFound:"No matching nodes",itemComponent:GE,filter:(a,u)=>u.label.toLowerCase().includes(a.toLowerCase().trim())||u.value.toLowerCase().includes(a.toLowerCase().trim())||u.description.toLowerCase().includes(a.toLowerCase().trim()),onChange:s,sx:{width:"18rem"}})})},GE=p.forwardRef(({label:e,description:t,...n},r)=>i.jsx("div",{ref:r,...n,children:i.jsxs("div",{children:[i.jsx(Ue,{children:e}),i.jsx(Ue,{size:"xs",color:"base.600",children:t})]})}));GE.displayName="SelectItem";const wne=()=>i.jsx(Tu,{position:"top-left",children:i.jsx(Sne,{})}),Cne=p.memo(wne),Pne=()=>i.jsx(H,{sx:{gap:2,flexDir:"column"},children:Ks(F3,({title:e,description:t,color:n},r)=>i.jsx(Gn,{label:t,children:i.jsx(Xl,{colorScheme:n,sx:{userSelect:"none"},textAlign:"center",children:e})},r))}),kne=p.memo(Pne),_ne=()=>{const e=B(n=>n),t=kR(e);return i.jsx(qe,{as:"pre",sx:{fontFamily:"monospace",position:"absolute",top:2,right:2,opacity:.7,p:2,maxHeight:500,maxWidth:500,overflowY:"scroll",borderRadius:"base",bg:"base.200",_dark:{bg:"base.800"}},children:JSON.stringify(t,null,2)})},jne=p.memo(_ne),Ene=()=>{const e=B(t=>t.nodes.shouldShowGraphOverlay);return i.jsxs(Tu,{position:"top-right",children:[i.jsx(kne,{}),e&&i.jsx(jne,{})]})},Ine=p.memo(Ene),One={invocation:UE,progress_image:ine},Rne=()=>{const e=re(),t=B(d=>d.nodes.nodes),n=B(d=>d.nodes.edges),r=p.useCallback(d=>{e(_R(d))},[e]),o=p.useCallback(d=>{e(jR(d))},[e]),s=p.useCallback((d,f)=>{e(ER(f))},[e]),a=p.useCallback(d=>{e(IR(d))},[e]),u=p.useCallback(()=>{e(OR())},[e]);return i.jsxs(RR,{nodeTypes:One,nodes:t,edges:n,onNodesChange:r,onEdgesChange:o,onConnectStart:s,onConnect:a,onConnectEnd:u,defaultEdgeOptions:{style:{strokeWidth:2}},children:[i.jsx(Cne,{}),i.jsx(gne,{}),i.jsx(Ine,{}),i.jsx(dne,{}),i.jsx(ZA,{}),i.jsx(pne,{})]})},Mne=()=>i.jsx(qe,{layerStyle:"first",sx:{position:"relative",width:"full",height:"full",borderRadius:"base"},children:i.jsx(MR,{children:i.jsx(Rne,{})})}),Tne=p.memo(Mne),Dne=()=>i.jsx(Tne,{}),Ane=p.memo(Dne),Nne=e=>e.postprocessing,zne=Pe([Nne],({hiresFix:e,hiresStrength:t})=>({hiresFix:e,hiresStrength:t}),{memoizeOptions:{resultEqualityCheck:Wt}}),$ne=()=>{const{hiresFix:e,hiresStrength:t}=B(zne),n=re(),{t:r}=me(),o=a=>{n(Zx(a))},s=()=>{n(Zx(.75))};return i.jsx(vt,{label:r("parameters.hiresStrength"),step:.01,min:.01,max:.99,onChange:o,value:t,isInteger:!1,withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:s,isDisabled:!e})},Lne=()=>{const e=re(),t=B(o=>o.postprocessing.hiresFix),{t:n}=me(),r=o=>e(TR(o.target.checked));return i.jsx(jn,{label:n("parameters.hiresOptim"),isChecked:t,onChange:r})},Fne=Pe(mn,e=>({activeLabel:e.postprocessing.hiresFix?"Enabled":void 0}),Et),Bne=()=>{const{t:e}=me(),{activeLabel:t}=B(Fne);return cr("hires").isFeatureEnabled?i.jsx(Po,{label:e("parameters.hiresOptim"),activeLabel:t,children:i.jsxs(H,{sx:{gap:2,flexDirection:"column"},children:[i.jsx(Lne,{}),i.jsx($ne,{})]})}):null},Hne=p.memo(Bne),Wne=Pe(mn,({ui:e,generation:t})=>{const{shouldUseSliders:n}=e,{shouldRandomizeSeed:r}=t;return{shouldUseSliders:n,activeLabel:r?void 0:"Manual Seed"}},Et),Vne=()=>{const{shouldUseSliders:e,activeLabel:t}=B(Wne);return i.jsx(Po,{label:"General",activeLabel:t,defaultIsOpen:!0,children:i.jsx(H,{sx:{flexDirection:"column",gap:3},children:e?i.jsxs(i.Fragment,{children:[i.jsx(ac,{}),i.jsx(lc,{}),i.jsx(sc,{}),i.jsx(ic,{}),i.jsx(qe,{pt:2,children:i.jsx(cc,{})}),i.jsx(eh,{})]}):i.jsxs(i.Fragment,{children:[i.jsxs(H,{gap:3,children:[i.jsx(ac,{}),i.jsx(lc,{}),i.jsx(sc,{})]}),i.jsx(ic,{}),i.jsx(qe,{pt:2,children:i.jsx(cc,{})}),i.jsx(eh,{})]})})})},Une=p.memo(Vne),Gne=()=>i.jsxs(i.Fragment,{children:[i.jsx(Iy,{}),i.jsx(Ey,{}),i.jsx(Ty,{}),i.jsx(Une,{}),i.jsx(Cy,{}),i.jsx(Sy,{}),i.jsx(_y,{}),i.jsx(Ry,{}),i.jsx(_E,{}),i.jsx(Oy,{}),i.jsx(Hne,{}),i.jsx(jE,{}),i.jsx(Py,{})]}),qE=p.memo(Gne),qne=()=>i.jsxs(H,{sx:{gap:4,w:"full",h:"full"},children:[i.jsx(xy,{children:i.jsx(qE,{})}),i.jsx(yE,{})]}),Kne=p.memo(qne);var I0={exports:{}};(function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Konva=void 0;var n=Jx;Object.defineProperty(t,"Konva",{enumerable:!0,get:function(){return n.Konva}});const r=Jx;e.exports=r.Konva})(I0,I0.exports);var Yne=I0.exports;const Ou=dc(Yne);var KE={exports:{}};/** + * @license React + * react-reconciler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Xne=function(t){var n={},r=p,o=If,s=Object.assign;function a(l){for(var c="https://reactjs.org/docs/error-decoder.html?invariant="+l,g=1;gZ||x[T]!==_[Z]){var ce=` +`+x[T].replace(" at new "," at ");return l.displayName&&ce.includes("")&&(ce=ce.replace("",l.displayName)),ce}while(1<=T&&0<=Z);break}}}finally{Lt=!1,Error.prepareStackTrace=g}return(l=l?l.displayName||l.name:"")?Rt(l):""}var Ft=Object.prototype.hasOwnProperty,je=[],ht=-1;function Mt(l){return{current:l}}function Tt(l){0>ht||(l.current=je[ht],je[ht]=null,ht--)}function $t(l,c){ht++,je[ht]=l.current,l.current=c}var dn={},Vt=Mt(dn),Qt=Mt(!1),Cn=dn;function Ir(l,c){var g=l.type.contextTypes;if(!g)return dn;var y=l.stateNode;if(y&&y.__reactInternalMemoizedUnmaskedChildContext===c)return y.__reactInternalMemoizedMaskedChildContext;var x={},_;for(_ in g)x[_]=c[_];return y&&(l=l.stateNode,l.__reactInternalMemoizedUnmaskedChildContext=c,l.__reactInternalMemoizedMaskedChildContext=x),x}function Yn(l){return l=l.childContextTypes,l!=null}function wt(){Tt(Qt),Tt(Vt)}function Sn(l,c,g){if(Vt.current!==dn)throw Error(a(168));$t(Vt,c),$t(Qt,g)}function _n(l,c,g){var y=l.stateNode;if(c=c.childContextTypes,typeof y.getChildContext!="function")return g;y=y.getChildContext();for(var x in y)if(!(x in c))throw Error(a(108,M(l)||"Unknown",x));return s({},g,y)}function Xn(l){return l=(l=l.stateNode)&&l.__reactInternalMemoizedMergedChildContext||dn,Cn=Vt.current,$t(Vt,l),$t(Qt,Qt.current),!0}function dr(l,c,g){var y=l.stateNode;if(!y)throw Error(a(169));g?(l=_n(l,c,Cn),y.__reactInternalMemoizedMergedChildContext=l,Tt(Qt),Tt(Vt),$t(Vt,l)):Tt(Qt),$t(Qt,g)}var Rn=Math.clz32?Math.clz32:gn,Mn=Math.log,tn=Math.LN2;function gn(l){return l>>>=0,l===0?32:31-(Mn(l)/tn|0)|0}var wn=64,fn=4194304;function pn(l){switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return l&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return l&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return l}}function Ve(l,c){var g=l.pendingLanes;if(g===0)return 0;var y=0,x=l.suspendedLanes,_=l.pingedLanes,T=g&268435455;if(T!==0){var Z=T&~x;Z!==0?y=pn(Z):(_&=T,_!==0&&(y=pn(_)))}else T=g&~x,T!==0?y=pn(T):_!==0&&(y=pn(_));if(y===0)return 0;if(c!==0&&c!==y&&!(c&x)&&(x=y&-y,_=c&-c,x>=_||x===16&&(_&4194240)!==0))return c;if(y&4&&(y|=g&16),c=l.entangledLanes,c!==0)for(l=l.entanglements,c&=y;0g;g++)c.push(l);return c}function dt(l,c,g){l.pendingLanes|=c,c!==536870912&&(l.suspendedLanes=0,l.pingedLanes=0),l=l.eventTimes,c=31-Rn(c),l[c]=g}function Je(l,c){var g=l.pendingLanes&~c;l.pendingLanes=c,l.suspendedLanes=0,l.pingedLanes=0,l.expiredLanes&=c,l.mutableReadLanes&=c,l.entangledLanes&=c,c=l.entanglements;var y=l.eventTimes;for(l=l.expirationTimes;0>=T,x-=T,_o=1<<32-Rn(c)+x|g<vn?(zr=Ht,Ht=null):zr=Ht.sibling;var yn=rt(ie,Ht,he[vn],ot);if(yn===null){Ht===null&&(Ht=zr);break}l&&Ht&&yn.alternate===null&&c(ie,Ht),ee=_(yn,ee,vn),Kt===null?It=yn:Kt.sibling=yn,Kt=yn,Ht=zr}if(vn===he.length)return g(ie,Ht),Qn&&hi(ie,vn),It;if(Ht===null){for(;vnvn?(zr=Ht,Ht=null):zr=Ht.sibling;var Aa=rt(ie,Ht,yn.value,ot);if(Aa===null){Ht===null&&(Ht=zr);break}l&&Ht&&Aa.alternate===null&&c(ie,Ht),ee=_(Aa,ee,vn),Kt===null?It=Aa:Kt.sibling=Aa,Kt=Aa,Ht=zr}if(yn.done)return g(ie,Ht),Qn&&hi(ie,vn),It;if(Ht===null){for(;!yn.done;vn++,yn=he.next())yn=Bt(ie,yn.value,ot),yn!==null&&(ee=_(yn,ee,vn),Kt===null?It=yn:Kt.sibling=yn,Kt=yn);return Qn&&hi(ie,vn),It}for(Ht=y(ie,Ht);!yn.done;vn++,yn=he.next())yn=Hn(Ht,ie,vn,yn.value,ot),yn!==null&&(l&&yn.alternate!==null&&Ht.delete(yn.key===null?vn:yn.key),ee=_(yn,ee,vn),Kt===null?It=yn:Kt.sibling=yn,Kt=yn);return l&&Ht.forEach(function(WI){return c(ie,WI)}),Qn&&hi(ie,vn),It}function oa(ie,ee,he,ot){if(typeof he=="object"&&he!==null&&he.type===h&&he.key===null&&(he=he.props.children),typeof he=="object"&&he!==null){switch(he.$$typeof){case d:e:{for(var It=he.key,Kt=ee;Kt!==null;){if(Kt.key===It){if(It=he.type,It===h){if(Kt.tag===7){g(ie,Kt.sibling),ee=x(Kt,he.props.children),ee.return=ie,ie=ee;break e}}else if(Kt.elementType===It||typeof It=="object"&&It!==null&&It.$$typeof===j&&nb(It)===Kt.type){g(ie,Kt.sibling),ee=x(Kt,he.props),ee.ref=Pc(ie,Kt,he),ee.return=ie,ie=ee;break e}g(ie,Kt);break}else c(ie,Kt);Kt=Kt.sibling}he.type===h?(ee=Si(he.props.children,ie.mode,ot,he.key),ee.return=ie,ie=ee):(ot=Dd(he.type,he.key,he.props,null,ie.mode,ot),ot.ref=Pc(ie,ee,he),ot.return=ie,ie=ot)}return T(ie);case f:e:{for(Kt=he.key;ee!==null;){if(ee.key===Kt)if(ee.tag===4&&ee.stateNode.containerInfo===he.containerInfo&&ee.stateNode.implementation===he.implementation){g(ie,ee.sibling),ee=x(ee,he.children||[]),ee.return=ie,ie=ee;break e}else{g(ie,ee);break}else c(ie,ee);ee=ee.sibling}ee=sg(he,ie.mode,ot),ee.return=ie,ie=ee}return T(ie);case j:return Kt=he._init,oa(ie,ee,Kt(he._payload),ot)}if(U(he))return Dn(ie,ee,he,ot);if(O(he))return uo(ie,ee,he,ot);ld(ie,he)}return typeof he=="string"&&he!==""||typeof he=="number"?(he=""+he,ee!==null&&ee.tag===6?(g(ie,ee.sibling),ee=x(ee,he),ee.return=ie,ie=ee):(g(ie,ee),ee=og(he,ie.mode,ot),ee.return=ie,ie=ee),T(ie)):g(ie,ee)}return oa}var ll=rb(!0),ob=rb(!1),kc={},Wo=Mt(kc),_c=Mt(kc),cl=Mt(kc);function Ts(l){if(l===kc)throw Error(a(174));return l}function ym(l,c){$t(cl,c),$t(_c,l),$t(Wo,kc),l=N(c),Tt(Wo),$t(Wo,l)}function ul(){Tt(Wo),Tt(_c),Tt(cl)}function sb(l){var c=Ts(cl.current),g=Ts(Wo.current);c=G(g,l.type,c),g!==c&&($t(_c,l),$t(Wo,c))}function bm(l){_c.current===l&&(Tt(Wo),Tt(_c))}var or=Mt(0);function cd(l){for(var c=l;c!==null;){if(c.tag===13){var g=c.memoizedState;if(g!==null&&(g=g.dehydrated,g===null||Er(g)||Lo(g)))return c}else if(c.tag===19&&c.memoizedProps.revealOrder!==void 0){if(c.flags&128)return c}else if(c.child!==null){c.child.return=c,c=c.child;continue}if(c===l)break;for(;c.sibling===null;){if(c.return===null||c.return===l)return null;c=c.return}c.sibling.return=c.return,c=c.sibling}return null}var xm=[];function Sm(){for(var l=0;lg?g:4,l(!0);var y=wm.transition;wm.transition={};try{l(!1),c()}finally{_e=g,wm.transition=y}}function Cb(){return Vo().memoizedState}function gI(l,c,g){var y=Ma(l);if(g={lane:y,action:g,hasEagerState:!1,eagerState:null,next:null},Pb(l))kb(c,g);else if(g=Ky(l,c,g,y),g!==null){var x=Gr();Uo(g,l,y,x),_b(g,c,y)}}function vI(l,c,g){var y=Ma(l),x={lane:y,action:g,hasEagerState:!1,eagerState:null,next:null};if(Pb(l))kb(c,x);else{var _=l.alternate;if(l.lanes===0&&(_===null||_.lanes===0)&&(_=c.lastRenderedReducer,_!==null))try{var T=c.lastRenderedState,Z=_(T,g);if(x.hasEagerState=!0,x.eagerState=Z,nn(Z,T)){var ce=c.interleaved;ce===null?(x.next=x,hm(c)):(x.next=ce.next,ce.next=x),c.interleaved=x;return}}catch{}finally{}g=Ky(l,c,x,y),g!==null&&(x=Gr(),Uo(g,l,y,x),_b(g,c,y))}}function Pb(l){var c=l.alternate;return l===sr||c!==null&&c===sr}function kb(l,c){jc=dd=!0;var g=l.pending;g===null?c.next=c:(c.next=g.next,g.next=c),l.pending=c}function _b(l,c,g){if(g&4194240){var y=c.lanes;y&=l.pendingLanes,g|=y,c.lanes=g,Ee(l,g)}}var hd={readContext:Ho,useCallback:Wr,useContext:Wr,useEffect:Wr,useImperativeHandle:Wr,useInsertionEffect:Wr,useLayoutEffect:Wr,useMemo:Wr,useReducer:Wr,useRef:Wr,useState:Wr,useDebugValue:Wr,useDeferredValue:Wr,useTransition:Wr,useMutableSource:Wr,useSyncExternalStore:Wr,useId:Wr,unstable_isNewReconciler:!1},yI={readContext:Ho,useCallback:function(l,c){return Ds().memoizedState=[l,c===void 0?null:c],l},useContext:Ho,useEffect:mb,useImperativeHandle:function(l,c,g){return g=g!=null?g.concat([l]):null,fd(4194308,4,yb.bind(null,c,l),g)},useLayoutEffect:function(l,c){return fd(4194308,4,l,c)},useInsertionEffect:function(l,c){return fd(4,2,l,c)},useMemo:function(l,c){var g=Ds();return c=c===void 0?null:c,l=l(),g.memoizedState=[l,c],l},useReducer:function(l,c,g){var y=Ds();return c=g!==void 0?g(c):c,y.memoizedState=y.baseState=c,l={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:c},y.queue=l,l=l.dispatch=gI.bind(null,sr,l),[y.memoizedState,l]},useRef:function(l){var c=Ds();return l={current:l},c.memoizedState=l},useState:pb,useDebugValue:Im,useDeferredValue:function(l){return Ds().memoizedState=l},useTransition:function(){var l=pb(!1),c=l[0];return l=mI.bind(null,l[1]),Ds().memoizedState=l,[c,l]},useMutableSource:function(){},useSyncExternalStore:function(l,c,g){var y=sr,x=Ds();if(Qn){if(g===void 0)throw Error(a(407));g=g()}else{if(g=c(),Nr===null)throw Error(a(349));gi&30||lb(y,c,g)}x.memoizedState=g;var _={value:g,getSnapshot:c};return x.queue=_,mb(ub.bind(null,y,_,l),[l]),y.flags|=2048,Oc(9,cb.bind(null,y,_,g,c),void 0,null),g},useId:function(){var l=Ds(),c=Nr.identifierPrefix;if(Qn){var g=Hr,y=_o;g=(y&~(1<<32-Rn(y)-1)).toString(32)+g,c=":"+c+"R"+g,g=Ec++,0Xm&&(c.flags|=128,y=!0,Tc(x,!1),c.lanes=4194304)}else{if(!y)if(l=cd(_),l!==null){if(c.flags|=128,y=!0,l=l.updateQueue,l!==null&&(c.updateQueue=l,c.flags|=4),Tc(x,!0),x.tail===null&&x.tailMode==="hidden"&&!_.alternate&&!Qn)return Vr(c),null}else 2*$e()-x.renderingStartTime>Xm&&g!==1073741824&&(c.flags|=128,y=!0,Tc(x,!1),c.lanes=4194304);x.isBackwards?(_.sibling=c.child,c.child=_):(l=x.last,l!==null?l.sibling=_:c.child=_,x.last=_)}return x.tail!==null?(c=x.tail,x.rendering=c,x.tail=c.sibling,x.renderingStartTime=$e(),c.sibling=null,l=or.current,$t(or,y?l&1|2:l&1),c):(Vr(c),null);case 22:case 23:return tg(),g=c.memoizedState!==null,l!==null&&l.memoizedState!==null!==g&&(c.flags|=8192),g&&c.mode&1?Eo&1073741824&&(Vr(c),fe&&c.subtreeFlags&6&&(c.flags|=8192)):Vr(c),null;case 24:return null;case 25:return null}throw Error(a(156,c.tag))}function _I(l,c){switch(am(c),c.tag){case 1:return Yn(c.type)&&wt(),l=c.flags,l&65536?(c.flags=l&-65537|128,c):null;case 3:return ul(),Tt(Qt),Tt(Vt),Sm(),l=c.flags,l&65536&&!(l&128)?(c.flags=l&-65537|128,c):null;case 5:return bm(c),null;case 13:if(Tt(or),l=c.memoizedState,l!==null&&l.dehydrated!==null){if(c.alternate===null)throw Error(a(340));sl()}return l=c.flags,l&65536?(c.flags=l&-65537|128,c):null;case 19:return Tt(or),null;case 4:return ul(),null;case 10:return fm(c.type._context),null;case 22:case 23:return tg(),null;case 24:return null;default:return null}}var bd=!1,Ur=!1,jI=typeof WeakSet=="function"?WeakSet:Set,ct=null;function fl(l,c){var g=l.ref;if(g!==null)if(typeof g=="function")try{g(null)}catch(y){Zn(l,c,y)}else g.current=null}function $m(l,c,g){try{g()}catch(y){Zn(l,c,y)}}var Ub=!1;function EI(l,c){for(W(l.containerInfo),ct=c;ct!==null;)if(l=ct,c=l.child,(l.subtreeFlags&1028)!==0&&c!==null)c.return=l,ct=c;else for(;ct!==null;){l=ct;try{var g=l.alternate;if(l.flags&1024)switch(l.tag){case 0:case 11:case 15:break;case 1:if(g!==null){var y=g.memoizedProps,x=g.memoizedState,_=l.stateNode,T=_.getSnapshotBeforeUpdate(l.elementType===l.type?y:ds(l.type,y),x);_.__reactInternalSnapshotBeforeUpdate=T}break;case 3:fe&&xn(l.stateNode.containerInfo);break;case 5:case 6:case 4:case 17:break;default:throw Error(a(163))}}catch(Z){Zn(l,l.return,Z)}if(c=l.sibling,c!==null){c.return=l.return,ct=c;break}ct=l.return}return g=Ub,Ub=!1,g}function Dc(l,c,g){var y=c.updateQueue;if(y=y!==null?y.lastEffect:null,y!==null){var x=y=y.next;do{if((x.tag&l)===l){var _=x.destroy;x.destroy=void 0,_!==void 0&&$m(c,g,_)}x=x.next}while(x!==y)}}function xd(l,c){if(c=c.updateQueue,c=c!==null?c.lastEffect:null,c!==null){var g=c=c.next;do{if((g.tag&l)===l){var y=g.create;g.destroy=y()}g=g.next}while(g!==c)}}function Lm(l){var c=l.ref;if(c!==null){var g=l.stateNode;switch(l.tag){case 5:l=X(g);break;default:l=g}typeof c=="function"?c(l):c.current=l}}function Gb(l){var c=l.alternate;c!==null&&(l.alternate=null,Gb(c)),l.child=null,l.deletions=null,l.sibling=null,l.tag===5&&(c=l.stateNode,c!==null&&Fe(c)),l.stateNode=null,l.return=null,l.dependencies=null,l.memoizedProps=null,l.memoizedState=null,l.pendingProps=null,l.stateNode=null,l.updateQueue=null}function qb(l){return l.tag===5||l.tag===3||l.tag===4}function Kb(l){e:for(;;){for(;l.sibling===null;){if(l.return===null||qb(l.return))return null;l=l.return}for(l.sibling.return=l.return,l=l.sibling;l.tag!==5&&l.tag!==6&&l.tag!==18;){if(l.flags&2||l.child===null||l.tag===4)continue e;l.child.return=l,l=l.child}if(!(l.flags&2))return l.stateNode}}function Fm(l,c,g){var y=l.tag;if(y===5||y===6)l=l.stateNode,c?Kn(g,l,c):Xt(g,l);else if(y!==4&&(l=l.child,l!==null))for(Fm(l,c,g),l=l.sibling;l!==null;)Fm(l,c,g),l=l.sibling}function Bm(l,c,g){var y=l.tag;if(y===5||y===6)l=l.stateNode,c?ln(g,l,c):yt(g,l);else if(y!==4&&(l=l.child,l!==null))for(Bm(l,c,g),l=l.sibling;l!==null;)Bm(l,c,g),l=l.sibling}var Lr=null,fs=!1;function Ns(l,c,g){for(g=g.child;g!==null;)Hm(l,c,g),g=g.sibling}function Hm(l,c,g){if(sn&&typeof sn.onCommitFiberUnmount=="function")try{sn.onCommitFiberUnmount(Bn,g)}catch{}switch(g.tag){case 5:Ur||fl(g,c);case 6:if(fe){var y=Lr,x=fs;Lr=null,Ns(l,c,g),Lr=y,fs=x,Lr!==null&&(fs?et(Lr,g.stateNode):Re(Lr,g.stateNode))}else Ns(l,c,g);break;case 18:fe&&Lr!==null&&(fs?Ke(Lr,g.stateNode):He(Lr,g.stateNode));break;case 4:fe?(y=Lr,x=fs,Lr=g.stateNode.containerInfo,fs=!0,Ns(l,c,g),Lr=y,fs=x):(ke&&(y=g.stateNode.containerInfo,x=kn(y),un(y,x)),Ns(l,c,g));break;case 0:case 11:case 14:case 15:if(!Ur&&(y=g.updateQueue,y!==null&&(y=y.lastEffect,y!==null))){x=y=y.next;do{var _=x,T=_.destroy;_=_.tag,T!==void 0&&(_&2||_&4)&&$m(g,c,T),x=x.next}while(x!==y)}Ns(l,c,g);break;case 1:if(!Ur&&(fl(g,c),y=g.stateNode,typeof y.componentWillUnmount=="function"))try{y.props=g.memoizedProps,y.state=g.memoizedState,y.componentWillUnmount()}catch(Z){Zn(g,c,Z)}Ns(l,c,g);break;case 21:Ns(l,c,g);break;case 22:g.mode&1?(Ur=(y=Ur)||g.memoizedState!==null,Ns(l,c,g),Ur=y):Ns(l,c,g);break;default:Ns(l,c,g)}}function Yb(l){var c=l.updateQueue;if(c!==null){l.updateQueue=null;var g=l.stateNode;g===null&&(g=l.stateNode=new jI),c.forEach(function(y){var x=zI.bind(null,l,y);g.has(y)||(g.add(y),y.then(x,x))})}}function ps(l,c){var g=c.deletions;if(g!==null)for(var y=0;y";case wd:return":has("+(Um(l)||"")+")";case Cd:return'[role="'+l.value+'"]';case kd:return'"'+l.value+'"';case Pd:return'[data-testname="'+l.value+'"]';default:throw Error(a(365))}}function tx(l,c){var g=[];l=[l,0];for(var y=0;yx&&(x=T),y&=~_}if(y=x,y=$e()-y,y=(120>y?120:480>y?480:1080>y?1080:1920>y?1920:3e3>y?3e3:4320>y?4320:1960*OI(y/1960))-y,10l?16:l,Ra===null)var y=!1;else{if(l=Ra,Ra=null,Od=0,Zt&6)throw Error(a(331));var x=Zt;for(Zt|=4,ct=l.current;ct!==null;){var _=ct,T=_.child;if(ct.flags&16){var Z=_.deletions;if(Z!==null){for(var ce=0;ce$e()-Ym?yi(l,0):Km|=g),co(l,c)}function ux(l,c){c===0&&(l.mode&1?(c=fn,fn<<=1,!(fn&130023424)&&(fn=4194304)):c=1);var g=Gr();l=Ms(l,c),l!==null&&(dt(l,c,g),co(l,g))}function NI(l){var c=l.memoizedState,g=0;c!==null&&(g=c.retryLane),ux(l,g)}function zI(l,c){var g=0;switch(l.tag){case 13:var y=l.stateNode,x=l.memoizedState;x!==null&&(g=x.retryLane);break;case 19:y=l.stateNode;break;default:throw Error(a(314))}y!==null&&y.delete(c),ux(l,g)}var dx;dx=function(l,c,g){if(l!==null)if(l.memoizedProps!==c.pendingProps||Qt.current)io=!0;else{if(!(l.lanes&g)&&!(c.flags&128))return io=!1,PI(l,c,g);io=!!(l.flags&131072)}else io=!1,Qn&&c.flags&1048576&&Hy(c,Jr,c.index);switch(c.lanes=0,c.tag){case 2:var y=c.type;gd(l,c),l=c.pendingProps;var x=Ir(c,Vt.current);il(c,g),x=Pm(null,c,y,l,x,g);var _=km();return c.flags|=1,typeof x=="object"&&x!==null&&typeof x.render=="function"&&x.$$typeof===void 0?(c.tag=1,c.memoizedState=null,c.updateQueue=null,Yn(y)?(_=!0,Xn(c)):_=!1,c.memoizedState=x.state!==null&&x.state!==void 0?x.state:null,mm(c),x.updater=id,c.stateNode=x,x._reactInternals=c,vm(c,y,l,g),c=Tm(null,c,y,!0,_,g)):(c.tag=0,Qn&&_&&sm(c),no(null,c,x,g),c=c.child),c;case 16:y=c.elementType;e:{switch(gd(l,c),l=c.pendingProps,x=y._init,y=x(y._payload),c.type=y,x=c.tag=LI(y),l=ds(y,l),x){case 0:c=Mm(null,c,y,l,g);break e;case 1:c=zb(null,c,y,l,g);break e;case 11:c=Mb(null,c,y,l,g);break e;case 14:c=Tb(null,c,y,ds(y.type,l),g);break e}throw Error(a(306,y,""))}return c;case 0:return y=c.type,x=c.pendingProps,x=c.elementType===y?x:ds(y,x),Mm(l,c,y,x,g);case 1:return y=c.type,x=c.pendingProps,x=c.elementType===y?x:ds(y,x),zb(l,c,y,x,g);case 3:e:{if($b(c),l===null)throw Error(a(387));y=c.pendingProps,_=c.memoizedState,x=_.element,Yy(l,c),ad(c,y,null,g);var T=c.memoizedState;if(y=T.element,Ae&&_.isDehydrated)if(_={element:y,isDehydrated:!1,cache:T.cache,pendingSuspenseBoundaries:T.pendingSuspenseBoundaries,transitions:T.transitions},c.updateQueue.baseState=_,c.memoizedState=_,c.flags&256){x=dl(Error(a(423)),c),c=Lb(l,c,y,g,x);break e}else if(y!==x){x=dl(Error(a(424)),c),c=Lb(l,c,y,g,x);break e}else for(Ae&&(Bo=J(c.stateNode.containerInfo),jo=c,Qn=!0,us=null,Cc=!1),g=ob(c,null,y,g),c.child=g;g;)g.flags=g.flags&-3|4096,g=g.sibling;else{if(sl(),y===x){c=na(l,c,g);break e}no(l,c,y,g)}c=c.child}return c;case 5:return sb(c),l===null&&lm(c),y=c.type,x=c.pendingProps,_=l!==null?l.memoizedProps:null,T=x.children,Y(y,x)?T=null:_!==null&&Y(y,_)&&(c.flags|=32),Nb(l,c),no(l,c,T,g),c.child;case 6:return l===null&&lm(c),null;case 13:return Fb(l,c,g);case 4:return ym(c,c.stateNode.containerInfo),y=c.pendingProps,l===null?c.child=ll(c,null,y,g):no(l,c,y,g),c.child;case 11:return y=c.type,x=c.pendingProps,x=c.elementType===y?x:ds(y,x),Mb(l,c,y,x,g);case 7:return no(l,c,c.pendingProps,g),c.child;case 8:return no(l,c,c.pendingProps.children,g),c.child;case 12:return no(l,c,c.pendingProps.children,g),c.child;case 10:e:{if(y=c.type._context,x=c.pendingProps,_=c.memoizedProps,T=x.value,qy(c,y,T),_!==null)if(nn(_.value,T)){if(_.children===x.children&&!Qt.current){c=na(l,c,g);break e}}else for(_=c.child,_!==null&&(_.return=c);_!==null;){var Z=_.dependencies;if(Z!==null){T=_.child;for(var ce=Z.firstContext;ce!==null;){if(ce.context===y){if(_.tag===1){ce=ta(-1,g&-g),ce.tag=2;var De=_.updateQueue;if(De!==null){De=De.shared;var ft=De.pending;ft===null?ce.next=ce:(ce.next=ft.next,ft.next=ce),De.pending=ce}}_.lanes|=g,ce=_.alternate,ce!==null&&(ce.lanes|=g),pm(_.return,g,c),Z.lanes|=g;break}ce=ce.next}}else if(_.tag===10)T=_.type===c.type?null:_.child;else if(_.tag===18){if(T=_.return,T===null)throw Error(a(341));T.lanes|=g,Z=T.alternate,Z!==null&&(Z.lanes|=g),pm(T,g,c),T=_.sibling}else T=_.child;if(T!==null)T.return=_;else for(T=_;T!==null;){if(T===c){T=null;break}if(_=T.sibling,_!==null){_.return=T.return,T=_;break}T=T.return}_=T}no(l,c,x.children,g),c=c.child}return c;case 9:return x=c.type,y=c.pendingProps.children,il(c,g),x=Ho(x),y=y(x),c.flags|=1,no(l,c,y,g),c.child;case 14:return y=c.type,x=ds(y,c.pendingProps),x=ds(y.type,x),Tb(l,c,y,x,g);case 15:return Db(l,c,c.type,c.pendingProps,g);case 17:return y=c.type,x=c.pendingProps,x=c.elementType===y?x:ds(y,x),gd(l,c),c.tag=1,Yn(y)?(l=!0,Xn(c)):l=!1,il(c,g),eb(c,y,x),vm(c,y,x,g),Tm(null,c,y,!0,l,g);case 19:return Hb(l,c,g);case 22:return Ab(l,c,g)}throw Error(a(156,c.tag))};function fx(l,c){return ze(l,c)}function $I(l,c,g,y){this.tag=l,this.key=g,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=c,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=y,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Go(l,c,g,y){return new $I(l,c,g,y)}function rg(l){return l=l.prototype,!(!l||!l.isReactComponent)}function LI(l){if(typeof l=="function")return rg(l)?1:0;if(l!=null){if(l=l.$$typeof,l===C)return 11;if(l===k)return 14}return 2}function Da(l,c){var g=l.alternate;return g===null?(g=Go(l.tag,c,l.key,l.mode),g.elementType=l.elementType,g.type=l.type,g.stateNode=l.stateNode,g.alternate=l,l.alternate=g):(g.pendingProps=c,g.type=l.type,g.flags=0,g.subtreeFlags=0,g.deletions=null),g.flags=l.flags&14680064,g.childLanes=l.childLanes,g.lanes=l.lanes,g.child=l.child,g.memoizedProps=l.memoizedProps,g.memoizedState=l.memoizedState,g.updateQueue=l.updateQueue,c=l.dependencies,g.dependencies=c===null?null:{lanes:c.lanes,firstContext:c.firstContext},g.sibling=l.sibling,g.index=l.index,g.ref=l.ref,g}function Dd(l,c,g,y,x,_){var T=2;if(y=l,typeof l=="function")rg(l)&&(T=1);else if(typeof l=="string")T=5;else e:switch(l){case h:return Si(g.children,x,_,c);case m:T=8,x|=8;break;case v:return l=Go(12,g,c,x|2),l.elementType=v,l.lanes=_,l;case S:return l=Go(13,g,c,x),l.elementType=S,l.lanes=_,l;case P:return l=Go(19,g,c,x),l.elementType=P,l.lanes=_,l;case E:return Ad(g,x,_,c);default:if(typeof l=="object"&&l!==null)switch(l.$$typeof){case b:T=10;break e;case w:T=9;break e;case C:T=11;break e;case k:T=14;break e;case j:T=16,y=null;break e}throw Error(a(130,l==null?l:typeof l,""))}return c=Go(T,g,c,x),c.elementType=l,c.type=y,c.lanes=_,c}function Si(l,c,g,y){return l=Go(7,l,y,c),l.lanes=g,l}function Ad(l,c,g,y){return l=Go(22,l,y,c),l.elementType=E,l.lanes=g,l.stateNode={isHidden:!1},l}function og(l,c,g){return l=Go(6,l,null,c),l.lanes=g,l}function sg(l,c,g){return c=Go(4,l.children!==null?l.children:[],l.key,c),c.lanes=g,c.stateNode={containerInfo:l.containerInfo,pendingChildren:null,implementation:l.implementation},c}function FI(l,c,g,y,x){this.tag=c,this.containerInfo=l,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=se,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Dt(0),this.expirationTimes=Dt(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Dt(0),this.identifierPrefix=y,this.onRecoverableError=x,Ae&&(this.mutableSourceEagerHydrationData=null)}function px(l,c,g,y,x,_,T,Z,ce){return l=new FI(l,c,g,Z,ce),c===1?(c=1,_===!0&&(c|=8)):c=0,_=Go(3,null,null,c),l.current=_,_.stateNode=l,_.memoizedState={element:y,isDehydrated:g,cache:null,transitions:null,pendingSuspenseBoundaries:null},mm(_),l}function hx(l){if(!l)return dn;l=l._reactInternals;e:{if(A(l)!==l||l.tag!==1)throw Error(a(170));var c=l;do{switch(c.tag){case 3:c=c.stateNode.context;break e;case 1:if(Yn(c.type)){c=c.stateNode.__reactInternalMemoizedMergedChildContext;break e}}c=c.return}while(c!==null);throw Error(a(171))}if(l.tag===1){var g=l.type;if(Yn(g))return _n(l,g,c)}return c}function mx(l){var c=l._reactInternals;if(c===void 0)throw typeof l.render=="function"?Error(a(188)):(l=Object.keys(l).join(","),Error(a(268,l)));return l=V(c),l===null?null:l.stateNode}function gx(l,c){if(l=l.memoizedState,l!==null&&l.dehydrated!==null){var g=l.retryLane;l.retryLane=g!==0&&g=De&&_>=Bt&&x<=ft&&T<=rt){l.splice(c,1);break}else if(y!==De||g.width!==ce.width||rt<_||Bt>T){if(!(_!==Bt||g.height!==ce.height||ftx)){De>y&&(ce.width+=De-y,ce.x=y),ft_&&(ce.height+=Bt-_,ce.y=_),rtg&&(g=T)),T ")+` + +No matching component was found for: + `)+l.join(" > ")}return null},n.getPublicRootInstance=function(l){if(l=l.current,!l.child)return null;switch(l.child.tag){case 5:return X(l.child.stateNode);default:return l.child.stateNode}},n.injectIntoDevTools=function(l){if(l={bundleType:l.bundleType,version:l.version,rendererPackageName:l.rendererPackageName,rendererConfig:l.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:u.ReactCurrentDispatcher,findHostInstanceByFiber:BI,findFiberByHostInstance:l.findFiberByHostInstance||HI,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.2.0"},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")l=!1;else{var c=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(c.isDisabled||!c.supportsFiber)l=!0;else{try{Bn=c.inject(l),sn=c}catch{}l=!!c.checkDCE}}return l},n.isAlreadyRendering=function(){return!1},n.observeVisibleRects=function(l,c,g,y){if(!xt)throw Error(a(363));l=Gm(l,c);var x=Xe(l,g,y).disconnect;return{disconnect:function(){x()}}},n.registerMutableSourceForHydration=function(l,c){var g=c._getVersion;g=g(c._source),l.mutableSourceEagerHydrationData==null?l.mutableSourceEagerHydrationData=[c,g]:l.mutableSourceEagerHydrationData.push(c,g)},n.runWithPriority=function(l,c){var g=_e;try{return _e=l,c()}finally{_e=g}},n.shouldError=function(){return null},n.shouldSuspend=function(){return!1},n.updateContainer=function(l,c,g,y){var x=c.current,_=Gr(),T=Ma(x);return g=hx(g),c.context===null?c.context=g:c.pendingContext=g,c=ta(_,T),c.payload={element:l},y=y===void 0?null:y,y!==null&&(c.callback=y),l=Ia(x,c,T),l!==null&&(Uo(l,x,T,_),sd(l,x,T)),T},n};KE.exports=Xne;var Qne=KE.exports;const Zne=dc(Qne);var YE={exports:{}},ol={};/** + * @license React + * react-reconciler-constants.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ol.ConcurrentRoot=1;ol.ContinuousEventPriority=4;ol.DefaultEventPriority=16;ol.DiscreteEventPriority=1;ol.IdleEventPriority=536870912;ol.LegacyRoot=0;YE.exports=ol;var XE=YE.exports;const L4={children:!0,ref:!0,key:!0,style:!0,forwardedRef:!0,unstable_applyCache:!0,unstable_applyDrawHitFromCache:!0};let F4=!1,B4=!1;const Ly=".react-konva-event",Jne=`ReactKonva: You have a Konva node with draggable = true and position defined but no onDragMove or onDragEnd events are handled. +Position of a node will be changed during drag&drop, so you should update state of the react app as well. +Consider to add onDragMove or onDragEnd events. +For more info see: https://github.com/konvajs/react-konva/issues/256 +`,ere=`ReactKonva: You are using "zIndex" attribute for a Konva node. +react-konva may get confused with ordering. Just define correct order of elements in your render function of a component. +For more info see: https://github.com/konvajs/react-konva/issues/194 +`,tre={};function om(e,t,n=tre){if(!F4&&"zIndex"in t&&(console.warn(ere),F4=!0),!B4&&t.draggable){var r=t.x!==void 0||t.y!==void 0,o=t.onDragEnd||t.onDragMove;r&&!o&&(console.warn(Jne),B4=!0)}for(var s in n)if(!L4[s]){var a=s.slice(0,2)==="on",u=n[s]!==t[s];if(a&&u){var d=s.substr(2).toLowerCase();d.substr(0,7)==="content"&&(d="content"+d.substr(7,1).toUpperCase()+d.substr(8)),e.off(d,n[s])}var f=!t.hasOwnProperty(s);f&&e.setAttr(s,void 0)}var h=t._useStrictMode,m={},v=!1;const b={};for(var s in t)if(!L4[s]){var a=s.slice(0,2)==="on",w=n[s]!==t[s];if(a&&w){var d=s.substr(2).toLowerCase();d.substr(0,7)==="content"&&(d="content"+d.substr(7,1).toUpperCase()+d.substr(8)),t[s]&&(b[d]=t[s])}!a&&(t[s]!==n[s]||h&&t[s]!==e.getAttr(s))&&(v=!0,m[s]=t[s])}v&&(e.setAttrs(m),pi(e));for(var d in b)e.on(d+Ly,b[d])}function pi(e){if(!DR.Konva.autoDrawEnabled){var t=e.getLayer()||e.getStage();t&&t.batchDraw()}}const QE={},nre={};Ou.Node.prototype._applyProps=om;function rre(e,t){if(typeof t=="string"){console.error(`Do not use plain text as child of Konva.Node. You are using text: ${t}`);return}e.add(t),pi(e)}function ore(e,t,n){let r=Ou[e];r||(console.error(`Konva has no node with the type ${e}. Group will be used instead. If you use minimal version of react-konva, just import required nodes into Konva: "import "konva/lib/shapes/${e}" If you want to render DOM elements as part of canvas tree take a look into this demo: https://konvajs.github.io/docs/react/DOM_Portal.html`),r=Ou.Group);const o={},s={};for(var a in t){var u=a.slice(0,2)==="on";u?s[a]=t[a]:o[a]=t[a]}const d=new r(o);return om(d,s),d}function sre(e,t,n){console.error(`Text components are not supported for now in ReactKonva. Your text is: "${e}"`)}function are(e,t,n){return!1}function ire(e){return e}function lre(){return null}function cre(){return null}function ure(e,t,n,r){return nre}function dre(){}function fre(e){}function pre(e,t){return!1}function hre(){return QE}function mre(){return QE}const gre=setTimeout,vre=clearTimeout,yre=-1;function bre(e,t){return!1}const xre=!1,Sre=!0,wre=!0;function Cre(e,t){t.parent===e?t.moveToTop():e.add(t),pi(e)}function Pre(e,t){t.parent===e?t.moveToTop():e.add(t),pi(e)}function ZE(e,t,n){t._remove(),e.add(t),t.setZIndex(n.getZIndex()),pi(e)}function kre(e,t,n){ZE(e,t,n)}function _re(e,t){t.destroy(),t.off(Ly),pi(e)}function jre(e,t){t.destroy(),t.off(Ly),pi(e)}function Ere(e,t,n){console.error(`Text components are not yet supported in ReactKonva. You text is: "${n}"`)}function Ire(e,t,n){}function Ore(e,t,n,r,o){om(e,o,r)}function Rre(e){e.hide(),pi(e)}function Mre(e){}function Tre(e,t){(t.visible==null||t.visible)&&e.show()}function Dre(e,t){}function Are(e){}function Nre(){}const zre=()=>XE.DefaultEventPriority,$re=Object.freeze(Object.defineProperty({__proto__:null,appendChild:Cre,appendChildToContainer:Pre,appendInitialChild:rre,cancelTimeout:vre,clearContainer:Are,commitMount:Ire,commitTextUpdate:Ere,commitUpdate:Ore,createInstance:ore,createTextInstance:sre,detachDeletedInstance:Nre,finalizeInitialChildren:are,getChildHostContext:mre,getCurrentEventPriority:zre,getPublicInstance:ire,getRootHostContext:hre,hideInstance:Rre,hideTextInstance:Mre,idlePriority:If.unstable_IdlePriority,insertBefore:ZE,insertInContainerBefore:kre,isPrimaryRenderer:xre,noTimeout:yre,now:If.unstable_now,prepareForCommit:lre,preparePortalMount:cre,prepareUpdate:ure,removeChild:_re,removeChildFromContainer:jre,resetAfterCommit:dre,resetTextContent:fre,run:If.unstable_runWithPriority,scheduleTimeout:gre,shouldDeprioritizeSubtree:pre,shouldSetTextContent:bre,supportsMutation:wre,unhideInstance:Tre,unhideTextInstance:Dre,warnsIfNotActing:Sre},Symbol.toStringTag,{value:"Module"}));var Lre=Object.defineProperty,Fre=Object.defineProperties,Bre=Object.getOwnPropertyDescriptors,H4=Object.getOwnPropertySymbols,Hre=Object.prototype.hasOwnProperty,Wre=Object.prototype.propertyIsEnumerable,W4=(e,t,n)=>t in e?Lre(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,V4=(e,t)=>{for(var n in t||(t={}))Hre.call(t,n)&&W4(e,n,t[n]);if(H4)for(var n of H4(t))Wre.call(t,n)&&W4(e,n,t[n]);return e},Vre=(e,t)=>Fre(e,Bre(t));function JE(e,t,n){if(!e)return;if(n(e)===!0)return e;let r=t?e.return:e.child;for(;r;){const o=JE(r,t,n);if(o)return o;r=t?null:r.sibling}}function eI(e){try{return Object.defineProperties(e,{_currentRenderer:{get(){return null},set(){}},_currentRenderer2:{get(){return null},set(){}}})}catch{return e}}const Fy=eI(p.createContext(null));class tI extends p.Component{render(){return p.createElement(Fy.Provider,{value:this._reactInternals},this.props.children)}}const{ReactCurrentOwner:U4,ReactCurrentDispatcher:G4}=p.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function Ure(){const e=p.useContext(Fy);if(e===null)throw new Error("its-fine: useFiber must be called within a !");const t=p.useId();return p.useMemo(()=>{for(const r of[U4==null?void 0:U4.current,e,e==null?void 0:e.alternate]){if(!r)continue;const o=JE(r,!1,s=>{let a=s.memoizedState;for(;a;){if(a.memoizedState===t)return!0;a=a.next}});if(o)return o}},[e,t])}function Gre(){var e,t;const n=Ure(),[r]=p.useState(()=>new Map);r.clear();let o=n;for(;o;){const s=(e=o.type)==null?void 0:e._context;s&&s!==Fy&&!r.has(s)&&r.set(s,(t=G4==null?void 0:G4.current)==null?void 0:t.readContext(eI(s))),o=o.return}return r}function qre(){const e=Gre();return p.useMemo(()=>Array.from(e.keys()).reduce((t,n)=>r=>p.createElement(t,null,p.createElement(n.Provider,Vre(V4({},r),{value:e.get(n)}))),t=>p.createElement(tI,V4({},t))),[e])}function Kre(e){const t=z.useRef({});return z.useLayoutEffect(()=>{t.current=e}),z.useLayoutEffect(()=>()=>{t.current={}},[]),t.current}const Yre=e=>{const t=z.useRef(),n=z.useRef(),r=z.useRef(),o=Kre(e),s=qre(),a=u=>{const{forwardedRef:d}=e;d&&(typeof d=="function"?d(u):d.current=u)};return z.useLayoutEffect(()=>(n.current=new Ou.Stage({width:e.width,height:e.height,container:t.current}),a(n.current),r.current=ou.createContainer(n.current,XE.LegacyRoot,!1,null),ou.updateContainer(z.createElement(s,{},e.children),r.current),()=>{Ou.isBrowser&&(a(null),ou.updateContainer(null,r.current,null),n.current.destroy())}),[]),z.useLayoutEffect(()=>{a(n.current),om(n.current,e,o),ou.updateContainer(z.createElement(s,{},e.children),r.current,null)}),z.createElement("div",{ref:t,id:e.id,accessKey:e.accessKey,className:e.className,role:e.role,style:e.style,tabIndex:e.tabIndex,title:e.title})},Qc="Layer",ba="Group",qs="Rect",Ci="Circle",nh="Line",nI="Image",Xre="Transformer",ou=Zne($re);ou.injectIntoDevTools({findHostInstanceByFiber:()=>null,bundleType:0,version:z.version,rendererPackageName:"react-konva"});const Qre=z.forwardRef((e,t)=>z.createElement(tI,{},z.createElement(Yre,{...e,forwardedRef:t}))),Zre=Pe([en,rr],(e,t)=>{const{tool:n,isMovingBoundingBox:r}=e;return{tool:n,isStaging:t,isMovingBoundingBox:r}},{memoizeOptions:{resultEqualityCheck:Wt}}),Jre=()=>{const e=re(),{tool:t,isStaging:n,isMovingBoundingBox:r}=B(Zre);return{handleDragStart:p.useCallback(()=>{(t==="move"||n)&&!r&&e(Gf(!0))},[e,r,n,t]),handleDragMove:p.useCallback(o=>{if(!((t==="move"||n)&&!r))return;const s={x:o.target.x(),y:o.target.y()};e(H3(s))},[e,r,n,t]),handleDragEnd:p.useCallback(()=>{(t==="move"||n)&&!r&&e(Gf(!1))},[e,r,n,t])}},eoe=Pe([en,Sr,rr],(e,t,n)=>{const{cursorPosition:r,shouldLockBoundingBox:o,shouldShowBoundingBox:s,tool:a,isMaskEnabled:u,shouldSnapToGrid:d}=e;return{activeTabName:t,isCursorOnCanvas:!!r,shouldLockBoundingBox:o,shouldShowBoundingBox:s,tool:a,isStaging:n,isMaskEnabled:u,shouldSnapToGrid:d}},{memoizeOptions:{resultEqualityCheck:Wt}}),toe=()=>{const e=re(),{activeTabName:t,shouldShowBoundingBox:n,tool:r,isStaging:o,isMaskEnabled:s,shouldSnapToGrid:a}=B(eoe),u=p.useRef(null),d=W3(),f=()=>e(W0());Ge(["shift+c"],()=>{f()},{enabled:()=>!o,preventDefault:!0},[]);const h=()=>e(Lu(!s));Ge(["h"],()=>{h()},{enabled:()=>!o,preventDefault:!0},[s]),Ge(["n"],()=>{e(qf(!a))},{enabled:!0,preventDefault:!0},[a]),Ge("esc",()=>{e(AR())},{enabled:()=>!0,preventDefault:!0}),Ge("shift+h",()=>{e(NR(!n))},{enabled:()=>!o,preventDefault:!0},[t,n]),Ge(["space"],m=>{m.repeat||(d==null||d.container().focus(),r!=="move"&&(u.current=r,e(Ws("move"))),r==="move"&&u.current&&u.current!=="move"&&(e(Ws(u.current)),u.current="move"))},{keyup:!0,keydown:!0,preventDefault:!0},[r,u])},By=e=>{const t=e.getPointerPosition(),n=e.getAbsoluteTransform().copy();if(!t||!n)return;const r=n.invert().point(t);return{x:r.x,y:r.y}},rI=()=>{const e=re(),t=ha(),n=W3();return{updateColorUnderCursor:()=>{if(!n||!t)return;const r=n.getPointerPosition();if(!r)return;const o=zR.pixelRatio,[s,a,u,d]=t.getContext().getImageData(r.x*o,r.y*o,1,1).data;e($R({r:s,g:a,b:u,a:d}))},commitColorUnderCursor:()=>{e(LR())}}},noe=Pe([Sr,en,rr],(e,t,n)=>{const{tool:r}=t;return{tool:r,activeTabName:e,isStaging:n}},{memoizeOptions:{resultEqualityCheck:Wt}}),roe=e=>{const t=re(),{tool:n,isStaging:r}=B(noe),{commitColorUnderCursor:o}=rI();return p.useCallback(s=>{if(!e.current)return;if(e.current.container().focus(),n==="move"||r){t(Gf(!0));return}if(n==="colorPicker"){o();return}const a=By(e.current);a&&(s.evt.preventDefault(),t(V3(!0)),t(FR([a.x,a.y])))},[e,n,r,t,o])},ooe=Pe([Sr,en,rr],(e,t,n)=>{const{tool:r,isDrawing:o}=t;return{tool:r,isDrawing:o,activeTabName:e,isStaging:n}},{memoizeOptions:{resultEqualityCheck:Wt}}),soe=(e,t,n)=>{const r=re(),{isDrawing:o,tool:s,isStaging:a}=B(ooe),{updateColorUnderCursor:u}=rI();return p.useCallback(()=>{if(!e.current)return;const d=By(e.current);if(d){if(r(BR(d)),n.current=d,s==="colorPicker"){u();return}!o||s==="move"||a||(t.current=!0,r(U3([d.x,d.y])))}},[t,r,o,a,n,e,s,u])},aoe=()=>{const e=re();return p.useCallback(()=>{e(HR())},[e])},ioe=Pe([Sr,en,rr],(e,t,n)=>{const{tool:r,isDrawing:o}=t;return{tool:r,isDrawing:o,activeTabName:e,isStaging:n}},{memoizeOptions:{resultEqualityCheck:Wt}}),loe=(e,t)=>{const n=re(),{tool:r,isDrawing:o,isStaging:s}=B(ioe);return p.useCallback(()=>{if(r==="move"||s){n(Gf(!1));return}if(!t.current&&o&&e.current){const a=By(e.current);if(!a)return;n(U3([a.x,a.y]))}else t.current=!1;n(V3(!1))},[t,n,o,s,e,r])},coe=Pe([en],e=>{const{isMoveStageKeyHeld:t,stageScale:n}=e;return{isMoveStageKeyHeld:t,stageScale:n}},{memoizeOptions:{resultEqualityCheck:Wt}}),uoe=e=>{const t=re(),{isMoveStageKeyHeld:n,stageScale:r}=B(coe);return p.useCallback(o=>{if(!e.current||n)return;o.evt.preventDefault();const s=e.current.getPointerPosition();if(!s)return;const a={x:(s.x-e.current.x())/r,y:(s.y-e.current.y())/r};let u=o.evt.deltaY;o.evt.ctrlKey&&(u=-u);const d=Us(r*UR**u,VR,WR),f={x:s.x-a.x*d,y:s.y-a.y*d};t(GR(d)),t(H3(f))},[e,n,r,t])},doe=Pe(en,e=>{const{boundingBoxCoordinates:t,boundingBoxDimensions:n,stageDimensions:r,stageScale:o,shouldDarkenOutsideBoundingBox:s,stageCoordinates:a}=e;return{boundingBoxCoordinates:t,boundingBoxDimensions:n,shouldDarkenOutsideBoundingBox:s,stageCoordinates:a,stageDimensions:r,stageScale:o}},{memoizeOptions:{resultEqualityCheck:Wt}}),foe=()=>{const{boundingBoxCoordinates:e,boundingBoxDimensions:t,shouldDarkenOutsideBoundingBox:n,stageCoordinates:r,stageDimensions:o,stageScale:s}=B(doe);return i.jsxs(ba,{children:[i.jsx(qs,{offsetX:r.x/s,offsetY:r.y/s,height:o.height/s,width:o.width/s,fill:"rgba(0,0,0,0.4)",listening:!1,visible:n}),i.jsx(qs,{x:e.x,y:e.y,width:t.width,height:t.height,fill:"rgb(255,255,255)",listening:!1,visible:n,globalCompositeOperation:"destination-out"})]})},poe=Pe([en],e=>{const{stageScale:t,stageCoordinates:n,stageDimensions:r}=e;return{stageScale:t,stageCoordinates:n,stageDimensions:r}},{memoizeOptions:{resultEqualityCheck:Wt}}),hoe=()=>{const{stageScale:e,stageCoordinates:t,stageDimensions:n}=B(poe),{colorMode:r}=xo(),[o,s]=p.useState([]),[a,u]=Ji("colors",["base.800","base.200"]),d=p.useCallback(f=>f/e,[e]);return p.useLayoutEffect(()=>{const{width:f,height:h}=n,{x:m,y:v}=t,b={x1:0,y1:0,x2:f,y2:h,offset:{x:d(m),y:d(v)}},w={x:Math.ceil(d(m)/64)*64,y:Math.ceil(d(v)/64)*64},C={x1:-w.x,y1:-w.y,x2:d(f)-w.x+64,y2:d(h)-w.y+64},P={x1:Math.min(b.x1,C.x1),y1:Math.min(b.y1,C.y1),x2:Math.max(b.x2,C.x2),y2:Math.max(b.y2,C.y2)},k=P.x2-P.x1,j=P.y2-P.y1,E=Math.round(k/64)+1,I=Math.round(j/64)+1,O=u2(0,E).map(M=>i.jsx(nh,{x:P.x1+M*64,y:P.y1,points:[0,0,0,j],stroke:r==="dark"?a:u,strokeWidth:1},`x_${M}`)),R=u2(0,I).map(M=>i.jsx(nh,{x:P.x1,y:P.y1+M*64,points:[0,0,k,0],stroke:r==="dark"?a:u,strokeWidth:1},`y_${M}`));s(O.concat(R))},[e,t,n,d,r,a,u]),i.jsx(ba,{children:o})},moe=Pe([ao,en],(e,t)=>{const{progressImage:n,sessionId:r}=e,{sessionId:o,boundingBox:s}=t.layerState.stagingArea;return{boundingBox:s,progressImage:r===o?n:void 0}},{memoizeOptions:{resultEqualityCheck:Wt}}),goe=e=>{const{...t}=e,{progressImage:n,boundingBox:r}=B(moe),[o,s]=p.useState(null);return p.useEffect(()=>{if(!n)return;const a=new Image;a.onload=()=>{s(a)},a.src=n.dataURL},[n]),n&&r&&o?i.jsx(nI,{x:r.x,y:r.y,width:r.width,height:r.height,image:o,listening:!1,...t}):null},Bi=e=>{const{r:t,g:n,b:r,a:o}=e;return`rgba(${t}, ${n}, ${r}, ${o})`},voe=Pe(en,e=>{const{maskColor:t,stageCoordinates:n,stageDimensions:r,stageScale:o}=e;return{stageCoordinates:n,stageDimensions:r,stageScale:o,maskColorString:Bi(t)}}),q4=e=>`data:image/svg+xml;utf8, + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +`.replaceAll("black",e),yoe=e=>{const{...t}=e,{maskColorString:n,stageCoordinates:r,stageDimensions:o,stageScale:s}=B(voe),[a,u]=p.useState(null),[d,f]=p.useState(0),h=p.useRef(null),m=p.useCallback(()=>{f(d+1),setTimeout(m,500)},[d]);return p.useEffect(()=>{if(a)return;const v=new Image;v.onload=()=>{u(v)},v.src=q4(n)},[a,n]),p.useEffect(()=>{a&&(a.src=q4(n))},[a,n]),p.useEffect(()=>{const v=setInterval(()=>f(b=>(b+1)%5),50);return()=>clearInterval(v)},[]),!a||!vl(r.x)||!vl(r.y)||!vl(s)||!vl(o.width)||!vl(o.height)?null:i.jsx(qs,{ref:h,offsetX:r.x/s,offsetY:r.y/s,height:o.height/s,width:o.width/s,fillPatternImage:a,fillPatternOffsetY:vl(d)?d:0,fillPatternRepeat:"repeat",fillPatternScale:{x:1/s,y:1/s},listening:!0,globalCompositeOperation:"source-in",...t})},boe=Pe([en],e=>({objects:e.layerState.objects}),{memoizeOptions:{resultEqualityCheck:Wt}}),xoe=e=>{const{...t}=e,{objects:n}=B(boe);return i.jsx(ba,{listening:!1,...t,children:n.filter(qR).map((r,o)=>i.jsx(nh,{points:r.points,stroke:"rgb(0,0,0)",strokeWidth:r.strokeWidth*2,tension:0,lineCap:"round",lineJoin:"round",shadowForStrokeEnabled:!1,listening:!1,globalCompositeOperation:r.tool==="brush"?"source-over":"destination-out"},o))})};var Pi=p,Soe=function(t,n,r){const o=Pi.useRef("loading"),s=Pi.useRef(),[a,u]=Pi.useState(0),d=Pi.useRef(),f=Pi.useRef(),h=Pi.useRef();return(d.current!==t||f.current!==n||h.current!==r)&&(o.current="loading",s.current=void 0,d.current=t,f.current=n,h.current=r),Pi.useLayoutEffect(function(){if(!t)return;var m=document.createElement("img");function v(){o.current="loaded",s.current=m,u(Math.random())}function b(){o.current="failed",s.current=void 0,u(Math.random())}return m.addEventListener("load",v),m.addEventListener("error",b),n&&(m.crossOrigin=n),r&&(m.referrerPolicy=r),m.src=t,function(){m.removeEventListener("load",v),m.removeEventListener("error",b)}},[t,n,r]),[s.current,o.current]};const woe=dc(Soe),oI=e=>{const{width:t,height:n,x:r,y:o,imageName:s}=e.canvasImage,{currentData:a,isError:u}=Vs(s??ga.skipToken),[d]=woe((a==null?void 0:a.image_url)??"",KR.get()?"use-credentials":"anonymous");return u?i.jsx(qs,{x:r,y:o,width:t,height:n,fill:"red"}):i.jsx(nI,{x:r,y:o,image:d,listening:!1})},Coe=Pe([en],e=>{const{layerState:{objects:t}}=e;return{objects:t}},{memoizeOptions:{resultEqualityCheck:Wt}}),Poe=()=>{const{objects:e}=B(Coe);return e?i.jsx(ba,{name:"outpainting-objects",listening:!1,children:e.map((t,n)=>{if(YR(t))return i.jsx(oI,{canvasImage:t},n);if(XR(t)){const r=i.jsx(nh,{points:t.points,stroke:t.color?Bi(t.color):"rgb(0,0,0)",strokeWidth:t.strokeWidth*2,tension:0,lineCap:"round",lineJoin:"round",shadowForStrokeEnabled:!1,listening:!1,globalCompositeOperation:t.tool==="brush"?"source-over":"destination-out"},n);return t.clip?i.jsx(ba,{clipX:t.clip.x,clipY:t.clip.y,clipWidth:t.clip.width,clipHeight:t.clip.height,children:r},n):r}else{if(QR(t))return i.jsx(qs,{x:t.x,y:t.y,width:t.width,height:t.height,fill:Bi(t.color)},n);if(ZR(t))return i.jsx(qs,{x:t.x,y:t.y,width:t.width,height:t.height,fill:"rgb(255, 255, 255)",globalCompositeOperation:"destination-out"},n)}})}):null},koe=Pe([en],e=>{const{layerState:t,shouldShowStagingImage:n,shouldShowStagingOutline:r,boundingBoxCoordinates:{x:o,y:s},boundingBoxDimensions:{width:a,height:u}}=e,{selectedImageIndex:d,images:f}=t.stagingArea;return{currentStagingAreaImage:f.length>0&&d!==void 0?f[d]:void 0,isOnFirstImage:d===0,isOnLastImage:d===f.length-1,shouldShowStagingImage:n,shouldShowStagingOutline:r,x:o,y:s,width:a,height:u}},{memoizeOptions:{resultEqualityCheck:Wt}}),_oe=e=>{const{...t}=e,{currentStagingAreaImage:n,shouldShowStagingImage:r,shouldShowStagingOutline:o,x:s,y:a,width:u,height:d}=B(koe);return i.jsxs(ba,{...t,children:[r&&n&&i.jsx(oI,{canvasImage:n}),o&&i.jsxs(ba,{children:[i.jsx(qs,{x:s,y:a,width:u,height:d,strokeWidth:1,stroke:"white",strokeScaleEnabled:!1}),i.jsx(qs,{x:s,y:a,width:u,height:d,dash:[4,4],strokeWidth:1,stroke:"black",strokeScaleEnabled:!1})]})]})},joe=Pe([en],e=>{const{layerState:{stagingArea:{images:t,selectedImageIndex:n,sessionId:r}},shouldShowStagingOutline:o,shouldShowStagingImage:s}=e;return{currentStagingAreaImage:t.length>0?t[n]:void 0,isOnFirstImage:n===0,isOnLastImage:n===t.length-1,shouldShowStagingImage:s,shouldShowStagingOutline:o,sessionId:r}},{memoizeOptions:{resultEqualityCheck:Wt}}),Eoe=()=>{const e=re(),{isOnFirstImage:t,isOnLastImage:n,currentStagingAreaImage:r,shouldShowStagingImage:o,sessionId:s}=B(joe),{t:a}=me(),u=p.useCallback(()=>{e(e2(!0))},[e]),d=p.useCallback(()=>{e(e2(!1))},[e]);Ge(["left"],()=>{f()},{enabled:()=>!0,preventDefault:!0}),Ge(["right"],()=>{h()},{enabled:()=>!0,preventDefault:!0}),Ge(["enter"],()=>{m()},{enabled:()=>!0,preventDefault:!0});const f=p.useCallback(()=>e(JR()),[e]),h=p.useCallback(()=>e(e7()),[e]),m=p.useCallback(()=>e(t7(s)),[e,s]);return r?i.jsx(H,{pos:"absolute",bottom:4,w:"100%",align:"center",justify:"center",filter:"drop-shadow(0 0.5rem 1rem rgba(0,0,0))",onMouseOver:u,onMouseOut:d,children:i.jsxs(gr,{isAttached:!0,children:[i.jsx(Ie,{tooltip:`${a("unifiedCanvas.previous")} (Left)`,"aria-label":`${a("unifiedCanvas.previous")} (Left)`,icon:i.jsx(Sz,{}),onClick:f,colorScheme:"accent",isDisabled:t}),i.jsx(Ie,{tooltip:`${a("unifiedCanvas.next")} (Right)`,"aria-label":`${a("unifiedCanvas.next")} (Right)`,icon:i.jsx(wz,{}),onClick:h,colorScheme:"accent",isDisabled:n}),i.jsx(Ie,{tooltip:`${a("unifiedCanvas.accept")} (Enter)`,"aria-label":`${a("unifiedCanvas.accept")} (Enter)`,icon:i.jsx(kz,{}),onClick:m,colorScheme:"accent"}),i.jsx(Ie,{tooltip:a("unifiedCanvas.showHide"),"aria-label":a("unifiedCanvas.showHide"),"data-alert":!o,icon:o?i.jsx(Rz,{}):i.jsx(Oz,{}),onClick:()=>e(n7(!o)),colorScheme:"accent"}),i.jsx(Ie,{tooltip:a("unifiedCanvas.saveToGallery"),"aria-label":a("unifiedCanvas.saveToGallery"),icon:i.jsx(E1,{}),onClick:()=>e(r7({imageName:r.imageName})),colorScheme:"accent"}),i.jsx(Ie,{tooltip:a("unifiedCanvas.discardAll"),"aria-label":a("unifiedCanvas.discardAll"),icon:i.jsx(_h,{style:{transform:"rotate(45deg)"}}),onClick:()=>e(o7()),colorScheme:"error",fontSize:20})]})}):null},Dl=e=>Math.round(e*100)/100,Ioe=Pe([en],e=>{const{cursorPosition:t}=e,{cursorX:n,cursorY:r}=t?{cursorX:t.x,cursorY:t.y}:{cursorX:-1,cursorY:-1};return{cursorCoordinatesString:`(${Dl(n)}, ${Dl(r)})`}},{memoizeOptions:{resultEqualityCheck:Wt}});function Ooe(){const{cursorCoordinatesString:e}=B(Ioe),{t}=me();return i.jsx(qe,{children:`${t("unifiedCanvas.cursorPosition")}: ${e}`})}const O0="var(--invokeai-colors-warning-500)",Roe=Pe([en],e=>{const{stageDimensions:{width:t,height:n},stageCoordinates:{x:r,y:o},boundingBoxDimensions:{width:s,height:a},scaledBoundingBoxDimensions:{width:u,height:d},boundingBoxCoordinates:{x:f,y:h},stageScale:m,shouldShowCanvasDebugInfo:v,layer:b,boundingBoxScaleMethod:w,shouldPreserveMaskedArea:C}=e;let S="inherit";return(w==="none"&&(s<512||a<512)||w==="manual"&&u*d<512*512)&&(S=O0),{activeLayerColor:b==="mask"?O0:"inherit",activeLayerString:b.charAt(0).toUpperCase()+b.slice(1),boundingBoxColor:S,boundingBoxCoordinatesString:`(${Dl(f)}, ${Dl(h)})`,boundingBoxDimensionsString:`${s}×${a}`,scaledBoundingBoxDimensionsString:`${u}×${d}`,canvasCoordinatesString:`${Dl(r)}×${Dl(o)}`,canvasDimensionsString:`${t}×${n}`,canvasScaleString:Math.round(m*100),shouldShowCanvasDebugInfo:v,shouldShowBoundingBox:w!=="auto",shouldShowScaledBoundingBox:w!=="none",shouldPreserveMaskedArea:C}},{memoizeOptions:{resultEqualityCheck:Wt}}),Moe=()=>{const{activeLayerColor:e,activeLayerString:t,boundingBoxColor:n,boundingBoxCoordinatesString:r,boundingBoxDimensionsString:o,scaledBoundingBoxDimensionsString:s,shouldShowScaledBoundingBox:a,canvasCoordinatesString:u,canvasDimensionsString:d,canvasScaleString:f,shouldShowCanvasDebugInfo:h,shouldShowBoundingBox:m,shouldPreserveMaskedArea:v}=B(Roe),{t:b}=me();return i.jsxs(H,{sx:{flexDirection:"column",position:"absolute",top:0,insetInlineStart:0,opacity:.65,display:"flex",fontSize:"sm",padding:1,px:2,minWidth:48,margin:1,borderRadius:"base",pointerEvents:"none",bg:"base.200",_dark:{bg:"base.800"}},children:[i.jsx(qe,{style:{color:e},children:`${b("unifiedCanvas.activeLayer")}: ${t}`}),i.jsx(qe,{children:`${b("unifiedCanvas.canvasScale")}: ${f}%`}),v&&i.jsx(qe,{style:{color:O0},children:"Preserve Masked Area: On"}),m&&i.jsx(qe,{style:{color:n},children:`${b("unifiedCanvas.boundingBox")}: ${o}`}),a&&i.jsx(qe,{style:{color:n},children:`${b("unifiedCanvas.scaledBoundingBox")}: ${s}`}),h&&i.jsxs(i.Fragment,{children:[i.jsx(qe,{children:`${b("unifiedCanvas.boundingBoxPosition")}: ${r}`}),i.jsx(qe,{children:`${b("unifiedCanvas.canvasDimensions")}: ${d}`}),i.jsx(qe,{children:`${b("unifiedCanvas.canvasPosition")}: ${u}`}),i.jsx(Ooe,{})]})]})},Toe=Pe(en,e=>{const{boundingBoxCoordinates:t,boundingBoxDimensions:n,stageScale:r,isDrawing:o,isTransformingBoundingBox:s,isMovingBoundingBox:a,tool:u,shouldSnapToGrid:d}=e;return{boundingBoxCoordinates:t,boundingBoxDimensions:n,isDrawing:o,isMovingBoundingBox:a,isTransformingBoundingBox:s,stageScale:r,shouldSnapToGrid:d,tool:u,hitStrokeWidth:20/r}},{memoizeOptions:{resultEqualityCheck:Wt}}),Doe=e=>{const{...t}=e,n=re(),{boundingBoxCoordinates:r,boundingBoxDimensions:o,isDrawing:s,isMovingBoundingBox:a,isTransformingBoundingBox:u,stageScale:d,shouldSnapToGrid:f,tool:h,hitStrokeWidth:m}=B(Toe),v=p.useRef(null),b=p.useRef(null),[w,C]=p.useState(!1);p.useEffect(()=>{var V;!v.current||!b.current||(v.current.nodes([b.current]),(V=v.current.getLayer())==null||V.batchDraw())},[]);const S=64*d,P=p.useCallback(V=>{if(!f){n(ug({x:Math.floor(V.target.x()),y:Math.floor(V.target.y())}));return}const $=V.target.x(),F=V.target.y(),U=Yl($,64),X=Yl(F,64);V.target.x(U),V.target.y(X),n(ug({x:U,y:X}))},[n,f]),k=p.useCallback(()=>{if(!b.current)return;const V=b.current,$=V.scaleX(),F=V.scaleY(),U=Math.round(V.width()*$),X=Math.round(V.height()*F),N=Math.round(V.x()),G=Math.round(V.y());n(gu({width:U,height:X})),n(ug({x:f?Ld(N,64):N,y:f?Ld(G,64):G})),V.scaleX(1),V.scaleY(1)},[n,f]),j=p.useCallback((V,$,F)=>{const U=V.x%S,X=V.y%S;return{x:Ld($.x,S)+U,y:Ld($.y,S)+X}},[S]),E=()=>{n(dg(!0))},I=()=>{n(dg(!1)),n(fg(!1)),n(Fd(!1)),C(!1)},O=()=>{n(fg(!0))},R=()=>{n(dg(!1)),n(fg(!1)),n(Fd(!1)),C(!1)},M=()=>{C(!0)},A=()=>{!u&&!a&&C(!1)},L=()=>{n(Fd(!0))},D=()=>{n(Fd(!1))};return i.jsxs(ba,{...t,children:[i.jsx(qs,{height:o.height,width:o.width,x:r.x,y:r.y,onMouseEnter:L,onMouseOver:L,onMouseLeave:D,onMouseOut:D}),i.jsx(qs,{draggable:!0,fillEnabled:!1,height:o.height,hitStrokeWidth:m,listening:!s&&h==="move",onDragStart:O,onDragEnd:R,onDragMove:P,onMouseDown:O,onMouseOut:A,onMouseOver:M,onMouseEnter:M,onMouseUp:R,onTransform:k,onTransformEnd:I,ref:b,stroke:w?"rgba(255,255,255,0.7)":"white",strokeWidth:(w?8:1)/d,width:o.width,x:r.x,y:r.y}),i.jsx(Xre,{anchorCornerRadius:3,anchorDragBoundFunc:j,anchorFill:"rgba(212,216,234,1)",anchorSize:15,anchorStroke:"rgb(42,42,42)",borderDash:[4,4],borderEnabled:!0,borderStroke:"black",draggable:!1,enabledAnchors:h==="move"?void 0:[],flipEnabled:!1,ignoreStroke:!0,keepRatio:!1,listening:!s&&h==="move",onDragStart:O,onDragEnd:R,onMouseDown:E,onMouseUp:I,onTransformEnd:I,ref:v,rotateEnabled:!1})]})},Aoe=Pe(en,e=>{const{cursorPosition:t,brushSize:n,colorPickerColor:r,maskColor:o,brushColor:s,tool:a,layer:u,shouldShowBrush:d,isMovingBoundingBox:f,isTransformingBoundingBox:h,stageScale:m,stageDimensions:v,boundingBoxCoordinates:b,boundingBoxDimensions:w,shouldRestrictStrokesToBox:C}=e,S=C?{clipX:b.x,clipY:b.y,clipWidth:w.width,clipHeight:w.height}:{};return{cursorPosition:t,brushX:t?t.x:v.width/2,brushY:t?t.y:v.height/2,radius:n/2,colorPickerOuterRadius:t2/m,colorPickerInnerRadius:(t2-xv+1)/m,maskColorString:Bi({...o,a:.5}),brushColorString:Bi(s),colorPickerColorString:Bi(r),tool:a,layer:u,shouldShowBrush:d,shouldDrawBrushPreview:!(f||h||!t)&&d,strokeWidth:1.5/m,dotRadius:1.5/m,clip:S}},{memoizeOptions:{resultEqualityCheck:Wt}}),Noe=e=>{const{...t}=e,{brushX:n,brushY:r,radius:o,maskColorString:s,tool:a,layer:u,shouldDrawBrushPreview:d,dotRadius:f,strokeWidth:h,brushColorString:m,colorPickerColorString:v,colorPickerInnerRadius:b,colorPickerOuterRadius:w,clip:C}=B(Aoe);return d?i.jsxs(ba,{listening:!1,...C,...t,children:[a==="colorPicker"?i.jsxs(i.Fragment,{children:[i.jsx(Ci,{x:n,y:r,radius:w,stroke:m,strokeWidth:xv,strokeScaleEnabled:!1}),i.jsx(Ci,{x:n,y:r,radius:b,stroke:v,strokeWidth:xv,strokeScaleEnabled:!1})]}):i.jsxs(i.Fragment,{children:[i.jsx(Ci,{x:n,y:r,radius:o,fill:u==="mask"?s:m,globalCompositeOperation:a==="eraser"?"destination-out":"source-out"}),i.jsx(Ci,{x:n,y:r,radius:o,stroke:"rgba(255,255,255,0.4)",strokeWidth:h*2,strokeEnabled:!0,listening:!1}),i.jsx(Ci,{x:n,y:r,radius:o,stroke:"rgba(0,0,0,1)",strokeWidth:h,strokeEnabled:!0,listening:!1})]}),i.jsx(Ci,{x:n,y:r,radius:f*2,fill:"rgba(255,255,255,0.4)",listening:!1}),i.jsx(Ci,{x:n,y:r,radius:f,fill:"rgba(0,0,0,1)",listening:!1})]}):null},zoe=Pe([en,rr],(e,t)=>{const{isMaskEnabled:n,stageScale:r,shouldShowBoundingBox:o,isTransformingBoundingBox:s,isMouseOverBoundingBox:a,isMovingBoundingBox:u,stageDimensions:d,stageCoordinates:f,tool:h,isMovingStage:m,shouldShowIntermediates:v,shouldShowGrid:b,shouldRestrictStrokesToBox:w,shouldAntialias:C}=e;let S="none";return h==="move"||t?m?S="grabbing":S="grab":s?S=void 0:w&&!a&&(S="default"),{isMaskEnabled:n,isModifyingBoundingBox:s||u,shouldShowBoundingBox:o,shouldShowGrid:b,stageCoordinates:f,stageCursor:S,stageDimensions:d,stageScale:r,tool:h,isStaging:t,shouldShowIntermediates:v,shouldAntialias:C}},Et),$oe=Be(Qre,{shouldForwardProp:e=>!["sx"].includes(e)}),K4=()=>{const{isMaskEnabled:e,isModifyingBoundingBox:t,shouldShowBoundingBox:n,shouldShowGrid:r,stageCoordinates:o,stageCursor:s,stageDimensions:a,stageScale:u,tool:d,isStaging:f,shouldShowIntermediates:h,shouldAntialias:m}=B(zoe);toe();const v=p.useRef(null),b=p.useRef(null),w=p.useCallback(L=>{a7(L),v.current=L},[]),C=p.useCallback(L=>{s7(L),b.current=L},[]),S=p.useRef({x:0,y:0}),P=p.useRef(!1),k=uoe(v),j=roe(v),E=loe(v,P),I=soe(v,P,S),O=aoe(),{handleDragStart:R,handleDragMove:M,handleDragEnd:A}=Jre();return i.jsx(H,{sx:{position:"relative",height:"100%",width:"100%",borderRadius:"base"},children:i.jsxs(qe,{sx:{position:"relative"},children:[i.jsxs($oe,{tabIndex:-1,ref:w,sx:{outline:"none",overflow:"hidden",cursor:s||void 0,canvas:{outline:"none"}},x:o.x,y:o.y,width:a.width,height:a.height,scale:{x:u,y:u},onTouchStart:j,onTouchMove:I,onTouchEnd:E,onMouseDown:j,onMouseLeave:O,onMouseMove:I,onMouseUp:E,onDragStart:R,onDragMove:M,onDragEnd:A,onContextMenu:L=>L.evt.preventDefault(),onWheel:k,draggable:(d==="move"||f)&&!t,children:[i.jsx(Qc,{id:"grid",visible:r,children:i.jsx(hoe,{})}),i.jsx(Qc,{id:"base",ref:C,listening:!1,imageSmoothingEnabled:m,children:i.jsx(Poe,{})}),i.jsxs(Qc,{id:"mask",visible:e,listening:!1,children:[i.jsx(xoe,{visible:!0,listening:!1}),i.jsx(yoe,{listening:!1})]}),i.jsx(Qc,{children:i.jsx(foe,{})}),i.jsxs(Qc,{id:"preview",imageSmoothingEnabled:m,children:[!f&&i.jsx(Noe,{visible:d!=="move",listening:!1}),i.jsx(_oe,{visible:f}),h&&i.jsx(goe,{}),i.jsx(Doe,{visible:n&&!f})]})]}),i.jsx(Moe,{}),i.jsx(Eoe,{})]})})},Loe=Pe(en,i7,Sr,(e,t,n)=>{const{doesCanvasNeedScaling:r,isCanvasInitialized:o}=e;return{doesCanvasNeedScaling:r,activeTabName:n,initialCanvasImage:t,isCanvasInitialized:o}}),Y4=()=>{const e=re(),{doesCanvasNeedScaling:t,activeTabName:n,initialCanvasImage:r,isCanvasInitialized:o}=B(Loe),s=p.useRef(null);return p.useLayoutEffect(()=>{window.setTimeout(()=>{if(!s.current)return;const{clientWidth:a,clientHeight:u}=s.current;e(l7({width:a,height:u})),e(o?c7():uh()),e(d3(!1))},0)},[e,r,t,n,o]),i.jsx(H,{ref:s,sx:{flexDirection:"column",alignItems:"center",justifyContent:"center",gap:4,width:"100%",height:"100%"},children:i.jsx(ai,{thickness:"2px",size:"xl"})})};function sI(e,t,n=250){const[r,o]=p.useState(0);return p.useEffect(()=>{const s=setTimeout(()=>{r===1&&e(),o(0)},n);return r===2&&t(),()=>clearTimeout(s)},[r,e,t,n]),()=>o(s=>s+1)}const Foe=Be(VE,{baseStyle:{paddingInline:4},shouldForwardProp:e=>!["pickerColor"].includes(e)}),dv={width:6,height:6,borderColor:"base.100"},Boe=e=>{const{styleClass:t="",...n}=e;return i.jsx(Foe,{sx:{".react-colorful__hue-pointer":dv,".react-colorful__saturation-pointer":dv,".react-colorful__alpha-pointer":dv},className:t,...n})},rh=p.memo(Boe),Hoe=Pe([en,rr],(e,t)=>{const{maskColor:n,layer:r,isMaskEnabled:o,shouldPreserveMaskedArea:s}=e;return{layer:r,maskColor:n,maskColorString:Bi(n),isMaskEnabled:o,shouldPreserveMaskedArea:s,isStaging:t}},{memoizeOptions:{resultEqualityCheck:Wt}}),Woe=()=>{const e=re(),{t}=me(),{layer:n,maskColor:r,isMaskEnabled:o,shouldPreserveMaskedArea:s,isStaging:a}=B(Hoe);Ge(["q"],()=>{u()},{enabled:()=>!a,preventDefault:!0},[n]),Ge(["shift+c"],()=>{d()},{enabled:()=>!a,preventDefault:!0},[]),Ge(["h"],()=>{f()},{enabled:()=>!a,preventDefault:!0},[o]);const u=()=>{e(Kf(n==="mask"?"base":"mask"))},d=()=>e(W0()),f=()=>e(Lu(!o));return i.jsx(la,{triggerComponent:i.jsx(gr,{children:i.jsx(Ie,{"aria-label":t("unifiedCanvas.maskingOptions"),tooltip:t("unifiedCanvas.maskingOptions"),icon:i.jsx(Lz,{}),isChecked:n==="mask",isDisabled:a})}),children:i.jsxs(H,{direction:"column",gap:2,children:[i.jsx(In,{label:`${t("unifiedCanvas.enableMask")} (H)`,isChecked:o,onChange:f}),i.jsx(In,{label:t("unifiedCanvas.preserveMaskedArea"),isChecked:s,onChange:h=>e(G3(h.target.checked))}),i.jsx(rh,{sx:{paddingTop:2,paddingBottom:2},pickerColor:r,onChange:h=>e(q3(h))}),i.jsxs(Yt,{size:"sm",leftIcon:i.jsx(vo,{}),onClick:d,children:[t("unifiedCanvas.clearMask")," (Shift+C)"]})]})})},Voe=Pe([en,Sr,ao],(e,t,n)=>{const{futureLayerStates:r}=e;return{canRedo:r.length>0&&!n.isProcessing,activeTabName:t}},{memoizeOptions:{resultEqualityCheck:Wt}});function aI(){const e=re(),{canRedo:t,activeTabName:n}=B(Voe),{t:r}=me(),o=()=>{e(u7())};return Ge(["meta+shift+z","ctrl+shift+z","control+y","meta+y"],()=>{o()},{enabled:()=>t,preventDefault:!0},[n,t]),i.jsx(Ie,{"aria-label":`${r("unifiedCanvas.redo")} (Ctrl+Shift+Z)`,tooltip:`${r("unifiedCanvas.redo")} (Ctrl+Shift+Z)`,icon:i.jsx(Vz,{}),onClick:o,isDisabled:!t})}const iI=()=>{const e=B(rr),t=re(),{t:n}=me();return i.jsxs(Ny,{title:n("unifiedCanvas.clearCanvasHistory"),acceptCallback:()=>t(d7()),acceptButtonText:n("unifiedCanvas.clearHistory"),triggerComponent:i.jsx(Yt,{size:"sm",leftIcon:i.jsx(vo,{}),isDisabled:e,children:n("unifiedCanvas.clearCanvasHistory")}),children:[i.jsx("p",{children:n("unifiedCanvas.clearCanvasHistoryMessage")}),i.jsx("br",{}),i.jsx("p",{children:n("unifiedCanvas.clearCanvasHistoryConfirm")})]})},Uoe=Pe([en],e=>{const{shouldAutoSave:t,shouldCropToBoundingBoxOnSave:n,shouldDarkenOutsideBoundingBox:r,shouldShowCanvasDebugInfo:o,shouldShowGrid:s,shouldShowIntermediates:a,shouldSnapToGrid:u,shouldRestrictStrokesToBox:d,shouldAntialias:f}=e;return{shouldAutoSave:t,shouldCropToBoundingBoxOnSave:n,shouldDarkenOutsideBoundingBox:r,shouldShowCanvasDebugInfo:o,shouldShowGrid:s,shouldShowIntermediates:a,shouldSnapToGrid:u,shouldRestrictStrokesToBox:d,shouldAntialias:f}},{memoizeOptions:{resultEqualityCheck:Wt}}),Goe=()=>{const e=re(),{t}=me(),{shouldAutoSave:n,shouldCropToBoundingBoxOnSave:r,shouldDarkenOutsideBoundingBox:o,shouldShowCanvasDebugInfo:s,shouldShowGrid:a,shouldShowIntermediates:u,shouldSnapToGrid:d,shouldRestrictStrokesToBox:f,shouldAntialias:h}=B(Uoe);Ge(["n"],()=>{e(qf(!d))},{enabled:!0,preventDefault:!0},[d]);const m=v=>e(qf(v.target.checked));return i.jsx(la,{isLazy:!1,triggerComponent:i.jsx(Ie,{tooltip:t("unifiedCanvas.canvasSettings"),"aria-label":t("unifiedCanvas.canvasSettings"),icon:i.jsx(R1,{})}),children:i.jsxs(H,{direction:"column",gap:2,children:[i.jsx(In,{label:t("unifiedCanvas.showIntermediates"),isChecked:u,onChange:v=>e(K3(v.target.checked))}),i.jsx(In,{label:t("unifiedCanvas.showGrid"),isChecked:a,onChange:v=>e(Y3(v.target.checked))}),i.jsx(In,{label:t("unifiedCanvas.snapToGrid"),isChecked:d,onChange:m}),i.jsx(In,{label:t("unifiedCanvas.darkenOutsideSelection"),isChecked:o,onChange:v=>e(X3(v.target.checked))}),i.jsx(In,{label:t("unifiedCanvas.autoSaveToGallery"),isChecked:n,onChange:v=>e(Q3(v.target.checked))}),i.jsx(In,{label:t("unifiedCanvas.saveBoxRegionOnly"),isChecked:r,onChange:v=>e(Z3(v.target.checked))}),i.jsx(In,{label:t("unifiedCanvas.limitStrokesToBox"),isChecked:f,onChange:v=>e(J3(v.target.checked))}),i.jsx(In,{label:t("unifiedCanvas.showCanvasDebugInfo"),isChecked:s,onChange:v=>e(e5(v.target.checked))}),i.jsx(In,{label:t("unifiedCanvas.antialiasing"),isChecked:h,onChange:v=>e(t5(v.target.checked))}),i.jsx(iI,{})]})})},qoe=Pe([en,rr,ao],(e,t,n)=>{const{isProcessing:r}=n,{tool:o,brushColor:s,brushSize:a}=e;return{tool:o,isStaging:t,isProcessing:r,brushColor:s,brushSize:a}},{memoizeOptions:{resultEqualityCheck:Wt}}),Koe=()=>{const e=re(),{tool:t,brushColor:n,brushSize:r,isStaging:o}=B(qoe),{t:s}=me();Ge(["b"],()=>{a()},{enabled:()=>!o,preventDefault:!0},[]),Ge(["e"],()=>{u()},{enabled:()=>!o,preventDefault:!0},[t]),Ge(["c"],()=>{d()},{enabled:()=>!o,preventDefault:!0},[t]),Ge(["shift+f"],()=>{f()},{enabled:()=>!o,preventDefault:!0}),Ge(["delete","backspace"],()=>{h()},{enabled:()=>!o,preventDefault:!0}),Ge(["BracketLeft"],()=>{e(Nl(Math.max(r-5,5)))},{enabled:()=>!o,preventDefault:!0},[r]),Ge(["BracketRight"],()=>{e(Nl(Math.min(r+5,500)))},{enabled:()=>!o,preventDefault:!0},[r]),Ge(["shift+BracketLeft"],()=>{e(zl({...n,a:Us(n.a-.05,.05,1)}))},{enabled:()=>!o,preventDefault:!0},[n]),Ge(["shift+BracketRight"],()=>{e(zl({...n,a:Us(n.a+.05,.05,1)}))},{enabled:()=>!o,preventDefault:!0},[n]);const a=()=>e(Ws("brush")),u=()=>e(Ws("eraser")),d=()=>e(Ws("colorPicker")),f=()=>e(n5()),h=()=>e(r5());return i.jsxs(gr,{isAttached:!0,children:[i.jsx(Ie,{"aria-label":`${s("unifiedCanvas.brush")} (B)`,tooltip:`${s("unifiedCanvas.brush")} (B)`,icon:i.jsx(PP,{}),isChecked:t==="brush"&&!o,onClick:a,isDisabled:o}),i.jsx(Ie,{"aria-label":`${s("unifiedCanvas.eraser")} (E)`,tooltip:`${s("unifiedCanvas.eraser")} (E)`,icon:i.jsx(xP,{}),isChecked:t==="eraser"&&!o,isDisabled:o,onClick:u}),i.jsx(Ie,{"aria-label":`${s("unifiedCanvas.fillBoundingBox")} (Shift+F)`,tooltip:`${s("unifiedCanvas.fillBoundingBox")} (Shift+F)`,icon:i.jsx(wP,{}),isDisabled:o,onClick:f}),i.jsx(Ie,{"aria-label":`${s("unifiedCanvas.eraseBoundingBox")} (Del/Backspace)`,tooltip:`${s("unifiedCanvas.eraseBoundingBox")} (Del/Backspace)`,icon:i.jsx(_h,{style:{transform:"rotate(45deg)"}}),isDisabled:o,onClick:h}),i.jsx(Ie,{"aria-label":`${s("unifiedCanvas.colorPicker")} (C)`,tooltip:`${s("unifiedCanvas.colorPicker")} (C)`,icon:i.jsx(SP,{}),isChecked:t==="colorPicker"&&!o,isDisabled:o,onClick:d}),i.jsx(la,{triggerComponent:i.jsx(Ie,{"aria-label":s("unifiedCanvas.brushOptions"),tooltip:s("unifiedCanvas.brushOptions"),icon:i.jsx(I1,{})}),children:i.jsxs(H,{minWidth:60,direction:"column",gap:4,width:"100%",children:[i.jsx(H,{gap:4,justifyContent:"space-between",children:i.jsx(vt,{label:s("unifiedCanvas.brushSize"),value:r,withInput:!0,onChange:m=>e(Nl(m)),sliderNumberInputProps:{max:500}})}),i.jsx(rh,{sx:{width:"100%",paddingTop:2,paddingBottom:2},pickerColor:n,onChange:m=>e(zl(m))})]})})]})},Yoe=Pe([en,Sr,ao],(e,t,n)=>{const{pastLayerStates:r}=e;return{canUndo:r.length>0&&!n.isProcessing,activeTabName:t}},{memoizeOptions:{resultEqualityCheck:Wt}});function lI(){const e=re(),{t}=me(),{canUndo:n,activeTabName:r}=B(Yoe),o=()=>{e(f7())};return Ge(["meta+z","ctrl+z"],()=>{o()},{enabled:()=>n,preventDefault:!0},[r,n]),i.jsx(Ie,{"aria-label":`${t("unifiedCanvas.undo")} (Ctrl+Z)`,tooltip:`${t("unifiedCanvas.undo")} (Ctrl+Z)`,icon:i.jsx(O1,{}),onClick:o,isDisabled:!n})}const Xoe=Pe([ao,en,rr],(e,t,n)=>{const{isProcessing:r}=e,{tool:o,shouldCropToBoundingBoxOnSave:s,layer:a,isMaskEnabled:u}=t;return{isProcessing:r,isStaging:n,isMaskEnabled:u,tool:o,layer:a,shouldCropToBoundingBoxOnSave:s}},{memoizeOptions:{resultEqualityCheck:Wt}}),Qoe=()=>{const e=re(),{isProcessing:t,isStaging:n,isMaskEnabled:r,layer:o,tool:s}=B(Xoe),a=ha(),{t:u}=me(),{openUploader:d}=kh();Ge(["v"],()=>{f()},{enabled:()=>!n,preventDefault:!0},[]),Ge(["r"],()=>{m()},{enabled:()=>!0,preventDefault:!0},[a]),Ge(["shift+m"],()=>{b()},{enabled:()=>!n,preventDefault:!0},[a,t]),Ge(["shift+s"],()=>{w()},{enabled:()=>!n,preventDefault:!0},[a,t]),Ge(["meta+c","ctrl+c"],()=>{C()},{enabled:()=>!n,preventDefault:!0},[a,t]),Ge(["shift+d"],()=>{S()},{enabled:()=>!n,preventDefault:!0},[a,t]);const f=()=>e(Ws("move")),h=sI(()=>m(!1),()=>m(!0)),m=(k=!1)=>{const j=ha();if(!j)return;const E=j.getClientRect({skipTransform:!0});e(o5({contentRect:E,shouldScaleTo1:k}))},v=()=>{e(u5()),e(uh())},b=()=>{e(s5())},w=()=>{e(a5())},C=()=>{e(i5())},S=()=>{e(l5())},P=k=>{const j=k;e(Kf(j)),j==="mask"&&!r&&e(Lu(!0))};return i.jsxs(H,{sx:{alignItems:"center",gap:2,flexWrap:"wrap"},children:[i.jsx(qe,{w:24,children:i.jsx(qn,{tooltip:`${u("unifiedCanvas.layer")} (Q)`,value:o,data:c5,onChange:P,disabled:n})}),i.jsx(Woe,{}),i.jsx(Koe,{}),i.jsxs(gr,{isAttached:!0,children:[i.jsx(Ie,{"aria-label":`${u("unifiedCanvas.move")} (V)`,tooltip:`${u("unifiedCanvas.move")} (V)`,icon:i.jsx(yP,{}),isChecked:s==="move"||n,onClick:f}),i.jsx(Ie,{"aria-label":`${u("unifiedCanvas.resetView")} (R)`,tooltip:`${u("unifiedCanvas.resetView")} (R)`,icon:i.jsx(bP,{}),onClick:h})]}),i.jsxs(gr,{isAttached:!0,children:[i.jsx(Ie,{"aria-label":`${u("unifiedCanvas.mergeVisible")} (Shift+M)`,tooltip:`${u("unifiedCanvas.mergeVisible")} (Shift+M)`,icon:i.jsx(CP,{}),onClick:b,isDisabled:n}),i.jsx(Ie,{"aria-label":`${u("unifiedCanvas.saveToGallery")} (Shift+S)`,tooltip:`${u("unifiedCanvas.saveToGallery")} (Shift+S)`,icon:i.jsx(E1,{}),onClick:w,isDisabled:n}),i.jsx(Ie,{"aria-label":`${u("unifiedCanvas.copyToClipboard")} (Cmd/Ctrl+C)`,tooltip:`${u("unifiedCanvas.copyToClipboard")} (Cmd/Ctrl+C)`,icon:i.jsx(yc,{}),onClick:C,isDisabled:n}),i.jsx(Ie,{"aria-label":`${u("unifiedCanvas.downloadAsImage")} (Shift+D)`,tooltip:`${u("unifiedCanvas.downloadAsImage")} (Shift+D)`,icon:i.jsx(_1,{}),onClick:S,isDisabled:n})]}),i.jsxs(gr,{isAttached:!0,children:[i.jsx(lI,{}),i.jsx(aI,{})]}),i.jsxs(gr,{isAttached:!0,children:[i.jsx(Ie,{"aria-label":`${u("common.upload")}`,tooltip:`${u("common.upload")}`,icon:i.jsx(jh,{}),onClick:d,isDisabled:n}),i.jsx(Ie,{"aria-label":`${u("unifiedCanvas.clearCanvas")}`,tooltip:`${u("unifiedCanvas.clearCanvas")}`,icon:i.jsx(vo,{}),onClick:v,colorScheme:"error",isDisabled:n})]}),i.jsx(gr,{isAttached:!0,children:i.jsx(Goe,{})})]})},Zoe=Pe([en],e=>{const{shouldAutoSave:t,shouldCropToBoundingBoxOnSave:n,shouldShowCanvasDebugInfo:r,shouldShowIntermediates:o,shouldAntialias:s}=e;return{shouldAutoSave:t,shouldCropToBoundingBoxOnSave:n,shouldShowCanvasDebugInfo:r,shouldShowIntermediates:o,shouldAntialias:s}},{memoizeOptions:{resultEqualityCheck:Wt}}),Joe=()=>{const e=re(),{t}=me(),{shouldAutoSave:n,shouldCropToBoundingBoxOnSave:r,shouldShowCanvasDebugInfo:o,shouldShowIntermediates:s,shouldAntialias:a}=B(Zoe);return i.jsx(la,{isLazy:!1,triggerComponent:i.jsx(Ie,{tooltip:t("unifiedCanvas.canvasSettings"),tooltipProps:{placement:"bottom"},"aria-label":t("unifiedCanvas.canvasSettings"),icon:i.jsx(R1,{})}),children:i.jsxs(H,{direction:"column",gap:2,children:[i.jsx(In,{label:t("unifiedCanvas.showIntermediates"),isChecked:s,onChange:u=>e(K3(u.target.checked))}),i.jsx(In,{label:t("unifiedCanvas.autoSaveToGallery"),isChecked:n,onChange:u=>e(Q3(u.target.checked))}),i.jsx(In,{label:t("unifiedCanvas.saveBoxRegionOnly"),isChecked:r,onChange:u=>e(Z3(u.target.checked))}),i.jsx(In,{label:t("unifiedCanvas.showCanvasDebugInfo"),isChecked:o,onChange:u=>e(e5(u.target.checked))}),i.jsx(In,{label:t("unifiedCanvas.antialiasing"),isChecked:a,onChange:u=>e(t5(u.target.checked))}),i.jsx(iI,{})]})})};function ese(){const e=B(rr),t=ha(),n=B(a=>a.system.isProcessing),r=re(),{t:o}=me();Ge(["meta+c","ctrl+c"],()=>{s()},{enabled:()=>!e,preventDefault:!0},[t,n]);const s=()=>{r(i5())};return i.jsx(Ie,{"aria-label":`${o("unifiedCanvas.copyToClipboard")} (Cmd/Ctrl+C)`,tooltip:`${o("unifiedCanvas.copyToClipboard")} (Cmd/Ctrl+C)`,icon:i.jsx(yc,{}),onClick:s,isDisabled:e})}function tse(){const e=re(),{t}=me(),n=ha(),r=B(rr);Ge(["shift+d"],()=>{o()},{enabled:()=>!r,preventDefault:!0},[n]);const o=()=>{e(l5())};return i.jsx(Ie,{"aria-label":`${t("unifiedCanvas.downloadAsImage")} (Shift+D)`,tooltip:`${t("unifiedCanvas.downloadAsImage")} (Shift+D)`,icon:i.jsx(_1,{}),onClick:o,isDisabled:r})}function nse(){const e=B(rr),{openUploader:t}=kh(),{t:n}=me();return i.jsx(Ie,{"aria-label":n("common.upload"),tooltip:n("common.upload"),icon:i.jsx(jh,{}),onClick:t,isDisabled:e})}const rse=Pe([en,rr],(e,t)=>{const{layer:n,isMaskEnabled:r}=e;return{layer:n,isMaskEnabled:r,isStaging:t}},{memoizeOptions:{resultEqualityCheck:Wt}});function ose(){const e=re(),{t}=me(),{layer:n,isMaskEnabled:r,isStaging:o}=B(rse),s=()=>{e(Kf(n==="mask"?"base":"mask"))};Ge(["q"],()=>{s()},{enabled:()=>!o,preventDefault:!0},[n]);const a=u=>{const d=u;e(Kf(d)),d==="mask"&&!r&&e(Lu(!0))};return i.jsx(qn,{tooltip:`${t("unifiedCanvas.layer")} (Q)`,"aria-label":`${t("unifiedCanvas.layer")} (Q)`,value:n,data:c5,onChange:a,disabled:o,w:"full"})}function sse(){const e=re(),{t}=me(),n=ha(),r=B(rr),o=B(a=>a.system.isProcessing);Ge(["shift+m"],()=>{s()},{enabled:()=>!r,preventDefault:!0},[n,o]);const s=()=>{e(s5())};return i.jsx(Ie,{"aria-label":`${t("unifiedCanvas.mergeVisible")} (Shift+M)`,tooltip:`${t("unifiedCanvas.mergeVisible")} (Shift+M)`,icon:i.jsx(CP,{}),onClick:s,isDisabled:r})}function ase(){const e=B(s=>s.canvas.tool),t=B(rr),n=re(),{t:r}=me();Ge(["v"],()=>{o()},{enabled:()=>!t,preventDefault:!0},[]);const o=()=>n(Ws("move"));return i.jsx(Ie,{"aria-label":`${r("unifiedCanvas.move")} (V)`,tooltip:`${r("unifiedCanvas.move")} (V)`,icon:i.jsx(yP,{}),isChecked:e==="move"||t,onClick:o})}function ise(){const e=B(s=>s.ui.shouldPinParametersPanel),t=B(s=>s.ui.shouldShowParametersPanel),n=re(),{t:r}=me(),o=()=>{n(V0(!0)),e&&n(ks())};return!e||!t?i.jsxs(H,{flexDirection:"column",gap:2,children:[i.jsx(Ie,{tooltip:`${r("parameters.showOptionsPanel")} (O)`,tooltipProps:{placement:"top"},"aria-label":r("parameters.showOptionsPanel"),onClick:o,children:i.jsx(I1,{})}),i.jsx(H,{children:i.jsx(My,{iconButton:!0})}),i.jsx(H,{children:i.jsx(Zh,{width:"100%",height:"40px",btnGroupWidth:"100%"})})]}):null}function lse(){const e=re(),{t}=me(),n=B(rr),r=()=>{e(u5()),e(uh())};return i.jsx(Ie,{"aria-label":t("unifiedCanvas.clearCanvas"),tooltip:t("unifiedCanvas.clearCanvas"),icon:i.jsx(vo,{}),onClick:r,isDisabled:n,colorScheme:"error"})}function cse(){const e=ha(),t=re(),{t:n}=me();Ge(["r"],()=>{o()},{enabled:()=>!0,preventDefault:!0},[e]);const r=sI(()=>o(!1),()=>o(!0)),o=(s=!1)=>{const a=ha();if(!a)return;const u=a.getClientRect({skipTransform:!0});t(o5({contentRect:u,shouldScaleTo1:s}))};return i.jsx(Ie,{"aria-label":`${n("unifiedCanvas.resetView")} (R)`,tooltip:`${n("unifiedCanvas.resetView")} (R)`,icon:i.jsx(bP,{}),onClick:r})}function use(){const e=B(rr),t=ha(),n=B(a=>a.system.isProcessing),r=re(),{t:o}=me();Ge(["shift+s"],()=>{s()},{enabled:()=>!e,preventDefault:!0},[t,n]);const s=()=>{r(a5())};return i.jsx(Ie,{"aria-label":`${o("unifiedCanvas.saveToGallery")} (Shift+S)`,tooltip:`${o("unifiedCanvas.saveToGallery")} (Shift+S)`,icon:i.jsx(E1,{}),onClick:s,isDisabled:e})}const dse=Pe([en,rr,ao],(e,t,n)=>{const{isProcessing:r}=n,{tool:o}=e;return{tool:o,isStaging:t,isProcessing:r}},{memoizeOptions:{resultEqualityCheck:Wt}}),fse=()=>{const e=re(),{t}=me(),{tool:n,isStaging:r}=B(dse);Ge(["b"],()=>{o()},{enabled:()=>!r,preventDefault:!0},[]),Ge(["e"],()=>{s()},{enabled:()=>!r,preventDefault:!0},[n]),Ge(["c"],()=>{a()},{enabled:()=>!r,preventDefault:!0},[n]),Ge(["shift+f"],()=>{u()},{enabled:()=>!r,preventDefault:!0}),Ge(["delete","backspace"],()=>{d()},{enabled:()=>!r,preventDefault:!0});const o=()=>e(Ws("brush")),s=()=>e(Ws("eraser")),a=()=>e(Ws("colorPicker")),u=()=>e(n5()),d=()=>e(r5());return i.jsxs(H,{flexDirection:"column",gap:2,children:[i.jsxs(gr,{children:[i.jsx(Ie,{"aria-label":`${t("unifiedCanvas.brush")} (B)`,tooltip:`${t("unifiedCanvas.brush")} (B)`,icon:i.jsx(PP,{}),isChecked:n==="brush"&&!r,onClick:o,isDisabled:r}),i.jsx(Ie,{"aria-label":`${t("unifiedCanvas.eraser")} (E)`,tooltip:`${t("unifiedCanvas.eraser")} (B)`,icon:i.jsx(xP,{}),isChecked:n==="eraser"&&!r,isDisabled:r,onClick:s})]}),i.jsxs(gr,{children:[i.jsx(Ie,{"aria-label":`${t("unifiedCanvas.fillBoundingBox")} (Shift+F)`,tooltip:`${t("unifiedCanvas.fillBoundingBox")} (Shift+F)`,icon:i.jsx(wP,{}),isDisabled:r,onClick:u}),i.jsx(Ie,{"aria-label":`${t("unifiedCanvas.eraseBoundingBox")} (Del/Backspace)`,tooltip:`${t("unifiedCanvas.eraseBoundingBox")} (Del/Backspace)`,icon:i.jsx(_h,{style:{transform:"rotate(45deg)"}}),isDisabled:r,onClick:d})]}),i.jsx(Ie,{"aria-label":`${t("unifiedCanvas.colorPicker")} (C)`,tooltip:`${t("unifiedCanvas.colorPicker")} (C)`,icon:i.jsx(SP,{}),isChecked:n==="colorPicker"&&!r,isDisabled:r,onClick:a,width:"max-content"})]})},pse=()=>i.jsxs(H,{flexDirection:"column",rowGap:2,width:"min-content",children:[i.jsx(ose,{}),i.jsx(fse,{}),i.jsxs(H,{gap:2,children:[i.jsx(ase,{}),i.jsx(cse,{})]}),i.jsxs(H,{columnGap:2,children:[i.jsx(sse,{}),i.jsx(use,{})]}),i.jsxs(H,{columnGap:2,children:[i.jsx(ese,{}),i.jsx(tse,{})]}),i.jsxs(H,{gap:2,children:[i.jsx(lI,{}),i.jsx(aI,{})]}),i.jsxs(H,{gap:2,children:[i.jsx(nse,{}),i.jsx(lse,{})]}),i.jsx(Joe,{}),i.jsx(ise,{})]});function hse(){const e=re(),t=B(o=>o.canvas.brushSize),{t:n}=me(),r=B(rr);return Ge(["BracketLeft"],()=>{e(Nl(Math.max(t-5,5)))},{enabled:()=>!r,preventDefault:!0},[t]),Ge(["BracketRight"],()=>{e(Nl(Math.min(t+5,500)))},{enabled:()=>!r,preventDefault:!0},[t]),i.jsx(vt,{label:n("unifiedCanvas.brushSize"),value:t,withInput:!0,onChange:o=>e(Nl(o)),sliderNumberInputProps:{max:500},isCompact:!0})}const mse=Pe([en,rr],(e,t)=>{const{brushColor:n,maskColor:r,layer:o}=e;return{brushColor:n,maskColor:r,layer:o,isStaging:t}},{memoizeOptions:{resultEqualityCheck:Wt}});function gse(){const e=re(),{brushColor:t,maskColor:n,layer:r,isStaging:o}=B(mse),s=()=>{if(r==="base")return`rgba(${t.r},${t.g},${t.b},${t.a})`;if(r==="mask")return`rgba(${n.r},${n.g},${n.b},${n.a})`};return Ge(["shift+BracketLeft"],()=>{e(zl({...t,a:Us(t.a-.05,.05,1)}))},{enabled:()=>!o,preventDefault:!0},[t]),Ge(["shift+BracketRight"],()=>{e(zl({...t,a:Us(t.a+.05,.05,1)}))},{enabled:()=>!o,preventDefault:!0},[t]),i.jsx(la,{triggerComponent:i.jsx(qe,{sx:{width:7,height:7,minWidth:7,minHeight:7,borderRadius:"full",bg:s(),cursor:"pointer"}}),children:i.jsxs(H,{minWidth:60,direction:"column",gap:4,width:"100%",children:[r==="base"&&i.jsx(rh,{sx:{width:"100%",paddingTop:2,paddingBottom:2},pickerColor:t,onChange:a=>e(zl(a))}),r==="mask"&&i.jsx(rh,{sx:{width:"100%",paddingTop:2,paddingBottom:2},pickerColor:n,onChange:a=>e(q3(a))})]})})}function cI(){return i.jsxs(H,{columnGap:4,alignItems:"center",children:[i.jsx(hse,{}),i.jsx(gse,{})]})}function vse(){const e=re(),t=B(r=>r.canvas.shouldRestrictStrokesToBox),{t:n}=me();return i.jsx(In,{label:n("unifiedCanvas.betaLimitToBox"),isChecked:t,onChange:r=>e(J3(r.target.checked))})}function yse(){return i.jsxs(H,{gap:4,alignItems:"center",children:[i.jsx(cI,{}),i.jsx(vse,{})]})}function bse(){const e=re(),{t}=me(),n=()=>e(W0());return i.jsx(Yt,{size:"sm",leftIcon:i.jsx(vo,{}),onClick:n,tooltip:`${t("unifiedCanvas.clearMask")} (Shift+C)`,children:t("unifiedCanvas.betaClear")})}function xse(){const e=B(o=>o.canvas.isMaskEnabled),t=re(),{t:n}=me(),r=()=>t(Lu(!e));return i.jsx(In,{label:`${n("unifiedCanvas.enableMask")} (H)`,isChecked:e,onChange:r})}function Sse(){const e=re(),{t}=me(),n=B(r=>r.canvas.shouldPreserveMaskedArea);return i.jsx(In,{label:t("unifiedCanvas.betaPreserveMasked"),isChecked:n,onChange:r=>e(G3(r.target.checked))})}function wse(){return i.jsxs(H,{gap:4,alignItems:"center",children:[i.jsx(cI,{}),i.jsx(xse,{}),i.jsx(Sse,{}),i.jsx(bse,{})]})}function Cse(){const e=B(r=>r.canvas.shouldDarkenOutsideBoundingBox),t=re(),{t:n}=me();return i.jsx(In,{label:n("unifiedCanvas.betaDarkenOutside"),isChecked:e,onChange:r=>t(X3(r.target.checked))})}function Pse(){const e=B(r=>r.canvas.shouldShowGrid),t=re(),{t:n}=me();return i.jsx(In,{label:n("unifiedCanvas.showGrid"),isChecked:e,onChange:r=>t(Y3(r.target.checked))})}function kse(){const e=B(o=>o.canvas.shouldSnapToGrid),t=re(),{t:n}=me(),r=o=>t(qf(o.target.checked));return i.jsx(In,{label:`${n("unifiedCanvas.snapToGrid")} (N)`,isChecked:e,onChange:r})}function _se(){return i.jsxs(H,{alignItems:"center",gap:4,children:[i.jsx(Pse,{}),i.jsx(kse,{}),i.jsx(Cse,{})]})}const jse=Pe([en],e=>{const{tool:t,layer:n}=e;return{tool:t,layer:n}},{memoizeOptions:{resultEqualityCheck:Wt}});function Ese(){const{tool:e,layer:t}=B(jse);return i.jsxs(H,{height:8,minHeight:8,maxHeight:8,alignItems:"center",children:[t=="base"&&["brush","eraser","colorPicker"].includes(e)&&i.jsx(yse,{}),t=="mask"&&["brush","eraser","colorPicker"].includes(e)&&i.jsx(wse,{}),e=="move"&&i.jsx(_se,{})]})}const Ise=Pe([en,So],(e,t)=>{const{doesCanvasNeedScaling:n}=e,{shouldUseCanvasBetaLayout:r}=t;return{doesCanvasNeedScaling:n,shouldUseCanvasBetaLayout:r}},Et),fv={id:"canvas-intial-image",actionType:"SET_CANVAS_INITIAL_IMAGE"},Ose=()=>{const e=re(),{doesCanvasNeedScaling:t,shouldUseCanvasBetaLayout:n}=B(Ise),{isOver:r,setNodeRef:o,active:s}=Au({id:"unifiedCanvas",data:fv});return p.useLayoutEffect(()=>{const a=()=>{e(ks())};return window.addEventListener("resize",a),()=>window.removeEventListener("resize",a)},[e]),n?i.jsx(qe,{layerStyle:"first",ref:o,tabIndex:0,sx:{w:"full",h:"full",p:4,borderRadius:"base"},children:i.jsxs(H,{sx:{w:"full",h:"full",gap:4},children:[i.jsx(pse,{}),i.jsxs(H,{sx:{flexDir:"column",w:"full",h:"full",gap:4,position:"relative"},children:[i.jsx(Ese,{}),i.jsxs(qe,{sx:{w:"full",h:"full",position:"relative"},children:[t?i.jsx(Y4,{}):i.jsx(K4,{}),Gl(fv,s)&&i.jsx(Ql,{isOver:r,label:"Set Canvas Initial Image"})]})]})]})}):i.jsx(qe,{ref:o,tabIndex:-1,sx:{layerStyle:"first",w:"full",h:"full",p:4,borderRadius:"base"},children:i.jsxs(H,{sx:{flexDirection:"column",alignItems:"center",gap:4,w:"full",h:"full"},children:[i.jsx(Qoe,{}),i.jsx(H,{sx:{flexDirection:"column",alignItems:"center",justifyContent:"center",gap:4,w:"full",h:"full"},children:i.jsxs(qe,{sx:{w:"full",h:"full",position:"relative"},children:[t?i.jsx(Y4,{}):i.jsx(K4,{}),Gl(fv,s)&&i.jsx(Ql,{isOver:r,label:"Set Canvas Initial Image"})]})})]})})},Rse=p.memo(Ose),Mse=Pe([No,ao],(e,t)=>{const{infillMethod:n}=e,{infillMethods:r}=t;return{infillMethod:n,infillMethods:r}},Et),Tse=()=>{const e=re(),{infillMethod:t,infillMethods:n}=B(Mse),{t:r}=me(),o=p.useCallback(s=>{e(p7(s))},[e]);return i.jsx(qn,{label:r("parameters.infillMethod"),value:t,data:n,onChange:o})},Dse=p.memo(Tse),Ase=Pe([No],e=>{const{tileSize:t,infillMethod:n}=e;return{tileSize:t,infillMethod:n}},Et),Nse=()=>{const e=re(),{tileSize:t,infillMethod:n}=B(Ase),{t:r}=me(),o=p.useCallback(a=>{e(n2(a))},[e]),s=p.useCallback(()=>{e(n2(32))},[e]);return i.jsx(vt,{isDisabled:n!=="tile",label:r("parameters.tileSize"),min:16,max:64,sliderNumberInputProps:{max:256},value:t,onChange:o,withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:s})},zse=p.memo(Nse),$se=Pe([en],e=>{const{boundingBoxScaleMethod:t}=e;return{boundingBoxScale:t}},Et),Lse=()=>{const e=re(),{boundingBoxScale:t}=B($se),{t:n}=me(),r=o=>{e(m7(o))};return i.jsx(qn,{label:n("parameters.scaleBeforeProcessing"),data:h7,value:t,onChange:r})},Fse=p.memo(Lse),Bse=Pe([No,ao,en],(e,t,n)=>{const{scaledBoundingBoxDimensions:r,boundingBoxScaleMethod:o}=n;return{scaledBoundingBoxDimensions:r,isManual:o==="manual"}},Et),Hse=()=>{const e=re(),{isManual:t,scaledBoundingBoxDimensions:n}=B(Bse),{t:r}=me(),o=a=>{e(Yf({...n,height:Math.floor(a)}))},s=()=>{e(Yf({...n,height:Math.floor(512)}))};return i.jsx(vt,{isDisabled:!t,label:r("parameters.scaledHeight"),min:64,max:1024,step:64,value:n.height,onChange:o,sliderNumberInputProps:{max:4096},withSliderMarks:!0,withInput:!0,withReset:!0,handleReset:s})},Wse=p.memo(Hse),Vse=Pe([en],e=>{const{boundingBoxScaleMethod:t,scaledBoundingBoxDimensions:n}=e;return{scaledBoundingBoxDimensions:n,isManual:t==="manual"}},Et),Use=()=>{const e=re(),{isManual:t,scaledBoundingBoxDimensions:n}=B(Vse),{t:r}=me(),o=a=>{e(Yf({...n,width:Math.floor(a)}))},s=()=>{e(Yf({...n,width:Math.floor(512)}))};return i.jsx(vt,{isDisabled:!t,label:r("parameters.scaledWidth"),min:64,max:1024,step:64,value:n.width,onChange:o,sliderNumberInputProps:{max:4096},withSliderMarks:!0,withInput:!0,withReset:!0,handleReset:s})},Gse=p.memo(Use),qse=()=>{const{t:e}=me();return i.jsx(Po,{label:e("parameters.infillScalingHeader"),children:i.jsxs(H,{sx:{gap:2,flexDirection:"column"},children:[i.jsx(Dse,{}),i.jsx(zse,{}),i.jsx(Fse,{}),i.jsx(Gse,{}),i.jsx(Wse,{})]})})},Kse=p.memo(qse);function Yse(){const e=re(),t=B(r=>r.generation.seamBlur),{t:n}=me();return i.jsx(vt,{label:n("parameters.seamBlur"),min:0,max:64,sliderNumberInputProps:{max:512},value:t,onChange:r=>{e(r2(r))},withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:()=>{e(r2(16))}})}function Xse(){const e=re(),{t}=me(),n=B(r=>r.generation.seamSize);return i.jsx(vt,{label:t("parameters.seamSize"),min:1,max:256,sliderNumberInputProps:{max:512},value:n,onChange:r=>{e(o2(r))},withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:()=>e(o2(96))})}function Qse(){const{t:e}=me(),t=B(r=>r.generation.seamSteps),n=re();return i.jsx(vt,{label:e("parameters.seamSteps"),min:1,max:100,sliderNumberInputProps:{max:999},value:t,onChange:r=>{n(s2(r))},withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:()=>{n(s2(30))}})}function Zse(){const e=re(),{t}=me(),n=B(r=>r.generation.seamStrength);return i.jsx(vt,{label:t("parameters.seamStrength"),min:.01,max:.99,step:.01,value:n,onChange:r=>{e(a2(r))},withInput:!0,withSliderMarks:!0,withReset:!0,handleReset:()=>{e(a2(.7))}})}const Jse=()=>{const{t:e}=me();return i.jsxs(Po,{label:e("parameters.seamCorrectionHeader"),children:[i.jsx(Xse,{}),i.jsx(Yse,{}),i.jsx(Zse,{}),i.jsx(Qse,{})]})},eae=p.memo(Jse),tae=Pe([en,rr],(e,t)=>{const{boundingBoxDimensions:n}=e;return{boundingBoxDimensions:n,isStaging:t}},Et),nae=()=>{const e=re(),{boundingBoxDimensions:t,isStaging:n}=B(tae),{t:r}=me(),o=a=>{e(gu({...t,height:Math.floor(a)}))},s=()=>{e(gu({...t,height:Math.floor(512)}))};return i.jsx(vt,{label:r("parameters.boundingBoxHeight"),min:64,max:1024,step:64,value:t.height,onChange:o,isDisabled:n,sliderNumberInputProps:{max:4096},withSliderMarks:!0,withInput:!0,withReset:!0,handleReset:s})},X4=p.memo(nae),rae=Pe([en,rr],(e,t)=>{const{boundingBoxDimensions:n}=e;return{boundingBoxDimensions:n,isStaging:t}},Et),oae=()=>{const e=re(),{boundingBoxDimensions:t,isStaging:n}=B(rae),{t:r}=me(),o=a=>{e(gu({...t,width:Math.floor(a)}))},s=()=>{e(gu({...t,width:Math.floor(512)}))};return i.jsx(vt,{label:r("parameters.boundingBoxWidth"),min:64,max:1024,step:64,value:t.width,onChange:o,isDisabled:n,sliderNumberInputProps:{max:4096},withSliderMarks:!0,withInput:!0,withReset:!0,handleReset:s})},Q4=p.memo(oae),sae=Pe(mn,({ui:e,generation:t})=>{const{shouldUseSliders:n}=e,{shouldRandomizeSeed:r}=t;return{shouldUseSliders:n,activeLabel:r?void 0:"Manual Seed"}},Et),aae=()=>{const{shouldUseSliders:e,activeLabel:t}=B(sae);return i.jsx(Po,{label:"General",activeLabel:t,defaultIsOpen:!0,children:i.jsxs(H,{sx:{flexDirection:"column",gap:3},children:[e?i.jsxs(i.Fragment,{children:[i.jsx(ac,{}),i.jsx(lc,{}),i.jsx(sc,{}),i.jsx(ic,{}),i.jsx(qe,{pt:2,children:i.jsx(cc,{})}),i.jsx(Q4,{}),i.jsx(X4,{})]}):i.jsxs(i.Fragment,{children:[i.jsxs(H,{gap:3,children:[i.jsx(ac,{}),i.jsx(lc,{}),i.jsx(sc,{})]}),i.jsx(ic,{}),i.jsx(qe,{pt:2,children:i.jsx(cc,{})}),i.jsx(Q4,{}),i.jsx(X4,{})]}),i.jsx(IE,{})]})})},iae=p.memo(aae),lae=()=>i.jsxs(i.Fragment,{children:[i.jsx(Iy,{}),i.jsx(Ey,{}),i.jsx(Ty,{}),i.jsx(iae,{}),i.jsx(Cy,{}),i.jsx(Sy,{}),i.jsx(_y,{}),i.jsx(Ry,{}),i.jsx(Oy,{}),i.jsx(eae,{}),i.jsx(Kse,{}),i.jsx(Py,{})]}),uI=p.memo(lae),cae=()=>i.jsxs(H,{sx:{gap:4,w:"full",h:"full"},children:[i.jsx(xy,{children:i.jsx(uI,{})}),i.jsx(Rse,{})]}),uae=p.memo(cae),dae=[{id:"txt2img",translationKey:"common.txt2img",icon:i.jsx(mo,{as:Mz,sx:{boxSize:6,pointerEvents:"none"}}),content:i.jsx(Kne,{})},{id:"img2img",translationKey:"common.img2img",icon:i.jsx(mo,{as:qu,sx:{boxSize:6,pointerEvents:"none"}}),content:i.jsx(AJ,{})},{id:"unifiedCanvas",translationKey:"common.unifiedCanvas",icon:i.jsx(mo,{as:KY,sx:{boxSize:6,pointerEvents:"none"}}),content:i.jsx(uae,{})},{id:"nodes",translationKey:"common.nodes",icon:i.jsx(mo,{as:qY,sx:{boxSize:6,pointerEvents:"none"}}),content:i.jsx(Ane,{})},{id:"modelManager",translationKey:"modelManager.modelManager",icon:i.jsx(mo,{as:jz,sx:{boxSize:6,pointerEvents:"none"}}),content:i.jsx(Qee,{})}],fae=Pe(fi,e=>{const{disabledTabs:t}=e;return dae.filter(n=>!t.includes(n.id))},{memoizeOptions:{resultEqualityCheck:Wt}}),pae=300,pv=20,dI=["modelManager"],hae=()=>{const e=B(g7),t=B(Sr),n=B(fae),r=B(S=>S.lightbox.isLightboxOpen),o=cr("lightbox").isFeatureEnabled,{shouldPinGallery:s,shouldPinParametersPanel:a,shouldShowGallery:u}=B(S=>S.ui),{t:d}=me(),f=re();Ge("z",()=>{o&&f(mu(!r))},[r]),Ge("f",()=>{f(v7()),(s||a)&&f(ks())},[s,a]);const h=p.useCallback(()=>{t==="unifiedCanvas"&&f(ks())},[f,t]),m=p.useCallback(S=>{S.target instanceof HTMLElement&&S.target.blur()},[]),v=p.useMemo(()=>n.map(S=>i.jsx(Gn,{hasArrow:!0,label:String(d(S.translationKey)),placement:"end",children:i.jsxs(w1,{onClick:m,children:[i.jsx(y5,{children:String(d(S.translationKey))}),S.icon]})},S.id)),[n,d,m]),b=p.useMemo(()=>n.map(S=>i.jsx(x1,{children:S.content},S.id)),[n]),{ref:w,minSizePct:C}=WX(pae,pv,"app");return i.jsxs(y1,{defaultIndex:e,index:e,onChange:S=>{f(Oi(S))},sx:{flexGrow:1,gap:4},isLazy:!0,children:[i.jsxs(b1,{sx:{pt:2,gap:4,flexDir:"column"},children:[v,i.jsx(li,{}),i.jsx(kX,{})]}),i.jsxs(by,{id:"app",autoSaveId:"app",direction:"horizontal",style:{height:"100%",width:"100%"},children:[i.jsx(Eu,{id:"main",children:i.jsx(S1,{style:{height:"100%",width:"100%"},children:b})}),s&&u&&!dI.includes(t)&&i.jsxs(i.Fragment,{children:[i.jsx(vE,{}),i.jsx(Eu,{ref:w,onResize:h,id:"gallery",order:3,defaultSize:C>pv?C:pv,minSize:C,maxSize:50,children:i.jsx(xk,{})})]})]})]})},mae=p.memo(hae),gae=Pe([Sr,So],(e,t)=>{const{shouldPinGallery:n,shouldShowGallery:r}=t;return{shouldPinGallery:n,shouldShowGalleryButton:dI.includes(e)?!1:!r}},{memoizeOptions:{resultEqualityCheck:Wt}}),vae=()=>{const{t:e}=me(),{shouldPinGallery:t,shouldShowGalleryButton:n}=B(gae),r=re(),o=()=>{r(bv(!0)),t&&r(ks())};return n?i.jsx(Ie,{tooltip:"Show Gallery (G)",tooltipProps:{placement:"top"},"aria-label":e("accessibility.showGallery"),onClick:o,sx:{pos:"absolute",top:"50%",transform:"translate(0, -50%)",p:0,insetInlineEnd:0,px:3,h:48,w:8,borderStartEndRadius:0,borderEndEndRadius:0,shadow:"2xl"},children:i.jsx(YY,{})}):null},yae=p.memo(vae),hv={borderStartStartRadius:0,borderEndStartRadius:0,shadow:"2xl"},bae=Pe([So,Sr],(e,t)=>{const{shouldPinParametersPanel:n,shouldUseCanvasBetaLayout:r,shouldShowParametersPanel:o}=e,s=r&&t==="unifiedCanvas",a=!s&&(!n||!o),u=!s&&!o&&["txt2img","img2img","unifiedCanvas"].includes(t);return{shouldPinParametersPanel:n,shouldShowParametersPanelButton:u,shouldShowProcessButtons:a}},{memoizeOptions:{resultEqualityCheck:Wt}}),xae=()=>{const e=re(),{t}=me(),{shouldShowProcessButtons:n,shouldShowParametersPanelButton:r,shouldPinParametersPanel:o}=B(bae),s=()=>{e(V0(!0)),o&&e(ks())};return r?i.jsxs(H,{pos:"absolute",transform:"translate(0, -50%)",minW:8,top:"50%",insetInlineStart:"4.5rem",direction:"column",gap:2,children:[i.jsx(Ie,{tooltip:"Show Options Panel (O)",tooltipProps:{placement:"top"},"aria-label":t("accessibility.showOptionsPanel"),onClick:s,sx:hv,children:i.jsx(I1,{})}),n&&i.jsxs(i.Fragment,{children:[i.jsx(My,{iconButton:!0,sx:hv}),i.jsx(Zh,{sx:hv})]})]}):null},Sae=p.memo(xae),wae=Pe([So,Sr,wk],(e,t,n)=>{const{shouldPinParametersPanel:r,shouldShowParametersPanel:o}=e;return{activeTabName:t,shouldPinParametersPanel:r,shouldShowParametersPanel:o}},Et),Cae=()=>{const e=re(),{shouldPinParametersPanel:t,shouldShowParametersPanel:n,activeTabName:r}=B(wae),o=()=>{e(V0(!1))},s=p.useMemo(()=>r==="txt2img"?i.jsx(qE,{}):r==="img2img"?i.jsx(OE,{}):r==="unifiedCanvas"?i.jsx(uI,{}):null,[r]);return t?null:i.jsx(Sk,{direction:"left",isResizable:!1,isOpen:n,onClose:o,children:i.jsxs(H,{sx:{flexDir:"column",h:"full",w:my,gap:2,position:"relative",flexShrink:0,overflowY:"auto"},children:[i.jsxs(H,{paddingTop:1.5,paddingBottom:4,justifyContent:"space-between",alignItems:"center",children:[i.jsx(nE,{}),i.jsx(gE,{})]}),i.jsx(H,{sx:{gap:2,flexDirection:"column",h:"full",w:"full"},children:s})]})})},Pae=p.memo(Cae),kae=e=>{const{imagesUsage:t}=e;return!t||!w3(t)?null:i.jsxs(i.Fragment,{children:[i.jsx(Ue,{children:"An image from this board is currently in use in the following features:"}),i.jsxs(mh,{sx:{paddingInlineStart:6},children:[t.isInitialImage&&i.jsx(To,{children:"Image to Image"}),t.isCanvasImage&&i.jsx(To,{children:"Unified Canvas"}),t.isControlNetImage&&i.jsx(To,{children:"ControlNet"}),t.isNodesImage&&i.jsx(To,{children:"Node Editor"})]}),i.jsx(Ue,{children:"If you delete images from this board, those features will immediately be reset."})]})},_ae=()=>{const{t:e}=me(),{isOpen:t,onClose:n,board:r,handleDeleteBoardImages:o,handleDeleteBoardOnly:s,imagesUsage:a}=p.useContext(f3),u=p.useRef(null);return i.jsx(bh,{isOpen:t,leastDestructiveRef:u,onClose:n,isCentered:!0,children:i.jsx(ni,{children:r&&i.jsxs(xh,{children:[i.jsx(ti,{fontSize:"lg",fontWeight:"bold",children:"Delete Board"}),i.jsx(ri,{children:i.jsxs(H,{direction:"column",gap:3,children:[i.jsx(kae,{imagesUsage:a}),i.jsx(wa,{}),i.jsx(Ue,{children:e("common.areYouSure")}),i.jsxs(Ue,{fontWeight:"bold",children:["This board has ",r.image_count," image(s) that will be deleted."]})]})}),i.jsxs(ei,{gap:3,children:[i.jsx(Yt,{ref:u,onClick:n,children:"Cancel"}),i.jsx(Yt,{colorScheme:"warning",onClick:()=>s(r.board_id),children:"Delete Board Only"}),i.jsx(Yt,{colorScheme:"error",onClick:()=>o(r.board_id),children:"Delete Board and Images"})]})]})})})},jae=p.memo(_ae),Eae=()=>{const{data:e,isFetching:t}=lh(),{isOpen:n,onClose:r,handleAddToBoard:o,image:s}=p.useContext(m3),[a,u]=p.useState(),d=p.useRef(null),f=e==null?void 0:e.find(h=>h.board_id===(s==null?void 0:s.board_id));return i.jsx(bh,{isOpen:n,leastDestructiveRef:d,onClose:r,isCentered:!0,children:i.jsx(ni,{children:i.jsxs(xh,{children:[i.jsx(ti,{fontSize:"lg",fontWeight:"bold",children:f?"Move Image to Board":"Add Image to Board"}),i.jsx(ri,{children:i.jsx(qe,{children:i.jsxs(H,{direction:"column",gap:3,children:[f&&i.jsxs(Ue,{children:["Moving this image from"," ",i.jsx("strong",{children:f.board_name})," to"]}),t?i.jsx(ai,{}):i.jsx(qn,{placeholder:"Select Board",onChange:h=>u(h),value:a,data:(e??[]).map(h=>({label:h.board_name,value:h.board_id}))})]})})}),i.jsxs(ei,{children:[i.jsx(Yt,{onClick:r,children:"Cancel"}),i.jsx(Yt,{isDisabled:!a,colorScheme:"accent",onClick:()=>{a&&o(a)},ml:3,children:f?"Move":"Add"})]})]})})})},Iae=p.memo(Eae),Oae=Pe(e=>e.hotkeys,e=>{const{shift:t}=e;return{shift:t}},{memoizeOptions:{resultEqualityCheck:Wt}}),Rae=()=>{const e=re(),{shift:t}=B(Oae);return Ge("*",()=>{uP("shift")?!t&&e(os(!0)):t&&e(os(!1))},{keyup:!0,keydown:!0},[t]),Ge("o",()=>{e(y7())}),Ge(["shift+o"],()=>{e(b7())}),Ge("g",()=>{e(x7())}),Ge(["shift+g"],()=>{e(S3())}),Ge("1",()=>{e(Oi("txt2img"))}),Ge("2",()=>{e(Oi("img2img"))}),Ge("3",()=>{e(Oi("unifiedCanvas"))}),Ge("4",()=>{e(Oi("nodes"))}),null},Mae=p.memo(Rae),Tae={},Dae=({config:e=Tae,headerComponent:t})=>{const n=B(j3),r=S7(),o=cr("lightbox").isFeatureEnabled,s=re();return p.useEffect(()=>{Pr.changeLanguage(n)},[n]),p.useEffect(()=>{r.info({namespace:"App",data:e},"Received config"),s(w7(e))},[s,e,r]),p.useEffect(()=>{s(C7())},[s]),i.jsxs(i.Fragment,{children:[i.jsxs(ma,{w:"100vw",h:"100vh",position:"relative",overflow:"hidden",children:[o&&i.jsx(tX,{}),i.jsx(fz,{children:i.jsxs(ma,{sx:{gap:4,p:4,gridAutoRows:"min-content auto",w:"full",h:"full"},children:[t||i.jsx(wX,{}),i.jsx(H,{sx:{gap:4,w:"full",h:"full"},children:i.jsx(mae,{})})]})}),i.jsx(eB,{}),i.jsx(Pae,{}),i.jsx(zf,{children:i.jsx(Sae,{})}),i.jsx(zf,{children:i.jsx(yae,{})})]}),i.jsx(aB,{}),i.jsx(Iae,{}),i.jsx(jae,{}),i.jsx(P7,{}),i.jsx(Mae,{})]})},Bae=p.memo(Dae);export{Bae as default}; diff --git a/invokeai/frontend/web/dist/assets/MantineProvider-8988d217.js b/invokeai/frontend/web/dist/assets/MantineProvider-8988d217.js new file mode 100644 index 0000000000..1456170451 --- /dev/null +++ b/invokeai/frontend/web/dist/assets/MantineProvider-8988d217.js @@ -0,0 +1 @@ +import{W as d,ga as _,q as h,gj as X}from"./index-078526aa.js";const q={dark:["#C1C2C5","#A6A7AB","#909296","#5c5f66","#373A40","#2C2E33","#25262b","#1A1B1E","#141517","#101113"],gray:["#f8f9fa","#f1f3f5","#e9ecef","#dee2e6","#ced4da","#adb5bd","#868e96","#495057","#343a40","#212529"],red:["#fff5f5","#ffe3e3","#ffc9c9","#ffa8a8","#ff8787","#ff6b6b","#fa5252","#f03e3e","#e03131","#c92a2a"],pink:["#fff0f6","#ffdeeb","#fcc2d7","#faa2c1","#f783ac","#f06595","#e64980","#d6336c","#c2255c","#a61e4d"],grape:["#f8f0fc","#f3d9fa","#eebefa","#e599f7","#da77f2","#cc5de8","#be4bdb","#ae3ec9","#9c36b5","#862e9c"],violet:["#f3f0ff","#e5dbff","#d0bfff","#b197fc","#9775fa","#845ef7","#7950f2","#7048e8","#6741d9","#5f3dc4"],indigo:["#edf2ff","#dbe4ff","#bac8ff","#91a7ff","#748ffc","#5c7cfa","#4c6ef5","#4263eb","#3b5bdb","#364fc7"],blue:["#e7f5ff","#d0ebff","#a5d8ff","#74c0fc","#4dabf7","#339af0","#228be6","#1c7ed6","#1971c2","#1864ab"],cyan:["#e3fafc","#c5f6fa","#99e9f2","#66d9e8","#3bc9db","#22b8cf","#15aabf","#1098ad","#0c8599","#0b7285"],teal:["#e6fcf5","#c3fae8","#96f2d7","#63e6be","#38d9a9","#20c997","#12b886","#0ca678","#099268","#087f5b"],green:["#ebfbee","#d3f9d8","#b2f2bb","#8ce99a","#69db7c","#51cf66","#40c057","#37b24d","#2f9e44","#2b8a3e"],lime:["#f4fce3","#e9fac8","#d8f5a2","#c0eb75","#a9e34b","#94d82d","#82c91e","#74b816","#66a80f","#5c940d"],yellow:["#fff9db","#fff3bf","#ffec99","#ffe066","#ffd43b","#fcc419","#fab005","#f59f00","#f08c00","#e67700"],orange:["#fff4e6","#ffe8cc","#ffd8a8","#ffc078","#ffa94d","#ff922b","#fd7e14","#f76707","#e8590c","#d9480f"]};function Y(r){return()=>({fontFamily:r.fontFamily||"sans-serif"})}var J=Object.defineProperty,x=Object.getOwnPropertySymbols,K=Object.prototype.hasOwnProperty,Q=Object.prototype.propertyIsEnumerable,z=(r,e,o)=>e in r?J(r,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[e]=o,j=(r,e)=>{for(var o in e||(e={}))K.call(e,o)&&z(r,o,e[o]);if(x)for(var o of x(e))Q.call(e,o)&&z(r,o,e[o]);return r};function Z(r){return e=>({WebkitTapHighlightColor:"transparent",[e||"&:focus"]:j({},r.focusRing==="always"||r.focusRing==="auto"?r.focusRingStyles.styles(r):r.focusRingStyles.resetStyles(r)),[e?e.replace(":focus",":focus:not(:focus-visible)"):"&:focus:not(:focus-visible)"]:j({},r.focusRing==="auto"||r.focusRing==="never"?r.focusRingStyles.resetStyles(r):null)})}function y(r){return e=>typeof r.primaryShade=="number"?r.primaryShade:r.primaryShade[e||r.colorScheme]}function w(r){const e=y(r);return(o,n,a=!0,t=!0)=>{if(typeof o=="string"&&o.includes(".")){const[s,l]=o.split("."),g=parseInt(l,10);if(s in r.colors&&g>=0&&g<10)return r.colors[s][typeof n=="number"&&!t?n:g]}const i=typeof n=="number"?n:e();return o in r.colors?r.colors[o][i]:a?r.colors[r.primaryColor][i]:o}}function T(r){let e="";for(let o=1;o{const a={from:(n==null?void 0:n.from)||r.defaultGradient.from,to:(n==null?void 0:n.to)||r.defaultGradient.to,deg:(n==null?void 0:n.deg)||r.defaultGradient.deg};return`linear-gradient(${a.deg}deg, ${e(a.from,o(),!1)} 0%, ${e(a.to,o(),!1)} 100%)`}}function D(r){return e=>{if(typeof e=="number")return`${e/16}${r}`;if(typeof e=="string"){const o=e.replace("px","");if(!Number.isNaN(Number(o)))return`${Number(o)/16}${r}`}return e}}const u=D("rem"),k=D("em");function V({size:r,sizes:e,units:o}){return r in e?e[r]:typeof r=="number"?o==="em"?k(r):u(r):r||e.md}function S(r){return typeof r=="number"?r:typeof r=="string"&&r.includes("rem")?Number(r.replace("rem",""))*16:typeof r=="string"&&r.includes("em")?Number(r.replace("em",""))*16:Number(r)}function er(r){return e=>`@media (min-width: ${k(S(V({size:e,sizes:r.breakpoints})))})`}function or(r){return e=>`@media (max-width: ${k(S(V({size:e,sizes:r.breakpoints}))-1)})`}function nr(r){return/^#?([0-9A-F]{3}){1,2}$/i.test(r)}function tr(r){let e=r.replace("#","");if(e.length===3){const i=e.split("");e=[i[0],i[0],i[1],i[1],i[2],i[2]].join("")}const o=parseInt(e,16),n=o>>16&255,a=o>>8&255,t=o&255;return{r:n,g:a,b:t,a:1}}function ar(r){const[e,o,n,a]=r.replace(/[^0-9,.]/g,"").split(",").map(Number);return{r:e,g:o,b:n,a:a||1}}function C(r){return nr(r)?tr(r):r.startsWith("rgb")?ar(r):{r:0,g:0,b:0,a:1}}function p(r,e){if(typeof r!="string"||e>1||e<0)return"rgba(0, 0, 0, 1)";if(r.startsWith("var(--"))return r;const{r:o,g:n,b:a}=C(r);return`rgba(${o}, ${n}, ${a}, ${e})`}function ir(r=0){return{position:"absolute",top:u(r),right:u(r),left:u(r),bottom:u(r)}}function sr(r,e){if(typeof r=="string"&&r.startsWith("var(--"))return r;const{r:o,g:n,b:a,a:t}=C(r),i=1-e,s=l=>Math.round(l*i);return`rgba(${s(o)}, ${s(n)}, ${s(a)}, ${t})`}function lr(r,e){if(typeof r=="string"&&r.startsWith("var(--"))return r;const{r:o,g:n,b:a,a:t}=C(r),i=s=>Math.round(s+(255-s)*e);return`rgba(${i(o)}, ${i(n)}, ${i(a)}, ${t})`}function fr(r){return e=>{if(typeof e=="number")return u(e);const o=typeof r.defaultRadius=="number"?r.defaultRadius:r.radius[r.defaultRadius]||r.defaultRadius;return r.radius[e]||e||o}}function cr(r,e){if(typeof r=="string"&&r.includes(".")){const[o,n]=r.split("."),a=parseInt(n,10);if(o in e.colors&&a>=0&&a<10)return{isSplittedColor:!0,key:o,shade:a}}return{isSplittedColor:!1}}function dr(r){const e=w(r),o=y(r),n=G(r);return({variant:a,color:t,gradient:i,primaryFallback:s})=>{const l=cr(t,r);switch(a){case"light":return{border:"transparent",background:p(e(t,r.colorScheme==="dark"?8:0,s,!1),r.colorScheme==="dark"?.2:1),color:t==="dark"?r.colorScheme==="dark"?r.colors.dark[0]:r.colors.dark[9]:e(t,r.colorScheme==="dark"?2:o("light")),hover:p(e(t,r.colorScheme==="dark"?7:1,s,!1),r.colorScheme==="dark"?.25:.65)};case"subtle":return{border:"transparent",background:"transparent",color:t==="dark"?r.colorScheme==="dark"?r.colors.dark[0]:r.colors.dark[9]:e(t,r.colorScheme==="dark"?2:o("light")),hover:p(e(t,r.colorScheme==="dark"?8:0,s,!1),r.colorScheme==="dark"?.2:1)};case"outline":return{border:e(t,r.colorScheme==="dark"?5:o("light")),background:"transparent",color:e(t,r.colorScheme==="dark"?5:o("light")),hover:r.colorScheme==="dark"?p(e(t,5,s,!1),.05):p(e(t,0,s,!1),.35)};case"default":return{border:r.colorScheme==="dark"?r.colors.dark[4]:r.colors.gray[4],background:r.colorScheme==="dark"?r.colors.dark[6]:r.white,color:r.colorScheme==="dark"?r.white:r.black,hover:r.colorScheme==="dark"?r.colors.dark[5]:r.colors.gray[0]};case"white":return{border:"transparent",background:r.white,color:e(t,o()),hover:null};case"transparent":return{border:"transparent",color:t==="dark"?r.colorScheme==="dark"?r.colors.dark[0]:r.colors.dark[9]:e(t,r.colorScheme==="dark"?2:o("light")),background:"transparent",hover:null};case"gradient":return{background:n(i),color:r.white,border:"transparent",hover:null};default:{const g=o(),$=l.isSplittedColor?l.shade:g,O=l.isSplittedColor?l.key:t;return{border:"transparent",background:e(O,$,s),color:r.white,hover:e(O,$===9?8:$+1)}}}}}function ur(r){return e=>{const o=y(r)(e);return r.colors[r.primaryColor][o]}}function pr(r){return{"@media (hover: hover)":{"&:hover":r},"@media (hover: none)":{"&:active":r}}}function gr(r){return()=>({userSelect:"none",color:r.colorScheme==="dark"?r.colors.dark[3]:r.colors.gray[5]})}function br(r){return()=>r.colorScheme==="dark"?r.colors.dark[2]:r.colors.gray[6]}const f={fontStyles:Y,themeColor:w,focusStyles:Z,linearGradient:B,radialGradient:rr,smallerThan:or,largerThan:er,rgba:p,cover:ir,darken:sr,lighten:lr,radius:fr,variant:dr,primaryShade:y,hover:pr,gradient:G,primaryColor:ur,placeholderStyles:gr,dimmed:br};var mr=Object.defineProperty,yr=Object.defineProperties,Sr=Object.getOwnPropertyDescriptors,R=Object.getOwnPropertySymbols,vr=Object.prototype.hasOwnProperty,_r=Object.prototype.propertyIsEnumerable,F=(r,e,o)=>e in r?mr(r,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[e]=o,hr=(r,e)=>{for(var o in e||(e={}))vr.call(e,o)&&F(r,o,e[o]);if(R)for(var o of R(e))_r.call(e,o)&&F(r,o,e[o]);return r},kr=(r,e)=>yr(r,Sr(e));function U(r){return kr(hr({},r),{fn:{fontStyles:f.fontStyles(r),themeColor:f.themeColor(r),focusStyles:f.focusStyles(r),largerThan:f.largerThan(r),smallerThan:f.smallerThan(r),radialGradient:f.radialGradient,linearGradient:f.linearGradient,gradient:f.gradient(r),rgba:f.rgba,cover:f.cover,lighten:f.lighten,darken:f.darken,primaryShade:f.primaryShade(r),radius:f.radius(r),variant:f.variant(r),hover:f.hover,primaryColor:f.primaryColor(r),placeholderStyles:f.placeholderStyles(r),dimmed:f.dimmed(r)}})}const $r={dir:"ltr",primaryShade:{light:6,dark:8},focusRing:"auto",loader:"oval",colorScheme:"light",white:"#fff",black:"#000",defaultRadius:"sm",transitionTimingFunction:"ease",colors:q,lineHeight:1.55,fontFamily:"-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji",fontFamilyMonospace:"ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace",primaryColor:"blue",respectReducedMotion:!0,cursorType:"default",defaultGradient:{from:"indigo",to:"cyan",deg:45},shadows:{xs:"0 0.0625rem 0.1875rem rgba(0, 0, 0, 0.05), 0 0.0625rem 0.125rem rgba(0, 0, 0, 0.1)",sm:"0 0.0625rem 0.1875rem rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 0.625rem 0.9375rem -0.3125rem, rgba(0, 0, 0, 0.04) 0 0.4375rem 0.4375rem -0.3125rem",md:"0 0.0625rem 0.1875rem rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 1.25rem 1.5625rem -0.3125rem, rgba(0, 0, 0, 0.04) 0 0.625rem 0.625rem -0.3125rem",lg:"0 0.0625rem 0.1875rem rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 1.75rem 1.4375rem -0.4375rem, rgba(0, 0, 0, 0.04) 0 0.75rem 0.75rem -0.4375rem",xl:"0 0.0625rem 0.1875rem rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.05) 0 2.25rem 1.75rem -0.4375rem, rgba(0, 0, 0, 0.04) 0 1.0625rem 1.0625rem -0.4375rem"},fontSizes:{xs:"0.75rem",sm:"0.875rem",md:"1rem",lg:"1.125rem",xl:"1.25rem"},radius:{xs:"0.125rem",sm:"0.25rem",md:"0.5rem",lg:"1rem",xl:"2rem"},spacing:{xs:"0.625rem",sm:"0.75rem",md:"1rem",lg:"1.25rem",xl:"1.5rem"},breakpoints:{xs:"36em",sm:"48em",md:"62em",lg:"75em",xl:"88em"},headings:{fontFamily:"-apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji",fontWeight:700,sizes:{h1:{fontSize:"2.125rem",lineHeight:1.3,fontWeight:void 0},h2:{fontSize:"1.625rem",lineHeight:1.35,fontWeight:void 0},h3:{fontSize:"1.375rem",lineHeight:1.4,fontWeight:void 0},h4:{fontSize:"1.125rem",lineHeight:1.45,fontWeight:void 0},h5:{fontSize:"1rem",lineHeight:1.5,fontWeight:void 0},h6:{fontSize:"0.875rem",lineHeight:1.5,fontWeight:void 0}}},other:{},components:{},activeStyles:{transform:"translateY(0.0625rem)"},datesLocale:"en",globalStyles:void 0,focusRingStyles:{styles:r=>({outlineOffset:"0.125rem",outline:`0.125rem solid ${r.colors[r.primaryColor][r.colorScheme==="dark"?7:5]}`}),resetStyles:()=>({outline:"none"}),inputStyles:r=>({outline:"none",borderColor:r.colors[r.primaryColor][typeof r.primaryShade=="object"?r.primaryShade[r.colorScheme]:r.primaryShade]})}},E=U($r);var Pr=Object.defineProperty,wr=Object.defineProperties,Cr=Object.getOwnPropertyDescriptors,H=Object.getOwnPropertySymbols,Er=Object.prototype.hasOwnProperty,Or=Object.prototype.propertyIsEnumerable,M=(r,e,o)=>e in r?Pr(r,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[e]=o,xr=(r,e)=>{for(var o in e||(e={}))Er.call(e,o)&&M(r,o,e[o]);if(H)for(var o of H(e))Or.call(e,o)&&M(r,o,e[o]);return r},zr=(r,e)=>wr(r,Cr(e));function jr({theme:r}){return d.createElement(_,{styles:{"*, *::before, *::after":{boxSizing:"border-box"},html:{colorScheme:r.colorScheme==="dark"?"dark":"light"},body:zr(xr({},r.fn.fontStyles()),{backgroundColor:r.colorScheme==="dark"?r.colors.dark[7]:r.white,color:r.colorScheme==="dark"?r.colors.dark[0]:r.black,lineHeight:r.lineHeight,fontSize:r.fontSizes.md,WebkitFontSmoothing:"antialiased",MozOsxFontSmoothing:"grayscale"})}})}function b(r,e,o,n=u){Object.keys(e).forEach(a=>{r[`--mantine-${o}-${a}`]=n(e[a])})}function Rr({theme:r}){const e={"--mantine-color-white":r.white,"--mantine-color-black":r.black,"--mantine-transition-timing-function":r.transitionTimingFunction,"--mantine-line-height":`${r.lineHeight}`,"--mantine-font-family":r.fontFamily,"--mantine-font-family-monospace":r.fontFamilyMonospace,"--mantine-font-family-headings":r.headings.fontFamily,"--mantine-heading-font-weight":`${r.headings.fontWeight}`};b(e,r.shadows,"shadow"),b(e,r.fontSizes,"font-size"),b(e,r.radius,"radius"),b(e,r.spacing,"spacing"),b(e,r.breakpoints,"breakpoints",k),Object.keys(r.colors).forEach(n=>{r.colors[n].forEach((a,t)=>{e[`--mantine-color-${n}-${t}`]=a})});const o=r.headings.sizes;return Object.keys(o).forEach(n=>{e[`--mantine-${n}-font-size`]=o[n].fontSize,e[`--mantine-${n}-line-height`]=`${o[n].lineHeight}`}),d.createElement(_,{styles:{":root":e}})}var Fr=Object.defineProperty,Hr=Object.defineProperties,Mr=Object.getOwnPropertyDescriptors,I=Object.getOwnPropertySymbols,Ir=Object.prototype.hasOwnProperty,Wr=Object.prototype.propertyIsEnumerable,W=(r,e,o)=>e in r?Fr(r,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[e]=o,c=(r,e)=>{for(var o in e||(e={}))Ir.call(e,o)&&W(r,o,e[o]);if(I)for(var o of I(e))Wr.call(e,o)&&W(r,o,e[o]);return r},P=(r,e)=>Hr(r,Mr(e));function Ar(r,e){var o;if(!e)return r;const n=Object.keys(r).reduce((a,t)=>{if(t==="headings"&&e.headings){const i=e.headings.sizes?Object.keys(r.headings.sizes).reduce((s,l)=>(s[l]=c(c({},r.headings.sizes[l]),e.headings.sizes[l]),s),{}):r.headings.sizes;return P(c({},a),{headings:P(c(c({},r.headings),e.headings),{sizes:i})})}if(t==="breakpoints"&&e.breakpoints){const i=c(c({},r.breakpoints),e.breakpoints);return P(c({},a),{breakpoints:Object.fromEntries(Object.entries(i).sort((s,l)=>S(s[1])-S(l[1])))})}return a[t]=typeof e[t]=="object"?c(c({},r[t]),e[t]):typeof e[t]=="number"||typeof e[t]=="boolean"||typeof e[t]=="function"?e[t]:e[t]||r[t],a},{});if(e!=null&&e.fontFamily&&!((o=e==null?void 0:e.headings)!=null&&o.fontFamily)&&(n.headings.fontFamily=e.fontFamily),!(n.primaryColor in n.colors))throw new Error("MantineProvider: Invalid theme.primaryColor, it accepts only key of theme.colors, learn more – https://mantine.dev/theming/colors/#primary-color");return n}function Nr(r,e){return U(Ar(r,e))}function Tr(r){return Object.keys(r).reduce((e,o)=>(r[o]!==void 0&&(e[o]=r[o]),e),{})}const Gr={html:{fontFamily:"sans-serif",lineHeight:"1.15",textSizeAdjust:"100%"},body:{margin:0},"article, aside, footer, header, nav, section, figcaption, figure, main":{display:"block"},h1:{fontSize:"2em"},hr:{boxSizing:"content-box",height:0,overflow:"visible"},pre:{fontFamily:"monospace, monospace",fontSize:"1em"},a:{background:"transparent",textDecorationSkip:"objects"},"a:active, a:hover":{outlineWidth:0},"abbr[title]":{borderBottom:"none",textDecoration:"underline"},"b, strong":{fontWeight:"bolder"},"code, kbp, samp":{fontFamily:"monospace, monospace",fontSize:"1em"},dfn:{fontStyle:"italic"},mark:{backgroundColor:"#ff0",color:"#000"},small:{fontSize:"80%"},"sub, sup":{fontSize:"75%",lineHeight:0,position:"relative",verticalAlign:"baseline"},sup:{top:"-0.5em"},sub:{bottom:"-0.25em"},"audio, video":{display:"inline-block"},"audio:not([controls])":{display:"none",height:0},img:{borderStyle:"none",verticalAlign:"middle"},"svg:not(:root)":{overflow:"hidden"},"button, input, optgroup, select, textarea":{fontFamily:"sans-serif",fontSize:"100%",lineHeight:"1.15",margin:0},"button, input":{overflow:"visible"},"button, select":{textTransform:"none"},"button, [type=reset], [type=submit]":{WebkitAppearance:"button"},"button::-moz-focus-inner, [type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner":{borderStyle:"none",padding:0},"button:-moz-focusring, [type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring":{outline:`${u(1)} dotted ButtonText`},legend:{boxSizing:"border-box",color:"inherit",display:"table",maxWidth:"100%",padding:0,whiteSpace:"normal"},progress:{display:"inline-block",verticalAlign:"baseline"},textarea:{overflow:"auto"},"[type=checkbox], [type=radio]":{boxSizing:"border-box",padding:0},"[type=number]::-webkit-inner-spin-button, [type=number]::-webkit-outer-spin-button":{height:"auto"},"[type=search]":{appearance:"none"},"[type=search]::-webkit-search-cancel-button, [type=search]::-webkit-search-decoration":{appearance:"none"},"::-webkit-file-upload-button":{appearance:"button",font:"inherit"},"details, menu":{display:"block"},summary:{display:"list-item"},canvas:{display:"inline-block"},template:{display:"none"}};function Dr(){return d.createElement(_,{styles:Gr})}var Vr=Object.defineProperty,A=Object.getOwnPropertySymbols,Ur=Object.prototype.hasOwnProperty,Lr=Object.prototype.propertyIsEnumerable,N=(r,e,o)=>e in r?Vr(r,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):r[e]=o,m=(r,e)=>{for(var o in e||(e={}))Ur.call(e,o)&&N(r,o,e[o]);if(A)for(var o of A(e))Lr.call(e,o)&&N(r,o,e[o]);return r};const v=h.createContext({theme:E});function L(){var r;return((r=h.useContext(v))==null?void 0:r.theme)||E}function Yr(r){const e=L(),o=n=>{var a,t,i,s;return{styles:((a=e.components[n])==null?void 0:a.styles)||{},classNames:((t=e.components[n])==null?void 0:t.classNames)||{},variants:(i=e.components[n])==null?void 0:i.variants,sizes:(s=e.components[n])==null?void 0:s.sizes}};return Array.isArray(r)?r.map(o):[o(r)]}function Jr(){var r;return(r=h.useContext(v))==null?void 0:r.emotionCache}function Kr(r,e,o){var n;const a=L(),t=(n=a.components[r])==null?void 0:n.defaultProps,i=typeof t=="function"?t(a):t;return m(m(m({},e),i),Tr(o))}function Xr({theme:r,emotionCache:e,withNormalizeCSS:o=!1,withGlobalStyles:n=!1,withCSSVariables:a=!1,inherit:t=!1,children:i}){const s=h.useContext(v),l=Nr(E,t?m(m({},s.theme),r):r);return d.createElement(X,{theme:l},d.createElement(v.Provider,{value:{theme:l,emotionCache:e}},o&&d.createElement(Dr,null),n&&d.createElement(jr,{theme:l}),a&&d.createElement(Rr,{theme:l}),typeof l.globalStyles=="function"&&d.createElement(_,{styles:l.globalStyles(l)}),i))}Xr.displayName="@mantine/core/MantineProvider";export{Xr as M,L as a,Yr as b,V as c,Kr as d,Tr as f,S as g,u as r,Jr as u}; diff --git a/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-3cf60466.js b/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-3cf60466.js new file mode 100644 index 0000000000..849cee8085 --- /dev/null +++ b/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-3cf60466.js @@ -0,0 +1,302 @@ +import{v as S,ga as Ze,q as k,M as Et,gb as Dt,ae as bt,ag as c,gc as v,gd as jt,ge as a,gf as Rt,gg as p,gh as vt,gi as Ht,gj as Wt,aX as Vt,gk as Lt,Z as Ot,gl as qt,gm as Nt,gn as Gt,go as Ut,aV as Xt}from"./index-078526aa.js";import{M as Yt}from"./MantineProvider-8988d217.js";var ut=String.raw,ft=ut` + :root, + :host { + --chakra-vh: 100vh; + } + + @supports (height: -webkit-fill-available) { + :root, + :host { + --chakra-vh: -webkit-fill-available; + } + } + + @supports (height: -moz-fill-available) { + :root, + :host { + --chakra-vh: -moz-fill-available; + } + } + + @supports (height: 100dvh) { + :root, + :host { + --chakra-vh: 100dvh; + } + } +`,Kt=()=>S.jsx(Ze,{styles:ft}),Zt=({scope:e=""})=>S.jsx(Ze,{styles:ut` + html { + line-height: 1.5; + -webkit-text-size-adjust: 100%; + font-family: system-ui, sans-serif; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + -moz-osx-font-smoothing: grayscale; + touch-action: manipulation; + } + + body { + position: relative; + min-height: 100%; + margin: 0; + font-feature-settings: "kern"; + } + + ${e} :where(*, *::before, *::after) { + border-width: 0; + border-style: solid; + box-sizing: border-box; + word-wrap: break-word; + } + + main { + display: block; + } + + ${e} hr { + border-top-width: 1px; + box-sizing: content-box; + height: 0; + overflow: visible; + } + + ${e} :where(pre, code, kbd,samp) { + font-family: SFMono-Regular, Menlo, Monaco, Consolas, monospace; + font-size: 1em; + } + + ${e} a { + background-color: transparent; + color: inherit; + text-decoration: inherit; + } + + ${e} abbr[title] { + border-bottom: none; + text-decoration: underline; + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + } + + ${e} :where(b, strong) { + font-weight: bold; + } + + ${e} small { + font-size: 80%; + } + + ${e} :where(sub,sup) { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + ${e} sub { + bottom: -0.25em; + } + + ${e} sup { + top: -0.5em; + } + + ${e} img { + border-style: none; + } + + ${e} :where(button, input, optgroup, select, textarea) { + font-family: inherit; + font-size: 100%; + line-height: 1.15; + margin: 0; + } + + ${e} :where(button, input) { + overflow: visible; + } + + ${e} :where(button, select) { + text-transform: none; + } + + ${e} :where( + button::-moz-focus-inner, + [type="button"]::-moz-focus-inner, + [type="reset"]::-moz-focus-inner, + [type="submit"]::-moz-focus-inner + ) { + border-style: none; + padding: 0; + } + + ${e} fieldset { + padding: 0.35em 0.75em 0.625em; + } + + ${e} legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space: normal; + } + + ${e} progress { + vertical-align: baseline; + } + + ${e} textarea { + overflow: auto; + } + + ${e} :where([type="checkbox"], [type="radio"]) { + box-sizing: border-box; + padding: 0; + } + + ${e} input[type="number"]::-webkit-inner-spin-button, + ${e} input[type="number"]::-webkit-outer-spin-button { + -webkit-appearance: none !important; + } + + ${e} input[type="number"] { + -moz-appearance: textfield; + } + + ${e} input[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; + } + + ${e} input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none !important; + } + + ${e} ::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; + } + + ${e} details { + display: block; + } + + ${e} summary { + display: list-item; + } + + template { + display: none; + } + + [hidden] { + display: none !important; + } + + ${e} :where( + blockquote, + dl, + dd, + h1, + h2, + h3, + h4, + h5, + h6, + hr, + figure, + p, + pre + ) { + margin: 0; + } + + ${e} button { + background: transparent; + padding: 0; + } + + ${e} fieldset { + margin: 0; + padding: 0; + } + + ${e} :where(ol, ul) { + margin: 0; + padding: 0; + } + + ${e} textarea { + resize: vertical; + } + + ${e} :where(button, [role="button"]) { + cursor: pointer; + } + + ${e} button::-moz-focus-inner { + border: 0 !important; + } + + ${e} table { + border-collapse: collapse; + } + + ${e} :where(h1, h2, h3, h4, h5, h6) { + font-size: inherit; + font-weight: inherit; + } + + ${e} :where(button, input, optgroup, select, textarea) { + padding: 0; + line-height: inherit; + color: inherit; + } + + ${e} :where(img, svg, video, canvas, audio, iframe, embed, object) { + display: block; + } + + ${e} :where(img, video) { + max-width: 100%; + height: auto; + } + + [data-js-focus-visible] + :focus:not([data-focus-visible-added]):not( + [data-focus-visible-disabled] + ) { + outline: none; + box-shadow: none; + } + + ${e} select::-ms-expand { + display: none; + } + + ${ft} + `}),ze={light:"chakra-ui-light",dark:"chakra-ui-dark"};function Jt(e={}){const{preventTransition:r=!0}=e,t={setDataset:n=>{const i=r?t.preventTransition():void 0;document.documentElement.dataset.theme=n,document.documentElement.style.colorScheme=n,i==null||i()},setClassName(n){document.body.classList.add(n?ze.dark:ze.light),document.body.classList.remove(n?ze.light:ze.dark)},query(){return window.matchMedia("(prefers-color-scheme: dark)")},getSystemTheme(n){var i;return((i=t.query().matches)!=null?i:n==="dark")?"dark":"light"},addListener(n){const i=t.query(),l=s=>{n(s.matches?"dark":"light")};return typeof i.addListener=="function"?i.addListener(l):i.addEventListener("change",l),()=>{typeof i.removeListener=="function"?i.removeListener(l):i.removeEventListener("change",l)}},preventTransition(){const n=document.createElement("style");return n.appendChild(document.createTextNode("*{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),document.head.appendChild(n),()=>{window.getComputedStyle(document.body),requestAnimationFrame(()=>{requestAnimationFrame(()=>{document.head.removeChild(n)})})}}};return t}var Qt="chakra-ui-color-mode";function mt(e){return{ssr:!1,type:"localStorage",get(r){if(!(globalThis!=null&&globalThis.document))return r;let t;try{t=localStorage.getItem(e)||r}catch{}return t||r},set(r){try{localStorage.setItem(e,r)}catch{}}}}var ea=mt(Qt),Ar=()=>{};function Pr(e,r){return e.type==="cookie"&&e.ssr?e.get(r):r}function ht(e){const{value:r,children:t,options:{useSystemColorMode:n,initialColorMode:i,disableTransitionOnChange:l}={},colorModeManager:s=ea}=e,d=i==="dark"?"dark":"light",[b,$]=k.useState(()=>Pr(s,d)),[u,m]=k.useState(()=>Pr(s)),{getSystemTheme:_,setClassName:I,setDataset:ke,addListener:zr}=k.useMemo(()=>Jt({preventTransition:l}),[l]),_e=i==="system"&&!b?u:b,M=k.useCallback(oe=>{const we=oe==="system"?_():oe;$(we),I(we==="dark"),ke(we),s.set(we)},[s,_,I,ke]);Et(()=>{i==="system"&&m(_())},[]),k.useEffect(()=>{const oe=s.get();if(oe){M(oe);return}if(i==="system"){M("system");return}M(d)},[s,d,i,M]);const Cr=k.useCallback(()=>{M(_e==="dark"?"light":"dark")},[_e,M]);k.useEffect(()=>{if(n)return zr(M)},[n,zr,M]);const Bt=k.useMemo(()=>({colorMode:r??_e,toggleColorMode:r?Ar:Cr,setColorMode:r?Ar:M,forced:r!==void 0}),[_e,Cr,M,r]);return S.jsx(Dt.Provider,{value:Bt,children:t})}ht.displayName="ColorModeProvider";var ra=["borders","breakpoints","colors","components","config","direction","fonts","fontSizes","fontWeights","letterSpacings","lineHeights","radii","shadows","sizes","space","styles","transition","zIndices"];function ta(e){return bt(e)?ra.every(r=>Object.prototype.hasOwnProperty.call(e,r)):!1}var aa={common:"background-color, border-color, color, fill, stroke, opacity, box-shadow, transform",colors:"background-color, border-color, color, fill, stroke",dimensions:"width, height",position:"left, right, top, bottom",background:"background-color, background-image, background-position"},oa={"ease-in":"cubic-bezier(0.4, 0, 1, 1)","ease-out":"cubic-bezier(0, 0, 0.2, 1)","ease-in-out":"cubic-bezier(0.4, 0, 0.2, 1)"},na={"ultra-fast":"50ms",faster:"100ms",fast:"150ms",normal:"200ms",slow:"300ms",slower:"400ms","ultra-slow":"500ms"},ia={property:aa,easing:oa,duration:na},la=ia,sa={hide:-1,auto:"auto",base:0,docked:10,dropdown:1e3,sticky:1100,banner:1200,overlay:1300,modal:1400,popover:1500,skipLink:1600,toast:1700,tooltip:1800},da=sa,ca={none:0,"1px":"1px solid","2px":"2px solid","4px":"4px solid","8px":"8px solid"},ba=ca,va={base:"0em",sm:"30em",md:"48em",lg:"62em",xl:"80em","2xl":"96em"},ua=va,fa={transparent:"transparent",current:"currentColor",black:"#000000",white:"#FFFFFF",whiteAlpha:{50:"rgba(255, 255, 255, 0.04)",100:"rgba(255, 255, 255, 0.06)",200:"rgba(255, 255, 255, 0.08)",300:"rgba(255, 255, 255, 0.16)",400:"rgba(255, 255, 255, 0.24)",500:"rgba(255, 255, 255, 0.36)",600:"rgba(255, 255, 255, 0.48)",700:"rgba(255, 255, 255, 0.64)",800:"rgba(255, 255, 255, 0.80)",900:"rgba(255, 255, 255, 0.92)"},blackAlpha:{50:"rgba(0, 0, 0, 0.04)",100:"rgba(0, 0, 0, 0.06)",200:"rgba(0, 0, 0, 0.08)",300:"rgba(0, 0, 0, 0.16)",400:"rgba(0, 0, 0, 0.24)",500:"rgba(0, 0, 0, 0.36)",600:"rgba(0, 0, 0, 0.48)",700:"rgba(0, 0, 0, 0.64)",800:"rgba(0, 0, 0, 0.80)",900:"rgba(0, 0, 0, 0.92)"},gray:{50:"#F7FAFC",100:"#EDF2F7",200:"#E2E8F0",300:"#CBD5E0",400:"#A0AEC0",500:"#718096",600:"#4A5568",700:"#2D3748",800:"#1A202C",900:"#171923"},red:{50:"#FFF5F5",100:"#FED7D7",200:"#FEB2B2",300:"#FC8181",400:"#F56565",500:"#E53E3E",600:"#C53030",700:"#9B2C2C",800:"#822727",900:"#63171B"},orange:{50:"#FFFAF0",100:"#FEEBC8",200:"#FBD38D",300:"#F6AD55",400:"#ED8936",500:"#DD6B20",600:"#C05621",700:"#9C4221",800:"#7B341E",900:"#652B19"},yellow:{50:"#FFFFF0",100:"#FEFCBF",200:"#FAF089",300:"#F6E05E",400:"#ECC94B",500:"#D69E2E",600:"#B7791F",700:"#975A16",800:"#744210",900:"#5F370E"},green:{50:"#F0FFF4",100:"#C6F6D5",200:"#9AE6B4",300:"#68D391",400:"#48BB78",500:"#38A169",600:"#2F855A",700:"#276749",800:"#22543D",900:"#1C4532"},teal:{50:"#E6FFFA",100:"#B2F5EA",200:"#81E6D9",300:"#4FD1C5",400:"#38B2AC",500:"#319795",600:"#2C7A7B",700:"#285E61",800:"#234E52",900:"#1D4044"},blue:{50:"#ebf8ff",100:"#bee3f8",200:"#90cdf4",300:"#63b3ed",400:"#4299e1",500:"#3182ce",600:"#2b6cb0",700:"#2c5282",800:"#2a4365",900:"#1A365D"},cyan:{50:"#EDFDFD",100:"#C4F1F9",200:"#9DECF9",300:"#76E4F7",400:"#0BC5EA",500:"#00B5D8",600:"#00A3C4",700:"#0987A0",800:"#086F83",900:"#065666"},purple:{50:"#FAF5FF",100:"#E9D8FD",200:"#D6BCFA",300:"#B794F4",400:"#9F7AEA",500:"#805AD5",600:"#6B46C1",700:"#553C9A",800:"#44337A",900:"#322659"},pink:{50:"#FFF5F7",100:"#FED7E2",200:"#FBB6CE",300:"#F687B3",400:"#ED64A6",500:"#D53F8C",600:"#B83280",700:"#97266D",800:"#702459",900:"#521B41"},linkedin:{50:"#E8F4F9",100:"#CFEDFB",200:"#9BDAF3",300:"#68C7EC",400:"#34B3E4",500:"#00A0DC",600:"#008CC9",700:"#0077B5",800:"#005E93",900:"#004471"},facebook:{50:"#E8F4F9",100:"#D9DEE9",200:"#B7C2DA",300:"#6482C0",400:"#4267B2",500:"#385898",600:"#314E89",700:"#29487D",800:"#223B67",900:"#1E355B"},messenger:{50:"#D0E6FF",100:"#B9DAFF",200:"#A2CDFF",300:"#7AB8FF",400:"#2E90FF",500:"#0078FF",600:"#0063D1",700:"#0052AC",800:"#003C7E",900:"#002C5C"},whatsapp:{50:"#dffeec",100:"#b9f5d0",200:"#90edb3",300:"#65e495",400:"#3cdd78",500:"#22c35e",600:"#179848",700:"#0c6c33",800:"#01421c",900:"#001803"},twitter:{50:"#E5F4FD",100:"#C8E9FB",200:"#A8DCFA",300:"#83CDF7",400:"#57BBF5",500:"#1DA1F2",600:"#1A94DA",700:"#1681BF",800:"#136B9E",900:"#0D4D71"},telegram:{50:"#E3F2F9",100:"#C5E4F3",200:"#A2D4EC",300:"#7AC1E4",400:"#47A9DA",500:"#0088CC",600:"#007AB8",700:"#006BA1",800:"#005885",900:"#003F5E"}},ma=fa,ha={none:"0",sm:"0.125rem",base:"0.25rem",md:"0.375rem",lg:"0.5rem",xl:"0.75rem","2xl":"1rem","3xl":"1.5rem",full:"9999px"},ga=ha,ya={xs:"0 0 0 1px rgba(0, 0, 0, 0.05)",sm:"0 1px 2px 0 rgba(0, 0, 0, 0.05)",base:"0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06)",md:"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)",lg:"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)",xl:"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)","2xl":"0 25px 50px -12px rgba(0, 0, 0, 0.25)",outline:"0 0 0 3px rgba(66, 153, 225, 0.6)",inner:"inset 0 2px 4px 0 rgba(0,0,0,0.06)",none:"none","dark-lg":"rgba(0, 0, 0, 0.1) 0px 0px 0px 1px, rgba(0, 0, 0, 0.2) 0px 5px 10px, rgba(0, 0, 0, 0.4) 0px 15px 40px"},pa=ya,Sa={none:0,sm:"4px",base:"8px",md:"12px",lg:"16px",xl:"24px","2xl":"40px","3xl":"64px"},xa=Sa,$a={letterSpacings:{tighter:"-0.05em",tight:"-0.025em",normal:"0",wide:"0.025em",wider:"0.05em",widest:"0.1em"},lineHeights:{normal:"normal",none:1,shorter:1.25,short:1.375,base:1.5,tall:1.625,taller:"2",3:".75rem",4:"1rem",5:"1.25rem",6:"1.5rem",7:"1.75rem",8:"2rem",9:"2.25rem",10:"2.5rem"},fontWeights:{hairline:100,thin:200,light:300,normal:400,medium:500,semibold:600,bold:700,extrabold:800,black:900},fonts:{heading:'-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',body:'-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',mono:'SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace'},fontSizes:{"3xs":"0.45rem","2xs":"0.625rem",xs:"0.75rem",sm:"0.875rem",md:"1rem",lg:"1.125rem",xl:"1.25rem","2xl":"1.5rem","3xl":"1.875rem","4xl":"2.25rem","5xl":"3rem","6xl":"3.75rem","7xl":"4.5rem","8xl":"6rem","9xl":"8rem"}},gt=$a,yt={px:"1px",.5:"0.125rem",1:"0.25rem",1.5:"0.375rem",2:"0.5rem",2.5:"0.625rem",3:"0.75rem",3.5:"0.875rem",4:"1rem",5:"1.25rem",6:"1.5rem",7:"1.75rem",8:"2rem",9:"2.25rem",10:"2.5rem",12:"3rem",14:"3.5rem",16:"4rem",20:"5rem",24:"6rem",28:"7rem",32:"8rem",36:"9rem",40:"10rem",44:"11rem",48:"12rem",52:"13rem",56:"14rem",60:"15rem",64:"16rem",72:"18rem",80:"20rem",96:"24rem"},ka={max:"max-content",min:"min-content",full:"100%","3xs":"14rem","2xs":"16rem",xs:"20rem",sm:"24rem",md:"28rem",lg:"32rem",xl:"36rem","2xl":"42rem","3xl":"48rem","4xl":"56rem","5xl":"64rem","6xl":"72rem","7xl":"80rem","8xl":"90rem",prose:"60ch"},_a={sm:"640px",md:"768px",lg:"1024px",xl:"1280px"},wa={...yt,...ka,container:_a},pt=wa,za={breakpoints:ua,zIndices:da,radii:ga,blur:xa,colors:ma,...gt,sizes:pt,shadows:pa,space:yt,borders:ba,transition:la},{defineMultiStyleConfig:Ca,definePartsStyle:se}=v(["stepper","step","title","description","indicator","separator","icon","number"]),D=c("stepper-indicator-size"),K=c("stepper-icon-size"),Z=c("stepper-title-font-size"),de=c("stepper-description-font-size"),ne=c("stepper-accent-color"),Aa=se(({colorScheme:e})=>({stepper:{display:"flex",justifyContent:"space-between",gap:"4","&[data-orientation=vertical]":{flexDirection:"column",alignItems:"flex-start"},"&[data-orientation=horizontal]":{flexDirection:"row",alignItems:"center"},[ne.variable]:`colors.${e}.500`,_dark:{[ne.variable]:`colors.${e}.200`}},title:{fontSize:Z.reference,fontWeight:"medium"},description:{fontSize:de.reference,color:"chakra-subtle-text"},number:{fontSize:Z.reference},step:{flexShrink:0,position:"relative",display:"flex",gap:"2","&[data-orientation=horizontal]":{alignItems:"center"},flex:"1","&:last-of-type:not([data-stretch])":{flex:"initial"}},icon:{flexShrink:0,width:K.reference,height:K.reference},indicator:{flexShrink:0,borderRadius:"full",width:D.reference,height:D.reference,display:"flex",justifyContent:"center",alignItems:"center","&[data-status=active]":{borderWidth:"2px",borderColor:ne.reference},"&[data-status=complete]":{bg:ne.reference,color:"chakra-inverse-text"},"&[data-status=incomplete]":{borderWidth:"2px"}},separator:{bg:"chakra-border-color",flex:"1","&[data-status=complete]":{bg:ne.reference},"&[data-orientation=horizontal]":{width:"100%",height:"2px",marginStart:"2"},"&[data-orientation=vertical]":{width:"2px",position:"absolute",height:"100%",maxHeight:`calc(100% - ${D.reference} - 8px)`,top:`calc(${D.reference} + 4px)`,insetStart:`calc(${D.reference} / 2 - 1px)`}}})),Pa=Ca({baseStyle:Aa,sizes:{xs:se({stepper:{[D.variable]:"sizes.4",[K.variable]:"sizes.3",[Z.variable]:"fontSizes.xs",[de.variable]:"fontSizes.xs"}}),sm:se({stepper:{[D.variable]:"sizes.6",[K.variable]:"sizes.4",[Z.variable]:"fontSizes.sm",[de.variable]:"fontSizes.xs"}}),md:se({stepper:{[D.variable]:"sizes.8",[K.variable]:"sizes.5",[Z.variable]:"fontSizes.md",[de.variable]:"fontSizes.sm"}}),lg:se({stepper:{[D.variable]:"sizes.10",[K.variable]:"sizes.6",[Z.variable]:"fontSizes.lg",[de.variable]:"fontSizes.md"}})},defaultProps:{size:"md",colorScheme:"blue"}});function h(e,r={}){let t=!1;function n(){if(!t){t=!0;return}throw new Error("[anatomy] .part(...) should only be called once. Did you mean to use .extend(...) ?")}function i(...u){n();for(const m of u)r[m]=b(m);return h(e,r)}function l(...u){for(const m of u)m in r||(r[m]=b(m));return h(e,r)}function s(){return Object.fromEntries(Object.entries(r).map(([m,_])=>[m,_.selector]))}function d(){return Object.fromEntries(Object.entries(r).map(([m,_])=>[m,_.className]))}function b(u){const I=`chakra-${(["container","root"].includes(u??"")?[e]:[e,u]).filter(Boolean).join("__")}`;return{className:I,selector:`.${I}`,toString:()=>u}}return{parts:i,toPart:b,extend:l,selectors:s,classnames:d,get keys(){return Object.keys(r)},__type:{}}}var Ta=h("accordion").parts("root","container","button","panel").extend("icon"),Fa=h("alert").parts("title","description","container").extend("icon","spinner"),Ia=h("avatar").parts("label","badge","container").extend("excessLabel","group"),Ma=h("breadcrumb").parts("link","item","container").extend("separator");h("button").parts();var Ba=h("checkbox").parts("control","icon","container").extend("label");h("progress").parts("track","filledTrack").extend("label");var Ea=h("drawer").parts("overlay","dialogContainer","dialog").extend("header","closeButton","body","footer"),Da=h("editable").parts("preview","input","textarea"),ja=h("form").parts("container","requiredIndicator","helperText"),Ra=h("formError").parts("text","icon"),Ha=h("input").parts("addon","field","element"),Wa=h("list").parts("container","item","icon"),Va=h("menu").parts("button","list","item").extend("groupTitle","command","divider"),La=h("modal").parts("overlay","dialogContainer","dialog").extend("header","closeButton","body","footer"),Oa=h("numberinput").parts("root","field","stepperGroup","stepper");h("pininput").parts("field");var qa=h("popover").parts("content","header","body","footer").extend("popper","arrow","closeButton"),Na=h("progress").parts("label","filledTrack","track"),Ga=h("radio").parts("container","control","label"),Ua=h("select").parts("field","icon"),Xa=h("slider").parts("container","track","thumb","filledTrack","mark"),Ya=h("stat").parts("container","label","helpText","number","icon"),Ka=h("switch").parts("container","track","thumb"),Za=h("table").parts("table","thead","tbody","tr","th","td","tfoot","caption"),Ja=h("tabs").parts("root","tab","tablist","tabpanel","tabpanels","indicator"),Qa=h("tag").parts("container","label","closeButton"),eo=h("card").parts("container","header","body","footer");function N(e,r,t){return Math.min(Math.max(e,t),r)}class ro extends Error{constructor(r){super(`Failed to parse color: "${r}"`)}}var ce=ro;function xr(e){if(typeof e!="string")throw new ce(e);if(e.trim().toLowerCase()==="transparent")return[0,0,0,0];let r=e.trim();r=co.test(e)?oo(e):e;const t=no.exec(r);if(t){const s=Array.from(t).slice(1);return[...s.slice(0,3).map(d=>parseInt(ye(d,2),16)),parseInt(ye(s[3]||"f",2),16)/255]}const n=io.exec(r);if(n){const s=Array.from(n).slice(1);return[...s.slice(0,3).map(d=>parseInt(d,16)),parseInt(s[3]||"ff",16)/255]}const i=lo.exec(r);if(i){const s=Array.from(i).slice(1);return[...s.slice(0,3).map(d=>parseInt(d,10)),parseFloat(s[3]||"1")]}const l=so.exec(r);if(l){const[s,d,b,$]=Array.from(l).slice(1).map(parseFloat);if(N(0,100,d)!==d)throw new ce(e);if(N(0,100,b)!==b)throw new ce(e);return[...bo(s,d,b),Number.isNaN($)?1:$]}throw new ce(e)}function to(e){let r=5381,t=e.length;for(;t;)r=r*33^e.charCodeAt(--t);return(r>>>0)%2341}const Tr=e=>parseInt(e.replace(/_/g,""),36),ao="1q29ehhb 1n09sgk7 1kl1ekf_ _yl4zsno 16z9eiv3 1p29lhp8 _bd9zg04 17u0____ _iw9zhe5 _to73___ _r45e31e _7l6g016 _jh8ouiv _zn3qba8 1jy4zshs 11u87k0u 1ro9yvyo 1aj3xael 1gz9zjz0 _3w8l4xo 1bf1ekf_ _ke3v___ _4rrkb__ 13j776yz _646mbhl _nrjr4__ _le6mbhl 1n37ehkb _m75f91n _qj3bzfz 1939yygw 11i5z6x8 _1k5f8xs 1509441m 15t5lwgf _ae2th1n _tg1ugcv 1lp1ugcv 16e14up_ _h55rw7n _ny9yavn _7a11xb_ 1ih442g9 _pv442g9 1mv16xof 14e6y7tu 1oo9zkds 17d1cisi _4v9y70f _y98m8kc 1019pq0v 12o9zda8 _348j4f4 1et50i2o _8epa8__ _ts6senj 1o350i2o 1mi9eiuo 1259yrp0 1ln80gnw _632xcoy 1cn9zldc _f29edu4 1n490c8q _9f9ziet 1b94vk74 _m49zkct 1kz6s73a 1eu9dtog _q58s1rz 1dy9sjiq __u89jo3 _aj5nkwg _ld89jo3 13h9z6wx _qa9z2ii _l119xgq _bs5arju 1hj4nwk9 1qt4nwk9 1ge6wau6 14j9zlcw 11p1edc_ _ms1zcxe _439shk6 _jt9y70f _754zsow 1la40eju _oq5p___ _x279qkz 1fa5r3rv _yd2d9ip _424tcku _8y1di2_ _zi2uabw _yy7rn9h 12yz980_ __39ljp6 1b59zg0x _n39zfzp 1fy9zest _b33k___ _hp9wq92 1il50hz4 _io472ub _lj9z3eo 19z9ykg0 _8t8iu3a 12b9bl4a 1ak5yw0o _896v4ku _tb8k8lv _s59zi6t _c09ze0p 1lg80oqn 1id9z8wb _238nba5 1kq6wgdi _154zssg _tn3zk49 _da9y6tc 1sg7cv4f _r12jvtt 1gq5fmkz 1cs9rvci _lp9jn1c _xw1tdnb 13f9zje6 16f6973h _vo7ir40 _bt5arjf _rc45e4t _hr4e100 10v4e100 _hc9zke2 _w91egv_ _sj2r1kk 13c87yx8 _vqpds__ _ni8ggk8 _tj9yqfb 1ia2j4r4 _7x9b10u 1fc9ld4j 1eq9zldr _5j9lhpx _ez9zl6o _md61fzm".split(" ").reduce((e,r)=>{const t=Tr(r.substring(0,3)),n=Tr(r.substring(3)).toString(16);let i="";for(let l=0;l<6-n.length;l++)i+="0";return e[t]=`${i}${n}`,e},{});function oo(e){const r=e.toLowerCase().trim(),t=ao[to(r)];if(!t)throw new ce(e);return`#${t}`}const ye=(e,r)=>Array.from(Array(r)).map(()=>e).join(""),no=new RegExp(`^#${ye("([a-f0-9])",3)}([a-f0-9])?$`,"i"),io=new RegExp(`^#${ye("([a-f0-9]{2})",3)}([a-f0-9]{2})?$`,"i"),lo=new RegExp(`^rgba?\\(\\s*(\\d+)\\s*${ye(",\\s*(\\d+)\\s*",2)}(?:,\\s*([\\d.]+))?\\s*\\)$`,"i"),so=/^hsla?\(\s*([\d.]+)\s*,\s*([\d.]+)%\s*,\s*([\d.]+)%(?:\s*,\s*([\d.]+))?\s*\)$/i,co=/^[a-z]+$/i,Fr=e=>Math.round(e*255),bo=(e,r,t)=>{let n=t/100;if(r===0)return[n,n,n].map(Fr);const i=(e%360+360)%360/60,l=(1-Math.abs(2*n-1))*(r/100),s=l*(1-Math.abs(i%2-1));let d=0,b=0,$=0;i>=0&&i<1?(d=l,b=s):i>=1&&i<2?(d=s,b=l):i>=2&&i<3?(b=l,$=s):i>=3&&i<4?(b=s,$=l):i>=4&&i<5?(d=s,$=l):i>=5&&i<6&&(d=l,$=s);const u=n-l/2,m=d+u,_=b+u,I=$+u;return[m,_,I].map(Fr)};function vo(e,r,t,n){return`rgba(${N(0,255,e).toFixed()}, ${N(0,255,r).toFixed()}, ${N(0,255,t).toFixed()}, ${parseFloat(N(0,1,n).toFixed(3))})`}function uo(e,r){const[t,n,i,l]=xr(e);return vo(t,n,i,l-r)}function fo(e){const[r,t,n,i]=xr(e);let l=s=>{const d=N(0,255,s).toString(16);return d.length===1?`0${d}`:d};return`#${l(r)}${l(t)}${l(n)}${i<1?l(Math.round(i*255)):""}`}function mo(e,r,t,n,i){for(r=r.split?r.split("."):r,n=0;nObject.keys(e).length===0,Ue=(e,r,t)=>{const n=mo(e,`colors.${r}`,r);try{return fo(n),n}catch{return t??"#000000"}},F=(e,r,t)=>{var n;return(n=jt(e,"colors",r))!=null?n:t},go=e=>{const[r,t,n]=xr(e);return(r*299+t*587+n*114)/1e3},yo=e=>r=>{const t=Ue(r,e);return go(t)<128?"dark":"light"},po=e=>r=>yo(e)(r)==="dark",te=(e,r)=>t=>{const n=Ue(t,e);return uo(n,1-r)};function Ir(e="1rem",r="rgba(255, 255, 255, 0.15)"){return{backgroundImage:`linear-gradient( + 45deg, + ${r} 25%, + transparent 25%, + transparent 50%, + ${r} 50%, + ${r} 75%, + transparent 75%, + transparent + )`,backgroundSize:`${e} ${e}`}}var So=()=>`#${Math.floor(Math.random()*16777215).toString(16).padEnd(6,"0")}`;function xo(e){const r=So();return!e||ho(e)?r:e.string&&e.colors?ko(e.string,e.colors):e.string&&!e.colors?$o(e.string):e.colors&&!e.string?_o(e.colors):r}function $o(e){let r=0;if(e.length===0)return r.toString();for(let n=0;n>n*8&255;t+=`00${i.toString(16)}`.substr(-2)}return t}function ko(e,r){let t=0;if(e.length===0)return r[0];for(let n=0;nt.colorMode==="dark"?r:e}function $r(e){const{orientation:r,vertical:t,horizontal:n}=e;return r?r==="vertical"?t:n:{}}function St(e){return bt(e)&&e.reference?e.reference:String(e)}var Je=(e,...r)=>r.map(St).join(` ${e} `).replace(/calc/g,""),Mr=(...e)=>`calc(${Je("+",...e)})`,Br=(...e)=>`calc(${Je("-",...e)})`,gr=(...e)=>`calc(${Je("*",...e)})`,Er=(...e)=>`calc(${Je("/",...e)})`,Dr=e=>{const r=St(e);return r!=null&&!Number.isNaN(parseFloat(r))?String(r).startsWith("-")?String(r).slice(1):`-${r}`:gr(r,-1)},j=Object.assign(e=>({add:(...r)=>j(Mr(e,...r)),subtract:(...r)=>j(Br(e,...r)),multiply:(...r)=>j(gr(e,...r)),divide:(...r)=>j(Er(e,...r)),negate:()=>j(Dr(e)),toString:()=>e.toString()}),{add:Mr,subtract:Br,multiply:gr,divide:Er,negate:Dr});function wo(e){return!Number.isInteger(parseFloat(e.toString()))}function zo(e,r="-"){return e.replace(/\s+/g,r)}function xt(e){const r=zo(e.toString());return r.includes("\\.")?e:wo(e)?r.replace(".","\\."):e}function Co(e,r=""){return[r,xt(e)].filter(Boolean).join("-")}function Ao(e,r){return`var(${xt(e)}${r?`, ${r}`:""})`}function Po(e,r=""){return`--${Co(e,r)}`}function y(e,r){const t=Po(e,r==null?void 0:r.prefix);return{variable:t,reference:Ao(t,To(r==null?void 0:r.fallback))}}function To(e){return typeof e=="string"?e:e==null?void 0:e.reference}var{defineMultiStyleConfig:Fo,definePartsStyle:He}=v(Ka.keys),ue=y("switch-track-width"),G=y("switch-track-height"),rr=y("switch-track-diff"),Io=j.subtract(ue,G),yr=y("switch-thumb-x"),ie=y("switch-bg"),Mo=a(e=>{const{colorScheme:r}=e;return{borderRadius:"full",p:"0.5",width:[ue.reference],height:[G.reference],transitionProperty:"common",transitionDuration:"fast",[ie.variable]:"colors.gray.300",_dark:{[ie.variable]:"colors.whiteAlpha.400"},_focusVisible:{boxShadow:"outline"},_disabled:{opacity:.4,cursor:"not-allowed"},_checked:{[ie.variable]:`colors.${r}.500`,_dark:{[ie.variable]:`colors.${r}.200`}},bg:ie.reference}}),Bo=a({bg:"white",transitionProperty:"transform",transitionDuration:"normal",borderRadius:"inherit",width:[G.reference],height:[G.reference],_checked:{transform:`translateX(${yr.reference})`}}),Eo=He(e=>({container:{[rr.variable]:Io,[yr.variable]:rr.reference,_rtl:{[yr.variable]:j(rr).negate().toString()}},track:Mo(e),thumb:Bo})),Do={sm:He({container:{[ue.variable]:"1.375rem",[G.variable]:"sizes.3"}}),md:He({container:{[ue.variable]:"1.875rem",[G.variable]:"sizes.4"}}),lg:He({container:{[ue.variable]:"2.875rem",[G.variable]:"sizes.6"}})},jo=Fo({baseStyle:Eo,sizes:Do,defaultProps:{size:"md",colorScheme:"blue"}}),{defineMultiStyleConfig:Ro,definePartsStyle:J}=v(Za.keys),Ho=J({table:{fontVariantNumeric:"lining-nums tabular-nums",borderCollapse:"collapse",width:"full"},th:{fontFamily:"heading",fontWeight:"bold",textTransform:"uppercase",letterSpacing:"wider",textAlign:"start"},td:{textAlign:"start"},caption:{mt:4,fontFamily:"heading",textAlign:"center",fontWeight:"medium"}}),Xe=a({"&[data-is-numeric=true]":{textAlign:"end"}}),Wo=J(e=>{const{colorScheme:r}=e;return{th:{color:o("gray.600","gray.400")(e),borderBottom:"1px",borderColor:o(`${r}.100`,`${r}.700`)(e),...Xe},td:{borderBottom:"1px",borderColor:o(`${r}.100`,`${r}.700`)(e),...Xe},caption:{color:o("gray.600","gray.100")(e)},tfoot:{tr:{"&:last-of-type":{th:{borderBottomWidth:0}}}}}}),Vo=J(e=>{const{colorScheme:r}=e;return{th:{color:o("gray.600","gray.400")(e),borderBottom:"1px",borderColor:o(`${r}.100`,`${r}.700`)(e),...Xe},td:{borderBottom:"1px",borderColor:o(`${r}.100`,`${r}.700`)(e),...Xe},caption:{color:o("gray.600","gray.100")(e)},tbody:{tr:{"&:nth-of-type(odd)":{"th, td":{borderBottomWidth:"1px",borderColor:o(`${r}.100`,`${r}.700`)(e)},td:{background:o(`${r}.100`,`${r}.700`)(e)}}}},tfoot:{tr:{"&:last-of-type":{th:{borderBottomWidth:0}}}}}}),Lo={simple:Wo,striped:Vo,unstyled:a({})},Oo={sm:J({th:{px:"4",py:"1",lineHeight:"4",fontSize:"xs"},td:{px:"4",py:"2",fontSize:"sm",lineHeight:"4"},caption:{px:"4",py:"2",fontSize:"xs"}}),md:J({th:{px:"6",py:"3",lineHeight:"4",fontSize:"xs"},td:{px:"6",py:"4",lineHeight:"5"},caption:{px:"6",py:"2",fontSize:"sm"}}),lg:J({th:{px:"8",py:"4",lineHeight:"5",fontSize:"sm"},td:{px:"8",py:"5",lineHeight:"6"},caption:{px:"6",py:"2",fontSize:"md"}})},qo=Ro({baseStyle:Ho,variants:Lo,sizes:Oo,defaultProps:{variant:"simple",size:"md",colorScheme:"gray"}}),z=c("tabs-color"),T=c("tabs-bg"),Ce=c("tabs-border-color"),{defineMultiStyleConfig:No,definePartsStyle:E}=v(Ja.keys),Go=a(e=>{const{orientation:r}=e;return{display:r==="vertical"?"flex":"block"}}),Uo=a(e=>{const{isFitted:r}=e;return{flex:r?1:void 0,transitionProperty:"common",transitionDuration:"normal",_focusVisible:{zIndex:1,boxShadow:"outline"},_disabled:{cursor:"not-allowed",opacity:.4}}}),Xo=a(e=>{const{align:r="start",orientation:t}=e;return{justifyContent:{end:"flex-end",center:"center",start:"flex-start"}[r],flexDirection:t==="vertical"?"column":"row"}}),Yo=a({p:4}),Ko=E(e=>({root:Go(e),tab:Uo(e),tablist:Xo(e),tabpanel:Yo})),Zo={sm:E({tab:{py:1,px:4,fontSize:"sm"}}),md:E({tab:{fontSize:"md",py:2,px:4}}),lg:E({tab:{fontSize:"lg",py:3,px:4}})},Jo=E(e=>{const{colorScheme:r,orientation:t}=e,n=t==="vertical",i=n?"borderStart":"borderBottom",l=n?"marginStart":"marginBottom";return{tablist:{[i]:"2px solid",borderColor:"inherit"},tab:{[i]:"2px solid",borderColor:"transparent",[l]:"-2px",_selected:{[z.variable]:`colors.${r}.600`,_dark:{[z.variable]:`colors.${r}.300`},borderColor:"currentColor"},_active:{[T.variable]:"colors.gray.200",_dark:{[T.variable]:"colors.whiteAlpha.300"}},_disabled:{_active:{bg:"none"}},color:z.reference,bg:T.reference}}}),Qo=E(e=>{const{colorScheme:r}=e;return{tab:{borderTopRadius:"md",border:"1px solid",borderColor:"transparent",mb:"-1px",[Ce.variable]:"transparent",_selected:{[z.variable]:`colors.${r}.600`,[Ce.variable]:"colors.white",_dark:{[z.variable]:`colors.${r}.300`,[Ce.variable]:"colors.gray.800"},borderColor:"inherit",borderBottomColor:Ce.reference},color:z.reference},tablist:{mb:"-1px",borderBottom:"1px solid",borderColor:"inherit"}}}),en=E(e=>{const{colorScheme:r}=e;return{tab:{border:"1px solid",borderColor:"inherit",[T.variable]:"colors.gray.50",_dark:{[T.variable]:"colors.whiteAlpha.50"},mb:"-1px",_notLast:{marginEnd:"-1px"},_selected:{[T.variable]:"colors.white",[z.variable]:`colors.${r}.600`,_dark:{[T.variable]:"colors.gray.800",[z.variable]:`colors.${r}.300`},borderColor:"inherit",borderTopColor:"currentColor",borderBottomColor:"transparent"},color:z.reference,bg:T.reference},tablist:{mb:"-1px",borderBottom:"1px solid",borderColor:"inherit"}}}),rn=E(e=>{const{colorScheme:r,theme:t}=e;return{tab:{borderRadius:"full",fontWeight:"semibold",color:"gray.600",_selected:{color:Ue(t,`${r}.700`),bg:Ue(t,`${r}.100`)}}}}),tn=E(e=>{const{colorScheme:r}=e;return{tab:{borderRadius:"full",fontWeight:"semibold",[z.variable]:"colors.gray.600",_dark:{[z.variable]:"inherit"},_selected:{[z.variable]:"colors.white",[T.variable]:`colors.${r}.600`,_dark:{[z.variable]:"colors.gray.800",[T.variable]:`colors.${r}.300`}},color:z.reference,bg:T.reference}}}),an=E({}),on={line:Jo,enclosed:Qo,"enclosed-colored":en,"soft-rounded":rn,"solid-rounded":tn,unstyled:an},nn=No({baseStyle:Ko,sizes:Zo,variants:on,defaultProps:{size:"md",variant:"line",colorScheme:"blue"}}),x=Rt("badge",["bg","color","shadow"]),ln=a({px:1,textTransform:"uppercase",fontSize:"xs",borderRadius:"sm",fontWeight:"bold",bg:x.bg.reference,color:x.color.reference,boxShadow:x.shadow.reference}),sn=a(e=>{const{colorScheme:r,theme:t}=e,n=te(`${r}.500`,.6)(t);return{[x.bg.variable]:`colors.${r}.500`,[x.color.variable]:"colors.white",_dark:{[x.bg.variable]:n,[x.color.variable]:"colors.whiteAlpha.800"}}}),dn=a(e=>{const{colorScheme:r,theme:t}=e,n=te(`${r}.200`,.16)(t);return{[x.bg.variable]:`colors.${r}.100`,[x.color.variable]:`colors.${r}.800`,_dark:{[x.bg.variable]:n,[x.color.variable]:`colors.${r}.200`}}}),cn=a(e=>{const{colorScheme:r,theme:t}=e,n=te(`${r}.200`,.8)(t);return{[x.color.variable]:`colors.${r}.500`,_dark:{[x.color.variable]:n},[x.shadow.variable]:`inset 0 0 0px 1px ${x.color.reference}`}}),bn={solid:sn,subtle:dn,outline:cn},fe=p({baseStyle:ln,variants:bn,defaultProps:{variant:"subtle",colorScheme:"gray"}}),{defineMultiStyleConfig:vn,definePartsStyle:U}=v(Qa.keys),jr=c("tag-bg"),Rr=c("tag-color"),tr=c("tag-shadow"),We=c("tag-min-height"),Ve=c("tag-min-width"),Le=c("tag-font-size"),Oe=c("tag-padding-inline"),un=a({fontWeight:"medium",lineHeight:1.2,outline:0,[Rr.variable]:x.color.reference,[jr.variable]:x.bg.reference,[tr.variable]:x.shadow.reference,color:Rr.reference,bg:jr.reference,boxShadow:tr.reference,borderRadius:"md",minH:We.reference,minW:Ve.reference,fontSize:Le.reference,px:Oe.reference,_focusVisible:{[tr.variable]:"shadows.outline"}}),fn=a({lineHeight:1.2,overflow:"visible"}),mn=a({fontSize:"lg",w:"5",h:"5",transitionProperty:"common",transitionDuration:"normal",borderRadius:"full",marginStart:"1.5",marginEnd:"-1",opacity:.5,_disabled:{opacity:.4},_focusVisible:{boxShadow:"outline",bg:"rgba(0, 0, 0, 0.14)"},_hover:{opacity:.8},_active:{opacity:1}}),hn=U({container:un,label:fn,closeButton:mn}),gn={sm:U({container:{[We.variable]:"sizes.5",[Ve.variable]:"sizes.5",[Le.variable]:"fontSizes.xs",[Oe.variable]:"space.2"},closeButton:{marginEnd:"-2px",marginStart:"0.35rem"}}),md:U({container:{[We.variable]:"sizes.6",[Ve.variable]:"sizes.6",[Le.variable]:"fontSizes.sm",[Oe.variable]:"space.2"}}),lg:U({container:{[We.variable]:"sizes.8",[Ve.variable]:"sizes.8",[Le.variable]:"fontSizes.md",[Oe.variable]:"space.3"}})},yn={subtle:U(e=>{var r;return{container:(r=fe.variants)==null?void 0:r.subtle(e)}}),solid:U(e=>{var r;return{container:(r=fe.variants)==null?void 0:r.solid(e)}}),outline:U(e=>{var r;return{container:(r=fe.variants)==null?void 0:r.outline(e)}})},pn=vn({variants:yn,baseStyle:hn,sizes:gn,defaultProps:{size:"md",variant:"subtle",colorScheme:"gray"}}),{definePartsStyle:R,defineMultiStyleConfig:Sn}=v(Ha.keys),xn=R({field:{width:"100%",minWidth:0,outline:0,position:"relative",appearance:"none",transitionProperty:"common",transitionDuration:"normal",_disabled:{opacity:.4,cursor:"not-allowed"}}}),V={lg:a({fontSize:"lg",px:"4",h:"12",borderRadius:"md"}),md:a({fontSize:"md",px:"4",h:"10",borderRadius:"md"}),sm:a({fontSize:"sm",px:"3",h:"8",borderRadius:"sm"}),xs:a({fontSize:"xs",px:"2",h:"6",borderRadius:"sm"})},$n={lg:R({field:V.lg,addon:V.lg}),md:R({field:V.md,addon:V.md}),sm:R({field:V.sm,addon:V.sm}),xs:R({field:V.xs,addon:V.xs})};function kr(e){const{focusBorderColor:r,errorBorderColor:t}=e;return{focusBorderColor:r||o("blue.500","blue.300")(e),errorBorderColor:t||o("red.500","red.300")(e)}}var kn=R(e=>{const{theme:r}=e,{focusBorderColor:t,errorBorderColor:n}=kr(e);return{field:{border:"1px solid",borderColor:"inherit",bg:"inherit",_hover:{borderColor:o("gray.300","whiteAlpha.400")(e)},_readOnly:{boxShadow:"none !important",userSelect:"all"},_invalid:{borderColor:F(r,n),boxShadow:`0 0 0 1px ${F(r,n)}`},_focusVisible:{zIndex:1,borderColor:F(r,t),boxShadow:`0 0 0 1px ${F(r,t)}`}},addon:{border:"1px solid",borderColor:o("inherit","whiteAlpha.50")(e),bg:o("gray.100","whiteAlpha.300")(e)}}}),_n=R(e=>{const{theme:r}=e,{focusBorderColor:t,errorBorderColor:n}=kr(e);return{field:{border:"2px solid",borderColor:"transparent",bg:o("gray.100","whiteAlpha.50")(e),_hover:{bg:o("gray.200","whiteAlpha.100")(e)},_readOnly:{boxShadow:"none !important",userSelect:"all"},_invalid:{borderColor:F(r,n)},_focusVisible:{bg:"transparent",borderColor:F(r,t)}},addon:{border:"2px solid",borderColor:"transparent",bg:o("gray.100","whiteAlpha.50")(e)}}}),wn=R(e=>{const{theme:r}=e,{focusBorderColor:t,errorBorderColor:n}=kr(e);return{field:{borderBottom:"1px solid",borderColor:"inherit",borderRadius:"0",px:"0",bg:"transparent",_readOnly:{boxShadow:"none !important",userSelect:"all"},_invalid:{borderColor:F(r,n),boxShadow:`0px 1px 0px 0px ${F(r,n)}`},_focusVisible:{borderColor:F(r,t),boxShadow:`0px 1px 0px 0px ${F(r,t)}`}},addon:{borderBottom:"2px solid",borderColor:"inherit",borderRadius:"0",px:"0",bg:"transparent"}}}),zn=R({field:{bg:"transparent",px:"0",height:"auto"},addon:{bg:"transparent",px:"0",height:"auto"}}),Cn={outline:kn,filled:_n,flushed:wn,unstyled:zn},f=Sn({baseStyle:xn,sizes:$n,variants:Cn,defaultProps:{size:"md",variant:"outline"}}),Hr,An=a({...(Hr=f.baseStyle)==null?void 0:Hr.field,paddingY:"2",minHeight:"20",lineHeight:"short",verticalAlign:"top"}),Wr,Vr,Pn={outline:a(e=>{var r,t;return(t=(r=f.variants)==null?void 0:r.outline(e).field)!=null?t:{}}),flushed:a(e=>{var r,t;return(t=(r=f.variants)==null?void 0:r.flushed(e).field)!=null?t:{}}),filled:a(e=>{var r,t;return(t=(r=f.variants)==null?void 0:r.filled(e).field)!=null?t:{}}),unstyled:(Vr=(Wr=f.variants)==null?void 0:Wr.unstyled.field)!=null?Vr:{}},Lr,Or,qr,Nr,Gr,Ur,Xr,Yr,Tn={xs:(Or=(Lr=f.sizes)==null?void 0:Lr.xs.field)!=null?Or:{},sm:(Nr=(qr=f.sizes)==null?void 0:qr.sm.field)!=null?Nr:{},md:(Ur=(Gr=f.sizes)==null?void 0:Gr.md.field)!=null?Ur:{},lg:(Yr=(Xr=f.sizes)==null?void 0:Xr.lg.field)!=null?Yr:{}},Fn=p({baseStyle:An,sizes:Tn,variants:Pn,defaultProps:{size:"md",variant:"outline"}}),Ae=y("tooltip-bg"),ar=y("tooltip-fg"),In=y("popper-arrow-bg"),Mn=a({bg:Ae.reference,color:ar.reference,[Ae.variable]:"colors.gray.700",[ar.variable]:"colors.whiteAlpha.900",_dark:{[Ae.variable]:"colors.gray.300",[ar.variable]:"colors.gray.900"},[In.variable]:Ae.reference,px:"2",py:"0.5",borderRadius:"sm",fontWeight:"medium",fontSize:"sm",boxShadow:"md",maxW:"xs",zIndex:"tooltip"}),Bn=p({baseStyle:Mn}),{defineMultiStyleConfig:En,definePartsStyle:be}=v(Na.keys),Dn=a(e=>{const{colorScheme:r,theme:t,isIndeterminate:n,hasStripe:i}=e,l=o(Ir(),Ir("1rem","rgba(0,0,0,0.1)"))(e),s=o(`${r}.500`,`${r}.200`)(e),d=`linear-gradient( + to right, + transparent 0%, + ${F(t,s)} 50%, + transparent 100% + )`;return{...!n&&i&&l,...n?{bgImage:d}:{bgColor:s}}}),jn=a({lineHeight:"1",fontSize:"0.25em",fontWeight:"bold",color:"white"}),Rn=a(e=>({bg:o("gray.100","whiteAlpha.300")(e)})),Hn=a(e=>({transitionProperty:"common",transitionDuration:"slow",...Dn(e)})),Wn=be(e=>({label:jn,filledTrack:Hn(e),track:Rn(e)})),Vn={xs:be({track:{h:"1"}}),sm:be({track:{h:"2"}}),md:be({track:{h:"3"}}),lg:be({track:{h:"4"}})},Ln=En({sizes:Vn,baseStyle:Wn,defaultProps:{size:"md",colorScheme:"blue"}}),On=e=>typeof e=="function";function w(e,...r){return On(e)?e(...r):e}var{definePartsStyle:qe,defineMultiStyleConfig:qn}=v(Ba.keys),me=c("checkbox-size"),Nn=a(e=>{const{colorScheme:r}=e;return{w:me.reference,h:me.reference,transitionProperty:"box-shadow",transitionDuration:"normal",border:"2px solid",borderRadius:"sm",borderColor:"inherit",color:"white",_checked:{bg:o(`${r}.500`,`${r}.200`)(e),borderColor:o(`${r}.500`,`${r}.200`)(e),color:o("white","gray.900")(e),_hover:{bg:o(`${r}.600`,`${r}.300`)(e),borderColor:o(`${r}.600`,`${r}.300`)(e)},_disabled:{borderColor:o("gray.200","transparent")(e),bg:o("gray.200","whiteAlpha.300")(e),color:o("gray.500","whiteAlpha.500")(e)}},_indeterminate:{bg:o(`${r}.500`,`${r}.200`)(e),borderColor:o(`${r}.500`,`${r}.200`)(e),color:o("white","gray.900")(e)},_disabled:{bg:o("gray.100","whiteAlpha.100")(e),borderColor:o("gray.100","transparent")(e)},_focusVisible:{boxShadow:"outline"},_invalid:{borderColor:o("red.500","red.300")(e)}}}),Gn=a({_disabled:{cursor:"not-allowed"}}),Un=a({userSelect:"none",_disabled:{opacity:.4}}),Xn=a({transitionProperty:"transform",transitionDuration:"normal"}),Yn=qe(e=>({icon:Xn,container:Gn,control:w(Nn,e),label:Un})),Kn={sm:qe({control:{[me.variable]:"sizes.3"},label:{fontSize:"sm"},icon:{fontSize:"3xs"}}),md:qe({control:{[me.variable]:"sizes.4"},label:{fontSize:"md"},icon:{fontSize:"2xs"}}),lg:qe({control:{[me.variable]:"sizes.5"},label:{fontSize:"lg"},icon:{fontSize:"2xs"}})},Ye=qn({baseStyle:Yn,sizes:Kn,defaultProps:{size:"md",colorScheme:"blue"}}),{defineMultiStyleConfig:Zn,definePartsStyle:Ne}=v(Ga.keys),Jn=a(e=>{var r;const t=(r=w(Ye.baseStyle,e))==null?void 0:r.control;return{...t,borderRadius:"full",_checked:{...t==null?void 0:t._checked,_before:{content:'""',display:"inline-block",pos:"relative",w:"50%",h:"50%",borderRadius:"50%",bg:"currentColor"}}}}),Qn=Ne(e=>{var r,t,n,i;return{label:(t=(r=Ye).baseStyle)==null?void 0:t.call(r,e).label,container:(i=(n=Ye).baseStyle)==null?void 0:i.call(n,e).container,control:Jn(e)}}),ei={md:Ne({control:{w:"4",h:"4"},label:{fontSize:"md"}}),lg:Ne({control:{w:"5",h:"5"},label:{fontSize:"lg"}}),sm:Ne({control:{width:"3",height:"3"},label:{fontSize:"sm"}})},ri=Zn({baseStyle:Qn,sizes:ei,defaultProps:{size:"md",colorScheme:"blue"}}),{defineMultiStyleConfig:ti,definePartsStyle:ai}=v(Ua.keys),Pe=c("select-bg"),Kr,oi=a({...(Kr=f.baseStyle)==null?void 0:Kr.field,appearance:"none",paddingBottom:"1px",lineHeight:"normal",bg:Pe.reference,[Pe.variable]:"colors.white",_dark:{[Pe.variable]:"colors.gray.700"},"> option, > optgroup":{bg:Pe.reference}}),ni=a({width:"6",height:"100%",insetEnd:"2",position:"relative",color:"currentColor",fontSize:"xl",_disabled:{opacity:.5}}),ii=ai({field:oi,icon:ni}),Te=a({paddingInlineEnd:"8"}),Zr,Jr,Qr,et,rt,tt,at,ot,li={lg:{...(Zr=f.sizes)==null?void 0:Zr.lg,field:{...(Jr=f.sizes)==null?void 0:Jr.lg.field,...Te}},md:{...(Qr=f.sizes)==null?void 0:Qr.md,field:{...(et=f.sizes)==null?void 0:et.md.field,...Te}},sm:{...(rt=f.sizes)==null?void 0:rt.sm,field:{...(tt=f.sizes)==null?void 0:tt.sm.field,...Te}},xs:{...(at=f.sizes)==null?void 0:at.xs,field:{...(ot=f.sizes)==null?void 0:ot.xs.field,...Te},icon:{insetEnd:"1"}}},si=ti({baseStyle:ii,sizes:li,variants:f.variants,defaultProps:f.defaultProps}),or=c("skeleton-start-color"),nr=c("skeleton-end-color"),di=a({[or.variable]:"colors.gray.100",[nr.variable]:"colors.gray.400",_dark:{[or.variable]:"colors.gray.800",[nr.variable]:"colors.gray.600"},background:or.reference,borderColor:nr.reference,opacity:.7,borderRadius:"sm"}),ci=p({baseStyle:di}),ir=c("skip-link-bg"),bi=a({borderRadius:"md",fontWeight:"semibold",_focusVisible:{boxShadow:"outline",padding:"4",position:"fixed",top:"6",insetStart:"6",[ir.variable]:"colors.white",_dark:{[ir.variable]:"colors.gray.700"},bg:ir.reference}}),vi=p({baseStyle:bi}),{defineMultiStyleConfig:ui,definePartsStyle:Qe}=v(Xa.keys),pe=c("slider-thumb-size"),Se=c("slider-track-size"),O=c("slider-bg"),fi=a(e=>{const{orientation:r}=e;return{display:"inline-block",position:"relative",cursor:"pointer",_disabled:{opacity:.6,cursor:"default",pointerEvents:"none"},...$r({orientation:r,vertical:{h:"100%"},horizontal:{w:"100%"}})}}),mi=a(e=>({...$r({orientation:e.orientation,horizontal:{h:Se.reference},vertical:{w:Se.reference}}),overflow:"hidden",borderRadius:"sm",[O.variable]:"colors.gray.200",_dark:{[O.variable]:"colors.whiteAlpha.200"},_disabled:{[O.variable]:"colors.gray.300",_dark:{[O.variable]:"colors.whiteAlpha.300"}},bg:O.reference})),hi=a(e=>{const{orientation:r}=e;return{...$r({orientation:r,vertical:{left:"50%",transform:"translateX(-50%)",_active:{transform:"translateX(-50%) scale(1.15)"}},horizontal:{top:"50%",transform:"translateY(-50%)",_active:{transform:"translateY(-50%) scale(1.15)"}}}),w:pe.reference,h:pe.reference,display:"flex",alignItems:"center",justifyContent:"center",position:"absolute",outline:0,zIndex:1,borderRadius:"full",bg:"white",boxShadow:"base",border:"1px solid",borderColor:"transparent",transitionProperty:"transform",transitionDuration:"normal",_focusVisible:{boxShadow:"outline"},_disabled:{bg:"gray.300"}}}),gi=a(e=>{const{colorScheme:r}=e;return{width:"inherit",height:"inherit",[O.variable]:`colors.${r}.500`,_dark:{[O.variable]:`colors.${r}.200`},bg:O.reference}}),yi=Qe(e=>({container:fi(e),track:mi(e),thumb:hi(e),filledTrack:gi(e)})),pi=Qe({container:{[pe.variable]:"sizes.4",[Se.variable]:"sizes.1"}}),Si=Qe({container:{[pe.variable]:"sizes.3.5",[Se.variable]:"sizes.1"}}),xi=Qe({container:{[pe.variable]:"sizes.2.5",[Se.variable]:"sizes.0.5"}}),$i={lg:pi,md:Si,sm:xi},ki=ui({baseStyle:yi,sizes:$i,defaultProps:{size:"md",colorScheme:"blue"}}),q=y("spinner-size"),_i=a({width:[q.reference],height:[q.reference]}),wi={xs:a({[q.variable]:"sizes.3"}),sm:a({[q.variable]:"sizes.4"}),md:a({[q.variable]:"sizes.6"}),lg:a({[q.variable]:"sizes.8"}),xl:a({[q.variable]:"sizes.12"})},zi=p({baseStyle:_i,sizes:wi,defaultProps:{size:"md"}}),{defineMultiStyleConfig:Ci,definePartsStyle:$t}=v(Ya.keys),Ai=a({fontWeight:"medium"}),Pi=a({opacity:.8,marginBottom:"2"}),Ti=a({verticalAlign:"baseline",fontWeight:"semibold"}),Fi=a({marginEnd:1,w:"3.5",h:"3.5",verticalAlign:"middle"}),Ii=$t({container:{},label:Ai,helpText:Pi,number:Ti,icon:Fi}),Mi={md:$t({label:{fontSize:"sm"},helpText:{fontSize:"sm"},number:{fontSize:"2xl"}})},Bi=Ci({baseStyle:Ii,sizes:Mi,defaultProps:{size:"md"}}),lr=c("kbd-bg"),Ei=a({[lr.variable]:"colors.gray.100",_dark:{[lr.variable]:"colors.whiteAlpha.100"},bg:lr.reference,borderRadius:"md",borderWidth:"1px",borderBottomWidth:"3px",fontSize:"0.8em",fontWeight:"bold",lineHeight:"normal",px:"0.4em",whiteSpace:"nowrap"}),Di=p({baseStyle:Ei}),ji=a({transitionProperty:"common",transitionDuration:"fast",transitionTimingFunction:"ease-out",cursor:"pointer",textDecoration:"none",outline:"none",color:"inherit",_hover:{textDecoration:"underline"},_focusVisible:{boxShadow:"outline"}}),Ri=p({baseStyle:ji}),{defineMultiStyleConfig:Hi,definePartsStyle:Wi}=v(Wa.keys),Vi=a({marginEnd:"2",display:"inline",verticalAlign:"text-bottom"}),Li=Wi({icon:Vi}),Oi=Hi({baseStyle:Li}),{defineMultiStyleConfig:qi,definePartsStyle:Ni}=v(Va.keys),B=c("menu-bg"),sr=c("menu-shadow"),Gi=a({[B.variable]:"#fff",[sr.variable]:"shadows.sm",_dark:{[B.variable]:"colors.gray.700",[sr.variable]:"shadows.dark-lg"},color:"inherit",minW:"3xs",py:"2",zIndex:1,borderRadius:"md",borderWidth:"1px",bg:B.reference,boxShadow:sr.reference}),Ui=a({py:"1.5",px:"3",transitionProperty:"background",transitionDuration:"ultra-fast",transitionTimingFunction:"ease-in",_focus:{[B.variable]:"colors.gray.100",_dark:{[B.variable]:"colors.whiteAlpha.100"}},_active:{[B.variable]:"colors.gray.200",_dark:{[B.variable]:"colors.whiteAlpha.200"}},_expanded:{[B.variable]:"colors.gray.100",_dark:{[B.variable]:"colors.whiteAlpha.100"}},_disabled:{opacity:.4,cursor:"not-allowed"},bg:B.reference}),Xi=a({mx:4,my:2,fontWeight:"semibold",fontSize:"sm"}),Yi=a({opacity:.6}),Ki=a({border:0,borderBottom:"1px solid",borderColor:"inherit",my:"2",opacity:.6}),Zi=a({transitionProperty:"common",transitionDuration:"normal"}),Ji=Ni({button:Zi,list:Gi,item:Ui,groupTitle:Xi,command:Yi,divider:Ki}),Qi=qi({baseStyle:Ji}),{defineMultiStyleConfig:el,definePartsStyle:pr}=v(La.keys),dr=c("modal-bg"),cr=c("modal-shadow"),rl=a({bg:"blackAlpha.600",zIndex:"modal"}),tl=a(e=>{const{isCentered:r,scrollBehavior:t}=e;return{display:"flex",zIndex:"modal",justifyContent:"center",alignItems:r?"center":"flex-start",overflow:t==="inside"?"hidden":"auto",overscrollBehaviorY:"none"}}),al=a(e=>{const{isCentered:r,scrollBehavior:t}=e;return{borderRadius:"md",color:"inherit",my:r?"auto":"16",mx:r?"auto":void 0,zIndex:"modal",maxH:t==="inside"?"calc(100% - 7.5rem)":void 0,[dr.variable]:"colors.white",[cr.variable]:"shadows.lg",_dark:{[dr.variable]:"colors.gray.700",[cr.variable]:"shadows.dark-lg"},bg:dr.reference,boxShadow:cr.reference}}),ol=a({px:"6",py:"4",fontSize:"xl",fontWeight:"semibold"}),nl=a({position:"absolute",top:"2",insetEnd:"3"}),il=a(e=>{const{scrollBehavior:r}=e;return{px:"6",py:"2",flex:"1",overflow:r==="inside"?"auto":void 0}}),ll=a({px:"6",py:"4"}),sl=pr(e=>({overlay:rl,dialogContainer:w(tl,e),dialog:w(al,e),header:ol,closeButton:nl,body:w(il,e),footer:ll}));function P(e){return pr(e==="full"?{dialog:{maxW:"100vw",minH:"$100vh",my:"0",borderRadius:"0"}}:{dialog:{maxW:e}})}var dl={xs:P("xs"),sm:P("sm"),md:P("md"),lg:P("lg"),xl:P("xl"),"2xl":P("2xl"),"3xl":P("3xl"),"4xl":P("4xl"),"5xl":P("5xl"),"6xl":P("6xl"),full:P("full")},cl=el({baseStyle:sl,sizes:dl,defaultProps:{size:"md"}}),{defineMultiStyleConfig:bl,definePartsStyle:kt}=v(Oa.keys),_r=y("number-input-stepper-width"),_t=y("number-input-input-padding"),vl=j(_r).add("0.5rem").toString(),br=y("number-input-bg"),vr=y("number-input-color"),ur=y("number-input-border-color"),ul=a({[_r.variable]:"sizes.6",[_t.variable]:vl}),fl=a(e=>{var r,t;return(t=(r=w(f.baseStyle,e))==null?void 0:r.field)!=null?t:{}}),ml=a({width:_r.reference}),hl=a({borderStart:"1px solid",borderStartColor:ur.reference,color:vr.reference,bg:br.reference,[vr.variable]:"colors.chakra-body-text",[ur.variable]:"colors.chakra-border-color",_dark:{[vr.variable]:"colors.whiteAlpha.800",[ur.variable]:"colors.whiteAlpha.300"},_active:{[br.variable]:"colors.gray.200",_dark:{[br.variable]:"colors.whiteAlpha.300"}},_disabled:{opacity:.4,cursor:"not-allowed"}}),gl=kt(e=>{var r;return{root:ul,field:(r=w(fl,e))!=null?r:{},stepperGroup:ml,stepper:hl}});function Fe(e){var r,t,n;const i=(r=f.sizes)==null?void 0:r[e],l={lg:"md",md:"md",sm:"sm",xs:"sm"},s=(n=(t=i.field)==null?void 0:t.fontSize)!=null?n:"md",d=gt.fontSizes[s];return kt({field:{...i.field,paddingInlineEnd:_t.reference,verticalAlign:"top"},stepper:{fontSize:j(d).multiply(.75).toString(),_first:{borderTopEndRadius:l[e]},_last:{borderBottomEndRadius:l[e],mt:"-1px",borderTopWidth:1}}})}var yl={xs:Fe("xs"),sm:Fe("sm"),md:Fe("md"),lg:Fe("lg")},pl=bl({baseStyle:gl,sizes:yl,variants:f.variants,defaultProps:f.defaultProps}),nt,Sl=a({...(nt=f.baseStyle)==null?void 0:nt.field,textAlign:"center"}),xl={lg:a({fontSize:"lg",w:12,h:12,borderRadius:"md"}),md:a({fontSize:"md",w:10,h:10,borderRadius:"md"}),sm:a({fontSize:"sm",w:8,h:8,borderRadius:"sm"}),xs:a({fontSize:"xs",w:6,h:6,borderRadius:"sm"})},it,lt,$l={outline:a(e=>{var r,t,n;return(n=(t=w((r=f.variants)==null?void 0:r.outline,e))==null?void 0:t.field)!=null?n:{}}),flushed:a(e=>{var r,t,n;return(n=(t=w((r=f.variants)==null?void 0:r.flushed,e))==null?void 0:t.field)!=null?n:{}}),filled:a(e=>{var r,t,n;return(n=(t=w((r=f.variants)==null?void 0:r.filled,e))==null?void 0:t.field)!=null?n:{}}),unstyled:(lt=(it=f.variants)==null?void 0:it.unstyled.field)!=null?lt:{}},kl=p({baseStyle:Sl,sizes:xl,variants:$l,defaultProps:f.defaultProps}),{defineMultiStyleConfig:_l,definePartsStyle:wl}=v(qa.keys),Ie=y("popper-bg"),zl=y("popper-arrow-bg"),st=y("popper-arrow-shadow-color"),Cl=a({zIndex:10}),Al=a({[Ie.variable]:"colors.white",bg:Ie.reference,[zl.variable]:Ie.reference,[st.variable]:"colors.gray.200",_dark:{[Ie.variable]:"colors.gray.700",[st.variable]:"colors.whiteAlpha.300"},width:"xs",border:"1px solid",borderColor:"inherit",borderRadius:"md",boxShadow:"sm",zIndex:"inherit",_focusVisible:{outline:0,boxShadow:"outline"}}),Pl=a({px:3,py:2,borderBottomWidth:"1px"}),Tl=a({px:3,py:2}),Fl=a({px:3,py:2,borderTopWidth:"1px"}),Il=a({position:"absolute",borderRadius:"md",top:1,insetEnd:2,padding:2}),Ml=wl({popper:Cl,content:Al,header:Pl,body:Tl,footer:Fl,closeButton:Il}),Bl=_l({baseStyle:Ml}),{definePartsStyle:Sr,defineMultiStyleConfig:El}=v(Ea.keys),fr=c("drawer-bg"),mr=c("drawer-box-shadow");function Y(e){return Sr(e==="full"?{dialog:{maxW:"100vw",h:"100vh"}}:{dialog:{maxW:e}})}var Dl=a({bg:"blackAlpha.600",zIndex:"overlay"}),jl=a({display:"flex",zIndex:"modal",justifyContent:"center"}),Rl=a(e=>{const{isFullHeight:r}=e;return{...r&&{height:"100vh"},zIndex:"modal",maxH:"100vh",color:"inherit",[fr.variable]:"colors.white",[mr.variable]:"shadows.lg",_dark:{[fr.variable]:"colors.gray.700",[mr.variable]:"shadows.dark-lg"},bg:fr.reference,boxShadow:mr.reference}}),Hl=a({px:"6",py:"4",fontSize:"xl",fontWeight:"semibold"}),Wl=a({position:"absolute",top:"2",insetEnd:"3"}),Vl=a({px:"6",py:"2",flex:"1",overflow:"auto"}),Ll=a({px:"6",py:"4"}),Ol=Sr(e=>({overlay:Dl,dialogContainer:jl,dialog:w(Rl,e),header:Hl,closeButton:Wl,body:Vl,footer:Ll})),ql={xs:Y("xs"),sm:Y("md"),md:Y("lg"),lg:Y("2xl"),xl:Y("4xl"),full:Y("full")},Nl=El({baseStyle:Ol,sizes:ql,defaultProps:{size:"xs"}}),{definePartsStyle:Gl,defineMultiStyleConfig:Ul}=v(Da.keys),Xl=a({borderRadius:"md",py:"1",transitionProperty:"common",transitionDuration:"normal"}),Yl=a({borderRadius:"md",py:"1",transitionProperty:"common",transitionDuration:"normal",width:"full",_focusVisible:{boxShadow:"outline"},_placeholder:{opacity:.6}}),Kl=a({borderRadius:"md",py:"1",transitionProperty:"common",transitionDuration:"normal",width:"full",_focusVisible:{boxShadow:"outline"},_placeholder:{opacity:.6}}),Zl=Gl({preview:Xl,input:Yl,textarea:Kl}),Jl=Ul({baseStyle:Zl}),{definePartsStyle:Ql,defineMultiStyleConfig:es}=v(ja.keys),Q=c("form-control-color"),rs=a({marginStart:"1",[Q.variable]:"colors.red.500",_dark:{[Q.variable]:"colors.red.300"},color:Q.reference}),ts=a({mt:"2",[Q.variable]:"colors.gray.600",_dark:{[Q.variable]:"colors.whiteAlpha.600"},color:Q.reference,lineHeight:"normal",fontSize:"sm"}),as=Ql({container:{width:"100%",position:"relative"},requiredIndicator:rs,helperText:ts}),os=es({baseStyle:as}),{definePartsStyle:ns,defineMultiStyleConfig:is}=v(Ra.keys),ee=c("form-error-color"),ls=a({[ee.variable]:"colors.red.500",_dark:{[ee.variable]:"colors.red.300"},color:ee.reference,mt:"2",fontSize:"sm",lineHeight:"normal"}),ss=a({marginEnd:"0.5em",[ee.variable]:"colors.red.500",_dark:{[ee.variable]:"colors.red.300"},color:ee.reference}),ds=ns({text:ls,icon:ss}),cs=is({baseStyle:ds}),bs=a({fontSize:"md",marginEnd:"3",mb:"2",fontWeight:"medium",transitionProperty:"common",transitionDuration:"normal",opacity:1,_disabled:{opacity:.4}}),vs=p({baseStyle:bs}),us=a({fontFamily:"heading",fontWeight:"bold"}),fs={"4xl":a({fontSize:["6xl",null,"7xl"],lineHeight:1}),"3xl":a({fontSize:["5xl",null,"6xl"],lineHeight:1}),"2xl":a({fontSize:["4xl",null,"5xl"],lineHeight:[1.2,null,1]}),xl:a({fontSize:["3xl",null,"4xl"],lineHeight:[1.33,null,1.2]}),lg:a({fontSize:["2xl",null,"3xl"],lineHeight:[1.33,null,1.2]}),md:a({fontSize:"xl",lineHeight:1.2}),sm:a({fontSize:"md",lineHeight:1.2}),xs:a({fontSize:"sm",lineHeight:1.2})},ms=p({baseStyle:us,sizes:fs,defaultProps:{size:"xl"}}),{defineMultiStyleConfig:hs,definePartsStyle:gs}=v(Ma.keys),hr=c("breadcrumb-link-decor"),ys=a({transitionProperty:"common",transitionDuration:"fast",transitionTimingFunction:"ease-out",outline:"none",color:"inherit",textDecoration:hr.reference,[hr.variable]:"none","&:not([aria-current=page])":{cursor:"pointer",_hover:{[hr.variable]:"underline"},_focusVisible:{boxShadow:"outline"}}}),ps=gs({link:ys}),Ss=hs({baseStyle:ps}),xs=a({lineHeight:"1.2",borderRadius:"md",fontWeight:"semibold",transitionProperty:"common",transitionDuration:"normal",_focusVisible:{boxShadow:"outline"},_disabled:{opacity:.4,cursor:"not-allowed",boxShadow:"none"},_hover:{_disabled:{bg:"initial"}}}),wt=a(e=>{const{colorScheme:r,theme:t}=e;if(r==="gray")return{color:o("gray.800","whiteAlpha.900")(e),_hover:{bg:o("gray.100","whiteAlpha.200")(e)},_active:{bg:o("gray.200","whiteAlpha.300")(e)}};const n=te(`${r}.200`,.12)(t),i=te(`${r}.200`,.24)(t);return{color:o(`${r}.600`,`${r}.200`)(e),bg:"transparent",_hover:{bg:o(`${r}.50`,n)(e)},_active:{bg:o(`${r}.100`,i)(e)}}}),$s=a(e=>{const{colorScheme:r}=e,t=o("gray.200","whiteAlpha.300")(e);return{border:"1px solid",borderColor:r==="gray"?t:"currentColor",".chakra-button__group[data-attached][data-orientation=horizontal] > &:not(:last-of-type)":{marginEnd:"-1px"},".chakra-button__group[data-attached][data-orientation=vertical] > &:not(:last-of-type)":{marginBottom:"-1px"},...w(wt,e)}}),ks={yellow:{bg:"yellow.400",color:"black",hoverBg:"yellow.500",activeBg:"yellow.600"},cyan:{bg:"cyan.400",color:"black",hoverBg:"cyan.500",activeBg:"cyan.600"}},_s=a(e=>{var r;const{colorScheme:t}=e;if(t==="gray"){const b=o("gray.100","whiteAlpha.200")(e);return{bg:b,color:o("gray.800","whiteAlpha.900")(e),_hover:{bg:o("gray.200","whiteAlpha.300")(e),_disabled:{bg:b}},_active:{bg:o("gray.300","whiteAlpha.400")(e)}}}const{bg:n=`${t}.500`,color:i="white",hoverBg:l=`${t}.600`,activeBg:s=`${t}.700`}=(r=ks[t])!=null?r:{},d=o(n,`${t}.200`)(e);return{bg:d,color:o(i,"gray.800")(e),_hover:{bg:o(l,`${t}.300`)(e),_disabled:{bg:d}},_active:{bg:o(s,`${t}.400`)(e)}}}),ws=a(e=>{const{colorScheme:r}=e;return{padding:0,height:"auto",lineHeight:"normal",verticalAlign:"baseline",color:o(`${r}.500`,`${r}.200`)(e),_hover:{textDecoration:"underline",_disabled:{textDecoration:"none"}},_active:{color:o(`${r}.700`,`${r}.500`)(e)}}}),zs=a({bg:"none",color:"inherit",display:"inline",lineHeight:"inherit",m:"0",p:"0"}),Cs={ghost:wt,outline:$s,solid:_s,link:ws,unstyled:zs},As={lg:a({h:"12",minW:"12",fontSize:"lg",px:"6"}),md:a({h:"10",minW:"10",fontSize:"md",px:"4"}),sm:a({h:"8",minW:"8",fontSize:"sm",px:"3"}),xs:a({h:"6",minW:"6",fontSize:"xs",px:"2"})},Ps=p({baseStyle:xs,variants:Cs,sizes:As,defaultProps:{variant:"solid",size:"md",colorScheme:"gray"}}),{definePartsStyle:X,defineMultiStyleConfig:Ts}=v(eo.keys),Ke=c("card-bg"),H=c("card-padding"),zt=c("card-shadow"),Ge=c("card-radius"),Ct=c("card-border-width","0"),At=c("card-border-color"),Fs=X({container:{[Ke.variable]:"colors.chakra-body-bg",backgroundColor:Ke.reference,boxShadow:zt.reference,borderRadius:Ge.reference,color:"chakra-body-text",borderWidth:Ct.reference,borderColor:At.reference},body:{padding:H.reference,flex:"1 1 0%"},header:{padding:H.reference},footer:{padding:H.reference}}),Is={sm:X({container:{[Ge.variable]:"radii.base",[H.variable]:"space.3"}}),md:X({container:{[Ge.variable]:"radii.md",[H.variable]:"space.5"}}),lg:X({container:{[Ge.variable]:"radii.xl",[H.variable]:"space.7"}})},Ms={elevated:X({container:{[zt.variable]:"shadows.base",_dark:{[Ke.variable]:"colors.gray.700"}}}),outline:X({container:{[Ct.variable]:"1px",[At.variable]:"colors.chakra-border-color"}}),filled:X({container:{[Ke.variable]:"colors.chakra-subtle-bg"}}),unstyled:{body:{[H.variable]:0},header:{[H.variable]:0},footer:{[H.variable]:0}}},Bs=Ts({baseStyle:Fs,variants:Ms,sizes:Is,defaultProps:{variant:"elevated",size:"md"}}),he=y("close-button-size"),le=y("close-button-bg"),Es=a({w:[he.reference],h:[he.reference],borderRadius:"md",transitionProperty:"common",transitionDuration:"normal",_disabled:{opacity:.4,cursor:"not-allowed",boxShadow:"none"},_hover:{[le.variable]:"colors.blackAlpha.100",_dark:{[le.variable]:"colors.whiteAlpha.100"}},_active:{[le.variable]:"colors.blackAlpha.200",_dark:{[le.variable]:"colors.whiteAlpha.200"}},_focusVisible:{boxShadow:"outline"},bg:le.reference}),Ds={lg:a({[he.variable]:"sizes.10",fontSize:"md"}),md:a({[he.variable]:"sizes.8",fontSize:"xs"}),sm:a({[he.variable]:"sizes.6",fontSize:"2xs"})},js=p({baseStyle:Es,sizes:Ds,defaultProps:{size:"md"}}),{variants:Rs,defaultProps:Hs}=fe,Ws=a({fontFamily:"mono",fontSize:"sm",px:"0.2em",borderRadius:"sm",bg:x.bg.reference,color:x.color.reference,boxShadow:x.shadow.reference}),Vs=p({baseStyle:Ws,variants:Rs,defaultProps:Hs}),Ls=a({w:"100%",mx:"auto",maxW:"prose",px:"4"}),Os=p({baseStyle:Ls}),qs=a({opacity:.6,borderColor:"inherit"}),Ns=a({borderStyle:"solid"}),Gs=a({borderStyle:"dashed"}),Us={solid:Ns,dashed:Gs},Xs=p({baseStyle:qs,variants:Us,defaultProps:{variant:"solid"}}),{definePartsStyle:Ys,defineMultiStyleConfig:Ks}=v(Ta.keys),Zs=a({borderTopWidth:"1px",borderColor:"inherit",_last:{borderBottomWidth:"1px"}}),Js=a({transitionProperty:"common",transitionDuration:"normal",fontSize:"md",_focusVisible:{boxShadow:"outline"},_hover:{bg:"blackAlpha.50"},_disabled:{opacity:.4,cursor:"not-allowed"},px:"4",py:"2"}),Qs=a({pt:"2",px:"4",pb:"5"}),e0=a({fontSize:"1.25em"}),r0=Ys({container:Zs,button:Js,panel:Qs,icon:e0}),t0=Ks({baseStyle:r0}),{definePartsStyle:$e,defineMultiStyleConfig:a0}=v(Fa.keys),C=c("alert-fg"),W=c("alert-bg"),o0=$e({container:{bg:W.reference,px:"4",py:"3"},title:{fontWeight:"bold",lineHeight:"6",marginEnd:"2"},description:{lineHeight:"6"},icon:{color:C.reference,flexShrink:0,marginEnd:"3",w:"5",h:"6"},spinner:{color:C.reference,flexShrink:0,marginEnd:"3",w:"5",h:"5"}});function wr(e){const{theme:r,colorScheme:t}=e,n=te(`${t}.200`,.16)(r);return{light:`colors.${t}.100`,dark:n}}var n0=$e(e=>{const{colorScheme:r}=e,t=wr(e);return{container:{[C.variable]:`colors.${r}.500`,[W.variable]:t.light,_dark:{[C.variable]:`colors.${r}.200`,[W.variable]:t.dark}}}}),i0=$e(e=>{const{colorScheme:r}=e,t=wr(e);return{container:{[C.variable]:`colors.${r}.500`,[W.variable]:t.light,_dark:{[C.variable]:`colors.${r}.200`,[W.variable]:t.dark},paddingStart:"3",borderStartWidth:"4px",borderStartColor:C.reference}}}),l0=$e(e=>{const{colorScheme:r}=e,t=wr(e);return{container:{[C.variable]:`colors.${r}.500`,[W.variable]:t.light,_dark:{[C.variable]:`colors.${r}.200`,[W.variable]:t.dark},pt:"2",borderTopWidth:"4px",borderTopColor:C.reference}}}),s0=$e(e=>{const{colorScheme:r}=e;return{container:{[C.variable]:"colors.white",[W.variable]:`colors.${r}.500`,_dark:{[C.variable]:"colors.gray.900",[W.variable]:`colors.${r}.200`},color:C.reference}}}),d0={subtle:n0,"left-accent":i0,"top-accent":l0,solid:s0},c0=a0({baseStyle:o0,variants:d0,defaultProps:{variant:"subtle",colorScheme:"blue"}}),{definePartsStyle:Pt,defineMultiStyleConfig:b0}=v(Ia.keys),re=c("avatar-border-color"),ge=c("avatar-bg"),xe=c("avatar-font-size"),ae=c("avatar-size"),v0=a({borderRadius:"full",border:"0.2em solid",borderColor:re.reference,[re.variable]:"white",_dark:{[re.variable]:"colors.gray.800"}}),u0=a({bg:ge.reference,fontSize:xe.reference,width:ae.reference,height:ae.reference,lineHeight:"1",[ge.variable]:"colors.gray.200",_dark:{[ge.variable]:"colors.whiteAlpha.400"}}),f0=a(e=>{const{name:r,theme:t}=e,n=r?xo({string:r}):"colors.gray.400",i=po(n)(t);let l="white";return i||(l="gray.800"),{bg:ge.reference,fontSize:xe.reference,color:l,borderColor:re.reference,verticalAlign:"top",width:ae.reference,height:ae.reference,"&:not([data-loaded])":{[ge.variable]:n},[re.variable]:"colors.white",_dark:{[re.variable]:"colors.gray.800"}}}),m0=a({fontSize:xe.reference,lineHeight:"1"}),h0=Pt(e=>({badge:w(v0,e),excessLabel:w(u0,e),container:w(f0,e),label:m0}));function L(e){const r=e!=="100%"?pt[e]:void 0;return Pt({container:{[ae.variable]:r??e,[xe.variable]:`calc(${r??e} / 2.5)`},excessLabel:{[ae.variable]:r??e,[xe.variable]:`calc(${r??e} / 2.5)`}})}var g0={"2xs":L(4),xs:L(6),sm:L(8),md:L(12),lg:L(16),xl:L(24),"2xl":L(32),full:L("100%")},y0=b0({baseStyle:h0,sizes:g0,defaultProps:{size:"md"}}),p0={Accordion:t0,Alert:c0,Avatar:y0,Badge:fe,Breadcrumb:Ss,Button:Ps,Checkbox:Ye,CloseButton:js,Code:Vs,Container:Os,Divider:Xs,Drawer:Nl,Editable:Jl,Form:os,FormError:cs,FormLabel:vs,Heading:ms,Input:f,Kbd:Di,Link:Ri,List:Oi,Menu:Qi,Modal:cl,NumberInput:pl,PinInput:kl,Popover:Bl,Progress:Ln,Radio:ri,Select:si,Skeleton:ci,SkipLink:vi,Slider:ki,Spinner:zi,Stat:Bi,Switch:jo,Table:qo,Tabs:nn,Tag:pn,Textarea:Fn,Tooltip:Bn,Card:Bs,Stepper:Pa},S0={colors:{"chakra-body-text":{_light:"gray.800",_dark:"whiteAlpha.900"},"chakra-body-bg":{_light:"white",_dark:"gray.800"},"chakra-border-color":{_light:"gray.200",_dark:"whiteAlpha.300"},"chakra-inverse-text":{_light:"white",_dark:"gray.800"},"chakra-subtle-bg":{_light:"gray.100",_dark:"gray.700"},"chakra-subtle-text":{_light:"gray.600",_dark:"gray.400"},"chakra-placeholder-color":{_light:"gray.500",_dark:"whiteAlpha.400"}}},x0={global:{body:{fontFamily:"body",color:"chakra-body-text",bg:"chakra-body-bg",transitionProperty:"background-color",transitionDuration:"normal",lineHeight:"base"},"*::placeholder":{color:"chakra-placeholder-color"},"*, *::before, &::after":{borderColor:"chakra-border-color"}}},$0="ltr",k0={useSystemColorMode:!1,initialColorMode:"light",cssVarPrefix:"chakra"},Tt={semanticTokens:S0,direction:$0,...za,components:p0,styles:x0,config:k0};function ve(e){return typeof e=="function"}function _0(...e){return r=>e.reduce((t,n)=>n(t),r)}var w0=e=>function(...t){let n=[...t],i=t[t.length-1];return ta(i)&&n.length>1?n=n.slice(0,n.length-1):i=e,_0(...n.map(l=>s=>ve(l)?l(s):C0(s,l)))(i)},z0=w0(Tt);function C0(...e){return vt({},...e,Ft)}function Ft(e,r,t,n){if((ve(e)||ve(r))&&Object.prototype.hasOwnProperty.call(n,t))return(...i)=>{const l=ve(e)?e(...i):e,s=ve(r)?r(...i):r;return vt({},l,s,Ft)}}function A0(e={}){const{strict:r=!0,errorMessage:t="useContext: `context` is undefined. Seems you forgot to wrap component within the Provider",name:n}=e,i=k.createContext(void 0);i.displayName=n;function l(){var s;const d=k.useContext(i);if(!d&&r){const b=new Error(t);throw b.name="ContextError",(s=Error.captureStackTrace)==null||s.call(Error,b,l),b}return d}return[i.Provider,l,i]}function P0(e){const{cssVarsRoot:r,theme:t,children:n}=e,i=k.useMemo(()=>Ht(t),[t]);return S.jsxs(Wt,{theme:i,children:[S.jsx(T0,{root:r}),n]})}function T0({root:e=":host, :root"}){const r=[e,"[data-theme]"].join(",");return S.jsx(Ze,{styles:t=>({[r]:t.__cssVars})})}A0({name:"StylesContext",errorMessage:"useStyles: `styles` is undefined. Seems you forgot to wrap the components in `` "});function F0(){const{colorMode:e}=Vt();return S.jsx(Ze,{styles:r=>{const t=Lt(r,"styles.global"),n=Ot(t,{theme:r,colorMode:e});return n?qt(n)(r):void 0}})}var It=k.createContext({getDocument(){return document},getWindow(){return window}});It.displayName="EnvironmentContext";function Mt(e){const{children:r,environment:t,disabled:n}=e,i=k.useRef(null),l=k.useMemo(()=>t||{getDocument:()=>{var d,b;return(b=(d=i.current)==null?void 0:d.ownerDocument)!=null?b:document},getWindow:()=>{var d,b;return(b=(d=i.current)==null?void 0:d.ownerDocument.defaultView)!=null?b:window}},[t]),s=!n||!t;return S.jsxs(It.Provider,{value:l,children:[r,s&&S.jsx("span",{id:"__chakra_env",hidden:!0,ref:i})]})}Mt.displayName="EnvironmentProvider";var I0=e=>{const{children:r,colorModeManager:t,portalZIndex:n,resetScope:i,resetCSS:l=!0,theme:s={},environment:d,cssVarsRoot:b,disableEnvironment:$,disableGlobalStyle:u}=e,m=S.jsx(Mt,{environment:d,disabled:$,children:r});return S.jsx(P0,{theme:s,cssVarsRoot:b,children:S.jsxs(ht,{colorModeManager:t,options:s.config,children:[l?S.jsx(Zt,{scope:i}):S.jsx(Kt,{}),!u&&S.jsx(F0,{}),n?S.jsx(Nt,{zIndex:n,children:m}):m]})})},M0=e=>function({children:t,theme:n=e,toastOptions:i,...l}){return S.jsxs(I0,{theme:n,...l,children:[S.jsx(Gt,{value:i==null?void 0:i.defaultOptions,children:t}),S.jsx(Ut,{...i})]})},B0=M0(Tt);function A(e,r,t=!1){e=String(e),r=String(r);const n=Array.from({length:21},(s,d)=>d*50),i=[0,5,10,15,20,25,30,35,40,45,50,55,59,64,68,73,77,82,86,95,100];return n.reduce((s,d,b)=>{const $=t?i[b]/100:1,u=t?50:i[n.length-1-b];return s[d]=`hsl(${e} ${r}% ${u}% / ${$})`,s},{})}const Me={H:220,S:16},Be={H:250,S:52},Ee={H:47,S:50},De={H:28,S:50},je={H:113,S:50},Re={H:0,S:50},E0={base:A(Me.H,Me.S),baseAlpha:A(Me.H,Me.S,!0),accent:A(Be.H,Be.S),accentAlpha:A(Be.H,Be.S,!0),working:A(Ee.H,Ee.S),workingAlpha:A(Ee.H,Ee.S,!0),warning:A(De.H,De.S),warningAlpha:A(De.H,De.S,!0),ok:A(je.H,je.S),okAlpha:A(je.H,je.S,!0),error:A(Re.H,Re.S),errorAlpha:A(Re.H,Re.S,!0)};function g(e,r={}){let t=!1;function n(){if(!t){t=!0;return}throw new Error("[anatomy] .part(...) should only be called once. Did you mean to use .extend(...) ?")}function i(...u){n();for(const m of u)r[m]=b(m);return g(e,r)}function l(...u){for(const m of u)m in r||(r[m]=b(m));return g(e,r)}function s(){return Object.fromEntries(Object.entries(r).map(([m,_])=>[m,_.selector]))}function d(){return Object.fromEntries(Object.entries(r).map(([m,_])=>[m,_.className]))}function b(u){const I=`chakra-${(["container","root"].includes(u??"")?[e]:[e,u]).filter(Boolean).join("__")}`;return{className:I,selector:`.${I}`,toString:()=>u}}return{parts:i,toPart:b,extend:l,selectors:s,classnames:d,get keys(){return Object.keys(r)},__type:{}}}var D0=g("accordion").parts("root","container","button","panel").extend("icon");g("alert").parts("title","description","container").extend("icon","spinner");g("avatar").parts("label","badge","container").extend("excessLabel","group");g("breadcrumb").parts("link","item","container").extend("separator");g("button").parts();var j0=g("checkbox").parts("control","icon","container").extend("label");g("progress").parts("track","filledTrack").extend("label");g("drawer").parts("overlay","dialogContainer","dialog").extend("header","closeButton","body","footer");g("editable").parts("preview","input","textarea");g("form").parts("container","requiredIndicator","helperText");g("formError").parts("text","icon");var R0=g("input").parts("addon","field","element");g("list").parts("container","item","icon");var H0=g("menu").parts("button","list","item").extend("groupTitle","command","divider"),W0=g("modal").parts("overlay","dialogContainer","dialog").extend("header","closeButton","body","footer"),V0=g("numberinput").parts("root","field","stepperGroup","stepper");g("pininput").parts("field");var L0=g("popover").parts("content","header","body","footer").extend("popper","arrow","closeButton"),O0=g("progress").parts("label","filledTrack","track");g("radio").parts("container","control","label");var q0=g("select").parts("field","icon"),N0=g("slider").parts("container","track","thumb","filledTrack","mark");g("stat").parts("container","label","helpText","number","icon");var G0=g("switch").parts("container","track","thumb");g("table").parts("table","thead","tbody","tr","th","td","tfoot","caption");var U0=g("tabs").parts("root","tab","tablist","tabpanel","tabpanels","indicator");g("tag").parts("container","label","closeButton");g("card").parts("container","header","body","footer");const{definePartsStyle:X0,defineMultiStyleConfig:Y0}=v(D0.keys),K0=a({border:"none"}),Z0=a(e=>{const{colorScheme:r}=e;return{fontWeight:"600",fontSize:"sm",border:"none",borderRadius:"base",bg:o(`${r}.200`,`${r}.700`)(e),color:o(`${r}.900`,`${r}.100`)(e),_hover:{bg:o(`${r}.250`,`${r}.650`)(e)},_expanded:{bg:o(`${r}.250`,`${r}.650`)(e),borderBottomRadius:"none",_hover:{bg:o(`${r}.300`,`${r}.600`)(e)}}}}),J0=a(e=>{const{colorScheme:r}=e;return{bg:o(`${r}.100`,`${r}.800`)(e),borderRadius:"base",borderTopRadius:"none"}}),Q0=a({}),ed=X0(e=>({container:K0,button:Z0(e),panel:J0(e),icon:Q0})),rd=Y0({variants:{invokeAI:ed},defaultProps:{variant:"invokeAI",colorScheme:"base"}}),td=a(e=>{const{colorScheme:r}=e;if(r==="base"){const n={bg:o("base.150","base.700")(e),color:o("base.500","base.500")(e),svg:{fill:o("base.500","base.500")(e)},opacity:1};return{bg:o("base.200","base.600")(e),color:o("base.850","base.100")(e),borderRadius:"base",textShadow:o("0 0 0.3rem var(--invokeai-colors-base-50)","0 0 0.3rem var(--invokeai-colors-base-900)")(e),svg:{fill:o("base.850","base.100")(e),filter:o("drop-shadow(0px 0px 0.3rem var(--invokeai-colors-base-100))","drop-shadow(0px 0px 0.3rem var(--invokeai-colors-base-800))")(e)},_hover:{bg:o("base.300","base.500")(e),color:o("base.900","base.50")(e),svg:{fill:o("base.900","base.50")(e)},_disabled:n},_disabled:n}}const t={bg:o(`${r}.250`,`${r}.700`)(e),color:o(`${r}.50`,`${r}.500`)(e),svg:{fill:o(`${r}.50`,`${r}.500`)(e),filter:"unset"},opacity:1,filter:o(void 0,"saturate(65%)")(e)};return{bg:o(`${r}.400`,`${r}.600`)(e),color:o("base.50","base.100")(e),borderRadius:"base",textShadow:o(`0 0 0.3rem var(--invokeai-colors-${r}-600)`,`0 0 0.3rem var(--invokeai-colors-${r}-800)`)(e),svg:{fill:o("base.50","base.100")(e),filter:o(`drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${r}-600))`,`drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${r}-800))`)(e)},_disabled:t,_hover:{bg:o(`${r}.500`,`${r}.500`)(e),color:o("white","base.50")(e),svg:{fill:o("white","base.50")(e)},_disabled:t}}}),ad=p({variants:{invokeAI:td},defaultProps:{variant:"invokeAI",colorScheme:"base"}}),{definePartsStyle:od,defineMultiStyleConfig:nd}=v(j0.keys),id=a(e=>{const{colorScheme:r}=e;return{bg:o("base.200","base.700")(e),borderColor:o("base.200","base.700")(e),color:o("base.900","base.100")(e),_checked:{bg:o(`${r}.300`,`${r}.600`)(e),borderColor:o(`${r}.300`,`${r}.600`)(e),color:o(`${r}.900`,`${r}.100`)(e),_hover:{bg:o(`${r}.400`,`${r}.500`)(e),borderColor:o(`${r}.400`,`${r}.500`)(e)},_disabled:{borderColor:"transparent",bg:"whiteAlpha.300",color:"whiteAlpha.500"}},_indeterminate:{bg:o(`${r}.300`,`${r}.600`)(e),borderColor:o(`${r}.300`,`${r}.600`)(e),color:o(`${r}.900`,`${r}.100`)(e)},_disabled:{bg:"whiteAlpha.100",borderColor:"transparent"},_focusVisible:{boxShadow:"outline"},_invalid:{borderColor:o("error.600","error.300")(e)}}}),ld=od(e=>({control:id(e)})),sd=nd({variants:{invokeAI:ld},defaultProps:{variant:"invokeAI",colorScheme:"accent"}}),dd=a(e=>({fontSize:"sm",marginEnd:0,mb:1,fontWeight:"400",transitionProperty:"common",transitionDuration:"normal",whiteSpace:"nowrap",_disabled:{opacity:.4},color:o("base.700","base.300")(e)})),cd=p({variants:{invokeAI:dd},defaultProps:{variant:"invokeAI"}}),er=e=>({outline:"none",borderWidth:2,borderStyle:"solid",borderColor:o("base.200","base.800")(e),bg:o("base.50","base.900")(e),borderRadius:"base",color:o("base.900","base.100")(e),boxShadow:"none",_hover:{borderColor:o("base.300","base.600")(e)},_focus:{borderColor:o("accent.200","accent.600")(e),boxShadow:"none",_hover:{borderColor:o("accent.300","accent.500")(e)}},_invalid:{borderColor:o("error.300","error.600")(e),boxShadow:"none",_hover:{borderColor:o("error.400","error.500")(e)}},_disabled:{borderColor:o("base.300","base.700")(e),bg:o("base.300","base.700")(e),color:o("base.600","base.400")(e),_hover:{borderColor:o("base.300","base.700")(e)}},_placeholder:{color:o("base.700","base.400")(e)}}),{definePartsStyle:bd,defineMultiStyleConfig:vd}=v(R0.keys),ud=bd(e=>({field:er(e)})),fd=vd({variants:{invokeAI:ud},defaultProps:{size:"sm",variant:"invokeAI"}}),{definePartsStyle:md,defineMultiStyleConfig:hd}=v(H0.keys),gd=md(e=>({button:{fontWeight:500,bg:o("base.300","base.500")(e),color:o("base.900","base.100")(e),_hover:{bg:o("base.400","base.600")(e),color:o("base.900","base.50")(e),fontWeight:600}},list:{zIndex:9999,bg:o("base.200","base.800")(e),shadow:"dark-lg",border:"none"},item:{fontSize:"sm",bg:o("base.200","base.800")(e),_hover:{bg:o("base.300","base.700")(e)},_focus:{bg:o("base.400","base.600")(e)}}})),yd=hd({variants:{invokeAI:gd},defaultProps:{variant:"invokeAI"}}),{defineMultiStyleConfig:pd,definePartsStyle:Sd}=v(W0.keys),xd=a(e=>({bg:o("blackAlpha.700","blackAlpha.700")(e)})),$d=a({}),kd=a(e=>({layerStyle:"first",maxH:"80vh"})),_d=a(e=>({fontWeight:"600",fontSize:"lg",layerStyle:"first",borderTopRadius:"base",borderInlineEndRadius:"base"})),wd=a({}),zd=a({overflowY:"scroll"}),Cd=a({}),Ad=Sd(e=>({overlay:xd(e),dialogContainer:$d,dialog:kd(e),header:_d(e),closeButton:wd,body:zd,footer:Cd})),Pd=pd({variants:{invokeAI:Ad},defaultProps:{variant:"invokeAI",size:"lg"}}),{defineMultiStyleConfig:Td,definePartsStyle:Fd}=v(V0.keys),Id=a(e=>({height:8})),Md=a(e=>({border:"none",fontWeight:"600",height:"auto",py:1,ps:2,pe:6,...er(e)})),Bd=a(e=>({display:"flex"})),Ed=a(e=>({border:"none",px:2,py:0,mx:-2,my:0,svg:{color:o("base.700","base.300")(e),width:2.5,height:2.5,_hover:{color:o("base.900","base.100")(e)}}})),Dd=Fd(e=>({root:Id(e),field:Md(e),stepperGroup:Bd(e),stepper:Ed(e)})),jd=Td({variants:{invokeAI:Dd},defaultProps:{size:"sm",variant:"invokeAI"}}),{defineMultiStyleConfig:Rd,definePartsStyle:Hd}=v(L0.keys),Wd=y("popper-bg"),Vd=y("popper-arrow-bg"),Ld=y("popper-arrow-shadow-color"),Od=a(e=>({[Vd.variable]:o("colors.base.100","colors.base.800")(e),[Wd.variable]:o("colors.base.100","colors.base.800")(e),[Ld.variable]:o("colors.base.400","colors.base.600")(e),minW:"unset",width:"unset",p:4,bg:o("base.100","base.800")(e),border:"none",shadow:"dark-lg"})),qd=Hd(e=>({content:Od(e)})),Nd=Rd({variants:{invokeAI:qd},defaultProps:{variant:"invokeAI"}}),{defineMultiStyleConfig:Gd,definePartsStyle:Ud}=v(O0.keys),Xd=a(e=>({bg:"accentAlpha.500"})),Yd=a(e=>{const{colorScheme:r}=e;return{bg:o(`${r}.200`,`${r}.700`)(e)}}),Kd=Ud(e=>({filledTrack:Xd(e),track:Yd(e)})),Zd=Gd({variants:{invokeAI:Kd},defaultProps:{variant:"invokeAI"}}),Jd={"::-webkit-scrollbar":{display:"none"},scrollbarWidth:"none"},{definePartsStyle:Qd,defineMultiStyleConfig:ec}=v(q0.keys),rc=a(e=>({color:o("base.200","base.300")(e)})),tc=a(e=>({fontWeight:"600",...er(e)})),ac=Qd(e=>({field:tc(e),icon:rc(e)})),oc=ec({variants:{invokeAI:ac},defaultProps:{size:"sm",variant:"invokeAI"}}),{definePartsStyle:nc,defineMultiStyleConfig:ic}=v(N0.keys),lc=a(e=>({bg:o("base.400","base.600")(e),h:1.5})),sc=a(e=>{const{colorScheme:r}=e;return{bg:o(`${r}.400`,`${r}.600`)(e),h:1.5}}),dc=a(e=>({w:2,h:4,bg:o("base.50","base.100")(e)})),cc=a(e=>({fontSize:"xs",fontWeight:"500",color:o("base.700","base.400")(e),mt:2,insetInlineStart:"unset"})),bc=nc(e=>({container:{_disabled:{opacity:.6,cursor:"default",pointerEvents:"none"}},track:lc(e),filledTrack:sc(e),thumb:dc(e),mark:cc(e)})),vc=ic({variants:{invokeAI:bc},defaultProps:{variant:"invokeAI",colorScheme:"accent"}}),{defineMultiStyleConfig:uc,definePartsStyle:fc}=v(G0.keys),mc=a(e=>{const{colorScheme:r}=e;return{bg:o("base.300","base.600")(e),_focusVisible:{boxShadow:"none"},_checked:{bg:o(`${r}.400`,`${r}.500`)(e)}}}),hc=a(e=>{const{colorScheme:r}=e;return{bg:o(`${r}.50`,`${r}.50`)(e)}}),gc=fc(e=>({container:{},track:mc(e),thumb:hc(e)})),yc=uc({variants:{invokeAI:gc},defaultProps:{size:"md",variant:"invokeAI",colorScheme:"accent"}}),{defineMultiStyleConfig:pc,definePartsStyle:Sc}=v(U0.keys),xc=a(e=>({display:"flex",columnGap:4})),$c=a(e=>({})),kc=a(e=>{const{colorScheme:r}=e;return{display:"flex",flexDirection:"column",gap:1,color:o("base.700","base.400")(e),button:{fontSize:"sm",padding:2,borderRadius:"base",textShadow:o("0 0 0.3rem var(--invokeai-colors-accent-100)","0 0 0.3rem var(--invokeai-colors-accent-900)")(e),svg:{fill:o("base.700","base.300")(e)},_selected:{bg:o("accent.400","accent.600")(e),color:o("base.50","base.100")(e),svg:{fill:o("base.50","base.100")(e),filter:o(`drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${r}-600))`,`drop-shadow(0px 0px 0.3rem var(--invokeai-colors-${r}-800))`)(e)},_hover:{bg:o("accent.500","accent.500")(e),color:o("white","base.50")(e),svg:{fill:o("white","base.50")(e)}}},_hover:{bg:o("base.100","base.800")(e),color:o("base.900","base.50")(e),svg:{fill:o("base.800","base.100")(e)}}}}}),_c=a(e=>({padding:0,height:"100%"})),wc=Sc(e=>({root:xc(e),tab:$c(e),tablist:kc(e),tabpanel:_c(e)})),zc=pc({variants:{invokeAI:wc},defaultProps:{variant:"invokeAI",colorScheme:"accent"}}),Cc=a(e=>({color:o("colors.base.500","colors.base.400")(e)})),Ac=p({variants:{subtext:Cc}}),Pc=a(e=>({...er(e),"::-webkit-scrollbar":{display:"initial"},"::-webkit-resizer":{backgroundImage:`linear-gradient(135deg, + var(--invokeai-colors-base-50) 0%, + var(--invokeai-colors-base-50) 70%, + var(--invokeai-colors-base-200) 70%, + var(--invokeai-colors-base-200) 100%)`},_dark:{"::-webkit-resizer":{backgroundImage:`linear-gradient(135deg, + var(--invokeai-colors-base-900) 0%, + var(--invokeai-colors-base-900) 70%, + var(--invokeai-colors-base-800) 70%, + var(--invokeai-colors-base-800) 100%)`}}})),Tc=p({variants:{invokeAI:Pc},defaultProps:{size:"md",variant:"invokeAI"}}),Fc=y("popper-arrow-bg"),Ic=a(e=>({borderRadius:"base",shadow:"dark-lg",bg:o("base.700","base.200")(e),[Fc.variable]:o("colors.base.700","colors.base.200")(e),pb:1.5})),Mc=p({baseStyle:Ic}),dt=c("skeleton-start-color"),ct=c("skeleton-end-color"),Bc=a({borderRadius:"base",maxW:"full",maxH:"full",_light:{[dt.variable]:"colors.base.250",[ct.variable]:"colors.base.450"},_dark:{[dt.variable]:"colors.base.700",[ct.variable]:"colors.base.500"}}),Ec=p({variants:{invokeAI:Bc},defaultProps:{variant:"invokeAI"}}),Dc={config:{cssVarPrefix:"invokeai",initialColorMode:"dark",useSystemColorMode:!1},layerStyles:{body:{bg:"base.50",color:"base.900",".chakra-ui-dark &":{bg:"base.900",color:"base.50"}},first:{bg:"base.100",color:"base.900",".chakra-ui-dark &":{bg:"base.850",color:"base.100"}},second:{bg:"base.200",color:"base.900",".chakra-ui-dark &":{bg:"base.800",color:"base.100"}}},styles:{global:()=>({layerStyle:"body","*":{...Jd}})},direction:"ltr",fonts:{body:"'Inter Variable', sans-serif"},shadows:{light:{accent:"0 0 10px 0 var(--invokeai-colors-accent-300)",accentHover:"0 0 10px 0 var(--invokeai-colors-accent-400)",ok:"0 0 7px var(--invokeai-colors-ok-600)",working:"0 0 7px var(--invokeai-colors-working-600)",error:"0 0 7px var(--invokeai-colors-error-600)"},dark:{accent:"0 0 10px 0 var(--invokeai-colors-accent-600)",accentHover:"0 0 10px 0 var(--invokeai-colors-accent-500)",ok:"0 0 7px var(--invokeai-colors-ok-400)",working:"0 0 7px var(--invokeai-colors-working-400)",error:"0 0 7px var(--invokeai-colors-error-400)"},selected:{light:"0px 0px 0px 1px var(--invokeai-colors-base-150), 0px 0px 0px 4px var(--invokeai-colors-accent-400)",dark:"0px 0px 0px 1px var(--invokeai-colors-base-900), 0px 0px 0px 4px var(--invokeai-colors-accent-400)"},nodeSelectedOutline:"0 0 0 2px var(--invokeai-colors-base-500)"},colors:E0,components:{Button:ad,Input:fd,Textarea:Tc,Tabs:zc,Progress:Zd,Accordion:rd,FormLabel:cd,Switch:yc,NumberInput:jd,Select:oc,Skeleton:Ec,Slider:vc,Popover:Nd,Modal:Pd,Checkbox:sd,Menu:yd,Text:Ac,Tooltip:Mc}};const jc={colorScheme:"dark",fontFamily:"'Inter Variable', sans-serif",components:{ScrollArea:{defaultProps:{scrollbarSize:10},styles:{scrollbar:{"&:hover":{backgroundColor:"var(--invokeai-colors-baseAlpha-300)"}},thumb:{backgroundColor:"var(--invokeai-colors-baseAlpha-300)"}}}}};const Rc=mt("@@invokeai-color-mode");function Vc({children:e}){const{i18n:r}=Xt(),t=r.dir(),n=k.useMemo(()=>z0({...Dc,direction:t}),[t]);return k.useEffect(()=>{document.body.dir=t},[t]),S.jsx(Yt,{withGlobalStyles:!0,theme:jc,children:S.jsx(B0,{theme:n,colorModeManager:Rc,children:e})})}export{Vc as default}; diff --git a/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-8d49f92d.css b/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-8d49f92d.css new file mode 100644 index 0000000000..450d24ac16 --- /dev/null +++ b/invokeai/frontend/web/dist/assets/ThemeLocaleProvider-8d49f92d.css @@ -0,0 +1,9 @@ +@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-cyrillic-ext-wght-normal-848492d3.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-cyrillic-wght-normal-262a1054.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-greek-ext-wght-normal-fe977ddb.woff2) format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-greek-wght-normal-89b4a3fe.woff2) format("woff2-variations");unicode-range:U+0370-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-vietnamese-wght-normal-ac4e131c.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-latin-ext-wght-normal-45606f83.woff2) format("woff2-variations");unicode-range:U+0100-02AF,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1E00-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-latin-wght-normal-450f3ba4.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}/*! +* OverlayScrollbars +* Version: 2.2.0 +* +* Copyright (c) Rene Haas | KingSora. +* https://github.com/KingSora +* +* Released under the MIT license. +*/.os-size-observer,.os-size-observer-listener{direction:inherit;pointer-events:none;overflow:hidden;visibility:hidden;box-sizing:border-box}.os-size-observer,.os-size-observer-listener,.os-size-observer-listener-item,.os-size-observer-listener-item-final{writing-mode:horizontal-tb;position:absolute;left:0;top:0}.os-size-observer{z-index:-1;contain:strict;display:flex;flex-direction:row;flex-wrap:nowrap;padding:inherit;border:inherit;box-sizing:inherit;margin:-133px;top:0;right:0;bottom:0;left:0;transform:scale(.1)}.os-size-observer:before{content:"";flex:none;box-sizing:inherit;padding:10px;width:10px;height:10px}.os-size-observer-appear{animation:os-size-observer-appear-animation 1ms forwards}.os-size-observer-listener{box-sizing:border-box;position:relative;flex:auto;padding:inherit;border:inherit;margin:-133px;transform:scale(10)}.os-size-observer-listener.ltr{margin-right:-266px;margin-left:0}.os-size-observer-listener.rtl{margin-left:-266px;margin-right:0}.os-size-observer-listener:empty:before{content:"";width:100%;height:100%}.os-size-observer-listener:empty:before,.os-size-observer-listener>.os-size-observer-listener-item{display:block;position:relative;padding:inherit;border:inherit;box-sizing:content-box;flex:auto}.os-size-observer-listener-scroll{box-sizing:border-box;display:flex}.os-size-observer-listener-item{right:0;bottom:0;overflow:hidden;direction:ltr;flex:none}.os-size-observer-listener-item-final{transition:none}@keyframes os-size-observer-appear-animation{0%{cursor:auto}to{cursor:none}}.os-trinsic-observer{flex:none;box-sizing:border-box;position:relative;max-width:0px;max-height:1px;padding:0;margin:0;border:none;overflow:hidden;z-index:-1;height:0;top:calc(100% + 1px);contain:strict}.os-trinsic-observer:not(:empty){height:calc(100% + 1px);top:-1px}.os-trinsic-observer:not(:empty)>.os-size-observer{width:1000%;height:1000%;min-height:1px;min-width:1px}.os-environment{--os-custom-prop: -1;position:fixed;opacity:0;visibility:hidden;overflow:scroll;height:200px;width:200px;z-index:var(--os-custom-prop)}.os-environment div{width:200%;height:200%;margin:10px 0}.os-environment.os-environment-flexbox-glue{display:flex;flex-direction:row;flex-wrap:nowrap;height:auto;width:auto;min-height:200px;min-width:200px}.os-environment.os-environment-flexbox-glue div{flex:auto;width:auto;height:auto;max-height:100%;max-width:100%;margin:0}.os-environment.os-environment-flexbox-glue-max{max-height:200px}.os-environment.os-environment-flexbox-glue-max div{overflow:visible}.os-environment.os-environment-flexbox-glue-max div:before{content:"";display:block;height:999px;width:999px}.os-environment,[data-overlayscrollbars-viewport]{-ms-overflow-style:scrollbar!important}[data-overlayscrollbars-initialize],[data-overlayscrollbars~=scrollbarHidden],[data-overlayscrollbars-viewport~=scrollbarHidden],.os-scrollbar-hidden.os-environment{scrollbar-width:none!important}[data-overlayscrollbars-initialize]::-webkit-scrollbar,[data-overlayscrollbars-initialize]::-webkit-scrollbar-corner,[data-overlayscrollbars~=scrollbarHidden]::-webkit-scrollbar,[data-overlayscrollbars~=scrollbarHidden]::-webkit-scrollbar-corner,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar,[data-overlayscrollbars-viewport~=scrollbarHidden]::-webkit-scrollbar-corner,.os-scrollbar-hidden.os-environment::-webkit-scrollbar,.os-scrollbar-hidden.os-environment::-webkit-scrollbar-corner{-webkit-appearance:none!important;appearance:none!important;display:none!important;width:0!important;height:0!important}[data-overlayscrollbars-initialize]{overflow:auto}html[data-overlayscrollbars],html.os-scrollbar-hidden,html.os-scrollbar-hidden>body{box-sizing:border-box;margin:0;width:100%;height:100%}html[data-overlayscrollbars]>body{overflow:visible}[data-overlayscrollbars~=host]{position:relative}[data-overlayscrollbars~=host],[data-overlayscrollbars-padding]{display:flex;flex-direction:row!important;flex-wrap:nowrap!important}[data-overlayscrollbars-padding],[data-overlayscrollbars-viewport]{box-sizing:inherit;position:relative;flex:auto!important;height:auto;width:100%;padding:0;margin:0;border:none;z-index:0}[data-overlayscrollbars-viewport]{--os-vaw: 0;--os-vah: 0}[data-overlayscrollbars-viewport][data-overlayscrollbars-viewport~=arrange]:before{content:"";position:absolute;pointer-events:none;z-index:-1;min-width:1px;min-height:1px;width:var(--os-vaw);height:var(--os-vah)}[data-overlayscrollbars-padding],[data-overlayscrollbars-viewport],[data-overlayscrollbars~=host],[data-overlayscrollbars~=viewport]{overflow:hidden}[data-overlayscrollbars~=overflowVisible],[data-overlayscrollbars-padding~=overflowVisible],[data-overlayscrollbars-viewport~=overflowVisible]{overflow:visible}[data-overlayscrollbars-overflow-x=hidden]{overflow-x:hidden}[data-overlayscrollbars-overflow-x=scroll]{overflow-x:scroll}[data-overlayscrollbars-overflow-x=hidden]{overflow-y:hidden}[data-overlayscrollbars-overflow-y=scroll]{overflow-y:scroll}[data-overlayscrollbars~=scrollbarPressed],[data-overlayscrollbars~=scrollbarPressed] [data-overlayscrollbars-viewport]{scroll-behavior:auto!important}[data-overlayscrollbars-content]{box-sizing:inherit}[data-overlayscrollbars-grid],[data-overlayscrollbars-grid] [data-overlayscrollbars-padding]{display:grid;grid-template:1fr/1fr}[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding],[data-overlayscrollbars-grid]>[data-overlayscrollbars-viewport],[data-overlayscrollbars-grid]>[data-overlayscrollbars-padding]>[data-overlayscrollbars-viewport]{height:auto!important;width:auto!important}.os-scrollbar{contain:size layout;contain:size layout style;transition:opacity .15s,visibility .15s,top .15s,right .15s,bottom .15s,left .15s;pointer-events:none;position:absolute;opacity:0;visibility:hidden}body>.os-scrollbar{position:fixed;z-index:99999}.os-scrollbar-transitionless{transition:none}.os-scrollbar-track{position:relative;direction:ltr!important;padding:0!important;border:none!important}.os-scrollbar-handle{position:absolute}.os-scrollbar-track,.os-scrollbar-handle{pointer-events:none;width:100%;height:100%}.os-scrollbar.os-scrollbar-track-interactive .os-scrollbar-track,.os-scrollbar.os-scrollbar-handle-interactive .os-scrollbar-handle{pointer-events:auto;touch-action:none}.os-scrollbar-horizontal{bottom:0;left:0}.os-scrollbar-vertical{top:0;right:0}.os-scrollbar-rtl.os-scrollbar-horizontal{right:0}.os-scrollbar-rtl.os-scrollbar-vertical{right:auto;left:0}.os-scrollbar-visible,.os-scrollbar-interaction.os-scrollbar-visible{opacity:1;visibility:visible}.os-scrollbar-auto-hidden{opacity:0;visibility:hidden}.os-scrollbar-unusable,.os-scrollbar-unusable *,.os-scrollbar-wheel,.os-scrollbar-wheel *{pointer-events:none!important}.os-scrollbar-unusable .os-scrollbar-handle{opacity:0!important}.os-scrollbar-horizontal .os-scrollbar-handle{bottom:0}.os-scrollbar-vertical .os-scrollbar-handle{right:0}.os-scrollbar-rtl.os-scrollbar-vertical .os-scrollbar-handle{right:auto;left:0}.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-horizontal.os-scrollbar-cornerless.os-scrollbar-rtl{left:0;right:0}.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless,.os-scrollbar.os-scrollbar-vertical.os-scrollbar-cornerless.os-scrollbar-rtl{top:0;bottom:0}.os-scrollbar{--os-size: 0;--os-padding-perpendicular: 0;--os-padding-axis: 0;--os-track-border-radius: 0;--os-track-bg: none;--os-track-bg-hover: none;--os-track-bg-active: none;--os-track-border: none;--os-track-border-hover: none;--os-track-border-active: none;--os-handle-border-radius: 0;--os-handle-bg: none;--os-handle-bg-hover: none;--os-handle-bg-active: none;--os-handle-border: none;--os-handle-border-hover: none;--os-handle-border-active: none;--os-handle-min-size: 33px;--os-handle-max-size: none;--os-handle-perpendicular-size: 100%;--os-handle-perpendicular-size-hover: 100%;--os-handle-perpendicular-size-active: 100%;--os-handle-interactive-area-offset: 0}.os-scrollbar .os-scrollbar-track{border:var(--os-track-border);border-radius:var(--os-track-border-radius);background:var(--os-track-bg);transition:opacity .15s,background-color .15s,border-color .15s}.os-scrollbar .os-scrollbar-track:hover{border:var(--os-track-border-hover);background:var(--os-track-bg-hover)}.os-scrollbar .os-scrollbar-track:active{border:var(--os-track-border-active);background:var(--os-track-bg-active)}.os-scrollbar .os-scrollbar-handle{border:var(--os-handle-border);border-radius:var(--os-handle-border-radius);background:var(--os-handle-bg)}.os-scrollbar .os-scrollbar-handle:before{content:"";position:absolute;left:0;right:0;top:0;bottom:0;display:block}.os-scrollbar .os-scrollbar-handle:hover{border:var(--os-handle-border-hover);background:var(--os-handle-bg-hover)}.os-scrollbar .os-scrollbar-handle:active{border:var(--os-handle-border-active);background:var(--os-handle-bg-active)}.os-scrollbar-horizontal{padding:var(--os-padding-perpendicular) var(--os-padding-axis);right:var(--os-size);height:var(--os-size)}.os-scrollbar-horizontal.os-scrollbar-rtl{left:var(--os-size);right:0}.os-scrollbar-horizontal .os-scrollbar-handle{min-width:var(--os-handle-min-size);max-width:var(--os-handle-max-size);height:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,height .15s}.os-scrollbar-horizontal .os-scrollbar-handle:before{top:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);bottom:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-horizontal:hover .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-horizontal:active .os-scrollbar-handle{height:var(--os-handle-perpendicular-size-active)}.os-scrollbar-vertical{padding:var(--os-padding-axis) var(--os-padding-perpendicular);bottom:var(--os-size);width:var(--os-size)}.os-scrollbar-vertical .os-scrollbar-handle{min-height:var(--os-handle-min-size);max-height:var(--os-handle-max-size);width:var(--os-handle-perpendicular-size);transition:opacity .15s,background-color .15s,border-color .15s,width .15s}.os-scrollbar-vertical .os-scrollbar-handle:before{left:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);right:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before{right:calc((var(--os-padding-perpendicular) + var(--os-handle-interactive-area-offset)) * -1);left:calc(var(--os-padding-perpendicular) * -1)}.os-scrollbar-vertical:hover .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-hover)}.os-scrollbar-vertical:active .os-scrollbar-handle{width:var(--os-handle-perpendicular-size-active)}[data-overlayscrollbars~=updating]>.os-scrollbar,.os-theme-none.os-scrollbar{display:none!important}.os-theme-dark,.os-theme-light{box-sizing:border-box;--os-size: 10px;--os-padding-perpendicular: 2px;--os-padding-axis: 2px;--os-track-border-radius: 10px;--os-handle-interactive-area-offset: 4px;--os-handle-border-radius: 10px}.os-theme-dark{--os-handle-bg: rgba(0, 0, 0, .44);--os-handle-bg-hover: rgba(0, 0, 0, .55);--os-handle-bg-active: rgba(0, 0, 0, .66)}.os-theme-light{--os-handle-bg: rgba(255, 255, 255, .44);--os-handle-bg-hover: rgba(255, 255, 255, .55);--os-handle-bg-active: rgba(255, 255, 255, .66)}.os-no-css-vars.os-theme-dark.os-scrollbar .os-scrollbar-handle,.os-no-css-vars.os-theme-light.os-scrollbar .os-scrollbar-handle,.os-no-css-vars.os-theme-dark.os-scrollbar .os-scrollbar-track,.os-no-css-vars.os-theme-light.os-scrollbar .os-scrollbar-track{border-radius:10px}.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal,.os-no-css-vars.os-theme-light.os-scrollbar-horizontal{padding:2px;right:10px;height:10px}.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal.os-scrollbar-rtl,.os-no-css-vars.os-theme-light.os-scrollbar-horizontal.os-scrollbar-rtl{left:10px;right:0}.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal .os-scrollbar-handle,.os-no-css-vars.os-theme-light.os-scrollbar-horizontal .os-scrollbar-handle{min-width:33px;max-width:none}.os-no-css-vars.os-theme-dark.os-scrollbar-horizontal .os-scrollbar-handle:before,.os-no-css-vars.os-theme-light.os-scrollbar-horizontal .os-scrollbar-handle:before{top:-6px;bottom:-2px}.os-no-css-vars.os-theme-dark.os-scrollbar-vertical,.os-no-css-vars.os-theme-light.os-scrollbar-vertical{padding:2px;bottom:10px;width:10px}.os-no-css-vars.os-theme-dark.os-scrollbar-vertical .os-scrollbar-handle,.os-no-css-vars.os-theme-light.os-scrollbar-vertical .os-scrollbar-handle{min-height:33px;max-height:none}.os-no-css-vars.os-theme-dark.os-scrollbar-vertical .os-scrollbar-handle:before,.os-no-css-vars.os-theme-light.os-scrollbar-vertical .os-scrollbar-handle:before{left:-6px;right:-2px}.os-no-css-vars.os-theme-dark.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before,.os-no-css-vars.os-theme-light.os-scrollbar-vertical.os-scrollbar-rtl .os-scrollbar-handle:before{right:-6px;left:-2px}.os-no-css-vars.os-theme-dark .os-scrollbar-handle{background:rgba(0,0,0,.44)}.os-no-css-vars.os-theme-dark:hover .os-scrollbar-handle{background:rgba(0,0,0,.55)}.os-no-css-vars.os-theme-dark:active .os-scrollbar-handle{background:rgba(0,0,0,.66)}.os-no-css-vars.os-theme-light .os-scrollbar-handle{background:rgba(255,255,255,.44)}.os-no-css-vars.os-theme-light:hover .os-scrollbar-handle{background:rgba(255,255,255,.55)}.os-no-css-vars.os-theme-light:active .os-scrollbar-handle{background:rgba(255,255,255,.66)}.os-scrollbar{--os-handle-bg: var(--invokeai-colors-accentAlpha-500);--os-handle-bg-hover: var(--invokeai-colors-accentAlpha-700);--os-handle-bg-active: var(--invokeai-colors-accentAlpha-800);--os-handle-min-size: 50px} diff --git a/invokeai/frontend/web/dist/assets/index-078526aa.js b/invokeai/frontend/web/dist/assets/index-078526aa.js new file mode 100644 index 0000000000..82ed5e7a88 --- /dev/null +++ b/invokeai/frontend/web/dist/assets/index-078526aa.js @@ -0,0 +1,125 @@ +function Yk(e,t){for(var n=0;nr[i]})}}}return Object.freeze(Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}))}(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const s of o.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function r(i){if(i.ep)return;i.ep=!0;const o=n(i);fetch(i.href,o)}})();var Me=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function kl(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Jj(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var n=function r(){if(this instanceof r){var i=[null];i.push.apply(i,arguments);var o=Function.bind.apply(t,i);return new o}return t.apply(this,arguments)};n.prototype=t.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(r){var i=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(n,r,i.get?i:{enumerable:!0,get:function(){return e[r]}})}),n}var Xk={exports:{}},T0={},Qk={exports:{}},ze={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Gh=Symbol.for("react.element"),eV=Symbol.for("react.portal"),tV=Symbol.for("react.fragment"),nV=Symbol.for("react.strict_mode"),rV=Symbol.for("react.profiler"),iV=Symbol.for("react.provider"),oV=Symbol.for("react.context"),sV=Symbol.for("react.forward_ref"),aV=Symbol.for("react.suspense"),lV=Symbol.for("react.memo"),uV=Symbol.for("react.lazy"),E4=Symbol.iterator;function cV(e){return e===null||typeof e!="object"?null:(e=E4&&e[E4]||e["@@iterator"],typeof e=="function"?e:null)}var Zk={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Jk=Object.assign,eA={};function Bc(e,t,n){this.props=e,this.context=t,this.refs=eA,this.updater=n||Zk}Bc.prototype.isReactComponent={};Bc.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Bc.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function tA(){}tA.prototype=Bc.prototype;function $x(e,t,n){this.props=e,this.context=t,this.refs=eA,this.updater=n||Zk}var Fx=$x.prototype=new tA;Fx.constructor=$x;Jk(Fx,Bc.prototype);Fx.isPureReactComponent=!0;var P4=Array.isArray,nA=Object.prototype.hasOwnProperty,Bx={current:null},rA={key:!0,ref:!0,__self:!0,__source:!0};function iA(e,t,n){var r,i={},o=null,s=null;if(t!=null)for(r in t.ref!==void 0&&(s=t.ref),t.key!==void 0&&(o=""+t.key),t)nA.call(t,r)&&!rA.hasOwnProperty(r)&&(i[r]=t[r]);var a=arguments.length-2;if(a===1)i.children=n;else if(1>>1,z=R[V];if(0>>1;Vi(q,L))Xi(F,q)?(R[V]=F,R[X]=L,V=X):(R[V]=q,R[K]=L,V=K);else if(Xi(F,L))R[V]=F,R[X]=L,V=X;else break e}}return D}function i(R,D){var L=R.sortIndex-D.sortIndex;return L!==0?L:R.id-D.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var s=Date,a=s.now();e.unstable_now=function(){return s.now()-a}}var l=[],u=[],c=1,d=null,f=3,h=!1,p=!1,m=!1,S=typeof setTimeout=="function"?setTimeout:null,v=typeof clearTimeout=="function"?clearTimeout:null,y=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function g(R){for(var D=n(u);D!==null;){if(D.callback===null)r(u);else if(D.startTime<=R)r(u),D.sortIndex=D.expirationTime,t(l,D);else break;D=n(u)}}function b(R){if(m=!1,g(R),!p)if(n(l)!==null)p=!0,I(_);else{var D=n(u);D!==null&&N(b,D.startTime-R)}}function _(R,D){p=!1,m&&(m=!1,v(C),C=-1),h=!0;var L=f;try{for(g(D),d=n(l);d!==null&&(!(d.expirationTime>D)||R&&!A());){var V=d.callback;if(typeof V=="function"){d.callback=null,f=d.priorityLevel;var z=V(d.expirationTime<=D);D=e.unstable_now(),typeof z=="function"?d.callback=z:d===n(l)&&r(l),g(D)}else r(l);d=n(l)}if(d!==null)var U=!0;else{var K=n(u);K!==null&&N(b,K.startTime-D),U=!1}return U}finally{d=null,f=L,h=!1}}var w=!1,x=null,C=-1,k=5,P=-1;function A(){return!(e.unstable_now()-PR||125V?(R.sortIndex=L,t(u,R),n(l)===null&&R===n(u)&&(m?(v(C),C=-1):m=!0,N(b,L-V))):(R.sortIndex=z,t(l,R),p||h||(p=!0,I(_))),R},e.unstable_shouldYield=A,e.unstable_wrapCallback=function(R){var D=f;return function(){var L=f;f=D;try{return R.apply(this,arguments)}finally{f=L}}}})(lA);aA.exports=lA;var _V=aA.exports;/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var uA=E,Br=_V;function te(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),U2=Object.prototype.hasOwnProperty,wV=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,O4={},R4={};function xV(e){return U2.call(R4,e)?!0:U2.call(O4,e)?!1:wV.test(e)?R4[e]=!0:(O4[e]=!0,!1)}function CV(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function TV(e,t,n,r){if(t===null||typeof t>"u"||CV(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function cr(e,t,n,r,i,o,s){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=i,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=s}var Vn={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Vn[e]=new cr(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Vn[t]=new cr(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Vn[e]=new cr(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Vn[e]=new cr(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Vn[e]=new cr(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Vn[e]=new cr(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Vn[e]=new cr(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Vn[e]=new cr(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Vn[e]=new cr(e,5,!1,e.toLowerCase(),null,!1,!1)});var Vx=/[\-:]([a-z])/g;function zx(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(Vx,zx);Vn[t]=new cr(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(Vx,zx);Vn[t]=new cr(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(Vx,zx);Vn[t]=new cr(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Vn[e]=new cr(e,1,!1,e.toLowerCase(),null,!1,!1)});Vn.xlinkHref=new cr("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Vn[e]=new cr(e,1,!1,e.toLowerCase(),null,!0,!0)});function Ux(e,t,n,r){var i=Vn.hasOwnProperty(t)?Vn[t]:null;(i!==null?i.type!==0:r||!(2a||i[s]!==o[a]){var l=` +`+i[s].replace(" at new "," at ");return e.displayName&&l.includes("")&&(l=l.replace("",e.displayName)),l}while(1<=s&&0<=a);break}}}finally{Wb=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?jd(e):""}function EV(e){switch(e.tag){case 5:return jd(e.type);case 16:return jd("Lazy");case 13:return jd("Suspense");case 19:return jd("SuspenseList");case 0:case 2:case 15:return e=qb(e.type,!1),e;case 11:return e=qb(e.type.render,!1),e;case 1:return e=qb(e.type,!0),e;default:return""}}function q2(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case _u:return"Fragment";case Su:return"Portal";case G2:return"Profiler";case Gx:return"StrictMode";case H2:return"Suspense";case W2:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case fA:return(e.displayName||"Context")+".Consumer";case dA:return(e._context.displayName||"Context")+".Provider";case Hx:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Wx:return t=e.displayName||null,t!==null?t:q2(e.type)||"Memo";case Rs:t=e._payload,e=e._init;try{return q2(e(t))}catch{}}return null}function PV(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return q2(t);case 8:return t===Gx?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function sa(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function pA(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function kV(e){var t=pA(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var i=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(s){r=""+s,o.call(this,s)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(s){r=""+s},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Kp(e){e._valueTracker||(e._valueTracker=kV(e))}function gA(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=pA(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Mm(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function K2(e,t){var n=t.checked;return jt({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function N4(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=sa(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function mA(e,t){t=t.checked,t!=null&&Ux(e,"checked",t,!1)}function Y2(e,t){mA(e,t);var n=sa(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?X2(e,t.type,n):t.hasOwnProperty("defaultValue")&&X2(e,t.type,sa(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function M4(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function X2(e,t,n){(t!=="number"||Mm(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Vd=Array.isArray;function Fu(e,t,n,r){if(e=e.options,t){t={};for(var i=0;i"+t.valueOf().toString()+"",t=Yp.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Cf(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var ef={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},AV=["Webkit","ms","Moz","O"];Object.keys(ef).forEach(function(e){AV.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),ef[t]=ef[e]})});function SA(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||ef.hasOwnProperty(e)&&ef[e]?(""+t).trim():t+"px"}function _A(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,i=SA(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,i):e[n]=i}}var OV=jt({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function J2(e,t){if(t){if(OV[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(te(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(te(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(te(61))}if(t.style!=null&&typeof t.style!="object")throw Error(te(62))}}function e_(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var t_=null;function qx(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var n_=null,Bu=null,ju=null;function $4(e){if(e=qh(e)){if(typeof n_!="function")throw Error(te(280));var t=e.stateNode;t&&(t=O0(t),n_(e.stateNode,e.type,t))}}function wA(e){Bu?ju?ju.push(e):ju=[e]:Bu=e}function xA(){if(Bu){var e=Bu,t=ju;if(ju=Bu=null,$4(e),t)for(e=0;e>>=0,e===0?32:31-(VV(e)/zV|0)|0}var Xp=64,Qp=4194304;function zd(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Fm(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,i=e.suspendedLanes,o=e.pingedLanes,s=n&268435455;if(s!==0){var a=s&~i;a!==0?r=zd(a):(o&=s,o!==0&&(r=zd(o)))}else s=n&~i,s!==0?r=zd(s):o!==0&&(r=zd(o));if(r===0)return 0;if(t!==0&&t!==r&&!(t&i)&&(i=r&-r,o=t&-t,i>=o||i===16&&(o&4194240)!==0))return t;if(r&4&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Hh(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-ki(t),e[t]=n}function WV(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=nf),W4=String.fromCharCode(32),q4=!1;function UA(e,t){switch(e){case"keyup":return Sz.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function GA(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var wu=!1;function wz(e,t){switch(e){case"compositionend":return GA(t);case"keypress":return t.which!==32?null:(q4=!0,W4);case"textInput":return e=t.data,e===W4&&q4?null:e;default:return null}}function xz(e,t){if(wu)return e==="compositionend"||!tC&&UA(e,t)?(e=VA(),Yg=Zx=Us=null,wu=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=Q4(n)}}function KA(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?KA(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function YA(){for(var e=window,t=Mm();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Mm(e.document)}return t}function nC(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Iz(e){var t=YA(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&KA(n.ownerDocument.documentElement,n)){if(r!==null&&nC(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=n.textContent.length,o=Math.min(r.start,i);r=r.end===void 0?o:Math.min(r.end,i),!e.extend&&o>r&&(i=r,r=o,o=i),i=Z4(n,o);var s=Z4(n,r);i&&s&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==s.node||e.focusOffset!==s.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(s.node,s.offset)):(t.setEnd(s.node,s.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,xu=null,l_=null,of=null,u_=!1;function J4(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;u_||xu==null||xu!==Mm(r)||(r=xu,"selectionStart"in r&&nC(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),of&&Of(of,r)||(of=r,r=Vm(l_,"onSelect"),0Eu||(e.current=g_[Eu],g_[Eu]=null,Eu--)}function gt(e,t){Eu++,g_[Eu]=e.current,e.current=t}var aa={},Kn=Sa(aa),_r=Sa(!1),dl=aa;function cc(e,t){var n=e.type.contextTypes;if(!n)return aa;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var i={},o;for(o in n)i[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function wr(e){return e=e.childContextTypes,e!=null}function Um(){St(_r),St(Kn)}function sT(e,t,n){if(Kn.current!==aa)throw Error(te(168));gt(Kn,t),gt(_r,n)}function iO(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var i in r)if(!(i in t))throw Error(te(108,PV(e)||"Unknown",i));return jt({},n,r)}function Gm(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||aa,dl=Kn.current,gt(Kn,e),gt(_r,_r.current),!0}function aT(e,t,n){var r=e.stateNode;if(!r)throw Error(te(169));n?(e=iO(e,t,dl),r.__reactInternalMemoizedMergedChildContext=e,St(_r),St(Kn),gt(Kn,e)):St(_r),gt(_r,n)}var jo=null,R0=!1,aS=!1;function oO(e){jo===null?jo=[e]:jo.push(e)}function Gz(e){R0=!0,oO(e)}function _a(){if(!aS&&jo!==null){aS=!0;var e=0,t=rt;try{var n=jo;for(rt=1;e>=s,i-=s,Ho=1<<32-ki(t)+i|n<C?(k=x,x=null):k=x.sibling;var P=f(v,x,g[C],b);if(P===null){x===null&&(x=k);break}e&&x&&P.alternate===null&&t(v,x),y=o(P,y,C),w===null?_=P:w.sibling=P,w=P,x=k}if(C===g.length)return n(v,x),Pt&&ja(v,C),_;if(x===null){for(;CC?(k=x,x=null):k=x.sibling;var A=f(v,x,P.value,b);if(A===null){x===null&&(x=k);break}e&&x&&A.alternate===null&&t(v,x),y=o(A,y,C),w===null?_=A:w.sibling=A,w=A,x=k}if(P.done)return n(v,x),Pt&&ja(v,C),_;if(x===null){for(;!P.done;C++,P=g.next())P=d(v,P.value,b),P!==null&&(y=o(P,y,C),w===null?_=P:w.sibling=P,w=P);return Pt&&ja(v,C),_}for(x=r(v,x);!P.done;C++,P=g.next())P=h(x,v,C,P.value,b),P!==null&&(e&&P.alternate!==null&&x.delete(P.key===null?C:P.key),y=o(P,y,C),w===null?_=P:w.sibling=P,w=P);return e&&x.forEach(function($){return t(v,$)}),Pt&&ja(v,C),_}function S(v,y,g,b){if(typeof g=="object"&&g!==null&&g.type===_u&&g.key===null&&(g=g.props.children),typeof g=="object"&&g!==null){switch(g.$$typeof){case qp:e:{for(var _=g.key,w=y;w!==null;){if(w.key===_){if(_=g.type,_===_u){if(w.tag===7){n(v,w.sibling),y=i(w,g.props.children),y.return=v,v=y;break e}}else if(w.elementType===_||typeof _=="object"&&_!==null&&_.$$typeof===Rs&&pT(_)===w.type){n(v,w.sibling),y=i(w,g.props),y.ref=yd(v,w,g),y.return=v,v=y;break e}n(v,w);break}else t(v,w);w=w.sibling}g.type===_u?(y=rl(g.props.children,v.mode,b,g.key),y.return=v,v=y):(b=rm(g.type,g.key,g.props,null,v.mode,b),b.ref=yd(v,y,g),b.return=v,v=b)}return s(v);case Su:e:{for(w=g.key;y!==null;){if(y.key===w)if(y.tag===4&&y.stateNode.containerInfo===g.containerInfo&&y.stateNode.implementation===g.implementation){n(v,y.sibling),y=i(y,g.children||[]),y.return=v,v=y;break e}else{n(v,y);break}else t(v,y);y=y.sibling}y=gS(g,v.mode,b),y.return=v,v=y}return s(v);case Rs:return w=g._init,S(v,y,w(g._payload),b)}if(Vd(g))return p(v,y,g,b);if(fd(g))return m(v,y,g,b);ig(v,g)}return typeof g=="string"&&g!==""||typeof g=="number"?(g=""+g,y!==null&&y.tag===6?(n(v,y.sibling),y=i(y,g),y.return=v,v=y):(n(v,y),y=pS(g,v.mode,b),y.return=v,v=y),s(v)):n(v,y)}return S}var fc=hO(!0),pO=hO(!1),Kh={},ao=Sa(Kh),Mf=Sa(Kh),Df=Sa(Kh);function Xa(e){if(e===Kh)throw Error(te(174));return e}function dC(e,t){switch(gt(Df,t),gt(Mf,e),gt(ao,Kh),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Z2(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Z2(t,e)}St(ao),gt(ao,t)}function hc(){St(ao),St(Mf),St(Df)}function gO(e){Xa(Df.current);var t=Xa(ao.current),n=Z2(t,e.type);t!==n&&(gt(Mf,e),gt(ao,n))}function fC(e){Mf.current===e&&(St(ao),St(Mf))}var Mt=Sa(0);function Xm(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedState;if(n!==null&&(n=n.dehydrated,n===null||n.data==="$?"||n.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var lS=[];function hC(){for(var e=0;en?n:4,e(!0);var r=uS.transition;uS.transition={};try{e(!1),t()}finally{rt=n,uS.transition=r}}function RO(){return di().memoizedState}function Kz(e,t,n){var r=Qs(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},IO(e))NO(t,n);else if(n=uO(e,t,n,r),n!==null){var i=or();Ai(n,e,r,i),MO(n,t,r)}}function Yz(e,t,n){var r=Qs(e),i={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(IO(e))NO(t,i);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var s=t.lastRenderedState,a=o(s,n);if(i.hasEagerState=!0,i.eagerState=a,Mi(a,s)){var l=t.interleaved;l===null?(i.next=i,uC(t)):(i.next=l.next,l.next=i),t.interleaved=i;return}}catch{}finally{}n=uO(e,t,i,r),n!==null&&(i=or(),Ai(n,e,r,i),MO(n,t,r))}}function IO(e){var t=e.alternate;return e===Bt||t!==null&&t===Bt}function NO(e,t){sf=Qm=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function MO(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Yx(e,n)}}var Zm={readContext:ci,useCallback:Gn,useContext:Gn,useEffect:Gn,useImperativeHandle:Gn,useInsertionEffect:Gn,useLayoutEffect:Gn,useMemo:Gn,useReducer:Gn,useRef:Gn,useState:Gn,useDebugValue:Gn,useDeferredValue:Gn,useTransition:Gn,useMutableSource:Gn,useSyncExternalStore:Gn,useId:Gn,unstable_isNewReconciler:!1},Xz={readContext:ci,useCallback:function(e,t){return Gi().memoizedState=[e,t===void 0?null:t],e},useContext:ci,useEffect:mT,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,Jg(4194308,4,EO.bind(null,t,e),n)},useLayoutEffect:function(e,t){return Jg(4194308,4,e,t)},useInsertionEffect:function(e,t){return Jg(4,2,e,t)},useMemo:function(e,t){var n=Gi();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Gi();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Kz.bind(null,Bt,e),[r.memoizedState,e]},useRef:function(e){var t=Gi();return e={current:e},t.memoizedState=e},useState:gT,useDebugValue:vC,useDeferredValue:function(e){return Gi().memoizedState=e},useTransition:function(){var e=gT(!1),t=e[0];return e=qz.bind(null,e[1]),Gi().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=Bt,i=Gi();if(Pt){if(n===void 0)throw Error(te(407));n=n()}else{if(n=t(),En===null)throw Error(te(349));hl&30||vO(r,t,n)}i.memoizedState=n;var o={value:n,getSnapshot:t};return i.queue=o,mT(SO.bind(null,r,o,e),[e]),r.flags|=2048,Ff(9,bO.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=Gi(),t=En.identifierPrefix;if(Pt){var n=Wo,r=Ho;n=(r&~(1<<32-ki(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=Lf++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=s.createElement(n,{is:r.is}):(e=s.createElement(n),n==="select"&&(s=e,r.multiple?s.multiple=!0:r.size&&(s.size=r.size))):e=s.createElementNS(e,n),e[Xi]=t,e[Nf]=r,UO(e,t,!1,!1),t.stateNode=e;e:{switch(s=e_(n,r),n){case"dialog":yt("cancel",e),yt("close",e),i=r;break;case"iframe":case"object":case"embed":yt("load",e),i=r;break;case"video":case"audio":for(i=0;igc&&(t.flags|=128,r=!0,vd(o,!1),t.lanes=4194304)}else{if(!r)if(e=Xm(s),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),vd(o,!0),o.tail===null&&o.tailMode==="hidden"&&!s.alternate&&!Pt)return Hn(t),null}else 2*Wt()-o.renderingStartTime>gc&&n!==1073741824&&(t.flags|=128,r=!0,vd(o,!1),t.lanes=4194304);o.isBackwards?(s.sibling=t.child,t.child=s):(n=o.last,n!==null?n.sibling=s:t.child=s,o.last=s)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=Wt(),t.sibling=null,n=Mt.current,gt(Mt,r?n&1|2:n&1),t):(Hn(t),null);case 22:case 23:return CC(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&t.mode&1?Ir&1073741824&&(Hn(t),t.subtreeFlags&6&&(t.flags|=8192)):Hn(t),null;case 24:return null;case 25:return null}throw Error(te(156,t.tag))}function iU(e,t){switch(iC(t),t.tag){case 1:return wr(t.type)&&Um(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return hc(),St(_r),St(Kn),hC(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return fC(t),null;case 13:if(St(Mt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(te(340));dc()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return St(Mt),null;case 4:return hc(),null;case 10:return lC(t.type._context),null;case 22:case 23:return CC(),null;case 24:return null;default:return null}}var sg=!1,qn=!1,oU=typeof WeakSet=="function"?WeakSet:Set,de=null;function Ou(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){zt(e,t,r)}else n.current=null}function P_(e,t,n){try{n()}catch(r){zt(e,t,r)}}var TT=!1;function sU(e,t){if(c_=Bm,e=YA(),nC(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var i=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var s=0,a=-1,l=-1,u=0,c=0,d=e,f=null;t:for(;;){for(var h;d!==n||i!==0&&d.nodeType!==3||(a=s+i),d!==o||r!==0&&d.nodeType!==3||(l=s+r),d.nodeType===3&&(s+=d.nodeValue.length),(h=d.firstChild)!==null;)f=d,d=h;for(;;){if(d===e)break t;if(f===n&&++u===i&&(a=s),f===o&&++c===r&&(l=s),(h=d.nextSibling)!==null)break;d=f,f=d.parentNode}d=h}n=a===-1||l===-1?null:{start:a,end:l}}else n=null}n=n||{start:0,end:0}}else n=null;for(d_={focusedElem:e,selectionRange:n},Bm=!1,de=t;de!==null;)if(t=de,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,de=e;else for(;de!==null;){t=de;try{var p=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(p!==null){var m=p.memoizedProps,S=p.memoizedState,v=t.stateNode,y=v.getSnapshotBeforeUpdate(t.elementType===t.type?m:_i(t.type,m),S);v.__reactInternalSnapshotBeforeUpdate=y}break;case 3:var g=t.stateNode.containerInfo;g.nodeType===1?g.textContent="":g.nodeType===9&&g.documentElement&&g.removeChild(g.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(te(163))}}catch(b){zt(t,t.return,b)}if(e=t.sibling,e!==null){e.return=t.return,de=e;break}de=t.return}return p=TT,TT=!1,p}function af(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var i=r=r.next;do{if((i.tag&e)===e){var o=i.destroy;i.destroy=void 0,o!==void 0&&P_(t,n,o)}i=i.next}while(i!==r)}}function M0(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function k_(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function WO(e){var t=e.alternate;t!==null&&(e.alternate=null,WO(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Xi],delete t[Nf],delete t[p_],delete t[zz],delete t[Uz])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function qO(e){return e.tag===5||e.tag===3||e.tag===4}function ET(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||qO(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function A_(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=zm));else if(r!==4&&(e=e.child,e!==null))for(A_(e,t,n),e=e.sibling;e!==null;)A_(e,t,n),e=e.sibling}function O_(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(O_(e,t,n),e=e.sibling;e!==null;)O_(e,t,n),e=e.sibling}var Nn=null,wi=!1;function xs(e,t,n){for(n=n.child;n!==null;)KO(e,t,n),n=n.sibling}function KO(e,t,n){if(so&&typeof so.onCommitFiberUnmount=="function")try{so.onCommitFiberUnmount(E0,n)}catch{}switch(n.tag){case 5:qn||Ou(n,t);case 6:var r=Nn,i=wi;Nn=null,xs(e,t,n),Nn=r,wi=i,Nn!==null&&(wi?(e=Nn,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Nn.removeChild(n.stateNode));break;case 18:Nn!==null&&(wi?(e=Nn,n=n.stateNode,e.nodeType===8?sS(e.parentNode,n):e.nodeType===1&&sS(e,n),kf(e)):sS(Nn,n.stateNode));break;case 4:r=Nn,i=wi,Nn=n.stateNode.containerInfo,wi=!0,xs(e,t,n),Nn=r,wi=i;break;case 0:case 11:case 14:case 15:if(!qn&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){i=r=r.next;do{var o=i,s=o.destroy;o=o.tag,s!==void 0&&(o&2||o&4)&&P_(n,t,s),i=i.next}while(i!==r)}xs(e,t,n);break;case 1:if(!qn&&(Ou(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(a){zt(n,t,a)}xs(e,t,n);break;case 21:xs(e,t,n);break;case 22:n.mode&1?(qn=(r=qn)||n.memoizedState!==null,xs(e,t,n),qn=r):xs(e,t,n);break;default:xs(e,t,n)}}function PT(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new oU),t.forEach(function(r){var i=gU.bind(null,e,r);n.has(r)||(n.add(r),r.then(i,i))})}}function vi(e,t){var n=t.deletions;if(n!==null)for(var r=0;ri&&(i=s),r&=~o}if(r=i,r=Wt()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*lU(r/1960))-r,10e?16:e,Gs===null)var r=!1;else{if(e=Gs,Gs=null,ty=0,Ke&6)throw Error(te(331));var i=Ke;for(Ke|=4,de=e.current;de!==null;){var o=de,s=o.child;if(de.flags&16){var a=o.deletions;if(a!==null){for(var l=0;lWt()-wC?nl(e,0):_C|=n),xr(e,t)}function nR(e,t){t===0&&(e.mode&1?(t=Qp,Qp<<=1,!(Qp&130023424)&&(Qp=4194304)):t=1);var n=or();e=os(e,t),e!==null&&(Hh(e,t,n),xr(e,n))}function pU(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),nR(e,n)}function gU(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(te(314))}r!==null&&r.delete(t),nR(e,n)}var rR;rR=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||_r.current)vr=!0;else{if(!(e.lanes&n)&&!(t.flags&128))return vr=!1,nU(e,t,n);vr=!!(e.flags&131072)}else vr=!1,Pt&&t.flags&1048576&&sO(t,Wm,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;em(e,t),e=t.pendingProps;var i=cc(t,Kn.current);zu(t,n),i=gC(null,t,r,e,i,n);var o=mC();return t.flags|=1,typeof i=="object"&&i!==null&&typeof i.render=="function"&&i.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,wr(r)?(o=!0,Gm(t)):o=!1,t.memoizedState=i.state!==null&&i.state!==void 0?i.state:null,cC(t),i.updater=I0,t.stateNode=i,i._reactInternals=t,S_(t,r,e,n),t=x_(null,t,r,!0,o,n)):(t.tag=0,Pt&&o&&rC(t),ir(null,t,i,n),t=t.child),t;case 16:r=t.elementType;e:{switch(em(e,t),e=t.pendingProps,i=r._init,r=i(r._payload),t.type=r,i=t.tag=yU(r),e=_i(r,e),i){case 0:t=w_(null,t,r,e,n);break e;case 1:t=wT(null,t,r,e,n);break e;case 11:t=ST(null,t,r,e,n);break e;case 14:t=_T(null,t,r,_i(r.type,e),n);break e}throw Error(te(306,r,""))}return t;case 0:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:_i(r,i),w_(e,t,r,i,n);case 1:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:_i(r,i),wT(e,t,r,i,n);case 3:e:{if(jO(t),e===null)throw Error(te(387));r=t.pendingProps,o=t.memoizedState,i=o.element,cO(e,t),Ym(t,r,null,n);var s=t.memoizedState;if(r=s.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:s.cache,pendingSuspenseBoundaries:s.pendingSuspenseBoundaries,transitions:s.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){i=pc(Error(te(423)),t),t=xT(e,t,r,n,i);break e}else if(r!==i){i=pc(Error(te(424)),t),t=xT(e,t,r,n,i);break e}else for(Mr=Ks(t.stateNode.containerInfo.firstChild),Lr=t,Pt=!0,Ci=null,n=pO(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(dc(),r===i){t=ss(e,t,n);break e}ir(e,t,r,n)}t=t.child}return t;case 5:return gO(t),e===null&&y_(t),r=t.type,i=t.pendingProps,o=e!==null?e.memoizedProps:null,s=i.children,f_(r,i)?s=null:o!==null&&f_(r,o)&&(t.flags|=32),BO(e,t),ir(e,t,s,n),t.child;case 6:return e===null&&y_(t),null;case 13:return VO(e,t,n);case 4:return dC(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=fc(t,null,r,n):ir(e,t,r,n),t.child;case 11:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:_i(r,i),ST(e,t,r,i,n);case 7:return ir(e,t,t.pendingProps,n),t.child;case 8:return ir(e,t,t.pendingProps.children,n),t.child;case 12:return ir(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,i=t.pendingProps,o=t.memoizedProps,s=i.value,gt(qm,r._currentValue),r._currentValue=s,o!==null)if(Mi(o.value,s)){if(o.children===i.children&&!_r.current){t=ss(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var a=o.dependencies;if(a!==null){s=o.child;for(var l=a.firstContext;l!==null;){if(l.context===r){if(o.tag===1){l=Qo(-1,n&-n),l.tag=2;var u=o.updateQueue;if(u!==null){u=u.shared;var c=u.pending;c===null?l.next=l:(l.next=c.next,c.next=l),u.pending=l}}o.lanes|=n,l=o.alternate,l!==null&&(l.lanes|=n),v_(o.return,n,t),a.lanes|=n;break}l=l.next}}else if(o.tag===10)s=o.type===t.type?null:o.child;else if(o.tag===18){if(s=o.return,s===null)throw Error(te(341));s.lanes|=n,a=s.alternate,a!==null&&(a.lanes|=n),v_(s,n,t),s=o.sibling}else s=o.child;if(s!==null)s.return=o;else for(s=o;s!==null;){if(s===t){s=null;break}if(o=s.sibling,o!==null){o.return=s.return,s=o;break}s=s.return}o=s}ir(e,t,i.children,n),t=t.child}return t;case 9:return i=t.type,r=t.pendingProps.children,zu(t,n),i=ci(i),r=r(i),t.flags|=1,ir(e,t,r,n),t.child;case 14:return r=t.type,i=_i(r,t.pendingProps),i=_i(r.type,i),_T(e,t,r,i,n);case 15:return $O(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,i=t.pendingProps,i=t.elementType===r?i:_i(r,i),em(e,t),t.tag=1,wr(r)?(e=!0,Gm(t)):e=!1,zu(t,n),fO(t,r,i),S_(t,r,i,n),x_(null,t,r,!0,e,n);case 19:return zO(e,t,n);case 22:return FO(e,t,n)}throw Error(te(156,t.tag))};function iR(e,t){return OA(e,t)}function mU(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function oi(e,t,n,r){return new mU(e,t,n,r)}function EC(e){return e=e.prototype,!(!e||!e.isReactComponent)}function yU(e){if(typeof e=="function")return EC(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Hx)return 11;if(e===Wx)return 14}return 2}function Zs(e,t){var n=e.alternate;return n===null?(n=oi(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function rm(e,t,n,r,i,o){var s=2;if(r=e,typeof e=="function")EC(e)&&(s=1);else if(typeof e=="string")s=5;else e:switch(e){case _u:return rl(n.children,i,o,t);case Gx:s=8,i|=8;break;case G2:return e=oi(12,n,t,i|2),e.elementType=G2,e.lanes=o,e;case H2:return e=oi(13,n,t,i),e.elementType=H2,e.lanes=o,e;case W2:return e=oi(19,n,t,i),e.elementType=W2,e.lanes=o,e;case hA:return L0(n,i,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case dA:s=10;break e;case fA:s=9;break e;case Hx:s=11;break e;case Wx:s=14;break e;case Rs:s=16,r=null;break e}throw Error(te(130,e==null?e:typeof e,""))}return t=oi(s,n,t,i),t.elementType=e,t.type=r,t.lanes=o,t}function rl(e,t,n,r){return e=oi(7,e,r,t),e.lanes=n,e}function L0(e,t,n,r){return e=oi(22,e,r,t),e.elementType=hA,e.lanes=n,e.stateNode={isHidden:!1},e}function pS(e,t,n){return e=oi(6,e,null,t),e.lanes=n,e}function gS(e,t,n){return t=oi(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function vU(e,t,n,r,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Yb(0),this.expirationTimes=Yb(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Yb(0),this.identifierPrefix=r,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function PC(e,t,n,r,i,o,s,a,l){return e=new vU(e,t,n,a,l),t===1?(t=1,o===!0&&(t|=8)):t=0,o=oi(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},cC(o),e}function bU(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(lR)}catch(e){console.error(e)}}lR(),sA.exports=Gr;var ii=sA.exports;const yTe=kl(ii);var DT=ii;z2.createRoot=DT.createRoot,z2.hydrateRoot=DT.hydrateRoot;const CU="modulepreload",TU=function(e,t){return new URL(e,t).href},LT={},uR=function(t,n,r){if(!n||n.length===0)return t();const i=document.getElementsByTagName("link");return Promise.all(n.map(o=>{if(o=TU(o,r),o in LT)return;LT[o]=!0;const s=o.endsWith(".css"),a=s?'[rel="stylesheet"]':"";if(!!r)for(let c=i.length-1;c>=0;c--){const d=i[c];if(d.href===o&&(!s||d.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${a}`))return;const u=document.createElement("link");if(u.rel=s?"stylesheet":CU,s||(u.as="script",u.crossOrigin=""),u.href=o,document.head.appendChild(u),s)return new Promise((c,d)=>{u.addEventListener("load",c),u.addEventListener("error",()=>d(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t())};var cR={exports:{}},dR={};/** + * @license React + * use-sync-external-store-shim.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var mc=E;function EU(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var PU=typeof Object.is=="function"?Object.is:EU,kU=mc.useState,AU=mc.useEffect,OU=mc.useLayoutEffect,RU=mc.useDebugValue;function IU(e,t){var n=t(),r=kU({inst:{value:n,getSnapshot:t}}),i=r[0].inst,o=r[1];return OU(function(){i.value=n,i.getSnapshot=t,mS(i)&&o({inst:i})},[e,n,t]),AU(function(){return mS(i)&&o({inst:i}),e(function(){mS(i)&&o({inst:i})})},[e]),RU(n),n}function mS(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!PU(e,n)}catch{return!0}}function NU(e,t){return t()}var MU=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?NU:IU;dR.useSyncExternalStore=mc.useSyncExternalStore!==void 0?mc.useSyncExternalStore:MU;cR.exports=dR;var DU=cR.exports,fR={exports:{}},hR={};/** + * @license React + * use-sync-external-store-shim/with-selector.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var V0=E,LU=DU;function $U(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var FU=typeof Object.is=="function"?Object.is:$U,BU=LU.useSyncExternalStore,jU=V0.useRef,VU=V0.useEffect,zU=V0.useMemo,UU=V0.useDebugValue;hR.useSyncExternalStoreWithSelector=function(e,t,n,r,i){var o=jU(null);if(o.current===null){var s={hasValue:!1,value:null};o.current=s}else s=o.current;o=zU(function(){function l(h){if(!u){if(u=!0,c=h,h=r(h),i!==void 0&&s.hasValue){var p=s.value;if(i(p,h))return d=p}return d=h}if(p=d,FU(c,h))return p;var m=r(h);return i!==void 0&&i(p,m)?p:(c=h,d=m)}var u=!1,c,d,f=n===void 0?null:n;return[function(){return l(t())},f===null?void 0:function(){return l(f())}]},[t,n,r,i]);var a=BU(e,o[0],o[1]);return VU(function(){s.hasValue=!0,s.value=a},[a]),UU(a),a};fR.exports=hR;var pR=fR.exports;const GU=kl(pR);function HU(e){e()}let gR=HU;const WU=e=>gR=e,qU=()=>gR,$T=Symbol.for(`react-redux-context-${E.version}`),FT=globalThis;function KU(){let e=FT[$T];return e||(e=E.createContext(null),FT[$T]=e),e}const la=new Proxy({},new Proxy({},{get(e,t){const n=KU();return(r,...i)=>Reflect[t](n,...i)}}));function RC(e=la){return function(){return E.useContext(e)}}const mR=RC(),YU=()=>{throw new Error("uSES not initialized!")};let yR=YU;const XU=e=>{yR=e},QU=(e,t)=>e===t;function ZU(e=la){const t=e===la?mR:RC(e);return function(r,i={}){const{equalityFn:o=QU,stabilityCheck:s=void 0,noopCheck:a=void 0}=typeof i=="function"?{equalityFn:i}:i,{store:l,subscription:u,getServerState:c,stabilityCheck:d,noopCheck:f}=t();E.useRef(!0);const h=E.useCallback({[r.name](m){return r(m)}}[r.name],[r,d,s]),p=yR(u.addNestedSub,l.getState,c||l.getState,h,o);return E.useDebugValue(p),p}}const vR=ZU();function iy(){return iy=Object.assign?Object.assign.bind():function(e){for(var t=1;t{let r=t;for(;r;)r.callback(),r=r.next})},get(){let r=[],i=t;for(;i;)r.push(i),i=i.next;return r},subscribe(r){let i=!0,o=n={callback:r,next:null,prev:n};return o.prev?o.prev.next=o:t=o,function(){!i||t===null||(i=!1,o.next?o.next.prev=o.prev:n=o.prev,o.prev?o.prev.next=o.next:t=o.next)}}}}const BT={notify(){},get:()=>[]};function cG(e,t){let n,r=BT;function i(d){return l(),r.subscribe(d)}function o(){r.notify()}function s(){c.onStateChange&&c.onStateChange()}function a(){return!!n}function l(){n||(n=t?t.addNestedSub(s):e.subscribe(s),r=uG())}function u(){n&&(n(),n=void 0,r.clear(),r=BT)}const c={addNestedSub:i,notifyNestedSubs:o,handleChangeWrapper:s,isSubscribed:a,trySubscribe:l,tryUnsubscribe:u,getListeners:()=>r};return c}const dG=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",fG=dG?E.useLayoutEffect:E.useEffect;function jT(e,t){return e===t?e!==0||t!==0||1/e===1/t:e!==e&&t!==t}function oy(e,t){if(jT(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let i=0;i{const u=cG(e);return{store:e,subscription:u,getServerState:r?()=>r:void 0,stabilityCheck:i,noopCheck:o}},[e,r,i,o]),a=E.useMemo(()=>e.getState(),[e]);fG(()=>{const{subscription:u}=s;return u.onStateChange=u.notifyNestedSubs,u.trySubscribe(),a!==e.getState()&&u.notifyNestedSubs(),()=>{u.tryUnsubscribe(),u.onStateChange=void 0}},[s,a]);const l=t||la;return Ve.createElement(l.Provider,{value:s},n)}function CR(e=la){const t=e===la?mR:RC(e);return function(){const{store:r}=t();return r}}const TR=CR();function pG(e=la){const t=e===la?TR:CR(e);return function(){return t().dispatch}}const ER=pG();XU(pR.useSyncExternalStoreWithSelector);WU(ii.unstable_batchedUpdates);function Tn(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r3?t.i-4:t.i:Array.isArray(e)?1:lv(e)?2:uv(e)?3:0}function Js(e,t){return ua(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function im(e,t){return ua(e)===2?e.get(t):e[t]}function PR(e,t,n){var r=ua(e);r===2?e.set(t,n):r===3?e.add(n):e[t]=n}function kR(e,t){return e===t?e!==0||1/e==1/t:e!=e&&t!=t}function lv(e){return SG&&e instanceof Map}function uv(e){return _G&&e instanceof Set}function Sn(e){return e.o||e.t}function FC(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=OR(e);delete t[Pe];for(var n=Hu(t),r=0;r1&&(e.set=e.add=e.clear=e.delete=gG),Object.freeze(e),t&&as(e,function(n,r){return Yh(r,!0)},!0)),e}function gG(){Tn(2)}function BC(e){return e==null||typeof e!="object"||Object.isFrozen(e)}function lo(e){var t=L_[e];return t||Tn(18,e),t}function jC(e,t){L_[e]||(L_[e]=t)}function jf(){return zf}function yS(e,t){t&&(lo("Patches"),e.u=[],e.s=[],e.v=t)}function sy(e){D_(e),e.p.forEach(mG),e.p=null}function D_(e){e===zf&&(zf=e.l)}function VT(e){return zf={p:[],l:zf,h:e,m:!0,_:0}}function mG(e){var t=e[Pe];t.i===0||t.i===1?t.j():t.g=!0}function vS(e,t){t._=t.p.length;var n=t.p[0],r=e!==void 0&&e!==n;return t.h.O||lo("ES5").S(t,e,r),r?(n[Pe].P&&(sy(t),Tn(4)),Er(e)&&(e=ay(t,e),t.l||ly(t,e)),t.u&&lo("Patches").M(n[Pe].t,e,t.u,t.s)):e=ay(t,n,[]),sy(t),t.u&&t.v(t.u,t.s),e!==dv?e:void 0}function ay(e,t,n){if(BC(t))return t;var r=t[Pe];if(!r)return as(t,function(a,l){return zT(e,r,t,a,l,n)},!0),t;if(r.A!==e)return t;if(!r.P)return ly(e,r.t,!0),r.t;if(!r.I){r.I=!0,r.A._--;var i=r.i===4||r.i===5?r.o=FC(r.k):r.o,o=i,s=!1;r.i===3&&(o=new Set(i),i.clear(),s=!0),as(o,function(a,l){return zT(e,r,i,a,l,n,s)}),ly(e,i,!1),n&&e.u&&lo("Patches").N(r,n,e.u,e.s)}return r.o}function zT(e,t,n,r,i,o,s){if(sr(i)){var a=ay(e,i,o&&t&&t.i!==3&&!Js(t.R,r)?o.concat(r):void 0);if(PR(n,r,a),!sr(a))return;e.m=!1}else s&&n.add(i);if(Er(i)&&!BC(i)){if(!e.h.D&&e._<1)return;ay(e,i),t&&t.A.l||ly(e,i)}}function ly(e,t,n){n===void 0&&(n=!1),!e.l&&e.h.D&&e.m&&Yh(t,n)}function bS(e,t){var n=e[Pe];return(n?Sn(n):e)[t]}function UT(e,t){if(t in e)for(var n=Object.getPrototypeOf(e);n;){var r=Object.getOwnPropertyDescriptor(n,t);if(r)return r;n=Object.getPrototypeOf(n)}}function yr(e){e.P||(e.P=!0,e.l&&yr(e.l))}function SS(e){e.o||(e.o=FC(e.t))}function Vf(e,t,n){var r=lv(t)?lo("MapSet").F(t,n):uv(t)?lo("MapSet").T(t,n):e.O?function(i,o){var s=Array.isArray(i),a={i:s?1:0,A:o?o.A:jf(),P:!1,I:!1,R:{},l:o,t:i,k:null,o:null,j:null,C:!1},l=a,u=Uf;s&&(l=[a],u=Gd);var c=Proxy.revocable(l,u),d=c.revoke,f=c.proxy;return a.k=f,a.j=d,f}(t,n):lo("ES5").J(t,n);return(n?n.A:jf()).p.push(r),r}function cv(e){return sr(e)||Tn(22,e),function t(n){if(!Er(n))return n;var r,i=n[Pe],o=ua(n);if(i){if(!i.P&&(i.i<4||!lo("ES5").K(i)))return i.t;i.I=!0,r=GT(n,o),i.I=!1}else r=GT(n,o);return as(r,function(s,a){i&&im(i.t,s)===a||PR(r,s,t(a))}),o===3?new Set(r):r}(e)}function GT(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return FC(e)}function VC(){function e(o,s){var a=i[o];return a?a.enumerable=s:i[o]=a={configurable:!0,enumerable:s,get:function(){var l=this[Pe];return Uf.get(l,o)},set:function(l){var u=this[Pe];Uf.set(u,o,l)}},a}function t(o){for(var s=o.length-1;s>=0;s--){var a=o[s][Pe];if(!a.P)switch(a.i){case 5:r(a)&&yr(a);break;case 4:n(a)&&yr(a)}}}function n(o){for(var s=o.t,a=o.k,l=Hu(a),u=l.length-1;u>=0;u--){var c=l[u];if(c!==Pe){var d=s[c];if(d===void 0&&!Js(s,c))return!0;var f=a[c],h=f&&f[Pe];if(h?h.t!==d:!kR(f,d))return!0}}var p=!!s[Pe];return l.length!==Hu(s).length+(p?0:1)}function r(o){var s=o.k;if(s.length!==o.t.length)return!0;var a=Object.getOwnPropertyDescriptor(s,s.length-1);if(a&&!a.get)return!0;for(var l=0;l1?v-1:0),g=1;g1?c-1:0),f=1;f=0;i--){var o=r[i];if(o.path.length===0&&o.op==="replace"){n=o.value;break}}i>-1&&(r=r.slice(i+1));var s=lo("Patches").$;return sr(n)?s(n,r):this.produce(n,function(a){return s(a,r)})},e}(),jr=new RR,IR=jr.produce,GC=jr.produceWithPatches.bind(jr),xG=jr.setAutoFreeze.bind(jr),CG=jr.setUseProxies.bind(jr),$_=jr.applyPatches.bind(jr),TG=jr.createDraft.bind(jr),EG=jr.finishDraft.bind(jr);const wa=IR,vTe=Object.freeze(Object.defineProperty({__proto__:null,Immer:RR,applyPatches:$_,castDraft:vG,castImmutable:bG,createDraft:TG,current:cv,default:wa,enableAllPlugins:yG,enableES5:VC,enableMapSet:AR,enablePatches:zC,finishDraft:EG,freeze:Yh,immerable:Gu,isDraft:sr,isDraftable:Er,nothing:dv,original:$C,produce:IR,produceWithPatches:GC,setAutoFreeze:xG,setUseProxies:CG},Symbol.toStringTag,{value:"Module"}));function Gf(e){"@babel/helpers - typeof";return Gf=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Gf(e)}function PG(e,t){if(Gf(e)!=="object"||e===null)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||"default");if(Gf(r)!=="object")return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function kG(e){var t=PG(e,"string");return Gf(t)==="symbol"?t:String(t)}function AG(e,t,n){return t=kG(t),t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function qT(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function KT(e){for(var t=1;t"u"&&(n=t,t=void 0),typeof n<"u"){if(typeof n!="function")throw new Error(Mn(1));return n(Xh)(e,t)}if(typeof e!="function")throw new Error(Mn(2));var i=e,o=t,s=[],a=s,l=!1;function u(){a===s&&(a=s.slice())}function c(){if(l)throw new Error(Mn(3));return o}function d(m){if(typeof m!="function")throw new Error(Mn(4));if(l)throw new Error(Mn(5));var S=!0;return u(),a.push(m),function(){if(S){if(l)throw new Error(Mn(6));S=!1,u();var y=a.indexOf(m);a.splice(y,1),s=null}}}function f(m){if(!OG(m))throw new Error(Mn(7));if(typeof m.type>"u")throw new Error(Mn(8));if(l)throw new Error(Mn(9));try{l=!0,o=i(o,m)}finally{l=!1}for(var S=s=a,v=0;v"u")throw new Error(Mn(12));if(typeof n(void 0,{type:yc.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Mn(13))})}function zc(e){for(var t=Object.keys(e),n={},r=0;r"u")throw u&&u.type,new Error(Mn(14));d[h]=S,c=c||S!==m}return c=c||o.length!==Object.keys(l).length,c?d:l}}function XT(e,t){return function(){return t(e.apply(this,arguments))}}function MR(e,t){if(typeof e=="function")return XT(e,t);if(typeof e!="object"||e===null)throw new Error(Mn(16));var n={};for(var r in e){var i=e[r];typeof i=="function"&&(n[r]=XT(i,t))}return n}function vc(){for(var e=arguments.length,t=new Array(e),n=0;n-1){var u=n[l];return l>0&&(n.splice(l,1),n.unshift(u)),u.value}return uy}function i(a,l){r(a)===uy&&(n.unshift({key:a,value:l}),n.length>e&&n.pop())}function o(){return n}function s(){n=[]}return{get:r,put:i,getEntries:o,clear:s}}var DR=function(t,n){return t===n};function DG(e){return function(n,r){if(n===null||r===null||n.length!==r.length)return!1;for(var i=n.length,o=0;o1?t-1:0),r=1;r0&&o[o.length-1])&&(u[0]===6||u[0]===2)){n=0;continue}if(u[0]===3&&(!o||u[1]>o[0]&&u[1]",value:e};if(typeof e!="object"||e===null||o!=null&&o.has(e))return!1;for(var a=r!=null?r(e):Object.entries(e),l=i.length>0,u=function(S,v){var y=t?t+"."+S:S;if(l){var g=i.some(function(b){return b instanceof RegExp?b.test(y):y===b});if(g)return"continue"}if(!n(v))return{value:{keyPath:y,value:v}};if(typeof v=="object"&&(s=UR(v,y,n,r,i,o),s))return{value:s}},c=0,d=a;c-1}function QG(e){return""+e}function KR(e){var t={},n=[],r,i={addCase:function(o,s){var a=typeof o=="string"?o:o.type;if(a in t)throw new Error("addCase cannot be called with two reducers for the same action type");return t[a]=s,i},addMatcher:function(o,s){return n.push({matcher:o,reducer:s}),i},addDefaultCase:function(o){return r=o,i}};return e(i),[t,n,r]}function ZG(e){return typeof e=="function"}function YR(e,t,n,r){n===void 0&&(n=[]);var i=typeof t=="function"?KR(t):[t,n,r],o=i[0],s=i[1],a=i[2],l;if(ZG(e))l=function(){return F_(e())};else{var u=F_(e);l=function(){return u}}function c(d,f){d===void 0&&(d=l());var h=ca([o[f.type]],s.filter(function(p){var m=p.matcher;return m(f)}).map(function(p){var m=p.reducer;return m}));return h.filter(function(p){return!!p}).length===0&&(h=[a]),h.reduce(function(p,m){if(m)if(sr(p)){var S=p,v=m(S,f);return v===void 0?p:v}else{if(Er(p))return wa(p,function(y){return m(y,f)});var v=m(p,f);if(v===void 0){if(p===null)return p;throw Error("A case reducer on a non-draftable value must not return undefined")}return v}return p},d)}return c.getInitialState=l,c}function JG(e,t){return e+"/"+t}function Lt(e){var t=e.name;if(!t)throw new Error("`name` is a required option for createSlice");typeof process<"u";var n=typeof e.initialState=="function"?e.initialState:F_(e.initialState),r=e.reducers||{},i=Object.keys(r),o={},s={},a={};i.forEach(function(c){var d=r[c],f=JG(t,c),h,p;"reducer"in d?(h=d.reducer,p=d.prepare):h=d,o[c]=h,s[f]=h,a[c]=p?me(f,p):me(f)});function l(){var c=typeof e.extraReducers=="function"?KR(e.extraReducers):[e.extraReducers],d=c[0],f=d===void 0?{}:d,h=c[1],p=h===void 0?[]:h,m=c[2],S=m===void 0?void 0:m,v=br(br({},f),s);return YR(n,function(y){for(var g in v)y.addCase(g,v[g]);for(var b=0,_=p;b<_.length;b++){var w=_[b];y.addMatcher(w.matcher,w.reducer)}S&&y.addDefaultCase(S)})}var u;return{name:t,reducer:function(c,d){return u||(u=l()),u(c,d)},actions:a,caseReducers:o,getInitialState:function(){return u||(u=l()),u.getInitialState()}}}function eH(){return{ids:[],entities:{}}}function tH(){function e(t){return t===void 0&&(t={}),Object.assign(eH(),t)}return{getInitialState:e}}function nH(){function e(t){var n=function(u){return u.ids},r=function(u){return u.entities},i=Lo(n,r,function(u,c){return u.map(function(d){return c[d]})}),o=function(u,c){return c},s=function(u,c){return u[c]},a=Lo(n,function(u){return u.length});if(!t)return{selectIds:n,selectEntities:r,selectAll:i,selectTotal:a,selectById:Lo(r,o,s)};var l=Lo(t,r);return{selectIds:Lo(t,n),selectEntities:l,selectAll:Lo(t,i),selectTotal:Lo(t,a),selectById:Lo(l,o,s)}}return{getSelectors:e}}function rH(e){var t=Gt(function(n,r){return e(r)});return function(r){return t(r,void 0)}}function Gt(e){return function(n,r){function i(s){return qR(s)}var o=function(s){i(r)?e(r.payload,s):e(r,s)};return sr(n)?(o(n),n):wa(n,o)}}function cf(e,t){var n=t(e);return n}function il(e){return Array.isArray(e)||(e=Object.values(e)),e}function XR(e,t,n){e=il(e);for(var r=[],i=[],o=0,s=e;o0;if(y){var g=p.filter(function(b){return u(S,b,m)}).length>0;g&&(m.ids=Object.keys(m.entities))}}function f(p,m){return h([p],m)}function h(p,m){var S=XR(p,e,m),v=S[0],y=S[1];d(y,m),n(v,m)}return{removeAll:rH(l),addOne:Gt(t),addMany:Gt(n),setOne:Gt(r),setMany:Gt(i),setAll:Gt(o),updateOne:Gt(c),updateMany:Gt(d),upsertOne:Gt(f),upsertMany:Gt(h),removeOne:Gt(s),removeMany:Gt(a)}}function iH(e,t){var n=QR(e),r=n.removeOne,i=n.removeMany,o=n.removeAll;function s(y,g){return a([y],g)}function a(y,g){y=il(y);var b=y.filter(function(_){return!(cf(_,e)in g.entities)});b.length!==0&&S(b,g)}function l(y,g){return u([y],g)}function u(y,g){y=il(y),y.length!==0&&S(y,g)}function c(y,g){y=il(y),g.entities={},g.ids=[],a(y,g)}function d(y,g){return f([y],g)}function f(y,g){for(var b=!1,_=0,w=y;_-1;return n&&r}function Jh(e){return typeof e[0]=="function"&&"pending"in e[0]&&"fulfilled"in e[0]&&"rejected"in e[0]}function pv(){for(var e=[],t=0;t0)for(var g=h.getState(),b=Array.from(n.values()),_=0,w=b;_=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(u){throw u},f:i}}throw new TypeError(`Invalid attempt to iterate non-iterable instance. +In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var o=!0,s=!1,a;return{s:function(){n=n.call(e)},n:function(){var u=n.next();return o=u.done,u},e:function(u){s=!0,a=u},f:function(){try{!o&&n.return!=null&&n.return()}finally{if(s)throw a}}}}function y7(e,t){if(e){if(typeof e=="string")return oE(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);if(n==="Object"&&e.constructor&&(n=e.constructor.name),n==="Map"||n==="Set")return Array.from(e);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return oE(e,t)}}function oE(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=arguments.length>2?arguments[2]:void 0,i=r.prefix,o=r.driver,s=r.persistWholeStore,a=r.serialize;try{var l=s?BH:jH;yield l(t,n,{prefix:i,driver:o,serialize:a})}catch(u){console.warn("redux-remember: persist error",u)}});return function(){return e.apply(this,arguments)}}();function uE(e,t,n,r,i,o,s){try{var a=e[o](s),l=a.value}catch(u){n(u);return}a.done?t(l):Promise.resolve(l).then(r,i)}function cE(e){return function(){var t=this,n=arguments;return new Promise(function(r,i){var o=e.apply(t,n);function s(l){uE(o,r,i,s,a,"next",l)}function a(l){uE(o,r,i,s,a,"throw",l)}s(void 0)})}}var zH=function(){var e=cE(function*(t,n,r){var i=r.prefix,o=r.driver,s=r.serialize,a=r.unserialize,l=r.persistThrottle,u=r.persistDebounce,c=r.persistWholeStore;yield MH(t,n,{prefix:i,driver:o,unserialize:a,persistWholeStore:c});var d={},f=function(){var h=cE(function*(){var p=m7(t.getState(),n);yield VH(p,d,{prefix:i,driver:o,serialize:s,persistWholeStore:c}),XC(p,d)||t.dispatch({type:AH,payload:p}),d=p});return function(){return h.apply(this,arguments)}}();u&&u>0?t.subscribe(RH(f,u)):t.subscribe(OH(f,l))});return function(n,r,i){return e.apply(this,arguments)}}();const UH=zH;function Wf(e){"@babel/helpers - typeof";return Wf=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Wf(e)}function dE(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),n.push.apply(n,r)}return n}function ES(e){for(var t=1;t0&&arguments[0]!==void 0?arguments[0]:n.state,i=arguments.length>1?arguments[1]:void 0;i.type&&(i.type==="@@INIT"||i.type.startsWith("@@redux/INIT"))&&(n.state=ES({},r));var o=typeof t=="function"?t:zc(t);switch(i.type){case z_:return n.state=o(ES(ES({},n.state),i.payload||{}),{type:z_}),n.state;default:return o(r,i)}}},KH=function(t,n){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},i=r.prefix,o=i===void 0?"@@remember-":i,s=r.serialize,a=s===void 0?function(S,v){return JSON.stringify(S)}:s,l=r.unserialize,u=l===void 0?function(S,v){return JSON.parse(S)}:l,c=r.persistThrottle,d=c===void 0?100:c,f=r.persistDebounce,h=r.persistWholeStore,p=h===void 0?!1:h;if(!t)throw Error("redux-remember error: driver required");if(!Array.isArray(n))throw Error("redux-remember error: rememberedKeys needs to be an array");var m=function(v){return function(y,g,b){var _=v(y,g,b);return UH(_,n,{driver:t,prefix:o,serialize:a,unserialize:u,persistThrottle:d,persistDebounce:f,persistWholeStore:p}),_}};return m},YH=typeof global=="object"&&global&&global.Object===Object&&global;const b7=YH;var XH=typeof self=="object"&&self&&self.Object===Object&&self,QH=b7||XH||Function("return this")();const _o=QH;var ZH=_o.Symbol;const fi=ZH;var S7=Object.prototype,JH=S7.hasOwnProperty,eW=S7.toString,Sd=fi?fi.toStringTag:void 0;function tW(e){var t=JH.call(e,Sd),n=e[Sd];try{e[Sd]=void 0;var r=!0}catch{}var i=eW.call(e);return r&&(t?e[Sd]=n:delete e[Sd]),i}var nW=Object.prototype,rW=nW.toString;function iW(e){return rW.call(e)}var oW="[object Null]",sW="[object Undefined]",fE=fi?fi.toStringTag:void 0;function Ca(e){return e==null?e===void 0?sW:oW:fE&&fE in Object(e)?tW(e):iW(e)}function Li(e){return e!=null&&typeof e=="object"}var aW="[object Symbol]";function mv(e){return typeof e=="symbol"||Li(e)&&Ca(e)==aW}function QC(e,t){for(var n=-1,r=e==null?0:e.length,i=Array(r);++n0){if(++t>=BW)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function UW(e){return function(){return e}}var GW=function(){try{var e=Il(Object,"defineProperty");return e({},"",{}),e}catch{}}();const py=GW;var HW=py?function(e,t){return py(e,"toString",{configurable:!0,enumerable:!1,value:UW(t),writable:!0})}:yv;const WW=HW;var qW=zW(WW);const C7=qW;function T7(e,t){for(var n=-1,r=e==null?0:e.length;++n-1}var JW=9007199254740991,eq=/^(?:0|[1-9]\d*)$/;function vv(e,t){var n=typeof e;return t=t??JW,!!t&&(n=="number"||n!="symbol"&&eq.test(e))&&e>-1&&e%1==0&&e-1&&e%1==0&&e<=rq}function Gc(e){return e!=null&&e5(e.length)&&!ZC(e)}function k7(e,t,n){if(!Pn(n))return!1;var r=typeof t;return(r=="number"?Gc(n)&&vv(t,n.length):r=="string"&&t in n)?rp(n[t],e):!1}function A7(e){return P7(function(t,n){var r=-1,i=n.length,o=i>1?n[i-1]:void 0,s=i>2?n[2]:void 0;for(o=e.length>3&&typeof o=="function"?(i--,o):void 0,s&&k7(n[0],n[1],s)&&(o=i<3?void 0:o,i=1),t=Object(t);++r-1}function vK(e,t){var n=this.__data__,r=Sv(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}function ps(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t0&&n(a)?t>1?L7(a,t-1,n,r,i):s5(i,a):r||(i[i.length]=a)}return i}function LK(e){var t=e==null?0:e.length;return t?L7(e,1):[]}function $K(e){return C7(E7(e,void 0,LK),e+"")}var FK=M7(Object.getPrototypeOf,Object);const a5=FK;var BK="[object Object]",jK=Function.prototype,VK=Object.prototype,$7=jK.toString,zK=VK.hasOwnProperty,UK=$7.call(Object);function F7(e){if(!Li(e)||Ca(e)!=BK)return!1;var t=a5(e);if(t===null)return!0;var n=zK.call(t,"constructor")&&t.constructor;return typeof n=="function"&&n instanceof n&&$7.call(n)==UK}function GK(e,t,n){var r=-1,i=e.length;t<0&&(t=-t>i?0:i+t),n=n>i?i:n,n<0&&(n+=i),i=t>n?0:n-t>>>0,t>>>=0;for(var o=Array(i);++r=t?e:t)),e}function qo(e,t,n){return n===void 0&&(n=t,t=void 0),n!==void 0&&(n=PS(n),n=n===n?n:0),t!==void 0&&(t=PS(t),t=t===t?t:0),tY(PS(e),t,n)}function nY(){this.__data__=new ps,this.size=0}function rY(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}function iY(e){return this.__data__.get(e)}function oY(e){return this.__data__.has(e)}var sY=200;function aY(e,t){var n=this.__data__;if(n instanceof ps){var r=n.__data__;if(!Xf||r.lengtha))return!1;var u=o.get(e),c=o.get(t);if(u&&c)return u==t&&c==e;var d=-1,f=!0,h=n&VX?new Qf:void 0;for(o.set(e,t),o.set(t,e);++d1),o}),Uc(e,u5(e),n),r&&(n=ff(n,YQ|XQ|QQ,KQ));for(var i=t.length;i--;)oI(n,t[i]);return n});const sI=ZQ;function JQ(e,t,n,r){if(!Pn(e))return e;t=Hc(t,e);for(var i=-1,o=t.length,s=o-1,a=e;a!=null&&++i=CZ){var u=t?null:xZ(e);if(u)return d5(u);s=!1,i=Q7,l=new Qf}else l=t?[]:a;e:for(;++re==null,IZ=e=>encodeURIComponent(e).replace(/[!'()*]/g,t=>`%${t.charCodeAt(0).toString(16).toUpperCase()}`),ew=Symbol("encodeFragmentIdentifier");function NZ(e){switch(e.arrayFormat){case"index":return t=>(n,r)=>{const i=n.length;return r===void 0||e.skipNull&&r===null||e.skipEmptyString&&r===""?n:r===null?[...n,[Jt(t,e),"[",i,"]"].join("")]:[...n,[Jt(t,e),"[",Jt(i,e),"]=",Jt(r,e)].join("")]};case"bracket":return t=>(n,r)=>r===void 0||e.skipNull&&r===null||e.skipEmptyString&&r===""?n:r===null?[...n,[Jt(t,e),"[]"].join("")]:[...n,[Jt(t,e),"[]=",Jt(r,e)].join("")];case"colon-list-separator":return t=>(n,r)=>r===void 0||e.skipNull&&r===null||e.skipEmptyString&&r===""?n:r===null?[...n,[Jt(t,e),":list="].join("")]:[...n,[Jt(t,e),":list=",Jt(r,e)].join("")];case"comma":case"separator":case"bracket-separator":{const t=e.arrayFormat==="bracket-separator"?"[]=":"=";return n=>(r,i)=>i===void 0||e.skipNull&&i===null||e.skipEmptyString&&i===""?r:(i=i===null?"":i,r.length===0?[[Jt(n,e),t,Jt(i,e)].join("")]:[[r,Jt(i,e)].join(e.arrayFormatSeparator)])}default:return t=>(n,r)=>r===void 0||e.skipNull&&r===null||e.skipEmptyString&&r===""?n:r===null?[...n,Jt(t,e)]:[...n,[Jt(t,e),"=",Jt(r,e)].join("")]}}function MZ(e){let t;switch(e.arrayFormat){case"index":return(n,r,i)=>{if(t=/\[(\d*)]$/.exec(n),n=n.replace(/\[\d*]$/,""),!t){i[n]=r;return}i[n]===void 0&&(i[n]={}),i[n][t[1]]=r};case"bracket":return(n,r,i)=>{if(t=/(\[])$/.exec(n),n=n.replace(/\[]$/,""),!t){i[n]=r;return}if(i[n]===void 0){i[n]=[r];return}i[n]=[...i[n],r]};case"colon-list-separator":return(n,r,i)=>{if(t=/(:list)$/.exec(n),n=n.replace(/:list$/,""),!t){i[n]=r;return}if(i[n]===void 0){i[n]=[r];return}i[n]=[...i[n],r]};case"comma":case"separator":return(n,r,i)=>{const o=typeof r=="string"&&r.includes(e.arrayFormatSeparator),s=typeof r=="string"&&!o&&Vo(r,e).includes(e.arrayFormatSeparator);r=s?Vo(r,e):r;const a=o||s?r.split(e.arrayFormatSeparator).map(l=>Vo(l,e)):r===null?r:Vo(r,e);i[n]=a};case"bracket-separator":return(n,r,i)=>{const o=/(\[])$/.test(n);if(n=n.replace(/\[]$/,""),!o){i[n]=r&&Vo(r,e);return}const s=r===null?[]:r.split(e.arrayFormatSeparator).map(a=>Vo(a,e));if(i[n]===void 0){i[n]=s;return}i[n]=[...i[n],...s]};default:return(n,r,i)=>{if(i[n]===void 0){i[n]=r;return}i[n]=[...[i[n]].flat(),r]}}}function mI(e){if(typeof e!="string"||e.length!==1)throw new TypeError("arrayFormatSeparator must be single character string")}function Jt(e,t){return t.encode?t.strict?IZ(e):encodeURIComponent(e):e}function Vo(e,t){return t.decode?AZ(e):e}function yI(e){return Array.isArray(e)?e.sort():typeof e=="object"?yI(Object.keys(e)).sort((t,n)=>Number(t)-Number(n)).map(t=>e[t]):e}function vI(e){const t=e.indexOf("#");return t!==-1&&(e=e.slice(0,t)),e}function DZ(e){let t="";const n=e.indexOf("#");return n!==-1&&(t=e.slice(n)),t}function GE(e,t){return t.parseNumbers&&!Number.isNaN(Number(e))&&typeof e=="string"&&e.trim()!==""?e=Number(e):t.parseBooleans&&e!==null&&(e.toLowerCase()==="true"||e.toLowerCase()==="false")&&(e=e.toLowerCase()==="true"),e}function p5(e){e=vI(e);const t=e.indexOf("?");return t===-1?"":e.slice(t+1)}function g5(e,t){t={decode:!0,sort:!0,arrayFormat:"none",arrayFormatSeparator:",",parseNumbers:!1,parseBooleans:!1,...t},mI(t.arrayFormatSeparator);const n=MZ(t),r=Object.create(null);if(typeof e!="string"||(e=e.trim().replace(/^[?#&]/,""),!e))return r;for(const i of e.split("&")){if(i==="")continue;const o=t.decode?i.replace(/\+/g," "):i;let[s,a]=gI(o,"=");s===void 0&&(s=o),a=a===void 0?null:["comma","separator","bracket-separator"].includes(t.arrayFormat)?a:Vo(a,t),n(Vo(s,t),a,r)}for(const[i,o]of Object.entries(r))if(typeof o=="object"&&o!==null)for(const[s,a]of Object.entries(o))o[s]=GE(a,t);else r[i]=GE(o,t);return t.sort===!1?r:(t.sort===!0?Object.keys(r).sort():Object.keys(r).sort(t.sort)).reduce((i,o)=>{const s=r[o];return s&&typeof s=="object"&&!Array.isArray(s)?i[o]=yI(s):i[o]=s,i},Object.create(null))}function bI(e,t){if(!e)return"";t={encode:!0,strict:!0,arrayFormat:"none",arrayFormatSeparator:",",...t},mI(t.arrayFormatSeparator);const n=s=>t.skipNull&&RZ(e[s])||t.skipEmptyString&&e[s]==="",r=NZ(t),i={};for(const[s,a]of Object.entries(e))n(s)||(i[s]=a);const o=Object.keys(i);return t.sort!==!1&&o.sort(t.sort),o.map(s=>{const a=e[s];return a===void 0?"":a===null?Jt(s,t):Array.isArray(a)?a.length===0&&t.arrayFormat==="bracket-separator"?Jt(s,t)+"[]":a.reduce(r(s),[]).join("&"):Jt(s,t)+"="+Jt(a,t)}).filter(s=>s.length>0).join("&")}function SI(e,t){var i;t={decode:!0,...t};let[n,r]=gI(e,"#");return n===void 0&&(n=e),{url:((i=n==null?void 0:n.split("?"))==null?void 0:i[0])??"",query:g5(p5(e),t),...t&&t.parseFragmentIdentifier&&r?{fragmentIdentifier:Vo(r,t)}:{}}}function _I(e,t){t={encode:!0,strict:!0,[ew]:!0,...t};const n=vI(e.url).split("?")[0]||"",r=p5(e.url),i={...g5(r,{sort:!1}),...e.query};let o=bI(i,t);o&&(o=`?${o}`);let s=DZ(e.url);if(e.fragmentIdentifier){const a=new URL(n);a.hash=e.fragmentIdentifier,s=t[ew]?a.hash:`#${e.fragmentIdentifier}`}return`${n}${o}${s}`}function wI(e,t,n){n={parseFragmentIdentifier:!0,[ew]:!1,...n};const{url:r,query:i,fragmentIdentifier:o}=SI(e,n);return _I({url:r,query:OZ(i,t),fragmentIdentifier:o},n)}function LZ(e,t,n){const r=Array.isArray(t)?i=>!t.includes(i):(i,o)=>!t(i,o);return wI(e,r,n)}const $Z=Object.freeze(Object.defineProperty({__proto__:null,exclude:LZ,extract:p5,parse:g5,parseUrl:SI,pick:wI,stringify:bI,stringifyUrl:_I},Symbol.toStringTag,{value:"Module"})),wo=Hf.withTypes(),Ta={memoizeOptions:{resultEqualityCheck:ap}},FZ=(e,t)=>{const n=new Date(e),r=new Date(t);return n>r?1:n0&&o[o.length-1])&&(u[0]===6||u[0]===2)){n=0;continue}if(u[0]===3&&(!o||u[1]>o[0]&&u[1]"u"||navigator.onLine===void 0?!0:navigator.onLine}function KZ(){return typeof document>"u"?!0:document.visibilityState!=="hidden"}var KE=Di;function TI(e,t){if(e===t||!(KE(e)&&KE(t)||Array.isArray(e)&&Array.isArray(t)))return t;for(var n=Object.keys(t),r=Object.keys(e),i=n.length===r.length,o=Array.isArray(t)?[]:{},s=0,a=n;s=200&&e.status<=299},XZ=function(e){return/ion\/(vnd\.api\+)?json/.test(e.get("content-type")||"")};function XE(e){if(!Di(e))return e;for(var t=Ht({},e),n=0,r=Object.entries(t);n"u"&&a===YE&&console.warn("Warning: `fetch` is not available. Please supply a custom `fetchFn` property to use `fetchBaseQuery` on SSR environments."),function(g,b){return Sy(t,null,function(){var _,w,x,C,k,P,A,$,M,T,O,I,N,R,D,L,V,z,U,K,q,X,F,W,Q,J,ne,Z,ge,ae,oe,Ce,se,We,mt,$e;return yy(this,function(Fe){switch(Fe.label){case 0:return _=b.signal,w=b.getState,x=b.extra,C=b.endpoint,k=b.forced,P=b.type,$=typeof g=="string"?{url:g}:g,M=$.url,T=$.headers,O=T===void 0?new Headers(v.headers):T,I=$.params,N=I===void 0?void 0:I,R=$.responseHandler,D=R===void 0?m??"json":R,L=$.validateStatus,V=L===void 0?S??YZ:L,z=$.timeout,U=z===void 0?p:z,K=WE($,["url","headers","params","responseHandler","validateStatus","timeout"]),q=Ht(to(Ht({},v),{signal:_}),K),O=new Headers(XE(O)),X=q,[4,o(O,{getState:w,extra:x,endpoint:C,forced:k,type:P})];case 1:X.headers=Fe.sent()||O,F=function(Ie){return typeof Ie=="object"&&(Di(Ie)||Array.isArray(Ie)||typeof Ie.toJSON=="function")},!q.headers.has("content-type")&&F(q.body)&&q.headers.set("content-type",f),F(q.body)&&c(q.headers)&&(q.body=JSON.stringify(q.body,h)),N&&(W=~M.indexOf("?")?"&":"?",Q=l?l(N):new URLSearchParams(XE(N)),M+=W+Q),M=WZ(r,M),J=new Request(M,q),ne=J.clone(),A={request:ne},ge=!1,ae=U&&setTimeout(function(){ge=!0,b.abort()},U),Fe.label=2;case 2:return Fe.trys.push([2,4,5,6]),[4,a(J)];case 3:return Z=Fe.sent(),[3,6];case 4:return oe=Fe.sent(),[2,{error:{status:ge?"TIMEOUT_ERROR":"FETCH_ERROR",error:String(oe)},meta:A}];case 5:return ae&&clearTimeout(ae),[7];case 6:Ce=Z.clone(),A.response=Ce,We="",Fe.label=7;case 7:return Fe.trys.push([7,9,,10]),[4,Promise.all([y(Z,D).then(function(Ie){return se=Ie},function(Ie){return mt=Ie}),Ce.text().then(function(Ie){return We=Ie},function(){})])];case 8:if(Fe.sent(),mt)throw mt;return[3,10];case 9:return $e=Fe.sent(),[2,{error:{status:"PARSING_ERROR",originalStatus:Z.status,data:We,error:String($e)},meta:A}];case 10:return[2,V(Z,se)?{data:se,meta:A}:{error:{status:Z.status,data:se},meta:A}]}})})};function y(g,b){return Sy(this,null,function(){var _;return yy(this,function(w){switch(w.label){case 0:return typeof b=="function"?[2,b(g)]:(b==="content-type"&&(b=c(g.headers)?"json":"text"),b!=="json"?[3,2]:[4,g.text()]);case 1:return _=w.sent(),[2,_.length?JSON.parse(_):null];case 2:return[2,g.text()]}})})}}var QE=function(){function e(t,n){n===void 0&&(n=void 0),this.value=t,this.meta=n}return e}(),m5=me("__rtkq/focused"),EI=me("__rtkq/unfocused"),y5=me("__rtkq/online"),PI=me("__rtkq/offline"),go;(function(e){e.query="query",e.mutation="mutation"})(go||(go={}));function kI(e){return e.type===go.query}function ZZ(e){return e.type===go.mutation}function AI(e,t,n,r,i,o){return JZ(e)?e(t,n,r,i).map(tw).map(o):Array.isArray(e)?e.map(tw).map(o):[]}function JZ(e){return typeof e=="function"}function tw(e){return typeof e=="string"?{type:e}:e}function RS(e){return e!=null}var Zf=Symbol("forceQueryFn"),nw=function(e){return typeof e[Zf]=="function"};function eJ(e){var t=e.serializeQueryArgs,n=e.queryThunk,r=e.mutationThunk,i=e.api,o=e.context,s=new Map,a=new Map,l=i.internalActions,u=l.unsubscribeQueryResult,c=l.removeMutationResult,d=l.updateSubscriptionOptions;return{buildInitiateQuery:y,buildInitiateMutation:g,getRunningQueryThunk:p,getRunningMutationThunk:m,getRunningQueriesThunk:S,getRunningMutationsThunk:v,getRunningOperationPromises:h,removalWarning:f};function f(){throw new Error(`This method had to be removed due to a conceptual bug in RTK. + Please see https://github.com/reduxjs/redux-toolkit/pull/2481 for details. + See https://redux-toolkit.js.org/rtk-query/usage/server-side-rendering for new guidance on SSR.`)}function h(){typeof process<"u";var b=function(_){return Array.from(_.values()).flatMap(function(w){return w?Object.values(w):[]})};return vy(vy([],b(s)),b(a)).filter(RS)}function p(b,_){return function(w){var x,C=o.endpointDefinitions[b],k=t({queryArgs:_,endpointDefinition:C,endpointName:b});return(x=s.get(w))==null?void 0:x[k]}}function m(b,_){return function(w){var x;return(x=a.get(w))==null?void 0:x[_]}}function S(){return function(b){return Object.values(s.get(b)||{}).filter(RS)}}function v(){return function(b){return Object.values(a.get(b)||{}).filter(RS)}}function y(b,_){var w=function(x,C){var k=C===void 0?{}:C,P=k.subscribe,A=P===void 0?!0:P,$=k.forceRefetch,M=k.subscriptionOptions,T=Zf,O=k[T];return function(I,N){var R,D,L=t({queryArgs:x,endpointDefinition:_,endpointName:b}),V=n((R={type:"query",subscribe:A,forceRefetch:$,subscriptionOptions:M,endpointName:b,originalArgs:x,queryCacheKey:L},R[Zf]=O,R)),z=i.endpoints[b].select(x),U=I(V),K=z(N()),q=U.requestId,X=U.abort,F=K.requestId!==q,W=(D=s.get(I))==null?void 0:D[L],Q=function(){return z(N())},J=Object.assign(O?U.then(Q):F&&!W?Promise.resolve(K):Promise.all([W,U]).then(Q),{arg:x,requestId:q,subscriptionOptions:M,queryCacheKey:L,abort:X,unwrap:function(){return Sy(this,null,function(){var Z;return yy(this,function(ge){switch(ge.label){case 0:return[4,J];case 1:if(Z=ge.sent(),Z.isError)throw Z.error;return[2,Z.data]}})})},refetch:function(){return I(w(x,{subscribe:!1,forceRefetch:!0}))},unsubscribe:function(){A&&I(u({queryCacheKey:L,requestId:q}))},updateSubscriptionOptions:function(Z){J.subscriptionOptions=Z,I(d({endpointName:b,requestId:q,queryCacheKey:L,options:Z}))}});if(!W&&!F&&!O){var ne=s.get(I)||{};ne[L]=J,s.set(I,ne),J.then(function(){delete ne[L],Object.keys(ne).length||s.delete(I)})}return J}};return w}function g(b){return function(_,w){var x=w===void 0?{}:w,C=x.track,k=C===void 0?!0:C,P=x.fixedCacheKey;return function(A,$){var M=r({type:"mutation",endpointName:b,originalArgs:_,track:k,fixedCacheKey:P}),T=A(M),O=T.requestId,I=T.abort,N=T.unwrap,R=T.unwrap().then(function(z){return{data:z}}).catch(function(z){return{error:z}}),D=function(){A(c({requestId:O,fixedCacheKey:P}))},L=Object.assign(R,{arg:T.arg,requestId:O,abort:I,unwrap:N,unsubscribe:D,reset:D}),V=a.get(A)||{};return a.set(A,V),V[O]=L,L.then(function(){delete V[O],Object.keys(V).length||a.delete(A)}),P&&(V[P]=L,L.then(function(){V[P]===L&&(delete V[P],Object.keys(V).length||a.delete(A))})),L}}}}function ZE(e){return e}function tJ(e){var t=this,n=e.reducerPath,r=e.baseQuery,i=e.context.endpointDefinitions,o=e.serializeQueryArgs,s=e.api,a=function(g,b,_){return function(w){var x=i[g];w(s.internalActions.queryResultPatched({queryCacheKey:o({queryArgs:b,endpointDefinition:x,endpointName:g}),patches:_}))}},l=function(g,b,_){return function(w,x){var C,k,P=s.endpoints[g].select(b)(x()),A={patches:[],inversePatches:[],undo:function(){return w(s.util.patchQueryData(g,b,A.inversePatches))}};if(P.status===Et.uninitialized)return A;if("data"in P)if(Er(P.data)){var $=GC(P.data,_),M=$[1],T=$[2];(C=A.patches).push.apply(C,M),(k=A.inversePatches).push.apply(k,T)}else{var O=_(P.data);A.patches.push({op:"replace",path:[],value:O}),A.inversePatches.push({op:"replace",path:[],value:P.data})}return w(s.util.patchQueryData(g,b,A.patches)),A}},u=function(g,b,_){return function(w){var x;return w(s.endpoints[g].initiate(b,(x={subscribe:!1,forceRefetch:!0},x[Zf]=function(){return{data:_}},x)))}},c=function(g,b){return Sy(t,[g,b],function(_,w){var x,C,k,P,A,$,M,T,O,I,N,R,D,L,V,z,U,K,q=w.signal,X=w.abort,F=w.rejectWithValue,W=w.fulfillWithValue,Q=w.dispatch,J=w.getState,ne=w.extra;return yy(this,function(Z){switch(Z.label){case 0:x=i[_.endpointName],Z.label=1;case 1:return Z.trys.push([1,8,,13]),C=ZE,k=void 0,P={signal:q,abort:X,dispatch:Q,getState:J,extra:ne,endpoint:_.endpointName,type:_.type,forced:_.type==="query"?d(_,J()):void 0},A=_.type==="query"?_[Zf]:void 0,A?(k=A(),[3,6]):[3,2];case 2:return x.query?[4,r(x.query(_.originalArgs),P,x.extraOptions)]:[3,4];case 3:return k=Z.sent(),x.transformResponse&&(C=x.transformResponse),[3,6];case 4:return[4,x.queryFn(_.originalArgs,P,x.extraOptions,function(ge){return r(ge,P,x.extraOptions)})];case 5:k=Z.sent(),Z.label=6;case 6:if(typeof process<"u",k.error)throw new QE(k.error,k.meta);return N=W,[4,C(k.data,k.meta,_.originalArgs)];case 7:return[2,N.apply(void 0,[Z.sent(),(U={fulfilledTimeStamp:Date.now(),baseQueryMeta:k.meta},U[Qa]=!0,U)])];case 8:if(R=Z.sent(),D=R,!(D instanceof QE))return[3,12];L=ZE,x.query&&x.transformErrorResponse&&(L=x.transformErrorResponse),Z.label=9;case 9:return Z.trys.push([9,11,,12]),V=F,[4,L(D.value,D.meta,_.originalArgs)];case 10:return[2,V.apply(void 0,[Z.sent(),(K={baseQueryMeta:D.meta},K[Qa]=!0,K)])];case 11:return z=Z.sent(),D=z,[3,12];case 12:throw typeof process<"u",console.error(D),D;case 13:return[2]}})})};function d(g,b){var _,w,x,C,k=(w=(_=b[n])==null?void 0:_.queries)==null?void 0:w[g.queryCacheKey],P=(x=b[n])==null?void 0:x.config.refetchOnMountOrArgChange,A=k==null?void 0:k.fulfilledTimeStamp,$=(C=g.forceRefetch)!=null?C:g.subscribe&&P;return $?$===!0||(Number(new Date)-Number(A))/1e3>=$:!1}var f=Hf(n+"/executeQuery",c,{getPendingMeta:function(){var g;return g={startedTimeStamp:Date.now()},g[Qa]=!0,g},condition:function(g,b){var _=b.getState,w,x,C,k=_(),P=(x=(w=k[n])==null?void 0:w.queries)==null?void 0:x[g.queryCacheKey],A=P==null?void 0:P.fulfilledTimeStamp,$=g.originalArgs,M=P==null?void 0:P.originalArgs,T=i[g.endpointName];return nw(g)?!0:(P==null?void 0:P.status)==="pending"?!1:d(g,k)||kI(T)&&((C=T==null?void 0:T.forceRefetch)!=null&&C.call(T,{currentArg:$,previousArg:M,endpointState:P,state:k}))?!0:!A},dispatchConditionRejection:!0}),h=Hf(n+"/executeMutation",c,{getPendingMeta:function(){var g;return g={startedTimeStamp:Date.now()},g[Qa]=!0,g}}),p=function(g){return"force"in g},m=function(g){return"ifOlderThan"in g},S=function(g,b,_){return function(w,x){var C=p(_)&&_.force,k=m(_)&&_.ifOlderThan,P=function(T){return T===void 0&&(T=!0),s.endpoints[g].initiate(b,{forceRefetch:T})},A=s.endpoints[g].select(b)(x());if(C)w(P());else if(k){var $=A==null?void 0:A.fulfilledTimeStamp;if(!$){w(P());return}var M=(Number(new Date)-Number(new Date($)))/1e3>=k;M&&w(P())}else w(P(!1))}};function v(g){return function(b){var _,w;return((w=(_=b==null?void 0:b.meta)==null?void 0:_.arg)==null?void 0:w.endpointName)===g}}function y(g,b){return{matchPending:Wu(pv(g),v(b)),matchFulfilled:Wu(xa(g),v(b)),matchRejected:Wu(bc(g),v(b))}}return{queryThunk:f,mutationThunk:h,prefetch:S,updateQueryData:l,upsertQueryData:u,patchQueryData:a,buildMatchThunkActions:y}}function OI(e,t,n,r){return AI(n[e.meta.arg.endpointName][t],xa(e)?e.payload:void 0,ep(e)?e.payload:void 0,e.meta.arg.originalArgs,"baseQueryMeta"in e.meta?e.meta.baseQueryMeta:void 0,r)}function dg(e,t,n){var r=e[t];r&&n(r)}function Jf(e){var t;return(t="arg"in e?e.arg.fixedCacheKey:e.fixedCacheKey)!=null?t:e.requestId}function JE(e,t,n){var r=e[Jf(t)];r&&n(r)}var _d={};function nJ(e){var t=e.reducerPath,n=e.queryThunk,r=e.mutationThunk,i=e.context,o=i.endpointDefinitions,s=i.apiUid,a=i.extractRehydrationInfo,l=i.hasRehydrationInfo,u=e.assertTagType,c=e.config,d=me(t+"/resetApiState"),f=Lt({name:t+"/queries",initialState:_d,reducers:{removeQueryResult:{reducer:function(_,w){var x=w.payload.queryCacheKey;delete _[x]},prepare:om()},queryResultPatched:function(_,w){var x=w.payload,C=x.queryCacheKey,k=x.patches;dg(_,C,function(P){P.data=$_(P.data,k.concat())})}},extraReducers:function(_){_.addCase(n.pending,function(w,x){var C=x.meta,k=x.meta.arg,P,A,$=nw(k);(k.subscribe||$)&&((A=w[P=k.queryCacheKey])!=null||(w[P]={status:Et.uninitialized,endpointName:k.endpointName})),dg(w,k.queryCacheKey,function(M){M.status=Et.pending,M.requestId=$&&M.requestId?M.requestId:C.requestId,k.originalArgs!==void 0&&(M.originalArgs=k.originalArgs),M.startedTimeStamp=C.startedTimeStamp})}).addCase(n.fulfilled,function(w,x){var C=x.meta,k=x.payload;dg(w,C.arg.queryCacheKey,function(P){var A;if(!(P.requestId!==C.requestId&&!nw(C.arg))){var $=o[C.arg.endpointName].merge;if(P.status=Et.fulfilled,$)if(P.data!==void 0){var M=C.fulfilledTimeStamp,T=C.arg,O=C.baseQueryMeta,I=C.requestId,N=wa(P.data,function(R){return $(R,k,{arg:T.originalArgs,baseQueryMeta:O,fulfilledTimeStamp:M,requestId:I})});P.data=N}else P.data=k;else P.data=(A=o[C.arg.endpointName].structuralSharing)==null||A?TI(sr(P.data)?$C(P.data):P.data,k):k;delete P.error,P.fulfilledTimeStamp=C.fulfilledTimeStamp}})}).addCase(n.rejected,function(w,x){var C=x.meta,k=C.condition,P=C.arg,A=C.requestId,$=x.error,M=x.payload;dg(w,P.queryCacheKey,function(T){if(!k){if(T.requestId!==A)return;T.status=Et.rejected,T.error=M??$}})}).addMatcher(l,function(w,x){for(var C=a(x).queries,k=0,P=Object.entries(C);k{let n=[],r={get(){return r.lc||r.listen(()=>{})(),r.value},l:t||0,lc:0,listen(i,o){return r.lc=n.push(i,o||r.l)/2,()=>{let s=n.indexOf(i);~s&&(n.splice(s,2),r.lc--,r.lc||r.off())}},notify(i){let o=!nr.length;for(let s=0;s(e.events=e.events||{},e.events[n+mg]||(e.events[n+mg]=r(i=>{e.events[n].reduceRight((o,s)=>(s(o),o),{shared:{},...i})})),e.events[n]=e.events[n]||[],e.events[n].push(t),()=>{let i=e.events[n],o=i.indexOf(t);i.splice(o,1),i.length||(delete e.events[n],e.events[n+mg](),delete e.events[n+mg])}),LJ=1e3,$J=(e,t)=>DJ(e,r=>{let i=t(r);i&&e.events[gg].push(i)},MJ,r=>{let i=e.listen;e.listen=(...s)=>(!e.lc&&!e.active&&(e.active=!0,r()),i(...s));let o=e.off;return e.events[gg]=[],e.off=()=>{o(),setTimeout(()=>{if(e.active&&!e.lc){e.active=!1;for(let s of e.events[gg])s();e.events[gg]=[]}},LJ)},()=>{e.listen=i,e.off=o}}),FJ=(e,t)=>{Array.isArray(e)||(e=[e]);let n,r=()=>{let o=e.map(s=>s.get());(n===void 0||o.some((s,a)=>s!==n[a]))&&(n=o,i.set(t(...o)))},i=v5(void 0,Math.max(...e.map(o=>o.l))+1);return $J(i,()=>{let o=e.map(s=>s.listen(r,i.l));return r(),()=>{for(let s of o)s()}}),i};const BJ={"Content-Type":"application/json"},jJ=/\/*$/;function VJ(e){const t=new URLSearchParams;if(e&&typeof e=="object")for(const[n,r]of Object.entries(e))r!=null&&t.set(n,r);return t.toString()}function zJ(e){return JSON.stringify(e)}function UJ(e,t){let n=`${t.baseUrl?t.baseUrl.replace(jJ,""):""}${e}`;if(t.params.path)for(const[r,i]of Object.entries(t.params.path))n=n.replace(`{${r}}`,encodeURIComponent(String(i)));if(t.params.query){const r=t.querySerializer(t.params.query);r&&(n+=`?${r}`)}return n}function GJ(e={}){const{fetch:t=globalThis.fetch,querySerializer:n,bodySerializer:r,...i}=e,o=new Headers({...BJ,...i.headers??{}});async function s(a,l){const{headers:u,body:c,params:d={},parseAs:f="json",querySerializer:h=n??VJ,bodySerializer:p=r??zJ,...m}=l||{},S=UJ(a,{baseUrl:i.baseUrl,params:d,querySerializer:h}),v=new Headers(o),y=new Headers(u);for(const[w,x]of y.entries())x==null?v.delete(w):v.set(w,x);const g={redirect:"follow",...i,...m,headers:v};c&&(g.body=p(c)),g.body instanceof FormData&&v.delete("Content-Type");const b=await t(S,g);if(b.status===204||b.headers.get("Content-Length")==="0")return b.ok?{data:{},response:b}:{error:{},response:b};if(b.ok){let w=b.body;if(f!=="stream"){const x=b.clone();w=typeof x[f]=="function"?await x[f]():await x.text()}return{data:w,response:b}}let _={};try{_=await b.clone().json()}catch{_=await b.clone().text()}return{error:_,response:b}}return{async get(a,l){return s(a,{...l,method:"GET"})},async put(a,l){return s(a,{...l,method:"PUT"})},async post(a,l){return s(a,{...l,method:"POST"})},async del(a,l){return s(a,{...l,method:"DELETE"})},async options(a,l){return s(a,{...l,method:"OPTIONS"})},async head(a,l){return s(a,{...l,method:"HEAD"})},async patch(a,l){return s(a,{...l,method:"PATCH"})},async trace(a,l){return s(a,{...l,method:"TRACE"})}}}const eh=v5(),th=v5(),xo=FJ([eh,th],(e,t)=>GJ({headers:e?{Authorization:`Bearer ${e}`}:{},baseUrl:`${t??""}`})),HJ=["Board","Image","Model"],Hd="LIST",WJ=async(e,t,n)=>{const r=th.get(),i=eh.get();return QZ({baseUrl:`${r??""}/api/v1`,prepareHeaders:s=>(i&&s.set("Authorization",`Bearer ${i}`),s)})(e,t,n)},da=NJ({baseQuery:WJ,reducerPath:"api",tagTypes:HJ,endpoints:()=>({})}),nh=da.injectEndpoints({endpoints:e=>({listBoards:e.query({query:t=>({url:"boards/",params:t}),providesTags:(t,n,r)=>{const i=[{id:"Board",type:Hd}];return t&&i.push(...t.items.map(({board_id:o})=>({type:"Board",id:o}))),i}}),listAllBoards:e.query({query:()=>({url:"boards/",params:{all:!0}}),providesTags:(t,n,r)=>{const i=[{id:"Board",type:Hd}];return t&&i.push(...t.map(({board_id:o})=>({type:"Board",id:o}))),i}}),createBoard:e.mutation({query:t=>({url:"boards/",method:"POST",params:{board_name:t}}),invalidatesTags:[{id:"Board",type:Hd}]}),updateBoard:e.mutation({query:({board_id:t,changes:n})=>({url:`boards/${t}`,method:"PATCH",body:n}),invalidatesTags:(t,n,r)=>[{type:"Board",id:r.board_id}]}),deleteBoard:e.mutation({query:t=>({url:`boards/${t}`,method:"DELETE"}),invalidatesTags:(t,n,r)=>[{type:"Board",id:r}]}),deleteBoardAndImages:e.mutation({query:t=>({url:`boards/${t}`,method:"DELETE",params:{include_images:!0}}),invalidatesTags:(t,n,r)=>[{type:"Board",id:r},{type:"Image",id:Hd}]})})}),{useListBoardsQuery:_Te,useListAllBoardsQuery:wTe,useCreateBoardMutation:xTe,useUpdateBoardMutation:CTe,useDeleteBoardMutation:qJ,useDeleteBoardAndImagesMutation:TTe}=nh,zo=ZR({selectId:e=>e.image_name,sortComparer:(e,t)=>FZ(t.updated_at,e.updated_at)}),II=["general"],ETe=["control","mask","user","other"],u6=100,PTe=20,NI=zo.getInitialState({offset:0,limit:0,total:0,isLoading:!0,isFetching:!0,categories:II,selection:[],shouldAutoSwitch:!0,galleryImageMinimumWidth:96,galleryView:"images",isInitialized:!1}),MI=Lt({name:"gallery",initialState:NI,reducers:{imageUpserted:(e,t)=>{zo.upsertOne(e,t.payload),e.shouldAutoSwitch&&t.payload.image_category==="general"&&(e.selection=[t.payload.image_name],e.galleryView="images",e.categories=II)},imageUpdatedOne:(e,t)=>{zo.updateOne(e,t.payload)},imageRemoved:(e,t)=>{zo.removeOne(e,t.payload)},imagesRemoved:(e,t)=>{zo.removeMany(e,t.payload)},imageCategoriesChanged:(e,t)=>{e.categories=t.payload},imageRangeEndSelected:(e,t)=>{const n=t.payload,r=e.selection[e.selection.length-1],i=DI(e),o=i.findIndex(a=>a.image_name===r),s=i.findIndex(a=>a.image_name===n);if(o>-1&&s>-1){const a=Math.min(o,s),l=Math.max(o,s),u=i.slice(a,l+1).map(c=>c.image_name);e.selection=Ns(e.selection.concat(u))}},imageSelectionToggled:(e,t)=>{e.selection.includes(t.payload)&&e.selection.length>1?e.selection=e.selection.filter(n=>n!==t.payload):e.selection=Ns(e.selection.concat(t.payload))},imageSelected:(e,t)=>{e.selection=t.payload?[t.payload]:[String(e.ids[0])]},shouldAutoSwitchChanged:(e,t)=>{e.shouldAutoSwitch=t.payload},setGalleryImageMinimumWidth:(e,t)=>{e.galleryImageMinimumWidth=t.payload},setGalleryView:(e,t)=>{e.galleryView=t.payload},boardIdSelected:(e,t)=>{e.selectedBoardId=t.payload},isLoadingChanged:(e,t)=>{e.isLoading=t.payload}},extraReducers:e=>{e.addCase(ea.pending,t=>{t.isFetching=!0}),e.addCase(ea.rejected,t=>{t.isFetching=!1}),e.addCase(ea.fulfilled,(t,n)=>{t.isFetching=!1;const{board_id:r,categories:i,image_origin:o,is_intermediate:s}=n.meta.arg,{items:a,offset:l,limit:u,total:c}=n.payload;zo.upsertMany(t,a),t.selection.length===0&&a.length&&(t.selection=[a[0].image_name]),!(!(i!=null&&i.includes("general"))||r)&&(t.offset=l,t.total=c)}),e.addCase(_5.fulfilled,(t,n)=>{const{image_name:r,image_url:i,thumbnail_url:o}=n.payload;zo.updateOne(t,{id:r,changes:{image_url:i,thumbnail_url:o}})}),e.addMatcher(nh.endpoints.deleteBoard.matchFulfilled,(t,n)=>{n.meta.arg.originalArgs===t.selectedBoardId&&(t.selectedBoardId=void 0)})}}),{selectAll:b5,selectById:Wa,selectEntities:kTe,selectIds:ATe,selectTotal:OTe}=zo.getSelectors(e=>e.gallery),{imageUpserted:Ev,imageUpdatedOne:KJ,imageRemoved:YJ,imagesRemoved:XJ,imageCategoriesChanged:RTe,imageRangeEndSelected:ITe,imageSelectionToggled:NTe,imageSelected:ol,shouldAutoSwitchChanged:MTe,setGalleryImageMinimumWidth:DTe,setGalleryView:LTe,boardIdSelected:QJ,isLoadingChanged:ZJ}=MI.actions,JJ=MI.reducer,DI=wt(e=>e,e=>{const t=zo.getSelectors().selectAll(e),{categories:n,selectedBoardId:r}=e;return t.filter(o=>{const s=n.includes(o.image_category),a=r?o.board_id===r:!0;return s&&a})}),S5=wt(e=>e,e=>DI(e.gallery),Ta);wt(S5,e=>HQ(e,"image_name"));wt(S5,e=>e.map(t=>t.image_name));const $Te=wt(e=>e,e=>e.gallery.selection[e.gallery.selection.length-1],Ta),_5=wo("api/imageUrlsReceived",async(e,{rejectWithValue:t})=>{const{image_name:n}=e,{get:r}=xo.get(),{data:i,error:o,response:s}=await r("/api/v1/images/{image_name}/urls",{params:{path:{image_name:n}}});return o?t({arg:e,error:o}):i}),yl=wo("api/imageMetadataReceived",async(e,{rejectWithValue:t})=>{const{image_name:n}=e,{get:r}=xo.get(),{data:i,error:o,response:s}=await r("/api/v1/images/{image_name}/metadata",{params:{path:{image_name:n}}});return o?t({arg:e,error:o}):i}),Dr=wo("api/imageUploaded",async(e,{rejectWithValue:t})=>{const{postUploadAction:n,file:r,image_category:i,is_intermediate:o,session_id:s}=e,{post:a}=xo.get(),{data:l,error:u,response:c}=await a("/api/v1/images/",{params:{query:{image_category:i,is_intermediate:o,session_id:s}},body:{file:r},bodySerializer:d=>{const f=new FormData;return f.append("file",d.file),f}});return u?t({arg:e,error:u}):l}),vl=wo("api/imageDeleted",async(e,{rejectWithValue:t})=>{const{image_name:n}=e,{del:r}=xo.get(),{data:i,error:o,response:s}=await r("/api/v1/images/{image_name}",{params:{path:{image_name:n}}});if(o)return t({arg:e,error:o})}),Qi=wo("api/imageUpdated",async(e,{rejectWithValue:t})=>{const{image_name:n,image_category:r,is_intermediate:i,session_id:o}=e,{patch:s}=xo.get(),{data:a,error:l,response:u}=await s("/api/v1/images/{image_name}",{params:{path:{image_name:n}},body:{image_category:r,is_intermediate:i,session_id:o}});return l?t({arg:e,error:l}):a}),LI=20,c6={limit:LI},ea=wo("api/receivedPageOfImages",async(e,{getState:t,rejectWithValue:n})=>{const{get:r}=xo.get(),i=t(),{categories:o,selectedBoardId:s}=i.gallery,a=b5(i).filter(f=>{const h=o.includes(f.image_category),p=s?f.board_id===s:!0;return h&&p});let l={};h5(e)?l={...c6,offset:a.length,...e}:l={...c6,categories:o,offset:a.length};const{data:u,error:c,response:d}=await r("/api/v1/images/",{params:{query:l},querySerializer:f=>$Z.stringify(f,{arrayFormat:"none"})});return c?n({arg:e,error:c}):u}),eee={isEnabled:!1,imageNames:[],asInitialImage:!1,controlNets:[],selection:[]},$I=Lt({name:"batch",initialState:eee,reducers:{isEnabledChanged:(e,t)=>{e.isEnabled=t.payload},imageAddedToBatch:(e,t)=>{e.imageNames=Ns(e.imageNames.concat(t.payload))},imagesAddedToBatch:(e,t)=>{e.imageNames=Ns(e.imageNames.concat(t.payload))},imageRemovedFromBatch:(e,t)=>{e.imageNames=e.imageNames.filter(n=>t.payload!==n),e.selection=e.selection.filter(n=>t.payload!==n)},imagesRemovedFromBatch:(e,t)=>{e.imageNames=e.imageNames.filter(n=>!t.payload.includes(n)),e.selection=e.selection.filter(n=>!t.payload.includes(n))},batchImageRangeEndSelected:(e,t)=>{const n=t.payload,r=e.selection[e.selection.length-1],i=e.imageNames.findIndex(s=>s===r),o=e.imageNames.findIndex(s=>s===n);if(i>-1&&o>-1){const s=Math.min(i,o),a=Math.max(i,o),l=e.imageNames.slice(s,a+1);e.selection=Ns(e.selection.concat(l))}},batchImageSelectionToggled:(e,t)=>{e.selection.includes(t.payload)&&e.selection.length>1?e.selection=e.selection.filter(n=>n!==t.payload):e.selection=Ns(e.selection.concat(t.payload))},batchImageSelected:(e,t)=>{e.selection=t.payload?[t.payload]:[String(e.imageNames[0])]},batchReset:e=>{e.imageNames=[],e.selection=[]},asInitialImageToggled:e=>{e.asInitialImage=!e.asInitialImage},controlNetAddedToBatch:(e,t)=>{e.controlNets=Ns(e.controlNets.concat(t.payload))},controlNetRemovedFromBatch:(e,t)=>{e.controlNets=e.controlNets.filter(n=>n!==t.payload)},controlNetToggled:(e,t)=>{e.controlNets.includes(t.payload)?e.controlNets=e.controlNets.filter(n=>n!==t.payload):e.controlNets=Ns(e.controlNets.concat(t.payload))}},extraReducers:e=>{e.addCase(vl.fulfilled,(t,n)=>{t.imageNames=t.imageNames.filter(r=>r!==n.meta.arg.image_name),t.selection=t.selection.filter(r=>r!==n.meta.arg.image_name)})}}),{isEnabledChanged:FTe,imageAddedToBatch:FI,imagesAddedToBatch:BI,imageRemovedFromBatch:BTe,imagesRemovedFromBatch:jTe,asInitialImageToggled:VTe,controlNetAddedToBatch:zTe,controlNetRemovedFromBatch:UTe,batchReset:GTe,controlNetToggled:HTe,batchImageRangeEndSelected:WTe,batchImageSelectionToggled:qTe,batchImageSelected:KTe}=$I.actions,tee=$I.reducer,nee=me("batch/selectionAddedToBatch"),Wd=(e,t)=>Math.floor(e/t)*t,Ko=(e,t)=>Math.round(e/t)*t,Jl=(e,t,n,r,i,o,s)=>{const a=Math.floor(e/2-(n+i/2)*s),l=Math.floor(t/2-(r+o/2)*s);return{x:a,y:l}},eu=(e,t,n,r,i=.95)=>{const o=e*i/n,s=t*i/r;return Math.min(1,Math.min(o,s))},YTe=.999,XTe=.1,QTe=20,wd=.95,ZTe=30,JTe=10,d6=e=>({x:Math.floor(e.x),y:Math.floor(e.y)}),La=e=>{const{width:t,height:n}=e,r={width:t,height:n},i=512*512,o=t/n;let s=t*n,a=448;for(;s1?(r.width=a,r.height=Ko(a/o,64)):o<1&&(r.height=a,r.width=Ko(a*o,64)),s=r.width*r.height;return r},ree=e=>({width:Ko(e.width,64),height:Ko(e.height,64)}),eEe=[{label:"Base",value:"base"},{label:"Mask",value:"mask"}],tEe=[{label:"Auto",value:"auto"},{label:"Manual",value:"manual"},{label:"None",value:"none"}],jI=e=>e.kind==="line"&&e.layer==="mask",nEe=e=>e.kind==="line"&&e.layer==="base",rw=e=>e.kind==="image"&&e.layer==="base",rEe=e=>e.kind==="fillRect"&&e.layer==="base",iEe=e=>e.kind==="eraseRect"&&e.layer==="base",iee=e=>e.kind==="line",Kc=()=>ER(),wc=vR,lp=e=>e.system,oee=e=>e.system.toastQueue;wt(lp,e=>{const{model_list:t}=e,n=Tv(t,(r,i,o)=>(i.status==="active"&&(r=o),r),"");return{...t[n],name:n}},Ta);wt(lp,e=>{const{model_list:t}=e;return tZ(t,(r,i)=>{if(r.format==="diffusers")return{name:i,...r}})},Ta);const oEe=wt(lp,e=>e.language,Ta);var xc={},VI={},bl={};Object.defineProperty(bl,"__esModule",{value:!0});bl.ROARR_LOG_FORMAT_VERSION=bl.ROARR_VERSION=void 0;bl.ROARR_VERSION="5.0.0";bl.ROARR_LOG_FORMAT_VERSION="2.0.0";var up={};Object.defineProperty(up,"__esModule",{value:!0});up.logLevels=void 0;up.logLevels={debug:20,error:50,fatal:60,info:30,trace:10,warn:40};var zI={},Pv={};Object.defineProperty(Pv,"__esModule",{value:!0});Pv.hasOwnProperty=void 0;const see=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);Pv.hasOwnProperty=see;(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.hasOwnProperty=void 0;var t=Pv;Object.defineProperty(e,"hasOwnProperty",{enumerable:!0,get:function(){return t.hasOwnProperty}})})(zI);var UI={},kv={},w5={},Av={};Object.defineProperty(Av,"__esModule",{value:!0});Av.boolean=void 0;const aee=function(e){switch(Object.prototype.toString.call(e)){case"[object String]":return["true","t","yes","y","on","1"].includes(e.trim().toLowerCase());case"[object Number]":return e.valueOf()===1;case"[object Boolean]":return e.valueOf();default:return!1}};Av.boolean=aee;var Ov={};Object.defineProperty(Ov,"__esModule",{value:!0});Ov.isBooleanable=void 0;const lee=function(e){switch(Object.prototype.toString.call(e)){case"[object String]":return["true","t","yes","y","on","1","false","f","no","n","off","0"].includes(e.trim().toLowerCase());case"[object Number]":return[0,1].includes(e.valueOf());case"[object Boolean]":return!0;default:return!1}};Ov.isBooleanable=lee;(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.isBooleanable=e.boolean=void 0;const t=Av;Object.defineProperty(e,"boolean",{enumerable:!0,get:function(){return t.boolean}});const n=Ov;Object.defineProperty(e,"isBooleanable",{enumerable:!0,get:function(){return n.isBooleanable}})})(w5);var Rv={};Object.defineProperty(Rv,"__esModule",{value:!0});Rv.tokenize=void 0;const uee=/(?:%(?([+0-]|-\+))?(?\d+)?(?\d+\$)?(?\.\d+)?(?[%BCESb-iosux]))|(\\%)/g,cee=e=>{let t;const n=[];let r=0,i=0,o=null;for(;(t=uee.exec(e))!==null;){t.index>i&&(o={literal:e.slice(i,t.index),type:"literal"},n.push(o));const s=t[0];i=t.index+s.length,s==="\\%"||s==="%%"?o&&o.type==="literal"?o.literal+="%":(o={literal:"%",type:"literal"},n.push(o)):t.groups&&(o={conversion:t.groups.conversion,flag:t.groups.flag||null,placeholder:s,position:t.groups.position?Number.parseInt(t.groups.position,10)-1:r++,precision:t.groups.precision?Number.parseInt(t.groups.precision.slice(1),10):null,type:"placeholder",width:t.groups.width?Number.parseInt(t.groups.width,10):null},n.push(o))}return i<=e.length-1&&(o&&o.type==="literal"?o.literal+=e.slice(i):n.push({literal:e.slice(i),type:"literal"})),n};Rv.tokenize=cee;Object.defineProperty(kv,"__esModule",{value:!0});kv.createPrintf=void 0;const f6=w5,dee=Rv,fee=(e,t)=>t.placeholder,hee=e=>{var t;const n=(o,s,a)=>a==="-"?o.padEnd(s," "):a==="-+"?((Number(o)>=0?"+":"")+o).padEnd(s," "):a==="+"?((Number(o)>=0?"+":"")+o).padStart(s," "):a==="0"?o.padStart(s,"0"):o.padStart(s," "),r=(t=e==null?void 0:e.formatUnboundExpression)!==null&&t!==void 0?t:fee,i={};return(o,...s)=>{let a=i[o];a||(a=i[o]=dee.tokenize(o));let l="";for(const u of a)if(u.type==="literal")l+=u.literal;else{let c=s[u.position];if(c===void 0)l+=r(o,u,s);else if(u.conversion==="b")l+=f6.boolean(c)?"true":"false";else if(u.conversion==="B")l+=f6.boolean(c)?"TRUE":"FALSE";else if(u.conversion==="c")l+=c;else if(u.conversion==="C")l+=String(c).toUpperCase();else if(u.conversion==="i"||u.conversion==="d")c=String(Math.trunc(c)),u.width!==null&&(c=n(c,u.width,u.flag)),l+=c;else if(u.conversion==="e")l+=Number(c).toExponential();else if(u.conversion==="E")l+=Number(c).toExponential().toUpperCase();else if(u.conversion==="f")u.precision!==null&&(c=Number(c).toFixed(u.precision)),u.width!==null&&(c=n(String(c),u.width,u.flag)),l+=c;else if(u.conversion==="o")l+=(Number.parseInt(String(c),10)>>>0).toString(8);else if(u.conversion==="s")u.width!==null&&(c=n(String(c),u.width,u.flag)),l+=c;else if(u.conversion==="S")u.width!==null&&(c=n(String(c),u.width,u.flag)),l+=String(c).toUpperCase();else if(u.conversion==="u")l+=Number.parseInt(String(c),10)>>>0;else if(u.conversion==="x")c=(Number.parseInt(String(c),10)>>>0).toString(16),u.width!==null&&(c=n(String(c),u.width,u.flag)),l+=c;else throw new Error("Unknown format specifier.")}return l}};kv.createPrintf=hee;(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.printf=e.createPrintf=void 0;const t=kv;Object.defineProperty(e,"createPrintf",{enumerable:!0,get:function(){return t.createPrintf}}),e.printf=t.createPrintf()})(UI);var h6=Object.prototype.toString,GI=function(t){var n=h6.call(t),r=n==="[object Arguments]";return r||(r=n!=="[object Array]"&&t!==null&&typeof t=="object"&&typeof t.length=="number"&&t.length>=0&&h6.call(t.callee)==="[object Function]"),r},DS,p6;function pee(){if(p6)return DS;p6=1;var e;if(!Object.keys){var t=Object.prototype.hasOwnProperty,n=Object.prototype.toString,r=GI,i=Object.prototype.propertyIsEnumerable,o=!i.call({toString:null},"toString"),s=i.call(function(){},"prototype"),a=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],l=function(f){var h=f.constructor;return h&&h.prototype===f},u={$applicationCache:!0,$console:!0,$external:!0,$frame:!0,$frameElement:!0,$frames:!0,$innerHeight:!0,$innerWidth:!0,$onmozfullscreenchange:!0,$onmozfullscreenerror:!0,$outerHeight:!0,$outerWidth:!0,$pageXOffset:!0,$pageYOffset:!0,$parent:!0,$scrollLeft:!0,$scrollTop:!0,$scrollX:!0,$scrollY:!0,$self:!0,$webkitIndexedDB:!0,$webkitStorageInfo:!0,$window:!0},c=function(){if(typeof window>"u")return!1;for(var f in window)try{if(!u["$"+f]&&t.call(window,f)&&window[f]!==null&&typeof window[f]=="object")try{l(window[f])}catch{return!0}}catch{return!0}return!1}(),d=function(f){if(typeof window>"u"||!c)return l(f);try{return l(f)}catch{return!1}};e=function(h){var p=h!==null&&typeof h=="object",m=n.call(h)==="[object Function]",S=r(h),v=p&&n.call(h)==="[object String]",y=[];if(!p&&!m&&!S)throw new TypeError("Object.keys called on a non-object");var g=s&&m;if(v&&h.length>0&&!t.call(h,0))for(var b=0;b0)for(var _=0;_"u"||!_n?je:_n(Uint8Array),al={"%AggregateError%":typeof AggregateError>"u"?je:AggregateError,"%Array%":Array,"%ArrayBuffer%":typeof ArrayBuffer>"u"?je:ArrayBuffer,"%ArrayIteratorPrototype%":tu&&_n?_n([][Symbol.iterator]()):je,"%AsyncFromSyncIteratorPrototype%":je,"%AsyncFunction%":hu,"%AsyncGenerator%":hu,"%AsyncGeneratorFunction%":hu,"%AsyncIteratorPrototype%":hu,"%Atomics%":typeof Atomics>"u"?je:Atomics,"%BigInt%":typeof BigInt>"u"?je:BigInt,"%BigInt64Array%":typeof BigInt64Array>"u"?je:BigInt64Array,"%BigUint64Array%":typeof BigUint64Array>"u"?je:BigUint64Array,"%Boolean%":Boolean,"%DataView%":typeof DataView>"u"?je:DataView,"%Date%":Date,"%decodeURI%":decodeURI,"%decodeURIComponent%":decodeURIComponent,"%encodeURI%":encodeURI,"%encodeURIComponent%":encodeURIComponent,"%Error%":Error,"%eval%":eval,"%EvalError%":EvalError,"%Float32Array%":typeof Float32Array>"u"?je:Float32Array,"%Float64Array%":typeof Float64Array>"u"?je:Float64Array,"%FinalizationRegistry%":typeof FinalizationRegistry>"u"?je:FinalizationRegistry,"%Function%":WI,"%GeneratorFunction%":hu,"%Int8Array%":typeof Int8Array>"u"?je:Int8Array,"%Int16Array%":typeof Int16Array>"u"?je:Int16Array,"%Int32Array%":typeof Int32Array>"u"?je:Int32Array,"%isFinite%":isFinite,"%isNaN%":isNaN,"%IteratorPrototype%":tu&&_n?_n(_n([][Symbol.iterator]())):je,"%JSON%":typeof JSON=="object"?JSON:je,"%Map%":typeof Map>"u"?je:Map,"%MapIteratorPrototype%":typeof Map>"u"||!tu||!_n?je:_n(new Map()[Symbol.iterator]()),"%Math%":Math,"%Number%":Number,"%Object%":Object,"%parseFloat%":parseFloat,"%parseInt%":parseInt,"%Promise%":typeof Promise>"u"?je:Promise,"%Proxy%":typeof Proxy>"u"?je:Proxy,"%RangeError%":RangeError,"%ReferenceError%":ReferenceError,"%Reflect%":typeof Reflect>"u"?je:Reflect,"%RegExp%":RegExp,"%Set%":typeof Set>"u"?je:Set,"%SetIteratorPrototype%":typeof Set>"u"||!tu||!_n?je:_n(new Set()[Symbol.iterator]()),"%SharedArrayBuffer%":typeof SharedArrayBuffer>"u"?je:SharedArrayBuffer,"%String%":String,"%StringIteratorPrototype%":tu&&_n?_n(""[Symbol.iterator]()):je,"%Symbol%":tu?Symbol:je,"%SyntaxError%":Cc,"%ThrowTypeError%":Oee,"%TypedArray%":Iee,"%TypeError%":Xu,"%Uint8Array%":typeof Uint8Array>"u"?je:Uint8Array,"%Uint8ClampedArray%":typeof Uint8ClampedArray>"u"?je:Uint8ClampedArray,"%Uint16Array%":typeof Uint16Array>"u"?je:Uint16Array,"%Uint32Array%":typeof Uint32Array>"u"?je:Uint32Array,"%URIError%":URIError,"%WeakMap%":typeof WeakMap>"u"?je:WeakMap,"%WeakRef%":typeof WeakRef>"u"?je:WeakRef,"%WeakSet%":typeof WeakSet>"u"?je:WeakSet};if(_n)try{null.error}catch(e){var Nee=_n(_n(e));al["%Error.prototype%"]=Nee}var Mee=function e(t){var n;if(t==="%AsyncFunction%")n=$S("async function () {}");else if(t==="%GeneratorFunction%")n=$S("function* () {}");else if(t==="%AsyncGeneratorFunction%")n=$S("async function* () {}");else if(t==="%AsyncGenerator%"){var r=e("%AsyncGeneratorFunction%");r&&(n=r.prototype)}else if(t==="%AsyncIteratorPrototype%"){var i=e("%AsyncGenerator%");i&&_n&&(n=_n(i.prototype))}return al[t]=n,n},b6={"%ArrayBufferPrototype%":["ArrayBuffer","prototype"],"%ArrayPrototype%":["Array","prototype"],"%ArrayProto_entries%":["Array","prototype","entries"],"%ArrayProto_forEach%":["Array","prototype","forEach"],"%ArrayProto_keys%":["Array","prototype","keys"],"%ArrayProto_values%":["Array","prototype","values"],"%AsyncFunctionPrototype%":["AsyncFunction","prototype"],"%AsyncGenerator%":["AsyncGeneratorFunction","prototype"],"%AsyncGeneratorPrototype%":["AsyncGeneratorFunction","prototype","prototype"],"%BooleanPrototype%":["Boolean","prototype"],"%DataViewPrototype%":["DataView","prototype"],"%DatePrototype%":["Date","prototype"],"%ErrorPrototype%":["Error","prototype"],"%EvalErrorPrototype%":["EvalError","prototype"],"%Float32ArrayPrototype%":["Float32Array","prototype"],"%Float64ArrayPrototype%":["Float64Array","prototype"],"%FunctionPrototype%":["Function","prototype"],"%Generator%":["GeneratorFunction","prototype"],"%GeneratorPrototype%":["GeneratorFunction","prototype","prototype"],"%Int8ArrayPrototype%":["Int8Array","prototype"],"%Int16ArrayPrototype%":["Int16Array","prototype"],"%Int32ArrayPrototype%":["Int32Array","prototype"],"%JSONParse%":["JSON","parse"],"%JSONStringify%":["JSON","stringify"],"%MapPrototype%":["Map","prototype"],"%NumberPrototype%":["Number","prototype"],"%ObjectPrototype%":["Object","prototype"],"%ObjProto_toString%":["Object","prototype","toString"],"%ObjProto_valueOf%":["Object","prototype","valueOf"],"%PromisePrototype%":["Promise","prototype"],"%PromiseProto_then%":["Promise","prototype","then"],"%Promise_all%":["Promise","all"],"%Promise_reject%":["Promise","reject"],"%Promise_resolve%":["Promise","resolve"],"%RangeErrorPrototype%":["RangeError","prototype"],"%ReferenceErrorPrototype%":["ReferenceError","prototype"],"%RegExpPrototype%":["RegExp","prototype"],"%SetPrototype%":["Set","prototype"],"%SharedArrayBufferPrototype%":["SharedArrayBuffer","prototype"],"%StringPrototype%":["String","prototype"],"%SymbolPrototype%":["Symbol","prototype"],"%SyntaxErrorPrototype%":["SyntaxError","prototype"],"%TypedArrayPrototype%":["TypedArray","prototype"],"%TypeErrorPrototype%":["TypeError","prototype"],"%Uint8ArrayPrototype%":["Uint8Array","prototype"],"%Uint8ClampedArrayPrototype%":["Uint8ClampedArray","prototype"],"%Uint16ArrayPrototype%":["Uint16Array","prototype"],"%Uint32ArrayPrototype%":["Uint32Array","prototype"],"%URIErrorPrototype%":["URIError","prototype"],"%WeakMapPrototype%":["WeakMap","prototype"],"%WeakSetPrototype%":["WeakSet","prototype"]},cp=HI,wy=Aee,Dee=cp.call(Function.call,Array.prototype.concat),Lee=cp.call(Function.apply,Array.prototype.splice),S6=cp.call(Function.call,String.prototype.replace),xy=cp.call(Function.call,String.prototype.slice),$ee=cp.call(Function.call,RegExp.prototype.exec),Fee=/[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g,Bee=/\\(\\)?/g,jee=function(t){var n=xy(t,0,1),r=xy(t,-1);if(n==="%"&&r!=="%")throw new Cc("invalid intrinsic syntax, expected closing `%`");if(r==="%"&&n!=="%")throw new Cc("invalid intrinsic syntax, expected opening `%`");var i=[];return S6(t,Fee,function(o,s,a,l){i[i.length]=a?S6(l,Bee,"$1"):s||o}),i},Vee=function(t,n){var r=t,i;if(wy(b6,r)&&(i=b6[r],r="%"+i[0]+"%"),wy(al,r)){var o=al[r];if(o===hu&&(o=Mee(r)),typeof o>"u"&&!n)throw new Xu("intrinsic "+t+" exists, but is not available. Please file an issue!");return{alias:i,name:r,value:o}}throw new Cc("intrinsic "+t+" does not exist!")},zee=function(t,n){if(typeof t!="string"||t.length===0)throw new Xu("intrinsic name must be a non-empty string");if(arguments.length>1&&typeof n!="boolean")throw new Xu('"allowMissing" argument must be a boolean');if($ee(/^%?[^%]*%?$/,t)===null)throw new Cc("`%` may not be present anywhere but at the beginning and end of the intrinsic name");var r=jee(t),i=r.length>0?r[0]:"",o=Vee("%"+i+"%",n),s=o.name,a=o.value,l=!1,u=o.alias;u&&(i=u[0],Lee(r,Dee([0,1],u)));for(var c=1,d=!0;c=r.length){var m=sl(a,f);d=!!m,d&&"get"in m&&!("originalValue"in m.get)?a=m.get:a=a[f]}else d=wy(a,f),a=a[f];d&&!l&&(al[s]=a)}}return a},Uee=zee,iw=Uee("%Object.defineProperty%",!0),ow=function(){if(iw)try{return iw({},"a",{value:1}),!0}catch{return!1}return!1};ow.hasArrayLengthDefineBug=function(){if(!ow())return null;try{return iw([],"length",{value:1}).length!==1}catch{return!0}};var Gee=ow,Hee=yee,Wee=typeof Symbol=="function"&&typeof Symbol("foo")=="symbol",qee=Object.prototype.toString,Kee=Array.prototype.concat,qI=Object.defineProperty,Yee=function(e){return typeof e=="function"&&qee.call(e)==="[object Function]"},Xee=Gee(),KI=qI&&Xee,Qee=function(e,t,n,r){if(t in e){if(r===!0){if(e[t]===n)return}else if(!Yee(r)||!r())return}KI?qI(e,t,{configurable:!0,enumerable:!1,value:n,writable:!0}):e[t]=n},YI=function(e,t){var n=arguments.length>2?arguments[2]:{},r=Hee(t);Wee&&(r=Kee.call(r,Object.getOwnPropertySymbols(t)));for(var i=0;i200)return v.sort();for(let y=1;yg;)v[b]=v[b-1],b--;v[b]=g}return v}const a=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(Object.getPrototypeOf(new Int8Array)),Symbol.toStringTag).get;function l(v){return a.call(v)!==void 0&&v.length!==0}function u(v,y,g){v.length= 1`)}return g===void 0?1/0:g}function h(v){return v===1?"1 item":`${v} items`}function p(v){const y=new Set;for(const g of v)(typeof g=="string"||typeof g=="number")&&y.add(String(g));return y}function m(v){if(n.call(v,"strict")){const y=v.strict;if(typeof y!="boolean")throw new TypeError('The "strict" argument must be of type boolean');if(y)return g=>{let b=`Object can not safely be stringified. Received type ${typeof g}`;throw typeof g!="function"&&(b+=` (${g.toString()})`),new Error(b)}}}function S(v){v={...v};const y=m(v);y&&(v.bigint===void 0&&(v.bigint=!1),"circularValue"in v||(v.circularValue=Error));const g=c(v),b=d(v,"bigint"),_=d(v,"deterministic"),w=f(v,"maximumDepth"),x=f(v,"maximumBreadth");function C(M,T,O,I,N,R){let D=T[M];switch(typeof D=="object"&&D!==null&&typeof D.toJSON=="function"&&(D=D.toJSON(M)),D=I.call(T,M,D),typeof D){case"string":return o(D);case"object":{if(D===null)return"null";if(O.indexOf(D)!==-1)return g;let L="",V=",";const z=R;if(Array.isArray(D)){if(D.length===0)return"[]";if(wx){const ne=D.length-x-1;L+=`${V}"... ${h(ne)} not stringified"`}return N!==""&&(L+=` +${z}`),O.pop(),`[${L}]`}let U=Object.keys(D);const K=U.length;if(K===0)return"{}";if(wx){const W=K-x;L+=`${X}"...":${q}"${h(W)} not stringified"`,X=V}return N!==""&&X.length>1&&(L=` +${R}${L} +${z}`),O.pop(),`{${L}}`}case"number":return isFinite(D)?String(D):y?y(D):"null";case"boolean":return D===!0?"true":"false";case"undefined":return;case"bigint":if(b)return String(D);default:return y?y(D):void 0}}function k(M,T,O,I,N,R){switch(typeof T=="object"&&T!==null&&typeof T.toJSON=="function"&&(T=T.toJSON(M)),typeof T){case"string":return o(T);case"object":{if(T===null)return"null";if(O.indexOf(T)!==-1)return g;const D=R;let L="",V=",";if(Array.isArray(T)){if(T.length===0)return"[]";if(wx){const F=T.length-x-1;L+=`${V}"... ${h(F)} not stringified"`}return N!==""&&(L+=` +${D}`),O.pop(),`[${L}]`}O.push(T);let z="";N!==""&&(R+=N,V=`, +${R}`,z=" ");let U="";for(const K of I){const q=k(K,T[K],O,I,N,R);q!==void 0&&(L+=`${U}${o(K)}:${z}${q}`,U=V)}return N!==""&&U.length>1&&(L=` +${R}${L} +${D}`),O.pop(),`{${L}}`}case"number":return isFinite(T)?String(T):y?y(T):"null";case"boolean":return T===!0?"true":"false";case"undefined":return;case"bigint":if(b)return String(T);default:return y?y(T):void 0}}function P(M,T,O,I,N){switch(typeof T){case"string":return o(T);case"object":{if(T===null)return"null";if(typeof T.toJSON=="function"){if(T=T.toJSON(M),typeof T!="object")return P(M,T,O,I,N);if(T===null)return"null"}if(O.indexOf(T)!==-1)return g;const R=N;if(Array.isArray(T)){if(T.length===0)return"[]";if(wx){const J=T.length-x-1;q+=`${X}"... ${h(J)} not stringified"`}return q+=` +${R}`,O.pop(),`[${q}]`}let D=Object.keys(T);const L=D.length;if(L===0)return"{}";if(wx){const q=L-x;z+=`${U}"...": "${h(q)} not stringified"`,U=V}return U!==""&&(z=` +${N}${z} +${R}`),O.pop(),`{${z}}`}case"number":return isFinite(T)?String(T):y?y(T):"null";case"boolean":return T===!0?"true":"false";case"undefined":return;case"bigint":if(b)return String(T);default:return y?y(T):void 0}}function A(M,T,O){switch(typeof T){case"string":return o(T);case"object":{if(T===null)return"null";if(typeof T.toJSON=="function"){if(T=T.toJSON(M),typeof T!="object")return A(M,T,O);if(T===null)return"null"}if(O.indexOf(T)!==-1)return g;let I="";if(Array.isArray(T)){if(T.length===0)return"[]";if(wx){const K=T.length-x-1;I+=`,"... ${h(K)} not stringified"`}return O.pop(),`[${I}]`}let N=Object.keys(T);const R=N.length;if(R===0)return"{}";if(wx){const V=R-x;I+=`${D}"...":"${h(V)} not stringified"`}return O.pop(),`{${I}}`}case"number":return isFinite(T)?String(T):y?y(T):"null";case"boolean":return T===!0?"true":"false";case"undefined":return;case"bigint":if(b)return String(T);default:return y?y(T):void 0}}function $(M,T,O){if(arguments.length>1){let I="";if(typeof O=="number"?I=" ".repeat(Math.min(O,10)):typeof O=="string"&&(I=O.slice(0,10)),T!=null){if(typeof T=="function")return C("",{"":M},[],T,I,"");if(Array.isArray(T))return k("",M,[],p(T),I,"")}if(I.length!==0)return P("",M,[],I,"")}return A("",M,[])}return $}})(sw,sw.exports);var ste=sw.exports;(function(e){var t=Me&&Me.__importDefault||function(g){return g&&g.__esModule?g:{default:g}};Object.defineProperty(e,"__esModule",{value:!0}),e.createLogger=void 0;const n=bl,r=up,i=zI,o=UI,s=t(x5),a=t(ste);let l=!1;const u=(0,s.default)(),c=()=>u.ROARR,d=()=>({messageContext:{},transforms:[]}),f=()=>{const g=c().asyncLocalStorage;if(!g)throw new Error("AsyncLocalContext is unavailable.");const b=g.getStore();return b||d()},h=()=>!!c().asyncLocalStorage,p=()=>{if(h()){const g=f();return(0,i.hasOwnProperty)(g,"sequenceRoot")&&(0,i.hasOwnProperty)(g,"sequence")&&typeof g.sequence=="number"?String(g.sequenceRoot)+"."+String(g.sequence++):String(c().sequence++)}return String(c().sequence++)},m=(g,b)=>(_,w,x,C,k,P,A,$,M,T)=>{g.child({logLevel:b})(_,w,x,C,k,P,A,$,M,T)},S=1e3,v=(g,b)=>(_,w,x,C,k,P,A,$,M,T)=>{const O=(0,a.default)({a:_,b:w,c:x,d:C,e:k,f:P,g:A,h:$,i:M,j:T,logLevel:b});if(!O)throw new Error("Expected key to be a string");const I=c().onceLog;I.has(O)||(I.add(O),I.size>S&&I.clear(),g.child({logLevel:b})(_,w,x,C,k,P,A,$,M,T))},y=(g,b={},_=[])=>{const w=(x,C,k,P,A,$,M,T,O,I)=>{const N=Date.now(),R=p();let D;h()?D=f():D=d();let L,V;if(typeof x=="string"?L={...D.messageContext,...b}:L={...D.messageContext,...b,...x},typeof x=="string"&&C===void 0)V=x;else if(typeof x=="string"){if(!x.includes("%"))throw new Error("When a string parameter is followed by other arguments, then it is assumed that you are attempting to format a message using printf syntax. You either forgot to add printf bindings or if you meant to add context to the log message, pass them in an object as the first parameter.");V=(0,o.printf)(x,C,k,P,A,$,M,T,O,I)}else{let U=C;if(typeof C!="string")if(C===void 0)U="";else throw new TypeError("Message must be a string. Received "+typeof C+".");V=(0,o.printf)(U,k,P,A,$,M,T,O,I)}let z={context:L,message:V,sequence:R,time:N,version:n.ROARR_LOG_FORMAT_VERSION};for(const U of[...D.transforms,..._])if(z=U(z),typeof z!="object"||z===null)throw new Error("Message transform function must return a message object.");g(z)};return w.child=x=>{let C;return h()?C=f():C=d(),typeof x=="function"?(0,e.createLogger)(g,{...C.messageContext,...b,...x},[x,..._]):(0,e.createLogger)(g,{...C.messageContext,...b,...x},_)},w.getContext=()=>{let x;return h()?x=f():x=d(),{...x.messageContext,...b}},w.adopt=async(x,C)=>{if(!h())return l===!1&&(l=!0,g({context:{logLevel:r.logLevels.warn,package:"roarr"},message:"async_hooks are unavailable; Roarr.adopt will not function as expected",sequence:p(),time:Date.now(),version:n.ROARR_LOG_FORMAT_VERSION})),x();const k=f();let P;(0,i.hasOwnProperty)(k,"sequenceRoot")&&(0,i.hasOwnProperty)(k,"sequence")&&typeof k.sequence=="number"?P=k.sequenceRoot+"."+String(k.sequence++):P=String(c().sequence++);let A={...k.messageContext};const $=[...k.transforms];typeof C=="function"?$.push(C):A={...A,...C};const M=c().asyncLocalStorage;if(!M)throw new Error("Async local context unavailable.");return M.run({messageContext:A,sequence:0,sequenceRoot:P,transforms:$},()=>x())},w.debug=m(w,r.logLevels.debug),w.debugOnce=v(w,r.logLevels.debug),w.error=m(w,r.logLevels.error),w.errorOnce=v(w,r.logLevels.error),w.fatal=m(w,r.logLevels.fatal),w.fatalOnce=v(w,r.logLevels.fatal),w.info=m(w,r.logLevels.info),w.infoOnce=v(w,r.logLevels.info),w.trace=m(w,r.logLevels.trace),w.traceOnce=v(w,r.logLevels.trace),w.warn=m(w,r.logLevels.warn),w.warnOnce=v(w,r.logLevels.warn),w};e.createLogger=y})(VI);var Iv={},ate=function(t,n){for(var r=t.split("."),i=n.split("."),o=0;o<3;o++){var s=Number(r[o]),a=Number(i[o]);if(s>a)return 1;if(a>s)return-1;if(!isNaN(s)&&isNaN(a))return 1;if(isNaN(s)&&!isNaN(a))return-1}return 0},lte=Me&&Me.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(Iv,"__esModule",{value:!0});Iv.createRoarrInitialGlobalStateBrowser=void 0;const _6=bl,w6=lte(ate),ute=e=>{const t=(e.versions||[]).concat();return t.length>1&&t.sort(w6.default),t.includes(_6.ROARR_VERSION)||t.push(_6.ROARR_VERSION),t.sort(w6.default),{sequence:0,...e,versions:t}};Iv.createRoarrInitialGlobalStateBrowser=ute;var Nv={};Object.defineProperty(Nv,"__esModule",{value:!0});Nv.getLogLevelName=void 0;const cte=e=>e<=10?"trace":e<=20?"debug":e<=30?"info":e<=40?"warn":e<=50?"error":"fatal";Nv.getLogLevelName=cte;(function(e){var t=Me&&Me.__importDefault||function(d){return d&&d.__esModule?d:{default:d}};Object.defineProperty(e,"__esModule",{value:!0}),e.getLogLevelName=e.logLevels=e.Roarr=e.ROARR=void 0;const n=VI,r=Iv,o=(0,t(x5).default)(),s=(0,r.createRoarrInitialGlobalStateBrowser)(o.ROARR||{});e.ROARR=s,o.ROARR=s;const a=d=>JSON.stringify(d),l=(0,n.createLogger)(d=>{var f;s.write&&s.write(((f=s.serializeMessage)!==null&&f!==void 0?f:a)(d))});e.Roarr=l;var u=up;Object.defineProperty(e,"logLevels",{enumerable:!0,get:function(){return u.logLevels}});var c=Nv;Object.defineProperty(e,"getLogLevelName",{enumerable:!0,get:function(){return c.getLogLevelName}})})(xc);var C5={},Mv={},Dv={};Object.defineProperty(Dv,"__esModule",{value:!0});Dv.createLogMethods=void 0;var dte=function(){return{debug:console.debug.bind(console),error:console.error.bind(console),fatal:console.error.bind(console),info:console.info.bind(console),trace:console.debug.bind(console),warn:console.warn.bind(console)}};Dv.createLogMethods=dte;var tN={},dp={},T5={},Lv={},$v={};Object.defineProperty($v,"__esModule",{value:!0});$v.convertWildcardToRegex=void 0;var fte=/\*+/g,hte=function(e){return new RegExp(e.replace(fte,"(.+?)"))};$v.convertWildcardToRegex=hte;var fp={};Object.defineProperty(fp,"__esModule",{value:!0});fp.escapeRegexString=void 0;var pte=/[$()*+.?[\\\]^{|}]/g,gte=/-/g,mte=function(e){return e.replace(pte,"\\$&").replace(gte,"\\x2d")};fp.escapeRegexString=mte;var Fv={};Object.defineProperty(Fv,"__esModule",{value:!0});Fv.parseRegex=void 0;var yte=/(\/?)(.+)\1([a-z]*)/,vte=/^(?!.*?(.).*?\1)[AJUXgimsux]+$/,bte=function(e){var t=yte.exec(e);if(!t)throw new Error("Invalid RegExp.");return t[3]&&!vte.test(t[3])?new RegExp(e):new RegExp(t[2],t[3])};Fv.parseRegex=bte;Object.defineProperty(Lv,"__esModule",{value:!0});Lv.createStringTest=void 0;var Ste=$v,_te=fp,wte=Fv,BS=function(e,t){var n;return e[t]?n=e[t]:n=e[t]=(0,wte.parseRegex)(t),function(r){var i,o;return(o=(i=r.match(n))===null||i===void 0?void 0:i[0])!==null&&o!==void 0?o:!1}},xte=function(e,t){if(t.type!=="Tag")throw new Error("Expected a tag expression.");var n=t.expression;if(n.type==="RangeExpression")throw new Error("Unexpected range expression.");if(n.type==="RegexExpression")return BS(e,n.value);if(n.type!=="LiteralExpression")throw new Error("Expected a literal expression.");var r=String(n.value);return r.includes("*")&&n.quoted===!1?BS(e,String((0,Ste.convertWildcardToRegex)(r))+(n.quoted?"u":"ui")):BS(e,"/("+(0,_te.escapeRegexString)(r)+")/"+(n.quoted?"u":"ui"))};Lv.createStringTest=xte;var Bv={};Object.defineProperty(Bv,"__esModule",{value:!0});Bv.testComparisonRange=void 0;var Cte=function(e,t,n){switch(n){case":=":return t===e;case":>":return t>e;case":<":return t=":return t>=e;case":<=":return t<=e;default:throw new Error("Unimplemented comparison operator: ".concat(n))}};Bv.testComparisonRange=Cte;var jv={};Object.defineProperty(jv,"__esModule",{value:!0});jv.testRange=void 0;var Tte=function(e,t){return typeof e=="number"?!(et.max||e===t.max&&!t.maxInclusive):!1};jv.testRange=Tte;(function(e){var t=Me&&Me.__assign||function(){return t=Object.assign||function(c){for(var d,f=1,h=arguments.length;f0?{path:l.path,query:new RegExp("("+l.keywords.map(function(u){return(0,kte.escapeRegexString)(u.trim())}).join("|")+")")}:{path:l.path}})};Vv.highlight=Ote;var zv={},nN={exports:{}};(function(e){(function(t,n){e.exports?e.exports=n():t.nearley=n()})(Me,function(){function t(u,c,d){return this.id=++t.highestId,this.name=u,this.symbols=c,this.postprocess=d,this}t.highestId=0,t.prototype.toString=function(u){var c=typeof u>"u"?this.symbols.map(l).join(" "):this.symbols.slice(0,u).map(l).join(" ")+" ● "+this.symbols.slice(u).map(l).join(" ");return this.name+" → "+c};function n(u,c,d,f){this.rule=u,this.dot=c,this.reference=d,this.data=[],this.wantedBy=f,this.isComplete=this.dot===u.symbols.length}n.prototype.toString=function(){return"{"+this.rule.toString(this.dot)+"}, from: "+(this.reference||0)},n.prototype.nextState=function(u){var c=new n(this.rule,this.dot+1,this.reference,this.wantedBy);return c.left=this,c.right=u,c.isComplete&&(c.data=c.build(),c.right=void 0),c},n.prototype.build=function(){var u=[],c=this;do u.push(c.right.data),c=c.left;while(c.left);return u.reverse(),u},n.prototype.finish=function(){this.rule.postprocess&&(this.data=this.rule.postprocess(this.data,this.reference,s.fail))};function r(u,c){this.grammar=u,this.index=c,this.states=[],this.wants={},this.scannable=[],this.completed={}}r.prototype.process=function(u){for(var c=this.states,d=this.wants,f=this.completed,h=0;h0&&c.push(" ^ "+f+" more lines identical to this"),f=0,c.push(" "+m)),d=m}},s.prototype.getSymbolDisplay=function(u){return a(u)},s.prototype.buildFirstStateStack=function(u,c){if(c.indexOf(u)!==-1)return null;if(u.wantedBy.length===0)return[u];var d=u.wantedBy[0],f=[u].concat(c),h=this.buildFirstStateStack(d,f);return h===null?null:[u].concat(h)},s.prototype.save=function(){var u=this.table[this.current];return u.lexerState=this.lexerState,u},s.prototype.restore=function(u){var c=u.index;this.current=c,this.table[c]=u,this.table.splice(c+1),this.lexerState=u.lexerState,this.results=this.finish()},s.prototype.rewind=function(u){if(!this.options.keepHistory)throw new Error("set option `keepHistory` to enable rewinding");this.restore(this.table[u])},s.prototype.finish=function(){var u=[],c=this.grammar.start,d=this.table[this.table.length-1];return d.states.forEach(function(f){f.rule.name===c&&f.dot===f.rule.symbols.length&&f.reference===0&&f.data!==s.fail&&u.push(f)}),u.map(function(f){return f.data})};function a(u){var c=typeof u;if(c==="string")return u;if(c==="object"){if(u.literal)return JSON.stringify(u.literal);if(u instanceof RegExp)return"character matching "+u;if(u.type)return u.type+" token";if(u.test)return"token matching "+String(u.test);throw new Error("Unknown symbol type: "+u)}}function l(u){var c=typeof u;if(c==="string")return u;if(c==="object"){if(u.literal)return JSON.stringify(u.literal);if(u instanceof RegExp)return u.toString();if(u.type)return"%"+u.type;if(u.test)return"<"+String(u.test)+">";throw new Error("Unknown symbol type: "+u)}}return{Parser:s,Grammar:i,Rule:t}})})(nN);var Rte=nN.exports,Sl={},rN={},Ea={};Ea.__esModule=void 0;Ea.__esModule=!0;var Ite=typeof Object.setPrototypeOf=="function",Nte=typeof Object.getPrototypeOf=="function",Mte=typeof Object.defineProperty=="function",Dte=typeof Object.create=="function",Lte=typeof Object.prototype.hasOwnProperty=="function",$te=function(t,n){Ite?Object.setPrototypeOf(t,n):t.__proto__=n};Ea.setPrototypeOf=$te;var Fte=function(t){return Nte?Object.getPrototypeOf(t):t.__proto__||t.prototype};Ea.getPrototypeOf=Fte;var x6=!1,Bte=function e(t,n,r){if(Mte&&!x6)try{Object.defineProperty(t,n,r)}catch{x6=!0,e(t,n,r)}else t[n]=r.value};Ea.defineProperty=Bte;var iN=function(t,n){return Lte?t.hasOwnProperty(t,n):t[n]===void 0};Ea.hasOwnProperty=iN;var jte=function(t,n){if(Dte)return Object.create(t,n);var r=function(){};r.prototype=t;var i=new r;if(typeof n>"u")return i;if(typeof n=="null")throw new Error("PropertyDescriptors must not be null.");if(typeof n=="object")for(var o in n)iN(n,o)&&(i[o]=n[o].value);return i};Ea.objectCreate=jte;(function(e){e.__esModule=void 0,e.__esModule=!0;var t=Ea,n=t.setPrototypeOf,r=t.getPrototypeOf,i=t.defineProperty,o=t.objectCreate,s=new Error().toString()==="[object Error]",a="";function l(u){var c=this.constructor,d=c.name||function(){var S=c.toString().match(/^function\s*([^\s(]+)/);return S===null?a||"Error":S[1]}(),f=d==="Error",h=f?a:d,p=Error.apply(this,arguments);if(n(p,r(this)),!(p instanceof c)||!(p instanceof l)){var p=this;Error.apply(this,arguments),i(p,"message",{configurable:!0,enumerable:!1,value:u,writable:!0})}if(i(p,"name",{configurable:!0,enumerable:!1,value:h,writable:!0}),Error.captureStackTrace&&Error.captureStackTrace(p,f?l:c),p.stack===void 0){var m=new Error(u);m.name=p.name,p.stack=m.stack}return s&&i(p,"toString",{configurable:!0,enumerable:!1,value:function(){return(this.name||"Error")+(typeof this.message>"u"?"":": "+this.message)},writable:!0}),p}a=l.name||"ExtendableError",l.prototype=o(Error.prototype,{constructor:{value:Error,enumerable:!1,writable:!0,configurable:!0}}),e.ExtendableError=l,e.default=e.ExtendableError})(rN);var oN=Me&&Me.__extends||function(){var e=function(t,n){return e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)Object.prototype.hasOwnProperty.call(i,o)&&(r[o]=i[o])},e(t,n)};return function(t,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");e(t,n);function r(){this.constructor=t}t.prototype=n===null?Object.create(n):(r.prototype=n.prototype,new r)}}();Object.defineProperty(Sl,"__esModule",{value:!0});Sl.SyntaxError=Sl.LiqeError=void 0;var Vte=rN,sN=function(e){oN(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(Vte.ExtendableError);Sl.LiqeError=sN;var zte=function(e){oN(t,e);function t(n,r,i,o){var s=e.call(this,n)||this;return s.message=n,s.offset=r,s.line=i,s.column=o,s}return t}(sN);Sl.SyntaxError=zte;var E5={},Cy=Me&&Me.__assign||function(){return Cy=Object.assign||function(e){for(var t,n=1,r=arguments.length;n"}],postprocess:function(e){return e.join("")}},{name:"comparison_operator$subexpression$1",symbols:["comparison_operator$subexpression$1$string$2"]},{name:"comparison_operator$subexpression$1$string$3",symbols:[{literal:":"},{literal:"<"}],postprocess:function(e){return e.join("")}},{name:"comparison_operator$subexpression$1",symbols:["comparison_operator$subexpression$1$string$3"]},{name:"comparison_operator$subexpression$1$string$4",symbols:[{literal:":"},{literal:">"},{literal:"="}],postprocess:function(e){return e.join("")}},{name:"comparison_operator$subexpression$1",symbols:["comparison_operator$subexpression$1$string$4"]},{name:"comparison_operator$subexpression$1$string$5",symbols:[{literal:":"},{literal:"<"},{literal:"="}],postprocess:function(e){return e.join("")}},{name:"comparison_operator$subexpression$1",symbols:["comparison_operator$subexpression$1$string$5"]},{name:"comparison_operator",symbols:["comparison_operator$subexpression$1"],postprocess:function(e,t){return{location:{start:t,end:t+e[0][0].length},type:"ComparisonOperator",operator:e[0][0]}}},{name:"regex",symbols:["regex_body","regex_flags"],postprocess:function(e){return e.join("")}},{name:"regex_body$ebnf$1",symbols:[]},{name:"regex_body$ebnf$1",symbols:["regex_body$ebnf$1","regex_body_char"],postprocess:function(e){return e[0].concat([e[1]])}},{name:"regex_body",symbols:[{literal:"/"},"regex_body$ebnf$1",{literal:"/"}],postprocess:function(e){return"/"+e[1].join("")+"/"}},{name:"regex_body_char",symbols:[/[^\\]/],postprocess:Io},{name:"regex_body_char",symbols:[{literal:"\\"},/[^\\]/],postprocess:function(e){return"\\"+e[1]}},{name:"regex_flags",symbols:[]},{name:"regex_flags$ebnf$1",symbols:[/[gmiyusd]/]},{name:"regex_flags$ebnf$1",symbols:["regex_flags$ebnf$1",/[gmiyusd]/],postprocess:function(e){return e[0].concat([e[1]])}},{name:"regex_flags",symbols:["regex_flags$ebnf$1"],postprocess:function(e){return e[0].join("")}},{name:"unquoted_value$ebnf$1",symbols:[]},{name:"unquoted_value$ebnf$1",symbols:["unquoted_value$ebnf$1",/[a-zA-Z\.\-_*@#$]/],postprocess:function(e){return e[0].concat([e[1]])}},{name:"unquoted_value",symbols:[/[a-zA-Z_*@#$]/,"unquoted_value$ebnf$1"],postprocess:function(e){return e[0]+e[1].join("")}}],ParserStart:"main"};E5.default=Ute;var aN={},Uv={},hp={};Object.defineProperty(hp,"__esModule",{value:!0});hp.isSafePath=void 0;var Gte=/^(\.(?:[_a-zA-Z][a-zA-Z\d_]*|\0|[1-9]\d*))+$/u,Hte=function(e){return Gte.test(e)};hp.isSafePath=Hte;Object.defineProperty(Uv,"__esModule",{value:!0});Uv.createGetValueFunctionBody=void 0;var Wte=hp,qte=function(e){if(!(0,Wte.isSafePath)(e))throw new Error("Unsafe path.");var t="return subject"+e;return t.replace(/(\.(\d+))/g,".[$2]").replace(/\./g,"?.")};Uv.createGetValueFunctionBody=qte;(function(e){var t=Me&&Me.__assign||function(){return t=Object.assign||function(o){for(var s,a=1,l=arguments.length;a\d+) col (?\d+)/,Jte=function(e){if(e.trim()==="")return{location:{end:0,start:0},type:"EmptyExpression"};var t=new uN.default.Parser(Qte),n;try{n=t.feed(e).results}catch(o){if(typeof(o==null?void 0:o.message)=="string"&&typeof(o==null?void 0:o.offset)=="number"){var r=o.message.match(Zte);throw r?new Kte.SyntaxError("Syntax error at line ".concat(r.groups.line," column ").concat(r.groups.column),o.offset,Number(r.groups.line),Number(r.groups.column)):o}throw o}if(n.length===0)throw new Error("Found no parsings.");if(n.length>1)throw new Error("Ambiguous results.");var i=(0,Xte.hydrateAst)(n[0]);return i};zv.parse=Jte;var Gv={};Object.defineProperty(Gv,"__esModule",{value:!0});Gv.test=void 0;var ene=dp,tne=function(e,t){return(0,ene.filter)(e,[t]).length===1};Gv.test=tne;var cN={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.serialize=void 0;var t=function(o,s){return s==="double"?'"'.concat(o,'"'):s==="single"?"'".concat(o,"'"):o},n=function(o){if(o.type==="LiteralExpression")return o.quoted&&typeof o.value=="string"?t(o.value,o.quotes):String(o.value);if(o.type==="RegexExpression")return String(o.value);if(o.type==="RangeExpression"){var s=o.range,a=s.min,l=s.max,u=s.minInclusive,c=s.maxInclusive;return"".concat(u?"[":"{").concat(a," TO ").concat(l).concat(c?"]":"}")}if(o.type==="EmptyExpression")return"";throw new Error("Unexpected AST type.")},r=function(o){if(o.type!=="Tag")throw new Error("Expected a tag expression.");var s=o.field,a=o.expression,l=o.operator;if(s.type==="ImplicitField")return n(a);var u=s.quoted?t(s.name,s.quotes):s.name,c=" ".repeat(a.location.start-l.location.end);return u+l.operator+c+n(a)},i=function(o){if(o.type==="ParenthesizedExpression"){if(!("location"in o.expression))throw new Error("Expected location in expression.");if(!o.location.end)throw new Error("Expected location end.");var s=" ".repeat(o.expression.location.start-(o.location.start+1)),a=" ".repeat(o.location.end-o.expression.location.end-1);return"(".concat(s).concat((0,e.serialize)(o.expression)).concat(a,")")}if(o.type==="Tag")return r(o);if(o.type==="LogicalExpression"){var l="";return o.operator.type==="BooleanOperator"?(l+=" ".repeat(o.operator.location.start-o.left.location.end),l+=o.operator.operator,l+=" ".repeat(o.right.location.start-o.operator.location.end)):l=" ".repeat(o.right.location.start-o.left.location.end),"".concat((0,e.serialize)(o.left)).concat(l).concat((0,e.serialize)(o.right))}if(o.type==="UnaryOperator")return(o.operator==="NOT"?"NOT ":o.operator)+(0,e.serialize)(o.operand);if(o.type==="EmptyExpression")return"";throw new Error("Unexpected AST type.")};e.serialize=i})(cN);var Hv={};Object.defineProperty(Hv,"__esModule",{value:!0});Hv.isSafeUnquotedExpression=void 0;var nne=function(e){return/^[#$*@A-Z_a-z][#$*.@A-Z_a-z-]*$/.test(e)};Hv.isSafeUnquotedExpression=nne;(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.isSafeUnquotedExpression=e.serialize=e.SyntaxError=e.LiqeError=e.test=e.parse=e.highlight=e.filter=void 0;var t=dp;Object.defineProperty(e,"filter",{enumerable:!0,get:function(){return t.filter}});var n=Vv;Object.defineProperty(e,"highlight",{enumerable:!0,get:function(){return n.highlight}});var r=zv;Object.defineProperty(e,"parse",{enumerable:!0,get:function(){return r.parse}});var i=Gv;Object.defineProperty(e,"test",{enumerable:!0,get:function(){return i.test}});var o=Sl;Object.defineProperty(e,"LiqeError",{enumerable:!0,get:function(){return o.LiqeError}}),Object.defineProperty(e,"SyntaxError",{enumerable:!0,get:function(){return o.SyntaxError}});var s=cN;Object.defineProperty(e,"serialize",{enumerable:!0,get:function(){return s.serialize}});var a=Hv;Object.defineProperty(e,"isSafeUnquotedExpression",{enumerable:!0,get:function(){return a.isSafeUnquotedExpression}})})(tN);var rne=Me&&Me.__rest||function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&typeof Object.getOwnPropertySymbols=="function")for(var i=0,r=Object.getOwnPropertySymbols(e);i0?h("%c ".concat(f," %c").concat(c?" [".concat(String(c),"]:"):"","%c ").concat(a.message," %O"),m,S,v,d):h("%c ".concat(f," %c").concat(c?" [".concat(String(c),"]:"):"","%c ").concat(a.message),m,S,v)}}};Mv.createLogWriter=fne;(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.createLogWriter=void 0;var t=Mv;Object.defineProperty(e,"createLogWriter",{enumerable:!0,get:function(){return t.createLogWriter}})})(C5);const fN={package:"@invoke-ai/invoke-ai-ui"};xc.ROARR.write=C5.createLogWriter();let we=xc.Roarr.child(fN);const hne={trace:10,debug:20,info:30,warn:40,error:50,fatal:60},sEe=["trace","debug","info","warn","error","fatal"],pne=wt(lp,e=>{const{app_version:t,consoleLogLevel:n,shouldLogToConsole:r}=e;return{version:t,consoleLogLevel:n,shouldLogToConsole:r}},{memoizeOptions:{resultEqualityCheck:ap}}),aEe=()=>{const{version:e,consoleLogLevel:t,shouldLogToConsole:n}=wc(pne);return E.useEffect(()=>{n?(localStorage.setItem("ROARR_LOG","true"),localStorage.setItem("ROARR_FILTER",`context.logLevel:>=${hne[t]}`)):localStorage.setItem("ROARR_LOG","false"),xc.ROARR.write=C5.createLogWriter()},[t,n]),E.useEffect(()=>{const r={...fN};e&&(r.version=e),we=xc.Roarr.child(r)},[e]),we};we.child({namespace:"session"});const ar=wo("api/sessionCreated",async(e,{rejectWithValue:t})=>{const{graph:n}=e,{post:r}=xo.get(),{data:i,error:o,response:s}=await r("/api/v1/sessions/",{body:n});return o?t({arg:e,error:o}):i}),gne=e=>Pn(e)&&"status"in e,pp=wo("api/sessionInvoked",async(e,{rejectWithValue:t})=>{const{session_id:n}=e,{put:r}=xo.get(),{data:i,error:o,response:s}=await r("/api/v1/sessions/{session_id}/invoke",{params:{query:{all:!0},path:{session_id:n}}});if(o)return gne(o)&&o.status===403?t({arg:e,error:o.body.detail}):t({arg:e,error:o})}),Nl=wo("api/sessionCanceled",async(e,{rejectWithValue:t})=>{const{session_id:n}=e,{del:r}=xo.get(),{data:i,error:o,response:s}=await r("/api/v1/sessions/{session_id}/invoke",{params:{path:{session_id:n}}});return o?t({arg:e,error:o}):i});wo("api/listSessions",async(e,{rejectWithValue:t})=>{const{params:n}=e,{get:r}=xo.get(),{data:i,error:o,response:s}=await r("/api/v1/sessions/",{params:n});return o?t({arg:e,error:o}):i});const hN=hs(ar.rejected,pp.rejected),pN=["euler","deis","ddim","ddpm","dpmpp_2s","dpmpp_2m","dpmpp_2m_sde","dpmpp_sde","heun","kdpm_2","lms","pndm","unipc","euler_k","dpmpp_2s_k","dpmpp_2m_k","dpmpp_2m_sde_k","dpmpp_sde_k","heun_k","lms_k","euler_a","kdpm_2_a"],mne="euler",lEe=[...pN],uEe={euler:"Euler",deis:"DEIS",ddim:"DDIM",ddpm:"DDPM",dpmpp_sde:"DPM++ SDE",dpmpp_2s:"DPM++ 2S",dpmpp_2m:"DPM++ 2M",dpmpp_2m_sde:"DPM++ 2M SDE",heun:"Heun",kdpm_2:"KDPM 2",lms:"LMS",pndm:"PNDM",unipc:"UniPC",euler_k:"Euler Karras",dpmpp_sde_k:"DPM++ SDE Karras",dpmpp_2s_k:"DPM++ 2S Karras",dpmpp_2m_k:"DPM++ 2M Karras",dpmpp_2m_sde_k:"DPM++ 2M SDE Karras",heun_k:"Heun Karras",lms_k:"LMS Karras",euler_a:"Euler Ancestral",kdpm_2_a:"KDPM 2 Ancestral"},cEe=[{label:"2x",value:"2"},{label:"4x",value:"4"}],dEe=0,yne=2147483647,fEe=["gfpgan","codeformer"],hEe=250,gN={shouldUpdateImagesOnConnect:!1,disabledTabs:[],disabledFeatures:[],disabledSDFeatures:[],canRestoreDeletedImagesFromBin:!0,sd:{disabledControlNetModels:[],disabledControlNetProcessors:[],iterations:{initial:1,min:1,sliderMax:20,inputMax:9999,fineStep:1,coarseStep:1},width:{initial:512,min:64,sliderMax:1536,inputMax:4096,fineStep:8,coarseStep:64},height:{initial:512,min:64,sliderMax:1536,inputMax:4096,fineStep:8,coarseStep:64},steps:{initial:30,min:1,sliderMax:100,inputMax:500,fineStep:1,coarseStep:1},guidance:{initial:7,min:1,sliderMax:20,inputMax:200,fineStep:.1,coarseStep:.5},img2imgStrength:{initial:.7,min:0,sliderMax:1,inputMax:1,fineStep:.01,coarseStep:.05},dynamicPrompts:{maxPrompts:{initial:100,min:1,sliderMax:1e3,inputMax:1e4}}}},mN=Lt({name:"config",initialState:gN,reducers:{configChanged:(e,t)=>{qQ(e,t.payload)}}}),{configChanged:vne}=mN.actions,bne=mN.reducer;function Sne(e){if(e.sheet)return e.sheet;for(var t=0;t0?$n(Yc,--Pr):0,Tc--,nn===10&&(Tc=1,qv--),nn}function $r(){return nn=Pr2||ih(nn)>3?"":" "}function Nne(e,t){for(;--t&&$r()&&!(nn<48||nn>102||nn>57&&nn<65||nn>70&&nn<97););return gp(e,um()+(t<6&&uo()==32&&$r()==32))}function lw(e){for(;$r();)switch(nn){case e:return Pr;case 34:case 39:e!==34&&e!==39&&lw(nn);break;case 40:e===41&&lw(e);break;case 92:$r();break}return Pr}function Mne(e,t){for(;$r()&&e+nn!==47+10;)if(e+nn===42+42&&uo()===47)break;return"/*"+gp(t,Pr-1)+"*"+Wv(e===47?e:$r())}function Dne(e){for(;!ih(uo());)$r();return gp(e,Pr)}function Lne(e){return wN(dm("",null,null,null,[""],e=_N(e),0,[0],e))}function dm(e,t,n,r,i,o,s,a,l){for(var u=0,c=0,d=s,f=0,h=0,p=0,m=1,S=1,v=1,y=0,g="",b=i,_=o,w=r,x=g;S;)switch(p=y,y=$r()){case 40:if(p!=108&&$n(x,d-1)==58){aw(x+=tt(cm(y),"&","&\f"),"&\f")!=-1&&(v=-1);break}case 34:case 39:case 91:x+=cm(y);break;case 9:case 10:case 13:case 32:x+=Ine(p);break;case 92:x+=Nne(um()-1,7);continue;case 47:switch(uo()){case 42:case 47:yg($ne(Mne($r(),um()),t,n),l);break;default:x+="/"}break;case 123*m:a[u++]=Ki(x)*v;case 125*m:case 59:case 0:switch(y){case 0:case 125:S=0;case 59+c:v==-1&&(x=tt(x,/\f/g,"")),h>0&&Ki(x)-d&&yg(h>32?E6(x+";",r,n,d-1):E6(tt(x," ","")+";",r,n,d-2),l);break;case 59:x+=";";default:if(yg(w=T6(x,t,n,u,c,i,a,g,b=[],_=[],d),o),y===123)if(c===0)dm(x,t,w,w,b,o,d,a,_);else switch(f===99&&$n(x,3)===110?100:f){case 100:case 108:case 109:case 115:dm(e,w,w,r&&yg(T6(e,w,w,0,0,i,a,g,i,b=[],d),_),i,_,d,a,r?b:_);break;default:dm(x,w,w,w,[""],_,0,a,_)}}u=c=h=0,m=v=1,g=x="",d=s;break;case 58:d=1+Ki(x),h=p;default:if(m<1){if(y==123)--m;else if(y==125&&m++==0&&Rne()==125)continue}switch(x+=Wv(y),y*m){case 38:v=c>0?1:(x+="\f",-1);break;case 44:a[u++]=(Ki(x)-1)*v,v=1;break;case 64:uo()===45&&(x+=cm($r())),f=uo(),c=d=Ki(g=x+=Dne(um())),y++;break;case 45:p===45&&Ki(x)==2&&(m=0)}}return o}function T6(e,t,n,r,i,o,s,a,l,u,c){for(var d=i-1,f=i===0?o:[""],h=A5(f),p=0,m=0,S=0;p0?f[v]+" "+y:tt(y,/&\f/g,f[v])))&&(l[S++]=g);return Kv(e,t,n,i===0?P5:a,l,u,c)}function $ne(e,t,n){return Kv(e,t,n,yN,Wv(One()),rh(e,2,-2),0)}function E6(e,t,n,r){return Kv(e,t,n,k5,rh(e,0,r),rh(e,r+1,-1),r)}function Qu(e,t){for(var n="",r=A5(e),i=0;i6)switch($n(e,t+1)){case 109:if($n(e,t+4)!==45)break;case 102:return tt(e,/(.+:)(.+)-([^]+)/,"$1"+et+"$2-$3$1"+Ty+($n(e,t+3)==108?"$3":"$2-$3"))+e;case 115:return~aw(e,"stretch")?CN(tt(e,"stretch","fill-available"),t)+e:e}break;case 4949:if($n(e,t+1)!==115)break;case 6444:switch($n(e,Ki(e)-3-(~aw(e,"!important")&&10))){case 107:return tt(e,":",":"+et)+e;case 101:return tt(e,/(.+:)([^;!]+)(;|!.+)?/,"$1"+et+($n(e,14)===45?"inline-":"")+"box$3$1"+et+"$2$3$1"+Wn+"$2box$3")+e}break;case 5936:switch($n(e,t+11)){case 114:return et+e+Wn+tt(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return et+e+Wn+tt(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return et+e+Wn+tt(e,/[svh]\w+-[tblr]{2}/,"lr")+e}return et+e+Wn+e+e}return e}var Wne=function(t,n,r,i){if(t.length>-1&&!t.return)switch(t.type){case k5:t.return=CN(t.value,t.length);break;case vN:return Qu([xd(t,{value:tt(t.value,"@","@"+et)})],i);case P5:if(t.length)return Ane(t.props,function(o){switch(kne(o,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return Qu([xd(t,{props:[tt(o,/:(read-\w+)/,":"+Ty+"$1")]})],i);case"::placeholder":return Qu([xd(t,{props:[tt(o,/:(plac\w+)/,":"+et+"input-$1")]}),xd(t,{props:[tt(o,/:(plac\w+)/,":"+Ty+"$1")]}),xd(t,{props:[tt(o,/:(plac\w+)/,Wn+"input-$1")]})],i)}return""})}},qne=[Wne],Kne=function(t){var n=t.key;if(n==="css"){var r=document.querySelectorAll("style[data-emotion]:not([data-s])");Array.prototype.forEach.call(r,function(m){var S=m.getAttribute("data-emotion");S.indexOf(" ")!==-1&&(document.head.appendChild(m),m.setAttribute("data-s",""))})}var i=t.stylisPlugins||qne,o={},s,a=[];s=t.container||document.head,Array.prototype.forEach.call(document.querySelectorAll('style[data-emotion^="'+n+' "]'),function(m){for(var S=m.getAttribute("data-emotion").split(" "),v=1;v=4;++r,i-=4)n=e.charCodeAt(r)&255|(e.charCodeAt(++r)&255)<<8|(e.charCodeAt(++r)&255)<<16|(e.charCodeAt(++r)&255)<<24,n=(n&65535)*1540483477+((n>>>16)*59797<<16),n^=n>>>24,t=(n&65535)*1540483477+((n>>>16)*59797<<16)^(t&65535)*1540483477+((t>>>16)*59797<<16);switch(i){case 3:t^=(e.charCodeAt(r+2)&255)<<16;case 2:t^=(e.charCodeAt(r+1)&255)<<8;case 1:t^=e.charCodeAt(r)&255,t=(t&65535)*1540483477+((t>>>16)*59797<<16)}return t^=t>>>13,t=(t&65535)*1540483477+((t>>>16)*59797<<16),((t^t>>>15)>>>0).toString(36)}var Zne={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},Jne=/[A-Z]|^ms/g,ere=/_EMO_([^_]+?)_([^]*?)_EMO_/g,PN=function(t){return t.charCodeAt(1)===45},A6=function(t){return t!=null&&typeof t!="boolean"},jS=xN(function(e){return PN(e)?e:e.replace(Jne,"-$&").toLowerCase()}),O6=function(t,n){switch(t){case"animation":case"animationName":if(typeof n=="string")return n.replace(ere,function(r,i,o){return Yi={name:i,styles:o,next:Yi},i})}return Zne[t]!==1&&!PN(t)&&typeof n=="number"&&n!==0?n+"px":n};function oh(e,t,n){if(n==null)return"";if(n.__emotion_styles!==void 0)return n;switch(typeof n){case"boolean":return"";case"object":{if(n.anim===1)return Yi={name:n.name,styles:n.styles,next:Yi},n.name;if(n.styles!==void 0){var r=n.next;if(r!==void 0)for(;r!==void 0;)Yi={name:r.name,styles:r.styles,next:Yi},r=r.next;var i=n.styles+";";return i}return tre(e,t,n)}case"function":{if(e!==void 0){var o=Yi,s=n(e);return Yi=o,oh(e,t,s)}break}}if(t==null)return n;var a=t[n];return a!==void 0?a:n}function tre(e,t,n){var r="";if(Array.isArray(n))for(var i=0;ij.jsx("div",{className:"chakra-portal-zIndex",style:{position:"absolute",zIndex:e.zIndex,top:0,left:0,right:0},children:e.children}),gre=e=>{const{appendToParentPortal:t,children:n}=e,[r,i]=E.useState(null),o=E.useRef(null),[,s]=E.useState({});E.useEffect(()=>s({}),[]);const a=fre(),l=cre();ah(()=>{if(!r)return;const c=r.ownerDocument,d=t?a??c.body:c.body;if(!d)return;o.current=c.createElement("div"),o.current.className=R5,d.appendChild(o.current),s({});const f=o.current;return()=>{d.contains(f)&&d.removeChild(f)}},[r]);const u=l!=null&&l.zIndex?j.jsx(pre,{zIndex:l==null?void 0:l.zIndex,children:n}):n;return o.current?ii.createPortal(j.jsx(RN,{value:o.current,children:u}),o.current):j.jsx("span",{ref:c=>{c&&i(c)}})},mre=e=>{const{children:t,containerRef:n,appendToParentPortal:r}=e,i=n.current,o=i??(typeof window<"u"?document.body:void 0),s=E.useMemo(()=>{const l=i==null?void 0:i.ownerDocument.createElement("div");return l&&(l.className=R5),l},[i]),[,a]=E.useState({});return ah(()=>a({}),[]),ah(()=>{if(!(!s||!o))return o.appendChild(s),()=>{o.removeChild(s)}},[s,o]),o&&s?ii.createPortal(j.jsx(RN,{value:r?s:null,children:t}),s):null};function mp(e){const t={appendToParentPortal:!0,...e},{containerRef:n,...r}=t;return n?j.jsx(mre,{containerRef:n,...r}):j.jsx(gre,{...r})}mp.className=R5;mp.selector=hre;mp.displayName="Portal";function Yv(){const e=E.useContext(sh);if(!e)throw Error("useTheme: `theme` is undefined. Seems you forgot to wrap your app in `` or ``");return e}var IN=E.createContext({});IN.displayName="ColorModeContext";function I5(){const e=E.useContext(IN);if(e===void 0)throw new Error("useColorMode must be used within a ColorModeProvider");return e}function mEe(e,t){const{colorMode:n}=I5();return n==="dark"?t:e}function NN(){const e=I5(),t=Yv();return{...e,theme:t}}function yre(e,t,n){var r,i;if(t==null)return t;const o=s=>{var a,l;return(l=(a=e.__breakpoints)==null?void 0:a.asArray)==null?void 0:l[s]};return(i=(r=o(t))!=null?r:o(n))!=null?i:n}function vre(e,t,n){var r,i;if(t==null)return t;const o=s=>{var a,l;return(l=(a=e.__cssMap)==null?void 0:a[s])==null?void 0:l.value};return(i=(r=o(t))!=null?r:o(n))!=null?i:n}function yEe(e,t,n){const r=Yv();return bre(e,t,n)(r)}function bre(e,t,n){const r=Array.isArray(t)?t:[t],i=Array.isArray(n)?n:[n];return o=>{const s=i.filter(Boolean),a=r.map((l,u)=>{var c,d;if(e==="breakpoints")return yre(o,l,(c=s[u])!=null?c:l);const f=`${e}.${l}`;return vre(o,f,(d=s[u])!=null?d:l)});return Array.isArray(t)?a:a[0]}}var zn=(...e)=>e.filter(Boolean).join(" ");function Sre(){return!1}function co(e){const t=typeof e;return e!=null&&(t==="object"||t==="function")&&!Array.isArray(e)}var vEe=e=>{const{condition:t,message:n}=e;t&&Sre()&&console.warn(n)};function no(e,...t){return _re(e)?e(...t):e}var _re=e=>typeof e=="function",Iu=e=>e?"":void 0,Zu=e=>e?!0:void 0;function Dn(...e){return function(n){e.some(r=>(r==null||r(n),n==null?void 0:n.defaultPrevented))}}function bEe(...e){return function(n){e.forEach(r=>{r==null||r(n)})}}var Ey={exports:{}};Ey.exports;(function(e,t){var n=200,r="__lodash_hash_undefined__",i=800,o=16,s=9007199254740991,a="[object Arguments]",l="[object Array]",u="[object AsyncFunction]",c="[object Boolean]",d="[object Date]",f="[object Error]",h="[object Function]",p="[object GeneratorFunction]",m="[object Map]",S="[object Number]",v="[object Null]",y="[object Object]",g="[object Proxy]",b="[object RegExp]",_="[object Set]",w="[object String]",x="[object Undefined]",C="[object WeakMap]",k="[object ArrayBuffer]",P="[object DataView]",A="[object Float32Array]",$="[object Float64Array]",M="[object Int8Array]",T="[object Int16Array]",O="[object Int32Array]",I="[object Uint8Array]",N="[object Uint8ClampedArray]",R="[object Uint16Array]",D="[object Uint32Array]",L=/[\\^$.*+?()[\]{}|]/g,V=/^\[object .+?Constructor\]$/,z=/^(?:0|[1-9]\d*)$/,U={};U[A]=U[$]=U[M]=U[T]=U[O]=U[I]=U[N]=U[R]=U[D]=!0,U[a]=U[l]=U[k]=U[c]=U[P]=U[d]=U[f]=U[h]=U[m]=U[S]=U[y]=U[b]=U[_]=U[w]=U[C]=!1;var K=typeof Me=="object"&&Me&&Me.Object===Object&&Me,q=typeof self=="object"&&self&&self.Object===Object&&self,X=K||q||Function("return this")(),F=t&&!t.nodeType&&t,W=F&&!0&&e&&!e.nodeType&&e,Q=W&&W.exports===F,J=Q&&K.process,ne=function(){try{var B=W&&W.require&&W.require("util").types;return B||J&&J.binding&&J.binding("util")}catch{}}(),Z=ne&&ne.isTypedArray;function ge(B,G,Y){switch(Y.length){case 0:return B.call(G);case 1:return B.call(G,Y[0]);case 2:return B.call(G,Y[0],Y[1]);case 3:return B.call(G,Y[0],Y[1],Y[2])}return B.apply(G,Y)}function ae(B,G){for(var Y=-1,ue=Array(B);++Y-1}function Ro(B,G){var Y=this.__data__,ue=Yl(Y,B);return ue<0?(++this.size,Y.push([B,G])):Y[ue][1]=G,this}On.prototype.clear=Oo,On.prototype.delete=Ss,On.prototype.get=_s,On.prototype.has=Kl,On.prototype.set=Ro;function tr(B){var G=-1,Y=B==null?0:B.length;for(this.clear();++G1?Y[He-1]:void 0,Ct=He>2?Y[2]:void 0;for(ct=B.length>3&&typeof ct=="function"?(He--,ct):void 0,Ct&&Fj(Y[0],Y[1],Ct)&&(ct=He<3?void 0:ct,He=1),G=Object(G);++ue-1&&B%1==0&&B0){if(++G>=i)return arguments[0]}else G=0;return B.apply(void 0,arguments)}}function Wj(B){if(B!=null){try{return Ie.call(B)}catch{}try{return B+""}catch{}}return""}function Hp(B,G){return B===G||B!==B&&G!==G}var Fb=Up(function(){return arguments}())?Up:function(B){return cd(B)&&nt.call(B,"callee")&&!Zt.call(B,"callee")},Bb=Array.isArray;function jb(B){return B!=null&&_4(B.length)&&!Vb(B)}function qj(B){return cd(B)&&jb(B)}var S4=ko||Zj;function Vb(B){if(!Da(B))return!1;var G=Ql(B);return G==h||G==p||G==u||G==g}function _4(B){return typeof B=="number"&&B>-1&&B%1==0&&B<=s}function Da(B){var G=typeof B;return B!=null&&(G=="object"||G=="function")}function cd(B){return B!=null&&typeof B=="object"}function Kj(B){if(!cd(B)||Ql(B)!=y)return!1;var G=ie(B);if(G===null)return!0;var Y=nt.call(G,"constructor")&&G.constructor;return typeof Y=="function"&&Y instanceof Y&&Ie.call(Y)==sn}var w4=Z?oe(Z):ud;function Yj(B){return Nj(B,x4(B))}function x4(B){return jb(B)?Ib(B,!0):Tj(B)}var Xj=Mj(function(B,G,Y,ue){y4(B,G,Y,ue)});function Qj(B){return function(){return B}}function C4(B){return B}function Zj(){return!1}e.exports=Xj})(Ey,Ey.exports);var wre=Ey.exports;const ro=kl(wre);var xre=e=>/!(important)?$/.test(e),N6=e=>typeof e=="string"?e.replace(/!(important)?$/,"").trim():e,Cre=(e,t)=>n=>{const r=String(t),i=xre(r),o=N6(r),s=e?`${e}.${o}`:o;let a=co(n.__cssMap)&&s in n.__cssMap?n.__cssMap[s].varRef:t;return a=N6(a),i?`${a} !important`:a};function N5(e){const{scale:t,transform:n,compose:r}=e;return(o,s)=>{var a;const l=Cre(t,o)(s);let u=(a=n==null?void 0:n(l,s))!=null?a:l;return r&&(u=r(u,s)),u}}var vg=(...e)=>t=>e.reduce((n,r)=>r(n),t);function Yr(e,t){return n=>{const r={property:n,scale:e};return r.transform=N5({scale:e,transform:t}),r}}var Tre=({rtl:e,ltr:t})=>n=>n.direction==="rtl"?e:t;function Ere(e){const{property:t,scale:n,transform:r}=e;return{scale:n,property:Tre(t),transform:n?N5({scale:n,compose:r}):r}}var MN=["rotate(var(--chakra-rotate, 0))","scaleX(var(--chakra-scale-x, 1))","scaleY(var(--chakra-scale-y, 1))","skewX(var(--chakra-skew-x, 0))","skewY(var(--chakra-skew-y, 0))"];function Pre(){return["translateX(var(--chakra-translate-x, 0))","translateY(var(--chakra-translate-y, 0))",...MN].join(" ")}function kre(){return["translate3d(var(--chakra-translate-x, 0), var(--chakra-translate-y, 0), 0)",...MN].join(" ")}var Are={"--chakra-blur":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-brightness":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-contrast":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-grayscale":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-hue-rotate":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-invert":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-saturate":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-sepia":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-drop-shadow":"var(--chakra-empty,/*!*/ /*!*/)",filter:["var(--chakra-blur)","var(--chakra-brightness)","var(--chakra-contrast)","var(--chakra-grayscale)","var(--chakra-hue-rotate)","var(--chakra-invert)","var(--chakra-saturate)","var(--chakra-sepia)","var(--chakra-drop-shadow)"].join(" ")},Ore={backdropFilter:["var(--chakra-backdrop-blur)","var(--chakra-backdrop-brightness)","var(--chakra-backdrop-contrast)","var(--chakra-backdrop-grayscale)","var(--chakra-backdrop-hue-rotate)","var(--chakra-backdrop-invert)","var(--chakra-backdrop-opacity)","var(--chakra-backdrop-saturate)","var(--chakra-backdrop-sepia)"].join(" "),"--chakra-backdrop-blur":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-brightness":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-contrast":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-grayscale":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-hue-rotate":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-invert":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-opacity":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-saturate":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-backdrop-sepia":"var(--chakra-empty,/*!*/ /*!*/)"};function Rre(e){return{"--chakra-ring-offset-shadow":"var(--chakra-ring-inset) 0 0 0 var(--chakra-ring-offset-width) var(--chakra-ring-offset-color)","--chakra-ring-shadow":"var(--chakra-ring-inset) 0 0 0 calc(var(--chakra-ring-width) + var(--chakra-ring-offset-width)) var(--chakra-ring-color)","--chakra-ring-width":e,boxShadow:["var(--chakra-ring-offset-shadow)","var(--chakra-ring-shadow)","var(--chakra-shadow, 0 0 #0000)"].join(", ")}}var Ire={"row-reverse":{space:"--chakra-space-x-reverse",divide:"--chakra-divide-x-reverse"},"column-reverse":{space:"--chakra-space-y-reverse",divide:"--chakra-divide-y-reverse"}},uw={"to-t":"to top","to-tr":"to top right","to-r":"to right","to-br":"to bottom right","to-b":"to bottom","to-bl":"to bottom left","to-l":"to left","to-tl":"to top left"},Nre=new Set(Object.values(uw)),cw=new Set(["none","-moz-initial","inherit","initial","revert","unset"]),Mre=e=>e.trim();function Dre(e,t){if(e==null||cw.has(e))return e;if(!(dw(e)||cw.has(e)))return`url('${e}')`;const i=/(^[a-z-A-Z]+)\((.*)\)/g.exec(e),o=i==null?void 0:i[1],s=i==null?void 0:i[2];if(!o||!s)return e;const a=o.includes("-gradient")?o:`${o}-gradient`,[l,...u]=s.split(",").map(Mre).filter(Boolean);if((u==null?void 0:u.length)===0)return e;const c=l in uw?uw[l]:l;u.unshift(c);const d=u.map(f=>{if(Nre.has(f))return f;const h=f.indexOf(" "),[p,m]=h!==-1?[f.substr(0,h),f.substr(h+1)]:[f],S=dw(m)?m:m&&m.split(" "),v=`colors.${p}`,y=v in t.__cssMap?t.__cssMap[v].varRef:p;return S?[y,...Array.isArray(S)?S:[S]].join(" "):y});return`${a}(${d.join(", ")})`}var dw=e=>typeof e=="string"&&e.includes("(")&&e.includes(")"),Lre=(e,t)=>Dre(e,t??{});function $re(e){return/^var\(--.+\)$/.test(e)}var Fre=e=>{const t=parseFloat(e.toString()),n=e.toString().replace(String(t),"");return{unitless:!n,value:t,unit:n}},Ui=e=>t=>`${e}(${t})`,Ye={filter(e){return e!=="auto"?e:Are},backdropFilter(e){return e!=="auto"?e:Ore},ring(e){return Rre(Ye.px(e))},bgClip(e){return e==="text"?{color:"transparent",backgroundClip:"text"}:{backgroundClip:e}},transform(e){return e==="auto"?Pre():e==="auto-gpu"?kre():e},vh(e){return e==="$100vh"?"var(--chakra-vh)":e},px(e){if(e==null)return e;const{unitless:t}=Fre(e);return t||typeof e=="number"?`${e}px`:e},fraction(e){return typeof e!="number"||e>1?e:`${e*100}%`},float(e,t){const n={left:"right",right:"left"};return t.direction==="rtl"?n[e]:e},degree(e){if($re(e)||e==null)return e;const t=typeof e=="string"&&!e.endsWith("deg");return typeof e=="number"||t?`${e}deg`:e},gradient:Lre,blur:Ui("blur"),opacity:Ui("opacity"),brightness:Ui("brightness"),contrast:Ui("contrast"),dropShadow:Ui("drop-shadow"),grayscale:Ui("grayscale"),hueRotate:Ui("hue-rotate"),invert:Ui("invert"),saturate:Ui("saturate"),sepia:Ui("sepia"),bgImage(e){return e==null||dw(e)||cw.has(e)?e:`url(${e})`},outline(e){const t=String(e)==="0"||String(e)==="none";return e!==null&&t?{outline:"2px solid transparent",outlineOffset:"2px"}:{outline:e}},flexDirection(e){var t;const{space:n,divide:r}=(t=Ire[e])!=null?t:{},i={flexDirection:e};return n&&(i[n]=1),r&&(i[r]=1),i}},H={borderWidths:Yr("borderWidths"),borderStyles:Yr("borderStyles"),colors:Yr("colors"),borders:Yr("borders"),gradients:Yr("gradients",Ye.gradient),radii:Yr("radii",Ye.px),space:Yr("space",vg(Ye.vh,Ye.px)),spaceT:Yr("space",vg(Ye.vh,Ye.px)),degreeT(e){return{property:e,transform:Ye.degree}},prop(e,t,n){return{property:e,scale:t,...t&&{transform:N5({scale:t,transform:n})}}},propT(e,t){return{property:e,transform:t}},sizes:Yr("sizes",vg(Ye.vh,Ye.px)),sizesT:Yr("sizes",vg(Ye.vh,Ye.fraction)),shadows:Yr("shadows"),logical:Ere,blur:Yr("blur",Ye.blur)},fm={background:H.colors("background"),backgroundColor:H.colors("backgroundColor"),backgroundImage:H.gradients("backgroundImage"),backgroundSize:!0,backgroundPosition:!0,backgroundRepeat:!0,backgroundAttachment:!0,backgroundClip:{transform:Ye.bgClip},bgSize:H.prop("backgroundSize"),bgPosition:H.prop("backgroundPosition"),bg:H.colors("background"),bgColor:H.colors("backgroundColor"),bgPos:H.prop("backgroundPosition"),bgRepeat:H.prop("backgroundRepeat"),bgAttachment:H.prop("backgroundAttachment"),bgGradient:H.gradients("backgroundImage"),bgClip:{transform:Ye.bgClip}};Object.assign(fm,{bgImage:fm.backgroundImage,bgImg:fm.backgroundImage});var Je={border:H.borders("border"),borderWidth:H.borderWidths("borderWidth"),borderStyle:H.borderStyles("borderStyle"),borderColor:H.colors("borderColor"),borderRadius:H.radii("borderRadius"),borderTop:H.borders("borderTop"),borderBlockStart:H.borders("borderBlockStart"),borderTopLeftRadius:H.radii("borderTopLeftRadius"),borderStartStartRadius:H.logical({scale:"radii",property:{ltr:"borderTopLeftRadius",rtl:"borderTopRightRadius"}}),borderEndStartRadius:H.logical({scale:"radii",property:{ltr:"borderBottomLeftRadius",rtl:"borderBottomRightRadius"}}),borderTopRightRadius:H.radii("borderTopRightRadius"),borderStartEndRadius:H.logical({scale:"radii",property:{ltr:"borderTopRightRadius",rtl:"borderTopLeftRadius"}}),borderEndEndRadius:H.logical({scale:"radii",property:{ltr:"borderBottomRightRadius",rtl:"borderBottomLeftRadius"}}),borderRight:H.borders("borderRight"),borderInlineEnd:H.borders("borderInlineEnd"),borderBottom:H.borders("borderBottom"),borderBlockEnd:H.borders("borderBlockEnd"),borderBottomLeftRadius:H.radii("borderBottomLeftRadius"),borderBottomRightRadius:H.radii("borderBottomRightRadius"),borderLeft:H.borders("borderLeft"),borderInlineStart:{property:"borderInlineStart",scale:"borders"},borderInlineStartRadius:H.logical({scale:"radii",property:{ltr:["borderTopLeftRadius","borderBottomLeftRadius"],rtl:["borderTopRightRadius","borderBottomRightRadius"]}}),borderInlineEndRadius:H.logical({scale:"radii",property:{ltr:["borderTopRightRadius","borderBottomRightRadius"],rtl:["borderTopLeftRadius","borderBottomLeftRadius"]}}),borderX:H.borders(["borderLeft","borderRight"]),borderInline:H.borders("borderInline"),borderY:H.borders(["borderTop","borderBottom"]),borderBlock:H.borders("borderBlock"),borderTopWidth:H.borderWidths("borderTopWidth"),borderBlockStartWidth:H.borderWidths("borderBlockStartWidth"),borderTopColor:H.colors("borderTopColor"),borderBlockStartColor:H.colors("borderBlockStartColor"),borderTopStyle:H.borderStyles("borderTopStyle"),borderBlockStartStyle:H.borderStyles("borderBlockStartStyle"),borderBottomWidth:H.borderWidths("borderBottomWidth"),borderBlockEndWidth:H.borderWidths("borderBlockEndWidth"),borderBottomColor:H.colors("borderBottomColor"),borderBlockEndColor:H.colors("borderBlockEndColor"),borderBottomStyle:H.borderStyles("borderBottomStyle"),borderBlockEndStyle:H.borderStyles("borderBlockEndStyle"),borderLeftWidth:H.borderWidths("borderLeftWidth"),borderInlineStartWidth:H.borderWidths("borderInlineStartWidth"),borderLeftColor:H.colors("borderLeftColor"),borderInlineStartColor:H.colors("borderInlineStartColor"),borderLeftStyle:H.borderStyles("borderLeftStyle"),borderInlineStartStyle:H.borderStyles("borderInlineStartStyle"),borderRightWidth:H.borderWidths("borderRightWidth"),borderInlineEndWidth:H.borderWidths("borderInlineEndWidth"),borderRightColor:H.colors("borderRightColor"),borderInlineEndColor:H.colors("borderInlineEndColor"),borderRightStyle:H.borderStyles("borderRightStyle"),borderInlineEndStyle:H.borderStyles("borderInlineEndStyle"),borderTopRadius:H.radii(["borderTopLeftRadius","borderTopRightRadius"]),borderBottomRadius:H.radii(["borderBottomLeftRadius","borderBottomRightRadius"]),borderLeftRadius:H.radii(["borderTopLeftRadius","borderBottomLeftRadius"]),borderRightRadius:H.radii(["borderTopRightRadius","borderBottomRightRadius"])};Object.assign(Je,{rounded:Je.borderRadius,roundedTop:Je.borderTopRadius,roundedTopLeft:Je.borderTopLeftRadius,roundedTopRight:Je.borderTopRightRadius,roundedTopStart:Je.borderStartStartRadius,roundedTopEnd:Je.borderStartEndRadius,roundedBottom:Je.borderBottomRadius,roundedBottomLeft:Je.borderBottomLeftRadius,roundedBottomRight:Je.borderBottomRightRadius,roundedBottomStart:Je.borderEndStartRadius,roundedBottomEnd:Je.borderEndEndRadius,roundedLeft:Je.borderLeftRadius,roundedRight:Je.borderRightRadius,roundedStart:Je.borderInlineStartRadius,roundedEnd:Je.borderInlineEndRadius,borderStart:Je.borderInlineStart,borderEnd:Je.borderInlineEnd,borderTopStartRadius:Je.borderStartStartRadius,borderTopEndRadius:Je.borderStartEndRadius,borderBottomStartRadius:Je.borderEndStartRadius,borderBottomEndRadius:Je.borderEndEndRadius,borderStartRadius:Je.borderInlineStartRadius,borderEndRadius:Je.borderInlineEndRadius,borderStartWidth:Je.borderInlineStartWidth,borderEndWidth:Je.borderInlineEndWidth,borderStartColor:Je.borderInlineStartColor,borderEndColor:Je.borderInlineEndColor,borderStartStyle:Je.borderInlineStartStyle,borderEndStyle:Je.borderInlineEndStyle});var Bre={color:H.colors("color"),textColor:H.colors("color"),fill:H.colors("fill"),stroke:H.colors("stroke")},fw={boxShadow:H.shadows("boxShadow"),mixBlendMode:!0,blendMode:H.prop("mixBlendMode"),backgroundBlendMode:!0,bgBlendMode:H.prop("backgroundBlendMode"),opacity:!0};Object.assign(fw,{shadow:fw.boxShadow});var jre={filter:{transform:Ye.filter},blur:H.blur("--chakra-blur"),brightness:H.propT("--chakra-brightness",Ye.brightness),contrast:H.propT("--chakra-contrast",Ye.contrast),hueRotate:H.degreeT("--chakra-hue-rotate"),invert:H.propT("--chakra-invert",Ye.invert),saturate:H.propT("--chakra-saturate",Ye.saturate),dropShadow:H.propT("--chakra-drop-shadow",Ye.dropShadow),backdropFilter:{transform:Ye.backdropFilter},backdropBlur:H.blur("--chakra-backdrop-blur"),backdropBrightness:H.propT("--chakra-backdrop-brightness",Ye.brightness),backdropContrast:H.propT("--chakra-backdrop-contrast",Ye.contrast),backdropHueRotate:H.degreeT("--chakra-backdrop-hue-rotate"),backdropInvert:H.propT("--chakra-backdrop-invert",Ye.invert),backdropSaturate:H.propT("--chakra-backdrop-saturate",Ye.saturate)},Py={alignItems:!0,alignContent:!0,justifyItems:!0,justifyContent:!0,flexWrap:!0,flexDirection:{transform:Ye.flexDirection},flex:!0,flexFlow:!0,flexGrow:!0,flexShrink:!0,flexBasis:H.sizes("flexBasis"),justifySelf:!0,alignSelf:!0,order:!0,placeItems:!0,placeContent:!0,placeSelf:!0,gap:H.space("gap"),rowGap:H.space("rowGap"),columnGap:H.space("columnGap")};Object.assign(Py,{flexDir:Py.flexDirection});var DN={gridGap:H.space("gridGap"),gridColumnGap:H.space("gridColumnGap"),gridRowGap:H.space("gridRowGap"),gridColumn:!0,gridRow:!0,gridAutoFlow:!0,gridAutoColumns:!0,gridColumnStart:!0,gridColumnEnd:!0,gridRowStart:!0,gridRowEnd:!0,gridAutoRows:!0,gridTemplate:!0,gridTemplateColumns:!0,gridTemplateRows:!0,gridTemplateAreas:!0,gridArea:!0},Vre={appearance:!0,cursor:!0,resize:!0,userSelect:!0,pointerEvents:!0,outline:{transform:Ye.outline},outlineOffset:!0,outlineColor:H.colors("outlineColor")},Zr={width:H.sizesT("width"),inlineSize:H.sizesT("inlineSize"),height:H.sizes("height"),blockSize:H.sizes("blockSize"),boxSize:H.sizes(["width","height"]),minWidth:H.sizes("minWidth"),minInlineSize:H.sizes("minInlineSize"),minHeight:H.sizes("minHeight"),minBlockSize:H.sizes("minBlockSize"),maxWidth:H.sizes("maxWidth"),maxInlineSize:H.sizes("maxInlineSize"),maxHeight:H.sizes("maxHeight"),maxBlockSize:H.sizes("maxBlockSize"),overflow:!0,overflowX:!0,overflowY:!0,overscrollBehavior:!0,overscrollBehaviorX:!0,overscrollBehaviorY:!0,display:!0,aspectRatio:!0,hideFrom:{scale:"breakpoints",transform:(e,t)=>{var n,r,i;return{[`@media screen and (min-width: ${(i=(r=(n=t.__breakpoints)==null?void 0:n.get(e))==null?void 0:r.minW)!=null?i:e})`]:{display:"none"}}}},hideBelow:{scale:"breakpoints",transform:(e,t)=>{var n,r,i;return{[`@media screen and (max-width: ${(i=(r=(n=t.__breakpoints)==null?void 0:n.get(e))==null?void 0:r._minW)!=null?i:e})`]:{display:"none"}}}},verticalAlign:!0,boxSizing:!0,boxDecorationBreak:!0,float:H.propT("float",Ye.float),objectFit:!0,objectPosition:!0,visibility:!0,isolation:!0};Object.assign(Zr,{w:Zr.width,h:Zr.height,minW:Zr.minWidth,maxW:Zr.maxWidth,minH:Zr.minHeight,maxH:Zr.maxHeight,overscroll:Zr.overscrollBehavior,overscrollX:Zr.overscrollBehaviorX,overscrollY:Zr.overscrollBehaviorY});var zre={listStyleType:!0,listStylePosition:!0,listStylePos:H.prop("listStylePosition"),listStyleImage:!0,listStyleImg:H.prop("listStyleImage")};function Ure(e,t,n,r){const i=typeof t=="string"?t.split("."):[t];for(r=0;r{const t=new WeakMap;return(r,i,o,s)=>{if(typeof r>"u")return e(r,i,o);t.has(r)||t.set(r,new Map);const a=t.get(r);if(a.has(i))return a.get(i);const l=e(r,i,o,s);return a.set(i,l),l}},Hre=Gre(Ure),Wre={border:"0px",clip:"rect(0, 0, 0, 0)",width:"1px",height:"1px",margin:"-1px",padding:"0px",overflow:"hidden",whiteSpace:"nowrap",position:"absolute"},qre={position:"static",width:"auto",height:"auto",clip:"auto",padding:"0",margin:"0",overflow:"visible",whiteSpace:"normal"},VS=(e,t,n)=>{const r={},i=Hre(e,t,{});for(const o in i)o in n&&n[o]!=null||(r[o]=i[o]);return r},Kre={srOnly:{transform(e){return e===!0?Wre:e==="focusable"?qre:{}}},layerStyle:{processResult:!0,transform:(e,t,n)=>VS(t,`layerStyles.${e}`,n)},textStyle:{processResult:!0,transform:(e,t,n)=>VS(t,`textStyles.${e}`,n)},apply:{processResult:!0,transform:(e,t,n)=>VS(t,e,n)}},hf={position:!0,pos:H.prop("position"),zIndex:H.prop("zIndex","zIndices"),inset:H.spaceT("inset"),insetX:H.spaceT(["left","right"]),insetInline:H.spaceT("insetInline"),insetY:H.spaceT(["top","bottom"]),insetBlock:H.spaceT("insetBlock"),top:H.spaceT("top"),insetBlockStart:H.spaceT("insetBlockStart"),bottom:H.spaceT("bottom"),insetBlockEnd:H.spaceT("insetBlockEnd"),left:H.spaceT("left"),insetInlineStart:H.logical({scale:"space",property:{ltr:"left",rtl:"right"}}),right:H.spaceT("right"),insetInlineEnd:H.logical({scale:"space",property:{ltr:"right",rtl:"left"}})};Object.assign(hf,{insetStart:hf.insetInlineStart,insetEnd:hf.insetInlineEnd});var Yre={ring:{transform:Ye.ring},ringColor:H.colors("--chakra-ring-color"),ringOffset:H.prop("--chakra-ring-offset-width"),ringOffsetColor:H.colors("--chakra-ring-offset-color"),ringInset:H.prop("--chakra-ring-inset")},vt={margin:H.spaceT("margin"),marginTop:H.spaceT("marginTop"),marginBlockStart:H.spaceT("marginBlockStart"),marginRight:H.spaceT("marginRight"),marginInlineEnd:H.spaceT("marginInlineEnd"),marginBottom:H.spaceT("marginBottom"),marginBlockEnd:H.spaceT("marginBlockEnd"),marginLeft:H.spaceT("marginLeft"),marginInlineStart:H.spaceT("marginInlineStart"),marginX:H.spaceT(["marginInlineStart","marginInlineEnd"]),marginInline:H.spaceT("marginInline"),marginY:H.spaceT(["marginTop","marginBottom"]),marginBlock:H.spaceT("marginBlock"),padding:H.space("padding"),paddingTop:H.space("paddingTop"),paddingBlockStart:H.space("paddingBlockStart"),paddingRight:H.space("paddingRight"),paddingBottom:H.space("paddingBottom"),paddingBlockEnd:H.space("paddingBlockEnd"),paddingLeft:H.space("paddingLeft"),paddingInlineStart:H.space("paddingInlineStart"),paddingInlineEnd:H.space("paddingInlineEnd"),paddingX:H.space(["paddingInlineStart","paddingInlineEnd"]),paddingInline:H.space("paddingInline"),paddingY:H.space(["paddingTop","paddingBottom"]),paddingBlock:H.space("paddingBlock")};Object.assign(vt,{m:vt.margin,mt:vt.marginTop,mr:vt.marginRight,me:vt.marginInlineEnd,marginEnd:vt.marginInlineEnd,mb:vt.marginBottom,ml:vt.marginLeft,ms:vt.marginInlineStart,marginStart:vt.marginInlineStart,mx:vt.marginX,my:vt.marginY,p:vt.padding,pt:vt.paddingTop,py:vt.paddingY,px:vt.paddingX,pb:vt.paddingBottom,pl:vt.paddingLeft,ps:vt.paddingInlineStart,paddingStart:vt.paddingInlineStart,pr:vt.paddingRight,pe:vt.paddingInlineEnd,paddingEnd:vt.paddingInlineEnd});var Xre={textDecorationColor:H.colors("textDecorationColor"),textDecoration:!0,textDecor:{property:"textDecoration"},textDecorationLine:!0,textDecorationStyle:!0,textDecorationThickness:!0,textUnderlineOffset:!0,textShadow:H.shadows("textShadow")},Qre={clipPath:!0,transform:H.propT("transform",Ye.transform),transformOrigin:!0,translateX:H.spaceT("--chakra-translate-x"),translateY:H.spaceT("--chakra-translate-y"),skewX:H.degreeT("--chakra-skew-x"),skewY:H.degreeT("--chakra-skew-y"),scaleX:H.prop("--chakra-scale-x"),scaleY:H.prop("--chakra-scale-y"),scale:H.prop(["--chakra-scale-x","--chakra-scale-y"]),rotate:H.degreeT("--chakra-rotate")},Zre={transition:!0,transitionDelay:!0,animation:!0,willChange:!0,transitionDuration:H.prop("transitionDuration","transition.duration"),transitionProperty:H.prop("transitionProperty","transition.property"),transitionTimingFunction:H.prop("transitionTimingFunction","transition.easing")},Jre={fontFamily:H.prop("fontFamily","fonts"),fontSize:H.prop("fontSize","fontSizes",Ye.px),fontWeight:H.prop("fontWeight","fontWeights"),lineHeight:H.prop("lineHeight","lineHeights"),letterSpacing:H.prop("letterSpacing","letterSpacings"),textAlign:!0,fontStyle:!0,textIndent:!0,wordBreak:!0,overflowWrap:!0,textOverflow:!0,textTransform:!0,whiteSpace:!0,isTruncated:{transform(e){if(e===!0)return{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}}},noOfLines:{static:{overflow:"hidden",textOverflow:"ellipsis",display:"-webkit-box",WebkitBoxOrient:"vertical",WebkitLineClamp:"var(--chakra-line-clamp)"},property:"--chakra-line-clamp"}},eie={scrollBehavior:!0,scrollSnapAlign:!0,scrollSnapStop:!0,scrollSnapType:!0,scrollMargin:H.spaceT("scrollMargin"),scrollMarginTop:H.spaceT("scrollMarginTop"),scrollMarginBottom:H.spaceT("scrollMarginBottom"),scrollMarginLeft:H.spaceT("scrollMarginLeft"),scrollMarginRight:H.spaceT("scrollMarginRight"),scrollMarginX:H.spaceT(["scrollMarginLeft","scrollMarginRight"]),scrollMarginY:H.spaceT(["scrollMarginTop","scrollMarginBottom"]),scrollPadding:H.spaceT("scrollPadding"),scrollPaddingTop:H.spaceT("scrollPaddingTop"),scrollPaddingBottom:H.spaceT("scrollPaddingBottom"),scrollPaddingLeft:H.spaceT("scrollPaddingLeft"),scrollPaddingRight:H.spaceT("scrollPaddingRight"),scrollPaddingX:H.spaceT(["scrollPaddingLeft","scrollPaddingRight"]),scrollPaddingY:H.spaceT(["scrollPaddingTop","scrollPaddingBottom"])};function LN(e){return co(e)&&e.reference?e.reference:String(e)}var Xv=(e,...t)=>t.map(LN).join(` ${e} `).replace(/calc/g,""),M6=(...e)=>`calc(${Xv("+",...e)})`,D6=(...e)=>`calc(${Xv("-",...e)})`,hw=(...e)=>`calc(${Xv("*",...e)})`,L6=(...e)=>`calc(${Xv("/",...e)})`,$6=e=>{const t=LN(e);return t!=null&&!Number.isNaN(parseFloat(t))?String(t).startsWith("-")?String(t).slice(1):`-${t}`:hw(t,-1)},qa=Object.assign(e=>({add:(...t)=>qa(M6(e,...t)),subtract:(...t)=>qa(D6(e,...t)),multiply:(...t)=>qa(hw(e,...t)),divide:(...t)=>qa(L6(e,...t)),negate:()=>qa($6(e)),toString:()=>e.toString()}),{add:M6,subtract:D6,multiply:hw,divide:L6,negate:$6});function tie(e,t="-"){return e.replace(/\s+/g,t)}function nie(e){const t=tie(e.toString());return iie(rie(t))}function rie(e){return e.includes("\\.")?e:!Number.isInteger(parseFloat(e.toString()))?e.replace(".","\\."):e}function iie(e){return e.replace(/[!-,/:-@[-^`{-~]/g,"\\$&")}function oie(e,t=""){return[t,e].filter(Boolean).join("-")}function sie(e,t){return`var(${e}${t?`, ${t}`:""})`}function aie(e,t=""){return nie(`--${oie(e,t)}`)}function pw(e,t,n){const r=aie(e,n);return{variable:r,reference:sie(r,t)}}function SEe(e,t){const n={};for(const r of t){if(Array.isArray(r)){const[i,o]=r;n[i]=pw(`${e}-${i}`,o);continue}n[r]=pw(`${e}-${r}`)}return n}function lie(e){const t=e==null?0:e.length;return t?e[t-1]:void 0}function uie(e){const t=parseFloat(e.toString()),n=e.toString().replace(String(t),"");return{unitless:!n,value:t,unit:n}}function gw(e){if(e==null)return e;const{unitless:t}=uie(e);return t||typeof e=="number"?`${e}px`:e}var $N=(e,t)=>parseInt(e[1],10)>parseInt(t[1],10)?1:-1,M5=e=>Object.fromEntries(Object.entries(e).sort($N));function F6(e){const t=M5(e);return Object.assign(Object.values(t),t)}function cie(e){const t=Object.keys(M5(e));return new Set(t)}function B6(e){var t;if(!e)return e;e=(t=gw(e))!=null?t:e;const n=-.02;return typeof e=="number"?`${e+n}`:e.replace(/(\d+\.?\d*)/u,r=>`${parseFloat(r)+n}`)}function qd(e,t){const n=["@media screen"];return e&&n.push("and",`(min-width: ${gw(e)})`),t&&n.push("and",`(max-width: ${gw(t)})`),n.join(" ")}function die(e){var t;if(!e)return null;e.base=(t=e.base)!=null?t:"0px";const n=F6(e),r=Object.entries(e).sort($N).map(([s,a],l,u)=>{var c;let[,d]=(c=u[l+1])!=null?c:[];return d=parseFloat(d)>0?B6(d):void 0,{_minW:B6(a),breakpoint:s,minW:a,maxW:d,maxWQuery:qd(null,d),minWQuery:qd(a),minMaxQuery:qd(a,d)}}),i=cie(e),o=Array.from(i.values());return{keys:i,normalized:n,isResponsive(s){const a=Object.keys(s);return a.length>0&&a.every(l=>i.has(l))},asObject:M5(e),asArray:F6(e),details:r,get(s){return r.find(a=>a.breakpoint===s)},media:[null,...n.map(s=>qd(s)).slice(1)],toArrayValue(s){if(!co(s))throw new Error("toArrayValue: value must be an object");const a=o.map(l=>{var u;return(u=s[l])!=null?u:null});for(;lie(a)===null;)a.pop();return a},toObjectValue(s){if(!Array.isArray(s))throw new Error("toObjectValue: value must be an array");return s.reduce((a,l,u)=>{const c=o[u];return c!=null&&l!=null&&(a[c]=l),a},{})}}}var Rn={hover:(e,t)=>`${e}:hover ${t}, ${e}[data-hover] ${t}`,focus:(e,t)=>`${e}:focus ${t}, ${e}[data-focus] ${t}`,focusVisible:(e,t)=>`${e}:focus-visible ${t}`,focusWithin:(e,t)=>`${e}:focus-within ${t}`,active:(e,t)=>`${e}:active ${t}, ${e}[data-active] ${t}`,disabled:(e,t)=>`${e}:disabled ${t}, ${e}[data-disabled] ${t}`,invalid:(e,t)=>`${e}:invalid ${t}, ${e}[data-invalid] ${t}`,checked:(e,t)=>`${e}:checked ${t}, ${e}[data-checked] ${t}`,indeterminate:(e,t)=>`${e}:indeterminate ${t}, ${e}[aria-checked=mixed] ${t}, ${e}[data-indeterminate] ${t}`,readOnly:(e,t)=>`${e}:read-only ${t}, ${e}[readonly] ${t}, ${e}[data-read-only] ${t}`,expanded:(e,t)=>`${e}:read-only ${t}, ${e}[aria-expanded=true] ${t}, ${e}[data-expanded] ${t}`,placeholderShown:(e,t)=>`${e}:placeholder-shown ${t}`},Ts=e=>FN(t=>e(t,"&"),"[role=group]","[data-group]",".group"),No=e=>FN(t=>e(t,"~ &"),"[data-peer]",".peer"),FN=(e,...t)=>t.map(e).join(", "),Qv={_hover:"&:hover, &[data-hover]",_active:"&:active, &[data-active]",_focus:"&:focus, &[data-focus]",_highlighted:"&[data-highlighted]",_focusWithin:"&:focus-within",_focusVisible:"&:focus-visible, &[data-focus-visible]",_disabled:"&:disabled, &[disabled], &[aria-disabled=true], &[data-disabled]",_readOnly:"&[aria-readonly=true], &[readonly], &[data-readonly]",_before:"&::before",_after:"&::after",_empty:"&:empty",_expanded:"&[aria-expanded=true], &[data-expanded]",_checked:"&[aria-checked=true], &[data-checked]",_grabbed:"&[aria-grabbed=true], &[data-grabbed]",_pressed:"&[aria-pressed=true], &[data-pressed]",_invalid:"&[aria-invalid=true], &[data-invalid]",_valid:"&[data-valid], &[data-state=valid]",_loading:"&[data-loading], &[aria-busy=true]",_selected:"&[aria-selected=true], &[data-selected]",_hidden:"&[hidden], &[data-hidden]",_autofill:"&:-webkit-autofill",_even:"&:nth-of-type(even)",_odd:"&:nth-of-type(odd)",_first:"&:first-of-type",_firstLetter:"&::first-letter",_last:"&:last-of-type",_notFirst:"&:not(:first-of-type)",_notLast:"&:not(:last-of-type)",_visited:"&:visited",_activeLink:"&[aria-current=page]",_activeStep:"&[aria-current=step]",_indeterminate:"&:indeterminate, &[aria-checked=mixed], &[data-indeterminate]",_groupHover:Ts(Rn.hover),_peerHover:No(Rn.hover),_groupFocus:Ts(Rn.focus),_peerFocus:No(Rn.focus),_groupFocusVisible:Ts(Rn.focusVisible),_peerFocusVisible:No(Rn.focusVisible),_groupActive:Ts(Rn.active),_peerActive:No(Rn.active),_groupDisabled:Ts(Rn.disabled),_peerDisabled:No(Rn.disabled),_groupInvalid:Ts(Rn.invalid),_peerInvalid:No(Rn.invalid),_groupChecked:Ts(Rn.checked),_peerChecked:No(Rn.checked),_groupFocusWithin:Ts(Rn.focusWithin),_peerFocusWithin:No(Rn.focusWithin),_peerPlaceholderShown:No(Rn.placeholderShown),_placeholder:"&::placeholder",_placeholderShown:"&:placeholder-shown",_fullScreen:"&:fullscreen",_selection:"&::selection",_rtl:"[dir=rtl] &, &[dir=rtl]",_ltr:"[dir=ltr] &, &[dir=ltr]",_mediaDark:"@media (prefers-color-scheme: dark)",_mediaReduceMotion:"@media (prefers-reduced-motion: reduce)",_dark:".chakra-ui-dark &:not([data-theme]),[data-theme=dark] &:not([data-theme]),&[data-theme=dark]",_light:".chakra-ui-light &:not([data-theme]),[data-theme=light] &:not([data-theme]),&[data-theme=light]",_horizontal:"&[data-orientation=horizontal]",_vertical:"&[data-orientation=vertical]"},BN=Object.keys(Qv);function j6(e,t){return pw(String(e).replace(/\./g,"-"),void 0,t)}function fie(e,t){let n={};const r={};for(const[i,o]of Object.entries(e)){const{isSemantic:s,value:a}=o,{variable:l,reference:u}=j6(i,t==null?void 0:t.cssVarPrefix);if(!s){if(i.startsWith("space")){const f=i.split("."),[h,...p]=f,m=`${h}.-${p.join(".")}`,S=qa.negate(a),v=qa.negate(u);r[m]={value:S,var:l,varRef:v}}n[l]=a,r[i]={value:a,var:l,varRef:u};continue}const c=f=>{const p=[String(i).split(".")[0],f].join(".");if(!e[p])return f;const{reference:S}=j6(p,t==null?void 0:t.cssVarPrefix);return S},d=co(a)?a:{default:a};n=ro(n,Object.entries(d).reduce((f,[h,p])=>{var m,S;if(!p)return f;const v=c(`${p}`);if(h==="default")return f[l]=v,f;const y=(S=(m=Qv)==null?void 0:m[h])!=null?S:h;return f[y]={[l]:v},f},{})),r[i]={value:u,var:l,varRef:u}}return{cssVars:n,cssMap:r}}function hie(e,t=[]){const n=Object.assign({},e);for(const r of t)r in n&&delete n[r];return n}function pie(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function gie(e){return typeof e=="object"&&e!=null&&!Array.isArray(e)}function V6(e,t,n={}){const{stop:r,getKey:i}=n;function o(s,a=[]){var l;if(gie(s)||Array.isArray(s)){const u={};for(const[c,d]of Object.entries(s)){const f=(l=i==null?void 0:i(c))!=null?l:c,h=[...a,f];if(r!=null&&r(s,h))return t(s,a);u[f]=o(d,h)}return u}return t(s,a)}return o(e)}var mie=["colors","borders","borderWidths","borderStyles","fonts","fontSizes","fontWeights","gradients","letterSpacings","lineHeights","radii","space","shadows","sizes","zIndices","transition","blur","breakpoints"];function yie(e){return pie(e,mie)}function vie(e){return e.semanticTokens}function bie(e){const{__cssMap:t,__cssVars:n,__breakpoints:r,...i}=e;return i}var Sie=e=>BN.includes(e)||e==="default";function _ie({tokens:e,semanticTokens:t}){const n={};return V6(e,(r,i)=>{r!=null&&(n[i.join(".")]={isSemantic:!1,value:r})}),V6(t,(r,i)=>{r!=null&&(n[i.join(".")]={isSemantic:!0,value:r})},{stop:r=>Object.keys(r).every(Sie)}),n}function _Ee(e){var t;const n=bie(e),r=yie(n),i=vie(n),o=_ie({tokens:r,semanticTokens:i}),s=(t=n.config)==null?void 0:t.cssVarPrefix,{cssMap:a,cssVars:l}=fie(o,{cssVarPrefix:s});return Object.assign(n,{__cssVars:{...{"--chakra-ring-inset":"var(--chakra-empty,/*!*/ /*!*/)","--chakra-ring-offset-width":"0px","--chakra-ring-offset-color":"#fff","--chakra-ring-color":"rgba(66, 153, 225, 0.6)","--chakra-ring-offset-shadow":"0 0 #0000","--chakra-ring-shadow":"0 0 #0000","--chakra-space-x-reverse":"0","--chakra-space-y-reverse":"0"},...l},__cssMap:a,__breakpoints:die(n.breakpoints)}),n}var D5=ro({},fm,Je,Bre,Py,Zr,jre,Yre,Vre,DN,Kre,hf,fw,vt,eie,Jre,Xre,Qre,zre,Zre),wie=Object.assign({},vt,Zr,Py,DN,hf),wEe=Object.keys(wie),xie=[...Object.keys(D5),...BN],Cie={...D5,...Qv},Tie=e=>e in Cie,Eie=e=>t=>{if(!t.__breakpoints)return e;const{isResponsive:n,toArrayValue:r,media:i}=t.__breakpoints,o={};for(const s in e){let a=no(e[s],t);if(a==null)continue;if(a=co(a)&&n(a)?r(a):a,!Array.isArray(a)){o[s]=a;continue}const l=a.slice(0,i.length).length;for(let u=0;ue.startsWith("--")&&typeof t=="string"&&!kie(t),Oie=(e,t)=>{var n,r;if(t==null)return t;const i=l=>{var u,c;return(c=(u=e.__cssMap)==null?void 0:u[l])==null?void 0:c.varRef},o=l=>{var u;return(u=i(l))!=null?u:l},[s,a]=Pie(t);return t=(r=(n=i(s))!=null?n:o(a))!=null?r:o(t),t};function Rie(e){const{configs:t={},pseudos:n={},theme:r}=e,i=(o,s=!1)=>{var a,l,u;const c=no(o,r),d=Eie(c)(r);let f={};for(let h in d){const p=d[h];let m=no(p,r);h in n&&(h=n[h]),Aie(h,m)&&(m=Oie(r,m));let S=t[h];if(S===!0&&(S={property:h}),co(m)){f[h]=(a=f[h])!=null?a:{},f[h]=ro({},f[h],i(m,!0));continue}let v=(u=(l=S==null?void 0:S.transform)==null?void 0:l.call(S,m,r,c))!=null?u:m;v=S!=null&&S.processResult?i(v,!0):v;const y=no(S==null?void 0:S.property,r);if(!s&&(S!=null&&S.static)){const g=no(S.static,r);f=ro({},f,g)}if(y&&Array.isArray(y)){for(const g of y)f[g]=v;continue}if(y){y==="&"&&co(v)?f=ro({},f,v):f[y]=v;continue}if(co(v)){f=ro({},f,v);continue}f[h]=v}return f};return i}var Iie=e=>t=>Rie({theme:t,pseudos:Qv,configs:D5})(e);function xEe(e){return e}function CEe(e){return e}function TEe(e){return{definePartsStyle(t){return t},defineMultiStyleConfig(t){return{parts:e,...t}}}}function Nie(e,t){if(Array.isArray(e))return e;if(co(e))return t(e);if(e!=null)return[e]}function Mie(e,t){for(let n=t+1;n{ro(u,{[g]:f?y[g]:{[v]:y[g]}})});continue}if(!h){f?ro(u,y):u[v]=y;continue}u[v]=y}}return u}}function Lie(e){return t=>{var n;const{variant:r,size:i,theme:o}=t,s=Die(o);return ro({},no((n=e.baseStyle)!=null?n:{},t),s(e,"sizes",i,t),s(e,"variants",r,t))}}function $ie(e,t,n){var r,i,o;return(o=(i=(r=e.__cssMap)==null?void 0:r[`${t}.${n}`])==null?void 0:i.varRef)!=null?o:n}function Co(e){return hie(e,["styleConfig","size","variant","colorScheme"])}function Fie(e){return e!=null&&typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.ELEMENT_NODE}function EEe(e){var t;return Fie(e)&&(t=e.ownerDocument)!=null?t:document}function Bie(){return!!(typeof window<"u"&&window.document&&window.document.createElement)}var jie=Bie();function Vie(e,t){const n={};return Object.keys(e).forEach(r=>{t.includes(r)||(n[r]=e[r])}),n}function zie(e,t,n,r){const i=typeof t=="string"?t.split("."):[t];for(r=0;r{const t=new WeakMap;return(r,i,o,s)=>{if(typeof r>"u")return e(r,i,o);t.has(r)||t.set(r,new Map);const a=t.get(r);if(a.has(i))return a.get(i);const l=e(r,i,o,s);return a.set(i,l),l}},Gie=Uie(zie);function jN(e,t){const n={};return Object.keys(e).forEach(r=>{const i=e[r];t(i,r,e)&&(n[r]=i)}),n}var VN=e=>jN(e,t=>t!=null);function Hie(e){return typeof e=="function"}function Wie(e,...t){return Hie(e)?e(...t):e}function qie(...e){return function(n){e.some(r=>(r==null||r(n),n==null?void 0:n.defaultPrevented))}}const zN=1/60*1e3,Kie=typeof performance<"u"?()=>performance.now():()=>Date.now(),UN=typeof window<"u"?e=>window.requestAnimationFrame(e):e=>setTimeout(()=>e(Kie()),zN);function Yie(e){let t=[],n=[],r=0,i=!1,o=!1;const s=new WeakSet,a={schedule:(l,u=!1,c=!1)=>{const d=c&&i,f=d?t:n;return u&&s.add(l),f.indexOf(l)===-1&&(f.push(l),d&&i&&(r=t.length)),l},cancel:l=>{const u=n.indexOf(l);u!==-1&&n.splice(u,1),s.delete(l)},process:l=>{if(i){o=!0;return}if(i=!0,[t,n]=[n,t],n.length=0,r=t.length,r)for(let u=0;u(e[t]=Yie(()=>lh=!0),e),{}),Qie=yp.reduce((e,t)=>{const n=Zv[t];return e[t]=(r,i=!1,o=!1)=>(lh||eoe(),n.schedule(r,i,o)),e},{}),Zie=yp.reduce((e,t)=>(e[t]=Zv[t].cancel,e),{});yp.reduce((e,t)=>(e[t]=()=>Zv[t].process(Ju),e),{});const Jie=e=>Zv[e].process(Ju),GN=e=>{lh=!1,Ju.delta=mw?zN:Math.max(Math.min(e-Ju.timestamp,Xie),1),Ju.timestamp=e,yw=!0,yp.forEach(Jie),yw=!1,lh&&(mw=!1,UN(GN))},eoe=()=>{lh=!0,mw=!0,yw||UN(GN)},z6=()=>Ju;var toe=typeof Element<"u",noe=typeof Map=="function",roe=typeof Set=="function",ioe=typeof ArrayBuffer=="function"&&!!ArrayBuffer.isView;function hm(e,t){if(e===t)return!0;if(e&&t&&typeof e=="object"&&typeof t=="object"){if(e.constructor!==t.constructor)return!1;var n,r,i;if(Array.isArray(e)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(!hm(e[r],t[r]))return!1;return!0}var o;if(noe&&e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(o=e.entries();!(r=o.next()).done;)if(!t.has(r.value[0]))return!1;for(o=e.entries();!(r=o.next()).done;)if(!hm(r.value[1],t.get(r.value[0])))return!1;return!0}if(roe&&e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(o=e.entries();!(r=o.next()).done;)if(!t.has(r.value[0]))return!1;return!0}if(ioe&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(t)){if(n=e.length,n!=t.length)return!1;for(r=n;r--!==0;)if(e[r]!==t[r])return!1;return!0}if(e.constructor===RegExp)return e.source===t.source&&e.flags===t.flags;if(e.valueOf!==Object.prototype.valueOf&&typeof e.valueOf=="function"&&typeof t.valueOf=="function")return e.valueOf()===t.valueOf();if(e.toString!==Object.prototype.toString&&typeof e.toString=="function"&&typeof t.toString=="function")return e.toString()===t.toString();if(i=Object.keys(e),n=i.length,n!==Object.keys(t).length)return!1;for(r=n;r--!==0;)if(!Object.prototype.hasOwnProperty.call(t,i[r]))return!1;if(toe&&e instanceof Element)return!1;for(r=n;r--!==0;)if(!((i[r]==="_owner"||i[r]==="__v"||i[r]==="__o")&&e.$$typeof)&&!hm(e[i[r]],t[i[r]]))return!1;return!0}return e!==e&&t!==t}var ooe=function(t,n){try{return hm(t,n)}catch(r){if((r.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw r}};const soe=kl(ooe);function HN(e,t={}){var n;const{styleConfig:r,...i}=t,{theme:o,colorMode:s}=NN(),a=e?Gie(o,`components.${e}`):void 0,l=r||a,u=ro({theme:o,colorMode:s},(n=l==null?void 0:l.defaultProps)!=null?n:{},VN(Vie(i,["children"]))),c=E.useRef({});if(l){const f=Lie(l)(u);soe(c.current,f)||(c.current=f)}return c.current}function Ml(e,t={}){return HN(e,t)}function Jv(e,t={}){return HN(e,t)}var aoe=new Set([...xie,"textStyle","layerStyle","apply","noOfLines","focusBorderColor","errorBorderColor","as","__css","css","sx"]),loe=new Set(["htmlWidth","htmlHeight","htmlSize","htmlTranslate"]);function uoe(e){return loe.has(e)||!aoe.has(e)}function coe(e,...t){if(e==null)throw new TypeError("Cannot convert undefined or null to object");const n={...e};for(const r of t)if(r!=null)for(const i in r)Object.prototype.hasOwnProperty.call(r,i)&&(i in n&&delete n[i],n[i]=r[i]);return n}var doe=/^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|download|draggable|encType|enterKeyHint|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/,foe=xN(function(e){return doe.test(e)||e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)<91}),hoe=foe,poe=function(t){return t!=="theme"},U6=function(t){return typeof t=="string"&&t.charCodeAt(0)>96?hoe:poe},G6=function(t,n,r){var i;if(n){var o=n.shouldForwardProp;i=t.__emotion_forwardProp&&o?function(s){return t.__emotion_forwardProp(s)&&o(s)}:o}return typeof i!="function"&&r&&(i=t.__emotion_forwardProp),i},goe=function(t){var n=t.cache,r=t.serialized,i=t.isStringTag;return TN(n,r,i),rre(function(){return EN(n,r,i)}),null},moe=function e(t,n){var r=t.__emotion_real===t,i=r&&t.__emotion_base||t,o,s;n!==void 0&&(o=n.label,s=n.target);var a=G6(t,n,r),l=a||U6(i),u=!l("as");return function(){var c=arguments,d=r&&t.__emotion_styles!==void 0?t.__emotion_styles.slice(0):[];if(o!==void 0&&d.push("label:"+o+";"),c[0]==null||c[0].raw===void 0)d.push.apply(d,c);else{d.push(c[0][0]);for(var f=c.length,h=1;ht=>{const{theme:n,css:r,__css:i,sx:o,...s}=t,a=jN(s,(d,f)=>Tie(f)),l=Wie(e,t),u=coe({},i,l,VN(a),o),c=Iie(u)(t.theme);return r?[c,r]:c};function zS(e,t){const{baseStyle:n,...r}=t??{};r.shouldForwardProp||(r.shouldForwardProp=uoe);const i=boe({baseStyle:n}),o=voe(e,r)(i);return Ve.forwardRef(function(l,u){const{colorMode:c,forced:d}=I5();return Ve.createElement(o,{ref:u,"data-theme":d?c:void 0,...l})})}function Soe(){const e=new Map;return new Proxy(zS,{apply(t,n,r){return zS(...r)},get(t,n){return e.has(n)||e.set(n,zS(n)),e.get(n)}})}var ke=Soe();function Qe(e){return E.forwardRef(e)}var _oe=(e,t)=>e.find(n=>n.id===t);function W6(e,t){const n=WN(e,t),r=n?e[n].findIndex(i=>i.id===t):-1;return{position:n,index:r}}function WN(e,t){for(const[n,r]of Object.entries(e))if(_oe(r,t))return n}function woe(e){const t=e.includes("right"),n=e.includes("left");let r="center";return t&&(r="flex-end"),n&&(r="flex-start"),{display:"flex",flexDirection:"column",alignItems:r}}function xoe(e){const n=e==="top"||e==="bottom"?"0 auto":void 0,r=e.includes("top")?"env(safe-area-inset-top, 0px)":void 0,i=e.includes("bottom")?"env(safe-area-inset-bottom, 0px)":void 0,o=e.includes("left")?void 0:"env(safe-area-inset-right, 0px)",s=e.includes("right")?void 0:"env(safe-area-inset-left, 0px)";return{position:"fixed",zIndex:"var(--toast-z-index, 5500)",pointerEvents:"none",display:"flex",flexDirection:"column",margin:n,top:r,bottom:i,right:o,left:s}}function Bn(e,t=[]){const n=E.useRef(e);return E.useEffect(()=>{n.current=e}),E.useCallback((...r)=>{var i;return(i=n.current)==null?void 0:i.call(n,...r)},t)}function Coe(e,t){const n=Bn(e);E.useEffect(()=>{if(t==null)return;let r=null;return r=window.setTimeout(()=>{n()},t),()=>{r&&window.clearTimeout(r)}},[t,n])}function Ay(e,t){const n=E.useRef(!1),r=E.useRef(!1);E.useEffect(()=>{if(n.current&&r.current)return e();r.current=!0},t),E.useEffect(()=>(n.current=!0,()=>{n.current=!1}),[])}const qN=E.createContext({transformPagePoint:e=>e,isStatic:!1,reducedMotion:"never"}),e1=E.createContext({}),vp=E.createContext(null),t1=typeof document<"u",Oy=t1?E.useLayoutEffect:E.useEffect,KN=E.createContext({strict:!1});function Toe(e,t,n,r){const{visualElement:i}=E.useContext(e1),o=E.useContext(KN),s=E.useContext(vp),a=E.useContext(qN).reducedMotion,l=E.useRef();r=r||o.renderer,!l.current&&r&&(l.current=r(e,{visualState:t,parent:i,props:n,presenceContext:s,blockInitialAnimation:s?s.initial===!1:!1,reducedMotionConfig:a}));const u=l.current;return E.useInsertionEffect(()=>{u&&u.update(n,s)}),Oy(()=>{u&&u.render()}),E.useEffect(()=>{u&&u.updateFeatures()}),(window.HandoffAppearAnimations?Oy:E.useEffect)(()=>{u&&u.animationState&&u.animationState.animateChanges()}),u}function Nu(e){return typeof e=="object"&&Object.prototype.hasOwnProperty.call(e,"current")}function Eoe(e,t,n){return E.useCallback(r=>{r&&e.mount&&e.mount(r),t&&(r?t.mount(r):t.unmount()),n&&(typeof n=="function"?n(r):Nu(n)&&(n.current=r))},[t])}function uh(e){return typeof e=="string"||Array.isArray(e)}function n1(e){return typeof e=="object"&&typeof e.start=="function"}const L5=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],$5=["initial",...L5];function r1(e){return n1(e.animate)||$5.some(t=>uh(e[t]))}function YN(e){return!!(r1(e)||e.variants)}function Poe(e,t){if(r1(e)){const{initial:n,animate:r}=e;return{initial:n===!1||uh(n)?n:void 0,animate:uh(r)?r:void 0}}return e.inherit!==!1?t:{}}function koe(e){const{initial:t,animate:n}=Poe(e,E.useContext(e1));return E.useMemo(()=>({initial:t,animate:n}),[q6(t),q6(n)])}function q6(e){return Array.isArray(e)?e.join(" "):e}const K6={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]},ch={};for(const e in K6)ch[e]={isEnabled:t=>K6[e].some(n=>!!t[n])};function Aoe(e){for(const t in e)ch[t]={...ch[t],...e[t]}}const F5=E.createContext({}),XN=E.createContext({}),Ooe=Symbol.for("motionComponentSymbol");function Roe({preloadedFeatures:e,createVisualElement:t,useRender:n,useVisualState:r,Component:i}){e&&Aoe(e);function o(a,l){let u;const c={...E.useContext(qN),...a,layoutId:Ioe(a)},{isStatic:d}=c,f=koe(a),h=r(a,d);if(!d&&t1){f.visualElement=Toe(i,h,c,t);const p=E.useContext(XN),m=E.useContext(KN).strict;f.visualElement&&(u=f.visualElement.loadFeatures(c,m,e,p))}return E.createElement(e1.Provider,{value:f},u&&f.visualElement?E.createElement(u,{visualElement:f.visualElement,...c}):null,n(i,a,Eoe(h,f.visualElement,l),h,d,f.visualElement))}const s=E.forwardRef(o);return s[Ooe]=i,s}function Ioe({layoutId:e}){const t=E.useContext(F5).id;return t&&e!==void 0?t+"-"+e:e}function Noe(e){function t(r,i={}){return Roe(e(r,i))}if(typeof Proxy>"u")return t;const n=new Map;return new Proxy(t,{get:(r,i)=>(n.has(i)||n.set(i,t(i)),n.get(i))})}const Moe=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function B5(e){return typeof e!="string"||e.includes("-")?!1:!!(Moe.indexOf(e)>-1||/[A-Z]/.test(e))}const Ry={};function Doe(e){Object.assign(Ry,e)}const bp=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],Dl=new Set(bp);function QN(e,{layout:t,layoutId:n}){return Dl.has(e)||e.startsWith("origin")||(t||n!==void 0)&&(!!Ry[e]||e==="opacity")}const kr=e=>!!(e&&e.getVelocity),Loe={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},$oe=bp.length;function Foe(e,{enableHardwareAcceleration:t=!0,allowTransformNone:n=!0},r,i){let o="";for(let s=0;s<$oe;s++){const a=bp[s];if(e[a]!==void 0){const l=Loe[a]||a;o+=`${l}(${e[a]}) `}}return t&&!e.z&&(o+="translateZ(0)"),o=o.trim(),i?o=i(e,r?"":o):n&&r&&(o="none"),o}const ZN=e=>t=>typeof t=="string"&&t.startsWith(e),JN=ZN("--"),vw=ZN("var(--"),Boe=/var\s*\(\s*--[\w-]+(\s*,\s*(?:(?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)+)?\s*\)/g,joe=(e,t)=>t&&typeof e=="number"?t.transform(e):e,fa=(e,t,n)=>Math.min(Math.max(n,e),t),Ll={test:e=>typeof e=="number",parse:parseFloat,transform:e=>e},pf={...Ll,transform:e=>fa(0,1,e)},bg={...Ll,default:1},gf=e=>Math.round(e*1e5)/1e5,i1=/(-)?([\d]*\.?[\d])+/g,eM=/(#[0-9a-f]{3,8}|(rgb|hsl)a?\((-?[\d\.]+%?[,\s]+){2}(-?[\d\.]+%?)\s*[\,\/]?\s*[\d\.]*%?\))/gi,Voe=/^(#[0-9a-f]{3,8}|(rgb|hsl)a?\((-?[\d\.]+%?[,\s]+){2}(-?[\d\.]+%?)\s*[\,\/]?\s*[\d\.]*%?\))$/i;function Sp(e){return typeof e=="string"}const _p=e=>({test:t=>Sp(t)&&t.endsWith(e)&&t.split(" ").length===1,parse:parseFloat,transform:t=>`${t}${e}`}),Ps=_p("deg"),fo=_p("%"),Se=_p("px"),zoe=_p("vh"),Uoe=_p("vw"),Y6={...fo,parse:e=>fo.parse(e)/100,transform:e=>fo.transform(e*100)},X6={...Ll,transform:Math.round},tM={borderWidth:Se,borderTopWidth:Se,borderRightWidth:Se,borderBottomWidth:Se,borderLeftWidth:Se,borderRadius:Se,radius:Se,borderTopLeftRadius:Se,borderTopRightRadius:Se,borderBottomRightRadius:Se,borderBottomLeftRadius:Se,width:Se,maxWidth:Se,height:Se,maxHeight:Se,size:Se,top:Se,right:Se,bottom:Se,left:Se,padding:Se,paddingTop:Se,paddingRight:Se,paddingBottom:Se,paddingLeft:Se,margin:Se,marginTop:Se,marginRight:Se,marginBottom:Se,marginLeft:Se,rotate:Ps,rotateX:Ps,rotateY:Ps,rotateZ:Ps,scale:bg,scaleX:bg,scaleY:bg,scaleZ:bg,skew:Ps,skewX:Ps,skewY:Ps,distance:Se,translateX:Se,translateY:Se,translateZ:Se,x:Se,y:Se,z:Se,perspective:Se,transformPerspective:Se,opacity:pf,originX:Y6,originY:Y6,originZ:Se,zIndex:X6,fillOpacity:pf,strokeOpacity:pf,numOctaves:X6};function j5(e,t,n,r){const{style:i,vars:o,transform:s,transformOrigin:a}=e;let l=!1,u=!1,c=!0;for(const d in t){const f=t[d];if(JN(d)){o[d]=f;continue}const h=tM[d],p=joe(f,h);if(Dl.has(d)){if(l=!0,s[d]=p,!c)continue;f!==(h.default||0)&&(c=!1)}else d.startsWith("origin")?(u=!0,a[d]=p):i[d]=p}if(t.transform||(l||r?i.transform=Foe(e.transform,n,c,r):i.transform&&(i.transform="none")),u){const{originX:d="50%",originY:f="50%",originZ:h=0}=a;i.transformOrigin=`${d} ${f} ${h}`}}const V5=()=>({style:{},transform:{},transformOrigin:{},vars:{}});function nM(e,t,n){for(const r in t)!kr(t[r])&&!QN(r,n)&&(e[r]=t[r])}function Goe({transformTemplate:e},t,n){return E.useMemo(()=>{const r=V5();return j5(r,t,{enableHardwareAcceleration:!n},e),Object.assign({},r.vars,r.style)},[t])}function Hoe(e,t,n){const r=e.style||{},i={};return nM(i,r,e),Object.assign(i,Goe(e,t,n)),e.transformValues?e.transformValues(i):i}function Woe(e,t,n){const r={},i=Hoe(e,t,n);return e.drag&&e.dragListener!==!1&&(r.draggable=!1,i.userSelect=i.WebkitUserSelect=i.WebkitTouchCallout="none",i.touchAction=e.drag===!0?"none":`pan-${e.drag==="x"?"y":"x"}`),e.tabIndex===void 0&&(e.onTap||e.onTapStart||e.whileTap)&&(r.tabIndex=0),r.style=i,r}const qoe=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","transformValues","custom","inherit","onLayoutAnimationStart","onLayoutAnimationComplete","onLayoutMeasure","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","ignoreStrict","viewport"]);function Iy(e){return e.startsWith("while")||e.startsWith("drag")&&e!=="draggable"||e.startsWith("layout")||e.startsWith("onTap")||e.startsWith("onPan")||qoe.has(e)}let rM=e=>!Iy(e);function Koe(e){e&&(rM=t=>t.startsWith("on")?!Iy(t):e(t))}try{Koe(require("@emotion/is-prop-valid").default)}catch{}function Yoe(e,t,n){const r={};for(const i in e)i==="values"&&typeof e.values=="object"||(rM(i)||n===!0&&Iy(i)||!t&&!Iy(i)||e.draggable&&i.startsWith("onDrag"))&&(r[i]=e[i]);return r}function Q6(e,t,n){return typeof e=="string"?e:Se.transform(t+n*e)}function Xoe(e,t,n){const r=Q6(t,e.x,e.width),i=Q6(n,e.y,e.height);return`${r} ${i}`}const Qoe={offset:"stroke-dashoffset",array:"stroke-dasharray"},Zoe={offset:"strokeDashoffset",array:"strokeDasharray"};function Joe(e,t,n=1,r=0,i=!0){e.pathLength=1;const o=i?Qoe:Zoe;e[o.offset]=Se.transform(-r);const s=Se.transform(t),a=Se.transform(n);e[o.array]=`${s} ${a}`}function z5(e,{attrX:t,attrY:n,attrScale:r,originX:i,originY:o,pathLength:s,pathSpacing:a=1,pathOffset:l=0,...u},c,d,f){if(j5(e,u,c,f),d){e.style.viewBox&&(e.attrs.viewBox=e.style.viewBox);return}e.attrs=e.style,e.style={};const{attrs:h,style:p,dimensions:m}=e;h.transform&&(m&&(p.transform=h.transform),delete h.transform),m&&(i!==void 0||o!==void 0||p.transform)&&(p.transformOrigin=Xoe(m,i!==void 0?i:.5,o!==void 0?o:.5)),t!==void 0&&(h.x=t),n!==void 0&&(h.y=n),r!==void 0&&(h.scale=r),s!==void 0&&Joe(h,s,a,l,!1)}const iM=()=>({...V5(),attrs:{}}),U5=e=>typeof e=="string"&&e.toLowerCase()==="svg";function ese(e,t,n,r){const i=E.useMemo(()=>{const o=iM();return z5(o,t,{enableHardwareAcceleration:!1},U5(r),e.transformTemplate),{...o.attrs,style:{...o.style}}},[t]);if(e.style){const o={};nM(o,e.style,e),i.style={...o,...i.style}}return i}function tse(e=!1){return(n,r,i,{latestValues:o},s)=>{const l=(B5(n)?ese:Woe)(r,o,s,n),c={...Yoe(r,typeof n=="string",e),...l,ref:i},{children:d}=r,f=E.useMemo(()=>kr(d)?d.get():d,[d]);return E.createElement(n,{...c,children:f})}}const G5=e=>e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase();function oM(e,{style:t,vars:n},r,i){Object.assign(e.style,t,i&&i.getProjectionStyles(r));for(const o in n)e.style.setProperty(o,n[o])}const sM=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]);function aM(e,t,n,r){oM(e,t,void 0,r);for(const i in t.attrs)e.setAttribute(sM.has(i)?i:G5(i),t.attrs[i])}function H5(e,t){const{style:n}=e,r={};for(const i in n)(kr(n[i])||t.style&&kr(t.style[i])||QN(i,e))&&(r[i]=n[i]);return r}function lM(e,t){const n=H5(e,t);for(const r in e)if(kr(e[r])||kr(t[r])){const i=bp.indexOf(r)!==-1?"attr"+r.charAt(0).toUpperCase()+r.substring(1):r;n[i]=e[r]}return n}function W5(e,t,n,r={},i={}){return typeof t=="function"&&(t=t(n!==void 0?n:e.custom,r,i)),typeof t=="string"&&(t=e.variants&&e.variants[t]),typeof t=="function"&&(t=t(n!==void 0?n:e.custom,r,i)),t}function uM(e){const t=E.useRef(null);return t.current===null&&(t.current=e()),t.current}const Ny=e=>Array.isArray(e),nse=e=>!!(e&&typeof e=="object"&&e.mix&&e.toValue),rse=e=>Ny(e)?e[e.length-1]||0:e;function pm(e){const t=kr(e)?e.get():e;return nse(t)?t.toValue():t}function ise({scrapeMotionValuesFromProps:e,createRenderState:t,onMount:n},r,i,o){const s={latestValues:ose(r,i,o,e),renderState:t()};return n&&(s.mount=a=>n(r,a,s)),s}const cM=e=>(t,n)=>{const r=E.useContext(e1),i=E.useContext(vp),o=()=>ise(e,t,r,i);return n?o():uM(o)};function ose(e,t,n,r){const i={},o=r(e,{});for(const f in o)i[f]=pm(o[f]);let{initial:s,animate:a}=e;const l=r1(e),u=YN(e);t&&u&&!l&&e.inherit!==!1&&(s===void 0&&(s=t.initial),a===void 0&&(a=t.animate));let c=n?n.initial===!1:!1;c=c||s===!1;const d=c?a:s;return d&&typeof d!="boolean"&&!n1(d)&&(Array.isArray(d)?d:[d]).forEach(h=>{const p=W5(e,h);if(!p)return;const{transitionEnd:m,transition:S,...v}=p;for(const y in v){let g=v[y];if(Array.isArray(g)){const b=c?g.length-1:0;g=g[b]}g!==null&&(i[y]=g)}for(const y in m)i[y]=m[y]}),i}const sse={useVisualState:cM({scrapeMotionValuesFromProps:lM,createRenderState:iM,onMount:(e,t,{renderState:n,latestValues:r})=>{try{n.dimensions=typeof t.getBBox=="function"?t.getBBox():t.getBoundingClientRect()}catch{n.dimensions={x:0,y:0,width:0,height:0}}z5(n,r,{enableHardwareAcceleration:!1},U5(t.tagName),e.transformTemplate),aM(t,n)}})},ase={useVisualState:cM({scrapeMotionValuesFromProps:H5,createRenderState:V5})};function lse(e,{forwardMotionProps:t=!1},n,r){return{...B5(e)?sse:ase,preloadedFeatures:n,useRender:tse(t),createVisualElement:r,Component:e}}function Yo(e,t,n,r={passive:!0}){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n)}const dM=e=>e.pointerType==="mouse"?typeof e.button!="number"||e.button<=0:e.isPrimary!==!1;function o1(e,t="page"){return{point:{x:e[t+"X"],y:e[t+"Y"]}}}const use=e=>t=>dM(t)&&e(t,o1(t));function Zo(e,t,n,r){return Yo(e,t,use(n),r)}const cse=(e,t)=>n=>t(e(n)),ta=(...e)=>e.reduce(cse);function fM(e){let t=null;return()=>{const n=()=>{t=null};return t===null?(t=e,n):!1}}const Z6=fM("dragHorizontal"),J6=fM("dragVertical");function hM(e){let t=!1;if(e==="y")t=J6();else if(e==="x")t=Z6();else{const n=Z6(),r=J6();n&&r?t=()=>{n(),r()}:(n&&n(),r&&r())}return t}function pM(){const e=hM(!0);return e?(e(),!1):!0}class Pa{constructor(t){this.isMounted=!1,this.node=t}update(){}}function dse(e){let t=[],n=[],r=0,i=!1,o=!1;const s=new WeakSet,a={schedule:(l,u=!1,c=!1)=>{const d=c&&i,f=d?t:n;return u&&s.add(l),f.indexOf(l)===-1&&(f.push(l),d&&i&&(r=t.length)),l},cancel:l=>{const u=n.indexOf(l);u!==-1&&n.splice(u,1),s.delete(l)},process:l=>{if(i){o=!0;return}if(i=!0,[t,n]=[n,t],n.length=0,r=t.length,r)for(let u=0;u(e[t]=dse(()=>dh=!0),e),{}),hse=e=>ec[e].process(It),gM=e=>{dh=!1,It.delta=bw?1e3/60:Math.max(Math.min(e-It.timestamp,fse),1),It.timestamp=e,It.isProcessing=!0,s1.forEach(hse),It.isProcessing=!1,dh&&(bw=!1,requestAnimationFrame(gM))},pse=()=>{dh=!0,bw=!0,It.isProcessing||requestAnimationFrame(gM)},kt=s1.reduce((e,t)=>{const n=ec[t];return e[t]=(r,i=!1,o=!1)=>(dh||pse(),n.schedule(r,i,o)),e},{});function ls(e){s1.forEach(t=>ec[t].cancel(e))}function eP(e,t){const n="pointer"+(t?"enter":"leave"),r="onHover"+(t?"Start":"End"),i=(o,s)=>{if(o.type==="touch"||pM())return;const a=e.getProps();e.animationState&&a.whileHover&&e.animationState.setActive("whileHover",t),a[r]&&kt.update(()=>a[r](o,s))};return Zo(e.current,n,i,{passive:!e.getProps()[r]})}class gse extends Pa{mount(){this.unmount=ta(eP(this.node,!0),eP(this.node,!1))}unmount(){}}class mse extends Pa{constructor(){super(...arguments),this.isActive=!1}onFocus(){let t=!1;try{t=this.node.current.matches(":focus-visible")}catch{t=!0}!t||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){!this.isActive||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=ta(Yo(this.node.current,"focus",()=>this.onFocus()),Yo(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}const mM=(e,t)=>t?e===t?!0:mM(e,t.parentElement):!1,dn=e=>e;function US(e,t){if(!t)return;const n=new PointerEvent("pointer"+e);t(n,o1(n))}class yse extends Pa{constructor(){super(...arguments),this.removeStartListeners=dn,this.removeEndListeners=dn,this.removeAccessibleListeners=dn,this.startPointerPress=(t,n)=>{if(this.removeEndListeners(),this.isPressing)return;const r=this.node.getProps(),o=Zo(window,"pointerup",(a,l)=>{if(!this.checkPressEnd())return;const{onTap:u,onTapCancel:c}=this.node.getProps();kt.update(()=>{mM(this.node.current,a.target)?u&&u(a,l):c&&c(a,l)})},{passive:!(r.onTap||r.onPointerUp)}),s=Zo(window,"pointercancel",(a,l)=>this.cancelPress(a,l),{passive:!(r.onTapCancel||r.onPointerCancel)});this.removeEndListeners=ta(o,s),this.startPress(t,n)},this.startAccessiblePress=()=>{const t=o=>{if(o.key!=="Enter"||this.isPressing)return;const s=a=>{a.key!=="Enter"||!this.checkPressEnd()||US("up",(l,u)=>{const{onTap:c}=this.node.getProps();c&&kt.update(()=>c(l,u))})};this.removeEndListeners(),this.removeEndListeners=Yo(this.node.current,"keyup",s),US("down",(a,l)=>{this.startPress(a,l)})},n=Yo(this.node.current,"keydown",t),r=()=>{this.isPressing&&US("cancel",(o,s)=>this.cancelPress(o,s))},i=Yo(this.node.current,"blur",r);this.removeAccessibleListeners=ta(n,i)}}startPress(t,n){this.isPressing=!0;const{onTapStart:r,whileTap:i}=this.node.getProps();i&&this.node.animationState&&this.node.animationState.setActive("whileTap",!0),r&&kt.update(()=>r(t,n))}checkPressEnd(){return this.removeEndListeners(),this.isPressing=!1,this.node.getProps().whileTap&&this.node.animationState&&this.node.animationState.setActive("whileTap",!1),!pM()}cancelPress(t,n){if(!this.checkPressEnd())return;const{onTapCancel:r}=this.node.getProps();r&&kt.update(()=>r(t,n))}mount(){const t=this.node.getProps(),n=Zo(this.node.current,"pointerdown",this.startPointerPress,{passive:!(t.onTapStart||t.onPointerStart)}),r=Yo(this.node.current,"focus",this.startAccessiblePress);this.removeStartListeners=ta(n,r)}unmount(){this.removeStartListeners(),this.removeEndListeners(),this.removeAccessibleListeners()}}const Sw=new WeakMap,GS=new WeakMap,vse=e=>{const t=Sw.get(e.target);t&&t(e)},bse=e=>{e.forEach(vse)};function Sse({root:e,...t}){const n=e||document;GS.has(n)||GS.set(n,{});const r=GS.get(n),i=JSON.stringify(t);return r[i]||(r[i]=new IntersectionObserver(bse,{root:e,...t})),r[i]}function _se(e,t,n){const r=Sse(t);return Sw.set(e,n),r.observe(e),()=>{Sw.delete(e),r.unobserve(e)}}const wse={some:0,all:1};class xse extends Pa{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:t={}}=this.node.getProps(),{root:n,margin:r,amount:i="some",once:o}=t,s={root:n?n.current:void 0,rootMargin:r,threshold:typeof i=="number"?i:wse[i]},a=l=>{const{isIntersecting:u}=l;if(this.isInView===u||(this.isInView=u,o&&!u&&this.hasEnteredView))return;u&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",u);const{onViewportEnter:c,onViewportLeave:d}=this.node.getProps(),f=u?c:d;f&&f(l)};return _se(this.node.current,s,a)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>"u")return;const{props:t,prevProps:n}=this.node;["amount","margin","root"].some(Cse(t,n))&&this.startObserver()}unmount(){}}function Cse({viewport:e={}},{viewport:t={}}={}){return n=>e[n]!==t[n]}const Tse={inView:{Feature:xse},tap:{Feature:yse},focus:{Feature:mse},hover:{Feature:gse}};function yM(e,t){if(!Array.isArray(t))return!1;const n=t.length;if(n!==e.length)return!1;for(let r=0;rt[r]=n.get()),t}function Pse(e){const t={};return e.values.forEach((n,r)=>t[r]=n.getVelocity()),t}function a1(e,t,n){const r=e.getProps();return W5(r,t,n!==void 0?n:r.custom,Ese(e),Pse(e))}const kse="framerAppearId",Ase="data-"+G5(kse);let Ose=dn,q5=dn;const na=e=>e*1e3,Jo=e=>e/1e3,Rse={current:!1},vM=e=>Array.isArray(e)&&typeof e[0]=="number";function bM(e){return!!(!e||typeof e=="string"&&SM[e]||vM(e)||Array.isArray(e)&&e.every(bM))}const Kd=([e,t,n,r])=>`cubic-bezier(${e}, ${t}, ${n}, ${r})`,SM={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:Kd([0,.65,.55,1]),circOut:Kd([.55,0,1,.45]),backIn:Kd([.31,.01,.66,-.59]),backOut:Kd([.33,1.53,.69,.99])};function _M(e){if(e)return vM(e)?Kd(e):Array.isArray(e)?e.map(_M):SM[e]}function Ise(e,t,n,{delay:r=0,duration:i,repeat:o=0,repeatType:s="loop",ease:a,times:l}={}){const u={[t]:n};l&&(u.offset=l);const c=_M(a);return Array.isArray(c)&&(u.easing=c),e.animate(u,{delay:r,duration:i,easing:Array.isArray(c)?"linear":c,fill:"both",iterations:o+1,direction:s==="reverse"?"alternate":"normal"})}const tP={waapi:()=>Object.hasOwnProperty.call(Element.prototype,"animate")},HS={},wM={};for(const e in tP)wM[e]=()=>(HS[e]===void 0&&(HS[e]=tP[e]()),HS[e]);function Nse(e,{repeat:t,repeatType:n="loop"}){const r=t&&n!=="loop"&&t%2===1?0:e.length-1;return e[r]}const xM=(e,t,n)=>(((1-3*n+3*t)*e+(3*n-6*t))*e+3*t)*e,Mse=1e-7,Dse=12;function Lse(e,t,n,r,i){let o,s,a=0;do s=t+(n-t)/2,o=xM(s,r,i)-e,o>0?n=s:t=s;while(Math.abs(o)>Mse&&++aLse(o,0,1,e,n);return o=>o===0||o===1?o:xM(i(o),t,r)}const $se=wp(.42,0,1,1),Fse=wp(0,0,.58,1),CM=wp(.42,0,.58,1),Bse=e=>Array.isArray(e)&&typeof e[0]!="number",TM=e=>t=>t<=.5?e(2*t)/2:(2-e(2*(1-t)))/2,EM=e=>t=>1-e(1-t),PM=e=>1-Math.sin(Math.acos(e)),K5=EM(PM),jse=TM(K5),kM=wp(.33,1.53,.69,.99),Y5=EM(kM),Vse=TM(Y5),zse=e=>(e*=2)<1?.5*Y5(e):.5*(2-Math.pow(2,-10*(e-1))),Use={linear:dn,easeIn:$se,easeInOut:CM,easeOut:Fse,circIn:PM,circInOut:jse,circOut:K5,backIn:Y5,backInOut:Vse,backOut:kM,anticipate:zse},nP=e=>{if(Array.isArray(e)){q5(e.length===4);const[t,n,r,i]=e;return wp(t,n,r,i)}else if(typeof e=="string")return Use[e];return e},X5=(e,t)=>n=>!!(Sp(n)&&Voe.test(n)&&n.startsWith(e)||t&&Object.prototype.hasOwnProperty.call(n,t)),AM=(e,t,n)=>r=>{if(!Sp(r))return r;const[i,o,s,a]=r.match(i1);return{[e]:parseFloat(i),[t]:parseFloat(o),[n]:parseFloat(s),alpha:a!==void 0?parseFloat(a):1}},Gse=e=>fa(0,255,e),WS={...Ll,transform:e=>Math.round(Gse(e))},Ja={test:X5("rgb","red"),parse:AM("red","green","blue"),transform:({red:e,green:t,blue:n,alpha:r=1})=>"rgba("+WS.transform(e)+", "+WS.transform(t)+", "+WS.transform(n)+", "+gf(pf.transform(r))+")"};function Hse(e){let t="",n="",r="",i="";return e.length>5?(t=e.substring(1,3),n=e.substring(3,5),r=e.substring(5,7),i=e.substring(7,9)):(t=e.substring(1,2),n=e.substring(2,3),r=e.substring(3,4),i=e.substring(4,5),t+=t,n+=n,r+=r,i+=i),{red:parseInt(t,16),green:parseInt(n,16),blue:parseInt(r,16),alpha:i?parseInt(i,16)/255:1}}const _w={test:X5("#"),parse:Hse,transform:Ja.transform},Mu={test:X5("hsl","hue"),parse:AM("hue","saturation","lightness"),transform:({hue:e,saturation:t,lightness:n,alpha:r=1})=>"hsla("+Math.round(e)+", "+fo.transform(gf(t))+", "+fo.transform(gf(n))+", "+gf(pf.transform(r))+")"},rr={test:e=>Ja.test(e)||_w.test(e)||Mu.test(e),parse:e=>Ja.test(e)?Ja.parse(e):Mu.test(e)?Mu.parse(e):_w.parse(e),transform:e=>Sp(e)?e:e.hasOwnProperty("red")?Ja.transform(e):Mu.transform(e)},$t=(e,t,n)=>-n*e+n*t+e;function qS(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function Wse({hue:e,saturation:t,lightness:n,alpha:r}){e/=360,t/=100,n/=100;let i=0,o=0,s=0;if(!t)i=o=s=n;else{const a=n<.5?n*(1+t):n+t-n*t,l=2*n-a;i=qS(l,a,e+1/3),o=qS(l,a,e),s=qS(l,a,e-1/3)}return{red:Math.round(i*255),green:Math.round(o*255),blue:Math.round(s*255),alpha:r}}const KS=(e,t,n)=>{const r=e*e;return Math.sqrt(Math.max(0,n*(t*t-r)+r))},qse=[_w,Ja,Mu],Kse=e=>qse.find(t=>t.test(e));function rP(e){const t=Kse(e);let n=t.parse(e);return t===Mu&&(n=Wse(n)),n}const OM=(e,t)=>{const n=rP(e),r=rP(t),i={...n};return o=>(i.red=KS(n.red,r.red,o),i.green=KS(n.green,r.green,o),i.blue=KS(n.blue,r.blue,o),i.alpha=$t(n.alpha,r.alpha,o),Ja.transform(i))};function Yse(e){var t,n;return isNaN(e)&&Sp(e)&&(((t=e.match(i1))===null||t===void 0?void 0:t.length)||0)+(((n=e.match(eM))===null||n===void 0?void 0:n.length)||0)>0}const RM={regex:Boe,countKey:"Vars",token:"${v}",parse:dn},IM={regex:eM,countKey:"Colors",token:"${c}",parse:rr.parse},NM={regex:i1,countKey:"Numbers",token:"${n}",parse:Ll.parse};function YS(e,{regex:t,countKey:n,token:r,parse:i}){const o=e.tokenised.match(t);o&&(e["num"+n]=o.length,e.tokenised=e.tokenised.replace(t,r),e.values.push(...o.map(i)))}function My(e){const t=e.toString(),n={value:t,tokenised:t,values:[],numVars:0,numColors:0,numNumbers:0};return n.value.includes("var(--")&&YS(n,RM),YS(n,IM),YS(n,NM),n}function MM(e){return My(e).values}function DM(e){const{values:t,numColors:n,numVars:r,tokenised:i}=My(e),o=t.length;return s=>{let a=i;for(let l=0;ltypeof e=="number"?0:e;function Qse(e){const t=MM(e);return DM(e)(t.map(Xse))}const ha={test:Yse,parse:MM,createTransformer:DM,getAnimatableNone:Qse},LM=(e,t)=>n=>`${n>0?t:e}`;function $M(e,t){return typeof e=="number"?n=>$t(e,t,n):rr.test(e)?OM(e,t):e.startsWith("var(")?LM(e,t):BM(e,t)}const FM=(e,t)=>{const n=[...e],r=n.length,i=e.map((o,s)=>$M(o,t[s]));return o=>{for(let s=0;s{const n={...e,...t},r={};for(const i in n)e[i]!==void 0&&t[i]!==void 0&&(r[i]=$M(e[i],t[i]));return i=>{for(const o in r)n[o]=r[o](i);return n}},BM=(e,t)=>{const n=ha.createTransformer(t),r=My(e),i=My(t);return r.numVars===i.numVars&&r.numColors===i.numColors&&r.numNumbers>=i.numNumbers?ta(FM(r.values,i.values),n):LM(e,t)},fh=(e,t,n)=>{const r=t-e;return r===0?1:(n-e)/r},iP=(e,t)=>n=>$t(e,t,n);function Jse(e){return typeof e=="number"?iP:typeof e=="string"?rr.test(e)?OM:BM:Array.isArray(e)?FM:typeof e=="object"?Zse:iP}function eae(e,t,n){const r=[],i=n||Jse(e[0]),o=e.length-1;for(let s=0;st[0];e[0]>e[o-1]&&(e=[...e].reverse(),t=[...t].reverse());const s=eae(t,r,i),a=s.length,l=u=>{let c=0;if(a>1)for(;cl(fa(e[0],e[o-1],u)):l}function tae(e,t){const n=e[e.length-1];for(let r=1;r<=t;r++){const i=fh(0,t,r);e.push($t(n,1,i))}}function nae(e){const t=[0];return tae(t,e.length-1),t}function rae(e,t){return e.map(n=>n*t)}function iae(e,t){return e.map(()=>t||CM).splice(0,e.length-1)}function Dy({duration:e=300,keyframes:t,times:n,ease:r="easeInOut"}){const i=Bse(r)?r.map(nP):nP(r),o={done:!1,value:t[0]},s=rae(n&&n.length===t.length?n:nae(t),e),a=jM(s,t,{ease:Array.isArray(i)?i:iae(t,i)});return{calculatedDuration:e,next:l=>(o.value=a(l),o.done=l>=e,o)}}function VM(e,t){return t?e*(1e3/t):0}const oae=5;function zM(e,t,n){const r=Math.max(t-oae,0);return VM(n-e(r),t-r)}const XS=.001,sae=.01,oP=10,aae=.05,lae=1;function uae({duration:e=800,bounce:t=.25,velocity:n=0,mass:r=1}){let i,o;Ose(e<=na(oP));let s=1-t;s=fa(aae,lae,s),e=fa(sae,oP,Jo(e)),s<1?(i=u=>{const c=u*s,d=c*e,f=c-n,h=ww(u,s),p=Math.exp(-d);return XS-f/h*p},o=u=>{const d=u*s*e,f=d*n+n,h=Math.pow(s,2)*Math.pow(u,2)*e,p=Math.exp(-d),m=ww(Math.pow(u,2),s);return(-i(u)+XS>0?-1:1)*((f-h)*p)/m}):(i=u=>{const c=Math.exp(-u*e),d=(u-n)*e+1;return-XS+c*d},o=u=>{const c=Math.exp(-u*e),d=(n-u)*(e*e);return c*d});const a=5/e,l=dae(i,o,a);if(e=na(e),isNaN(l))return{stiffness:100,damping:10,duration:e};{const u=Math.pow(l,2)*r;return{stiffness:u,damping:s*2*Math.sqrt(r*u),duration:e}}}const cae=12;function dae(e,t,n){let r=n;for(let i=1;ie[n]!==void 0)}function pae(e){let t={velocity:0,stiffness:100,damping:10,mass:1,isResolvedFromDuration:!1,...e};if(!sP(e,hae)&&sP(e,fae)){const n=uae(e);t={...t,...n,velocity:0,mass:1},t.isResolvedFromDuration=!0}return t}function UM({keyframes:e,restDelta:t,restSpeed:n,...r}){const i=e[0],o=e[e.length-1],s={done:!1,value:i},{stiffness:a,damping:l,mass:u,velocity:c,duration:d,isResolvedFromDuration:f}=pae(r),h=c?-Jo(c):0,p=l/(2*Math.sqrt(a*u)),m=o-i,S=Jo(Math.sqrt(a/u)),v=Math.abs(m)<5;n||(n=v?.01:2),t||(t=v?.005:.5);let y;if(p<1){const g=ww(S,p);y=b=>{const _=Math.exp(-p*S*b);return o-_*((h+p*S*m)/g*Math.sin(g*b)+m*Math.cos(g*b))}}else if(p===1)y=g=>o-Math.exp(-S*g)*(m+(h+S*m)*g);else{const g=S*Math.sqrt(p*p-1);y=b=>{const _=Math.exp(-p*S*b),w=Math.min(g*b,300);return o-_*((h+p*S*m)*Math.sinh(w)+g*m*Math.cosh(w))/g}}return{calculatedDuration:f&&d||null,next:g=>{const b=y(g);if(f)s.done=g>=d;else{let _=h;g!==0&&(p<1?_=zM(y,g,b):_=0);const w=Math.abs(_)<=n,x=Math.abs(o-b)<=t;s.done=w&&x}return s.value=s.done?o:b,s}}}function aP({keyframes:e,velocity:t=0,power:n=.8,timeConstant:r=325,bounceDamping:i=10,bounceStiffness:o=500,modifyTarget:s,min:a,max:l,restDelta:u=.5,restSpeed:c}){const d=e[0],f={done:!1,value:d},h=C=>a!==void 0&&Cl,p=C=>a===void 0?l:l===void 0||Math.abs(a-C)-m*Math.exp(-C/r),g=C=>v+y(C),b=C=>{const k=y(C),P=g(C);f.done=Math.abs(k)<=u,f.value=f.done?v:P};let _,w;const x=C=>{h(f.value)&&(_=C,w=UM({keyframes:[f.value,p(f.value)],velocity:zM(g,C,f.value),damping:i,stiffness:o,restDelta:u,restSpeed:c}))};return x(0),{calculatedDuration:null,next:C=>{let k=!1;return!w&&_===void 0&&(k=!0,b(C),x(C)),_!==void 0&&C>_?w.next(C-_):(!k&&b(C),f)}}}const gae=e=>{const t=({timestamp:n})=>e(n);return{start:()=>kt.update(t,!0),stop:()=>ls(t),now:()=>It.isProcessing?It.timestamp:performance.now()}},lP=2e4;function uP(e){let t=0;const n=50;let r=e.next(t);for(;!r.done&&t=lP?1/0:t}const mae={decay:aP,inertia:aP,tween:Dy,keyframes:Dy,spring:UM};function Ly({autoplay:e=!0,delay:t=0,driver:n=gae,keyframes:r,type:i="keyframes",repeat:o=0,repeatDelay:s=0,repeatType:a="loop",onPlay:l,onStop:u,onComplete:c,onUpdate:d,...f}){let h=1,p=!1,m,S;const v=()=>{m&&m(),S=new Promise(V=>{m=V})};v();let y;const g=mae[i]||Dy;let b;g!==Dy&&typeof r[0]!="number"&&(b=jM([0,100],r,{clamp:!1}),r=[0,100]);const _=g({...f,keyframes:r});let w;a==="mirror"&&(w=g({...f,keyframes:[...r].reverse(),velocity:-(f.velocity||0)}));let x="idle",C=null,k=null,P=null;_.calculatedDuration===null&&o&&(_.calculatedDuration=uP(_));const{calculatedDuration:A}=_;let $=1/0,M=1/0;A!==null&&($=A+s,M=$*(o+1)-s);let T=0;const O=V=>{if(k===null)return;h>0&&(k=Math.min(k,V)),h<0&&(k=Math.min(V-M/h,k)),C!==null?T=C:T=Math.round(V-k)*h;const z=T-t*(h>=0?1:-1),U=h>=0?z<0:z>M;T=Math.max(z,0),x==="finished"&&C===null&&(T=M);let K=T,q=_;if(o){const Q=T/$;let J=Math.floor(Q),ne=Q%1;!ne&&Q>=1&&(ne=1),ne===1&&J--,J=Math.min(J,o+1);const Z=!!(J%2);Z&&(a==="reverse"?(ne=1-ne,s&&(ne-=s/$)):a==="mirror"&&(q=w));let ge=fa(0,1,ne);T>M&&(ge=a==="reverse"&&Z?1:0),K=ge*$}const X=U?{done:!1,value:r[0]}:q.next(K);b&&(X.value=b(X.value));let{done:F}=X;!U&&A!==null&&(F=h>=0?T>=M:T<=0);const W=C===null&&(x==="finished"||x==="running"&&F);return d&&d(X.value),W&&R(),X},I=()=>{y&&y.stop(),y=void 0},N=()=>{x="idle",I(),v(),k=P=null},R=()=>{x="finished",c&&c(),I(),v()},D=()=>{if(p)return;y||(y=n(O));const V=y.now();l&&l(),C!==null?k=V-C:(!k||x==="finished")&&(k=V),P=k,C=null,x="running",y.start()};e&&D();const L={then(V,z){return S.then(V,z)},get time(){return Jo(T)},set time(V){V=na(V),T=V,C!==null||!y||h===0?C=V:k=y.now()-V/h},get duration(){const V=_.calculatedDuration===null?uP(_):_.calculatedDuration;return Jo(V)},get speed(){return h},set speed(V){V===h||!y||(h=V,L.time=Jo(T))},get state(){return x},play:D,pause:()=>{x="paused",C=T},stop:()=>{p=!0,x!=="idle"&&(x="idle",u&&u(),N())},cancel:()=>{P!==null&&O(P),N()},complete:()=>{x="finished"},sample:V=>(k=0,O(V))};return L}const yae=new Set(["opacity","clipPath","filter","transform","backgroundColor"]),Sg=10,vae=2e4,bae=(e,t)=>t.type==="spring"||e==="backgroundColor"||!bM(t.ease);function Sae(e,t,{onUpdate:n,onComplete:r,...i}){if(!(wM.waapi()&&yae.has(t)&&!i.repeatDelay&&i.repeatType!=="mirror"&&i.damping!==0&&i.type!=="inertia"))return!1;let s=!1,a,l;const u=()=>{l=new Promise(v=>{a=v})};u();let{keyframes:c,duration:d=300,ease:f,times:h}=i;if(bae(t,i)){const v=Ly({...i,repeat:0,delay:0});let y={done:!1,value:c[0]};const g=[];let b=0;for(;!y.done&&bp.cancel(),S=()=>{kt.update(m),a(),u()};return p.onfinish=()=>{e.set(Nse(c,i)),r&&r(),S()},{then(v,y){return l.then(v,y)},get time(){return Jo(p.currentTime||0)},set time(v){p.currentTime=na(v)},get speed(){return p.playbackRate},set speed(v){p.playbackRate=v},get duration(){return Jo(d)},play:()=>{s||(p.play(),ls(m))},pause:()=>p.pause(),stop:()=>{if(s=!0,p.playState==="idle")return;const{currentTime:v}=p;if(v){const y=Ly({...i,autoplay:!1});e.setWithVelocity(y.sample(v-Sg).value,y.sample(v).value,Sg)}S()},complete:()=>p.finish(),cancel:S}}function _ae({keyframes:e,delay:t,onUpdate:n,onComplete:r}){const i=()=>(n&&n(e[e.length-1]),r&&r(),{time:0,speed:1,duration:0,play:dn,pause:dn,stop:dn,then:o=>(o(),Promise.resolve()),cancel:dn,complete:dn});return t?Ly({keyframes:[0,1],duration:0,delay:t,onComplete:i}):i()}const wae={type:"spring",stiffness:500,damping:25,restSpeed:10},xae=e=>({type:"spring",stiffness:550,damping:e===0?2*Math.sqrt(550):30,restSpeed:10}),Cae={type:"keyframes",duration:.8},Tae={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},Eae=(e,{keyframes:t})=>t.length>2?Cae:Dl.has(e)?e.startsWith("scale")?xae(t[1]):wae:Tae,xw=(e,t)=>e==="zIndex"?!1:!!(typeof t=="number"||Array.isArray(t)||typeof t=="string"&&(ha.test(t)||t==="0")&&!t.startsWith("url(")),Pae=new Set(["brightness","contrast","saturate","opacity"]);function kae(e){const[t,n]=e.slice(0,-1).split("(");if(t==="drop-shadow")return e;const[r]=n.match(i1)||[];if(!r)return e;const i=n.replace(r,"");let o=Pae.has(t)?1:0;return r!==n&&(o*=100),t+"("+o+i+")"}const Aae=/([a-z-]*)\(.*?\)/g,Cw={...ha,getAnimatableNone:e=>{const t=e.match(Aae);return t?t.map(kae).join(" "):e}},Oae={...tM,color:rr,backgroundColor:rr,outlineColor:rr,fill:rr,stroke:rr,borderColor:rr,borderTopColor:rr,borderRightColor:rr,borderBottomColor:rr,borderLeftColor:rr,filter:Cw,WebkitFilter:Cw},Q5=e=>Oae[e];function GM(e,t){let n=Q5(e);return n!==Cw&&(n=ha),n.getAnimatableNone?n.getAnimatableNone(t):void 0}const HM=e=>/^0[^.\s]+$/.test(e);function Rae(e){if(typeof e=="number")return e===0;if(e!==null)return e==="none"||e==="0"||HM(e)}function Iae(e,t,n,r){const i=xw(t,n);let o;Array.isArray(n)?o=[...n]:o=[null,n];const s=r.from!==void 0?r.from:e.get();let a;const l=[];for(let u=0;ui=>{const o=WM(r,e)||{},s=o.delay||r.delay||0;let{elapsed:a=0}=r;a=a-na(s);const l=Iae(t,e,n,o),u=l[0],c=l[l.length-1],d=xw(e,u),f=xw(e,c);let h={keyframes:l,velocity:t.getVelocity(),ease:"easeOut",...o,delay:-a,onUpdate:p=>{t.set(p),o.onUpdate&&o.onUpdate(p)},onComplete:()=>{i(),o.onComplete&&o.onComplete()}};if(Nae(o)||(h={...h,...Eae(e,h)}),h.duration&&(h.duration=na(h.duration)),h.repeatDelay&&(h.repeatDelay=na(h.repeatDelay)),!d||!f||Rse.current||o.type===!1)return _ae(h);if(t.owner&&t.owner.current instanceof HTMLElement&&!t.owner.getProps().onUpdate){const p=Sae(t,e,h);if(p)return p}return Ly(h)};function $y(e){return!!(kr(e)&&e.add)}const Mae=e=>/^\-?\d*\.?\d+$/.test(e);function J5(e,t){e.indexOf(t)===-1&&e.push(t)}function e3(e,t){const n=e.indexOf(t);n>-1&&e.splice(n,1)}class t3{constructor(){this.subscriptions=[]}add(t){return J5(this.subscriptions,t),()=>e3(this.subscriptions,t)}notify(t,n,r){const i=this.subscriptions.length;if(i)if(i===1)this.subscriptions[0](t,n,r);else for(let o=0;o!isNaN(parseFloat(e));class Lae{constructor(t,n={}){this.version="10.12.17",this.timeDelta=0,this.lastUpdated=0,this.canTrackVelocity=!1,this.events={},this.updateAndNotify=(r,i=!0)=>{this.prev=this.current,this.current=r;const{delta:o,timestamp:s}=It;this.lastUpdated!==s&&(this.timeDelta=o,this.lastUpdated=s,kt.postRender(this.scheduleVelocityCheck)),this.prev!==this.current&&this.events.change&&this.events.change.notify(this.current),this.events.velocityChange&&this.events.velocityChange.notify(this.getVelocity()),i&&this.events.renderRequest&&this.events.renderRequest.notify(this.current)},this.scheduleVelocityCheck=()=>kt.postRender(this.velocityCheck),this.velocityCheck=({timestamp:r})=>{r!==this.lastUpdated&&(this.prev=this.current,this.events.velocityChange&&this.events.velocityChange.notify(this.getVelocity()))},this.hasAnimated=!1,this.prev=this.current=t,this.canTrackVelocity=Dae(this.current),this.owner=n.owner}onChange(t){return this.on("change",t)}on(t,n){this.events[t]||(this.events[t]=new t3);const r=this.events[t].add(n);return t==="change"?()=>{r(),kt.read(()=>{this.events.change.getSize()||this.stop()})}:r}clearListeners(){for(const t in this.events)this.events[t].clear()}attach(t,n){this.passiveEffect=t,this.stopPassiveEffect=n}set(t,n=!0){!n||!this.passiveEffect?this.updateAndNotify(t,n):this.passiveEffect(t,this.updateAndNotify)}setWithVelocity(t,n,r){this.set(n),this.prev=t,this.timeDelta=r}jump(t){this.updateAndNotify(t),this.prev=t,this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}get(){return this.current}getPrevious(){return this.prev}getVelocity(){return this.canTrackVelocity?VM(parseFloat(this.current)-parseFloat(this.prev),this.timeDelta):0}start(t){return this.stop(),new Promise(n=>{this.hasAnimated=!0,this.animation=t(n),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function Ec(e,t){return new Lae(e,t)}const qM=e=>t=>t.test(e),$ae={test:e=>e==="auto",parse:e=>e},KM=[Ll,Se,fo,Ps,Uoe,zoe,$ae],Cd=e=>KM.find(qM(e)),Fae=[...KM,rr,ha],Bae=e=>Fae.find(qM(e));function jae(e,t,n){e.hasValue(t)?e.getValue(t).set(n):e.addValue(t,Ec(n))}function Vae(e,t){const n=a1(e,t);let{transitionEnd:r={},transition:i={},...o}=n?e.makeTargetAnimatable(n,!1):{};o={...o,...r};for(const s in o){const a=rse(o[s]);jae(e,s,a)}}function zae(e,t,n){var r,i;const o=Object.keys(t).filter(a=>!e.hasValue(a)),s=o.length;if(s)for(let a=0;al.remove(d))),u.push(m)}return s&&Promise.all(u).then(()=>{s&&Vae(e,s)}),u}function Tw(e,t,n={}){const r=a1(e,t,n.custom);let{transition:i=e.getDefaultTransition()||{}}=r||{};n.transitionOverride&&(i=n.transitionOverride);const o=r?()=>Promise.all(YM(e,r,n)):()=>Promise.resolve(),s=e.variantChildren&&e.variantChildren.size?(l=0)=>{const{delayChildren:u=0,staggerChildren:c,staggerDirection:d}=i;return Wae(e,t,u+l,c,d,n)}:()=>Promise.resolve(),{when:a}=i;if(a){const[l,u]=a==="beforeChildren"?[o,s]:[s,o];return l().then(()=>u())}else return Promise.all([o(),s(n.delay)])}function Wae(e,t,n=0,r=0,i=1,o){const s=[],a=(e.variantChildren.size-1)*r,l=i===1?(u=0)=>u*r:(u=0)=>a-u*r;return Array.from(e.variantChildren).sort(qae).forEach((u,c)=>{u.notify("AnimationStart",t),s.push(Tw(u,t,{...o,delay:n+l(c)}).then(()=>u.notify("AnimationComplete",t)))}),Promise.all(s)}function qae(e,t){return e.sortNodePosition(t)}function Kae(e,t,n={}){e.notify("AnimationStart",t);let r;if(Array.isArray(t)){const i=t.map(o=>Tw(e,o,n));r=Promise.all(i)}else if(typeof t=="string")r=Tw(e,t,n);else{const i=typeof t=="function"?a1(e,t,n.custom):t;r=Promise.all(YM(e,i,n))}return r.then(()=>e.notify("AnimationComplete",t))}const Yae=[...L5].reverse(),Xae=L5.length;function Qae(e){return t=>Promise.all(t.map(({animation:n,options:r})=>Kae(e,n,r)))}function Zae(e){let t=Qae(e);const n=ele();let r=!0;const i=(l,u)=>{const c=a1(e,u);if(c){const{transition:d,transitionEnd:f,...h}=c;l={...l,...h,...f}}return l};function o(l){t=l(e)}function s(l,u){const c=e.getProps(),d=e.getVariantContext(!0)||{},f=[],h=new Set;let p={},m=1/0;for(let v=0;vm&&_;const P=Array.isArray(b)?b:[b];let A=P.reduce(i,{});w===!1&&(A={});const{prevResolvedValues:$={}}=g,M={...$,...A},T=O=>{k=!0,h.delete(O),g.needsAnimating[O]=!0};for(const O in M){const I=A[O],N=$[O];p.hasOwnProperty(O)||(I!==N?Ny(I)&&Ny(N)?!yM(I,N)||C?T(O):g.protectedKeys[O]=!0:I!==void 0?T(O):h.add(O):I!==void 0&&h.has(O)?T(O):g.protectedKeys[O]=!0)}g.prevProp=b,g.prevResolvedValues=A,g.isActive&&(p={...p,...A}),r&&e.blockInitialAnimation&&(k=!1),k&&!x&&f.push(...P.map(O=>({animation:O,options:{type:y,...l}})))}if(h.size){const v={};h.forEach(y=>{const g=e.getBaseTarget(y);g!==void 0&&(v[y]=g)}),f.push({animation:v})}let S=!!f.length;return r&&c.initial===!1&&!e.manuallyAnimateOnMount&&(S=!1),r=!1,S?t(f):Promise.resolve()}function a(l,u,c){var d;if(n[l].isActive===u)return Promise.resolve();(d=e.variantChildren)===null||d===void 0||d.forEach(h=>{var p;return(p=h.animationState)===null||p===void 0?void 0:p.setActive(l,u)}),n[l].isActive=u;const f=s(c,l);for(const h in n)n[h].protectedKeys={};return f}return{animateChanges:s,setActive:a,setAnimateFunction:o,getState:()=>n}}function Jae(e,t){return typeof t=="string"?t!==e:Array.isArray(t)?!yM(t,e):!1}function $a(e=!1){return{isActive:e,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function ele(){return{animate:$a(!0),whileInView:$a(),whileHover:$a(),whileTap:$a(),whileDrag:$a(),whileFocus:$a(),exit:$a()}}class tle extends Pa{constructor(t){super(t),t.animationState||(t.animationState=Zae(t))}updateAnimationControlsSubscription(){const{animate:t}=this.node.getProps();this.unmount(),n1(t)&&(this.unmount=t.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:t}=this.node.getProps(),{animate:n}=this.node.prevProps||{};t!==n&&this.updateAnimationControlsSubscription()}unmount(){}}let nle=0;class rle extends Pa{constructor(){super(...arguments),this.id=nle++}update(){if(!this.node.presenceContext)return;const{isPresent:t,onExitComplete:n,custom:r}=this.node.presenceContext,{isPresent:i}=this.node.prevPresenceContext||{};if(!this.node.animationState||t===i)return;const o=this.node.animationState.setActive("exit",!t,{custom:r??this.node.getProps().custom});n&&!t&&o.then(()=>n(this.id))}mount(){const{register:t}=this.node.presenceContext||{};t&&(this.unmount=t(this.id))}unmount(){}}const ile={animation:{Feature:tle},exit:{Feature:rle}},cP=(e,t)=>Math.abs(e-t);function ole(e,t){const n=cP(e.x,t.x),r=cP(e.y,t.y);return Math.sqrt(n**2+r**2)}class XM{constructor(t,n,{transformPagePoint:r}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const u=ZS(this.lastMoveEventInfo,this.history),c=this.startEvent!==null,d=ole(u.offset,{x:0,y:0})>=3;if(!c&&!d)return;const{point:f}=u,{timestamp:h}=It;this.history.push({...f,timestamp:h});const{onStart:p,onMove:m}=this.handlers;c||(p&&p(this.lastMoveEvent,u),this.startEvent=this.lastMoveEvent),m&&m(this.lastMoveEvent,u)},this.handlePointerMove=(u,c)=>{this.lastMoveEvent=u,this.lastMoveEventInfo=QS(c,this.transformPagePoint),kt.update(this.updatePoint,!0)},this.handlePointerUp=(u,c)=>{if(this.end(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const{onEnd:d,onSessionEnd:f}=this.handlers,h=ZS(u.type==="pointercancel"?this.lastMoveEventInfo:QS(c,this.transformPagePoint),this.history);this.startEvent&&d&&d(u,h),f&&f(u,h)},!dM(t))return;this.handlers=n,this.transformPagePoint=r;const i=o1(t),o=QS(i,this.transformPagePoint),{point:s}=o,{timestamp:a}=It;this.history=[{...s,timestamp:a}];const{onSessionStart:l}=n;l&&l(t,ZS(o,this.history)),this.removeListeners=ta(Zo(window,"pointermove",this.handlePointerMove),Zo(window,"pointerup",this.handlePointerUp),Zo(window,"pointercancel",this.handlePointerUp))}updateHandlers(t){this.handlers=t}end(){this.removeListeners&&this.removeListeners(),ls(this.updatePoint)}}function QS(e,t){return t?{point:t(e.point)}:e}function dP(e,t){return{x:e.x-t.x,y:e.y-t.y}}function ZS({point:e},t){return{point:e,delta:dP(e,QM(t)),offset:dP(e,sle(t)),velocity:ale(t,.1)}}function sle(e){return e[0]}function QM(e){return e[e.length-1]}function ale(e,t){if(e.length<2)return{x:0,y:0};let n=e.length-1,r=null;const i=QM(e);for(;n>=0&&(r=e[n],!(i.timestamp-r.timestamp>na(t)));)n--;if(!r)return{x:0,y:0};const o=Jo(i.timestamp-r.timestamp);if(o===0)return{x:0,y:0};const s={x:(i.x-r.x)/o,y:(i.y-r.y)/o};return s.x===1/0&&(s.x=0),s.y===1/0&&(s.y=0),s}function Vr(e){return e.max-e.min}function Ew(e,t=0,n=.01){return Math.abs(e-t)<=n}function fP(e,t,n,r=.5){e.origin=r,e.originPoint=$t(t.min,t.max,e.origin),e.scale=Vr(n)/Vr(t),(Ew(e.scale,1,1e-4)||isNaN(e.scale))&&(e.scale=1),e.translate=$t(n.min,n.max,e.origin)-e.originPoint,(Ew(e.translate)||isNaN(e.translate))&&(e.translate=0)}function mf(e,t,n,r){fP(e.x,t.x,n.x,r?r.originX:void 0),fP(e.y,t.y,n.y,r?r.originY:void 0)}function hP(e,t,n){e.min=n.min+t.min,e.max=e.min+Vr(t)}function lle(e,t,n){hP(e.x,t.x,n.x),hP(e.y,t.y,n.y)}function pP(e,t,n){e.min=t.min-n.min,e.max=e.min+Vr(t)}function yf(e,t,n){pP(e.x,t.x,n.x),pP(e.y,t.y,n.y)}function ule(e,{min:t,max:n},r){return t!==void 0&&en&&(e=r?$t(n,e,r.max):Math.min(e,n)),e}function gP(e,t,n){return{min:t!==void 0?e.min+t:void 0,max:n!==void 0?e.max+n-(e.max-e.min):void 0}}function cle(e,{top:t,left:n,bottom:r,right:i}){return{x:gP(e.x,n,i),y:gP(e.y,t,r)}}function mP(e,t){let n=t.min-e.min,r=t.max-e.max;return t.max-t.minr?n=fh(t.min,t.max-r,e.min):r>i&&(n=fh(e.min,e.max-i,t.min)),fa(0,1,n)}function hle(e,t){const n={};return t.min!==void 0&&(n.min=t.min-e.min),t.max!==void 0&&(n.max=t.max-e.min),n}const Pw=.35;function ple(e=Pw){return e===!1?e=0:e===!0&&(e=Pw),{x:yP(e,"left","right"),y:yP(e,"top","bottom")}}function yP(e,t,n){return{min:vP(e,t),max:vP(e,n)}}function vP(e,t){return typeof e=="number"?e:e[t]||0}const bP=()=>({translate:0,scale:1,origin:0,originPoint:0}),Du=()=>({x:bP(),y:bP()}),SP=()=>({min:0,max:0}),en=()=>({x:SP(),y:SP()});function Hi(e){return[e("x"),e("y")]}function ZM({top:e,left:t,right:n,bottom:r}){return{x:{min:t,max:n},y:{min:e,max:r}}}function gle({x:e,y:t}){return{top:t.min,right:e.max,bottom:t.max,left:e.min}}function mle(e,t){if(!t)return e;const n=t({x:e.left,y:e.top}),r=t({x:e.right,y:e.bottom});return{top:n.y,left:n.x,bottom:r.y,right:r.x}}function JS(e){return e===void 0||e===1}function kw({scale:e,scaleX:t,scaleY:n}){return!JS(e)||!JS(t)||!JS(n)}function Ua(e){return kw(e)||JM(e)||e.z||e.rotate||e.rotateX||e.rotateY}function JM(e){return _P(e.x)||_P(e.y)}function _P(e){return e&&e!=="0%"}function Fy(e,t,n){const r=e-n,i=t*r;return n+i}function wP(e,t,n,r,i){return i!==void 0&&(e=Fy(e,i,r)),Fy(e,n,r)+t}function Aw(e,t=0,n=1,r,i){e.min=wP(e.min,t,n,r,i),e.max=wP(e.max,t,n,r,i)}function eD(e,{x:t,y:n}){Aw(e.x,t.translate,t.scale,t.originPoint),Aw(e.y,n.translate,n.scale,n.originPoint)}function yle(e,t,n,r=!1){const i=n.length;if(!i)return;t.x=t.y=1;let o,s;for(let a=0;a1.0000000000001||e<.999999999999?e:1}function Ms(e,t){e.min=e.min+t,e.max=e.max+t}function CP(e,t,[n,r,i]){const o=t[i]!==void 0?t[i]:.5,s=$t(e.min,e.max,o);Aw(e,t[n],t[r],s,t.scale)}const vle=["x","scaleX","originX"],ble=["y","scaleY","originY"];function Lu(e,t){CP(e.x,t,vle),CP(e.y,t,ble)}function tD(e,t){return ZM(mle(e.getBoundingClientRect(),t))}function Sle(e,t,n){const r=tD(e,n),{scroll:i}=t;return i&&(Ms(r.x,i.offset.x),Ms(r.y,i.offset.y)),r}const _le=new WeakMap;class wle{constructor(t){this.openGlobalLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=en(),this.visualElement=t}start(t,{snapToCursor:n=!1}={}){const{presenceContext:r}=this.visualElement;if(r&&r.isPresent===!1)return;const i=l=>{this.stopAnimation(),n&&this.snapToCursor(o1(l,"page").point)},o=(l,u)=>{const{drag:c,dragPropagation:d,onDragStart:f}=this.getProps();if(c&&!d&&(this.openGlobalLock&&this.openGlobalLock(),this.openGlobalLock=hM(c),!this.openGlobalLock))return;this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),Hi(p=>{let m=this.getAxisMotionValue(p).get()||0;if(fo.test(m)){const{projection:S}=this.visualElement;if(S&&S.layout){const v=S.layout.layoutBox[p];v&&(m=Vr(v)*(parseFloat(m)/100))}}this.originPoint[p]=m}),f&&kt.update(()=>f(l,u),!1,!0);const{animationState:h}=this.visualElement;h&&h.setActive("whileDrag",!0)},s=(l,u)=>{const{dragPropagation:c,dragDirectionLock:d,onDirectionLock:f,onDrag:h}=this.getProps();if(!c&&!this.openGlobalLock)return;const{offset:p}=u;if(d&&this.currentDirection===null){this.currentDirection=xle(p),this.currentDirection!==null&&f&&f(this.currentDirection);return}this.updateAxis("x",u.point,p),this.updateAxis("y",u.point,p),this.visualElement.render(),h&&h(l,u)},a=(l,u)=>this.stop(l,u);this.panSession=new XM(t,{onSessionStart:i,onStart:o,onMove:s,onSessionEnd:a},{transformPagePoint:this.visualElement.getTransformPagePoint()})}stop(t,n){const r=this.isDragging;if(this.cancel(),!r)return;const{velocity:i}=n;this.startAnimation(i);const{onDragEnd:o}=this.getProps();o&&kt.update(()=>o(t,n))}cancel(){this.isDragging=!1;const{projection:t,animationState:n}=this.visualElement;t&&(t.isAnimationBlocked=!1),this.panSession&&this.panSession.end(),this.panSession=void 0;const{dragPropagation:r}=this.getProps();!r&&this.openGlobalLock&&(this.openGlobalLock(),this.openGlobalLock=null),n&&n.setActive("whileDrag",!1)}updateAxis(t,n,r){const{drag:i}=this.getProps();if(!r||!_g(t,i,this.currentDirection))return;const o=this.getAxisMotionValue(t);let s=this.originPoint[t]+r[t];this.constraints&&this.constraints[t]&&(s=ule(s,this.constraints[t],this.elastic[t])),o.set(s)}resolveConstraints(){const{dragConstraints:t,dragElastic:n}=this.getProps(),{layout:r}=this.visualElement.projection||{},i=this.constraints;t&&Nu(t)?this.constraints||(this.constraints=this.resolveRefConstraints()):t&&r?this.constraints=cle(r.layoutBox,t):this.constraints=!1,this.elastic=ple(n),i!==this.constraints&&r&&this.constraints&&!this.hasMutatedConstraints&&Hi(o=>{this.getAxisMotionValue(o)&&(this.constraints[o]=hle(r.layoutBox[o],this.constraints[o]))})}resolveRefConstraints(){const{dragConstraints:t,onMeasureDragConstraints:n}=this.getProps();if(!t||!Nu(t))return!1;const r=t.current,{projection:i}=this.visualElement;if(!i||!i.layout)return!1;const o=Sle(r,i.root,this.visualElement.getTransformPagePoint());let s=dle(i.layout.layoutBox,o);if(n){const a=n(gle(s));this.hasMutatedConstraints=!!a,a&&(s=ZM(a))}return s}startAnimation(t){const{drag:n,dragMomentum:r,dragElastic:i,dragTransition:o,dragSnapToOrigin:s,onDragTransitionEnd:a}=this.getProps(),l=this.constraints||{},u=Hi(c=>{if(!_g(c,n,this.currentDirection))return;let d=l&&l[c]||{};s&&(d={min:0,max:0});const f=i?200:1e6,h=i?40:1e7,p={type:"inertia",velocity:r?t[c]:0,bounceStiffness:f,bounceDamping:h,timeConstant:750,restDelta:1,restSpeed:10,...o,...d};return this.startAxisValueAnimation(c,p)});return Promise.all(u).then(a)}startAxisValueAnimation(t,n){const r=this.getAxisMotionValue(t);return r.start(Z5(t,r,0,n))}stopAnimation(){Hi(t=>this.getAxisMotionValue(t).stop())}getAxisMotionValue(t){const n="_drag"+t.toUpperCase(),r=this.visualElement.getProps(),i=r[n];return i||this.visualElement.getValue(t,(r.initial?r.initial[t]:void 0)||0)}snapToCursor(t){Hi(n=>{const{drag:r}=this.getProps();if(!_g(n,r,this.currentDirection))return;const{projection:i}=this.visualElement,o=this.getAxisMotionValue(n);if(i&&i.layout){const{min:s,max:a}=i.layout.layoutBox[n];o.set(t[n]-$t(s,a,.5))}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:t,dragConstraints:n}=this.getProps(),{projection:r}=this.visualElement;if(!Nu(n)||!r||!this.constraints)return;this.stopAnimation();const i={x:0,y:0};Hi(s=>{const a=this.getAxisMotionValue(s);if(a){const l=a.get();i[s]=fle({min:l,max:l},this.constraints[s])}});const{transformTemplate:o}=this.visualElement.getProps();this.visualElement.current.style.transform=o?o({},""):"none",r.root&&r.root.updateScroll(),r.updateLayout(),this.resolveConstraints(),Hi(s=>{if(!_g(s,t,null))return;const a=this.getAxisMotionValue(s),{min:l,max:u}=this.constraints[s];a.set($t(l,u,i[s]))})}addListeners(){if(!this.visualElement.current)return;_le.set(this.visualElement,this);const t=this.visualElement.current,n=Zo(t,"pointerdown",l=>{const{drag:u,dragListener:c=!0}=this.getProps();u&&c&&this.start(l)}),r=()=>{const{dragConstraints:l}=this.getProps();Nu(l)&&(this.constraints=this.resolveRefConstraints())},{projection:i}=this.visualElement,o=i.addEventListener("measure",r);i&&!i.layout&&(i.root&&i.root.updateScroll(),i.updateLayout()),r();const s=Yo(window,"resize",()=>this.scalePositionWithinConstraints()),a=i.addEventListener("didUpdate",({delta:l,hasLayoutChanged:u})=>{this.isDragging&&u&&(Hi(c=>{const d=this.getAxisMotionValue(c);d&&(this.originPoint[c]+=l[c].translate,d.set(d.get()+l[c].translate))}),this.visualElement.render())});return()=>{s(),n(),o(),a&&a()}}getProps(){const t=this.visualElement.getProps(),{drag:n=!1,dragDirectionLock:r=!1,dragPropagation:i=!1,dragConstraints:o=!1,dragElastic:s=Pw,dragMomentum:a=!0}=t;return{...t,drag:n,dragDirectionLock:r,dragPropagation:i,dragConstraints:o,dragElastic:s,dragMomentum:a}}}function _g(e,t,n){return(t===!0||t===e)&&(n===null||n===e)}function xle(e,t=10){let n=null;return Math.abs(e.y)>t?n="y":Math.abs(e.x)>t&&(n="x"),n}class Cle extends Pa{constructor(t){super(t),this.removeGroupControls=dn,this.removeListeners=dn,this.controls=new wle(t)}mount(){const{dragControls:t}=this.node.getProps();t&&(this.removeGroupControls=t.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||dn}unmount(){this.removeGroupControls(),this.removeListeners()}}const TP=e=>(t,n)=>{e&&kt.update(()=>e(t,n))};class Tle extends Pa{constructor(){super(...arguments),this.removePointerDownListener=dn}onPointerDown(t){this.session=new XM(t,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint()})}createPanHandlers(){const{onPanSessionStart:t,onPanStart:n,onPan:r,onPanEnd:i}=this.node.getProps();return{onSessionStart:TP(t),onStart:TP(n),onMove:r,onEnd:(o,s)=>{delete this.session,i&&kt.update(()=>i(o,s))}}}mount(){this.removePointerDownListener=Zo(this.node.current,"pointerdown",t=>this.onPointerDown(t))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}function Ele(){const e=E.useContext(vp);if(e===null)return[!0,null];const{isPresent:t,onExitComplete:n,register:r}=e,i=E.useId();return E.useEffect(()=>r(i),[]),!t&&n?[!1,()=>n&&n(i)]:[!0]}function Ple(){return kle(E.useContext(vp))}function kle(e){return e===null?!0:e.isPresent}const gm={hasAnimatedSinceResize:!0,hasEverUpdated:!1};function EP(e,t){return t.max===t.min?0:e/(t.max-t.min)*100}const Td={correct:(e,t)=>{if(!t.target)return e;if(typeof e=="string")if(Se.test(e))e=parseFloat(e);else return e;const n=EP(e,t.target.x),r=EP(e,t.target.y);return`${n}% ${r}%`}},Ale={correct:(e,{treeScale:t,projectionDelta:n})=>{const r=e,i=ha.parse(e);if(i.length>5)return r;const o=ha.createTransformer(e),s=typeof i[0]!="number"?1:0,a=n.x.scale*t.x,l=n.y.scale*t.y;i[0+s]/=a,i[1+s]/=l;const u=$t(a,l,.5);return typeof i[2+s]=="number"&&(i[2+s]/=u),typeof i[3+s]=="number"&&(i[3+s]/=u),o(i)}};class Ole extends Ve.Component{componentDidMount(){const{visualElement:t,layoutGroup:n,switchLayoutGroup:r,layoutId:i}=this.props,{projection:o}=t;Doe(Rle),o&&(n.group&&n.group.add(o),r&&r.register&&i&&r.register(o),o.root.didUpdate(),o.addEventListener("animationComplete",()=>{this.safeToRemove()}),o.setOptions({...o.options,onExitComplete:()=>this.safeToRemove()})),gm.hasEverUpdated=!0}getSnapshotBeforeUpdate(t){const{layoutDependency:n,visualElement:r,drag:i,isPresent:o}=this.props,s=r.projection;return s&&(s.isPresent=o,i||t.layoutDependency!==n||n===void 0?s.willUpdate():this.safeToRemove(),t.isPresent!==o&&(o?s.promote():s.relegate()||kt.postRender(()=>{const a=s.getStack();(!a||!a.members.length)&&this.safeToRemove()}))),null}componentDidUpdate(){const{projection:t}=this.props.visualElement;t&&(t.root.didUpdate(),queueMicrotask(()=>{!t.currentAnimation&&t.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:t,layoutGroup:n,switchLayoutGroup:r}=this.props,{projection:i}=t;i&&(i.scheduleCheckAfterUnmount(),n&&n.group&&n.group.remove(i),r&&r.deregister&&r.deregister(i))}safeToRemove(){const{safeToRemove:t}=this.props;t&&t()}render(){return null}}function nD(e){const[t,n]=Ele(),r=E.useContext(F5);return Ve.createElement(Ole,{...e,layoutGroup:r,switchLayoutGroup:E.useContext(XN),isPresent:t,safeToRemove:n})}const Rle={borderRadius:{...Td,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:Td,borderTopRightRadius:Td,borderBottomLeftRadius:Td,borderBottomRightRadius:Td,boxShadow:Ale},rD=["TopLeft","TopRight","BottomLeft","BottomRight"],Ile=rD.length,PP=e=>typeof e=="string"?parseFloat(e):e,kP=e=>typeof e=="number"||Se.test(e);function Nle(e,t,n,r,i,o){i?(e.opacity=$t(0,n.opacity!==void 0?n.opacity:1,Mle(r)),e.opacityExit=$t(t.opacity!==void 0?t.opacity:1,0,Dle(r))):o&&(e.opacity=$t(t.opacity!==void 0?t.opacity:1,n.opacity!==void 0?n.opacity:1,r));for(let s=0;srt?1:n(fh(e,t,r))}function OP(e,t){e.min=t.min,e.max=t.max}function Xr(e,t){OP(e.x,t.x),OP(e.y,t.y)}function RP(e,t,n,r,i){return e-=t,e=Fy(e,1/n,r),i!==void 0&&(e=Fy(e,1/i,r)),e}function Lle(e,t=0,n=1,r=.5,i,o=e,s=e){if(fo.test(t)&&(t=parseFloat(t),t=$t(s.min,s.max,t/100)-s.min),typeof t!="number")return;let a=$t(o.min,o.max,r);e===o&&(a-=t),e.min=RP(e.min,t,n,a,i),e.max=RP(e.max,t,n,a,i)}function IP(e,t,[n,r,i],o,s){Lle(e,t[n],t[r],t[i],t.scale,o,s)}const $le=["x","scaleX","originX"],Fle=["y","scaleY","originY"];function NP(e,t,n,r){IP(e.x,t,$le,n?n.x:void 0,r?r.x:void 0),IP(e.y,t,Fle,n?n.y:void 0,r?r.y:void 0)}function MP(e){return e.translate===0&&e.scale===1}function oD(e){return MP(e.x)&&MP(e.y)}function Ow(e,t){return e.x.min===t.x.min&&e.x.max===t.x.max&&e.y.min===t.y.min&&e.y.max===t.y.max}function DP(e){return Vr(e.x)/Vr(e.y)}class Ble{constructor(){this.members=[]}add(t){J5(this.members,t),t.scheduleRender()}remove(t){if(e3(this.members,t),t===this.prevLead&&(this.prevLead=void 0),t===this.lead){const n=this.members[this.members.length-1];n&&this.promote(n)}}relegate(t){const n=this.members.findIndex(i=>t===i);if(n===0)return!1;let r;for(let i=n;i>=0;i--){const o=this.members[i];if(o.isPresent!==!1){r=o;break}}return r?(this.promote(r),!0):!1}promote(t,n){const r=this.lead;if(t!==r&&(this.prevLead=r,this.lead=t,t.show(),r)){r.instance&&r.scheduleRender(),t.scheduleRender(),t.resumeFrom=r,n&&(t.resumeFrom.preserveOpacity=!0),r.snapshot&&(t.snapshot=r.snapshot,t.snapshot.latestValues=r.animationValues||r.latestValues),t.root&&t.root.isUpdating&&(t.isLayoutDirty=!0);const{crossfade:i}=t.options;i===!1&&r.hide()}}exitAnimationComplete(){this.members.forEach(t=>{const{options:n,resumingFrom:r}=t;n.onExitComplete&&n.onExitComplete(),r&&r.options.onExitComplete&&r.options.onExitComplete()})}scheduleRender(){this.members.forEach(t=>{t.instance&&t.scheduleRender(!1)})}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}function LP(e,t,n){let r="";const i=e.x.translate/t.x,o=e.y.translate/t.y;if((i||o)&&(r=`translate3d(${i}px, ${o}px, 0) `),(t.x!==1||t.y!==1)&&(r+=`scale(${1/t.x}, ${1/t.y}) `),n){const{rotate:l,rotateX:u,rotateY:c}=n;l&&(r+=`rotate(${l}deg) `),u&&(r+=`rotateX(${u}deg) `),c&&(r+=`rotateY(${c}deg) `)}const s=e.x.scale*t.x,a=e.y.scale*t.y;return(s!==1||a!==1)&&(r+=`scale(${s}, ${a})`),r||"none"}const jle=(e,t)=>e.depth-t.depth;class Vle{constructor(){this.children=[],this.isDirty=!1}add(t){J5(this.children,t),this.isDirty=!0}remove(t){e3(this.children,t),this.isDirty=!0}forEach(t){this.isDirty&&this.children.sort(jle),this.isDirty=!1,this.children.forEach(t)}}function zle(e,t){const n=performance.now(),r=({timestamp:i})=>{const o=i-n;o>=t&&(ls(r),e(o-t))};return kt.read(r,!0),()=>ls(r)}function Ule(e){window.MotionDebug&&window.MotionDebug.record(e)}function Gle(e){return e instanceof SVGElement&&e.tagName!=="svg"}function Hle(e,t,n){const r=kr(e)?e:Ec(e);return r.start(Z5("",r,t,n)),r.animation}const $P=["","X","Y","Z"],FP=1e3;let Wle=0;const Ga={type:"projectionFrame",totalNodes:0,resolvedTargetDeltas:0,recalculatedProjection:0};function sD({attachResizeListener:e,defaultParent:t,measureScroll:n,checkIsScrollRoot:r,resetTransform:i}){return class{constructor(s={},a=t==null?void 0:t()){this.id=Wle++,this.animationId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.updateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{Ga.totalNodes=Ga.resolvedTargetDeltas=Ga.recalculatedProjection=0,this.nodes.forEach(Yle),this.nodes.forEach(eue),this.nodes.forEach(tue),this.nodes.forEach(Xle),Ule(Ga)},this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=s,this.root=a?a.root||a:this,this.path=a?[...a.path,a]:[],this.parent=a,this.depth=a?a.depth+1:0;for(let l=0;lthis.root.updateBlockedByResize=!1;e(s,()=>{this.root.updateBlockedByResize=!0,d&&d(),d=zle(f,250),gm.hasAnimatedSinceResize&&(gm.hasAnimatedSinceResize=!1,this.nodes.forEach(jP))})}l&&this.root.registerSharedNode(l,this),this.options.animate!==!1&&c&&(l||u)&&this.addEventListener("didUpdate",({delta:d,hasLayoutChanged:f,hasRelativeTargetChanged:h,layout:p})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const m=this.options.transition||c.getDefaultTransition()||sue,{onLayoutAnimationStart:S,onLayoutAnimationComplete:v}=c.getProps(),y=!this.targetLayout||!Ow(this.targetLayout,p)||h,g=!f&&h;if(this.options.layoutRoot||this.resumeFrom&&this.resumeFrom.instance||g||f&&(y||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0),this.setAnimationOrigin(d,g);const b={...WM(m,"layout"),onPlay:S,onComplete:v};(c.shouldReduceMotion||this.options.layoutRoot)&&(b.delay=0,b.type=!1),this.startAnimation(b)}else f||jP(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=p})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const s=this.getStack();s&&s.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,ls(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(nue),this.animationId++)}getTransformTemplate(){const{visualElement:s}=this.options;return s&&s.getProps().transformTemplate}willUpdate(s=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let c=0;cthis.update()))}clearAllSnapshots(){this.nodes.forEach(Qle),this.sharedNodes.forEach(rue)}scheduleUpdateProjection(){kt.preRender(this.updateProjection,!1,!0)}scheduleCheckAfterUnmount(){kt.postRender(()=>{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure())}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let l=0;l{const _=b/1e3;VP(d.x,s.x,_),VP(d.y,s.y,_),this.setTargetDelta(d),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(yf(f,this.layout.layoutBox,this.relativeParent.layout.layoutBox),iue(this.relativeTarget,this.relativeTargetOrigin,f,_),g&&Ow(this.relativeTarget,g)&&(this.isProjectionDirty=!1),g||(g=en()),Xr(g,this.relativeTarget)),m&&(this.animationValues=c,Nle(c,u,this.latestValues,_,y,v)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=_},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(s){this.notifyListeners("animationStart"),this.currentAnimation&&this.currentAnimation.stop(),this.resumingFrom&&this.resumingFrom.currentAnimation&&this.resumingFrom.currentAnimation.stop(),this.pendingAnimation&&(ls(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=kt.update(()=>{gm.hasAnimatedSinceResize=!0,this.currentAnimation=Hle(0,FP,{...s,onUpdate:a=>{this.mixTargetDelta(a),s.onUpdate&&s.onUpdate(a)},onComplete:()=>{s.onComplete&&s.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const s=this.getStack();s&&s.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(FP),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const s=this.getLead();let{targetWithTransforms:a,target:l,layout:u,latestValues:c}=s;if(!(!a||!l||!u)){if(this!==s&&this.layout&&u&&aD(this.options.animationType,this.layout.layoutBox,u.layoutBox)){l=this.target||en();const d=Vr(this.layout.layoutBox.x);l.x.min=s.target.x.min,l.x.max=l.x.min+d;const f=Vr(this.layout.layoutBox.y);l.y.min=s.target.y.min,l.y.max=l.y.min+f}Xr(a,l),Lu(a,c),mf(this.projectionDeltaWithTransform,this.layoutCorrected,a,c)}}registerSharedNode(s,a){this.sharedNodes.has(s)||this.sharedNodes.set(s,new Ble),this.sharedNodes.get(s).add(a);const u=a.options.initialPromotionConfig;a.promote({transition:u?u.transition:void 0,preserveFollowOpacity:u&&u.shouldPreserveFollowOpacity?u.shouldPreserveFollowOpacity(a):void 0})}isLead(){const s=this.getStack();return s?s.lead===this:!0}getLead(){var s;const{layoutId:a}=this.options;return a?((s=this.getStack())===null||s===void 0?void 0:s.lead)||this:this}getPrevLead(){var s;const{layoutId:a}=this.options;return a?(s=this.getStack())===null||s===void 0?void 0:s.prevLead:void 0}getStack(){const{layoutId:s}=this.options;if(s)return this.root.sharedNodes.get(s)}promote({needsReset:s,transition:a,preserveFollowOpacity:l}={}){const u=this.getStack();u&&u.promote(this,l),s&&(this.projectionDelta=void 0,this.needsReset=!0),a&&this.setOptions({transition:a})}relegate(){const s=this.getStack();return s?s.relegate(this):!1}resetRotation(){const{visualElement:s}=this.options;if(!s)return;let a=!1;const{latestValues:l}=s;if((l.rotate||l.rotateX||l.rotateY||l.rotateZ)&&(a=!0),!a)return;const u={};for(let c=0;c<$P.length;c++){const d="rotate"+$P[c];l[d]&&(u[d]=l[d],s.setStaticValue(d,0))}s.render();for(const c in u)s.setStaticValue(c,u[c]);s.scheduleRender()}getProjectionStyles(s={}){var a,l;const u={};if(!this.instance||this.isSVG)return u;if(this.isVisible)u.visibility="";else return{visibility:"hidden"};const c=this.getTransformTemplate();if(this.needsReset)return this.needsReset=!1,u.opacity="",u.pointerEvents=pm(s.pointerEvents)||"",u.transform=c?c(this.latestValues,""):"none",u;const d=this.getLead();if(!this.projectionDelta||!this.layout||!d.target){const m={};return this.options.layoutId&&(m.opacity=this.latestValues.opacity!==void 0?this.latestValues.opacity:1,m.pointerEvents=pm(s.pointerEvents)||""),this.hasProjected&&!Ua(this.latestValues)&&(m.transform=c?c({},""):"none",this.hasProjected=!1),m}const f=d.animationValues||d.latestValues;this.applyTransformsToTarget(),u.transform=LP(this.projectionDeltaWithTransform,this.treeScale,f),c&&(u.transform=c(f,u.transform));const{x:h,y:p}=this.projectionDelta;u.transformOrigin=`${h.origin*100}% ${p.origin*100}% 0`,d.animationValues?u.opacity=d===this?(l=(a=f.opacity)!==null&&a!==void 0?a:this.latestValues.opacity)!==null&&l!==void 0?l:1:this.preserveOpacity?this.latestValues.opacity:f.opacityExit:u.opacity=d===this?f.opacity!==void 0?f.opacity:"":f.opacityExit!==void 0?f.opacityExit:0;for(const m in Ry){if(f[m]===void 0)continue;const{correct:S,applyTo:v}=Ry[m],y=u.transform==="none"?f[m]:S(f[m],d);if(v){const g=v.length;for(let b=0;b{var a;return(a=s.currentAnimation)===null||a===void 0?void 0:a.stop()}),this.root.nodes.forEach(BP),this.root.sharedNodes.clear()}}}function qle(e){e.updateLayout()}function Kle(e){var t;const n=((t=e.resumeFrom)===null||t===void 0?void 0:t.snapshot)||e.snapshot;if(e.isLead()&&e.layout&&n&&e.hasListeners("didUpdate")){const{layoutBox:r,measuredBox:i}=e.layout,{animationType:o}=e.options,s=n.source!==e.layout.source;o==="size"?Hi(d=>{const f=s?n.measuredBox[d]:n.layoutBox[d],h=Vr(f);f.min=r[d].min,f.max=f.min+h}):aD(o,n.layoutBox,r)&&Hi(d=>{const f=s?n.measuredBox[d]:n.layoutBox[d],h=Vr(r[d]);f.max=f.min+h,e.relativeTarget&&!e.currentAnimation&&(e.isProjectionDirty=!0,e.relativeTarget[d].max=e.relativeTarget[d].min+h)});const a=Du();mf(a,r,n.layoutBox);const l=Du();s?mf(l,e.applyTransform(i,!0),n.measuredBox):mf(l,r,n.layoutBox);const u=!oD(a);let c=!1;if(!e.resumeFrom){const d=e.getClosestProjectingParent();if(d&&!d.resumeFrom){const{snapshot:f,layout:h}=d;if(f&&h){const p=en();yf(p,n.layoutBox,f.layoutBox);const m=en();yf(m,r,h.layoutBox),Ow(p,m)||(c=!0),d.options.layoutRoot&&(e.relativeTarget=m,e.relativeTargetOrigin=p,e.relativeParent=d)}}}e.notifyListeners("didUpdate",{layout:r,snapshot:n,delta:l,layoutDelta:a,hasLayoutChanged:u,hasRelativeTargetChanged:c})}else if(e.isLead()){const{onExitComplete:r}=e.options;r&&r()}e.options.transition=void 0}function Yle(e){Ga.totalNodes++,e.parent&&(e.isProjecting()||(e.isProjectionDirty=e.parent.isProjectionDirty),e.isSharedProjectionDirty||(e.isSharedProjectionDirty=!!(e.isProjectionDirty||e.parent.isProjectionDirty||e.parent.isSharedProjectionDirty)),e.isTransformDirty||(e.isTransformDirty=e.parent.isTransformDirty))}function Xle(e){e.isProjectionDirty=e.isSharedProjectionDirty=e.isTransformDirty=!1}function Qle(e){e.clearSnapshot()}function BP(e){e.clearMeasurements()}function Zle(e){e.isLayoutDirty=!1}function Jle(e){const{visualElement:t}=e.options;t&&t.getProps().onBeforeLayoutMeasure&&t.notify("BeforeLayoutMeasure"),e.resetTransform()}function jP(e){e.finishAnimation(),e.targetDelta=e.relativeTarget=e.target=void 0,e.isProjectionDirty=!0}function eue(e){e.resolveTargetDelta()}function tue(e){e.calcProjection()}function nue(e){e.resetRotation()}function rue(e){e.removeLeadSnapshot()}function VP(e,t,n){e.translate=$t(t.translate,0,n),e.scale=$t(t.scale,1,n),e.origin=t.origin,e.originPoint=t.originPoint}function zP(e,t,n,r){e.min=$t(t.min,n.min,r),e.max=$t(t.max,n.max,r)}function iue(e,t,n,r){zP(e.x,t.x,n.x,r),zP(e.y,t.y,n.y,r)}function oue(e){return e.animationValues&&e.animationValues.opacityExit!==void 0}const sue={duration:.45,ease:[.4,0,.1,1]};function UP(e){e.min=Math.round(e.min),e.max=Math.round(e.max)}function aue(e){UP(e.x),UP(e.y)}function aD(e,t,n){return e==="position"||e==="preserve-aspect"&&!Ew(DP(t),DP(n),.2)}const lue=sD({attachResizeListener:(e,t)=>Yo(e,"resize",t),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body.scrollLeft,y:document.documentElement.scrollTop||document.body.scrollTop}),checkIsScrollRoot:()=>!0}),e2={current:void 0},lD=sD({measureScroll:e=>({x:e.scrollLeft,y:e.scrollTop}),defaultParent:()=>{if(!e2.current){const e=new lue({});e.mount(window),e.setOptions({layoutScroll:!0}),e2.current=e}return e2.current},resetTransform:(e,t)=>{e.style.transform=t!==void 0?t:"none"},checkIsScrollRoot:e=>window.getComputedStyle(e).position==="fixed"}),uue={pan:{Feature:Tle},drag:{Feature:Cle,ProjectionNode:lD,MeasureLayout:nD}},cue=/var\((--[a-zA-Z0-9-_]+),? ?([a-zA-Z0-9 ()%#.,-]+)?\)/;function due(e){const t=cue.exec(e);if(!t)return[,];const[,n,r]=t;return[n,r]}function Rw(e,t,n=1){const[r,i]=due(e);if(!r)return;const o=window.getComputedStyle(t).getPropertyValue(r);return o?o.trim():vw(i)?Rw(i,t,n+1):i}function fue(e,{...t},n){const r=e.current;if(!(r instanceof Element))return{target:t,transitionEnd:n};n&&(n={...n}),e.values.forEach(i=>{const o=i.get();if(!vw(o))return;const s=Rw(o,r);s&&i.set(s)});for(const i in t){const o=t[i];if(!vw(o))continue;const s=Rw(o,r);s&&(t[i]=s,n||(n={}),n[i]===void 0&&(n[i]=o))}return{target:t,transitionEnd:n}}const hue=new Set(["width","height","top","left","right","bottom","x","y","translateX","translateY"]),uD=e=>hue.has(e),pue=e=>Object.keys(e).some(uD),GP=e=>e===Ll||e===Se,HP=(e,t)=>parseFloat(e.split(", ")[t]),WP=(e,t)=>(n,{transform:r})=>{if(r==="none"||!r)return 0;const i=r.match(/^matrix3d\((.+)\)$/);if(i)return HP(i[1],t);{const o=r.match(/^matrix\((.+)\)$/);return o?HP(o[1],e):0}},gue=new Set(["x","y","z"]),mue=bp.filter(e=>!gue.has(e));function yue(e){const t=[];return mue.forEach(n=>{const r=e.getValue(n);r!==void 0&&(t.push([n,r.get()]),r.set(n.startsWith("scale")?1:0))}),t.length&&e.render(),t}const qP={width:({x:e},{paddingLeft:t="0",paddingRight:n="0"})=>e.max-e.min-parseFloat(t)-parseFloat(n),height:({y:e},{paddingTop:t="0",paddingBottom:n="0"})=>e.max-e.min-parseFloat(t)-parseFloat(n),top:(e,{top:t})=>parseFloat(t),left:(e,{left:t})=>parseFloat(t),bottom:({y:e},{top:t})=>parseFloat(t)+(e.max-e.min),right:({x:e},{left:t})=>parseFloat(t)+(e.max-e.min),x:WP(4,13),y:WP(5,14)},vue=(e,t,n)=>{const r=t.measureViewportBox(),i=t.current,o=getComputedStyle(i),{display:s}=o,a={};s==="none"&&t.setStaticValue("display",e.display||"block"),n.forEach(u=>{a[u]=qP[u](r,o)}),t.render();const l=t.measureViewportBox();return n.forEach(u=>{const c=t.getValue(u);c&&c.jump(a[u]),e[u]=qP[u](l,o)}),e},bue=(e,t,n={},r={})=>{t={...t},r={...r};const i=Object.keys(t).filter(uD);let o=[],s=!1;const a=[];if(i.forEach(l=>{const u=e.getValue(l);if(!e.hasValue(l))return;let c=n[l],d=Cd(c);const f=t[l];let h;if(Ny(f)){const p=f.length,m=f[0]===null?1:0;c=f[m],d=Cd(c);for(let S=m;S=0?window.pageYOffset:null,u=vue(t,e,a);return o.length&&o.forEach(([c,d])=>{e.getValue(c).set(d)}),e.render(),t1&&l!==null&&window.scrollTo({top:l}),{target:u,transitionEnd:r}}else return{target:t,transitionEnd:r}};function Sue(e,t,n,r){return pue(t)?bue(e,t,n,r):{target:t,transitionEnd:r}}const _ue=(e,t,n,r)=>{const i=fue(e,t,r);return t=i.target,r=i.transitionEnd,Sue(e,t,n,r)},Iw={current:null},cD={current:!1};function wue(){if(cD.current=!0,!!t1)if(window.matchMedia){const e=window.matchMedia("(prefers-reduced-motion)"),t=()=>Iw.current=e.matches;e.addListener(t),t()}else Iw.current=!1}function xue(e,t,n){const{willChange:r}=t;for(const i in t){const o=t[i],s=n[i];if(kr(o))e.addValue(i,o),$y(r)&&r.add(i);else if(kr(s))e.addValue(i,Ec(o,{owner:e})),$y(r)&&r.remove(i);else if(s!==o)if(e.hasValue(i)){const a=e.getValue(i);!a.hasAnimated&&a.set(o)}else{const a=e.getStaticValue(i);e.addValue(i,Ec(a!==void 0?a:o,{owner:e}))}}for(const i in n)t[i]===void 0&&e.removeValue(i);return t}const KP=new WeakMap,dD=Object.keys(ch),Cue=dD.length,YP=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"],Tue=$5.length;class Eue{constructor({parent:t,props:n,presenceContext:r,reducedMotionConfig:i,visualState:o},s={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.scheduleRender=()=>kt.render(this.render,!1,!0);const{latestValues:a,renderState:l}=o;this.latestValues=a,this.baseTarget={...a},this.initialValues=n.initial?{...a}:{},this.renderState=l,this.parent=t,this.props=n,this.presenceContext=r,this.depth=t?t.depth+1:0,this.reducedMotionConfig=i,this.options=s,this.isControllingVariants=r1(n),this.isVariantNode=YN(n),this.isVariantNode&&(this.variantChildren=new Set),this.manuallyAnimateOnMount=!!(t&&t.current);const{willChange:u,...c}=this.scrapeMotionValuesFromProps(n,{});for(const d in c){const f=c[d];a[d]!==void 0&&kr(f)&&(f.set(a[d],!1),$y(u)&&u.add(d))}}scrapeMotionValuesFromProps(t,n){return{}}mount(t){this.current=t,KP.set(t,this),this.projection&&!this.projection.instance&&this.projection.mount(t),this.parent&&this.isVariantNode&&!this.isControllingVariants&&(this.removeFromVariantTree=this.parent.addVariantChild(this)),this.values.forEach((n,r)=>this.bindToMotionValue(r,n)),cD.current||wue(),this.shouldReduceMotion=this.reducedMotionConfig==="never"?!1:this.reducedMotionConfig==="always"?!0:Iw.current,this.parent&&this.parent.children.add(this),this.update(this.props,this.presenceContext)}unmount(){KP.delete(this.current),this.projection&&this.projection.unmount(),ls(this.notifyUpdate),ls(this.render),this.valueSubscriptions.forEach(t=>t()),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent&&this.parent.children.delete(this);for(const t in this.events)this.events[t].clear();for(const t in this.features)this.features[t].unmount();this.current=null}bindToMotionValue(t,n){const r=Dl.has(t),i=n.on("change",s=>{this.latestValues[t]=s,this.props.onUpdate&&kt.update(this.notifyUpdate,!1,!0),r&&this.projection&&(this.projection.isTransformDirty=!0)}),o=n.on("renderRequest",this.scheduleRender);this.valueSubscriptions.set(t,()=>{i(),o()})}sortNodePosition(t){return!this.current||!this.sortInstanceNodePosition||this.type!==t.type?0:this.sortInstanceNodePosition(this.current,t.current)}loadFeatures({children:t,...n},r,i,o){let s,a;for(let l=0;lthis.scheduleRender(),animationType:typeof u=="string"?u:"both",initialPromotionConfig:o,layoutScroll:f,layoutRoot:h})}return a}updateFeatures(){for(const t in this.features){const n=this.features[t];n.isMounted?n.update():(n.mount(),n.isMounted=!0)}}triggerBuild(){this.build(this.renderState,this.latestValues,this.options,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):en()}getStaticValue(t){return this.latestValues[t]}setStaticValue(t,n){this.latestValues[t]=n}makeTargetAnimatable(t,n=!0){return this.makeTargetAnimatableFromInstance(t,this.props,n)}update(t,n){(t.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=t,this.prevPresenceContext=this.presenceContext,this.presenceContext=n;for(let r=0;rn.variantChildren.delete(t)}addValue(t,n){n!==this.values.get(t)&&(this.removeValue(t),this.bindToMotionValue(t,n)),this.values.set(t,n),this.latestValues[t]=n.get()}removeValue(t){this.values.delete(t);const n=this.valueSubscriptions.get(t);n&&(n(),this.valueSubscriptions.delete(t)),delete this.latestValues[t],this.removeValueFromRenderState(t,this.renderState)}hasValue(t){return this.values.has(t)}getValue(t,n){if(this.props.values&&this.props.values[t])return this.props.values[t];let r=this.values.get(t);return r===void 0&&n!==void 0&&(r=Ec(n,{owner:this}),this.addValue(t,r)),r}readValue(t){return this.latestValues[t]!==void 0||!this.current?this.latestValues[t]:this.readValueFromInstance(this.current,t,this.options)}setBaseTarget(t,n){this.baseTarget[t]=n}getBaseTarget(t){var n;const{initial:r}=this.props,i=typeof r=="string"||typeof r=="object"?(n=W5(this.props,r))===null||n===void 0?void 0:n[t]:void 0;if(r&&i!==void 0)return i;const o=this.getBaseTargetFromProps(this.props,t);return o!==void 0&&!kr(o)?o:this.initialValues[t]!==void 0&&i===void 0?void 0:this.baseTarget[t]}on(t,n){return this.events[t]||(this.events[t]=new t3),this.events[t].add(n)}notify(t,...n){this.events[t]&&this.events[t].notify(...n)}}class fD extends Eue{sortInstanceNodePosition(t,n){return t.compareDocumentPosition(n)&2?1:-1}getBaseTargetFromProps(t,n){return t.style?t.style[n]:void 0}removeValueFromRenderState(t,{vars:n,style:r}){delete n[t],delete r[t]}makeTargetAnimatableFromInstance({transition:t,transitionEnd:n,...r},{transformValues:i},o){let s=Gae(r,t||{},this);if(i&&(n&&(n=i(n)),r&&(r=i(r)),s&&(s=i(s))),o){zae(this,r,s);const a=_ue(this,r,s,n);n=a.transitionEnd,r=a.target}return{transition:t,transitionEnd:n,...r}}}function Pue(e){return window.getComputedStyle(e)}class kue extends fD{readValueFromInstance(t,n){if(Dl.has(n)){const r=Q5(n);return r&&r.default||0}else{const r=Pue(t),i=(JN(n)?r.getPropertyValue(n):r[n])||0;return typeof i=="string"?i.trim():i}}measureInstanceViewportBox(t,{transformPagePoint:n}){return tD(t,n)}build(t,n,r,i){j5(t,n,r,i.transformTemplate)}scrapeMotionValuesFromProps(t,n){return H5(t,n)}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:t}=this.props;kr(t)&&(this.childSubscription=t.on("change",n=>{this.current&&(this.current.textContent=`${n}`)}))}renderInstance(t,n,r,i){oM(t,n,r,i)}}class Aue extends fD{constructor(){super(...arguments),this.isSVGTag=!1}getBaseTargetFromProps(t,n){return t[n]}readValueFromInstance(t,n){if(Dl.has(n)){const r=Q5(n);return r&&r.default||0}return n=sM.has(n)?n:G5(n),t.getAttribute(n)}measureInstanceViewportBox(){return en()}scrapeMotionValuesFromProps(t,n){return lM(t,n)}build(t,n,r,i){z5(t,n,r,this.isSVGTag,i.transformTemplate)}renderInstance(t,n,r,i){aM(t,n,r,i)}mount(t){this.isSVGTag=U5(t.tagName),super.mount(t)}}const Oue=(e,t)=>B5(e)?new Aue(t,{enableHardwareAcceleration:!1}):new kue(t,{enableHardwareAcceleration:!0}),Rue={layout:{ProjectionNode:lD,MeasureLayout:nD}},Iue={...ile,...Tse,...uue,...Rue},n3=Noe((e,t)=>lse(e,t,Iue,Oue));function hD(){const e=E.useRef(!1);return Oy(()=>(e.current=!0,()=>{e.current=!1}),[]),e}function Nue(){const e=hD(),[t,n]=E.useState(0),r=E.useCallback(()=>{e.current&&n(t+1)},[t]);return[E.useCallback(()=>kt.postRender(r),[r]),t]}class Mue extends E.Component{getSnapshotBeforeUpdate(t){const n=this.props.childRef.current;if(n&&t.isPresent&&!this.props.isPresent){const r=this.props.sizeRef.current;r.height=n.offsetHeight||0,r.width=n.offsetWidth||0,r.top=n.offsetTop,r.left=n.offsetLeft}return null}componentDidUpdate(){}render(){return this.props.children}}function Due({children:e,isPresent:t}){const n=E.useId(),r=E.useRef(null),i=E.useRef({width:0,height:0,top:0,left:0});return E.useInsertionEffect(()=>{const{width:o,height:s,top:a,left:l}=i.current;if(t||!r.current||!o||!s)return;r.current.dataset.motionPopId=n;const u=document.createElement("style");return document.head.appendChild(u),u.sheet&&u.sheet.insertRule(` + [data-motion-pop-id="${n}"] { + position: absolute !important; + width: ${o}px !important; + height: ${s}px !important; + top: ${a}px !important; + left: ${l}px !important; + } + `),()=>{document.head.removeChild(u)}},[t]),E.createElement(Mue,{isPresent:t,childRef:r,sizeRef:i},E.cloneElement(e,{ref:r}))}const t2=({children:e,initial:t,isPresent:n,onExitComplete:r,custom:i,presenceAffectsLayout:o,mode:s})=>{const a=uM(Lue),l=E.useId(),u=E.useMemo(()=>({id:l,initial:t,isPresent:n,custom:i,onExitComplete:c=>{a.set(c,!0);for(const d of a.values())if(!d)return;r&&r()},register:c=>(a.set(c,!1),()=>a.delete(c))}),o?void 0:[n]);return E.useMemo(()=>{a.forEach((c,d)=>a.set(d,!1))},[n]),E.useEffect(()=>{!n&&!a.size&&r&&r()},[n]),s==="popLayout"&&(e=E.createElement(Due,{isPresent:n},e)),E.createElement(vp.Provider,{value:u},e)};function Lue(){return new Map}function $ue(e){return E.useEffect(()=>()=>e(),[])}const pu=e=>e.key||"";function Fue(e,t){e.forEach(n=>{const r=pu(n);t.set(r,n)})}function Bue(e){const t=[];return E.Children.forEach(e,n=>{E.isValidElement(n)&&t.push(n)}),t}const r3=({children:e,custom:t,initial:n=!0,onExitComplete:r,exitBeforeEnter:i,presenceAffectsLayout:o=!0,mode:s="sync"})=>{const a=E.useContext(F5).forceRender||Nue()[0],l=hD(),u=Bue(e);let c=u;const d=E.useRef(new Map).current,f=E.useRef(c),h=E.useRef(new Map).current,p=E.useRef(!0);if(Oy(()=>{p.current=!1,Fue(u,h),f.current=c}),$ue(()=>{p.current=!0,h.clear(),d.clear()}),p.current)return E.createElement(E.Fragment,null,c.map(y=>E.createElement(t2,{key:pu(y),isPresent:!0,initial:n?void 0:!1,presenceAffectsLayout:o,mode:s},y)));c=[...c];const m=f.current.map(pu),S=u.map(pu),v=m.length;for(let y=0;y{if(S.indexOf(g)!==-1)return;const b=h.get(g);if(!b)return;const _=m.indexOf(g);let w=y;if(!w){const x=()=>{h.delete(g),d.delete(g);const C=f.current.findIndex(k=>k.key===g);if(f.current.splice(C,1),!d.size){if(f.current=u,l.current===!1)return;a(),r&&r()}};w=E.createElement(t2,{key:pu(b),isPresent:!1,onExitComplete:x,custom:t,presenceAffectsLayout:o,mode:s},b),d.set(g,w)}c.splice(_,0,w)}),c=c.map(y=>{const g=y.key;return d.has(g)?y:E.createElement(t2,{key:pu(y),isPresent:!0,presenceAffectsLayout:o,mode:s},y)}),E.createElement(E.Fragment,null,d.size?c:c.map(y=>E.cloneElement(y)))};var jue={initial:e=>{const{position:t}=e,n=["top","bottom"].includes(t)?"y":"x";let r=["top-right","bottom-right"].includes(t)?1:-1;return t==="bottom"&&(r=1),{opacity:0,[n]:r*24}},animate:{opacity:1,y:0,x:0,scale:1,transition:{duration:.4,ease:[.4,0,.2,1]}},exit:{opacity:0,scale:.85,transition:{duration:.2,ease:[.4,0,1,1]}}},pD=E.memo(e=>{const{id:t,message:n,onCloseComplete:r,onRequestRemove:i,requestClose:o=!1,position:s="bottom",duration:a=5e3,containerStyle:l,motionVariants:u=jue,toastSpacing:c="0.5rem"}=e,[d,f]=E.useState(a),h=Ple();Ay(()=>{h||r==null||r()},[h]),Ay(()=>{f(a)},[a]);const p=()=>f(null),m=()=>f(a),S=()=>{h&&i()};E.useEffect(()=>{h&&o&&i()},[h,o,i]),Coe(S,d);const v=E.useMemo(()=>({pointerEvents:"auto",maxWidth:560,minWidth:300,margin:c,...l}),[l,c]),y=E.useMemo(()=>woe(s),[s]);return j.jsx(n3.div,{layout:!0,className:"chakra-toast",variants:u,initial:"initial",animate:"animate",exit:"exit",onHoverStart:p,onHoverEnd:m,custom:{position:s},style:y,children:j.jsx(ke.div,{role:"status","aria-atomic":"true",className:"chakra-toast__inner",__css:v,children:no(n,{id:t,onClose:S})})})});pD.displayName="ToastComponent";function Vue(e,t){var n;const r=e??"bottom",o={"top-start":{ltr:"top-left",rtl:"top-right"},"top-end":{ltr:"top-right",rtl:"top-left"},"bottom-start":{ltr:"bottom-left",rtl:"bottom-right"},"bottom-end":{ltr:"bottom-right",rtl:"bottom-left"}}[r];return(n=o==null?void 0:o[t])!=null?n:r}var XP={path:j.jsxs("g",{stroke:"currentColor",strokeWidth:"1.5",children:[j.jsx("path",{strokeLinecap:"round",fill:"none",d:"M9,9a3,3,0,1,1,4,2.829,1.5,1.5,0,0,0-1,1.415V14.25"}),j.jsx("path",{fill:"currentColor",strokeLinecap:"round",d:"M12,17.25a.375.375,0,1,0,.375.375A.375.375,0,0,0,12,17.25h0"}),j.jsx("circle",{fill:"none",strokeMiterlimit:"10",cx:"12",cy:"12",r:"11.25"})]}),viewBox:"0 0 24 24"},$l=Qe((e,t)=>{const{as:n,viewBox:r,color:i="currentColor",focusable:o=!1,children:s,className:a,__css:l,...u}=e,c=zn("chakra-icon",a),d=Ml("Icon",e),f={w:"1em",h:"1em",display:"inline-block",lineHeight:"1em",flexShrink:0,color:i,...l,...d},h={ref:t,focusable:o,className:c,__css:f},p=r??XP.viewBox;if(n&&typeof n!="string")return j.jsx(ke.svg,{as:n,...h,...u});const m=s??XP.path;return j.jsx(ke.svg,{verticalAlign:"middle",viewBox:p,...h,...u,children:m})});$l.displayName="Icon";function zue(e){return j.jsx($l,{viewBox:"0 0 24 24",...e,children:j.jsx("path",{fill:"currentColor",d:"M12,0A12,12,0,1,0,24,12,12.014,12.014,0,0,0,12,0Zm6.927,8.2-6.845,9.289a1.011,1.011,0,0,1-1.43.188L5.764,13.769a1,1,0,1,1,1.25-1.562l4.076,3.261,6.227-8.451A1,1,0,1,1,18.927,8.2Z"})})}function Uue(e){return j.jsx($l,{viewBox:"0 0 24 24",...e,children:j.jsx("path",{fill:"currentColor",d:"M12,0A12,12,0,1,0,24,12,12.013,12.013,0,0,0,12,0Zm.25,5a1.5,1.5,0,1,1-1.5,1.5A1.5,1.5,0,0,1,12.25,5ZM14.5,18.5h-4a1,1,0,0,1,0-2h.75a.25.25,0,0,0,.25-.25v-4.5a.25.25,0,0,0-.25-.25H10.5a1,1,0,0,1,0-2h1a2,2,0,0,1,2,2v4.75a.25.25,0,0,0,.25.25h.75a1,1,0,1,1,0,2Z"})})}function QP(e){return j.jsx($l,{viewBox:"0 0 24 24",...e,children:j.jsx("path",{fill:"currentColor",d:"M11.983,0a12.206,12.206,0,0,0-8.51,3.653A11.8,11.8,0,0,0,0,12.207,11.779,11.779,0,0,0,11.8,24h.214A12.111,12.111,0,0,0,24,11.791h0A11.766,11.766,0,0,0,11.983,0ZM10.5,16.542a1.476,1.476,0,0,1,1.449-1.53h.027a1.527,1.527,0,0,1,1.523,1.47,1.475,1.475,0,0,1-1.449,1.53h-.027A1.529,1.529,0,0,1,10.5,16.542ZM11,12.5v-6a1,1,0,0,1,2,0v6a1,1,0,1,1-2,0Z"})})}var Gue=are({"0%":{transform:"rotate(0deg)"},"100%":{transform:"rotate(360deg)"}}),l1=Qe((e,t)=>{const n=Ml("Spinner",e),{label:r="Loading...",thickness:i="2px",speed:o="0.45s",emptyColor:s="transparent",className:a,...l}=Co(e),u=zn("chakra-spinner",a),c={display:"inline-block",borderColor:"currentColor",borderStyle:"solid",borderRadius:"99999px",borderWidth:i,borderBottomColor:s,borderLeftColor:s,animation:`${Gue} ${o} linear infinite`,...n};return j.jsx(ke.div,{ref:t,__css:c,className:u,...l,children:r&&j.jsx(ke.span,{srOnly:!0,children:r})})});l1.displayName="Spinner";var[Hue,i3]=mi({name:"AlertContext",hookName:"useAlertContext",providerName:""}),[Wue,o3]=mi({name:"AlertStylesContext",hookName:"useAlertStyles",providerName:""}),gD={info:{icon:Uue,colorScheme:"blue"},warning:{icon:QP,colorScheme:"orange"},success:{icon:zue,colorScheme:"green"},error:{icon:QP,colorScheme:"red"},loading:{icon:l1,colorScheme:"blue"}};function que(e){return gD[e].colorScheme}function Kue(e){return gD[e].icon}var mD=Qe(function(t,n){const r=o3(),{status:i}=i3(),o={display:"inline",...r.description};return j.jsx(ke.div,{ref:n,"data-status":i,...t,className:zn("chakra-alert__desc",t.className),__css:o})});mD.displayName="AlertDescription";function yD(e){const{status:t}=i3(),n=Kue(t),r=o3(),i=t==="loading"?r.spinner:r.icon;return j.jsx(ke.span,{display:"inherit","data-status":t,...e,className:zn("chakra-alert__icon",e.className),__css:i,children:e.children||j.jsx(n,{h:"100%",w:"100%"})})}yD.displayName="AlertIcon";var vD=Qe(function(t,n){const r=o3(),{status:i}=i3();return j.jsx(ke.div,{ref:n,"data-status":i,...t,className:zn("chakra-alert__title",t.className),__css:r.title})});vD.displayName="AlertTitle";var bD=Qe(function(t,n){var r;const{status:i="info",addRole:o=!0,...s}=Co(t),a=(r=t.colorScheme)!=null?r:que(i),l=Jv("Alert",{...t,colorScheme:a}),u={width:"100%",display:"flex",alignItems:"center",position:"relative",overflow:"hidden",...l.container};return j.jsx(Hue,{value:{status:i},children:j.jsx(Wue,{value:l,children:j.jsx(ke.div,{"data-status":i,role:o?"alert":void 0,ref:n,...s,className:zn("chakra-alert",t.className),__css:u})})})});bD.displayName="Alert";function Yue(e){return j.jsx($l,{focusable:"false","aria-hidden":!0,...e,children:j.jsx("path",{fill:"currentColor",d:"M.439,21.44a1.5,1.5,0,0,0,2.122,2.121L11.823,14.3a.25.25,0,0,1,.354,0l9.262,9.263a1.5,1.5,0,1,0,2.122-2.121L14.3,12.177a.25.25,0,0,1,0-.354l9.263-9.262A1.5,1.5,0,0,0,21.439.44L12.177,9.7a.25.25,0,0,1-.354,0L2.561.44A1.5,1.5,0,0,0,.439,2.561L9.7,11.823a.25.25,0,0,1,0,.354Z"})})}var SD=Qe(function(t,n){const r=Ml("CloseButton",t),{children:i,isDisabled:o,__css:s,...a}=Co(t),l={outline:0,display:"flex",alignItems:"center",justifyContent:"center",flexShrink:0};return j.jsx(ke.button,{type:"button","aria-label":"Close",ref:n,disabled:o,__css:{...l,...r,...s},...a,children:i||j.jsx(Yue,{width:"1em",height:"1em"})})});SD.displayName="CloseButton";var Xue={top:[],"top-left":[],"top-right":[],"bottom-left":[],bottom:[],"bottom-right":[]},Zi=Que(Xue);function Que(e){let t=e;const n=new Set,r=i=>{t=i(t),n.forEach(o=>o())};return{getState:()=>t,subscribe:i=>(n.add(i),()=>{r(()=>e),n.delete(i)}),removeToast:(i,o)=>{r(s=>({...s,[o]:s[o].filter(a=>a.id!=i)}))},notify:(i,o)=>{const s=Zue(i,o),{position:a,id:l}=s;return r(u=>{var c,d;const h=a.includes("top")?[s,...(c=u[a])!=null?c:[]]:[...(d=u[a])!=null?d:[],s];return{...u,[a]:h}}),l},update:(i,o)=>{i&&r(s=>{const a={...s},{position:l,index:u}=W6(a,i);return l&&u!==-1&&(a[l][u]={...a[l][u],...o,message:_D(o)}),a})},closeAll:({positions:i}={})=>{r(o=>(i??["bottom","bottom-right","bottom-left","top","top-left","top-right"]).reduce((l,u)=>(l[u]=o[u].map(c=>({...c,requestClose:!0})),l),{...o}))},close:i=>{r(o=>{const s=WN(o,i);return s?{...o,[s]:o[s].map(a=>a.id==i?{...a,requestClose:!0}:a)}:o})},isActive:i=>!!W6(Zi.getState(),i).position}}var ZP=0;function Zue(e,t={}){var n,r;ZP+=1;const i=(n=t.id)!=null?n:ZP,o=(r=t.position)!=null?r:"bottom";return{id:i,message:e,position:o,duration:t.duration,onCloseComplete:t.onCloseComplete,onRequestRemove:()=>Zi.removeToast(String(i),o),status:t.status,requestClose:!1,containerStyle:t.containerStyle}}var Jue=e=>{const{status:t,variant:n="solid",id:r,title:i,isClosable:o,onClose:s,description:a,colorScheme:l,icon:u}=e,c=r?{root:`toast-${r}`,title:`toast-${r}-title`,description:`toast-${r}-description`}:void 0;return j.jsxs(bD,{addRole:!1,status:t,variant:n,id:c==null?void 0:c.root,alignItems:"start",borderRadius:"md",boxShadow:"lg",paddingEnd:8,textAlign:"start",width:"auto",colorScheme:l,children:[j.jsx(yD,{children:u}),j.jsxs(ke.div,{flex:"1",maxWidth:"100%",children:[i&&j.jsx(vD,{id:c==null?void 0:c.title,children:i}),a&&j.jsx(mD,{id:c==null?void 0:c.description,display:"block",children:a})]}),o&&j.jsx(SD,{size:"sm",onClick:s,position:"absolute",insetEnd:1,top:1})]})};function _D(e={}){const{render:t,toastComponent:n=Jue}=e;return i=>typeof t=="function"?t({...i,...e}):j.jsx(n,{...i,...e})}function ece(e,t){const n=i=>{var o;return{...t,...i,position:Vue((o=i==null?void 0:i.position)!=null?o:t==null?void 0:t.position,e)}},r=i=>{const o=n(i),s=_D(o);return Zi.notify(s,o)};return r.update=(i,o)=>{Zi.update(i,n(o))},r.promise=(i,o)=>{const s=r({...o.loading,status:"loading",duration:null});i.then(a=>r.update(s,{status:"success",duration:5e3,...no(o.success,a)})).catch(a=>r.update(s,{status:"error",duration:5e3,...no(o.error,a)}))},r.closeAll=Zi.closeAll,r.close=Zi.close,r.isActive=Zi.isActive,r}var[kEe,tce]=mi({name:"ToastOptionsContext",strict:!1}),AEe=e=>{const t=E.useSyncExternalStore(Zi.subscribe,Zi.getState,Zi.getState),{motionVariants:n,component:r=pD,portalProps:i}=e,s=Object.keys(t).map(a=>{const l=t[a];return j.jsx("div",{role:"region","aria-live":"polite",id:`chakra-toast-manager-${a}`,style:xoe(a),children:j.jsx(r3,{initial:!1,children:l.map(u=>j.jsx(r,{motionVariants:n,...u},u.id))})},a)});return j.jsx(mp,{...i,children:s})};function nce(e){const{theme:t}=NN(),n=tce();return E.useMemo(()=>ece(t.direction,{...n,...e}),[e,t.direction,n])}function rce(e,t){if(e!=null){if(typeof e=="function"){e(t);return}try{e.current=t}catch{throw new Error(`Cannot assign value '${t}' to ref '${e}'`)}}}function li(...e){return t=>{e.forEach(n=>{rce(n,t)})}}function ice(...e){return E.useMemo(()=>li(...e),e)}function oce(e){const{value:t,defaultValue:n,onChange:r,shouldUpdate:i=(f,h)=>f!==h}=e,o=Bn(r),s=Bn(i),[a,l]=E.useState(n),u=t!==void 0,c=u?t:a,d=Bn(f=>{const p=typeof f=="function"?f(c):f;s(c,p)&&(u||l(p),o(p))},[u,o,c,s]);return[c,d]}var Nw=Qe(function(t,n){const{htmlWidth:r,htmlHeight:i,alt:o,...s}=t;return j.jsx("img",{width:r,height:i,ref:n,alt:o,...s})});Nw.displayName="NativeImage";function sce(e){const{loading:t,src:n,srcSet:r,onLoad:i,onError:o,crossOrigin:s,sizes:a,ignoreFallback:l}=e,[u,c]=E.useState("pending");E.useEffect(()=>{c(n?"loading":"pending")},[n]);const d=E.useRef(),f=E.useCallback(()=>{if(!n)return;h();const p=new Image;p.src=n,s&&(p.crossOrigin=s),r&&(p.srcset=r),a&&(p.sizes=a),t&&(p.loading=t),p.onload=m=>{h(),c("loaded"),i==null||i(m)},p.onerror=m=>{h(),c("failed"),o==null||o(m)},d.current=p},[n,s,r,a,i,o,t]),h=()=>{d.current&&(d.current.onload=null,d.current.onerror=null,d.current=null)};return ah(()=>{if(!l)return u==="loading"&&f(),()=>{h()}},[u,f,l]),l?"loaded":u}var ace=(e,t)=>e!=="loaded"&&t==="beforeLoadOrError"||e==="failed"&&t==="onError";function lce(e,t=[]){const n=Object.assign({},e);for(const r of t)r in n&&delete n[r];return n}var s3=Qe(function(t,n){const{fallbackSrc:r,fallback:i,src:o,srcSet:s,align:a,fit:l,loading:u,ignoreFallback:c,crossOrigin:d,fallbackStrategy:f="beforeLoadOrError",referrerPolicy:h,...p}=t,m=r!==void 0||i!==void 0,S=u!=null||c||!m,v=sce({...t,crossOrigin:d,ignoreFallback:S}),y=ace(v,f),g={ref:n,objectFit:l,objectPosition:a,...S?p:lce(p,["onError","onLoad"])};return y?i||j.jsx(ke.img,{as:Nw,className:"chakra-image__placeholder",src:r,...g}):j.jsx(ke.img,{as:Nw,src:o,srcSet:s,crossOrigin:d,loading:u,referrerPolicy:h,className:"chakra-image",...g})});s3.displayName="Image";function uce(e){return E.Children.toArray(e).filter(t=>E.isValidElement(t))}var[OEe,cce]=mi({strict:!1,name:"ButtonGroupContext"});function dce(e){const[t,n]=E.useState(!e);return{ref:E.useCallback(o=>{o&&n(o.tagName==="BUTTON")},[]),type:t?"button":void 0}}function Mw(e){const{children:t,className:n,...r}=e,i=E.isValidElement(t)?E.cloneElement(t,{"aria-hidden":!0,focusable:!1}):t,o=zn("chakra-button__icon",n);return j.jsx(ke.span,{display:"inline-flex",alignSelf:"center",flexShrink:0,...r,className:o,children:i})}Mw.displayName="ButtonIcon";function Dw(e){const{label:t,placement:n,spacing:r="0.5rem",children:i=j.jsx(l1,{color:"currentColor",width:"1em",height:"1em"}),className:o,__css:s,...a}=e,l=zn("chakra-button__spinner",o),u=n==="start"?"marginEnd":"marginStart",c=E.useMemo(()=>({display:"flex",alignItems:"center",position:t?"relative":"absolute",[u]:t?r:0,fontSize:"1em",lineHeight:"normal",...s}),[s,t,u,r]);return j.jsx(ke.div,{className:l,...a,__css:c,children:i})}Dw.displayName="ButtonSpinner";var wD=Qe((e,t)=>{const n=cce(),r=Ml("Button",{...n,...e}),{isDisabled:i=n==null?void 0:n.isDisabled,isLoading:o,isActive:s,children:a,leftIcon:l,rightIcon:u,loadingText:c,iconSpacing:d="0.5rem",type:f,spinner:h,spinnerPlacement:p="start",className:m,as:S,...v}=Co(e),y=E.useMemo(()=>{const w={...r==null?void 0:r._focus,zIndex:1};return{display:"inline-flex",appearance:"none",alignItems:"center",justifyContent:"center",userSelect:"none",position:"relative",whiteSpace:"nowrap",verticalAlign:"middle",outline:"none",...r,...!!n&&{_focus:w}}},[r,n]),{ref:g,type:b}=dce(S),_={rightIcon:u,leftIcon:l,iconSpacing:d,children:a};return j.jsxs(ke.button,{ref:ice(t,g),as:S,type:f??b,"data-active":Iu(s),"data-loading":Iu(o),__css:y,className:zn("chakra-button",m),...v,disabled:i||o,children:[o&&p==="start"&&j.jsx(Dw,{className:"chakra-button__spinner--start",label:c,placement:"start",spacing:d,children:h}),o?c||j.jsx(ke.span,{opacity:0,children:j.jsx(JP,{..._})}):j.jsx(JP,{..._}),o&&p==="end"&&j.jsx(Dw,{className:"chakra-button__spinner--end",label:c,placement:"end",spacing:d,children:h})]})});wD.displayName="Button";function JP(e){const{leftIcon:t,rightIcon:n,children:r,iconSpacing:i}=e;return j.jsxs(j.Fragment,{children:[t&&j.jsx(Mw,{marginEnd:i,children:t}),r,n&&j.jsx(Mw,{marginStart:i,children:n})]})}var xD=Qe((e,t)=>{const{icon:n,children:r,isRound:i,"aria-label":o,...s}=e,a=n||r,l=E.isValidElement(a)?E.cloneElement(a,{"aria-hidden":!0,focusable:!1}):null;return j.jsx(wD,{padding:"0",borderRadius:i?"full":void 0,ref:t,"aria-label":o,...s,children:l})});xD.displayName="IconButton";var[fce,CD]=mi({name:"FormControlStylesContext",errorMessage:`useFormControlStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),[hce,u1]=mi({strict:!1,name:"FormControlContext"});function pce(e){const{id:t,isRequired:n,isInvalid:r,isDisabled:i,isReadOnly:o,...s}=e,a=E.useId(),l=t||`field-${a}`,u=`${l}-label`,c=`${l}-feedback`,d=`${l}-helptext`,[f,h]=E.useState(!1),[p,m]=E.useState(!1),[S,v]=E.useState(!1),y=E.useCallback((x={},C=null)=>({id:d,...x,ref:li(C,k=>{k&&m(!0)})}),[d]),g=E.useCallback((x={},C=null)=>({...x,ref:C,"data-focus":Iu(S),"data-disabled":Iu(i),"data-invalid":Iu(r),"data-readonly":Iu(o),id:x.id!==void 0?x.id:u,htmlFor:x.htmlFor!==void 0?x.htmlFor:l}),[l,i,S,r,o,u]),b=E.useCallback((x={},C=null)=>({id:c,...x,ref:li(C,k=>{k&&h(!0)}),"aria-live":"polite"}),[c]),_=E.useCallback((x={},C=null)=>({...x,...s,ref:C,role:"group"}),[s]),w=E.useCallback((x={},C=null)=>({...x,ref:C,role:"presentation","aria-hidden":!0,children:x.children||"*"}),[]);return{isRequired:!!n,isInvalid:!!r,isReadOnly:!!o,isDisabled:!!i,isFocused:!!S,onFocus:()=>v(!0),onBlur:()=>v(!1),hasFeedbackText:f,setHasFeedbackText:h,hasHelpText:p,setHasHelpText:m,id:l,labelId:u,feedbackId:c,helpTextId:d,htmlProps:s,getHelpTextProps:y,getErrorMessageProps:b,getRootProps:_,getLabelProps:g,getRequiredIndicatorProps:w}}var TD=Qe(function(t,n){const r=Jv("Form",t),i=Co(t),{getRootProps:o,htmlProps:s,...a}=pce(i),l=zn("chakra-form-control",t.className);return j.jsx(hce,{value:a,children:j.jsx(fce,{value:r,children:j.jsx(ke.div,{...o({},n),className:l,__css:r.container})})})});TD.displayName="FormControl";var gce=Qe(function(t,n){const r=u1(),i=CD(),o=zn("chakra-form__helper-text",t.className);return j.jsx(ke.div,{...r==null?void 0:r.getHelpTextProps(t,n),__css:i.helperText,className:o})});gce.displayName="FormHelperText";var ED=Qe(function(t,n){var r;const i=Ml("FormLabel",t),o=Co(t),{className:s,children:a,requiredIndicator:l=j.jsx(PD,{}),optionalIndicator:u=null,...c}=o,d=u1(),f=(r=d==null?void 0:d.getLabelProps(c,n))!=null?r:{ref:n,...c};return j.jsxs(ke.label,{...f,className:zn("chakra-form__label",o.className),__css:{display:"block",textAlign:"start",...i},children:[a,d!=null&&d.isRequired?l:u]})});ED.displayName="FormLabel";var PD=Qe(function(t,n){const r=u1(),i=CD();if(!(r!=null&&r.isRequired))return null;const o=zn("chakra-form__required-indicator",t.className);return j.jsx(ke.span,{...r==null?void 0:r.getRequiredIndicatorProps(t,n),__css:i.requiredIndicator,className:o})});PD.displayName="RequiredIndicator";function REe(e){const{isDisabled:t,isInvalid:n,isReadOnly:r,isRequired:i,...o}=kD(e);return{...o,disabled:t,readOnly:r,required:i,"aria-invalid":Zu(n),"aria-required":Zu(i),"aria-readonly":Zu(r)}}function kD(e){var t,n,r;const i=u1(),{id:o,disabled:s,readOnly:a,required:l,isRequired:u,isInvalid:c,isReadOnly:d,isDisabled:f,onFocus:h,onBlur:p,...m}=e,S=e["aria-describedby"]?[e["aria-describedby"]]:[];return i!=null&&i.hasFeedbackText&&(i!=null&&i.isInvalid)&&S.push(i.feedbackId),i!=null&&i.hasHelpText&&S.push(i.helpTextId),{...m,"aria-describedby":S.join(" ")||void 0,id:o??(i==null?void 0:i.id),isDisabled:(t=s??f)!=null?t:i==null?void 0:i.isDisabled,isReadOnly:(n=a??d)!=null?n:i==null?void 0:i.isReadOnly,isRequired:(r=l??u)!=null?r:i==null?void 0:i.isRequired,isInvalid:c??(i==null?void 0:i.isInvalid),onFocus:Dn(i==null?void 0:i.onFocus,h),onBlur:Dn(i==null?void 0:i.onBlur,p)}}function mce(e){const t=parseFloat(e);return typeof t!="number"||Number.isNaN(t)?0:t}function a3(e,t){let n=mce(e);const r=10**(t??10);return n=Math.round(n*r)/r,t?n.toFixed(t):n.toString()}function Lw(e){if(!Number.isFinite(e))return 0;let t=1,n=0;for(;Math.round(e*t)/t!==e;)t*=10,n+=1;return n}function e8(e,t,n){return(e-t)*100/(n-t)}function yce(e,t,n){return(n-t)*e+t}function t8(e,t,n){const r=Math.round((e-t)/n)*n+t,i=Lw(n);return a3(r,i)}function mm(e,t,n){return e==null?e:(n{var P;return r==null?"":(P=n2(r,o,n))!=null?P:""}),f=typeof i<"u",h=f?i:c,p=AD(ks(h),o),m=n??p,S=E.useCallback(P=>{P!==h&&(f||d(P.toString()),u==null||u(P.toString(),ks(P)))},[u,f,h]),v=E.useCallback(P=>{let A=P;return l&&(A=mm(A,s,a)),a3(A,m)},[m,l,a,s]),y=E.useCallback((P=o)=>{let A;h===""?A=ks(P):A=ks(h)+P,A=v(A),S(A)},[v,o,S,h]),g=E.useCallback((P=o)=>{let A;h===""?A=ks(-P):A=ks(h)-P,A=v(A),S(A)},[v,o,S,h]),b=E.useCallback(()=>{var P;let A;r==null?A="":A=(P=n2(r,o,n))!=null?P:s,S(A)},[r,n,o,S,s]),_=E.useCallback(P=>{var A;const $=(A=n2(P,o,m))!=null?A:s;S($)},[m,o,S,s]),w=ks(h);return{isOutOfRange:w>a||w{const o=typeof e=="function"?e():e??document;if(!(!n||!o))return o.addEventListener(t,i,r),()=>{o.removeEventListener(t,i,r)}},[t,e,r,i,n]),()=>{const o=typeof e=="function"?e():e??document;o==null||o.removeEventListener(t,i,r)}}function OD(e){return e!=null&&typeof e=="object"&&"nodeType"in e&&e.nodeType===Node.ELEMENT_NODE}function bce(e){var t;if(!OD(e))return!1;const n=(t=e.ownerDocument.defaultView)!=null?t:window;return e instanceof n.HTMLElement}function IEe(e){var t,n;return(n=(t=RD(e))==null?void 0:t.defaultView)!=null?n:window}function RD(e){return OD(e)?e.ownerDocument:document}function NEe(e){return RD(e).activeElement}function Sce(e){const t=e.ownerDocument.defaultView||window,{overflow:n,overflowX:r,overflowY:i}=t.getComputedStyle(e);return/auto|scroll|overlay|hidden/.test(n+i+r)}function _ce(e){return e.localName==="html"?e:e.assignedSlot||e.parentElement||e.ownerDocument.documentElement}function ID(e){return["html","body","#document"].includes(e.localName)?e.ownerDocument.body:bce(e)&&Sce(e)?e:ID(_ce(e))}var wce=jie?E.useLayoutEffect:E.useEffect;function n8(e,t=[]){const n=E.useRef(e);return wce(()=>{n.current=e}),E.useCallback((...r)=>{var i;return(i=n.current)==null?void 0:i.call(n,...r)},t)}function xce(e,t){const n=E.useId();return E.useMemo(()=>e||[t,n].filter(Boolean).join("-"),[e,t,n])}function Cce(e,t){const n=e!==void 0;return[n,n&&typeof e<"u"?e:t]}function ND(e={}){const{onClose:t,onOpen:n,isOpen:r,id:i}=e,o=n8(n),s=n8(t),[a,l]=E.useState(e.defaultIsOpen||!1),[u,c]=Cce(r,a),d=xce(i,"disclosure"),f=E.useCallback(()=>{u||l(!1),s==null||s()},[u,s]),h=E.useCallback(()=>{u||l(!0),o==null||o()},[u,o]),p=E.useCallback(()=>{(c?f:h)()},[c,h,f]);return{isOpen:!!c,onOpen:h,onClose:f,onToggle:p,isControlled:u,getButtonProps:(m={})=>({...m,"aria-expanded":c,"aria-controls":d,onClick:qie(m.onClick,p)}),getDisclosureProps:(m={})=>({...m,hidden:!c,id:d})}}function Tce(e,t){return Array.isArray(e)?e.map(n=>n===null?null:t(n)):co(e)?Object.keys(e).reduce((n,r)=>(n[r]=t(e[r]),n),{}):e!=null?t(e):null}var MD=e=>j.jsx(ke.div,{className:"chakra-stack__item",...e,__css:{display:"inline-block",flex:"0 0 auto",minWidth:0,...e.__css}});MD.displayName="StackItem";function Ece(e){const{spacing:t,direction:n}=e,r={column:{my:t,mx:0,borderLeftWidth:0,borderBottomWidth:"1px"},"column-reverse":{my:t,mx:0,borderLeftWidth:0,borderBottomWidth:"1px"},row:{mx:t,my:0,borderLeftWidth:"1px",borderBottomWidth:0},"row-reverse":{mx:t,my:0,borderLeftWidth:"1px",borderBottomWidth:0}};return{"&":Tce(n,i=>r[i])}}var DD=Qe((e,t)=>{const{isInline:n,direction:r,align:i,justify:o,spacing:s="0.5rem",wrap:a,children:l,divider:u,className:c,shouldWrapChildren:d,...f}=e,h=n?"row":r??"column",p=E.useMemo(()=>Ece({spacing:s,direction:h}),[s,h]),m=!!u,S=!d&&!m,v=E.useMemo(()=>{const g=uce(l);return S?g:g.map((b,_)=>{const w=typeof b.key<"u"?b.key:_,x=_+1===g.length,k=d?j.jsx(MD,{children:b},w):b;if(!m)return k;const P=E.cloneElement(u,{__css:p}),A=x?null:P;return j.jsxs(E.Fragment,{children:[k,A]},w)})},[u,p,m,S,d,l]),y=zn("chakra-stack",c);return j.jsx(ke.div,{ref:t,display:"flex",alignItems:i,justifyContent:o,flexDirection:h,flexWrap:a,gap:m?void 0:s,className:y,...f,children:v})});DD.displayName="Stack";var LD=Qe((e,t)=>j.jsx(DD,{align:"center",...e,direction:"row",ref:t}));LD.displayName="HStack";var Yd=Qe(function(t,n){const r=Ml("Heading",t),{className:i,...o}=Co(t);return j.jsx(ke.h2,{ref:n,className:zn("chakra-heading",t.className),...o,__css:r})});Yd.displayName="Heading";var l3=ke("div");l3.displayName="Box";var $D=Qe(function(t,n){const{size:r,centerContent:i=!0,...o}=t,s=i?{display:"flex",alignItems:"center",justifyContent:"center"}:{};return j.jsx(l3,{ref:n,boxSize:r,__css:{...s,flexShrink:0,flexGrow:0},...o})});$D.displayName="Square";var Pce=Qe(function(t,n){const{size:r,...i}=t;return j.jsx($D,{size:r,ref:n,borderRadius:"9999px",...i})});Pce.displayName="Circle";var By=Qe(function(t,n){const{direction:r,align:i,justify:o,wrap:s,basis:a,grow:l,shrink:u,...c}=t,d={display:"flex",flexDirection:r,alignItems:i,justifyContent:o,flexWrap:s,flexBasis:a,flexGrow:l,flexShrink:u};return j.jsx(ke.div,{ref:n,__css:d,...c})});By.displayName="Flex";var nu=(e,t)=>({var:e,varRef:t?`var(${e}, ${t})`:`var(${e})`}),Fn={arrowShadowColor:nu("--popper-arrow-shadow-color"),arrowSize:nu("--popper-arrow-size","8px"),arrowSizeHalf:nu("--popper-arrow-size-half"),arrowBg:nu("--popper-arrow-bg"),transformOrigin:nu("--popper-transform-origin"),arrowOffset:nu("--popper-arrow-offset")};function kce(e){if(e.includes("top"))return"1px 1px 0px 0 var(--popper-arrow-shadow-color)";if(e.includes("bottom"))return"-1px -1px 0px 0 var(--popper-arrow-shadow-color)";if(e.includes("right"))return"-1px 1px 0px 0 var(--popper-arrow-shadow-color)";if(e.includes("left"))return"1px -1px 0px 0 var(--popper-arrow-shadow-color)"}var Ace={top:"bottom center","top-start":"bottom left","top-end":"bottom right",bottom:"top center","bottom-start":"top left","bottom-end":"top right",left:"right center","left-start":"right top","left-end":"right bottom",right:"left center","right-start":"left top","right-end":"left bottom"},Oce=e=>Ace[e],r8={scroll:!0,resize:!0};function Rce(e){let t;return typeof e=="object"?t={enabled:!0,options:{...r8,...e}}:t={enabled:e,options:r8},t}var Ice={name:"matchWidth",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:({state:e})=>{e.styles.popper.width=`${e.rects.reference.width}px`},effect:({state:e})=>()=>{const t=e.elements.reference;e.elements.popper.style.width=`${t.offsetWidth}px`}},Nce={name:"transformOrigin",enabled:!0,phase:"write",fn:({state:e})=>{i8(e)},effect:({state:e})=>()=>{i8(e)}},i8=e=>{e.elements.popper.style.setProperty(Fn.transformOrigin.var,Oce(e.placement))},Mce={name:"positionArrow",enabled:!0,phase:"afterWrite",fn:({state:e})=>{Dce(e)}},Dce=e=>{var t;if(!e.placement)return;const n=Lce(e.placement);if((t=e.elements)!=null&&t.arrow&&n){Object.assign(e.elements.arrow.style,{[n.property]:n.value,width:Fn.arrowSize.varRef,height:Fn.arrowSize.varRef,zIndex:-1});const r={[Fn.arrowSizeHalf.var]:`calc(${Fn.arrowSize.varRef} / 2 - 1px)`,[Fn.arrowOffset.var]:`calc(${Fn.arrowSizeHalf.varRef} * -1)`};for(const i in r)e.elements.arrow.style.setProperty(i,r[i])}},Lce=e=>{if(e.startsWith("top"))return{property:"bottom",value:Fn.arrowOffset.varRef};if(e.startsWith("bottom"))return{property:"top",value:Fn.arrowOffset.varRef};if(e.startsWith("left"))return{property:"right",value:Fn.arrowOffset.varRef};if(e.startsWith("right"))return{property:"left",value:Fn.arrowOffset.varRef}},$ce={name:"innerArrow",enabled:!0,phase:"main",requires:["arrow"],fn:({state:e})=>{o8(e)},effect:({state:e})=>()=>{o8(e)}},o8=e=>{if(!e.elements.arrow)return;const t=e.elements.arrow.querySelector("[data-popper-arrow-inner]");if(!t)return;const n=kce(e.placement);n&&t.style.setProperty("--popper-arrow-default-shadow",n),Object.assign(t.style,{transform:"rotate(45deg)",background:Fn.arrowBg.varRef,top:0,left:0,width:"100%",height:"100%",position:"absolute",zIndex:"inherit",boxShadow:"var(--popper-arrow-shadow, var(--popper-arrow-default-shadow))"})},Fce={"start-start":{ltr:"left-start",rtl:"right-start"},"start-end":{ltr:"left-end",rtl:"right-end"},"end-start":{ltr:"right-start",rtl:"left-start"},"end-end":{ltr:"right-end",rtl:"left-end"},start:{ltr:"left",rtl:"right"},end:{ltr:"right",rtl:"left"}},Bce={"auto-start":"auto-end","auto-end":"auto-start","top-start":"top-end","top-end":"top-start","bottom-start":"bottom-end","bottom-end":"bottom-start"};function jce(e,t="ltr"){var n,r;const i=((n=Fce[e])==null?void 0:n[t])||e;return t==="ltr"?i:(r=Bce[e])!=null?r:i}var Cr="top",hi="bottom",pi="right",Tr="left",u3="auto",xp=[Cr,hi,pi,Tr],Pc="start",hh="end",Vce="clippingParents",FD="viewport",Ed="popper",zce="reference",s8=xp.reduce(function(e,t){return e.concat([t+"-"+Pc,t+"-"+hh])},[]),BD=[].concat(xp,[u3]).reduce(function(e,t){return e.concat([t,t+"-"+Pc,t+"-"+hh])},[]),Uce="beforeRead",Gce="read",Hce="afterRead",Wce="beforeMain",qce="main",Kce="afterMain",Yce="beforeWrite",Xce="write",Qce="afterWrite",Zce=[Uce,Gce,Hce,Wce,qce,Kce,Yce,Xce,Qce];function mo(e){return e?(e.nodeName||"").toLowerCase():null}function zr(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function _l(e){var t=zr(e).Element;return e instanceof t||e instanceof Element}function ui(e){var t=zr(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function c3(e){if(typeof ShadowRoot>"u")return!1;var t=zr(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}function Jce(e){var t=e.state;Object.keys(t.elements).forEach(function(n){var r=t.styles[n]||{},i=t.attributes[n]||{},o=t.elements[n];!ui(o)||!mo(o)||(Object.assign(o.style,r),Object.keys(i).forEach(function(s){var a=i[s];a===!1?o.removeAttribute(s):o.setAttribute(s,a===!0?"":a)}))})}function ede(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(r){var i=t.elements[r],o=t.attributes[r]||{},s=Object.keys(t.styles.hasOwnProperty(r)?t.styles[r]:n[r]),a=s.reduce(function(l,u){return l[u]="",l},{});!ui(i)||!mo(i)||(Object.assign(i.style,a),Object.keys(o).forEach(function(l){i.removeAttribute(l)}))})}}const tde={name:"applyStyles",enabled:!0,phase:"write",fn:Jce,effect:ede,requires:["computeStyles"]};function ho(e){return e.split("-")[0]}var ll=Math.max,jy=Math.min,kc=Math.round;function $w(){var e=navigator.userAgentData;return e!=null&&e.brands&&Array.isArray(e.brands)?e.brands.map(function(t){return t.brand+"/"+t.version}).join(" "):navigator.userAgent}function jD(){return!/^((?!chrome|android).)*safari/i.test($w())}function Ac(e,t,n){t===void 0&&(t=!1),n===void 0&&(n=!1);var r=e.getBoundingClientRect(),i=1,o=1;t&&ui(e)&&(i=e.offsetWidth>0&&kc(r.width)/e.offsetWidth||1,o=e.offsetHeight>0&&kc(r.height)/e.offsetHeight||1);var s=_l(e)?zr(e):window,a=s.visualViewport,l=!jD()&&n,u=(r.left+(l&&a?a.offsetLeft:0))/i,c=(r.top+(l&&a?a.offsetTop:0))/o,d=r.width/i,f=r.height/o;return{width:d,height:f,top:c,right:u+d,bottom:c+f,left:u,x:u,y:c}}function d3(e){var t=Ac(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function VD(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&c3(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function us(e){return zr(e).getComputedStyle(e)}function nde(e){return["table","td","th"].indexOf(mo(e))>=0}function ka(e){return((_l(e)?e.ownerDocument:e.document)||window.document).documentElement}function c1(e){return mo(e)==="html"?e:e.assignedSlot||e.parentNode||(c3(e)?e.host:null)||ka(e)}function a8(e){return!ui(e)||us(e).position==="fixed"?null:e.offsetParent}function rde(e){var t=/firefox/i.test($w()),n=/Trident/i.test($w());if(n&&ui(e)){var r=us(e);if(r.position==="fixed")return null}var i=c1(e);for(c3(i)&&(i=i.host);ui(i)&&["html","body"].indexOf(mo(i))<0;){var o=us(i);if(o.transform!=="none"||o.perspective!=="none"||o.contain==="paint"||["transform","perspective"].indexOf(o.willChange)!==-1||t&&o.willChange==="filter"||t&&o.filter&&o.filter!=="none")return i;i=i.parentNode}return null}function Cp(e){for(var t=zr(e),n=a8(e);n&&nde(n)&&us(n).position==="static";)n=a8(n);return n&&(mo(n)==="html"||mo(n)==="body"&&us(n).position==="static")?t:n||rde(e)||t}function f3(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function vf(e,t,n){return ll(e,jy(t,n))}function ide(e,t,n){var r=vf(e,t,n);return r>n?n:r}function zD(){return{top:0,right:0,bottom:0,left:0}}function UD(e){return Object.assign({},zD(),e)}function GD(e,t){return t.reduce(function(n,r){return n[r]=e,n},{})}var ode=function(t,n){return t=typeof t=="function"?t(Object.assign({},n.rects,{placement:n.placement})):t,UD(typeof t!="number"?t:GD(t,xp))};function sde(e){var t,n=e.state,r=e.name,i=e.options,o=n.elements.arrow,s=n.modifiersData.popperOffsets,a=ho(n.placement),l=f3(a),u=[Tr,pi].indexOf(a)>=0,c=u?"height":"width";if(!(!o||!s)){var d=ode(i.padding,n),f=d3(o),h=l==="y"?Cr:Tr,p=l==="y"?hi:pi,m=n.rects.reference[c]+n.rects.reference[l]-s[l]-n.rects.popper[c],S=s[l]-n.rects.reference[l],v=Cp(o),y=v?l==="y"?v.clientHeight||0:v.clientWidth||0:0,g=m/2-S/2,b=d[h],_=y-f[c]-d[p],w=y/2-f[c]/2+g,x=vf(b,w,_),C=l;n.modifiersData[r]=(t={},t[C]=x,t.centerOffset=x-w,t)}}function ade(e){var t=e.state,n=e.options,r=n.element,i=r===void 0?"[data-popper-arrow]":r;i!=null&&(typeof i=="string"&&(i=t.elements.popper.querySelector(i),!i)||VD(t.elements.popper,i)&&(t.elements.arrow=i))}const lde={name:"arrow",enabled:!0,phase:"main",fn:sde,effect:ade,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Oc(e){return e.split("-")[1]}var ude={top:"auto",right:"auto",bottom:"auto",left:"auto"};function cde(e,t){var n=e.x,r=e.y,i=t.devicePixelRatio||1;return{x:kc(n*i)/i||0,y:kc(r*i)/i||0}}function l8(e){var t,n=e.popper,r=e.popperRect,i=e.placement,o=e.variation,s=e.offsets,a=e.position,l=e.gpuAcceleration,u=e.adaptive,c=e.roundOffsets,d=e.isFixed,f=s.x,h=f===void 0?0:f,p=s.y,m=p===void 0?0:p,S=typeof c=="function"?c({x:h,y:m}):{x:h,y:m};h=S.x,m=S.y;var v=s.hasOwnProperty("x"),y=s.hasOwnProperty("y"),g=Tr,b=Cr,_=window;if(u){var w=Cp(n),x="clientHeight",C="clientWidth";if(w===zr(n)&&(w=ka(n),us(w).position!=="static"&&a==="absolute"&&(x="scrollHeight",C="scrollWidth")),w=w,i===Cr||(i===Tr||i===pi)&&o===hh){b=hi;var k=d&&w===_&&_.visualViewport?_.visualViewport.height:w[x];m-=k-r.height,m*=l?1:-1}if(i===Tr||(i===Cr||i===hi)&&o===hh){g=pi;var P=d&&w===_&&_.visualViewport?_.visualViewport.width:w[C];h-=P-r.width,h*=l?1:-1}}var A=Object.assign({position:a},u&&ude),$=c===!0?cde({x:h,y:m},zr(n)):{x:h,y:m};if(h=$.x,m=$.y,l){var M;return Object.assign({},A,(M={},M[b]=y?"0":"",M[g]=v?"0":"",M.transform=(_.devicePixelRatio||1)<=1?"translate("+h+"px, "+m+"px)":"translate3d("+h+"px, "+m+"px, 0)",M))}return Object.assign({},A,(t={},t[b]=y?m+"px":"",t[g]=v?h+"px":"",t.transform="",t))}function dde(e){var t=e.state,n=e.options,r=n.gpuAcceleration,i=r===void 0?!0:r,o=n.adaptive,s=o===void 0?!0:o,a=n.roundOffsets,l=a===void 0?!0:a,u={placement:ho(t.placement),variation:Oc(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:i,isFixed:t.options.strategy==="fixed"};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,l8(Object.assign({},u,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:s,roundOffsets:l})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,l8(Object.assign({},u,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}const fde={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:dde,data:{}};var wg={passive:!0};function hde(e){var t=e.state,n=e.instance,r=e.options,i=r.scroll,o=i===void 0?!0:i,s=r.resize,a=s===void 0?!0:s,l=zr(t.elements.popper),u=[].concat(t.scrollParents.reference,t.scrollParents.popper);return o&&u.forEach(function(c){c.addEventListener("scroll",n.update,wg)}),a&&l.addEventListener("resize",n.update,wg),function(){o&&u.forEach(function(c){c.removeEventListener("scroll",n.update,wg)}),a&&l.removeEventListener("resize",n.update,wg)}}const pde={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:hde,data:{}};var gde={left:"right",right:"left",bottom:"top",top:"bottom"};function vm(e){return e.replace(/left|right|bottom|top/g,function(t){return gde[t]})}var mde={start:"end",end:"start"};function u8(e){return e.replace(/start|end/g,function(t){return mde[t]})}function h3(e){var t=zr(e),n=t.pageXOffset,r=t.pageYOffset;return{scrollLeft:n,scrollTop:r}}function p3(e){return Ac(ka(e)).left+h3(e).scrollLeft}function yde(e,t){var n=zr(e),r=ka(e),i=n.visualViewport,o=r.clientWidth,s=r.clientHeight,a=0,l=0;if(i){o=i.width,s=i.height;var u=jD();(u||!u&&t==="fixed")&&(a=i.offsetLeft,l=i.offsetTop)}return{width:o,height:s,x:a+p3(e),y:l}}function vde(e){var t,n=ka(e),r=h3(e),i=(t=e.ownerDocument)==null?void 0:t.body,o=ll(n.scrollWidth,n.clientWidth,i?i.scrollWidth:0,i?i.clientWidth:0),s=ll(n.scrollHeight,n.clientHeight,i?i.scrollHeight:0,i?i.clientHeight:0),a=-r.scrollLeft+p3(e),l=-r.scrollTop;return us(i||n).direction==="rtl"&&(a+=ll(n.clientWidth,i?i.clientWidth:0)-o),{width:o,height:s,x:a,y:l}}function g3(e){var t=us(e),n=t.overflow,r=t.overflowX,i=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+i+r)}function HD(e){return["html","body","#document"].indexOf(mo(e))>=0?e.ownerDocument.body:ui(e)&&g3(e)?e:HD(c1(e))}function bf(e,t){var n;t===void 0&&(t=[]);var r=HD(e),i=r===((n=e.ownerDocument)==null?void 0:n.body),o=zr(r),s=i?[o].concat(o.visualViewport||[],g3(r)?r:[]):r,a=t.concat(s);return i?a:a.concat(bf(c1(s)))}function Fw(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function bde(e,t){var n=Ac(e,!1,t==="fixed");return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}function c8(e,t,n){return t===FD?Fw(yde(e,n)):_l(t)?bde(t,n):Fw(vde(ka(e)))}function Sde(e){var t=bf(c1(e)),n=["absolute","fixed"].indexOf(us(e).position)>=0,r=n&&ui(e)?Cp(e):e;return _l(r)?t.filter(function(i){return _l(i)&&VD(i,r)&&mo(i)!=="body"}):[]}function _de(e,t,n,r){var i=t==="clippingParents"?Sde(e):[].concat(t),o=[].concat(i,[n]),s=o[0],a=o.reduce(function(l,u){var c=c8(e,u,r);return l.top=ll(c.top,l.top),l.right=jy(c.right,l.right),l.bottom=jy(c.bottom,l.bottom),l.left=ll(c.left,l.left),l},c8(e,s,r));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function WD(e){var t=e.reference,n=e.element,r=e.placement,i=r?ho(r):null,o=r?Oc(r):null,s=t.x+t.width/2-n.width/2,a=t.y+t.height/2-n.height/2,l;switch(i){case Cr:l={x:s,y:t.y-n.height};break;case hi:l={x:s,y:t.y+t.height};break;case pi:l={x:t.x+t.width,y:a};break;case Tr:l={x:t.x-n.width,y:a};break;default:l={x:t.x,y:t.y}}var u=i?f3(i):null;if(u!=null){var c=u==="y"?"height":"width";switch(o){case Pc:l[u]=l[u]-(t[c]/2-n[c]/2);break;case hh:l[u]=l[u]+(t[c]/2-n[c]/2);break}}return l}function ph(e,t){t===void 0&&(t={});var n=t,r=n.placement,i=r===void 0?e.placement:r,o=n.strategy,s=o===void 0?e.strategy:o,a=n.boundary,l=a===void 0?Vce:a,u=n.rootBoundary,c=u===void 0?FD:u,d=n.elementContext,f=d===void 0?Ed:d,h=n.altBoundary,p=h===void 0?!1:h,m=n.padding,S=m===void 0?0:m,v=UD(typeof S!="number"?S:GD(S,xp)),y=f===Ed?zce:Ed,g=e.rects.popper,b=e.elements[p?y:f],_=_de(_l(b)?b:b.contextElement||ka(e.elements.popper),l,c,s),w=Ac(e.elements.reference),x=WD({reference:w,element:g,strategy:"absolute",placement:i}),C=Fw(Object.assign({},g,x)),k=f===Ed?C:w,P={top:_.top-k.top+v.top,bottom:k.bottom-_.bottom+v.bottom,left:_.left-k.left+v.left,right:k.right-_.right+v.right},A=e.modifiersData.offset;if(f===Ed&&A){var $=A[i];Object.keys(P).forEach(function(M){var T=[pi,hi].indexOf(M)>=0?1:-1,O=[Cr,hi].indexOf(M)>=0?"y":"x";P[M]+=$[O]*T})}return P}function wde(e,t){t===void 0&&(t={});var n=t,r=n.placement,i=n.boundary,o=n.rootBoundary,s=n.padding,a=n.flipVariations,l=n.allowedAutoPlacements,u=l===void 0?BD:l,c=Oc(r),d=c?a?s8:s8.filter(function(p){return Oc(p)===c}):xp,f=d.filter(function(p){return u.indexOf(p)>=0});f.length===0&&(f=d);var h=f.reduce(function(p,m){return p[m]=ph(e,{placement:m,boundary:i,rootBoundary:o,padding:s})[ho(m)],p},{});return Object.keys(h).sort(function(p,m){return h[p]-h[m]})}function xde(e){if(ho(e)===u3)return[];var t=vm(e);return[u8(e),t,u8(t)]}function Cde(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var i=n.mainAxis,o=i===void 0?!0:i,s=n.altAxis,a=s===void 0?!0:s,l=n.fallbackPlacements,u=n.padding,c=n.boundary,d=n.rootBoundary,f=n.altBoundary,h=n.flipVariations,p=h===void 0?!0:h,m=n.allowedAutoPlacements,S=t.options.placement,v=ho(S),y=v===S,g=l||(y||!p?[vm(S)]:xde(S)),b=[S].concat(g).reduce(function(K,q){return K.concat(ho(q)===u3?wde(t,{placement:q,boundary:c,rootBoundary:d,padding:u,flipVariations:p,allowedAutoPlacements:m}):q)},[]),_=t.rects.reference,w=t.rects.popper,x=new Map,C=!0,k=b[0],P=0;P=0,O=T?"width":"height",I=ph(t,{placement:A,boundary:c,rootBoundary:d,altBoundary:f,padding:u}),N=T?M?pi:Tr:M?hi:Cr;_[O]>w[O]&&(N=vm(N));var R=vm(N),D=[];if(o&&D.push(I[$]<=0),a&&D.push(I[N]<=0,I[R]<=0),D.every(function(K){return K})){k=A,C=!1;break}x.set(A,D)}if(C)for(var L=p?3:1,V=function(q){var X=b.find(function(F){var W=x.get(F);if(W)return W.slice(0,q).every(function(Q){return Q})});if(X)return k=X,"break"},z=L;z>0;z--){var U=V(z);if(U==="break")break}t.placement!==k&&(t.modifiersData[r]._skip=!0,t.placement=k,t.reset=!0)}}const Tde={name:"flip",enabled:!0,phase:"main",fn:Cde,requiresIfExists:["offset"],data:{_skip:!1}};function d8(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function f8(e){return[Cr,pi,hi,Tr].some(function(t){return e[t]>=0})}function Ede(e){var t=e.state,n=e.name,r=t.rects.reference,i=t.rects.popper,o=t.modifiersData.preventOverflow,s=ph(t,{elementContext:"reference"}),a=ph(t,{altBoundary:!0}),l=d8(s,r),u=d8(a,i,o),c=f8(l),d=f8(u);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:u,isReferenceHidden:c,hasPopperEscaped:d},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":c,"data-popper-escaped":d})}const Pde={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:Ede};function kde(e,t,n){var r=ho(e),i=[Tr,Cr].indexOf(r)>=0?-1:1,o=typeof n=="function"?n(Object.assign({},t,{placement:e})):n,s=o[0],a=o[1];return s=s||0,a=(a||0)*i,[Tr,pi].indexOf(r)>=0?{x:a,y:s}:{x:s,y:a}}function Ade(e){var t=e.state,n=e.options,r=e.name,i=n.offset,o=i===void 0?[0,0]:i,s=BD.reduce(function(c,d){return c[d]=kde(d,t.rects,o),c},{}),a=s[t.placement],l=a.x,u=a.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=u),t.modifiersData[r]=s}const Ode={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:Ade};function Rde(e){var t=e.state,n=e.name;t.modifiersData[n]=WD({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})}const Ide={name:"popperOffsets",enabled:!0,phase:"read",fn:Rde,data:{}};function Nde(e){return e==="x"?"y":"x"}function Mde(e){var t=e.state,n=e.options,r=e.name,i=n.mainAxis,o=i===void 0?!0:i,s=n.altAxis,a=s===void 0?!1:s,l=n.boundary,u=n.rootBoundary,c=n.altBoundary,d=n.padding,f=n.tether,h=f===void 0?!0:f,p=n.tetherOffset,m=p===void 0?0:p,S=ph(t,{boundary:l,rootBoundary:u,padding:d,altBoundary:c}),v=ho(t.placement),y=Oc(t.placement),g=!y,b=f3(v),_=Nde(b),w=t.modifiersData.popperOffsets,x=t.rects.reference,C=t.rects.popper,k=typeof m=="function"?m(Object.assign({},t.rects,{placement:t.placement})):m,P=typeof k=="number"?{mainAxis:k,altAxis:k}:Object.assign({mainAxis:0,altAxis:0},k),A=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,$={x:0,y:0};if(w){if(o){var M,T=b==="y"?Cr:Tr,O=b==="y"?hi:pi,I=b==="y"?"height":"width",N=w[b],R=N+S[T],D=N-S[O],L=h?-C[I]/2:0,V=y===Pc?x[I]:C[I],z=y===Pc?-C[I]:-x[I],U=t.elements.arrow,K=h&&U?d3(U):{width:0,height:0},q=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:zD(),X=q[T],F=q[O],W=vf(0,x[I],K[I]),Q=g?x[I]/2-L-W-X-P.mainAxis:V-W-X-P.mainAxis,J=g?-x[I]/2+L+W+F+P.mainAxis:z+W+F+P.mainAxis,ne=t.elements.arrow&&Cp(t.elements.arrow),Z=ne?b==="y"?ne.clientTop||0:ne.clientLeft||0:0,ge=(M=A==null?void 0:A[b])!=null?M:0,ae=N+Q-ge-Z,oe=N+J-ge,Ce=vf(h?jy(R,ae):R,N,h?ll(D,oe):D);w[b]=Ce,$[b]=Ce-N}if(a){var se,We=b==="x"?Cr:Tr,mt=b==="x"?hi:pi,$e=w[_],Fe=_==="y"?"height":"width",Ie=$e+S[We],nt=$e-S[mt],xt=[Cr,Tr].indexOf(v)!==-1,vn=(se=A==null?void 0:A[_])!=null?se:0,sn=xt?Ie:$e-x[Fe]-C[Fe]-vn+P.altAxis,Ot=xt?$e+x[Fe]+C[Fe]-vn-P.altAxis:nt,ee=h&&xt?ide(sn,$e,Ot):vf(h?sn:Ie,$e,h?Ot:nt);w[_]=ee,$[_]=ee-$e}t.modifiersData[r]=$}}const Dde={name:"preventOverflow",enabled:!0,phase:"main",fn:Mde,requiresIfExists:["offset"]};function Lde(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function $de(e){return e===zr(e)||!ui(e)?h3(e):Lde(e)}function Fde(e){var t=e.getBoundingClientRect(),n=kc(t.width)/e.offsetWidth||1,r=kc(t.height)/e.offsetHeight||1;return n!==1||r!==1}function Bde(e,t,n){n===void 0&&(n=!1);var r=ui(t),i=ui(t)&&Fde(t),o=ka(t),s=Ac(e,i,n),a={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(r||!r&&!n)&&((mo(t)!=="body"||g3(o))&&(a=$de(t)),ui(t)?(l=Ac(t,!0),l.x+=t.clientLeft,l.y+=t.clientTop):o&&(l.x=p3(o))),{x:s.left+a.scrollLeft-l.x,y:s.top+a.scrollTop-l.y,width:s.width,height:s.height}}function jde(e){var t=new Map,n=new Set,r=[];e.forEach(function(o){t.set(o.name,o)});function i(o){n.add(o.name);var s=[].concat(o.requires||[],o.requiresIfExists||[]);s.forEach(function(a){if(!n.has(a)){var l=t.get(a);l&&i(l)}}),r.push(o)}return e.forEach(function(o){n.has(o.name)||i(o)}),r}function Vde(e){var t=jde(e);return Zce.reduce(function(n,r){return n.concat(t.filter(function(i){return i.phase===r}))},[])}function zde(e){var t;return function(){return t||(t=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})})),t}}function Ude(e){var t=e.reduce(function(n,r){var i=n[r.name];return n[r.name]=i?Object.assign({},i,r,{options:Object.assign({},i.options,r.options),data:Object.assign({},i.data,r.data)}):r,n},{});return Object.keys(t).map(function(n){return t[n]})}var h8={placement:"bottom",modifiers:[],strategy:"absolute"};function p8(){for(var e=arguments.length,t=new Array(e),n=0;n{}),g=E.useCallback(()=>{var P;!t||!p.current||!m.current||((P=y.current)==null||P.call(y),S.current=Wde(p.current,m.current,{placement:v,modifiers:[$ce,Mce,Nce,{...Ice,enabled:!!f},{name:"eventListeners",...Rce(s)},{name:"arrow",options:{padding:o}},{name:"offset",options:{offset:a??[0,l]}},{name:"flip",enabled:!!u,options:{padding:8}},{name:"preventOverflow",enabled:!!d,options:{boundary:c}},...n??[]],strategy:i}),S.current.forceUpdate(),y.current=S.current.destroy)},[v,t,n,f,s,o,a,l,u,d,c,i]);E.useEffect(()=>()=>{var P;!p.current&&!m.current&&((P=S.current)==null||P.destroy(),S.current=null)},[]);const b=E.useCallback(P=>{p.current=P,g()},[g]),_=E.useCallback((P={},A=null)=>({...P,ref:li(b,A)}),[b]),w=E.useCallback(P=>{m.current=P,g()},[g]),x=E.useCallback((P={},A=null)=>({...P,ref:li(w,A),style:{...P.style,position:i,minWidth:f?void 0:"max-content",inset:"0 auto auto 0"}}),[i,w,f]),C=E.useCallback((P={},A=null)=>{const{size:$,shadowColor:M,bg:T,style:O,...I}=P;return{...I,ref:A,"data-popper-arrow":"",style:Kde(P)}},[]),k=E.useCallback((P={},A=null)=>({...P,ref:A,"data-popper-arrow-inner":""}),[]);return{update(){var P;(P=S.current)==null||P.update()},forceUpdate(){var P;(P=S.current)==null||P.forceUpdate()},transformOrigin:Fn.transformOrigin.varRef,referenceRef:b,popperRef:w,getPopperProps:x,getArrowProps:C,getArrowInnerProps:k,getReferenceProps:_}}function Kde(e){const{size:t,shadowColor:n,bg:r,style:i}=e,o={...i,position:"absolute"};return t&&(o["--popper-arrow-size"]=t),n&&(o["--popper-arrow-shadow-color"]=n),r&&(o["--popper-arrow-bg"]=r),o}function Yde(e={}){const{onClose:t,onOpen:n,isOpen:r,id:i}=e,o=Bn(n),s=Bn(t),[a,l]=E.useState(e.defaultIsOpen||!1),u=r!==void 0?r:a,c=r!==void 0,d=E.useId(),f=i??`disclosure-${d}`,h=E.useCallback(()=>{c||l(!1),s==null||s()},[c,s]),p=E.useCallback(()=>{c||l(!0),o==null||o()},[c,o]),m=E.useCallback(()=>{u?h():p()},[u,p,h]);function S(y={}){return{...y,"aria-expanded":u,"aria-controls":f,onClick(g){var b;(b=y.onClick)==null||b.call(y,g),m()}}}function v(y={}){return{...y,hidden:!u,id:f}}return{isOpen:u,onOpen:p,onClose:h,onToggle:m,isControlled:c,getButtonProps:S,getDisclosureProps:v}}var Xde=e=>j.jsx($l,{viewBox:"0 0 24 24",...e,children:j.jsx("path",{fill:"currentColor",d:"M21,5H3C2.621,5,2.275,5.214,2.105,5.553C1.937,5.892,1.973,6.297,2.2,6.6l9,12 c0.188,0.252,0.485,0.4,0.8,0.4s0.611-0.148,0.8-0.4l9-12c0.228-0.303,0.264-0.708,0.095-1.047C21.725,5.214,21.379,5,21,5z"})}),Qde=e=>j.jsx($l,{viewBox:"0 0 24 24",...e,children:j.jsx("path",{fill:"currentColor",d:"M12.8,5.4c-0.377-0.504-1.223-0.504-1.6,0l-9,12c-0.228,0.303-0.264,0.708-0.095,1.047 C2.275,18.786,2.621,19,3,19h18c0.379,0,0.725-0.214,0.895-0.553c0.169-0.339,0.133-0.744-0.095-1.047L12.8,5.4z"})});function g8(e,t,n,r){E.useEffect(()=>{var i;if(!e.current||!r)return;const o=(i=e.current.ownerDocument.defaultView)!=null?i:window,s=Array.isArray(t)?t:[t],a=new o.MutationObserver(l=>{for(const u of l)u.type==="attributes"&&u.attributeName&&s.includes(u.attributeName)&&n(u)});return a.observe(e.current,{attributes:!0,attributeFilter:s}),()=>a.disconnect()})}function Zde(e,t){const n=Bn(e);E.useEffect(()=>{let r=null;const i=()=>n();return t!==null&&(r=window.setInterval(i,t)),()=>{r&&window.clearInterval(r)}},[t,n])}var Jde=50,m8=300;function efe(e,t){const[n,r]=E.useState(!1),[i,o]=E.useState(null),[s,a]=E.useState(!0),l=E.useRef(null),u=()=>clearTimeout(l.current);Zde(()=>{i==="increment"&&e(),i==="decrement"&&t()},n?Jde:null);const c=E.useCallback(()=>{s&&e(),l.current=setTimeout(()=>{a(!1),r(!0),o("increment")},m8)},[e,s]),d=E.useCallback(()=>{s&&t(),l.current=setTimeout(()=>{a(!1),r(!0),o("decrement")},m8)},[t,s]),f=E.useCallback(()=>{a(!0),r(!1),u()},[]);return E.useEffect(()=>()=>u(),[]),{up:c,down:d,stop:f,isSpinning:n}}var tfe=/^[Ee0-9+\-.]$/;function nfe(e){return tfe.test(e)}function rfe(e,t){if(e.key==null)return!0;const n=e.ctrlKey||e.altKey||e.metaKey;return!(e.key.length===1)||n?!0:t(e.key)}function ife(e={}){const{focusInputOnChange:t=!0,clampValueOnBlur:n=!0,keepWithinRange:r=!0,min:i=Number.MIN_SAFE_INTEGER,max:o=Number.MAX_SAFE_INTEGER,step:s=1,isReadOnly:a,isDisabled:l,isRequired:u,isInvalid:c,pattern:d="[0-9]*(.[0-9]+)?",inputMode:f="decimal",allowMouseWheel:h,id:p,onChange:m,precision:S,name:v,"aria-describedby":y,"aria-label":g,"aria-labelledby":b,onFocus:_,onBlur:w,onInvalid:x,getAriaValueText:C,isValidCharacter:k,format:P,parse:A,...$}=e,M=Bn(_),T=Bn(w),O=Bn(x),I=Bn(k??nfe),N=Bn(C),R=vce(e),{update:D,increment:L,decrement:V}=R,[z,U]=E.useState(!1),K=!(a||l),q=E.useRef(null),X=E.useRef(null),F=E.useRef(null),W=E.useRef(null),Q=E.useCallback(ee=>ee.split("").filter(I).join(""),[I]),J=E.useCallback(ee=>{var be;return(be=A==null?void 0:A(ee))!=null?be:ee},[A]),ne=E.useCallback(ee=>{var be;return((be=P==null?void 0:P(ee))!=null?be:ee).toString()},[P]);Ay(()=>{(R.valueAsNumber>o||R.valueAsNumber{if(!q.current)return;if(q.current.value!=R.value){const be=J(q.current.value);R.setValue(Q(be))}},[J,Q]);const Z=E.useCallback((ee=s)=>{K&&L(ee)},[L,K,s]),ge=E.useCallback((ee=s)=>{K&&V(ee)},[V,K,s]),ae=efe(Z,ge);g8(F,"disabled",ae.stop,ae.isSpinning),g8(W,"disabled",ae.stop,ae.isSpinning);const oe=E.useCallback(ee=>{if(ee.nativeEvent.isComposing)return;const Te=J(ee.currentTarget.value);D(Q(Te)),X.current={start:ee.currentTarget.selectionStart,end:ee.currentTarget.selectionEnd}},[D,Q,J]),Ce=E.useCallback(ee=>{var be,Te,Ne;M==null||M(ee),X.current&&(ee.target.selectionStart=(Te=X.current.start)!=null?Te:(be=ee.currentTarget.value)==null?void 0:be.length,ee.currentTarget.selectionEnd=(Ne=X.current.end)!=null?Ne:ee.currentTarget.selectionStart)},[M]),se=E.useCallback(ee=>{if(ee.nativeEvent.isComposing)return;rfe(ee,I)||ee.preventDefault();const be=We(ee)*s,Te=ee.key,ie={ArrowUp:()=>Z(be),ArrowDown:()=>ge(be),Home:()=>D(i),End:()=>D(o)}[Te];ie&&(ee.preventDefault(),ie(ee))},[I,s,Z,ge,D,i,o]),We=ee=>{let be=1;return(ee.metaKey||ee.ctrlKey)&&(be=.1),ee.shiftKey&&(be=10),be},mt=E.useMemo(()=>{const ee=N==null?void 0:N(R.value);if(ee!=null)return ee;const be=R.value.toString();return be||void 0},[R.value,N]),$e=E.useCallback(()=>{let ee=R.value;if(R.value==="")return;/^[eE]/.test(R.value.toString())?R.setValue(""):(R.valueAsNumbero&&(ee=o),R.cast(ee))},[R,o,i]),Fe=E.useCallback(()=>{U(!1),n&&$e()},[n,U,$e]),Ie=E.useCallback(()=>{t&&requestAnimationFrame(()=>{var ee;(ee=q.current)==null||ee.focus()})},[t]),nt=E.useCallback(ee=>{ee.preventDefault(),ae.up(),Ie()},[Ie,ae]),xt=E.useCallback(ee=>{ee.preventDefault(),ae.down(),Ie()},[Ie,ae]);ym(()=>q.current,"wheel",ee=>{var be,Te;const ie=((Te=(be=q.current)==null?void 0:be.ownerDocument)!=null?Te:document).activeElement===q.current;if(!h||!ie)return;ee.preventDefault();const he=We(ee)*s,Zt=Math.sign(ee.deltaY);Zt===-1?Z(he):Zt===1&&ge(he)},{passive:!1});const vn=E.useCallback((ee={},be=null)=>{const Te=l||r&&R.isAtMax;return{...ee,ref:li(be,F),role:"button",tabIndex:-1,onPointerDown:Dn(ee.onPointerDown,Ne=>{Ne.button!==0||Te||nt(Ne)}),onPointerLeave:Dn(ee.onPointerLeave,ae.stop),onPointerUp:Dn(ee.onPointerUp,ae.stop),disabled:Te,"aria-disabled":Zu(Te)}},[R.isAtMax,r,nt,ae.stop,l]),sn=E.useCallback((ee={},be=null)=>{const Te=l||r&&R.isAtMin;return{...ee,ref:li(be,W),role:"button",tabIndex:-1,onPointerDown:Dn(ee.onPointerDown,Ne=>{Ne.button!==0||Te||xt(Ne)}),onPointerLeave:Dn(ee.onPointerLeave,ae.stop),onPointerUp:Dn(ee.onPointerUp,ae.stop),disabled:Te,"aria-disabled":Zu(Te)}},[R.isAtMin,r,xt,ae.stop,l]),Ot=E.useCallback((ee={},be=null)=>{var Te,Ne,ie,he;return{name:v,inputMode:f,type:"text",pattern:d,"aria-labelledby":b,"aria-label":g,"aria-describedby":y,id:p,disabled:l,...ee,readOnly:(Te=ee.readOnly)!=null?Te:a,"aria-readonly":(Ne=ee.readOnly)!=null?Ne:a,"aria-required":(ie=ee.required)!=null?ie:u,required:(he=ee.required)!=null?he:u,ref:li(q,be),value:ne(R.value),role:"spinbutton","aria-valuemin":i,"aria-valuemax":o,"aria-valuenow":Number.isNaN(R.valueAsNumber)?void 0:R.valueAsNumber,"aria-invalid":Zu(c??R.isOutOfRange),"aria-valuetext":mt,autoComplete:"off",autoCorrect:"off",onChange:Dn(ee.onChange,oe),onKeyDown:Dn(ee.onKeyDown,se),onFocus:Dn(ee.onFocus,Ce,()=>U(!0)),onBlur:Dn(ee.onBlur,T,Fe)}},[v,f,d,b,g,ne,y,p,l,u,a,c,R.value,R.valueAsNumber,R.isOutOfRange,i,o,mt,oe,se,Ce,T,Fe]);return{value:ne(R.value),valueAsNumber:R.valueAsNumber,isFocused:z,isDisabled:l,isReadOnly:a,getIncrementButtonProps:vn,getDecrementButtonProps:sn,getInputProps:Ot,htmlProps:$}}var[ofe,d1]=mi({name:"NumberInputStylesContext",errorMessage:`useNumberInputStyles returned is 'undefined'. Seems you forgot to wrap the components in "" `}),[sfe,m3]=mi({name:"NumberInputContext",errorMessage:"useNumberInputContext: `context` is undefined. Seems you forgot to wrap number-input's components within "}),qD=Qe(function(t,n){const r=Jv("NumberInput",t),i=Co(t),o=kD(i),{htmlProps:s,...a}=ife(o),l=E.useMemo(()=>a,[a]);return j.jsx(sfe,{value:l,children:j.jsx(ofe,{value:r,children:j.jsx(ke.div,{...s,ref:n,className:zn("chakra-numberinput",t.className),__css:{position:"relative",zIndex:0,...r.root}})})})});qD.displayName="NumberInput";var KD=Qe(function(t,n){const r=d1();return j.jsx(ke.div,{"aria-hidden":!0,ref:n,...t,__css:{display:"flex",flexDirection:"column",position:"absolute",top:"0",insetEnd:"0px",margin:"1px",height:"calc(100% - 2px)",zIndex:1,...r.stepperGroup}})});KD.displayName="NumberInputStepper";var YD=Qe(function(t,n){const{getInputProps:r}=m3(),i=r(t,n),o=d1();return j.jsx(ke.input,{...i,className:zn("chakra-numberinput__field",t.className),__css:{width:"100%",...o.field}})});YD.displayName="NumberInputField";var XD=ke("div",{baseStyle:{display:"flex",justifyContent:"center",alignItems:"center",flex:1,transitionProperty:"common",transitionDuration:"normal",userSelect:"none",cursor:"pointer",lineHeight:"normal"}}),QD=Qe(function(t,n){var r;const i=d1(),{getDecrementButtonProps:o}=m3(),s=o(t,n);return j.jsx(XD,{...s,__css:i.stepper,children:(r=t.children)!=null?r:j.jsx(Xde,{})})});QD.displayName="NumberDecrementStepper";var ZD=Qe(function(t,n){var r;const{getIncrementButtonProps:i}=m3(),o=i(t,n),s=d1();return j.jsx(XD,{...o,__css:s.stepper,children:(r=t.children)!=null?r:j.jsx(Qde,{})})});ZD.displayName="NumberIncrementStepper";var ru=e=>e?"":void 0,r2=e=>e?!0:void 0,Tp=(...e)=>e.filter(Boolean).join(" ");function i2(...e){return function(n){e.some(r=>(r==null||r(n),n==null?void 0:n.defaultPrevented))}}function MEe(e){return{root:`slider-root-${e}`,getThumb:t=>`slider-thumb-${e}-${t}`,getInput:t=>`slider-input-${e}-${t}`,track:`slider-track-${e}`,innerTrack:`slider-filled-track-${e}`,getMarker:t=>`slider-marker-${e}-${t}`,output:`slider-output-${e}`}}function xg(e){const{orientation:t,vertical:n,horizontal:r}=e;return t==="vertical"?n:r}var bm={width:0,height:0},Cg=e=>e||bm;function afe(e){const{orientation:t,thumbPercents:n,thumbRects:r,isReversed:i}=e,o=m=>{var S;const v=(S=r[m])!=null?S:bm;return{position:"absolute",userSelect:"none",WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",touchAction:"none",...xg({orientation:t,vertical:{bottom:`calc(${n[m]}% - ${v.height/2}px)`},horizontal:{left:`calc(${n[m]}% - ${v.width/2}px)`}})}},s=t==="vertical"?r.reduce((m,S)=>Cg(m).height>Cg(S).height?m:S,bm):r.reduce((m,S)=>Cg(m).width>Cg(S).width?m:S,bm),a={position:"relative",touchAction:"none",WebkitTapHighlightColor:"rgba(0,0,0,0)",userSelect:"none",outline:0,...xg({orientation:t,vertical:s?{paddingLeft:s.width/2,paddingRight:s.width/2}:{},horizontal:s?{paddingTop:s.height/2,paddingBottom:s.height/2}:{}})},l={position:"absolute",...xg({orientation:t,vertical:{left:"50%",transform:"translateX(-50%)",height:"100%"},horizontal:{top:"50%",transform:"translateY(-50%)",width:"100%"}})},u=n.length===1,c=[0,i?100-n[0]:n[0]],d=u?c:n;let f=d[0];!u&&i&&(f=100-f);const h=Math.abs(d[d.length-1]-d[0]),p={...l,...xg({orientation:t,vertical:i?{height:`${h}%`,top:`${f}%`}:{height:`${h}%`,bottom:`${f}%`},horizontal:i?{width:`${h}%`,right:`${f}%`}:{width:`${h}%`,left:`${f}%`}})};return{trackStyle:l,innerTrackStyle:p,rootStyle:a,getThumbStyle:o}}function lfe(e){const{isReversed:t,direction:n,orientation:r}=e;return n==="ltr"||r==="vertical"?t:!t}function ufe(e,t,n,r){return e.addEventListener(t,n,r),()=>{e.removeEventListener(t,n,r)}}function cfe(e){const t=ffe(e);return typeof t.PointerEvent<"u"&&e instanceof t.PointerEvent?e.pointerType==="mouse":e instanceof t.MouseEvent}function JD(e){return!!e.touches}function dfe(e){return JD(e)&&e.touches.length>1}function ffe(e){var t;return(t=e.view)!=null?t:window}function hfe(e,t="page"){const n=e.touches[0]||e.changedTouches[0];return{x:n[`${t}X`],y:n[`${t}Y`]}}function pfe(e,t="page"){return{x:e[`${t}X`],y:e[`${t}Y`]}}function eL(e,t="page"){return JD(e)?hfe(e,t):pfe(e,t)}function gfe(e){return t=>{const n=cfe(t);(!n||n&&t.button===0)&&e(t)}}function mfe(e,t=!1){function n(i){e(i,{point:eL(i)})}return t?gfe(n):n}function Sm(e,t,n,r){return ufe(e,t,mfe(n,t==="pointerdown"),r)}var yfe=Object.defineProperty,vfe=(e,t,n)=>t in e?yfe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,bi=(e,t,n)=>(vfe(e,typeof t!="symbol"?t+"":t,n),n),bfe=class{constructor(e,t,n){bi(this,"history",[]),bi(this,"startEvent",null),bi(this,"lastEvent",null),bi(this,"lastEventInfo",null),bi(this,"handlers",{}),bi(this,"removeListeners",()=>{}),bi(this,"threshold",3),bi(this,"win"),bi(this,"updatePoint",()=>{if(!(this.lastEvent&&this.lastEventInfo))return;const a=o2(this.lastEventInfo,this.history),l=this.startEvent!==null,u=xfe(a.offset,{x:0,y:0})>=this.threshold;if(!l&&!u)return;const{timestamp:c}=z6();this.history.push({...a.point,timestamp:c});const{onStart:d,onMove:f}=this.handlers;l||(d==null||d(this.lastEvent,a),this.startEvent=this.lastEvent),f==null||f(this.lastEvent,a)}),bi(this,"onPointerMove",(a,l)=>{this.lastEvent=a,this.lastEventInfo=l,Qie.update(this.updatePoint,!0)}),bi(this,"onPointerUp",(a,l)=>{const u=o2(l,this.history),{onEnd:c,onSessionEnd:d}=this.handlers;d==null||d(a,u),this.end(),!(!c||!this.startEvent)&&(c==null||c(a,u))});var r;if(this.win=(r=e.view)!=null?r:window,dfe(e))return;this.handlers=t,n&&(this.threshold=n),e.stopPropagation(),e.preventDefault();const i={point:eL(e)},{timestamp:o}=z6();this.history=[{...i.point,timestamp:o}];const{onSessionStart:s}=t;s==null||s(e,o2(i,this.history)),this.removeListeners=wfe(Sm(this.win,"pointermove",this.onPointerMove),Sm(this.win,"pointerup",this.onPointerUp),Sm(this.win,"pointercancel",this.onPointerUp))}updateHandlers(e){this.handlers=e}end(){var e;(e=this.removeListeners)==null||e.call(this),Zie.update(this.updatePoint)}};function y8(e,t){return{x:e.x-t.x,y:e.y-t.y}}function o2(e,t){return{point:e.point,delta:y8(e.point,t[t.length-1]),offset:y8(e.point,t[0]),velocity:_fe(t,.1)}}var Sfe=e=>e*1e3;function _fe(e,t){if(e.length<2)return{x:0,y:0};let n=e.length-1,r=null;const i=e[e.length-1];for(;n>=0&&(r=e[n],!(i.timestamp-r.timestamp>Sfe(t)));)n--;if(!r)return{x:0,y:0};const o=(i.timestamp-r.timestamp)/1e3;if(o===0)return{x:0,y:0};const s={x:(i.x-r.x)/o,y:(i.y-r.y)/o};return s.x===1/0&&(s.x=0),s.y===1/0&&(s.y=0),s}function wfe(...e){return t=>e.reduce((n,r)=>r(n),t)}function s2(e,t){return Math.abs(e-t)}function v8(e){return"x"in e&&"y"in e}function xfe(e,t){if(typeof e=="number"&&typeof t=="number")return s2(e,t);if(v8(e)&&v8(t)){const n=s2(e.x,t.x),r=s2(e.y,t.y);return Math.sqrt(n**2+r**2)}return 0}function tL(e){const t=E.useRef(null);return t.current=e,t}function Cfe(e,t){const{onPan:n,onPanStart:r,onPanEnd:i,onPanSessionStart:o,onPanSessionEnd:s,threshold:a}=t,l=!!(n||r||i||o||s),u=E.useRef(null),c=tL({onSessionStart:o,onSessionEnd:s,onStart:r,onMove:n,onEnd(d,f){u.current=null,i==null||i(d,f)}});E.useEffect(()=>{var d;(d=u.current)==null||d.updateHandlers(c.current)}),E.useEffect(()=>{const d=e.current;if(!d||!l)return;function f(h){u.current=new bfe(h,c.current,a)}return Sm(d,"pointerdown",f)},[e,l,c,a]),E.useEffect(()=>()=>{var d;(d=u.current)==null||d.end(),u.current=null},[])}function Tfe(e,t){if(!e){t(void 0);return}t({width:e.offsetWidth,height:e.offsetHeight});const n=e.ownerDocument.defaultView??window,r=new n.ResizeObserver(i=>{if(!Array.isArray(i)||!i.length)return;const[o]=i;let s,a;if("borderBoxSize"in o){const l=o.borderBoxSize,u=Array.isArray(l)?l[0]:l;s=u.inlineSize,a=u.blockSize}else s=e.offsetWidth,a=e.offsetHeight;t({width:s,height:a})});return r.observe(e,{box:"border-box"}),()=>r.unobserve(e)}var Efe=globalThis!=null&&globalThis.document?E.useLayoutEffect:E.useEffect;function Pfe(e,t){var n,r;if(!e||!e.parentElement)return;const i=(r=(n=e.ownerDocument)==null?void 0:n.defaultView)!=null?r:window,o=new i.MutationObserver(()=>{t()});return o.observe(e.parentElement,{childList:!0}),()=>{o.disconnect()}}function kfe({getNodes:e,observeMutation:t=!0}){const[n,r]=E.useState([]),[i,o]=E.useState(0);return Efe(()=>{const s=e(),a=s.map((l,u)=>Tfe(l,c=>{r(d=>[...d.slice(0,u),c,...d.slice(u+1)])}));if(t){const l=s[0];a.push(Pfe(l,()=>{o(u=>u+1)}))}return()=>{a.forEach(l=>{l==null||l()})}},[i]),n}function Afe(e){return typeof e=="object"&&e!==null&&"current"in e}function Ofe(e){const[t]=kfe({observeMutation:!1,getNodes(){return[Afe(e)?e.current:e]}});return t}function Rfe(e){var t;const{min:n=0,max:r=100,onChange:i,value:o,defaultValue:s,isReversed:a,direction:l="ltr",orientation:u="horizontal",id:c,isDisabled:d,isReadOnly:f,onChangeStart:h,onChangeEnd:p,step:m=1,getAriaValueText:S,"aria-valuetext":v,"aria-label":y,"aria-labelledby":g,name:b,focusThumbOnChange:_=!0,...w}=e,x=Bn(h),C=Bn(p),k=Bn(S),P=lfe({isReversed:a,direction:l,orientation:u}),[A,$]=oce({value:o,defaultValue:s??Nfe(n,r),onChange:i}),[M,T]=E.useState(!1),[O,I]=E.useState(!1),N=!(d||f),R=(r-n)/10,D=m||(r-n)/100,L=mm(A,n,r),V=r-L+n,U=e8(P?V:L,n,r),K=u==="vertical",q=tL({min:n,max:r,step:m,isDisabled:d,value:L,isInteractive:N,isReversed:P,isVertical:K,eventSource:null,focusThumbOnChange:_,orientation:u}),X=E.useRef(null),F=E.useRef(null),W=E.useRef(null),Q=E.useId(),J=c??Q,[ne,Z]=[`slider-thumb-${J}`,`slider-track-${J}`],ge=E.useCallback(ie=>{var he,Zt;if(!X.current)return;const Rt=q.current;Rt.eventSource="pointer";const lt=X.current.getBoundingClientRect(),{clientX:Zn,clientY:ko}=(Zt=(he=ie.touches)==null?void 0:he[0])!=null?Zt:ie,qr=K?lt.bottom-ko:Zn-lt.left,Ao=K?lt.height:lt.width;let ut=qr/Ao;P&&(ut=1-ut);let qe=yce(ut,Rt.min,Rt.max);return Rt.step&&(qe=parseFloat(t8(qe,Rt.min,Rt.step))),qe=mm(qe,Rt.min,Rt.max),qe},[K,P,q]),ae=E.useCallback(ie=>{const he=q.current;he.isInteractive&&(ie=parseFloat(t8(ie,he.min,D)),ie=mm(ie,he.min,he.max),$(ie))},[D,$,q]),oe=E.useMemo(()=>({stepUp(ie=D){const he=P?L-ie:L+ie;ae(he)},stepDown(ie=D){const he=P?L+ie:L-ie;ae(he)},reset(){ae(s||0)},stepTo(ie){ae(ie)}}),[ae,P,L,D,s]),Ce=E.useCallback(ie=>{const he=q.current,Rt={ArrowRight:()=>oe.stepUp(),ArrowUp:()=>oe.stepUp(),ArrowLeft:()=>oe.stepDown(),ArrowDown:()=>oe.stepDown(),PageUp:()=>oe.stepUp(R),PageDown:()=>oe.stepDown(R),Home:()=>ae(he.min),End:()=>ae(he.max)}[ie.key];Rt&&(ie.preventDefault(),ie.stopPropagation(),Rt(ie),he.eventSource="keyboard")},[oe,ae,R,q]),se=(t=k==null?void 0:k(L))!=null?t:v,We=Ofe(F),{getThumbStyle:mt,rootStyle:$e,trackStyle:Fe,innerTrackStyle:Ie}=E.useMemo(()=>{const ie=q.current,he=We??{width:0,height:0};return afe({isReversed:P,orientation:ie.orientation,thumbRects:[he],thumbPercents:[U]})},[P,We,U,q]),nt=E.useCallback(()=>{q.current.focusThumbOnChange&&setTimeout(()=>{var he;return(he=F.current)==null?void 0:he.focus()})},[q]);Ay(()=>{const ie=q.current;nt(),ie.eventSource==="keyboard"&&(C==null||C(ie.value))},[L,C]);function xt(ie){const he=ge(ie);he!=null&&he!==q.current.value&&$(he)}Cfe(W,{onPanSessionStart(ie){const he=q.current;he.isInteractive&&(T(!0),nt(),xt(ie),x==null||x(he.value))},onPanSessionEnd(){const ie=q.current;ie.isInteractive&&(T(!1),C==null||C(ie.value))},onPan(ie){q.current.isInteractive&&xt(ie)}});const vn=E.useCallback((ie={},he=null)=>({...ie,...w,ref:li(he,W),tabIndex:-1,"aria-disabled":r2(d),"data-focused":ru(O),style:{...ie.style,...$e}}),[w,d,O,$e]),sn=E.useCallback((ie={},he=null)=>({...ie,ref:li(he,X),id:Z,"data-disabled":ru(d),style:{...ie.style,...Fe}}),[d,Z,Fe]),Ot=E.useCallback((ie={},he=null)=>({...ie,ref:he,style:{...ie.style,...Ie}}),[Ie]),ee=E.useCallback((ie={},he=null)=>({...ie,ref:li(he,F),role:"slider",tabIndex:N?0:void 0,id:ne,"data-active":ru(M),"aria-valuetext":se,"aria-valuemin":n,"aria-valuemax":r,"aria-valuenow":L,"aria-orientation":u,"aria-disabled":r2(d),"aria-readonly":r2(f),"aria-label":y,"aria-labelledby":y?void 0:g,style:{...ie.style,...mt(0)},onKeyDown:i2(ie.onKeyDown,Ce),onFocus:i2(ie.onFocus,()=>I(!0)),onBlur:i2(ie.onBlur,()=>I(!1))}),[N,ne,M,se,n,r,L,u,d,f,y,g,mt,Ce]),be=E.useCallback((ie,he=null)=>{const Zt=!(ie.valuer),Rt=L>=ie.value,lt=e8(ie.value,n,r),Zn={position:"absolute",pointerEvents:"none",...Ife({orientation:u,vertical:{bottom:P?`${100-lt}%`:`${lt}%`},horizontal:{left:P?`${100-lt}%`:`${lt}%`}})};return{...ie,ref:he,role:"presentation","aria-hidden":!0,"data-disabled":ru(d),"data-invalid":ru(!Zt),"data-highlighted":ru(Rt),style:{...ie.style,...Zn}}},[d,P,r,n,u,L]),Te=E.useCallback((ie={},he=null)=>({...ie,ref:he,type:"hidden",value:L,name:b}),[b,L]);return{state:{value:L,isFocused:O,isDragging:M},actions:oe,getRootProps:vn,getTrackProps:sn,getInnerTrackProps:Ot,getThumbProps:ee,getMarkerProps:be,getInputProps:Te}}function Ife(e){const{orientation:t,vertical:n,horizontal:r}=e;return t==="vertical"?n:r}function Nfe(e,t){return t"}),[Dfe,h1]=mi({name:"SliderStylesContext",hookName:"useSliderStyles",providerName:""}),nL=Qe((e,t)=>{var n;const r={...e,orientation:(n=e==null?void 0:e.orientation)!=null?n:"horizontal"},i=Jv("Slider",r),o=Co(r),{direction:s}=Yv();o.direction=s;const{getInputProps:a,getRootProps:l,...u}=Rfe(o),c=l(),d=a({},t);return j.jsx(Mfe,{value:u,children:j.jsx(Dfe,{value:i,children:j.jsxs(ke.div,{...c,className:Tp("chakra-slider",r.className),__css:i.container,children:[r.children,j.jsx("input",{...d})]})})})});nL.displayName="Slider";var rL=Qe((e,t)=>{const{getThumbProps:n}=f1(),r=h1(),i=n(e,t);return j.jsx(ke.div,{...i,className:Tp("chakra-slider__thumb",e.className),__css:r.thumb})});rL.displayName="SliderThumb";var iL=Qe((e,t)=>{const{getTrackProps:n}=f1(),r=h1(),i=n(e,t);return j.jsx(ke.div,{...i,className:Tp("chakra-slider__track",e.className),__css:r.track})});iL.displayName="SliderTrack";var oL=Qe((e,t)=>{const{getInnerTrackProps:n}=f1(),r=h1(),i=n(e,t);return j.jsx(ke.div,{...i,className:Tp("chakra-slider__filled-track",e.className),__css:r.filledTrack})});oL.displayName="SliderFilledTrack";var gu=Qe((e,t)=>{const{getMarkerProps:n}=f1(),r=h1(),i=n(e,t);return j.jsx(ke.div,{...i,className:Tp("chakra-slider__marker",e.className),__css:r.mark})});gu.displayName="SliderMark";var Lfe={exit:{scale:.85,opacity:0,transition:{opacity:{duration:.15,easings:"easeInOut"},scale:{duration:.2,easings:"easeInOut"}}},enter:{scale:1,opacity:1,transition:{opacity:{easings:"easeOut",duration:.2},scale:{duration:.2,ease:[.175,.885,.4,1.1]}}}},Bw=e=>{var t;return((t=e.current)==null?void 0:t.ownerDocument)||document},_m=e=>{var t,n;return((n=(t=e.current)==null?void 0:t.ownerDocument)==null?void 0:n.defaultView)||window};function $fe(e={}){const{openDelay:t=0,closeDelay:n=0,closeOnClick:r=!0,closeOnMouseDown:i,closeOnScroll:o,closeOnPointerDown:s=i,closeOnEsc:a=!0,onOpen:l,onClose:u,placement:c,id:d,isOpen:f,defaultIsOpen:h,arrowSize:p=10,arrowShadowColor:m,arrowPadding:S,modifiers:v,isDisabled:y,gutter:g,offset:b,direction:_,...w}=e,{isOpen:x,onOpen:C,onClose:k}=Yde({isOpen:f,defaultIsOpen:h,onOpen:l,onClose:u}),{referenceRef:P,getPopperProps:A,getArrowInnerProps:$,getArrowProps:M}=qde({enabled:x,placement:c,arrowPadding:S,modifiers:v,gutter:g,offset:b,direction:_}),T=E.useId(),I=`tooltip-${d??T}`,N=E.useRef(null),R=E.useRef(),D=E.useCallback(()=>{R.current&&(clearTimeout(R.current),R.current=void 0)},[]),L=E.useRef(),V=E.useCallback(()=>{L.current&&(clearTimeout(L.current),L.current=void 0)},[]),z=E.useCallback(()=>{V(),k()},[k,V]),U=Ffe(N,z),K=E.useCallback(()=>{if(!y&&!R.current){U();const Z=_m(N);R.current=Z.setTimeout(C,t)}},[U,y,C,t]),q=E.useCallback(()=>{D();const Z=_m(N);L.current=Z.setTimeout(z,n)},[n,z,D]),X=E.useCallback(()=>{x&&r&&q()},[r,q,x]),F=E.useCallback(()=>{x&&s&&q()},[s,q,x]),W=E.useCallback(Z=>{x&&Z.key==="Escape"&&q()},[x,q]);ym(()=>Bw(N),"keydown",a?W:void 0),ym(()=>{const Z=N.current;if(!Z)return null;const ge=ID(Z);return ge.localName==="body"?_m(N):ge},"scroll",()=>{x&&o&&z()},{passive:!0,capture:!0}),E.useEffect(()=>{y&&(D(),x&&k())},[y,x,k,D]),E.useEffect(()=>()=>{D(),V()},[D,V]),ym(()=>N.current,"pointerleave",q);const Q=E.useCallback((Z={},ge=null)=>({...Z,ref:li(N,ge,P),onPointerEnter:Dn(Z.onPointerEnter,oe=>{oe.pointerType!=="touch"&&K()}),onClick:Dn(Z.onClick,X),onPointerDown:Dn(Z.onPointerDown,F),onFocus:Dn(Z.onFocus,K),onBlur:Dn(Z.onBlur,q),"aria-describedby":x?I:void 0}),[K,q,F,x,I,X,P]),J=E.useCallback((Z={},ge=null)=>A({...Z,style:{...Z.style,[Fn.arrowSize.var]:p?`${p}px`:void 0,[Fn.arrowShadowColor.var]:m}},ge),[A,p,m]),ne=E.useCallback((Z={},ge=null)=>{const ae={...Z.style,position:"relative",transformOrigin:Fn.transformOrigin.varRef};return{ref:ge,...w,...Z,id:I,role:"tooltip",style:ae}},[w,I]);return{isOpen:x,show:K,hide:q,getTriggerProps:Q,getTooltipProps:ne,getTooltipPositionerProps:J,getArrowProps:M,getArrowInnerProps:$}}var a2="chakra-ui:close-tooltip";function Ffe(e,t){return E.useEffect(()=>{const n=Bw(e);return n.addEventListener(a2,t),()=>n.removeEventListener(a2,t)},[t,e]),()=>{const n=Bw(e),r=_m(e);n.dispatchEvent(new r.CustomEvent(a2))}}function Bfe(e,t=[]){const n=Object.assign({},e);for(const r of t)r in n&&delete n[r];return n}function jfe(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}var Vfe=ke(n3.div),y3=Qe((e,t)=>{var n,r;const i=Ml("Tooltip",e),o=Co(e),s=Yv(),{children:a,label:l,shouldWrapChildren:u,"aria-label":c,hasArrow:d,bg:f,portalProps:h,background:p,backgroundColor:m,bgColor:S,motionProps:v,...y}=o,g=(r=(n=p??m)!=null?n:f)!=null?r:S;if(g){i.bg=g;const A=$ie(s,"colors",g);i[Fn.arrowBg.var]=A}const b=$fe({...y,direction:s.direction}),_=typeof a=="string"||u;let w;if(_)w=j.jsx(ke.span,{display:"inline-block",tabIndex:0,...b.getTriggerProps(),children:a});else{const A=E.Children.only(a);w=E.cloneElement(A,b.getTriggerProps(A.props,A.ref))}const x=!!c,C=b.getTooltipProps({},t),k=x?Bfe(C,["role","id"]):C,P=jfe(C,["role","id"]);return l?j.jsxs(j.Fragment,{children:[w,j.jsx(r3,{children:b.isOpen&&j.jsx(mp,{...h,children:j.jsx(ke.div,{...b.getTooltipPositionerProps(),__css:{zIndex:i.zIndex,pointerEvents:"none"},children:j.jsxs(Vfe,{variants:Lfe,initial:"exit",animate:"enter",exit:"exit",...v,...k,__css:i,children:[l,x&&j.jsx(ke.span,{srOnly:!0,...P,children:c}),d&&j.jsx(ke.div,{"data-popper-arrow":!0,className:"chakra-tooltip__arrow-wrapper",children:j.jsx(ke.div,{"data-popper-arrow-inner":!0,className:"chakra-tooltip__arrow",__css:{bg:i.bg}})})]})})})})]}):j.jsx(j.Fragment,{children:a})});y3.displayName="Tooltip";const sL={shift:!1},aL=Lt({name:"hotkeys",initialState:sL,reducers:{shiftKeyPressed:(e,t)=>{e.shift=t.payload}}}),{shiftKeyPressed:b8}=aL.actions,zfe=aL.reducer,DEe=e=>e.hotkeys;function Ufe(){if(console&&console.warn){for(var e=arguments.length,t=new Array(e),n=0;n()=>{if(e.isInitialized)t();else{const n=()=>{setTimeout(()=>{e.off("initialized",n)},0),t()};e.on("initialized",n)}};function _8(e,t,n){e.loadNamespaces(t,lL(e,n))}function w8(e,t,n,r){typeof n=="string"&&(n=[n]),n.forEach(i=>{e.options.ns.indexOf(i)<0&&e.options.ns.push(i)}),e.loadLanguages(t,lL(e,r))}function Gfe(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};const r=t.languages[0],i=t.options?t.options.fallbackLng:!1,o=t.languages[t.languages.length-1];if(r.toLowerCase()==="cimode")return!0;const s=(a,l)=>{const u=t.services.backendConnector.state[`${a}|${l}`];return u===-1||u===2};return n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!s(t.isLanguageChangingTo,e)?!1:!!(t.hasResourceBundle(r,e)||!t.services.backendConnector.backend||t.options.resources&&!t.options.partialBundledLanguages||s(r,e)&&(!i||s(o,e)))}function Hfe(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return!t.languages||!t.languages.length?(jw("i18n.languages were undefined or empty",t.languages),!0):t.options.ignoreJSONStructure!==void 0?t.hasLoadedNamespace(e,{lng:n.lng,precheck:(i,o)=>{if(n.bindI18n&&n.bindI18n.indexOf("languageChanging")>-1&&i.services.backendConnector.backend&&i.isLanguageChangingTo&&!o(i.isLanguageChangingTo,e))return!1}}):Gfe(e,t,n)}const Wfe=/&(?:amp|#38|lt|#60|gt|#62|apos|#39|quot|#34|nbsp|#160|copy|#169|reg|#174|hellip|#8230|#x2F|#47);/g,qfe={"&":"&","&":"&","<":"<","<":"<",">":">",">":">","'":"'","'":"'",""":'"',""":'"'," ":" "," ":" ","©":"©","©":"©","®":"®","®":"®","…":"…","…":"…","/":"/","/":"/"},Kfe=e=>qfe[e],Yfe=e=>e.replace(Wfe,Kfe);let Vw={bindI18n:"languageChanged",bindI18nStore:"",transEmptyNodeValue:"",transSupportBasicHtmlNodes:!0,transWrapTextNodes:"",transKeepBasicHtmlNodesFor:["br","strong","i","p"],useSuspense:!0,unescape:Yfe};function Xfe(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Vw={...Vw,...e}}function Qfe(){return Vw}let uL;function Zfe(e){uL=e}function Jfe(){return uL}const ehe={type:"3rdParty",init(e){Xfe(e.options.react),Zfe(e)}},the=E.createContext();class nhe{constructor(){this.usedNamespaces={}}addUsedNamespaces(t){t.forEach(n=>{this.usedNamespaces[n]||(this.usedNamespaces[n]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}}const rhe=(e,t)=>{const n=E.useRef();return E.useEffect(()=>{n.current=t?n.current:e},[e,t]),n.current};function cL(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const{i18n:n}=t,{i18n:r,defaultNS:i}=E.useContext(the)||{},o=n||r||Jfe();if(o&&!o.reportNamespaces&&(o.reportNamespaces=new nhe),!o){jw("You will need to pass in an i18next instance by using initReactI18next");const g=(_,w)=>typeof w=="string"?w:w&&typeof w=="object"&&typeof w.defaultValue=="string"?w.defaultValue:Array.isArray(_)?_[_.length-1]:_,b=[g,{},!1];return b.t=g,b.i18n={},b.ready=!1,b}o.options.react&&o.options.react.wait!==void 0&&jw("It seems you are still using the old wait option, you may migrate to the new useSuspense behaviour.");const s={...Qfe(),...o.options.react,...t},{useSuspense:a,keyPrefix:l}=s;let u=e||i||o.options&&o.options.defaultNS;u=typeof u=="string"?[u]:u||["translation"],o.reportNamespaces.addUsedNamespaces&&o.reportNamespaces.addUsedNamespaces(u);const c=(o.isInitialized||o.initializedStoreOnce)&&u.every(g=>Hfe(g,o,s));function d(){return o.getFixedT(t.lng||null,s.nsMode==="fallback"?u:u[0],l)}const[f,h]=E.useState(d);let p=u.join();t.lng&&(p=`${t.lng}${p}`);const m=rhe(p),S=E.useRef(!0);E.useEffect(()=>{const{bindI18n:g,bindI18nStore:b}=s;S.current=!0,!c&&!a&&(t.lng?w8(o,t.lng,u,()=>{S.current&&h(d)}):_8(o,u,()=>{S.current&&h(d)})),c&&m&&m!==p&&S.current&&h(d);function _(){S.current&&h(d)}return g&&o&&o.on(g,_),b&&o&&o.store.on(b,_),()=>{S.current=!1,g&&o&&g.split(" ").forEach(w=>o.off(w,_)),b&&o&&b.split(" ").forEach(w=>o.store.off(w,_))}},[o,p]);const v=E.useRef(!0);E.useEffect(()=>{S.current&&!v.current&&h(d),v.current=!1},[o,l]);const y=[f,o,c];if(y.t=f,y.i18n=o,y.ready=c,c||!c&&!a)return y;throw new Promise(g=>{t.lng?w8(o,t.lng,u,()=>g()):_8(o,u,()=>g())})}var dL={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},x8=Ve.createContext&&Ve.createContext(dL),ra=globalThis&&globalThis.__assign||function(){return ra=Object.assign||function(e){for(var t,n=1,r=arguments.length;n{const{role:n,tooltip:r="",tooltipProps:i,isChecked:o,...s}=e;return j.jsx(y3,{label:r,hasArrow:!0,...i,...i!=null&&i.placement?{placement:i.placement}:{placement:"top"},children:j.jsx(xD,{ref:t,role:n,colorScheme:o?"accent":"base",...s})})});hL.displayName="IAIIconButton";const ahe=E.memo(hL),Pd={mt:1.5,fontSize:"2xs"},lhe=e=>{const[t,n]=E.useState(!1),{label:r,value:i,min:o=1,max:s=100,step:a=1,onChange:l,tooltipSuffix:u="",withSliderMarks:c=!1,withInput:d=!1,isInteger:f=!1,inputWidth:h=16,withReset:p=!1,hideTooltip:m=!1,isCompact:S=!1,isDisabled:v=!1,sliderMarks:y,handleReset:g,sliderFormControlProps:b,sliderFormLabelProps:_,sliderMarkProps:w,sliderTrackProps:x,sliderThumbProps:C,sliderNumberInputProps:k,sliderNumberInputFieldProps:P,sliderNumberInputStepperProps:A,sliderTooltipProps:$,sliderIAIIconButtonProps:M,...T}=e,O=Kc(),{t:I}=cL(),[N,R]=E.useState(String(i));E.useEffect(()=>{R(i)},[i]);const D=E.useMemo(()=>k!=null&&k.max?k.max:s,[s,k==null?void 0:k.max]),L=E.useCallback(F=>{l(F)},[l]),V=E.useCallback(F=>{F.target.value===""&&(F.target.value=String(o));const W=qo(f?Math.floor(Number(F.target.value)):Number(N),o,D),Q=Wd(W,a);l(Q),R(Q)},[f,N,o,D,l,a]),z=E.useCallback(F=>{console.log("input"),R(F)},[]),U=E.useCallback(()=>{g&&g()},[g]),K=E.useCallback(F=>{F.target instanceof HTMLDivElement&&F.target.focus()},[]),q=E.useCallback(F=>{F.shiftKey&&O(b8(!0))},[O]),X=E.useCallback(F=>{F.shiftKey||O(b8(!1))},[O]);return j.jsxs(TD,{onClick:K,sx:S?{display:"flex",flexDirection:"row",alignItems:"center",columnGap:4,margin:0,padding:0}:{},isDisabled:v,...b,children:[r&&j.jsx(ED,{..._,mb:-1,children:r}),j.jsxs(LD,{w:"100%",gap:2,alignItems:"center",children:[j.jsxs(nL,{"aria-label":r,value:i,min:o,max:s,step:a,onChange:L,onMouseEnter:()=>n(!0),onMouseLeave:()=>n(!1),focusThumbOnChange:!1,isDisabled:v,...T,children:[c&&!y&&j.jsxs(j.Fragment,{children:[j.jsx(gu,{value:o,sx:{insetInlineStart:"0 !important",insetInlineEnd:"unset !important",...Pd},...w,children:o}),j.jsx(gu,{value:s,sx:{insetInlineStart:"unset !important",insetInlineEnd:"0 !important",...Pd},...w,children:s})]}),c&&y&&j.jsx(j.Fragment,{children:y.map((F,W)=>W===0?j.jsx(gu,{value:F,sx:{insetInlineStart:"0 !important",insetInlineEnd:"unset !important",...Pd},...w,children:F},F):W===y.length-1?j.jsx(gu,{value:F,sx:{insetInlineStart:"unset !important",insetInlineEnd:"0 !important",...Pd},...w,children:F},F):j.jsx(gu,{value:F,sx:{...Pd},...w,children:F},F))}),j.jsx(iL,{...x,children:j.jsx(oL,{})}),j.jsx(y3,{hasArrow:!0,placement:"top",isOpen:t,label:`${i}${u}`,hidden:m,...$,children:j.jsx(rL,{...C,zIndex:0})})]}),d&&j.jsxs(qD,{min:o,max:D,step:a,value:N,onChange:z,onBlur:V,focusInputOnChange:!1,...k,children:[j.jsx(YD,{onKeyDown:q,onKeyUp:X,minWidth:h,...P}),j.jsxs(KD,{...A,children:[j.jsx(ZD,{onClick:()=>l(Number(N))}),j.jsx(QD,{onClick:()=>l(Number(N))})]})]}),p&&j.jsx(ahe,{size:"sm","aria-label":I("accessibility.reset"),tooltip:I("accessibility.reset"),icon:j.jsx(she,{}),isDisabled:v,onClick:U,...M})]})]})},uhe=E.memo(lhe),Xd={"sd-1":{maxClip:12,markers:[0,1,2,3,4,8,12]},"sd-2":{maxClip:24,markers:[0,1,2,3,5,10,15,20,24]}};function VEe(){const e=wc(l=>l.generation.clipSkip),{model:t}=wc(l=>l.generation),n=Kc(),{t:r}=cL(),i=E.useCallback(l=>{n(E8(l))},[n]),o=E.useCallback(()=>{n(E8(0))},[n]),s=E.useMemo(()=>t?Xd[t.base_model].maxClip:Xd["sd-1"].maxClip,[t]),a=E.useMemo(()=>t?Xd[t.base_model].markers:Xd["sd-1"].markers,[t]);return j.jsx(uhe,{label:r("parameters.clipSkip"),"aria-label":r("parameters.clipSkip"),min:0,max:s,step:1,value:e,onChange:i,withSliderMarks:!0,sliderMarks:a,withInput:!0,withReset:!0,handleReset:o})}var Xe;(function(e){e.assertEqual=i=>i;function t(i){}e.assertIs=t;function n(i){throw new Error}e.assertNever=n,e.arrayToEnum=i=>{const o={};for(const s of i)o[s]=s;return o},e.getValidEnumValues=i=>{const o=e.objectKeys(i).filter(a=>typeof i[i[a]]!="number"),s={};for(const a of o)s[a]=i[a];return e.objectValues(s)},e.objectValues=i=>e.objectKeys(i).map(function(o){return i[o]}),e.objectKeys=typeof Object.keys=="function"?i=>Object.keys(i):i=>{const o=[];for(const s in i)Object.prototype.hasOwnProperty.call(i,s)&&o.push(s);return o},e.find=(i,o)=>{for(const s of i)if(o(s))return s},e.isInteger=typeof Number.isInteger=="function"?i=>Number.isInteger(i):i=>typeof i=="number"&&isFinite(i)&&Math.floor(i)===i;function r(i,o=" | "){return i.map(s=>typeof s=="string"?`'${s}'`:s).join(o)}e.joinValues=r,e.jsonStringifyReplacer=(i,o)=>typeof o=="bigint"?o.toString():o})(Xe||(Xe={}));var zw;(function(e){e.mergeShapes=(t,n)=>({...t,...n})})(zw||(zw={}));const le=Xe.arrayToEnum(["string","nan","number","integer","float","boolean","date","bigint","symbol","function","undefined","null","array","object","unknown","promise","void","never","map","set"]),Vs=e=>{switch(typeof e){case"undefined":return le.undefined;case"string":return le.string;case"number":return isNaN(e)?le.nan:le.number;case"boolean":return le.boolean;case"function":return le.function;case"bigint":return le.bigint;case"symbol":return le.symbol;case"object":return Array.isArray(e)?le.array:e===null?le.null:e.then&&typeof e.then=="function"&&e.catch&&typeof e.catch=="function"?le.promise:typeof Map<"u"&&e instanceof Map?le.map:typeof Set<"u"&&e instanceof Set?le.set:typeof Date<"u"&&e instanceof Date?le.date:le.object;default:return le.unknown}},re=Xe.arrayToEnum(["invalid_type","invalid_literal","custom","invalid_union","invalid_union_discriminator","invalid_enum_value","unrecognized_keys","invalid_arguments","invalid_return_type","invalid_date","invalid_string","too_small","too_big","invalid_intersection_types","not_multiple_of","not_finite"]),che=e=>JSON.stringify(e,null,2).replace(/"([^"]+)":/g,"$1:");class Ri extends Error{constructor(t){super(),this.issues=[],this.addIssue=r=>{this.issues=[...this.issues,r]},this.addIssues=(r=[])=>{this.issues=[...this.issues,...r]};const n=new.target.prototype;Object.setPrototypeOf?Object.setPrototypeOf(this,n):this.__proto__=n,this.name="ZodError",this.issues=t}get errors(){return this.issues}format(t){const n=t||function(o){return o.message},r={_errors:[]},i=o=>{for(const s of o.issues)if(s.code==="invalid_union")s.unionErrors.map(i);else if(s.code==="invalid_return_type")i(s.returnTypeError);else if(s.code==="invalid_arguments")i(s.argumentsError);else if(s.path.length===0)r._errors.push(n(s));else{let a=r,l=0;for(;ln.message){const n={},r=[];for(const i of this.issues)i.path.length>0?(n[i.path[0]]=n[i.path[0]]||[],n[i.path[0]].push(t(i))):r.push(t(i));return{formErrors:r,fieldErrors:n}}get formErrors(){return this.flatten()}}Ri.create=e=>new Ri(e);const gh=(e,t)=>{let n;switch(e.code){case re.invalid_type:e.received===le.undefined?n="Required":n=`Expected ${e.expected}, received ${e.received}`;break;case re.invalid_literal:n=`Invalid literal value, expected ${JSON.stringify(e.expected,Xe.jsonStringifyReplacer)}`;break;case re.unrecognized_keys:n=`Unrecognized key(s) in object: ${Xe.joinValues(e.keys,", ")}`;break;case re.invalid_union:n="Invalid input";break;case re.invalid_union_discriminator:n=`Invalid discriminator value. Expected ${Xe.joinValues(e.options)}`;break;case re.invalid_enum_value:n=`Invalid enum value. Expected ${Xe.joinValues(e.options)}, received '${e.received}'`;break;case re.invalid_arguments:n="Invalid function arguments";break;case re.invalid_return_type:n="Invalid function return type";break;case re.invalid_date:n="Invalid date";break;case re.invalid_string:typeof e.validation=="object"?"includes"in e.validation?(n=`Invalid input: must include "${e.validation.includes}"`,typeof e.validation.position=="number"&&(n=`${n} at one or more positions greater than or equal to ${e.validation.position}`)):"startsWith"in e.validation?n=`Invalid input: must start with "${e.validation.startsWith}"`:"endsWith"in e.validation?n=`Invalid input: must end with "${e.validation.endsWith}"`:Xe.assertNever(e.validation):e.validation!=="regex"?n=`Invalid ${e.validation}`:n="Invalid";break;case re.too_small:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at least":"more than"} ${e.minimum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at least":"over"} ${e.minimum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${e.minimum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly equal to ":e.inclusive?"greater than or equal to ":"greater than "}${new Date(Number(e.minimum))}`:n="Invalid input";break;case re.too_big:e.type==="array"?n=`Array must contain ${e.exact?"exactly":e.inclusive?"at most":"less than"} ${e.maximum} element(s)`:e.type==="string"?n=`String must contain ${e.exact?"exactly":e.inclusive?"at most":"under"} ${e.maximum} character(s)`:e.type==="number"?n=`Number must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="bigint"?n=`BigInt must be ${e.exact?"exactly":e.inclusive?"less than or equal to":"less than"} ${e.maximum}`:e.type==="date"?n=`Date must be ${e.exact?"exactly":e.inclusive?"smaller than or equal to":"smaller than"} ${new Date(Number(e.maximum))}`:n="Invalid input";break;case re.custom:n="Invalid input";break;case re.invalid_intersection_types:n="Intersection results could not be merged";break;case re.not_multiple_of:n=`Number must be a multiple of ${e.multipleOf}`;break;case re.not_finite:n="Number must be finite";break;default:n=t.defaultError,Xe.assertNever(e)}return{message:n}};let pL=gh;function dhe(e){pL=e}function Vy(){return pL}const zy=e=>{const{data:t,path:n,errorMaps:r,issueData:i}=e,o=[...n,...i.path||[]],s={...i,path:o};let a="";const l=r.filter(u=>!!u).slice().reverse();for(const u of l)a=u(s,{data:t,defaultError:a}).message;return{...i,path:o,message:i.message||a}},fhe=[];function ce(e,t){const n=zy({issueData:t,data:e.data,path:e.path,errorMaps:[e.common.contextualErrorMap,e.schemaErrorMap,Vy(),gh].filter(r=>!!r)});e.common.issues.push(n)}class Yn{constructor(){this.value="valid"}dirty(){this.value==="valid"&&(this.value="dirty")}abort(){this.value!=="aborted"&&(this.value="aborted")}static mergeArray(t,n){const r=[];for(const i of n){if(i.status==="aborted")return xe;i.status==="dirty"&&t.dirty(),r.push(i.value)}return{status:t.value,value:r}}static async mergeObjectAsync(t,n){const r=[];for(const i of n)r.push({key:await i.key,value:await i.value});return Yn.mergeObjectSync(t,r)}static mergeObjectSync(t,n){const r={};for(const i of n){const{key:o,value:s}=i;if(o.status==="aborted"||s.status==="aborted")return xe;o.status==="dirty"&&t.dirty(),s.status==="dirty"&&t.dirty(),(typeof s.value<"u"||i.alwaysSet)&&(r[o.value]=s.value)}return{status:t.value,value:r}}}const xe=Object.freeze({status:"aborted"}),gL=e=>({status:"dirty",value:e}),lr=e=>({status:"valid",value:e}),Uw=e=>e.status==="aborted",Gw=e=>e.status==="dirty",Uy=e=>e.status==="valid",Gy=e=>typeof Promise<"u"&&e instanceof Promise;var ve;(function(e){e.errToObj=t=>typeof t=="string"?{message:t}:t||{},e.toString=t=>typeof t=="string"?t:t==null?void 0:t.message})(ve||(ve={}));class yo{constructor(t,n,r,i){this._cachedPath=[],this.parent=t,this.data=n,this._path=r,this._key=i}get path(){return this._cachedPath.length||(this._key instanceof Array?this._cachedPath.push(...this._path,...this._key):this._cachedPath.push(...this._path,this._key)),this._cachedPath}}const C8=(e,t)=>{if(Uy(t))return{success:!0,data:t.value};if(!e.common.issues.length)throw new Error("Validation failed but no issues detected.");return{success:!1,get error(){if(this._error)return this._error;const n=new Ri(e.common.issues);return this._error=n,this._error}}};function Ae(e){if(!e)return{};const{errorMap:t,invalid_type_error:n,required_error:r,description:i}=e;if(t&&(n||r))throw new Error(`Can't use "invalid_type_error" or "required_error" in conjunction with custom error map.`);return t?{errorMap:t,description:i}:{errorMap:(s,a)=>s.code!=="invalid_type"?{message:a.defaultError}:typeof a.data>"u"?{message:r??a.defaultError}:{message:n??a.defaultError},description:i}}class Oe{constructor(t){this.spa=this.safeParseAsync,this._def=t,this.parse=this.parse.bind(this),this.safeParse=this.safeParse.bind(this),this.parseAsync=this.parseAsync.bind(this),this.safeParseAsync=this.safeParseAsync.bind(this),this.spa=this.spa.bind(this),this.refine=this.refine.bind(this),this.refinement=this.refinement.bind(this),this.superRefine=this.superRefine.bind(this),this.optional=this.optional.bind(this),this.nullable=this.nullable.bind(this),this.nullish=this.nullish.bind(this),this.array=this.array.bind(this),this.promise=this.promise.bind(this),this.or=this.or.bind(this),this.and=this.and.bind(this),this.transform=this.transform.bind(this),this.brand=this.brand.bind(this),this.default=this.default.bind(this),this.catch=this.catch.bind(this),this.describe=this.describe.bind(this),this.pipe=this.pipe.bind(this),this.isNullable=this.isNullable.bind(this),this.isOptional=this.isOptional.bind(this)}get description(){return this._def.description}_getType(t){return Vs(t.data)}_getOrReturnCtx(t,n){return n||{common:t.parent.common,data:t.data,parsedType:Vs(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}_processInputParams(t){return{status:new Yn,ctx:{common:t.parent.common,data:t.data,parsedType:Vs(t.data),schemaErrorMap:this._def.errorMap,path:t.path,parent:t.parent}}}_parseSync(t){const n=this._parse(t);if(Gy(n))throw new Error("Synchronous parse encountered promise.");return n}_parseAsync(t){const n=this._parse(t);return Promise.resolve(n)}parse(t,n){const r=this.safeParse(t,n);if(r.success)return r.data;throw r.error}safeParse(t,n){var r;const i={common:{issues:[],async:(r=n==null?void 0:n.async)!==null&&r!==void 0?r:!1,contextualErrorMap:n==null?void 0:n.errorMap},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Vs(t)},o=this._parseSync({data:t,path:i.path,parent:i});return C8(i,o)}async parseAsync(t,n){const r=await this.safeParseAsync(t,n);if(r.success)return r.data;throw r.error}async safeParseAsync(t,n){const r={common:{issues:[],contextualErrorMap:n==null?void 0:n.errorMap,async:!0},path:(n==null?void 0:n.path)||[],schemaErrorMap:this._def.errorMap,parent:null,data:t,parsedType:Vs(t)},i=this._parse({data:t,path:r.path,parent:r}),o=await(Gy(i)?i:Promise.resolve(i));return C8(r,o)}refine(t,n){const r=i=>typeof n=="string"||typeof n>"u"?{message:n}:typeof n=="function"?n(i):n;return this._refinement((i,o)=>{const s=t(i),a=()=>o.addIssue({code:re.custom,...r(i)});return typeof Promise<"u"&&s instanceof Promise?s.then(l=>l?!0:(a(),!1)):s?!0:(a(),!1)})}refinement(t,n){return this._refinement((r,i)=>t(r)?!0:(i.addIssue(typeof n=="function"?n(r,i):n),!1))}_refinement(t){return new $i({schema:this,typeName:_e.ZodEffects,effect:{type:"refinement",refinement:t}})}superRefine(t){return this._refinement(t)}optional(){return es.create(this,this._def)}nullable(){return Cl.create(this,this._def)}nullish(){return this.nullable().optional()}array(){return Ii.create(this,this._def)}promise(){return Ic.create(this,this._def)}or(t){return bh.create([this,t],this._def)}and(t){return Sh.create(this,t,this._def)}transform(t){return new $i({...Ae(this._def),schema:this,typeName:_e.ZodEffects,effect:{type:"transform",transform:t}})}default(t){const n=typeof t=="function"?t:()=>t;return new Th({...Ae(this._def),innerType:this,defaultValue:n,typeName:_e.ZodDefault})}brand(){return new yL({typeName:_e.ZodBranded,type:this,...Ae(this._def)})}catch(t){const n=typeof t=="function"?t:()=>t;return new Ky({...Ae(this._def),innerType:this,catchValue:n,typeName:_e.ZodCatch})}describe(t){const n=this.constructor;return new n({...this._def,description:t})}pipe(t){return Ep.create(this,t)}isOptional(){return this.safeParse(void 0).success}isNullable(){return this.safeParse(null).success}}const hhe=/^c[^\s-]{8,}$/i,phe=/^[a-z][a-z0-9]*$/,ghe=/[0-9A-HJKMNP-TV-Z]{26}/,mhe=/^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i,yhe=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\])|(\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\.[A-Za-z]{2,})+))$/,vhe=/^(\p{Extended_Pictographic}|\p{Emoji_Component})+$/u,bhe=/^(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))$/,She=/^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/,_he=e=>e.precision?e.offset?new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${e.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`):new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${e.precision}}Z$`):e.precision===0?e.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"):e.offset?new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$"):new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$");function whe(e,t){return!!((t==="v4"||!t)&&bhe.test(e)||(t==="v6"||!t)&&She.test(e))}class Pi extends Oe{constructor(){super(...arguments),this._regex=(t,n,r)=>this.refinement(i=>t.test(i),{validation:n,code:re.invalid_string,...ve.errToObj(r)}),this.nonempty=t=>this.min(1,ve.errToObj(t)),this.trim=()=>new Pi({...this._def,checks:[...this._def.checks,{kind:"trim"}]}),this.toLowerCase=()=>new Pi({...this._def,checks:[...this._def.checks,{kind:"toLowerCase"}]}),this.toUpperCase=()=>new Pi({...this._def,checks:[...this._def.checks,{kind:"toUpperCase"}]})}_parse(t){if(this._def.coerce&&(t.data=String(t.data)),this._getType(t)!==le.string){const o=this._getOrReturnCtx(t);return ce(o,{code:re.invalid_type,expected:le.string,received:o.parsedType}),xe}const r=new Yn;let i;for(const o of this._def.checks)if(o.kind==="min")t.data.lengtho.value&&(i=this._getOrReturnCtx(t,i),ce(i,{code:re.too_big,maximum:o.value,type:"string",inclusive:!0,exact:!1,message:o.message}),r.dirty());else if(o.kind==="length"){const s=t.data.length>o.value,a=t.data.length"u"?null:t==null?void 0:t.precision,offset:(n=t==null?void 0:t.offset)!==null&&n!==void 0?n:!1,...ve.errToObj(t==null?void 0:t.message)})}regex(t,n){return this._addCheck({kind:"regex",regex:t,...ve.errToObj(n)})}includes(t,n){return this._addCheck({kind:"includes",value:t,position:n==null?void 0:n.position,...ve.errToObj(n==null?void 0:n.message)})}startsWith(t,n){return this._addCheck({kind:"startsWith",value:t,...ve.errToObj(n)})}endsWith(t,n){return this._addCheck({kind:"endsWith",value:t,...ve.errToObj(n)})}min(t,n){return this._addCheck({kind:"min",value:t,...ve.errToObj(n)})}max(t,n){return this._addCheck({kind:"max",value:t,...ve.errToObj(n)})}length(t,n){return this._addCheck({kind:"length",value:t,...ve.errToObj(n)})}get isDatetime(){return!!this._def.checks.find(t=>t.kind==="datetime")}get isEmail(){return!!this._def.checks.find(t=>t.kind==="email")}get isURL(){return!!this._def.checks.find(t=>t.kind==="url")}get isEmoji(){return!!this._def.checks.find(t=>t.kind==="emoji")}get isUUID(){return!!this._def.checks.find(t=>t.kind==="uuid")}get isCUID(){return!!this._def.checks.find(t=>t.kind==="cuid")}get isCUID2(){return!!this._def.checks.find(t=>t.kind==="cuid2")}get isULID(){return!!this._def.checks.find(t=>t.kind==="ulid")}get isIP(){return!!this._def.checks.find(t=>t.kind==="ip")}get minLength(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxLength(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value{var t;return new Pi({checks:[],typeName:_e.ZodString,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...Ae(e)})};function xhe(e,t){const n=(e.toString().split(".")[1]||"").length,r=(t.toString().split(".")[1]||"").length,i=n>r?n:r,o=parseInt(e.toFixed(i).replace(".","")),s=parseInt(t.toFixed(i).replace(".",""));return o%s/Math.pow(10,i)}class pa extends Oe{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte,this.step=this.multipleOf}_parse(t){if(this._def.coerce&&(t.data=Number(t.data)),this._getType(t)!==le.number){const o=this._getOrReturnCtx(t);return ce(o,{code:re.invalid_type,expected:le.number,received:o.parsedType}),xe}let r;const i=new Yn;for(const o of this._def.checks)o.kind==="int"?Xe.isInteger(t.data)||(r=this._getOrReturnCtx(t,r),ce(r,{code:re.invalid_type,expected:"integer",received:"float",message:o.message}),i.dirty()):o.kind==="min"?(o.inclusive?t.datao.value:t.data>=o.value)&&(r=this._getOrReturnCtx(t,r),ce(r,{code:re.too_big,maximum:o.value,type:"number",inclusive:o.inclusive,exact:!1,message:o.message}),i.dirty()):o.kind==="multipleOf"?xhe(t.data,o.value)!==0&&(r=this._getOrReturnCtx(t,r),ce(r,{code:re.not_multiple_of,multipleOf:o.value,message:o.message}),i.dirty()):o.kind==="finite"?Number.isFinite(t.data)||(r=this._getOrReturnCtx(t,r),ce(r,{code:re.not_finite,message:o.message}),i.dirty()):Xe.assertNever(o);return{status:i.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,ve.toString(n))}gt(t,n){return this.setLimit("min",t,!1,ve.toString(n))}lte(t,n){return this.setLimit("max",t,!0,ve.toString(n))}lt(t,n){return this.setLimit("max",t,!1,ve.toString(n))}setLimit(t,n,r,i){return new pa({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:ve.toString(i)}]})}_addCheck(t){return new pa({...this._def,checks:[...this._def.checks,t]})}int(t){return this._addCheck({kind:"int",message:ve.toString(t)})}positive(t){return this._addCheck({kind:"min",value:0,inclusive:!1,message:ve.toString(t)})}negative(t){return this._addCheck({kind:"max",value:0,inclusive:!1,message:ve.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:0,inclusive:!0,message:ve.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:0,inclusive:!0,message:ve.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:ve.toString(n)})}finite(t){return this._addCheck({kind:"finite",message:ve.toString(t)})}safe(t){return this._addCheck({kind:"min",inclusive:!0,value:Number.MIN_SAFE_INTEGER,message:ve.toString(t)})._addCheck({kind:"max",inclusive:!0,value:Number.MAX_SAFE_INTEGER,message:ve.toString(t)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuet.kind==="int"||t.kind==="multipleOf"&&Xe.isInteger(t.value))}get isFinite(){let t=null,n=null;for(const r of this._def.checks){if(r.kind==="finite"||r.kind==="int"||r.kind==="multipleOf")return!0;r.kind==="min"?(n===null||r.value>n)&&(n=r.value):r.kind==="max"&&(t===null||r.valuenew pa({checks:[],typeName:_e.ZodNumber,coerce:(e==null?void 0:e.coerce)||!1,...Ae(e)});class ga extends Oe{constructor(){super(...arguments),this.min=this.gte,this.max=this.lte}_parse(t){if(this._def.coerce&&(t.data=BigInt(t.data)),this._getType(t)!==le.bigint){const o=this._getOrReturnCtx(t);return ce(o,{code:re.invalid_type,expected:le.bigint,received:o.parsedType}),xe}let r;const i=new Yn;for(const o of this._def.checks)o.kind==="min"?(o.inclusive?t.datao.value:t.data>=o.value)&&(r=this._getOrReturnCtx(t,r),ce(r,{code:re.too_big,type:"bigint",maximum:o.value,inclusive:o.inclusive,message:o.message}),i.dirty()):o.kind==="multipleOf"?t.data%o.value!==BigInt(0)&&(r=this._getOrReturnCtx(t,r),ce(r,{code:re.not_multiple_of,multipleOf:o.value,message:o.message}),i.dirty()):Xe.assertNever(o);return{status:i.value,value:t.data}}gte(t,n){return this.setLimit("min",t,!0,ve.toString(n))}gt(t,n){return this.setLimit("min",t,!1,ve.toString(n))}lte(t,n){return this.setLimit("max",t,!0,ve.toString(n))}lt(t,n){return this.setLimit("max",t,!1,ve.toString(n))}setLimit(t,n,r,i){return new ga({...this._def,checks:[...this._def.checks,{kind:t,value:n,inclusive:r,message:ve.toString(i)}]})}_addCheck(t){return new ga({...this._def,checks:[...this._def.checks,t]})}positive(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!1,message:ve.toString(t)})}negative(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!1,message:ve.toString(t)})}nonpositive(t){return this._addCheck({kind:"max",value:BigInt(0),inclusive:!0,message:ve.toString(t)})}nonnegative(t){return this._addCheck({kind:"min",value:BigInt(0),inclusive:!0,message:ve.toString(t)})}multipleOf(t,n){return this._addCheck({kind:"multipleOf",value:t,message:ve.toString(n)})}get minValue(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t}get maxValue(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.value{var t;return new ga({checks:[],typeName:_e.ZodBigInt,coerce:(t=e==null?void 0:e.coerce)!==null&&t!==void 0?t:!1,...Ae(e)})};class mh extends Oe{_parse(t){if(this._def.coerce&&(t.data=!!t.data),this._getType(t)!==le.boolean){const r=this._getOrReturnCtx(t);return ce(r,{code:re.invalid_type,expected:le.boolean,received:r.parsedType}),xe}return lr(t.data)}}mh.create=e=>new mh({typeName:_e.ZodBoolean,coerce:(e==null?void 0:e.coerce)||!1,...Ae(e)});class wl extends Oe{_parse(t){if(this._def.coerce&&(t.data=new Date(t.data)),this._getType(t)!==le.date){const o=this._getOrReturnCtx(t);return ce(o,{code:re.invalid_type,expected:le.date,received:o.parsedType}),xe}if(isNaN(t.data.getTime())){const o=this._getOrReturnCtx(t);return ce(o,{code:re.invalid_date}),xe}const r=new Yn;let i;for(const o of this._def.checks)o.kind==="min"?t.data.getTime()o.value&&(i=this._getOrReturnCtx(t,i),ce(i,{code:re.too_big,message:o.message,inclusive:!0,exact:!1,maximum:o.value,type:"date"}),r.dirty()):Xe.assertNever(o);return{status:r.value,value:new Date(t.data.getTime())}}_addCheck(t){return new wl({...this._def,checks:[...this._def.checks,t]})}min(t,n){return this._addCheck({kind:"min",value:t.getTime(),message:ve.toString(n)})}max(t,n){return this._addCheck({kind:"max",value:t.getTime(),message:ve.toString(n)})}get minDate(){let t=null;for(const n of this._def.checks)n.kind==="min"&&(t===null||n.value>t)&&(t=n.value);return t!=null?new Date(t):null}get maxDate(){let t=null;for(const n of this._def.checks)n.kind==="max"&&(t===null||n.valuenew wl({checks:[],coerce:(e==null?void 0:e.coerce)||!1,typeName:_e.ZodDate,...Ae(e)});class Hy extends Oe{_parse(t){if(this._getType(t)!==le.symbol){const r=this._getOrReturnCtx(t);return ce(r,{code:re.invalid_type,expected:le.symbol,received:r.parsedType}),xe}return lr(t.data)}}Hy.create=e=>new Hy({typeName:_e.ZodSymbol,...Ae(e)});class yh extends Oe{_parse(t){if(this._getType(t)!==le.undefined){const r=this._getOrReturnCtx(t);return ce(r,{code:re.invalid_type,expected:le.undefined,received:r.parsedType}),xe}return lr(t.data)}}yh.create=e=>new yh({typeName:_e.ZodUndefined,...Ae(e)});class vh extends Oe{_parse(t){if(this._getType(t)!==le.null){const r=this._getOrReturnCtx(t);return ce(r,{code:re.invalid_type,expected:le.null,received:r.parsedType}),xe}return lr(t.data)}}vh.create=e=>new vh({typeName:_e.ZodNull,...Ae(e)});class Rc extends Oe{constructor(){super(...arguments),this._any=!0}_parse(t){return lr(t.data)}}Rc.create=e=>new Rc({typeName:_e.ZodAny,...Ae(e)});class ul extends Oe{constructor(){super(...arguments),this._unknown=!0}_parse(t){return lr(t.data)}}ul.create=e=>new ul({typeName:_e.ZodUnknown,...Ae(e)});class cs extends Oe{_parse(t){const n=this._getOrReturnCtx(t);return ce(n,{code:re.invalid_type,expected:le.never,received:n.parsedType}),xe}}cs.create=e=>new cs({typeName:_e.ZodNever,...Ae(e)});class Wy extends Oe{_parse(t){if(this._getType(t)!==le.undefined){const r=this._getOrReturnCtx(t);return ce(r,{code:re.invalid_type,expected:le.void,received:r.parsedType}),xe}return lr(t.data)}}Wy.create=e=>new Wy({typeName:_e.ZodVoid,...Ae(e)});class Ii extends Oe{_parse(t){const{ctx:n,status:r}=this._processInputParams(t),i=this._def;if(n.parsedType!==le.array)return ce(n,{code:re.invalid_type,expected:le.array,received:n.parsedType}),xe;if(i.exactLength!==null){const s=n.data.length>i.exactLength.value,a=n.data.lengthi.maxLength.value&&(ce(n,{code:re.too_big,maximum:i.maxLength.value,type:"array",inclusive:!0,exact:!1,message:i.maxLength.message}),r.dirty()),n.common.async)return Promise.all([...n.data].map((s,a)=>i.type._parseAsync(new yo(n,s,n.path,a)))).then(s=>Yn.mergeArray(r,s));const o=[...n.data].map((s,a)=>i.type._parseSync(new yo(n,s,n.path,a)));return Yn.mergeArray(r,o)}get element(){return this._def.type}min(t,n){return new Ii({...this._def,minLength:{value:t,message:ve.toString(n)}})}max(t,n){return new Ii({...this._def,maxLength:{value:t,message:ve.toString(n)}})}length(t,n){return new Ii({...this._def,exactLength:{value:t,message:ve.toString(n)}})}nonempty(t){return this.min(1,t)}}Ii.create=(e,t)=>new Ii({type:e,minLength:null,maxLength:null,exactLength:null,typeName:_e.ZodArray,...Ae(t)});function mu(e){if(e instanceof Nt){const t={};for(const n in e.shape){const r=e.shape[n];t[n]=es.create(mu(r))}return new Nt({...e._def,shape:()=>t})}else return e instanceof Ii?new Ii({...e._def,type:mu(e.element)}):e instanceof es?es.create(mu(e.unwrap())):e instanceof Cl?Cl.create(mu(e.unwrap())):e instanceof vo?vo.create(e.items.map(t=>mu(t))):e}class Nt extends Oe{constructor(){super(...arguments),this._cached=null,this.nonstrict=this.passthrough,this.augment=this.extend}_getCached(){if(this._cached!==null)return this._cached;const t=this._def.shape(),n=Xe.objectKeys(t);return this._cached={shape:t,keys:n}}_parse(t){if(this._getType(t)!==le.object){const u=this._getOrReturnCtx(t);return ce(u,{code:re.invalid_type,expected:le.object,received:u.parsedType}),xe}const{status:r,ctx:i}=this._processInputParams(t),{shape:o,keys:s}=this._getCached(),a=[];if(!(this._def.catchall instanceof cs&&this._def.unknownKeys==="strip"))for(const u in i.data)s.includes(u)||a.push(u);const l=[];for(const u of s){const c=o[u],d=i.data[u];l.push({key:{status:"valid",value:u},value:c._parse(new yo(i,d,i.path,u)),alwaysSet:u in i.data})}if(this._def.catchall instanceof cs){const u=this._def.unknownKeys;if(u==="passthrough")for(const c of a)l.push({key:{status:"valid",value:c},value:{status:"valid",value:i.data[c]}});else if(u==="strict")a.length>0&&(ce(i,{code:re.unrecognized_keys,keys:a}),r.dirty());else if(u!=="strip")throw new Error("Internal ZodObject error: invalid unknownKeys value.")}else{const u=this._def.catchall;for(const c of a){const d=i.data[c];l.push({key:{status:"valid",value:c},value:u._parse(new yo(i,d,i.path,c)),alwaysSet:c in i.data})}}return i.common.async?Promise.resolve().then(async()=>{const u=[];for(const c of l){const d=await c.key;u.push({key:d,value:await c.value,alwaysSet:c.alwaysSet})}return u}).then(u=>Yn.mergeObjectSync(r,u)):Yn.mergeObjectSync(r,l)}get shape(){return this._def.shape()}strict(t){return ve.errToObj,new Nt({...this._def,unknownKeys:"strict",...t!==void 0?{errorMap:(n,r)=>{var i,o,s,a;const l=(s=(o=(i=this._def).errorMap)===null||o===void 0?void 0:o.call(i,n,r).message)!==null&&s!==void 0?s:r.defaultError;return n.code==="unrecognized_keys"?{message:(a=ve.errToObj(t).message)!==null&&a!==void 0?a:l}:{message:l}}}:{}})}strip(){return new Nt({...this._def,unknownKeys:"strip"})}passthrough(){return new Nt({...this._def,unknownKeys:"passthrough"})}extend(t){return new Nt({...this._def,shape:()=>({...this._def.shape(),...t})})}merge(t){return new Nt({unknownKeys:t._def.unknownKeys,catchall:t._def.catchall,shape:()=>({...this._def.shape(),...t._def.shape()}),typeName:_e.ZodObject})}setKey(t,n){return this.augment({[t]:n})}catchall(t){return new Nt({...this._def,catchall:t})}pick(t){const n={};return Xe.objectKeys(t).forEach(r=>{t[r]&&this.shape[r]&&(n[r]=this.shape[r])}),new Nt({...this._def,shape:()=>n})}omit(t){const n={};return Xe.objectKeys(this.shape).forEach(r=>{t[r]||(n[r]=this.shape[r])}),new Nt({...this._def,shape:()=>n})}deepPartial(){return mu(this)}partial(t){const n={};return Xe.objectKeys(this.shape).forEach(r=>{const i=this.shape[r];t&&!t[r]?n[r]=i:n[r]=i.optional()}),new Nt({...this._def,shape:()=>n})}required(t){const n={};return Xe.objectKeys(this.shape).forEach(r=>{if(t&&!t[r])n[r]=this.shape[r];else{let o=this.shape[r];for(;o instanceof es;)o=o._def.innerType;n[r]=o}}),new Nt({...this._def,shape:()=>n})}keyof(){return mL(Xe.objectKeys(this.shape))}}Nt.create=(e,t)=>new Nt({shape:()=>e,unknownKeys:"strip",catchall:cs.create(),typeName:_e.ZodObject,...Ae(t)});Nt.strictCreate=(e,t)=>new Nt({shape:()=>e,unknownKeys:"strict",catchall:cs.create(),typeName:_e.ZodObject,...Ae(t)});Nt.lazycreate=(e,t)=>new Nt({shape:e,unknownKeys:"strip",catchall:cs.create(),typeName:_e.ZodObject,...Ae(t)});class bh extends Oe{_parse(t){const{ctx:n}=this._processInputParams(t),r=this._def.options;function i(o){for(const a of o)if(a.result.status==="valid")return a.result;for(const a of o)if(a.result.status==="dirty")return n.common.issues.push(...a.ctx.common.issues),a.result;const s=o.map(a=>new Ri(a.ctx.common.issues));return ce(n,{code:re.invalid_union,unionErrors:s}),xe}if(n.common.async)return Promise.all(r.map(async o=>{const s={...n,common:{...n.common,issues:[]},parent:null};return{result:await o._parseAsync({data:n.data,path:n.path,parent:s}),ctx:s}})).then(i);{let o;const s=[];for(const l of r){const u={...n,common:{...n.common,issues:[]},parent:null},c=l._parseSync({data:n.data,path:n.path,parent:u});if(c.status==="valid")return c;c.status==="dirty"&&!o&&(o={result:c,ctx:u}),u.common.issues.length&&s.push(u.common.issues)}if(o)return n.common.issues.push(...o.ctx.common.issues),o.result;const a=s.map(l=>new Ri(l));return ce(n,{code:re.invalid_union,unionErrors:a}),xe}}get options(){return this._def.options}}bh.create=(e,t)=>new bh({options:e,typeName:_e.ZodUnion,...Ae(t)});const wm=e=>e instanceof wh?wm(e.schema):e instanceof $i?wm(e.innerType()):e instanceof xh?[e.value]:e instanceof ma?e.options:e instanceof Ch?Object.keys(e.enum):e instanceof Th?wm(e._def.innerType):e instanceof yh?[void 0]:e instanceof vh?[null]:null;class p1 extends Oe{_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==le.object)return ce(n,{code:re.invalid_type,expected:le.object,received:n.parsedType}),xe;const r=this.discriminator,i=n.data[r],o=this.optionsMap.get(i);return o?n.common.async?o._parseAsync({data:n.data,path:n.path,parent:n}):o._parseSync({data:n.data,path:n.path,parent:n}):(ce(n,{code:re.invalid_union_discriminator,options:Array.from(this.optionsMap.keys()),path:[r]}),xe)}get discriminator(){return this._def.discriminator}get options(){return this._def.options}get optionsMap(){return this._def.optionsMap}static create(t,n,r){const i=new Map;for(const o of n){const s=wm(o.shape[t]);if(!s)throw new Error(`A discriminator value for key \`${t}\` could not be extracted from all schema options`);for(const a of s){if(i.has(a))throw new Error(`Discriminator property ${String(t)} has duplicate value ${String(a)}`);i.set(a,o)}}return new p1({typeName:_e.ZodDiscriminatedUnion,discriminator:t,options:n,optionsMap:i,...Ae(r)})}}function Hw(e,t){const n=Vs(e),r=Vs(t);if(e===t)return{valid:!0,data:e};if(n===le.object&&r===le.object){const i=Xe.objectKeys(t),o=Xe.objectKeys(e).filter(a=>i.indexOf(a)!==-1),s={...e,...t};for(const a of o){const l=Hw(e[a],t[a]);if(!l.valid)return{valid:!1};s[a]=l.data}return{valid:!0,data:s}}else if(n===le.array&&r===le.array){if(e.length!==t.length)return{valid:!1};const i=[];for(let o=0;o{if(Uw(o)||Uw(s))return xe;const a=Hw(o.value,s.value);return a.valid?((Gw(o)||Gw(s))&&n.dirty(),{status:n.value,value:a.data}):(ce(r,{code:re.invalid_intersection_types}),xe)};return r.common.async?Promise.all([this._def.left._parseAsync({data:r.data,path:r.path,parent:r}),this._def.right._parseAsync({data:r.data,path:r.path,parent:r})]).then(([o,s])=>i(o,s)):i(this._def.left._parseSync({data:r.data,path:r.path,parent:r}),this._def.right._parseSync({data:r.data,path:r.path,parent:r}))}}Sh.create=(e,t,n)=>new Sh({left:e,right:t,typeName:_e.ZodIntersection,...Ae(n)});class vo extends Oe{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==le.array)return ce(r,{code:re.invalid_type,expected:le.array,received:r.parsedType}),xe;if(r.data.lengththis._def.items.length&&(ce(r,{code:re.too_big,maximum:this._def.items.length,inclusive:!0,exact:!1,type:"array"}),n.dirty());const o=[...r.data].map((s,a)=>{const l=this._def.items[a]||this._def.rest;return l?l._parse(new yo(r,s,r.path,a)):null}).filter(s=>!!s);return r.common.async?Promise.all(o).then(s=>Yn.mergeArray(n,s)):Yn.mergeArray(n,o)}get items(){return this._def.items}rest(t){return new vo({...this._def,rest:t})}}vo.create=(e,t)=>{if(!Array.isArray(e))throw new Error("You must pass an array of schemas to z.tuple([ ... ])");return new vo({items:e,typeName:_e.ZodTuple,rest:null,...Ae(t)})};class _h extends Oe{get keySchema(){return this._def.keyType}get valueSchema(){return this._def.valueType}_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==le.object)return ce(r,{code:re.invalid_type,expected:le.object,received:r.parsedType}),xe;const i=[],o=this._def.keyType,s=this._def.valueType;for(const a in r.data)i.push({key:o._parse(new yo(r,a,r.path,a)),value:s._parse(new yo(r,r.data[a],r.path,a))});return r.common.async?Yn.mergeObjectAsync(n,i):Yn.mergeObjectSync(n,i)}get element(){return this._def.valueType}static create(t,n,r){return n instanceof Oe?new _h({keyType:t,valueType:n,typeName:_e.ZodRecord,...Ae(r)}):new _h({keyType:Pi.create(),valueType:t,typeName:_e.ZodRecord,...Ae(n)})}}class qy extends Oe{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==le.map)return ce(r,{code:re.invalid_type,expected:le.map,received:r.parsedType}),xe;const i=this._def.keyType,o=this._def.valueType,s=[...r.data.entries()].map(([a,l],u)=>({key:i._parse(new yo(r,a,r.path,[u,"key"])),value:o._parse(new yo(r,l,r.path,[u,"value"]))}));if(r.common.async){const a=new Map;return Promise.resolve().then(async()=>{for(const l of s){const u=await l.key,c=await l.value;if(u.status==="aborted"||c.status==="aborted")return xe;(u.status==="dirty"||c.status==="dirty")&&n.dirty(),a.set(u.value,c.value)}return{status:n.value,value:a}})}else{const a=new Map;for(const l of s){const u=l.key,c=l.value;if(u.status==="aborted"||c.status==="aborted")return xe;(u.status==="dirty"||c.status==="dirty")&&n.dirty(),a.set(u.value,c.value)}return{status:n.value,value:a}}}}qy.create=(e,t,n)=>new qy({valueType:t,keyType:e,typeName:_e.ZodMap,...Ae(n)});class xl extends Oe{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.parsedType!==le.set)return ce(r,{code:re.invalid_type,expected:le.set,received:r.parsedType}),xe;const i=this._def;i.minSize!==null&&r.data.sizei.maxSize.value&&(ce(r,{code:re.too_big,maximum:i.maxSize.value,type:"set",inclusive:!0,exact:!1,message:i.maxSize.message}),n.dirty());const o=this._def.valueType;function s(l){const u=new Set;for(const c of l){if(c.status==="aborted")return xe;c.status==="dirty"&&n.dirty(),u.add(c.value)}return{status:n.value,value:u}}const a=[...r.data.values()].map((l,u)=>o._parse(new yo(r,l,r.path,u)));return r.common.async?Promise.all(a).then(l=>s(l)):s(a)}min(t,n){return new xl({...this._def,minSize:{value:t,message:ve.toString(n)}})}max(t,n){return new xl({...this._def,maxSize:{value:t,message:ve.toString(n)}})}size(t,n){return this.min(t,n).max(t,n)}nonempty(t){return this.min(1,t)}}xl.create=(e,t)=>new xl({valueType:e,minSize:null,maxSize:null,typeName:_e.ZodSet,...Ae(t)});class tc extends Oe{constructor(){super(...arguments),this.validate=this.implement}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==le.function)return ce(n,{code:re.invalid_type,expected:le.function,received:n.parsedType}),xe;function r(a,l){return zy({data:a,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,Vy(),gh].filter(u=>!!u),issueData:{code:re.invalid_arguments,argumentsError:l}})}function i(a,l){return zy({data:a,path:n.path,errorMaps:[n.common.contextualErrorMap,n.schemaErrorMap,Vy(),gh].filter(u=>!!u),issueData:{code:re.invalid_return_type,returnTypeError:l}})}const o={errorMap:n.common.contextualErrorMap},s=n.data;return this._def.returns instanceof Ic?lr(async(...a)=>{const l=new Ri([]),u=await this._def.args.parseAsync(a,o).catch(f=>{throw l.addIssue(r(a,f)),l}),c=await s(...u);return await this._def.returns._def.type.parseAsync(c,o).catch(f=>{throw l.addIssue(i(c,f)),l})}):lr((...a)=>{const l=this._def.args.safeParse(a,o);if(!l.success)throw new Ri([r(a,l.error)]);const u=s(...l.data),c=this._def.returns.safeParse(u,o);if(!c.success)throw new Ri([i(u,c.error)]);return c.data})}parameters(){return this._def.args}returnType(){return this._def.returns}args(...t){return new tc({...this._def,args:vo.create(t).rest(ul.create())})}returns(t){return new tc({...this._def,returns:t})}implement(t){return this.parse(t)}strictImplement(t){return this.parse(t)}static create(t,n,r){return new tc({args:t||vo.create([]).rest(ul.create()),returns:n||ul.create(),typeName:_e.ZodFunction,...Ae(r)})}}class wh extends Oe{get schema(){return this._def.getter()}_parse(t){const{ctx:n}=this._processInputParams(t);return this._def.getter()._parse({data:n.data,path:n.path,parent:n})}}wh.create=(e,t)=>new wh({getter:e,typeName:_e.ZodLazy,...Ae(t)});class xh extends Oe{_parse(t){if(t.data!==this._def.value){const n=this._getOrReturnCtx(t);return ce(n,{received:n.data,code:re.invalid_literal,expected:this._def.value}),xe}return{status:"valid",value:t.data}}get value(){return this._def.value}}xh.create=(e,t)=>new xh({value:e,typeName:_e.ZodLiteral,...Ae(t)});function mL(e,t){return new ma({values:e,typeName:_e.ZodEnum,...Ae(t)})}class ma extends Oe{_parse(t){if(typeof t.data!="string"){const n=this._getOrReturnCtx(t),r=this._def.values;return ce(n,{expected:Xe.joinValues(r),received:n.parsedType,code:re.invalid_type}),xe}if(this._def.values.indexOf(t.data)===-1){const n=this._getOrReturnCtx(t),r=this._def.values;return ce(n,{received:n.data,code:re.invalid_enum_value,options:r}),xe}return lr(t.data)}get options(){return this._def.values}get enum(){const t={};for(const n of this._def.values)t[n]=n;return t}get Values(){const t={};for(const n of this._def.values)t[n]=n;return t}get Enum(){const t={};for(const n of this._def.values)t[n]=n;return t}extract(t){return ma.create(t)}exclude(t){return ma.create(this.options.filter(n=>!t.includes(n)))}}ma.create=mL;class Ch extends Oe{_parse(t){const n=Xe.getValidEnumValues(this._def.values),r=this._getOrReturnCtx(t);if(r.parsedType!==le.string&&r.parsedType!==le.number){const i=Xe.objectValues(n);return ce(r,{expected:Xe.joinValues(i),received:r.parsedType,code:re.invalid_type}),xe}if(n.indexOf(t.data)===-1){const i=Xe.objectValues(n);return ce(r,{received:r.data,code:re.invalid_enum_value,options:i}),xe}return lr(t.data)}get enum(){return this._def.values}}Ch.create=(e,t)=>new Ch({values:e,typeName:_e.ZodNativeEnum,...Ae(t)});class Ic extends Oe{unwrap(){return this._def.type}_parse(t){const{ctx:n}=this._processInputParams(t);if(n.parsedType!==le.promise&&n.common.async===!1)return ce(n,{code:re.invalid_type,expected:le.promise,received:n.parsedType}),xe;const r=n.parsedType===le.promise?n.data:Promise.resolve(n.data);return lr(r.then(i=>this._def.type.parseAsync(i,{path:n.path,errorMap:n.common.contextualErrorMap})))}}Ic.create=(e,t)=>new Ic({type:e,typeName:_e.ZodPromise,...Ae(t)});class $i extends Oe{innerType(){return this._def.schema}sourceType(){return this._def.schema._def.typeName===_e.ZodEffects?this._def.schema.sourceType():this._def.schema}_parse(t){const{status:n,ctx:r}=this._processInputParams(t),i=this._def.effect||null;if(i.type==="preprocess"){const s=i.transform(r.data);return r.common.async?Promise.resolve(s).then(a=>this._def.schema._parseAsync({data:a,path:r.path,parent:r})):this._def.schema._parseSync({data:s,path:r.path,parent:r})}const o={addIssue:s=>{ce(r,s),s.fatal?n.abort():n.dirty()},get path(){return r.path}};if(o.addIssue=o.addIssue.bind(o),i.type==="refinement"){const s=a=>{const l=i.refinement(a,o);if(r.common.async)return Promise.resolve(l);if(l instanceof Promise)throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");return a};if(r.common.async===!1){const a=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});return a.status==="aborted"?xe:(a.status==="dirty"&&n.dirty(),s(a.value),{status:n.value,value:a.value})}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(a=>a.status==="aborted"?xe:(a.status==="dirty"&&n.dirty(),s(a.value).then(()=>({status:n.value,value:a.value}))))}if(i.type==="transform")if(r.common.async===!1){const s=this._def.schema._parseSync({data:r.data,path:r.path,parent:r});if(!Uy(s))return s;const a=i.transform(s.value,o);if(a instanceof Promise)throw new Error("Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.");return{status:n.value,value:a}}else return this._def.schema._parseAsync({data:r.data,path:r.path,parent:r}).then(s=>Uy(s)?Promise.resolve(i.transform(s.value,o)).then(a=>({status:n.value,value:a})):s);Xe.assertNever(i)}}$i.create=(e,t,n)=>new $i({schema:e,typeName:_e.ZodEffects,effect:t,...Ae(n)});$i.createWithPreprocess=(e,t,n)=>new $i({schema:t,effect:{type:"preprocess",transform:e},typeName:_e.ZodEffects,...Ae(n)});class es extends Oe{_parse(t){return this._getType(t)===le.undefined?lr(void 0):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}es.create=(e,t)=>new es({innerType:e,typeName:_e.ZodOptional,...Ae(t)});class Cl extends Oe{_parse(t){return this._getType(t)===le.null?lr(null):this._def.innerType._parse(t)}unwrap(){return this._def.innerType}}Cl.create=(e,t)=>new Cl({innerType:e,typeName:_e.ZodNullable,...Ae(t)});class Th extends Oe{_parse(t){const{ctx:n}=this._processInputParams(t);let r=n.data;return n.parsedType===le.undefined&&(r=this._def.defaultValue()),this._def.innerType._parse({data:r,path:n.path,parent:n})}removeDefault(){return this._def.innerType}}Th.create=(e,t)=>new Th({innerType:e,typeName:_e.ZodDefault,defaultValue:typeof t.default=="function"?t.default:()=>t.default,...Ae(t)});class Ky extends Oe{_parse(t){const{ctx:n}=this._processInputParams(t),r={...n,common:{...n.common,issues:[]}},i=this._def.innerType._parse({data:r.data,path:r.path,parent:{...r}});return Gy(i)?i.then(o=>({status:"valid",value:o.status==="valid"?o.value:this._def.catchValue({get error(){return new Ri(r.common.issues)},input:r.data})})):{status:"valid",value:i.status==="valid"?i.value:this._def.catchValue({get error(){return new Ri(r.common.issues)},input:r.data})}}removeCatch(){return this._def.innerType}}Ky.create=(e,t)=>new Ky({innerType:e,typeName:_e.ZodCatch,catchValue:typeof t.catch=="function"?t.catch:()=>t.catch,...Ae(t)});class Yy extends Oe{_parse(t){if(this._getType(t)!==le.nan){const r=this._getOrReturnCtx(t);return ce(r,{code:re.invalid_type,expected:le.nan,received:r.parsedType}),xe}return{status:"valid",value:t.data}}}Yy.create=e=>new Yy({typeName:_e.ZodNaN,...Ae(e)});const Che=Symbol("zod_brand");class yL extends Oe{_parse(t){const{ctx:n}=this._processInputParams(t),r=n.data;return this._def.type._parse({data:r,path:n.path,parent:n})}unwrap(){return this._def.type}}class Ep extends Oe{_parse(t){const{status:n,ctx:r}=this._processInputParams(t);if(r.common.async)return(async()=>{const o=await this._def.in._parseAsync({data:r.data,path:r.path,parent:r});return o.status==="aborted"?xe:o.status==="dirty"?(n.dirty(),gL(o.value)):this._def.out._parseAsync({data:o.value,path:r.path,parent:r})})();{const i=this._def.in._parseSync({data:r.data,path:r.path,parent:r});return i.status==="aborted"?xe:i.status==="dirty"?(n.dirty(),{status:"dirty",value:i.value}):this._def.out._parseSync({data:i.value,path:r.path,parent:r})}}static create(t,n){return new Ep({in:t,out:n,typeName:_e.ZodPipeline})}}const vL=(e,t={},n)=>e?Rc.create().superRefine((r,i)=>{var o,s;if(!e(r)){const a=typeof t=="function"?t(r):typeof t=="string"?{message:t}:t,l=(s=(o=a.fatal)!==null&&o!==void 0?o:n)!==null&&s!==void 0?s:!0,u=typeof a=="string"?{message:a}:a;i.addIssue({code:"custom",...u,fatal:l})}}):Rc.create(),The={object:Nt.lazycreate};var _e;(function(e){e.ZodString="ZodString",e.ZodNumber="ZodNumber",e.ZodNaN="ZodNaN",e.ZodBigInt="ZodBigInt",e.ZodBoolean="ZodBoolean",e.ZodDate="ZodDate",e.ZodSymbol="ZodSymbol",e.ZodUndefined="ZodUndefined",e.ZodNull="ZodNull",e.ZodAny="ZodAny",e.ZodUnknown="ZodUnknown",e.ZodNever="ZodNever",e.ZodVoid="ZodVoid",e.ZodArray="ZodArray",e.ZodObject="ZodObject",e.ZodUnion="ZodUnion",e.ZodDiscriminatedUnion="ZodDiscriminatedUnion",e.ZodIntersection="ZodIntersection",e.ZodTuple="ZodTuple",e.ZodRecord="ZodRecord",e.ZodMap="ZodMap",e.ZodSet="ZodSet",e.ZodFunction="ZodFunction",e.ZodLazy="ZodLazy",e.ZodLiteral="ZodLiteral",e.ZodEnum="ZodEnum",e.ZodEffects="ZodEffects",e.ZodNativeEnum="ZodNativeEnum",e.ZodOptional="ZodOptional",e.ZodNullable="ZodNullable",e.ZodDefault="ZodDefault",e.ZodCatch="ZodCatch",e.ZodPromise="ZodPromise",e.ZodBranded="ZodBranded",e.ZodPipeline="ZodPipeline"})(_e||(_e={}));const Ehe=(e,t={message:`Input not instance of ${e.name}`})=>vL(n=>n instanceof e,t),bL=Pi.create,SL=pa.create,Phe=Yy.create,khe=ga.create,_L=mh.create,Ahe=wl.create,Ohe=Hy.create,Rhe=yh.create,Ihe=vh.create,Nhe=Rc.create,Mhe=ul.create,Dhe=cs.create,Lhe=Wy.create,$he=Ii.create,Fhe=Nt.create,Bhe=Nt.strictCreate,jhe=bh.create,Vhe=p1.create,zhe=Sh.create,Uhe=vo.create,Ghe=_h.create,Hhe=qy.create,Whe=xl.create,qhe=tc.create,Khe=wh.create,Yhe=xh.create,Xhe=ma.create,Qhe=Ch.create,Zhe=Ic.create,T8=$i.create,Jhe=es.create,epe=Cl.create,tpe=$i.createWithPreprocess,npe=Ep.create,rpe=()=>bL().optional(),ipe=()=>SL().optional(),ope=()=>_L().optional(),spe={string:e=>Pi.create({...e,coerce:!0}),number:e=>pa.create({...e,coerce:!0}),boolean:e=>mh.create({...e,coerce:!0}),bigint:e=>ga.create({...e,coerce:!0}),date:e=>wl.create({...e,coerce:!0})},ape=xe;var hn=Object.freeze({__proto__:null,defaultErrorMap:gh,setErrorMap:dhe,getErrorMap:Vy,makeIssue:zy,EMPTY_PATH:fhe,addIssueToContext:ce,ParseStatus:Yn,INVALID:xe,DIRTY:gL,OK:lr,isAborted:Uw,isDirty:Gw,isValid:Uy,isAsync:Gy,get util(){return Xe},get objectUtil(){return zw},ZodParsedType:le,getParsedType:Vs,ZodType:Oe,ZodString:Pi,ZodNumber:pa,ZodBigInt:ga,ZodBoolean:mh,ZodDate:wl,ZodSymbol:Hy,ZodUndefined:yh,ZodNull:vh,ZodAny:Rc,ZodUnknown:ul,ZodNever:cs,ZodVoid:Wy,ZodArray:Ii,ZodObject:Nt,ZodUnion:bh,ZodDiscriminatedUnion:p1,ZodIntersection:Sh,ZodTuple:vo,ZodRecord:_h,ZodMap:qy,ZodSet:xl,ZodFunction:tc,ZodLazy:wh,ZodLiteral:xh,ZodEnum:ma,ZodNativeEnum:Ch,ZodPromise:Ic,ZodEffects:$i,ZodTransformer:$i,ZodOptional:es,ZodNullable:Cl,ZodDefault:Th,ZodCatch:Ky,ZodNaN:Yy,BRAND:Che,ZodBranded:yL,ZodPipeline:Ep,custom:vL,Schema:Oe,ZodSchema:Oe,late:The,get ZodFirstPartyTypeKind(){return _e},coerce:spe,any:Nhe,array:$he,bigint:khe,boolean:_L,date:Ahe,discriminatedUnion:Vhe,effect:T8,enum:Xhe,function:qhe,instanceof:Ehe,intersection:zhe,lazy:Khe,literal:Yhe,map:Hhe,nan:Phe,nativeEnum:Qhe,never:Dhe,null:Ihe,nullable:epe,number:SL,object:Fhe,oboolean:ope,onumber:ipe,optional:Jhe,ostring:rpe,pipeline:npe,preprocess:tpe,promise:Zhe,record:Ghe,set:Whe,strictObject:Bhe,string:bL,symbol:Ohe,transformer:T8,tuple:Uhe,undefined:Rhe,union:jhe,unknown:Mhe,void:Lhe,NEVER:ape,ZodIssueCode:re,quotelessJson:che,ZodError:Ri});const lpe=hn.string(),zEe=e=>lpe.safeParse(e).success,upe=hn.string(),UEe=e=>upe.safeParse(e).success,cpe=hn.number().int().min(1),GEe=e=>cpe.safeParse(e).success,dpe=hn.number().min(1),HEe=e=>dpe.safeParse(e).success,fpe=hn.enum(pN),WEe=e=>fpe.safeParse(e).success,hpe=hn.number().int().min(0).max(yne),qEe=e=>hpe.safeParse(e).success,ppe=hn.number().multipleOf(8).min(64),KEe=e=>ppe.safeParse(e).success,gpe=hn.number().multipleOf(8).min(64),YEe=e=>gpe.safeParse(e).success,v3=hn.enum(["sd-1","sd-2"]),Xy=hn.object({id:hn.string(),name:hn.string(),base_model:v3}),XEe=e=>Xy.safeParse(e).success,QEe=hn.object({id:hn.string(),name:hn.string(),base_model:v3});hn.object({id:hn.string(),name:hn.string(),base_model:v3});const mpe=hn.number().min(0).max(1),ZEe=e=>mpe.safeParse(e).success,Fl={cfgScale:7.5,height:512,img2imgStrength:.75,infillMethod:"patchmatch",iterations:1,perlin:0,positivePrompt:"",negativePrompt:"",scheduler:mne,seamBlur:16,seamSize:96,seamSteps:30,seamStrength:.7,seed:0,seedWeights:"",shouldFitToWidthHeight:!0,shouldGenerateVariations:!1,shouldRandomizeSeed:!0,shouldUseNoiseSettings:!1,steps:50,threshold:0,tileSize:32,variationAmount:.1,width:512,shouldUseSymmetry:!1,horizontalSymmetrySteps:0,verticalSymmetrySteps:0,model:null,vae:null,seamlessXAxis:!1,seamlessYAxis:!1,clipSkip:0,shouldUseCpuNoise:!0},ype=Fl,wL=Lt({name:"generation",initialState:ype,reducers:{setPositivePrompt:(e,t)=>{e.positivePrompt=t.payload},setNegativePrompt:(e,t)=>{e.negativePrompt=t.payload},setIterations:(e,t)=>{e.iterations=t.payload},setSteps:(e,t)=>{e.steps=t.payload},clampSymmetrySteps:e=>{e.horizontalSymmetrySteps=qo(e.horizontalSymmetrySteps,0,e.steps),e.verticalSymmetrySteps=qo(e.verticalSymmetrySteps,0,e.steps)},setCfgScale:(e,t)=>{e.cfgScale=t.payload},setThreshold:(e,t)=>{e.threshold=t.payload},setPerlin:(e,t)=>{e.perlin=t.payload},setHeight:(e,t)=>{e.height=t.payload},setWidth:(e,t)=>{e.width=t.payload},toggleSize:e=>{const[t,n]=[e.width,e.height];e.width=n,e.height=t},setScheduler:(e,t)=>{e.scheduler=t.payload},setSeed:(e,t)=>{e.seed=t.payload,e.shouldRandomizeSeed=!1},setImg2imgStrength:(e,t)=>{e.img2imgStrength=t.payload},setSeamlessXAxis:(e,t)=>{e.seamlessXAxis=t.payload},setSeamlessYAxis:(e,t)=>{e.seamlessYAxis=t.payload},setShouldFitToWidthHeight:(e,t)=>{e.shouldFitToWidthHeight=t.payload},resetSeed:e=>{e.seed=-1},setShouldGenerateVariations:(e,t)=>{e.shouldGenerateVariations=t.payload},setVariationAmount:(e,t)=>{e.variationAmount=t.payload},setSeedWeights:(e,t)=>{e.seedWeights=t.payload,e.shouldGenerateVariations=!0,e.variationAmount=0},resetParametersState:e=>({...e,...Fl}),setShouldRandomizeSeed:(e,t)=>{e.shouldRandomizeSeed=t.payload},clearInitialImage:e=>{e.initialImage=void 0},setSeamSize:(e,t)=>{e.seamSize=t.payload},setSeamBlur:(e,t)=>{e.seamBlur=t.payload},setSeamStrength:(e,t)=>{e.seamStrength=t.payload},setSeamSteps:(e,t)=>{e.seamSteps=t.payload},setTileSize:(e,t)=>{e.tileSize=t.payload},setInfillMethod:(e,t)=>{e.infillMethod=t.payload},setShouldUseSymmetry:(e,t)=>{e.shouldUseSymmetry=t.payload},setHorizontalSymmetrySteps:(e,t)=>{e.horizontalSymmetrySteps=t.payload},setVerticalSymmetrySteps:(e,t)=>{e.verticalSymmetrySteps=t.payload},setShouldUseNoiseSettings:(e,t)=>{e.shouldUseNoiseSettings=t.payload},initialImageChanged:(e,t)=>{const{image_name:n,width:r,height:i}=t.payload;e.initialImage={imageName:n,width:r,height:i}},modelSelected:(e,t)=>{const[n,r,i]=t.payload.split("/");e.model=Xy.parse({id:t.payload,base_model:n,name:i,type:r});const{maxClip:o}=Xd[e.model.base_model];e.clipSkip=qo(e.clipSkip,0,o)},modelChanged:(e,t)=>{e.model=t.payload},vaeSelected:(e,t)=>{e.vae=t.payload},setClipSkip:(e,t)=>{e.clipSkip=t.payload},shouldUseCpuNoiseChanged:(e,t)=>{e.shouldUseCpuNoise=t.payload}},extraReducers:e=>{e.addCase(vne,(t,n)=>{var i;const r=(i=n.payload.sd)==null?void 0:i.defaultModel;if(r&&!t.model){const[o,s,a]=r.split("/");t.model=Xy.parse({id:r,name:a,base_model:o})}}),e.addCase(xpe,(t,n)=>{n.payload||(t.clipSkip=0)}),e.addCase(Cpe,(t,n)=>{const r=n.payload;r&&(t.height=Ko(t.width/r,8))})}}),{clampSymmetrySteps:JEe,clearInitialImage:xL,resetParametersState:e6e,resetSeed:t6e,setCfgScale:n6e,setWidth:r6e,setHeight:i6e,toggleSize:o6e,setImg2imgStrength:s6e,setInfillMethod:a6e,setIterations:l6e,setPerlin:u6e,setPositivePrompt:c6e,setNegativePrompt:d6e,setScheduler:f6e,setSeamBlur:h6e,setSeamSize:p6e,setSeamSteps:g6e,setSeamStrength:m6e,setSeed:y6e,setSeedWeights:v6e,setShouldFitToWidthHeight:b6e,setShouldGenerateVariations:S6e,setShouldRandomizeSeed:_6e,setSteps:w6e,setThreshold:x6e,setTileSize:C6e,setVariationAmount:T6e,setShouldUseSymmetry:E6e,setHorizontalSymmetrySteps:P6e,setVerticalSymmetrySteps:k6e,initialImageChanged:Eh,modelChanged:vpe,vaeSelected:bpe,setShouldUseNoiseSettings:A6e,setSeamlessXAxis:O6e,setSeamlessYAxis:R6e,setClipSkip:E8,shouldUseCpuNoiseChanged:I6e}=wL.actions,Spe=wL.reducer,CL=["txt2img","img2img","unifiedCanvas","nodes","modelManager","batch"],P8=(e,t)=>{typeof t=="number"?e.activeTab=t:e.activeTab=CL.indexOf(t)},TL={activeTab:0,shouldPinParametersPanel:!0,shouldShowParametersPanel:!0,shouldShowImageDetails:!1,shouldUseCanvasBetaLayout:!1,shouldShowExistingModelsInSearch:!1,shouldUseSliders:!1,addNewModelUIOption:null,shouldPinGallery:!0,shouldShowGallery:!0,shouldHidePreview:!1,shouldShowProgressInViewer:!0,shouldShowEmbeddingPicker:!1,shouldShowAdvancedOptions:!1,aspectRatio:null,favoriteSchedulers:[]},EL=Lt({name:"ui",initialState:TL,reducers:{setActiveTab:(e,t)=>{P8(e,t.payload)},setShouldPinParametersPanel:(e,t)=>{e.shouldPinParametersPanel=t.payload,e.shouldShowParametersPanel=!0},setShouldShowParametersPanel:(e,t)=>{e.shouldShowParametersPanel=t.payload},setShouldShowImageDetails:(e,t)=>{e.shouldShowImageDetails=t.payload},setShouldUseCanvasBetaLayout:(e,t)=>{e.shouldUseCanvasBetaLayout=t.payload},setShouldHidePreview:(e,t)=>{e.shouldHidePreview=t.payload},setShouldShowExistingModelsInSearch:(e,t)=>{e.shouldShowExistingModelsInSearch=t.payload},setShouldUseSliders:(e,t)=>{e.shouldUseSliders=t.payload},setAddNewModelUIOption:(e,t)=>{e.addNewModelUIOption=t.payload},setShouldShowGallery:(e,t)=>{e.shouldShowGallery=t.payload},togglePinGalleryPanel:e=>{e.shouldPinGallery=!e.shouldPinGallery,e.shouldPinGallery||(e.shouldShowGallery=!0)},togglePinParametersPanel:e=>{e.shouldPinParametersPanel=!e.shouldPinParametersPanel,e.shouldPinParametersPanel||(e.shouldShowParametersPanel=!0)},toggleParametersPanel:e=>{e.shouldShowParametersPanel=!e.shouldShowParametersPanel},toggleGalleryPanel:e=>{e.shouldShowGallery=!e.shouldShowGallery},togglePanels:e=>{e.shouldShowGallery||e.shouldShowParametersPanel?(e.shouldShowGallery=!1,e.shouldShowParametersPanel=!1):(e.shouldShowGallery=!0,e.shouldShowParametersPanel=!0)},setShouldShowProgressInViewer:(e,t)=>{e.shouldShowProgressInViewer=t.payload},favoriteSchedulersChanged:(e,t)=>{e.favoriteSchedulers=t.payload},toggleEmbeddingPicker:e=>{e.shouldShowEmbeddingPicker=!e.shouldShowEmbeddingPicker},setShouldShowAdvancedOptions:(e,t)=>{e.shouldShowAdvancedOptions=t.payload},setAspectRatio:(e,t)=>{e.aspectRatio=t.payload}},extraReducers(e){e.addCase(Eh,t=>{P8(t,"img2img")})}}),{setActiveTab:_pe,setShouldPinParametersPanel:N6e,setShouldShowParametersPanel:M6e,setShouldShowImageDetails:D6e,setShouldUseCanvasBetaLayout:wpe,setShouldShowExistingModelsInSearch:L6e,setShouldUseSliders:$6e,setAddNewModelUIOption:F6e,setShouldHidePreview:B6e,setShouldShowGallery:j6e,togglePanels:V6e,togglePinGalleryPanel:z6e,togglePinParametersPanel:U6e,toggleParametersPanel:G6e,toggleGalleryPanel:H6e,setShouldShowProgressInViewer:W6e,favoriteSchedulersChanged:q6e,toggleEmbeddingPicker:K6e,setShouldShowAdvancedOptions:xpe,setAspectRatio:Cpe}=EL.actions,Tpe=EL.reducer,yu={objects:[],stagingArea:{images:[],selectedImageIndex:-1}},PL={boundingBoxCoordinates:{x:0,y:0},boundingBoxDimensions:{width:512,height:512},boundingBoxPreviewFill:{r:0,g:0,b:0,a:.5},boundingBoxScaleMethod:"auto",brushColor:{r:90,g:90,b:255,a:1},brushSize:50,canvasContainerDimensions:{width:0,height:0},colorPickerColor:{r:90,g:90,b:255,a:1},cursorPosition:null,doesCanvasNeedScaling:!1,futureLayerStates:[],isCanvasInitialized:!1,isDrawing:!1,isMaskEnabled:!0,isMouseOverBoundingBox:!1,isMoveBoundingBoxKeyHeld:!1,isMoveStageKeyHeld:!1,isMovingBoundingBox:!1,isMovingStage:!1,isTransformingBoundingBox:!1,layer:"base",layerState:yu,maskColor:{r:255,g:90,b:90,a:1},maxHistory:128,minimumStageScale:1,pastLayerStates:[],scaledBoundingBoxDimensions:{width:512,height:512},shouldAntialias:!0,shouldAutoSave:!1,shouldCropToBoundingBoxOnSave:!1,shouldDarkenOutsideBoundingBox:!1,shouldLockBoundingBox:!1,shouldPreserveMaskedArea:!1,shouldRestrictStrokesToBox:!0,shouldShowBoundingBox:!0,shouldShowBrush:!0,shouldShowBrushPreview:!1,shouldShowCanvasDebugInfo:!1,shouldShowCheckboardTransparency:!1,shouldShowGrid:!0,shouldShowIntermediates:!0,shouldShowStagingImage:!0,shouldShowStagingOutline:!0,shouldSnapToGrid:!0,stageCoordinates:{x:0,y:0},stageDimensions:{width:0,height:0},stageScale:1,tool:"brush"},kL=Lt({name:"canvas",initialState:PL,reducers:{setTool:(e,t)=>{const n=t.payload;e.tool=t.payload,n!=="move"&&(e.isTransformingBoundingBox=!1,e.isMouseOverBoundingBox=!1,e.isMovingBoundingBox=!1,e.isMovingStage=!1)},setLayer:(e,t)=>{e.layer=t.payload},toggleTool:e=>{const t=e.tool;t!=="move"&&(e.tool=t==="brush"?"eraser":"brush")},setMaskColor:(e,t)=>{e.maskColor=t.payload},setBrushColor:(e,t)=>{e.brushColor=t.payload},setBrushSize:(e,t)=>{e.brushSize=t.payload},clearMask:e=>{e.pastLayerStates.push(gr(e.layerState)),e.layerState.objects=e.layerState.objects.filter(t=>!jI(t)),e.futureLayerStates=[],e.shouldPreserveMaskedArea=!1},toggleShouldInvertMask:e=>{e.shouldPreserveMaskedArea=!e.shouldPreserveMaskedArea},toggleShouldShowMask:e=>{e.isMaskEnabled=!e.isMaskEnabled},setShouldPreserveMaskedArea:(e,t)=>{e.shouldPreserveMaskedArea=t.payload},setIsMaskEnabled:(e,t)=>{e.isMaskEnabled=t.payload,e.layer=t.payload?"mask":"base"},setShouldShowCheckboardTransparency:(e,t)=>{e.shouldShowCheckboardTransparency=t.payload},setShouldShowBrushPreview:(e,t)=>{e.shouldShowBrushPreview=t.payload},setShouldShowBrush:(e,t)=>{e.shouldShowBrush=t.payload},setCursorPosition:(e,t)=>{e.cursorPosition=t.payload},setInitialCanvasImage:(e,t)=>{const n=t.payload,{width:r,height:i}=n,{stageDimensions:o}=e,s={width:Wd(qo(r,64,512),64),height:Wd(qo(i,64,512),64)},a={x:Ko(r/2-s.width/2,64),y:Ko(i/2-s.height/2,64)};if(e.boundingBoxScaleMethod==="auto"){const c=La(s);e.scaledBoundingBoxDimensions=c}e.boundingBoxDimensions=s,e.boundingBoxCoordinates=a,e.pastLayerStates.push(gr(e.layerState)),e.layerState={...yu,objects:[{kind:"image",layer:"base",x:0,y:0,width:r,height:i,imageName:n.image_name}]},e.futureLayerStates=[],e.isCanvasInitialized=!1;const l=eu(o.width,o.height,r,i,wd),u=Jl(o.width,o.height,0,0,r,i,l);e.stageScale=l,e.stageCoordinates=u,e.doesCanvasNeedScaling=!0},setBoundingBoxDimensions:(e,t)=>{const n=ree(t.payload);if(e.boundingBoxDimensions=n,e.boundingBoxScaleMethod==="auto"){const r=La(n);e.scaledBoundingBoxDimensions=r}},setBoundingBoxCoordinates:(e,t)=>{e.boundingBoxCoordinates=d6(t.payload)},setStageCoordinates:(e,t)=>{e.stageCoordinates=t.payload},setBoundingBoxPreviewFill:(e,t)=>{e.boundingBoxPreviewFill=t.payload},setDoesCanvasNeedScaling:(e,t)=>{e.doesCanvasNeedScaling=t.payload},setStageScale:(e,t)=>{e.stageScale=t.payload},setShouldDarkenOutsideBoundingBox:(e,t)=>{e.shouldDarkenOutsideBoundingBox=t.payload},setIsDrawing:(e,t)=>{e.isDrawing=t.payload},clearCanvasHistory:e=>{e.pastLayerStates=[],e.futureLayerStates=[]},setShouldLockBoundingBox:(e,t)=>{e.shouldLockBoundingBox=t.payload},toggleShouldLockBoundingBox:e=>{e.shouldLockBoundingBox=!e.shouldLockBoundingBox},setShouldShowBoundingBox:(e,t)=>{e.shouldShowBoundingBox=t.payload},setIsTransformingBoundingBox:(e,t)=>{e.isTransformingBoundingBox=t.payload},setIsMovingBoundingBox:(e,t)=>{e.isMovingBoundingBox=t.payload},setIsMouseOverBoundingBox:(e,t)=>{e.isMouseOverBoundingBox=t.payload},setIsMoveBoundingBoxKeyHeld:(e,t)=>{e.isMoveBoundingBoxKeyHeld=t.payload},setIsMoveStageKeyHeld:(e,t)=>{e.isMoveStageKeyHeld=t.payload},canvasSessionIdChanged:(e,t)=>{e.layerState.stagingArea.sessionId=t.payload},stagingAreaInitialized:(e,t)=>{const{sessionId:n,boundingBox:r}=t.payload;e.layerState.stagingArea={boundingBox:r,sessionId:n,images:[],selectedImageIndex:-1}},addImageToStagingArea:(e,t)=>{const n=t.payload;!n||!e.layerState.stagingArea.boundingBox||(e.pastLayerStates.push(gr(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift(),e.layerState.stagingArea.images.push({kind:"image",layer:"base",...e.layerState.stagingArea.boundingBox,imageName:n.image_name}),e.layerState.stagingArea.selectedImageIndex=e.layerState.stagingArea.images.length-1,e.futureLayerStates=[])},discardStagedImages:e=>{e.pastLayerStates.push(gr(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift(),e.layerState.stagingArea={...yu.stagingArea},e.futureLayerStates=[],e.shouldShowStagingOutline=!0,e.shouldShowStagingOutline=!0},addFillRect:e=>{const{boundingBoxCoordinates:t,boundingBoxDimensions:n,brushColor:r}=e;e.pastLayerStates.push(gr(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift(),e.layerState.objects.push({kind:"fillRect",layer:"base",...t,...n,color:r}),e.futureLayerStates=[]},addEraseRect:e=>{const{boundingBoxCoordinates:t,boundingBoxDimensions:n}=e;e.pastLayerStates.push(gr(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift(),e.layerState.objects.push({kind:"eraseRect",layer:"base",...t,...n}),e.futureLayerStates=[]},addLine:(e,t)=>{const{tool:n,layer:r,brushColor:i,brushSize:o,shouldRestrictStrokesToBox:s}=e;if(n==="move"||n==="colorPicker")return;const a=o/2,l=r==="base"&&n==="brush"?{color:i}:{};e.pastLayerStates.push(gr(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift();const u={kind:"line",layer:r,tool:n,strokeWidth:a,points:t.payload,...l};s&&(u.clip={...e.boundingBoxCoordinates,...e.boundingBoxDimensions}),e.layerState.objects.push(u),e.futureLayerStates=[]},addPointToCurrentLine:(e,t)=>{const n=e.layerState.objects.findLast(iee);n&&n.points.push(...t.payload)},undo:e=>{const t=e.pastLayerStates.pop();t&&(e.futureLayerStates.unshift(gr(e.layerState)),e.futureLayerStates.length>e.maxHistory&&e.futureLayerStates.pop(),e.layerState=t)},redo:e=>{const t=e.futureLayerStates.shift();t&&(e.pastLayerStates.push(gr(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift(),e.layerState=t)},setShouldShowGrid:(e,t)=>{e.shouldShowGrid=t.payload},setIsMovingStage:(e,t)=>{e.isMovingStage=t.payload},setShouldSnapToGrid:(e,t)=>{e.shouldSnapToGrid=t.payload},setShouldAutoSave:(e,t)=>{e.shouldAutoSave=t.payload},setShouldShowIntermediates:(e,t)=>{e.shouldShowIntermediates=t.payload},resetCanvas:e=>{e.pastLayerStates.push(gr(e.layerState)),e.layerState=yu,e.futureLayerStates=[]},setCanvasContainerDimensions:(e,t)=>{e.canvasContainerDimensions=t.payload},resizeAndScaleCanvas:e=>{const{width:t,height:n}=e.canvasContainerDimensions,r=e.layerState.objects.find(rw),i={width:Math.floor(t),height:Math.floor(n)};if(!r){const c=eu(i.width,i.height,512,512,wd),d=Jl(i.width,i.height,0,0,512,512,c),f={width:512,height:512};if(e.stageScale=c,e.stageCoordinates=d,e.stageDimensions=i,e.boundingBoxCoordinates={x:0,y:0},e.boundingBoxDimensions=f,e.boundingBoxScaleMethod==="auto"){const h=La(f);e.scaledBoundingBoxDimensions=h}return}const{width:o,height:s}=r,l=eu(t,n,o,s,.95),u=Jl(i.width,i.height,0,0,o,s,l);e.minimumStageScale=l,e.stageScale=l,e.stageCoordinates=d6(u),e.stageDimensions=i,e.isCanvasInitialized=!0},resizeCanvas:e=>{const{width:t,height:n}=e.canvasContainerDimensions,r={width:Math.floor(t),height:Math.floor(n)};if(e.stageDimensions=r,!e.layerState.objects.find(rw)){const i=eu(r.width,r.height,512,512,wd),o=Jl(r.width,r.height,0,0,512,512,i),s={width:512,height:512};if(e.stageScale=i,e.stageCoordinates=o,e.boundingBoxCoordinates={x:0,y:0},e.boundingBoxDimensions=s,e.boundingBoxScaleMethod==="auto"){const a=La(s);e.scaledBoundingBoxDimensions=a}}},resetCanvasView:(e,t)=>{const{contentRect:n,shouldScaleTo1:r}=t.payload,{stageDimensions:{width:i,height:o}}=e,{x:s,y:a,width:l,height:u}=n;if(l!==0&&u!==0){const c=r?1:eu(i,o,l,u,wd),d=Jl(i,o,s,a,l,u,c);e.stageScale=c,e.stageCoordinates=d}else{const c=eu(i,o,512,512,wd),d=Jl(i,o,0,0,512,512,c),f={width:512,height:512};if(e.stageScale=c,e.stageCoordinates=d,e.boundingBoxCoordinates={x:0,y:0},e.boundingBoxDimensions=f,e.boundingBoxScaleMethod==="auto"){const h=La(f);e.scaledBoundingBoxDimensions=h}}},nextStagingAreaImage:e=>{if(!e.layerState.stagingArea.images.length)return;const t=e.layerState.stagingArea.selectedImageIndex,n=e.layerState.stagingArea.images.length;e.layerState.stagingArea.selectedImageIndex=Math.min(t+1,n-1)},prevStagingAreaImage:e=>{if(!e.layerState.stagingArea.images.length)return;const t=e.layerState.stagingArea.selectedImageIndex;e.layerState.stagingArea.selectedImageIndex=Math.max(t-1,0)},commitStagingAreaImage:(e,t)=>{if(!e.layerState.stagingArea.images.length)return;const{images:n,selectedImageIndex:r}=e.layerState.stagingArea;e.pastLayerStates.push(gr(e.layerState)),e.pastLayerStates.length>e.maxHistory&&e.pastLayerStates.shift(),e.layerState.objects.push({...n[r]}),e.layerState.stagingArea={...yu.stagingArea},e.futureLayerStates=[],e.shouldShowStagingOutline=!0,e.shouldShowStagingImage=!0},fitBoundingBoxToStage:e=>{const{boundingBoxDimensions:t,boundingBoxCoordinates:n,stageDimensions:r,stageScale:i}=e,o=r.width/i,s=r.height/i;if(n.x<0||n.x+t.width>o||n.y<0||n.y+t.height>s){const a={width:Wd(qo(o,64,512),64),height:Wd(qo(s,64,512),64)},l={x:Ko(o/2-a.width/2,64),y:Ko(s/2-a.height/2,64)};if(e.boundingBoxDimensions=a,e.boundingBoxCoordinates=l,e.boundingBoxScaleMethod==="auto"){const u=La(a);e.scaledBoundingBoxDimensions=u}}},setBoundingBoxScaleMethod:(e,t)=>{if(e.boundingBoxScaleMethod=t.payload,t.payload==="auto"){const n=La(e.boundingBoxDimensions);e.scaledBoundingBoxDimensions=n}},setScaledBoundingBoxDimensions:(e,t)=>{e.scaledBoundingBoxDimensions=t.payload},setShouldShowStagingImage:(e,t)=>{e.shouldShowStagingImage=t.payload},setShouldShowStagingOutline:(e,t)=>{e.shouldShowStagingOutline=t.payload},setShouldShowCanvasDebugInfo:(e,t)=>{e.shouldShowCanvasDebugInfo=t.payload},setShouldRestrictStrokesToBox:(e,t)=>{e.shouldRestrictStrokesToBox=t.payload},setShouldAntialias:(e,t)=>{e.shouldAntialias=t.payload},setShouldCropToBoundingBoxOnSave:(e,t)=>{e.shouldCropToBoundingBoxOnSave=t.payload},setColorPickerColor:(e,t)=>{e.colorPickerColor=t.payload},commitColorPickerColor:e=>{e.brushColor={...e.colorPickerColor,a:e.brushColor.a},e.tool="brush"},setMergedCanvas:(e,t)=>{e.pastLayerStates.push(gr(e.layerState)),e.futureLayerStates=[],e.layerState.objects=[t.payload]},resetCanvasInteractionState:e=>{e.cursorPosition=null,e.isDrawing=!1,e.isMouseOverBoundingBox=!1,e.isMoveBoundingBoxKeyHeld=!1,e.isMoveStageKeyHeld=!1,e.isMovingBoundingBox=!1,e.isMovingStage=!1,e.isTransformingBoundingBox=!1},mouseLeftCanvas:e=>{e.cursorPosition=null,e.isDrawing=!1,e.isMouseOverBoundingBox=!1,e.isMovingBoundingBox=!1,e.isTransformingBoundingBox=!1}},extraReducers:e=>{e.addCase(Nl.pending,t=>{t.layerState.stagingArea.images.length||(t.layerState.stagingArea=yu.stagingArea)}),e.addCase(wpe,(t,n)=>{t.doesCanvasNeedScaling=!0}),e.addCase(_pe,(t,n)=>{t.doesCanvasNeedScaling=!0})}}),{addEraseRect:Y6e,addFillRect:X6e,addImageToStagingArea:Epe,addLine:Q6e,addPointToCurrentLine:Z6e,clearCanvasHistory:J6e,clearMask:ePe,commitColorPickerColor:tPe,commitStagingAreaImage:Ppe,discardStagedImages:nPe,fitBoundingBoxToStage:rPe,mouseLeftCanvas:iPe,nextStagingAreaImage:oPe,prevStagingAreaImage:sPe,redo:aPe,resetCanvas:AL,resetCanvasInteractionState:lPe,resetCanvasView:uPe,resizeAndScaleCanvas:cPe,resizeCanvas:dPe,setBoundingBoxCoordinates:fPe,setBoundingBoxDimensions:hPe,setBoundingBoxPreviewFill:pPe,setBoundingBoxScaleMethod:gPe,setBrushColor:mPe,setBrushSize:yPe,setCanvasContainerDimensions:vPe,setColorPickerColor:bPe,setCursorPosition:SPe,setDoesCanvasNeedScaling:_Pe,setInitialCanvasImage:OL,setIsDrawing:wPe,setIsMaskEnabled:xPe,setIsMouseOverBoundingBox:CPe,setIsMoveBoundingBoxKeyHeld:TPe,setIsMoveStageKeyHeld:EPe,setIsMovingBoundingBox:PPe,setIsMovingStage:kPe,setIsTransformingBoundingBox:APe,setLayer:OPe,setMaskColor:RPe,setMergedCanvas:kpe,setShouldAutoSave:IPe,setShouldCropToBoundingBoxOnSave:NPe,setShouldDarkenOutsideBoundingBox:MPe,setShouldLockBoundingBox:DPe,setShouldPreserveMaskedArea:LPe,setShouldShowBoundingBox:$Pe,setShouldShowBrush:FPe,setShouldShowBrushPreview:BPe,setShouldShowCanvasDebugInfo:jPe,setShouldShowCheckboardTransparency:VPe,setShouldShowGrid:zPe,setShouldShowIntermediates:UPe,setShouldShowStagingImage:GPe,setShouldShowStagingOutline:HPe,setShouldSnapToGrid:WPe,setStageCoordinates:qPe,setStageScale:KPe,setTool:YPe,toggleShouldLockBoundingBox:XPe,toggleTool:QPe,undo:ZPe,setScaledBoundingBoxDimensions:JPe,setShouldRestrictStrokesToBox:e8e,stagingAreaInitialized:Ape,canvasSessionIdChanged:Ope,setShouldAntialias:t8e}=kL.actions,Rpe=kL.reducer,vu={none:{type:"none",label:"none",description:"",default:{type:"none"}},canny_image_processor:{type:"canny_image_processor",label:"Canny",description:"",default:{id:"canny_image_processor",type:"canny_image_processor",low_threshold:100,high_threshold:200}},content_shuffle_image_processor:{type:"content_shuffle_image_processor",label:"Content Shuffle",description:"",default:{id:"content_shuffle_image_processor",type:"content_shuffle_image_processor",detect_resolution:512,image_resolution:512,h:512,w:512,f:256}},hed_image_processor:{type:"hed_image_processor",label:"HED",description:"",default:{id:"hed_image_processor",type:"hed_image_processor",detect_resolution:512,image_resolution:512,scribble:!1}},lineart_anime_image_processor:{type:"lineart_anime_image_processor",label:"Lineart Anime",description:"",default:{id:"lineart_anime_image_processor",type:"lineart_anime_image_processor",detect_resolution:512,image_resolution:512}},lineart_image_processor:{type:"lineart_image_processor",label:"Lineart",description:"",default:{id:"lineart_image_processor",type:"lineart_image_processor",detect_resolution:512,image_resolution:512,coarse:!1}},mediapipe_face_processor:{type:"mediapipe_face_processor",label:"Mediapipe Face",description:"",default:{id:"mediapipe_face_processor",type:"mediapipe_face_processor",max_faces:1,min_confidence:.5}},midas_depth_image_processor:{type:"midas_depth_image_processor",label:"Depth (Midas)",description:"",default:{id:"midas_depth_image_processor",type:"midas_depth_image_processor",a_mult:2,bg_th:.1}},mlsd_image_processor:{type:"mlsd_image_processor",label:"M-LSD",description:"",default:{id:"mlsd_image_processor",type:"mlsd_image_processor",detect_resolution:512,image_resolution:512,thr_d:.1,thr_v:.1}},normalbae_image_processor:{type:"normalbae_image_processor",label:"Normal BAE",description:"",default:{id:"normalbae_image_processor",type:"normalbae_image_processor",detect_resolution:512,image_resolution:512}},openpose_image_processor:{type:"openpose_image_processor",label:"Openpose",description:"",default:{id:"openpose_image_processor",type:"openpose_image_processor",detect_resolution:512,image_resolution:512,hand_and_face:!1}},pidi_image_processor:{type:"pidi_image_processor",label:"PIDI",description:"",default:{id:"pidi_image_processor",type:"pidi_image_processor",detect_resolution:512,image_resolution:512,scribble:!1,safe:!1}},zoe_depth_image_processor:{type:"zoe_depth_image_processor",label:"Depth (Zoe)",description:"",default:{id:"zoe_depth_image_processor",type:"zoe_depth_image_processor"}}},Ww={"lllyasviel/control_v11p_sd15_canny":{type:"lllyasviel/control_v11p_sd15_canny",label:"Canny",defaultProcessor:"canny_image_processor"},"lllyasviel/control_v11p_sd15_inpaint":{type:"lllyasviel/control_v11p_sd15_inpaint",label:"Inpaint",defaultProcessor:"none"},"lllyasviel/control_v11p_sd15_mlsd":{type:"lllyasviel/control_v11p_sd15_mlsd",label:"M-LSD",defaultProcessor:"mlsd_image_processor"},"lllyasviel/control_v11f1p_sd15_depth":{type:"lllyasviel/control_v11f1p_sd15_depth",label:"Depth",defaultProcessor:"midas_depth_image_processor"},"lllyasviel/control_v11p_sd15_normalbae":{type:"lllyasviel/control_v11p_sd15_normalbae",label:"Normal Map (BAE)",defaultProcessor:"normalbae_image_processor"},"lllyasviel/control_v11p_sd15_seg":{type:"lllyasviel/control_v11p_sd15_seg",label:"Segmentation",defaultProcessor:"none"},"lllyasviel/control_v11p_sd15_lineart":{type:"lllyasviel/control_v11p_sd15_lineart",label:"Lineart",defaultProcessor:"lineart_image_processor"},"lllyasviel/control_v11p_sd15s2_lineart_anime":{type:"lllyasviel/control_v11p_sd15s2_lineart_anime",label:"Lineart Anime",defaultProcessor:"lineart_anime_image_processor"},"lllyasviel/control_v11p_sd15_scribble":{type:"lllyasviel/control_v11p_sd15_scribble",label:"Scribble",defaultProcessor:"none"},"lllyasviel/control_v11p_sd15_softedge":{type:"lllyasviel/control_v11p_sd15_softedge",label:"Soft Edge",defaultProcessor:"hed_image_processor"},"lllyasviel/control_v11e_sd15_shuffle":{type:"lllyasviel/control_v11e_sd15_shuffle",label:"Content Shuffle",defaultProcessor:"content_shuffle_image_processor"},"lllyasviel/control_v11p_sd15_openpose":{type:"lllyasviel/control_v11p_sd15_openpose",label:"Openpose",defaultProcessor:"openpose_image_processor"},"lllyasviel/control_v11f1e_sd15_tile":{type:"lllyasviel/control_v11f1e_sd15_tile",label:"Tile (experimental)",defaultProcessor:"none"},"lllyasviel/control_v11e_sd15_ip2p":{type:"lllyasviel/control_v11e_sd15_ip2p",label:"Pix2Pix (experimental)",defaultProcessor:"none"},"CrucibleAI/ControlNetMediaPipeFace":{type:"CrucibleAI/ControlNetMediaPipeFace",label:"Mediapipe Face",defaultProcessor:"mediapipe_face_processor"}},b3=me("controlNet/imageProcessed"),RL=me("socket/socketConnected"),IL=me("socket/appSocketConnected"),NL=me("socket/socketDisconnected"),ML=me("socket/appSocketDisconnected"),S3=me("socket/socketSubscribed"),DL=me("socket/appSocketSubscribed"),LL=me("socket/socketUnsubscribed"),$L=me("socket/appSocketUnsubscribed"),FL=me("socket/socketInvocationStarted"),BL=me("socket/appSocketInvocationStarted"),_3=me("socket/socketInvocationComplete"),jL=me("socket/appSocketInvocationComplete"),VL=me("socket/socketInvocationError"),w3=me("socket/appSocketInvocationError"),zL=me("socket/socketGraphExecutionStateComplete"),UL=me("socket/appSocketGraphExecutionStateComplete"),GL=me("socket/socketGeneratorProgress"),HL=me("socket/appSocketGeneratorProgress"),k8={isEnabled:!0,model:Ww["lllyasviel/control_v11p_sd15_canny"].type,weight:1,beginStepPct:0,endStepPct:1,controlMode:"balanced",controlImage:null,processedControlImage:null,processorType:"canny_image_processor",processorNode:vu.canny_image_processor.default,shouldAutoConfig:!0},qw={controlNets:{},isEnabled:!1,pendingControlImages:[]},WL=Lt({name:"controlNet",initialState:qw,reducers:{isControlNetEnabledToggled:e=>{e.isEnabled=!e.isEnabled},controlNetAdded:(e,t)=>{const{controlNetId:n,controlNet:r}=t.payload;e.controlNets[n]={...r??k8,controlNetId:n}},controlNetAddedFromImage:(e,t)=>{const{controlNetId:n,controlImage:r}=t.payload;e.controlNets[n]={...k8,controlNetId:n,controlImage:r}},controlNetRemoved:(e,t)=>{const{controlNetId:n}=t.payload;delete e.controlNets[n]},controlNetToggled:(e,t)=>{const{controlNetId:n}=t.payload;e.controlNets[n].isEnabled=!e.controlNets[n].isEnabled},controlNetImageChanged:(e,t)=>{const{controlNetId:n,controlImage:r}=t.payload;e.controlNets[n].controlImage=r,e.controlNets[n].processedControlImage=null,r!==null&&e.controlNets[n].processorType!=="none"&&e.pendingControlImages.push(n)},controlNetProcessedImageChanged:(e,t)=>{const{controlNetId:n,processedControlImage:r}=t.payload;e.controlNets[n].processedControlImage=r,e.pendingControlImages=e.pendingControlImages.filter(i=>i!==n)},controlNetModelChanged:(e,t)=>{const{controlNetId:n,model:r}=t.payload;if(e.controlNets[n].model=r,e.controlNets[n].processedControlImage=null,e.controlNets[n].shouldAutoConfig){const i=Ww[r].defaultProcessor;i?(e.controlNets[n].processorType=i,e.controlNets[n].processorNode=vu[i].default):(e.controlNets[n].processorType="none",e.controlNets[n].processorNode=vu.none.default)}},controlNetWeightChanged:(e,t)=>{const{controlNetId:n,weight:r}=t.payload;e.controlNets[n].weight=r},controlNetBeginStepPctChanged:(e,t)=>{const{controlNetId:n,beginStepPct:r}=t.payload;e.controlNets[n].beginStepPct=r},controlNetEndStepPctChanged:(e,t)=>{const{controlNetId:n,endStepPct:r}=t.payload;e.controlNets[n].endStepPct=r},controlNetControlModeChanged:(e,t)=>{const{controlNetId:n,controlMode:r}=t.payload;e.controlNets[n].controlMode=r},controlNetProcessorParamsChanged:(e,t)=>{const{controlNetId:n,changes:r}=t.payload,i=e.controlNets[n].processorNode;e.controlNets[n].processorNode={...i,...r},e.controlNets[n].shouldAutoConfig=!1},controlNetProcessorTypeChanged:(e,t)=>{const{controlNetId:n,processorType:r}=t.payload;e.controlNets[n].processedControlImage=null,e.controlNets[n].processorType=r,e.controlNets[n].processorNode=vu[r].default,e.controlNets[n].shouldAutoConfig=!1},controlNetAutoConfigToggled:(e,t)=>{const{controlNetId:n}=t.payload,r=!e.controlNets[n].shouldAutoConfig;if(r){const i=Ww[e.controlNets[n].model].defaultProcessor;i?(e.controlNets[n].processorType=i,e.controlNets[n].processorNode=vu[i].default):(e.controlNets[n].processorType="none",e.controlNets[n].processorNode=vu.none.default)}e.controlNets[n].shouldAutoConfig=r},controlNetReset:()=>({...qw})},extraReducers:e=>{e.addCase(b3,(t,n)=>{t.controlNets[n.payload.controlNetId].controlImage!==null&&t.pendingControlImages.push(n.payload.controlNetId)}),e.addCase(vl.pending,(t,n)=>{const{image_name:r}=n.meta.arg;f5(t.controlNets,i=>{i.controlImage===r&&(i.controlImage=null,i.processedControlImage=null),i.processedControlImage===r&&(i.processedControlImage=null)})}),e.addCase(w3,(t,n)=>{t.pendingControlImages=[]}),e.addMatcher(hN,(t,n)=>{t.pendingControlImages=[]})}}),{isControlNetEnabledToggled:n8e,controlNetAdded:r8e,controlNetAddedFromImage:i8e,controlNetRemoved:o8e,controlNetImageChanged:x3,controlNetProcessedImageChanged:Ipe,controlNetToggled:s8e,controlNetModelChanged:A8,controlNetWeightChanged:a8e,controlNetBeginStepPctChanged:l8e,controlNetEndStepPctChanged:u8e,controlNetControlModeChanged:c8e,controlNetProcessorParamsChanged:Npe,controlNetProcessorTypeChanged:Mpe,controlNetReset:qL,controlNetAutoConfigToggled:Dpe}=WL.actions,Lpe=WL.reducer,$pe=e=>e.controlNet,KL={isEnabled:!1,maxPrompts:100,combinatorial:!0},Fpe=KL,YL=Lt({name:"dynamicPrompts",initialState:Fpe,reducers:{maxPromptsChanged:(e,t)=>{e.maxPrompts=t.payload},maxPromptsReset:e=>{e.maxPrompts=KL.maxPrompts},combinatorialToggled:e=>{e.combinatorial=!e.combinatorial},isEnabledToggled:e=>{e.isEnabled=!e.isEnabled}},extraReducers:e=>{}}),{isEnabledToggled:d8e,maxPromptsChanged:f8e,maxPromptsReset:h8e,combinatorialToggled:p8e}=YL.actions,Bpe=YL.reducer,jpe={updateBoardModalOpen:!1,searchText:""},XL=Lt({name:"boards",initialState:jpe,reducers:{setBoardSearchText:(e,t)=>{e.searchText=t.payload},setUpdateBoardModalOpen:(e,t)=>{e.updateBoardModalOpen=t.payload}}}),{setBoardSearchText:g8e,setUpdateBoardModalOpen:m8e}=XL.actions,Vpe=XL.reducer,zpe={imageToDelete:null,isModalOpen:!1},QL=Lt({name:"imageDeletion",initialState:zpe,reducers:{isModalOpenChanged:(e,t)=>{e.isModalOpen=t.payload},imageToDeleteSelected:(e,t)=>{e.imageToDelete=t.payload},imageToDeleteCleared:e=>{e.imageToDelete=null,e.isModalOpen=!1}}}),{isModalOpenChanged:ZL,imageToDeleteSelected:Upe,imageToDeleteCleared:y8e}=QL.actions,Gpe=QL.reducer,Hpe=wt([e=>e],({imageDeletion:e,generation:t,canvas:n,nodes:r,controlNet:i})=>{var f;const{imageToDelete:o}=e;if(!o)return;const{image_name:s}=o,a=((f=t.initialImage)==null?void 0:f.imageName)===s,l=n.layerState.objects.some(h=>h.kind==="image"&&h.imageName===s),u=r.nodes.some(h=>my(h.data.inputs,p=>{var m;return p.type==="image"&&((m=p.value)==null?void 0:m.image_name)===s})),c=my(i.controlNets,h=>h.controlImage===s||h.processedControlImage===s);return{isInitialImage:a,isCanvasImage:l,isNodesImage:u,isControlNetImage:c}},Ta),JL=me("imageDeletion/imageDeletionConfirmed"),e$={isLightboxOpen:!1},Wpe=e$,t$=Lt({name:"lightbox",initialState:Wpe,reducers:{setIsLightboxOpen:(e,t)=>{e.isLightboxOpen=t.payload}}}),{setIsLightboxOpen:v8e}=t$.actions,qpe=t$.reducer,O8={weight:.75},Kpe={loras:{}},n$=Lt({name:"lora",initialState:Kpe,reducers:{loraAdded:(e,t)=>{const{name:n,id:r,base_model:i}=t.payload;e.loras[r]={id:r,name:n,base_model:i,...O8}},loraRemoved:(e,t)=>{const n=t.payload;delete e.loras[n]},lorasCleared:e=>{e.loras={}},loraWeightChanged:(e,t)=>{const{id:n,weight:r}=t.payload;e.loras[n].weight=r},loraWeightReset:(e,t)=>{const n=t.payload;e.loras[n].weight=O8.weight}}}),{loraAdded:b8e,loraRemoved:S8e,loraWeightChanged:_8e,loraWeightReset:w8e,lorasCleared:Ype}=n$.actions,Xpe=n$.reducer;function yi(e){if(typeof e=="string"||typeof e=="number")return""+e;let t="";if(Array.isArray(e))for(let n=0,r;n{let t;const n=new Set,r=(l,u)=>{const c=typeof l=="function"?l(t):l;if(!Object.is(c,t)){const d=t;t=u??typeof c!="object"?c:Object.assign({},t,c),n.forEach(f=>f(t,d))}},i=()=>t,a={setState:r,getState:i,subscribe:l=>(n.add(l),()=>n.delete(l)),destroy:()=>{({BASE_URL:"./",MODE:"production",DEV:!1,PROD:!0,SSR:!1}&&"production")!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),n.clear()}};return t=e(r,i,a),a},Qpe=e=>e?R8(e):R8,{useSyncExternalStoreWithSelector:Zpe}=GU;function Jpe(e,t=e.getState,n){const r=Zpe(e.subscribe,e.getState,e.getServerState||e.getState,t,n);return E.useDebugValue(r),r}function Ar(e,t){if(Object.is(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;if(e instanceof Map&&t instanceof Map){if(e.size!==t.size)return!1;for(const[r,i]of e)if(!Object.is(i,t.get(r)))return!1;return!0}if(e instanceof Set&&t instanceof Set){if(e.size!==t.size)return!1;for(const r of e)if(!t.has(r))return!1;return!0}const n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;for(let r=0;r{}};function g1(){for(var e=0,t=arguments.length,n={},r;e=0&&(r=n.slice(i+1),n=n.slice(0,i)),n&&!t.hasOwnProperty(n))throw new Error("unknown type: "+n);return{type:n,name:r}})}xm.prototype=g1.prototype={constructor:xm,on:function(e,t){var n=this._,r=tge(e+"",n),i,o=-1,s=r.length;if(arguments.length<2){for(;++o0)for(var n=new Array(i),r=0,i,o;r=0&&(t=e.slice(0,n))!=="xmlns"&&(e=e.slice(n+1)),N8.hasOwnProperty(t)?{space:N8[t],local:e}:e}function rge(e){return function(){var t=this.ownerDocument,n=this.namespaceURI;return n===Kw&&t.documentElement.namespaceURI===Kw?t.createElement(e):t.createElementNS(n,e)}}function ige(e){return function(){return this.ownerDocument.createElementNS(e.space,e.local)}}function r$(e){var t=m1(e);return(t.local?ige:rge)(t)}function oge(){}function C3(e){return e==null?oge:function(){return this.querySelector(e)}}function sge(e){typeof e!="function"&&(e=C3(e));for(var t=this._groups,n=t.length,r=new Array(n),i=0;i=g&&(g=y+1);!(_=S[g])&&++g=0;)(s=r[i])&&(o&&s.compareDocumentPosition(o)^4&&o.parentNode.insertBefore(s,o),o=s);return this}function Rge(e){e||(e=Ige);function t(d,f){return d&&f?e(d.__data__,f.__data__):!d-!f}for(var n=this._groups,r=n.length,i=new Array(r),o=0;ot?1:e>=t?0:NaN}function Nge(){var e=arguments[0];return arguments[0]=this,e.apply(null,arguments),this}function Mge(){return Array.from(this)}function Dge(){for(var e=this._groups,t=0,n=e.length;t1?this.each((t==null?Wge:typeof t=="function"?Kge:qge)(e,t,n??"")):Nc(this.node(),e)}function Nc(e,t){return e.style.getPropertyValue(t)||l$(e).getComputedStyle(e,null).getPropertyValue(t)}function Xge(e){return function(){delete this[e]}}function Qge(e,t){return function(){this[e]=t}}function Zge(e,t){return function(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}}function Jge(e,t){return arguments.length>1?this.each((t==null?Xge:typeof t=="function"?Zge:Qge)(e,t)):this.node()[e]}function u$(e){return e.trim().split(/^|\s+/)}function T3(e){return e.classList||new c$(e)}function c$(e){this._node=e,this._names=u$(e.getAttribute("class")||"")}c$.prototype={add:function(e){var t=this._names.indexOf(e);t<0&&(this._names.push(e),this._node.setAttribute("class",this._names.join(" ")))},remove:function(e){var t=this._names.indexOf(e);t>=0&&(this._names.splice(t,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(e){return this._names.indexOf(e)>=0}};function d$(e,t){for(var n=T3(e),r=-1,i=t.length;++r=0&&(n=t.slice(r+1),t=t.slice(0,r)),{type:t,name:n}})}function Pme(e){return function(){var t=this.__on;if(t){for(var n=0,r=-1,i=t.length,o;n()=>e;function Yw(e,{sourceEvent:t,subject:n,target:r,identifier:i,active:o,x:s,y:a,dx:l,dy:u,dispatch:c}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},subject:{value:n,enumerable:!0,configurable:!0},target:{value:r,enumerable:!0,configurable:!0},identifier:{value:i,enumerable:!0,configurable:!0},active:{value:o,enumerable:!0,configurable:!0},x:{value:s,enumerable:!0,configurable:!0},y:{value:a,enumerable:!0,configurable:!0},dx:{value:l,enumerable:!0,configurable:!0},dy:{value:u,enumerable:!0,configurable:!0},_:{value:c}})}Yw.prototype.on=function(){var e=this._.on.apply(this._,arguments);return e===this._?this:e};function $me(e){return!e.ctrlKey&&!e.button}function Fme(){return this.parentNode}function Bme(e,t){return t??{x:e.x,y:e.y}}function jme(){return navigator.maxTouchPoints||"ontouchstart"in this}function Vme(){var e=$me,t=Fme,n=Bme,r=jme,i={},o=g1("start","drag","end"),s=0,a,l,u,c,d=0;function f(b){b.on("mousedown.drag",h).filter(r).on("touchstart.drag",S).on("touchmove.drag",v,Lme).on("touchend.drag touchcancel.drag",y).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function h(b,_){if(!(c||!e.call(this,b,_))){var w=g(this,t.call(this,b,_),b,_,"mouse");w&&(Ti(b.view).on("mousemove.drag",p,Ph).on("mouseup.drag",m,Ph),g$(b.view),l2(b),u=!1,a=b.clientX,l=b.clientY,w("start",b))}}function p(b){if(nc(b),!u){var _=b.clientX-a,w=b.clientY-l;u=_*_+w*w>d}i.mouse("drag",b)}function m(b){Ti(b.view).on("mousemove.drag mouseup.drag",null),m$(b.view,u),nc(b),i.mouse("end",b)}function S(b,_){if(e.call(this,b,_)){var w=b.changedTouches,x=t.call(this,b,_),C=w.length,k,P;for(k=0;k>8&15|t>>4&240,t>>4&15|t&240,(t&15)<<4|t&15,1):n===8?Eg(t>>24&255,t>>16&255,t>>8&255,(t&255)/255):n===4?Eg(t>>12&15|t>>8&240,t>>8&15|t>>4&240,t>>4&15|t&240,((t&15)<<4|t&15)/255):null):(t=Ume.exec(e))?new Sr(t[1],t[2],t[3],1):(t=Gme.exec(e))?new Sr(t[1]*255/100,t[2]*255/100,t[3]*255/100,1):(t=Hme.exec(e))?Eg(t[1],t[2],t[3],t[4]):(t=Wme.exec(e))?Eg(t[1]*255/100,t[2]*255/100,t[3]*255/100,t[4]):(t=qme.exec(e))?j8(t[1],t[2]/100,t[3]/100,1):(t=Kme.exec(e))?j8(t[1],t[2]/100,t[3]/100,t[4]):M8.hasOwnProperty(e)?$8(M8[e]):e==="transparent"?new Sr(NaN,NaN,NaN,0):null}function $8(e){return new Sr(e>>16&255,e>>8&255,e&255,1)}function Eg(e,t,n,r){return r<=0&&(e=t=n=NaN),new Sr(e,t,n,r)}function Qme(e){return e instanceof kp||(e=Oh(e)),e?(e=e.rgb(),new Sr(e.r,e.g,e.b,e.opacity)):new Sr}function Xw(e,t,n,r){return arguments.length===1?Qme(e):new Sr(e,t,n,r??1)}function Sr(e,t,n,r){this.r=+e,this.g=+t,this.b=+n,this.opacity=+r}E3(Sr,Xw,y$(kp,{brighter(e){return e=e==null?Zy:Math.pow(Zy,e),new Sr(this.r*e,this.g*e,this.b*e,this.opacity)},darker(e){return e=e==null?kh:Math.pow(kh,e),new Sr(this.r*e,this.g*e,this.b*e,this.opacity)},rgb(){return this},clamp(){return new Sr(cl(this.r),cl(this.g),cl(this.b),Jy(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:F8,formatHex:F8,formatHex8:Zme,formatRgb:B8,toString:B8}));function F8(){return`#${el(this.r)}${el(this.g)}${el(this.b)}`}function Zme(){return`#${el(this.r)}${el(this.g)}${el(this.b)}${el((isNaN(this.opacity)?1:this.opacity)*255)}`}function B8(){const e=Jy(this.opacity);return`${e===1?"rgb(":"rgba("}${cl(this.r)}, ${cl(this.g)}, ${cl(this.b)}${e===1?")":`, ${e})`}`}function Jy(e){return isNaN(e)?1:Math.max(0,Math.min(1,e))}function cl(e){return Math.max(0,Math.min(255,Math.round(e)||0))}function el(e){return e=cl(e),(e<16?"0":"")+e.toString(16)}function j8(e,t,n,r){return r<=0?e=t=n=NaN:n<=0||n>=1?e=t=NaN:t<=0&&(e=NaN),new Ei(e,t,n,r)}function v$(e){if(e instanceof Ei)return new Ei(e.h,e.s,e.l,e.opacity);if(e instanceof kp||(e=Oh(e)),!e)return new Ei;if(e instanceof Ei)return e;e=e.rgb();var t=e.r/255,n=e.g/255,r=e.b/255,i=Math.min(t,n,r),o=Math.max(t,n,r),s=NaN,a=o-i,l=(o+i)/2;return a?(t===o?s=(n-r)/a+(n0&&l<1?0:s,new Ei(s,a,l,e.opacity)}function Jme(e,t,n,r){return arguments.length===1?v$(e):new Ei(e,t,n,r??1)}function Ei(e,t,n,r){this.h=+e,this.s=+t,this.l=+n,this.opacity=+r}E3(Ei,Jme,y$(kp,{brighter(e){return e=e==null?Zy:Math.pow(Zy,e),new Ei(this.h,this.s,this.l*e,this.opacity)},darker(e){return e=e==null?kh:Math.pow(kh,e),new Ei(this.h,this.s,this.l*e,this.opacity)},rgb(){var e=this.h%360+(this.h<0)*360,t=isNaN(e)||isNaN(this.s)?0:this.s,n=this.l,r=n+(n<.5?n:1-n)*t,i=2*n-r;return new Sr(u2(e>=240?e-240:e+120,i,r),u2(e,i,r),u2(e<120?e+240:e-120,i,r),this.opacity)},clamp(){return new Ei(V8(this.h),Pg(this.s),Pg(this.l),Jy(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const e=Jy(this.opacity);return`${e===1?"hsl(":"hsla("}${V8(this.h)}, ${Pg(this.s)*100}%, ${Pg(this.l)*100}%${e===1?")":`, ${e})`}`}}));function V8(e){return e=(e||0)%360,e<0?e+360:e}function Pg(e){return Math.max(0,Math.min(1,e||0))}function u2(e,t,n){return(e<60?t+(n-t)*e/60:e<180?n:e<240?t+(n-t)*(240-e)/60:t)*255}const b$=e=>()=>e;function eye(e,t){return function(n){return e+n*t}}function tye(e,t,n){return e=Math.pow(e,n),t=Math.pow(t,n)-e,n=1/n,function(r){return Math.pow(e+r*t,n)}}function nye(e){return(e=+e)==1?S$:function(t,n){return n-t?tye(t,n,e):b$(isNaN(t)?n:t)}}function S$(e,t){var n=t-e;return n?eye(e,n):b$(isNaN(e)?t:e)}const z8=function e(t){var n=nye(t);function r(i,o){var s=n((i=Xw(i)).r,(o=Xw(o)).r),a=n(i.g,o.g),l=n(i.b,o.b),u=S$(i.opacity,o.opacity);return function(c){return i.r=s(c),i.g=a(c),i.b=l(c),i.opacity=u(c),i+""}}return r.gamma=e,r}(1);function Ds(e,t){return e=+e,t=+t,function(n){return e*(1-n)+t*n}}var Qw=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,c2=new RegExp(Qw.source,"g");function rye(e){return function(){return e}}function iye(e){return function(t){return e(t)+""}}function oye(e,t){var n=Qw.lastIndex=c2.lastIndex=0,r,i,o,s=-1,a=[],l=[];for(e=e+"",t=t+"";(r=Qw.exec(e))&&(i=c2.exec(t));)(o=i.index)>n&&(o=t.slice(n,o),a[s]?a[s]+=o:a[++s]=o),(r=r[0])===(i=i[0])?a[s]?a[s]+=i:a[++s]=i:(a[++s]=null,l.push({i:s,x:Ds(r,i)})),n=c2.lastIndex;return n180?c+=360:c-u>180&&(u+=360),f.push({i:d.push(i(d)+"rotate(",null,r)-2,x:Ds(u,c)})):c&&d.push(i(d)+"rotate("+c+r)}function a(u,c,d,f){u!==c?f.push({i:d.push(i(d)+"skewX(",null,r)-2,x:Ds(u,c)}):c&&d.push(i(d)+"skewX("+c+r)}function l(u,c,d,f,h,p){if(u!==d||c!==f){var m=h.push(i(h)+"scale(",null,",",null,")");p.push({i:m-4,x:Ds(u,d)},{i:m-2,x:Ds(c,f)})}else(d!==1||f!==1)&&h.push(i(h)+"scale("+d+","+f+")")}return function(u,c){var d=[],f=[];return u=e(u),c=e(c),o(u.translateX,u.translateY,c.translateX,c.translateY,d,f),s(u.rotate,c.rotate,d,f),a(u.skewX,c.skewX,d,f),l(u.scaleX,u.scaleY,c.scaleX,c.scaleY,d,f),u=c=null,function(h){for(var p=-1,m=f.length,S;++p=0&&e._call.call(void 0,t),e=e._next;--Mc}function H8(){Tl=(t0=Rh.now())+y1,Mc=Qd=0;try{gye()}finally{Mc=0,yye(),Tl=0}}function mye(){var e=Rh.now(),t=e-t0;t>x$&&(y1-=t,t0=e)}function yye(){for(var e,t=e0,n,r=1/0;t;)t._call?(r>t._time&&(r=t._time),e=t,t=t._next):(n=t._next,t._next=null,t=e?e._next=n:e0=n);Zd=e,Jw(r)}function Jw(e){if(!Mc){Qd&&(Qd=clearTimeout(Qd));var t=e-Tl;t>24?(e<1/0&&(Qd=setTimeout(H8,e-Rh.now()-y1)),kd&&(kd=clearInterval(kd))):(kd||(t0=Rh.now(),kd=setInterval(mye,x$)),Mc=1,C$(H8))}}function W8(e,t,n){var r=new n0;return t=t==null?0:+t,r.restart(i=>{r.stop(),e(i+t)},t,n),r}var vye=g1("start","end","cancel","interrupt"),bye=[],E$=0,q8=1,ex=2,Cm=3,K8=4,tx=5,Tm=6;function v1(e,t,n,r,i,o){var s=e.__transition;if(!s)e.__transition={};else if(n in s)return;Sye(e,n,{name:t,index:r,group:i,on:vye,tween:bye,time:o.time,delay:o.delay,duration:o.duration,ease:o.ease,timer:null,state:E$})}function k3(e,t){var n=Bi(e,t);if(n.state>E$)throw new Error("too late; already scheduled");return n}function To(e,t){var n=Bi(e,t);if(n.state>Cm)throw new Error("too late; already running");return n}function Bi(e,t){var n=e.__transition;if(!n||!(n=n[t]))throw new Error("transition not found");return n}function Sye(e,t,n){var r=e.__transition,i;r[t]=n,n.timer=T$(o,0,n.time);function o(u){n.state=q8,n.timer.restart(s,n.delay,n.time),n.delay<=u&&s(u-n.delay)}function s(u){var c,d,f,h;if(n.state!==q8)return l();for(c in r)if(h=r[c],h.name===n.name){if(h.state===Cm)return W8(s);h.state===K8?(h.state=Tm,h.timer.stop(),h.on.call("interrupt",e,e.__data__,h.index,h.group),delete r[c]):+cex&&r.state=0&&(t=t.slice(0,n)),!t||t==="start"})}function Xye(e,t,n){var r,i,o=Yye(t)?k3:To;return function(){var s=o(this,e),a=s.on;a!==r&&(i=(r=a).copy()).on(t,n),s.on=i}}function Qye(e,t){var n=this._id;return arguments.length<2?Bi(this.node(),n).on.on(e):this.each(Xye(n,e,t))}function Zye(e){return function(){var t=this.parentNode;for(var n in this.__transition)if(+n!==e)return;t&&t.removeChild(this)}}function Jye(){return this.on("end.remove",Zye(this._id))}function e0e(e){var t=this._name,n=this._id;typeof e!="function"&&(e=C3(e));for(var r=this._groups,i=r.length,o=new Array(i),s=0;s()=>e;function T0e(e,{sourceEvent:t,target:n,transform:r,dispatch:i}){Object.defineProperties(this,{type:{value:e,enumerable:!0,configurable:!0},sourceEvent:{value:t,enumerable:!0,configurable:!0},target:{value:n,enumerable:!0,configurable:!0},transform:{value:r,enumerable:!0,configurable:!0},_:{value:i}})}function Xo(e,t,n){this.k=e,this.x=t,this.y=n}Xo.prototype={constructor:Xo,scale:function(e){return e===1?this:new Xo(this.k*e,this.x,this.y)},translate:function(e,t){return e===0&t===0?this:new Xo(this.k,this.x+this.k*e,this.y+this.k*t)},apply:function(e){return[e[0]*this.k+this.x,e[1]*this.k+this.y]},applyX:function(e){return e*this.k+this.x},applyY:function(e){return e*this.k+this.y},invert:function(e){return[(e[0]-this.x)/this.k,(e[1]-this.y)/this.k]},invertX:function(e){return(e-this.x)/this.k},invertY:function(e){return(e-this.y)/this.k},rescaleX:function(e){return e.copy().domain(e.range().map(this.invertX,this).map(e.invert,e))},rescaleY:function(e){return e.copy().domain(e.range().map(this.invertY,this).map(e.invert,e))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var ia=new Xo(1,0,0);Xo.prototype;function d2(e){e.stopImmediatePropagation()}function Ad(e){e.preventDefault(),e.stopImmediatePropagation()}function E0e(e){return(!e.ctrlKey||e.type==="wheel")&&!e.button}function P0e(){var e=this;return e instanceof SVGElement?(e=e.ownerSVGElement||e,e.hasAttribute("viewBox")?(e=e.viewBox.baseVal,[[e.x,e.y],[e.x+e.width,e.y+e.height]]):[[0,0],[e.width.baseVal.value,e.height.baseVal.value]]):[[0,0],[e.clientWidth,e.clientHeight]]}function Y8(){return this.__zoom||ia}function k0e(e){return-e.deltaY*(e.deltaMode===1?.05:e.deltaMode?1:.002)*(e.ctrlKey?10:1)}function A0e(){return navigator.maxTouchPoints||"ontouchstart"in this}function O0e(e,t,n){var r=e.invertX(t[0][0])-n[0][0],i=e.invertX(t[1][0])-n[1][0],o=e.invertY(t[0][1])-n[0][1],s=e.invertY(t[1][1])-n[1][1];return e.translate(i>r?(r+i)/2:Math.min(0,r)||Math.max(0,i),s>o?(o+s)/2:Math.min(0,o)||Math.max(0,s))}function R0e(){var e=E0e,t=P0e,n=O0e,r=k0e,i=A0e,o=[0,1/0],s=[[-1/0,-1/0],[1/0,1/0]],a=250,l=hye,u=g1("start","zoom","end"),c,d,f,h=500,p=150,m=0,S=10;function v(T){T.property("__zoom",Y8).on("wheel.zoom",C,{passive:!1}).on("mousedown.zoom",k).on("dblclick.zoom",P).filter(i).on("touchstart.zoom",A).on("touchmove.zoom",$).on("touchend.zoom touchcancel.zoom",M).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}v.transform=function(T,O,I,N){var R=T.selection?T.selection():T;R.property("__zoom",Y8),T!==R?_(T,O,I,N):R.interrupt().each(function(){w(this,arguments).event(N).start().zoom(null,typeof O=="function"?O.apply(this,arguments):O).end()})},v.scaleBy=function(T,O,I,N){v.scaleTo(T,function(){var R=this.__zoom.k,D=typeof O=="function"?O.apply(this,arguments):O;return R*D},I,N)},v.scaleTo=function(T,O,I,N){v.transform(T,function(){var R=t.apply(this,arguments),D=this.__zoom,L=I==null?b(R):typeof I=="function"?I.apply(this,arguments):I,V=D.invert(L),z=typeof O=="function"?O.apply(this,arguments):O;return n(g(y(D,z),L,V),R,s)},I,N)},v.translateBy=function(T,O,I,N){v.transform(T,function(){return n(this.__zoom.translate(typeof O=="function"?O.apply(this,arguments):O,typeof I=="function"?I.apply(this,arguments):I),t.apply(this,arguments),s)},null,N)},v.translateTo=function(T,O,I,N,R){v.transform(T,function(){var D=t.apply(this,arguments),L=this.__zoom,V=N==null?b(D):typeof N=="function"?N.apply(this,arguments):N;return n(ia.translate(V[0],V[1]).scale(L.k).translate(typeof O=="function"?-O.apply(this,arguments):-O,typeof I=="function"?-I.apply(this,arguments):-I),D,s)},N,R)};function y(T,O){return O=Math.max(o[0],Math.min(o[1],O)),O===T.k?T:new Xo(O,T.x,T.y)}function g(T,O,I){var N=O[0]-I[0]*T.k,R=O[1]-I[1]*T.k;return N===T.x&&R===T.y?T:new Xo(T.k,N,R)}function b(T){return[(+T[0][0]+ +T[1][0])/2,(+T[0][1]+ +T[1][1])/2]}function _(T,O,I,N){T.on("start.zoom",function(){w(this,arguments).event(N).start()}).on("interrupt.zoom end.zoom",function(){w(this,arguments).event(N).end()}).tween("zoom",function(){var R=this,D=arguments,L=w(R,D).event(N),V=t.apply(R,D),z=I==null?b(V):typeof I=="function"?I.apply(R,D):I,U=Math.max(V[1][0]-V[0][0],V[1][1]-V[0][1]),K=R.__zoom,q=typeof O=="function"?O.apply(R,D):O,X=l(K.invert(z).concat(U/K.k),q.invert(z).concat(U/q.k));return function(F){if(F===1)F=q;else{var W=X(F),Q=U/W[2];F=new Xo(Q,z[0]-W[0]*Q,z[1]-W[1]*Q)}L.zoom(null,F)}})}function w(T,O,I){return!I&&T.__zooming||new x(T,O)}function x(T,O){this.that=T,this.args=O,this.active=0,this.sourceEvent=null,this.extent=t.apply(T,O),this.taps=0}x.prototype={event:function(T){return T&&(this.sourceEvent=T),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(T,O){return this.mouse&&T!=="mouse"&&(this.mouse[1]=O.invert(this.mouse[0])),this.touch0&&T!=="touch"&&(this.touch0[1]=O.invert(this.touch0[0])),this.touch1&&T!=="touch"&&(this.touch1[1]=O.invert(this.touch1[0])),this.that.__zoom=O,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(T){var O=Ti(this.that).datum();u.call(T,this.that,new T0e(T,{sourceEvent:this.sourceEvent,target:v,type:T,transform:this.that.__zoom,dispatch:u}),O)}};function C(T,...O){if(!e.apply(this,arguments))return;var I=w(this,O).event(T),N=this.__zoom,R=Math.max(o[0],Math.min(o[1],N.k*Math.pow(2,r.apply(this,arguments)))),D=qi(T);if(I.wheel)(I.mouse[0][0]!==D[0]||I.mouse[0][1]!==D[1])&&(I.mouse[1]=N.invert(I.mouse[0]=D)),clearTimeout(I.wheel);else{if(N.k===R)return;I.mouse=[D,N.invert(D)],Em(this),I.start()}Ad(T),I.wheel=setTimeout(L,p),I.zoom("mouse",n(g(y(N,R),I.mouse[0],I.mouse[1]),I.extent,s));function L(){I.wheel=null,I.end()}}function k(T,...O){if(f||!e.apply(this,arguments))return;var I=T.currentTarget,N=w(this,O,!0).event(T),R=Ti(T.view).on("mousemove.zoom",z,!0).on("mouseup.zoom",U,!0),D=qi(T,I),L=T.clientX,V=T.clientY;g$(T.view),d2(T),N.mouse=[D,this.__zoom.invert(D)],Em(this),N.start();function z(K){if(Ad(K),!N.moved){var q=K.clientX-L,X=K.clientY-V;N.moved=q*q+X*X>m}N.event(K).zoom("mouse",n(g(N.that.__zoom,N.mouse[0]=qi(K,I),N.mouse[1]),N.extent,s))}function U(K){R.on("mousemove.zoom mouseup.zoom",null),m$(K.view,N.moved),Ad(K),N.event(K).end()}}function P(T,...O){if(e.apply(this,arguments)){var I=this.__zoom,N=qi(T.changedTouches?T.changedTouches[0]:T,this),R=I.invert(N),D=I.k*(T.shiftKey?.5:2),L=n(g(y(I,D),N,R),t.apply(this,O),s);Ad(T),a>0?Ti(this).transition().duration(a).call(_,L,N,T):Ti(this).call(v.transform,L,N,T)}}function A(T,...O){if(e.apply(this,arguments)){var I=T.touches,N=I.length,R=w(this,O,T.changedTouches.length===N).event(T),D,L,V,z;for(d2(T),L=0;L"[React Flow]: Seems like you have not used zustand provider as an ancestor. Help: https://reactflow.dev/error#001",error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:e=>`Node type "${e}" not found. Using fallback type "default".`,error004:()=>"The React Flow parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:e=>`The old edge with id=${e} does not exist.`,error009:e=>`Marker type "${e}" doesn't exist.`,error008:(e,t)=>`Couldn't create edge for ${e?"target":"source"} handle id: "${e?t.targetHandle:t.sourceHandle}", edge id: ${t.id}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:e=>`Edge type "${e}" not found. Using fallback type "default".`},O$=ya.error001();function Yt(e,t){const n=E.useContext(b1);if(n===null)throw new Error(O$);return Jpe(n,e,t)}const Xn=()=>{const e=E.useContext(b1);if(e===null)throw new Error(O$);return E.useMemo(()=>({getState:e.getState,setState:e.setState,subscribe:e.subscribe,destroy:e.destroy}),[e])},N0e=e=>e.userSelectionActive?"none":"all";function M0e({position:e,children:t,className:n,style:r,...i}){const o=Yt(N0e),s=`${e}`.split("-");return j.jsx("div",{className:yi(["react-flow__panel",n,...s]),style:{...r,pointerEvents:o},...i,children:t})}function D0e({proOptions:e,position:t="bottom-right"}){return e!=null&&e.hideAttribution?null:j.jsx(M0e,{position:t,className:"react-flow__attribution","data-message":"Please only hide this attribution when you are subscribed to React Flow Pro: https://pro.reactflow.dev",children:j.jsx("a",{href:"https://reactflow.dev",target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}const L0e=({x:e,y:t,label:n,labelStyle:r={},labelShowBg:i=!0,labelBgStyle:o={},labelBgPadding:s=[2,4],labelBgBorderRadius:a=2,children:l,className:u,...c})=>{const d=E.useRef(null),[f,h]=E.useState({x:0,y:0,width:0,height:0}),p=yi(["react-flow__edge-textwrapper",u]);return E.useEffect(()=>{if(d.current){const m=d.current.getBBox();h({x:m.x,y:m.y,width:m.width,height:m.height})}},[n]),typeof n>"u"||!n?null:j.jsxs("g",{transform:`translate(${e-f.width/2} ${t-f.height/2})`,className:p,visibility:f.width?"visible":"hidden",...c,children:[i&&j.jsx("rect",{width:f.width+2*s[0],x:-s[0],y:-s[1],height:f.height+2*s[1],className:"react-flow__edge-textbg",style:o,rx:a,ry:a}),j.jsx("text",{className:"react-flow__edge-text",y:f.height/2,dy:"0.3em",ref:d,style:r,children:n}),l]})};var $0e=E.memo(L0e);const O3=e=>({width:e.offsetWidth,height:e.offsetHeight}),Dc=(e,t=0,n=1)=>Math.min(Math.max(e,t),n),R3=(e={x:0,y:0},t)=>({x:Dc(e.x,t[0][0],t[1][0]),y:Dc(e.y,t[0][1],t[1][1])}),X8=(e,t,n)=>en?-Dc(Math.abs(e-n),1,50)/50:0,R$=(e,t)=>{const n=X8(e.x,35,t.width-35)*20,r=X8(e.y,35,t.height-35)*20;return[n,r]},I$=e=>{var t;return((t=e.getRootNode)==null?void 0:t.call(e))||(window==null?void 0:window.document)},N$=(e,t)=>({x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),x2:Math.max(e.x2,t.x2),y2:Math.max(e.y2,t.y2)}),r0=({x:e,y:t,width:n,height:r})=>({x:e,y:t,x2:e+n,y2:t+r}),M$=({x:e,y:t,x2:n,y2:r})=>({x:e,y:t,width:n-e,height:r-t}),Q8=e=>({...e.positionAbsolute||{x:0,y:0},width:e.width||0,height:e.height||0}),x8e=(e,t)=>M$(N$(r0(e),r0(t))),nx=(e,t)=>{const n=Math.max(0,Math.min(e.x+e.width,t.x+t.width)-Math.max(e.x,t.x)),r=Math.max(0,Math.min(e.y+e.height,t.y+t.height)-Math.max(e.y,t.y));return Math.ceil(n*r)},F0e=e=>si(e.width)&&si(e.height)&&si(e.x)&&si(e.y),si=e=>!isNaN(e)&&isFinite(e),pn=Symbol.for("internals"),D$=["Enter"," ","Escape"],B0e=(e,t)=>{},j0e=e=>"nativeEvent"in e;function rx(e){var i,o;const t=j0e(e)?e.nativeEvent:e,n=((o=(i=t.composedPath)==null?void 0:i.call(t))==null?void 0:o[0])||e.target;return["INPUT","SELECT","TEXTAREA"].includes(n==null?void 0:n.nodeName)||(n==null?void 0:n.hasAttribute("contenteditable"))||!!(n!=null&&n.closest(".nokey"))}const L$=e=>"clientX"in e,oa=(e,t)=>{var o,s;const n=L$(e),r=n?e.clientX:(o=e.touches)==null?void 0:o[0].clientX,i=n?e.clientY:(s=e.touches)==null?void 0:s[0].clientY;return{x:r-((t==null?void 0:t.left)??0),y:i-((t==null?void 0:t.top)??0)}},Ap=({id:e,path:t,labelX:n,labelY:r,label:i,labelStyle:o,labelShowBg:s,labelBgStyle:a,labelBgPadding:l,labelBgBorderRadius:u,style:c,markerEnd:d,markerStart:f,interactionWidth:h=20})=>j.jsxs(j.Fragment,{children:[j.jsx("path",{id:e,style:c,d:t,fill:"none",className:"react-flow__edge-path",markerEnd:d,markerStart:f}),h&&j.jsx("path",{d:t,fill:"none",strokeOpacity:0,strokeWidth:h,className:"react-flow__edge-interaction"}),i&&si(n)&&si(r)?j.jsx($0e,{x:n,y:r,label:i,labelStyle:o,labelShowBg:s,labelBgStyle:a,labelBgPadding:l,labelBgBorderRadius:u}):null]});Ap.displayName="BaseEdge";function Od(e,t,n){return n===void 0?n:r=>{const i=t().edges.find(o=>o.id===e);i&&n(r,{...i})}}function $$({sourceX:e,sourceY:t,targetX:n,targetY:r}){const i=Math.abs(n-e)/2,o=n{const[S,v,y]=B$({sourceX:e,sourceY:t,sourcePosition:i,targetX:n,targetY:r,targetPosition:o});return j.jsx(Ap,{path:S,labelX:v,labelY:y,label:s,labelStyle:a,labelShowBg:l,labelBgStyle:u,labelBgPadding:c,labelBgBorderRadius:d,style:f,markerEnd:h,markerStart:p,interactionWidth:m})});I3.displayName="SimpleBezierEdge";const J8={[ye.Left]:{x:-1,y:0},[ye.Right]:{x:1,y:0},[ye.Top]:{x:0,y:-1},[ye.Bottom]:{x:0,y:1}},V0e=({source:e,sourcePosition:t=ye.Bottom,target:n})=>t===ye.Left||t===ye.Right?e.xMath.sqrt(Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2));function z0e({source:e,sourcePosition:t=ye.Bottom,target:n,targetPosition:r=ye.Top,center:i,offset:o}){const s=J8[t],a=J8[r],l={x:e.x+s.x*o,y:e.y+s.y*o},u={x:n.x+a.x*o,y:n.y+a.y*o},c=V0e({source:l,sourcePosition:t,target:u}),d=c.x!==0?"x":"y",f=c[d];let h=[],p,m;const[S,v,y,g]=$$({sourceX:e.x,sourceY:e.y,targetX:n.x,targetY:n.y});if(s[d]*a[d]===-1){p=i.x||S,m=i.y||v;const _=[{x:p,y:l.y},{x:p,y:u.y}],w=[{x:l.x,y:m},{x:u.x,y:m}];s[d]===f?h=d==="x"?_:w:h=d==="x"?w:_}else{const _=[{x:l.x,y:u.y}],w=[{x:u.x,y:l.y}];if(d==="x"?h=s.x===f?w:_:h=s.y===f?_:w,t!==r){const x=d==="x"?"y":"x",C=s[d]===a[x],k=l[x]>u[x],P=l[x]{let g="";return y>0&&y{const[v,y,g]=ix({sourceX:e,sourceY:t,sourcePosition:d,targetX:n,targetY:r,targetPosition:f,borderRadius:m==null?void 0:m.borderRadius,offset:m==null?void 0:m.offset});return j.jsx(Ap,{path:v,labelX:y,labelY:g,label:i,labelStyle:o,labelShowBg:s,labelBgStyle:a,labelBgPadding:l,labelBgBorderRadius:u,style:c,markerEnd:h,markerStart:p,interactionWidth:S})});S1.displayName="SmoothStepEdge";const N3=E.memo(e=>{var t;return j.jsx(S1,{...e,pathOptions:E.useMemo(()=>{var n;return{borderRadius:0,offset:(n=e.pathOptions)==null?void 0:n.offset}},[(t=e.pathOptions)==null?void 0:t.offset])})});N3.displayName="StepEdge";function G0e({sourceX:e,sourceY:t,targetX:n,targetY:r}){const[i,o,s,a]=$$({sourceX:e,sourceY:t,targetX:n,targetY:r});return[`M ${e},${t}L ${n},${r}`,i,o,s,a]}const M3=E.memo(({sourceX:e,sourceY:t,targetX:n,targetY:r,label:i,labelStyle:o,labelShowBg:s,labelBgStyle:a,labelBgPadding:l,labelBgBorderRadius:u,style:c,markerEnd:d,markerStart:f,interactionWidth:h})=>{const[p,m,S]=G0e({sourceX:e,sourceY:t,targetX:n,targetY:r});return j.jsx(Ap,{path:p,labelX:m,labelY:S,label:i,labelStyle:o,labelShowBg:s,labelBgStyle:a,labelBgPadding:l,labelBgBorderRadius:u,style:c,markerEnd:d,markerStart:f,interactionWidth:h})});M3.displayName="StraightEdge";function Og(e,t){return e>=0?.5*e:t*25*Math.sqrt(-e)}function t9({pos:e,x1:t,y1:n,x2:r,y2:i,c:o}){switch(e){case ye.Left:return[t-Og(t-r,o),n];case ye.Right:return[t+Og(r-t,o),n];case ye.Top:return[t,n-Og(n-i,o)];case ye.Bottom:return[t,n+Og(i-n,o)]}}function j$({sourceX:e,sourceY:t,sourcePosition:n=ye.Bottom,targetX:r,targetY:i,targetPosition:o=ye.Top,curvature:s=.25}){const[a,l]=t9({pos:n,x1:e,y1:t,x2:r,y2:i,c:s}),[u,c]=t9({pos:o,x1:r,y1:i,x2:e,y2:t,c:s}),[d,f,h,p]=F$({sourceX:e,sourceY:t,targetX:r,targetY:i,sourceControlX:a,sourceControlY:l,targetControlX:u,targetControlY:c});return[`M${e},${t} C${a},${l} ${u},${c} ${r},${i}`,d,f,h,p]}const o0=E.memo(({sourceX:e,sourceY:t,targetX:n,targetY:r,sourcePosition:i=ye.Bottom,targetPosition:o=ye.Top,label:s,labelStyle:a,labelShowBg:l,labelBgStyle:u,labelBgPadding:c,labelBgBorderRadius:d,style:f,markerEnd:h,markerStart:p,pathOptions:m,interactionWidth:S})=>{const[v,y,g]=j$({sourceX:e,sourceY:t,sourcePosition:i,targetX:n,targetY:r,targetPosition:o,curvature:m==null?void 0:m.curvature});return j.jsx(Ap,{path:v,labelX:y,labelY:g,label:s,labelStyle:a,labelShowBg:l,labelBgStyle:u,labelBgPadding:c,labelBgBorderRadius:d,style:f,markerEnd:h,markerStart:p,interactionWidth:S})});o0.displayName="BezierEdge";const D3=E.createContext(null),H0e=D3.Provider;D3.Consumer;const W0e=()=>E.useContext(D3),q0e=e=>"id"in e&&"source"in e&&"target"in e,K0e=({source:e,sourceHandle:t,target:n,targetHandle:r})=>`reactflow__edge-${e}${t||""}-${n}${r||""}`,ox=(e,t)=>typeof e>"u"?"":typeof e=="string"?e:`${t?`${t}__`:""}${Object.keys(e).sort().map(r=>`${r}=${e[r]}`).join("&")}`,Y0e=(e,t)=>t.some(n=>n.source===e.source&&n.target===e.target&&(n.sourceHandle===e.sourceHandle||!n.sourceHandle&&!e.sourceHandle)&&(n.targetHandle===e.targetHandle||!n.targetHandle&&!e.targetHandle)),V$=(e,t)=>{if(!e.source||!e.target)return t;let n;return q0e(e)?n={...e}:n={...e,id:K0e(e)},Y0e(n,t)?t:t.concat(n)},z$=({x:e,y:t},[n,r,i],o,[s,a])=>{const l={x:(e-n)/i,y:(t-r)/i};return o?{x:s*Math.round(l.x/s),y:a*Math.round(l.y/a)}:l},X0e=({x:e,y:t},[n,r,i])=>({x:e*i+n,y:t*i+r}),oc=(e,t=[0,0])=>{if(!e)return{x:0,y:0,positionAbsolute:{x:0,y:0}};const n=(e.width??0)*t[0],r=(e.height??0)*t[1],i={x:e.position.x-n,y:e.position.y-r};return{...i,positionAbsolute:e.positionAbsolute?{x:e.positionAbsolute.x-n,y:e.positionAbsolute.y-r}:i}},U$=(e,t=[0,0])=>{if(e.length===0)return{x:0,y:0,width:0,height:0};const n=e.reduce((r,i)=>{const{x:o,y:s}=oc(i,t).positionAbsolute;return N$(r,r0({x:o,y:s,width:i.width||0,height:i.height||0}))},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return M$(n)},G$=(e,t,[n,r,i]=[0,0,1],o=!1,s=!1,a=[0,0])=>{const l={x:(t.x-n)/i,y:(t.y-r)/i,width:t.width/i,height:t.height/i},u=[];return e.forEach(c=>{const{width:d,height:f,selectable:h=!0,hidden:p=!1}=c;if(s&&!h||p)return!1;const{positionAbsolute:m}=oc(c,a),S={x:m.x,y:m.y,width:d||0,height:f||0},v=nx(l,S),y=typeof d>"u"||typeof f>"u"||d===null||f===null,g=o&&v>0,b=(d||0)*(f||0);(y||g||v>=b||c.dragging)&&u.push(c)}),u},H$=(e,t)=>{const n=e.map(r=>r.id);return t.filter(r=>n.includes(r.source)||n.includes(r.target))},W$=(e,t,n,r,i,o=.1)=>{const s=t/(e.width*(1+o)),a=n/(e.height*(1+o)),l=Math.min(s,a),u=Dc(l,r,i),c=e.x+e.width/2,d=e.y+e.height/2,f=t/2-c*u,h=n/2-d*u;return[f,h,u]},Ha=(e,t=0)=>e.transition().duration(t);function n9(e,t,n,r){return(t[n]||[]).reduce((i,o)=>{var s,a;return`${e.id}-${o.id}-${n}`!==r&&i.push({id:o.id||null,type:n,nodeId:e.id,x:(((s=e.positionAbsolute)==null?void 0:s.x)??0)+o.x+o.width/2,y:(((a=e.positionAbsolute)==null?void 0:a.y)??0)+o.y+o.height/2}),i},[])}function Q0e(e,t,n,r,i,o){const{x:s,y:a}=oa(e),u=t.elementsFromPoint(s,a).find(p=>p.classList.contains("react-flow__handle"));if(u){const p=u.getAttribute("data-nodeid");if(p){const m=L3(void 0,u),S=u.getAttribute("data-handleid"),v=o({nodeId:p,id:S,type:m});if(v)return{handle:{id:S,type:m,nodeId:p,x:n.x,y:n.y},validHandleResult:v}}}let c=[],d=1/0;if(i.forEach(p=>{const m=Math.sqrt((p.x-n.x)**2+(p.y-n.y)**2);if(m<=r){const S=o(p);m<=d&&(mp.isValid),h=c.some(({handle:p})=>p.type==="target");return c.find(({handle:p,validHandleResult:m})=>h?p.type==="target":f?m.isValid:!0)||c[0]}const Z0e={source:null,target:null,sourceHandle:null,targetHandle:null},q$=()=>({handleDomNode:null,isValid:!1,connection:Z0e,endHandle:null});function K$(e,t,n,r,i,o,s){const a=i==="target",l=s.querySelector(`.react-flow__handle[data-id="${e==null?void 0:e.nodeId}-${e==null?void 0:e.id}-${e==null?void 0:e.type}"]`),u={...q$(),handleDomNode:l};if(l){const c=L3(void 0,l),d=l.getAttribute("data-nodeid"),f=l.getAttribute("data-handleid"),h=l.classList.contains("connectable"),p=l.classList.contains("connectableend"),m={source:a?d:n,sourceHandle:a?f:r,target:a?n:d,targetHandle:a?r:f};u.connection=m,h&&p&&(t===El.Strict?a&&c==="source"||!a&&c==="target":d!==n||f!==r)&&(u.endHandle={nodeId:d,handleId:f,type:c},u.isValid=o(m))}return u}function J0e({nodes:e,nodeId:t,handleId:n,handleType:r}){return e.reduce((i,o)=>{if(o[pn]){const{handleBounds:s}=o[pn];let a=[],l=[];s&&(a=n9(o,s,"source",`${t}-${n}-${r}`),l=n9(o,s,"target",`${t}-${n}-${r}`)),i.push(...a,...l)}return i},[])}function L3(e,t){return e||(t!=null&&t.classList.contains("target")?"target":t!=null&&t.classList.contains("source")?"source":null)}function f2(e){e==null||e.classList.remove("valid","connecting","react-flow__handle-valid","react-flow__handle-connecting")}function eve(e,t){let n=null;return t?n="valid":e&&!t&&(n="invalid"),n}function Y$({event:e,handleId:t,nodeId:n,onConnect:r,isTarget:i,getState:o,setState:s,isValidConnection:a,edgeUpdaterType:l,onEdgeUpdateEnd:u}){const c=I$(e.target),{connectionMode:d,domNode:f,autoPanOnConnect:h,connectionRadius:p,onConnectStart:m,panBy:S,getNodes:v,cancelConnection:y}=o();let g=0,b;const{x:_,y:w}=oa(e),x=c==null?void 0:c.elementFromPoint(_,w),C=L3(l,x),k=f==null?void 0:f.getBoundingClientRect();if(!k||!C)return;let P,A=oa(e,k),$=!1,M=null,T=!1,O=null;const I=J0e({nodes:v(),nodeId:n,handleId:t,handleType:C}),N=()=>{if(!h)return;const[L,V]=R$(A,k);S({x:L,y:V}),g=requestAnimationFrame(N)};s({connectionPosition:A,connectionStatus:null,connectionNodeId:n,connectionHandleId:t,connectionHandleType:C,connectionStartHandle:{nodeId:n,handleId:t,type:C},connectionEndHandle:null}),m==null||m(e,{nodeId:n,handleId:t,handleType:C});function R(L){const{transform:V}=o();A=oa(L,k);const{handle:z,validHandleResult:U}=Q0e(L,c,z$(A,V,!1,[1,1]),p,I,K=>K$(K,d,n,t,i?"target":"source",a,c));if(b=z,$||(N(),$=!0),O=U.handleDomNode,M=U.connection,T=U.isValid,s({connectionPosition:b&&T?X0e({x:b.x,y:b.y},V):A,connectionStatus:eve(!!b,T),connectionEndHandle:U.endHandle}),!b&&!T&&!O)return f2(P);M.source!==M.target&&O&&(f2(P),P=O,O.classList.add("connecting","react-flow__handle-connecting"),O.classList.toggle("valid",T),O.classList.toggle("react-flow__handle-valid",T))}function D(L){var V,z;(b||O)&&M&&T&&(r==null||r(M)),(z=(V=o()).onConnectEnd)==null||z.call(V,L),l&&(u==null||u(L)),f2(P),y(),cancelAnimationFrame(g),$=!1,T=!1,M=null,O=null,c.removeEventListener("mousemove",R),c.removeEventListener("mouseup",D),c.removeEventListener("touchmove",R),c.removeEventListener("touchend",D)}c.addEventListener("mousemove",R),c.addEventListener("mouseup",D),c.addEventListener("touchmove",R),c.addEventListener("touchend",D)}const r9=()=>!0,tve=e=>({connectionStartHandle:e.connectionStartHandle,connectOnClick:e.connectOnClick,noPanClassName:e.noPanClassName}),nve=(e,t,n)=>r=>{const{connectionStartHandle:i,connectionEndHandle:o,connectionClickStartHandle:s}=r;return{connecting:(i==null?void 0:i.nodeId)===e&&(i==null?void 0:i.handleId)===t&&(i==null?void 0:i.type)===n||(o==null?void 0:o.nodeId)===e&&(o==null?void 0:o.handleId)===t&&(o==null?void 0:o.type)===n,clickConnecting:(s==null?void 0:s.nodeId)===e&&(s==null?void 0:s.handleId)===t&&(s==null?void 0:s.type)===n}},X$=E.forwardRef(({type:e="source",position:t=ye.Top,isValidConnection:n,isConnectable:r=!0,isConnectableStart:i=!0,isConnectableEnd:o=!0,id:s,onConnect:a,children:l,className:u,onMouseDown:c,onTouchStart:d,...f},h)=>{var k,P;const p=s||null,m=e==="target",S=Xn(),v=W0e(),{connectOnClick:y,noPanClassName:g}=Yt(tve,Ar),{connecting:b,clickConnecting:_}=Yt(nve(v,p,e),Ar);v||(P=(k=S.getState()).onError)==null||P.call(k,"010",ya.error010());const w=A=>{const{defaultEdgeOptions:$,onConnect:M,hasDefaultEdges:T}=S.getState(),O={...$,...A};if(T){const{edges:I,setEdges:N}=S.getState();N(V$(O,I))}M==null||M(O),a==null||a(O)},x=A=>{if(!v)return;const $=L$(A);i&&($&&A.button===0||!$)&&Y$({event:A,handleId:p,nodeId:v,onConnect:w,isTarget:m,getState:S.getState,setState:S.setState,isValidConnection:n||S.getState().isValidConnection||r9}),$?c==null||c(A):d==null||d(A)},C=A=>{const{onClickConnectStart:$,onClickConnectEnd:M,connectionClickStartHandle:T,connectionMode:O,isValidConnection:I}=S.getState();if(!v||!T&&!i)return;if(!T){$==null||$(A,{nodeId:v,handleId:p,handleType:e}),S.setState({connectionClickStartHandle:{nodeId:v,type:e,handleId:p}});return}const N=I$(A.target),R=n||I||r9,{connection:D,isValid:L}=K$({nodeId:v,id:p,type:e},O,T.nodeId,T.handleId||null,T.type,R,N);L&&w(D),M==null||M(A),S.setState({connectionClickStartHandle:null})};return j.jsx("div",{"data-handleid":p,"data-nodeid":v,"data-handlepos":t,"data-id":`${v}-${p}-${e}`,className:yi(["react-flow__handle",`react-flow__handle-${t}`,"nodrag",g,u,{source:!m,target:m,connectable:r,connectablestart:i,connectableend:o,connecting:_,connectionindicator:r&&(i&&!b||o&&b)}]),onMouseDown:x,onTouchStart:x,onClick:y?C:void 0,ref:h,...f,children:l})});X$.displayName="Handle";var s0=E.memo(X$);const Q$=({data:e,isConnectable:t,targetPosition:n=ye.Top,sourcePosition:r=ye.Bottom})=>j.jsxs(j.Fragment,{children:[j.jsx(s0,{type:"target",position:n,isConnectable:t}),e==null?void 0:e.label,j.jsx(s0,{type:"source",position:r,isConnectable:t})]});Q$.displayName="DefaultNode";var sx=E.memo(Q$);const Z$=({data:e,isConnectable:t,sourcePosition:n=ye.Bottom})=>j.jsxs(j.Fragment,{children:[e==null?void 0:e.label,j.jsx(s0,{type:"source",position:n,isConnectable:t})]});Z$.displayName="InputNode";var J$=E.memo(Z$);const eF=({data:e,isConnectable:t,targetPosition:n=ye.Top})=>j.jsxs(j.Fragment,{children:[j.jsx(s0,{type:"target",position:n,isConnectable:t}),e==null?void 0:e.label]});eF.displayName="OutputNode";var tF=E.memo(eF);const $3=()=>null;$3.displayName="GroupNode";const rve=e=>({selectedNodes:e.getNodes().filter(t=>t.selected),selectedEdges:e.edges.filter(t=>t.selected)}),Rg=e=>e.id;function ive(e,t){return Ar(e.selectedNodes.map(Rg),t.selectedNodes.map(Rg))&&Ar(e.selectedEdges.map(Rg),t.selectedEdges.map(Rg))}const nF=E.memo(({onSelectionChange:e})=>{const t=Xn(),{selectedNodes:n,selectedEdges:r}=Yt(rve,ive);return E.useEffect(()=>{var o,s;const i={nodes:n,edges:r};e==null||e(i),(s=(o=t.getState()).onSelectionChange)==null||s.call(o,i)},[n,r,e]),null});nF.displayName="SelectionListener";const ove=e=>!!e.onSelectionChange;function sve({onSelectionChange:e}){const t=Yt(ove);return e||t?j.jsx(nF,{onSelectionChange:e}):null}const ave=e=>({setNodes:e.setNodes,setEdges:e.setEdges,setDefaultNodesAndEdges:e.setDefaultNodesAndEdges,setMinZoom:e.setMinZoom,setMaxZoom:e.setMaxZoom,setTranslateExtent:e.setTranslateExtent,setNodeExtent:e.setNodeExtent,reset:e.reset});function iu(e,t){E.useEffect(()=>{typeof e<"u"&&t(e)},[e])}function Le(e,t,n){E.useEffect(()=>{typeof t<"u"&&n({[e]:t})},[t])}const lve=({nodes:e,edges:t,defaultNodes:n,defaultEdges:r,onConnect:i,onConnectStart:o,onConnectEnd:s,onClickConnectStart:a,onClickConnectEnd:l,nodesDraggable:u,nodesConnectable:c,nodesFocusable:d,edgesFocusable:f,edgesUpdatable:h,elevateNodesOnSelect:p,minZoom:m,maxZoom:S,nodeExtent:v,onNodesChange:y,onEdgesChange:g,elementsSelectable:b,connectionMode:_,snapGrid:w,snapToGrid:x,translateExtent:C,connectOnClick:k,defaultEdgeOptions:P,fitView:A,fitViewOptions:$,onNodesDelete:M,onEdgesDelete:T,onNodeDrag:O,onNodeDragStart:I,onNodeDragStop:N,onSelectionDrag:R,onSelectionDragStart:D,onSelectionDragStop:L,noPanClassName:V,nodeOrigin:z,rfId:U,autoPanOnConnect:K,autoPanOnNodeDrag:q,onError:X,connectionRadius:F,isValidConnection:W})=>{const{setNodes:Q,setEdges:J,setDefaultNodesAndEdges:ne,setMinZoom:Z,setMaxZoom:ge,setTranslateExtent:ae,setNodeExtent:oe,reset:Ce}=Yt(ave,Ar),se=Xn();return E.useEffect(()=>{const We=r==null?void 0:r.map(mt=>({...mt,...P}));return ne(n,We),()=>{Ce()}},[]),Le("defaultEdgeOptions",P,se.setState),Le("connectionMode",_,se.setState),Le("onConnect",i,se.setState),Le("onConnectStart",o,se.setState),Le("onConnectEnd",s,se.setState),Le("onClickConnectStart",a,se.setState),Le("onClickConnectEnd",l,se.setState),Le("nodesDraggable",u,se.setState),Le("nodesConnectable",c,se.setState),Le("nodesFocusable",d,se.setState),Le("edgesFocusable",f,se.setState),Le("edgesUpdatable",h,se.setState),Le("elementsSelectable",b,se.setState),Le("elevateNodesOnSelect",p,se.setState),Le("snapToGrid",x,se.setState),Le("snapGrid",w,se.setState),Le("onNodesChange",y,se.setState),Le("onEdgesChange",g,se.setState),Le("connectOnClick",k,se.setState),Le("fitViewOnInit",A,se.setState),Le("fitViewOnInitOptions",$,se.setState),Le("onNodesDelete",M,se.setState),Le("onEdgesDelete",T,se.setState),Le("onNodeDrag",O,se.setState),Le("onNodeDragStart",I,se.setState),Le("onNodeDragStop",N,se.setState),Le("onSelectionDrag",R,se.setState),Le("onSelectionDragStart",D,se.setState),Le("onSelectionDragStop",L,se.setState),Le("noPanClassName",V,se.setState),Le("nodeOrigin",z,se.setState),Le("rfId",U,se.setState),Le("autoPanOnConnect",K,se.setState),Le("autoPanOnNodeDrag",q,se.setState),Le("onError",X,se.setState),Le("connectionRadius",F,se.setState),Le("isValidConnection",W,se.setState),iu(e,Q),iu(t,J),iu(m,Z),iu(S,ge),iu(C,ae),iu(v,oe),null},i9={display:"none"},uve={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},rF="react-flow__node-desc",iF="react-flow__edge-desc",cve="react-flow__aria-live",dve=e=>e.ariaLiveMessage;function fve({rfId:e}){const t=Yt(dve);return j.jsx("div",{id:`${cve}-${e}`,"aria-live":"assertive","aria-atomic":"true",style:uve,children:t})}function hve({rfId:e,disableKeyboardA11y:t}){return j.jsxs(j.Fragment,{children:[j.jsxs("div",{id:`${rF}-${e}`,style:i9,children:["Press enter or space to select a node.",!t&&"You can then use the arrow keys to move the node around."," Press delete to remove it and escape to cancel."," "]}),j.jsx("div",{id:`${iF}-${e}`,style:i9,children:"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel."}),!t&&j.jsx(fve,{rfId:e})]})}const pve=(e,t,n)=>n===ye.Left?e-t:n===ye.Right?e+t:e,gve=(e,t,n)=>n===ye.Top?e-t:n===ye.Bottom?e+t:e,o9="react-flow__edgeupdater",s9=({position:e,centerX:t,centerY:n,radius:r=10,onMouseDown:i,onMouseEnter:o,onMouseOut:s,type:a})=>j.jsx("circle",{onMouseDown:i,onMouseEnter:o,onMouseOut:s,className:yi([o9,`${o9}-${a}`]),cx:pve(t,r,e),cy:gve(n,r,e),r,stroke:"transparent",fill:"transparent"}),mve=()=>!0;var ou=e=>{const t=({id:n,className:r,type:i,data:o,onClick:s,onEdgeDoubleClick:a,selected:l,animated:u,label:c,labelStyle:d,labelShowBg:f,labelBgStyle:h,labelBgPadding:p,labelBgBorderRadius:m,style:S,source:v,target:y,sourceX:g,sourceY:b,targetX:_,targetY:w,sourcePosition:x,targetPosition:C,elementsSelectable:k,hidden:P,sourceHandleId:A,targetHandleId:$,onContextMenu:M,onMouseEnter:T,onMouseMove:O,onMouseLeave:I,edgeUpdaterRadius:N,onEdgeUpdate:R,onEdgeUpdateStart:D,onEdgeUpdateEnd:L,markerEnd:V,markerStart:z,rfId:U,ariaLabel:K,isFocusable:q,isUpdatable:X,pathOptions:F,interactionWidth:W})=>{const Q=E.useRef(null),[J,ne]=E.useState(!1),[Z,ge]=E.useState(!1),ae=Xn(),oe=E.useMemo(()=>`url(#${ox(z,U)})`,[z,U]),Ce=E.useMemo(()=>`url(#${ox(V,U)})`,[V,U]);if(P)return null;const se=Te=>{const{edges:Ne,addSelectedEdges:ie}=ae.getState();if(k&&(ae.setState({nodesSelectionActive:!1}),ie([n])),s){const he=Ne.find(Zt=>Zt.id===n);s(Te,he)}},We=Od(n,ae.getState,a),mt=Od(n,ae.getState,M),$e=Od(n,ae.getState,T),Fe=Od(n,ae.getState,O),Ie=Od(n,ae.getState,I),nt=(Te,Ne)=>{if(Te.button!==0)return;const{edges:ie,isValidConnection:he}=ae.getState(),Zt=Ne?y:v,Rt=(Ne?$:A)||null,lt=Ne?"target":"source",Zn=he||mve,ko=Ne,qr=ie.find(qe=>qe.id===n);ge(!0),D==null||D(Te,qr,lt);const Ao=qe=>{ge(!1),L==null||L(qe,qr,lt)};Y$({event:Te,handleId:Rt,nodeId:Zt,onConnect:qe=>R==null?void 0:R(qr,qe),isTarget:ko,getState:ae.getState,setState:ae.setState,isValidConnection:Zn,edgeUpdaterType:lt,onEdgeUpdateEnd:Ao})},xt=Te=>nt(Te,!0),vn=Te=>nt(Te,!1),sn=()=>ne(!0),Ot=()=>ne(!1),ee=!k&&!s,be=Te=>{var Ne;if(D$.includes(Te.key)&&k){const{unselectNodesAndEdges:ie,addSelectedEdges:he,edges:Zt}=ae.getState();Te.key==="Escape"?((Ne=Q.current)==null||Ne.blur(),ie({edges:[Zt.find(lt=>lt.id===n)]})):he([n])}};return j.jsxs("g",{className:yi(["react-flow__edge",`react-flow__edge-${i}`,r,{selected:l,animated:u,inactive:ee,updating:J}]),onClick:se,onDoubleClick:We,onContextMenu:mt,onMouseEnter:$e,onMouseMove:Fe,onMouseLeave:Ie,onKeyDown:q?be:void 0,tabIndex:q?0:void 0,role:q?"button":void 0,"data-testid":`rf__edge-${n}`,"aria-label":K===null?void 0:K||`Edge from ${v} to ${y}`,"aria-describedby":q?`${iF}-${U}`:void 0,ref:Q,children:[!Z&&j.jsx(e,{id:n,source:v,target:y,selected:l,animated:u,label:c,labelStyle:d,labelShowBg:f,labelBgStyle:h,labelBgPadding:p,labelBgBorderRadius:m,data:o,style:S,sourceX:g,sourceY:b,targetX:_,targetY:w,sourcePosition:x,targetPosition:C,sourceHandleId:A,targetHandleId:$,markerStart:oe,markerEnd:Ce,pathOptions:F,interactionWidth:W}),X&&j.jsxs(j.Fragment,{children:[(X==="source"||X===!0)&&j.jsx(s9,{position:x,centerX:g,centerY:b,radius:N,onMouseDown:xt,onMouseEnter:sn,onMouseOut:Ot,type:"source"}),(X==="target"||X===!0)&&j.jsx(s9,{position:C,centerX:_,centerY:w,radius:N,onMouseDown:vn,onMouseEnter:sn,onMouseOut:Ot,type:"target"})]})]})};return t.displayName="EdgeWrapper",E.memo(t)};function yve(e){const t={default:ou(e.default||o0),straight:ou(e.bezier||M3),step:ou(e.step||N3),smoothstep:ou(e.step||S1),simplebezier:ou(e.simplebezier||I3)},n={},r=Object.keys(e).filter(i=>!["default","bezier"].includes(i)).reduce((i,o)=>(i[o]=ou(e[o]||o0),i),n);return{...t,...r}}function a9(e,t,n=null){const r=((n==null?void 0:n.x)||0)+t.x,i=((n==null?void 0:n.y)||0)+t.y,o=(n==null?void 0:n.width)||t.width,s=(n==null?void 0:n.height)||t.height;switch(e){case ye.Top:return{x:r+o/2,y:i};case ye.Right:return{x:r+o,y:i+s/2};case ye.Bottom:return{x:r+o/2,y:i+s};case ye.Left:return{x:r,y:i+s/2}}}function l9(e,t){return e?e.length===1||!t?e[0]:t&&e.find(n=>n.id===t)||null:null}const vve=(e,t,n,r,i,o)=>{const s=a9(n,e,t),a=a9(o,r,i);return{sourceX:s.x,sourceY:s.y,targetX:a.x,targetY:a.y}};function bve({sourcePos:e,targetPos:t,sourceWidth:n,sourceHeight:r,targetWidth:i,targetHeight:o,width:s,height:a,transform:l}){const u={x:Math.min(e.x,t.x),y:Math.min(e.y,t.y),x2:Math.max(e.x+n,t.x+i),y2:Math.max(e.y+r,t.y+o)};u.x===u.x2&&(u.x2+=1),u.y===u.y2&&(u.y2+=1);const c=r0({x:(0-l[0])/l[2],y:(0-l[1])/l[2],width:s/l[2],height:a/l[2]}),d=Math.max(0,Math.min(c.x2,u.x2)-Math.max(c.x,u.x)),f=Math.max(0,Math.min(c.y2,u.y2)-Math.max(c.y,u.y));return Math.ceil(d*f)>0}function u9(e){var r,i,o,s,a;const t=((r=e==null?void 0:e[pn])==null?void 0:r.handleBounds)||null,n=t&&(e==null?void 0:e.width)&&(e==null?void 0:e.height)&&typeof((i=e==null?void 0:e.positionAbsolute)==null?void 0:i.x)<"u"&&typeof((o=e==null?void 0:e.positionAbsolute)==null?void 0:o.y)<"u";return[{x:((s=e==null?void 0:e.positionAbsolute)==null?void 0:s.x)||0,y:((a=e==null?void 0:e.positionAbsolute)==null?void 0:a.y)||0,width:(e==null?void 0:e.width)||0,height:(e==null?void 0:e.height)||0},t,!!n]}function oF(e,t){if(!e.parentNode)return!1;const n=t.get(e.parentNode);return n?n.selected?!0:oF(n,t):!1}function c9(e,t,n){let r=e;do{if(r!=null&&r.matches(t))return!0;if(r===n.current)return!1;r=r.parentElement}while(r);return!1}function Sve(e,t,n,r){return Array.from(e.values()).filter(i=>(i.selected||i.id===r)&&(!i.parentNode||!oF(i,e))&&(i.draggable||t&&typeof i.draggable>"u")).map(i=>{var o,s;return{id:i.id,position:i.position||{x:0,y:0},positionAbsolute:i.positionAbsolute||{x:0,y:0},distance:{x:n.x-(((o=i.positionAbsolute)==null?void 0:o.x)??0),y:n.y-(((s=i.positionAbsolute)==null?void 0:s.y)??0)},delta:{x:0,y:0},extent:i.extent,parentNode:i.parentNode,width:i.width,height:i.height}})}function _ve(e,t){return!t||t==="parent"?t:[t[0],[t[1][0]-(e.width||0),t[1][1]-(e.height||0)]]}function sF(e,t,n,r,i=[0,0],o){const s=_ve(e,e.extent||r);let a=s;if(e.extent==="parent")if(e.parentNode&&e.width&&e.height){const c=n.get(e.parentNode),{x:d,y:f}=oc(c,i).positionAbsolute;a=c&&si(d)&&si(f)&&si(c.width)&&si(c.height)?[[d+e.width*i[0],f+e.height*i[1]],[d+c.width-e.width+e.width*i[0],f+c.height-e.height+e.height*i[1]]]:a}else o==null||o("005",ya.error005()),a=s;else if(e.extent&&e.parentNode){const c=n.get(e.parentNode),{x:d,y:f}=oc(c,i).positionAbsolute;a=[[e.extent[0][0]+d,e.extent[0][1]+f],[e.extent[1][0]+d,e.extent[1][1]+f]]}let l={x:0,y:0};if(e.parentNode){const c=n.get(e.parentNode);l=oc(c,i).positionAbsolute}const u=a?R3(t,a):t;return{position:{x:u.x-l.x,y:u.y-l.y},positionAbsolute:u}}function h2({nodeId:e,dragItems:t,nodeInternals:n}){const r=t.map(i=>({...n.get(i.id),position:i.position,positionAbsolute:i.positionAbsolute}));return[e?r.find(i=>i.id===e):r[0],r]}const d9=(e,t,n,r)=>{const i=t.querySelectorAll(e);if(!i||!i.length)return null;const o=Array.from(i),s=t.getBoundingClientRect(),a={x:s.width*r[0],y:s.height*r[1]};return o.map(l=>{const u=l.getBoundingClientRect();return{id:l.getAttribute("data-handleid"),position:l.getAttribute("data-handlepos"),x:(u.left-s.left-a.x)/n,y:(u.top-s.top-a.y)/n,...O3(l)}})};function Rd(e,t,n){return n===void 0?n:r=>{const i=t().nodeInternals.get(e);n(r,{...i})}}function ax({id:e,store:t,unselect:n=!1,nodeRef:r}){const{addSelectedNodes:i,unselectNodesAndEdges:o,multiSelectionActive:s,nodeInternals:a}=t.getState(),l=a.get(e);t.setState({nodesSelectionActive:!1}),l.selected?(n||l.selected&&s)&&(o({nodes:[l]}),requestAnimationFrame(()=>{var u;return(u=r==null?void 0:r.current)==null?void 0:u.blur()})):i([e])}function wve(){const e=Xn();return E.useCallback(({sourceEvent:n})=>{const{transform:r,snapGrid:i,snapToGrid:o}=e.getState(),s=n.touches?n.touches[0].clientX:n.clientX,a=n.touches?n.touches[0].clientY:n.clientY,l={x:(s-r[0])/r[2],y:(a-r[1])/r[2]};return{xSnapped:o?i[0]*Math.round(l.x/i[0]):l.x,ySnapped:o?i[1]*Math.round(l.y/i[1]):l.y,...l}},[])}function p2(e){return(t,n,r)=>e==null?void 0:e(t,r)}function aF({nodeRef:e,disabled:t=!1,noDragClassName:n,handleSelector:r,nodeId:i,isSelectable:o,selectNodesOnDrag:s}){const a=Xn(),[l,u]=E.useState(!1),c=E.useRef([]),d=E.useRef({x:null,y:null}),f=E.useRef(0),h=E.useRef(null),p=E.useRef({x:0,y:0}),m=E.useRef(null),S=E.useRef(!1),v=wve();return E.useEffect(()=>{if(e!=null&&e.current){const y=Ti(e.current),g=({x:_,y:w})=>{const{nodeInternals:x,onNodeDrag:C,onSelectionDrag:k,updateNodePositions:P,nodeExtent:A,snapGrid:$,snapToGrid:M,nodeOrigin:T,onError:O}=a.getState();d.current={x:_,y:w};let I=!1;if(c.current=c.current.map(R=>{const D={x:_-R.distance.x,y:w-R.distance.y};M&&(D.x=$[0]*Math.round(D.x/$[0]),D.y=$[1]*Math.round(D.y/$[1]));const L=sF(R,D,x,A,T,O);return I=I||R.position.x!==L.position.x||R.position.y!==L.position.y,R.position=L.position,R.positionAbsolute=L.positionAbsolute,R}),!I)return;P(c.current,!0,!0),u(!0);const N=i?C:p2(k);if(N&&m.current){const[R,D]=h2({nodeId:i,dragItems:c.current,nodeInternals:x});N(m.current,R,D)}},b=()=>{if(!h.current)return;const[_,w]=R$(p.current,h.current);if(_!==0||w!==0){const{transform:x,panBy:C}=a.getState();d.current.x=(d.current.x??0)-_/x[2],d.current.y=(d.current.y??0)-w/x[2],C({x:_,y:w})&&g(d.current)}f.current=requestAnimationFrame(b)};if(t)y.on(".drag",null);else{const _=Vme().on("start",w=>{var I;const{nodeInternals:x,multiSelectionActive:C,domNode:k,nodesDraggable:P,unselectNodesAndEdges:A,onNodeDragStart:$,onSelectionDragStart:M}=a.getState(),T=i?$:p2(M);!s&&!C&&i&&((I=x.get(i))!=null&&I.selected||A()),i&&o&&s&&ax({id:i,store:a,nodeRef:e});const O=v(w);if(d.current=O,c.current=Sve(x,P,O,i),T&&c.current){const[N,R]=h2({nodeId:i,dragItems:c.current,nodeInternals:x});T(w.sourceEvent,N,R)}h.current=(k==null?void 0:k.getBoundingClientRect())||null,p.current=oa(w.sourceEvent,h.current)}).on("drag",w=>{const x=v(w),{autoPanOnNodeDrag:C}=a.getState();!S.current&&C&&(S.current=!0,b()),(d.current.x!==x.xSnapped||d.current.y!==x.ySnapped)&&c.current&&(m.current=w.sourceEvent,p.current=oa(w.sourceEvent,h.current),g(x))}).on("end",w=>{if(u(!1),S.current=!1,cancelAnimationFrame(f.current),c.current){const{updateNodePositions:x,nodeInternals:C,onNodeDragStop:k,onSelectionDragStop:P}=a.getState(),A=i?k:p2(P);if(x(c.current,!1,!1),A){const[$,M]=h2({nodeId:i,dragItems:c.current,nodeInternals:C});A(w.sourceEvent,$,M)}}}).filter(w=>{const x=w.target;return!w.button&&(!n||!c9(x,`.${n}`,e))&&(!r||c9(x,r,e))});return y.call(_),()=>{y.on(".drag",null)}}}},[e,t,n,r,o,a,i,s,v]),l}function lF(){const e=Xn();return E.useCallback(n=>{const{nodeInternals:r,nodeExtent:i,updateNodePositions:o,getNodes:s,snapToGrid:a,snapGrid:l,onError:u,nodesDraggable:c}=e.getState(),d=s().filter(y=>y.selected&&(y.draggable||c&&typeof y.draggable>"u")),f=a?l[0]:5,h=a?l[1]:5,p=n.isShiftPressed?4:1,m=n.x*f*p,S=n.y*h*p,v=d.map(y=>{if(y.positionAbsolute){const g={x:y.positionAbsolute.x+m,y:y.positionAbsolute.y+S};a&&(g.x=l[0]*Math.round(g.x/l[0]),g.y=l[1]*Math.round(g.y/l[1]));const{positionAbsolute:b,position:_}=sF(y,g,r,i,void 0,u);y.position=_,y.positionAbsolute=b}return y});o(v,!0,!1)},[])}const sc={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}};var Id=e=>{const t=({id:n,type:r,data:i,xPos:o,yPos:s,xPosOrigin:a,yPosOrigin:l,selected:u,onClick:c,onMouseEnter:d,onMouseMove:f,onMouseLeave:h,onContextMenu:p,onDoubleClick:m,style:S,className:v,isDraggable:y,isSelectable:g,isConnectable:b,isFocusable:_,selectNodesOnDrag:w,sourcePosition:x,targetPosition:C,hidden:k,resizeObserver:P,dragHandle:A,zIndex:$,isParent:M,noDragClassName:T,noPanClassName:O,initialized:I,disableKeyboardA11y:N,ariaLabel:R,rfId:D})=>{const L=Xn(),V=E.useRef(null),z=E.useRef(x),U=E.useRef(C),K=E.useRef(r),q=g||y||c||d||f||h,X=lF(),F=Rd(n,L.getState,d),W=Rd(n,L.getState,f),Q=Rd(n,L.getState,h),J=Rd(n,L.getState,p),ne=Rd(n,L.getState,m),Z=oe=>{if(g&&(!w||!y)&&ax({id:n,store:L,nodeRef:V}),c){const Ce=L.getState().nodeInternals.get(n);c(oe,{...Ce})}},ge=oe=>{if(!rx(oe))if(D$.includes(oe.key)&&g){const Ce=oe.key==="Escape";ax({id:n,store:L,unselect:Ce,nodeRef:V})}else!N&&y&&u&&Object.prototype.hasOwnProperty.call(sc,oe.key)&&(L.setState({ariaLiveMessage:`Moved selected node ${oe.key.replace("Arrow","").toLowerCase()}. New position, x: ${~~o}, y: ${~~s}`}),X({x:sc[oe.key].x,y:sc[oe.key].y,isShiftPressed:oe.shiftKey}))};E.useEffect(()=>{if(V.current&&!k){const oe=V.current;return P==null||P.observe(oe),()=>P==null?void 0:P.unobserve(oe)}},[k]),E.useEffect(()=>{const oe=K.current!==r,Ce=z.current!==x,se=U.current!==C;V.current&&(oe||Ce||se)&&(oe&&(K.current=r),Ce&&(z.current=x),se&&(U.current=C),L.getState().updateNodeDimensions([{id:n,nodeElement:V.current,forceUpdate:!0}]))},[n,r,x,C]);const ae=aF({nodeRef:V,disabled:k||!y,noDragClassName:T,handleSelector:A,nodeId:n,isSelectable:g,selectNodesOnDrag:w});return k?null:j.jsx("div",{className:yi(["react-flow__node",`react-flow__node-${r}`,{[O]:y},v,{selected:u,selectable:g,parent:M,dragging:ae}]),ref:V,style:{zIndex:$,transform:`translate(${a}px,${l}px)`,pointerEvents:q?"all":"none",visibility:I?"visible":"hidden",...S},"data-id":n,"data-testid":`rf__node-${n}`,onMouseEnter:F,onMouseMove:W,onMouseLeave:Q,onContextMenu:J,onClick:Z,onDoubleClick:ne,onKeyDown:_?ge:void 0,tabIndex:_?0:void 0,role:_?"button":void 0,"aria-describedby":N?void 0:`${rF}-${D}`,"aria-label":R,children:j.jsx(H0e,{value:n,children:j.jsx(e,{id:n,data:i,type:r,xPos:o,yPos:s,selected:u,isConnectable:b,sourcePosition:x,targetPosition:C,dragging:ae,dragHandle:A,zIndex:$})})})};return t.displayName="NodeWrapper",E.memo(t)};function xve(e){const t={input:Id(e.input||J$),default:Id(e.default||sx),output:Id(e.output||tF),group:Id(e.group||$3)},n={},r=Object.keys(e).filter(i=>!["input","default","output","group"].includes(i)).reduce((i,o)=>(i[o]=Id(e[o]||sx),i),n);return{...t,...r}}const Cve=({x:e,y:t,width:n,height:r,origin:i})=>!n||!r?{x:e,y:t}:i[0]<0||i[1]<0||i[0]>1||i[1]>1?{x:e,y:t}:{x:e-n*i[0],y:t-r*i[1]},Tve=typeof document<"u"?document:null;var Nh=(e=null,t={target:Tve})=>{const[n,r]=E.useState(!1),i=E.useRef(!1),o=E.useRef(new Set([])),[s,a]=E.useMemo(()=>{if(e!==null){const u=(Array.isArray(e)?e:[e]).filter(d=>typeof d=="string").map(d=>d.split("+")),c=u.reduce((d,f)=>d.concat(...f),[]);return[u,c]}return[[],[]]},[e]);return E.useEffect(()=>{var l,u;if(e!==null){const c=h=>{if(i.current=h.ctrlKey||h.metaKey||h.shiftKey,!i.current&&rx(h))return!1;const p=h9(h.code,a);o.current.add(h[p]),f9(s,o.current,!1)&&(h.preventDefault(),r(!0))},d=h=>{if(!i.current&&rx(h))return!1;const p=h9(h.code,a);f9(s,o.current,!0)?(r(!1),o.current.clear()):o.current.delete(h[p]),i.current=!1},f=()=>{o.current.clear(),r(!1)};return(l=t==null?void 0:t.target)==null||l.addEventListener("keydown",c),(u=t==null?void 0:t.target)==null||u.addEventListener("keyup",d),window.addEventListener("blur",f),()=>{var h,p;(h=t==null?void 0:t.target)==null||h.removeEventListener("keydown",c),(p=t==null?void 0:t.target)==null||p.removeEventListener("keyup",d),window.removeEventListener("blur",f)}}},[e,r]),n};function f9(e,t,n){return e.filter(r=>n||r.length===t.size).some(r=>r.every(i=>t.has(i)))}function h9(e,t){return t.includes(e)?"code":"key"}function uF(e,t,n,r){var s,a;if(!e.parentNode)return n;const i=t.get(e.parentNode),o=oc(i,r);return uF(i,t,{x:(n.x??0)+o.x,y:(n.y??0)+o.y,z:(((s=i[pn])==null?void 0:s.z)??0)>(n.z??0)?((a=i[pn])==null?void 0:a.z)??0:n.z??0},r)}function cF(e,t,n){e.forEach(r=>{var i;if(r.parentNode&&!e.has(r.parentNode))throw new Error(`Parent node ${r.parentNode} not found`);if(r.parentNode||n!=null&&n[r.id]){const{x:o,y:s,z:a}=uF(r,e,{...r.position,z:((i=r[pn])==null?void 0:i.z)??0},t);r.positionAbsolute={x:o,y:s},r[pn].z=a,n!=null&&n[r.id]&&(r[pn].isParent=!0)}})}function g2(e,t,n,r){const i=new Map,o={},s=r?1e3:0;return e.forEach(a=>{var d;const l=(si(a.zIndex)?a.zIndex:0)+(a.selected?s:0),u=t.get(a.id),c={width:u==null?void 0:u.width,height:u==null?void 0:u.height,...a,positionAbsolute:{x:a.position.x,y:a.position.y}};a.parentNode&&(c.parentNode=a.parentNode,o[a.parentNode]=!0),Object.defineProperty(c,pn,{enumerable:!1,value:{handleBounds:(d=u==null?void 0:u[pn])==null?void 0:d.handleBounds,z:l}}),i.set(a.id,c)}),cF(i,n,o),i}function dF(e,t={}){const{getNodes:n,width:r,height:i,minZoom:o,maxZoom:s,d3Zoom:a,d3Selection:l,fitViewOnInitDone:u,fitViewOnInit:c,nodeOrigin:d}=e(),f=t.initial&&!u&&c;if(a&&l&&(f||!t.initial)){const p=n().filter(S=>{var y;const v=t.includeHiddenNodes?S.width&&S.height:!S.hidden;return(y=t.nodes)!=null&&y.length?v&&t.nodes.some(g=>g.id===S.id):v}),m=p.every(S=>S.width&&S.height);if(p.length>0&&m){const S=U$(p,d),[v,y,g]=W$(S,r,i,t.minZoom??o,t.maxZoom??s,t.padding??.1),b=ia.translate(v,y).scale(g);return typeof t.duration=="number"&&t.duration>0?a.transform(Ha(l,t.duration),b):a.transform(l,b),!0}}return!1}function Eve(e,t){return e.forEach(n=>{const r=t.get(n.id);r&&t.set(r.id,{...r,[pn]:r[pn],selected:n.selected})}),new Map(t)}function Pve(e,t){return t.map(n=>{const r=e.find(i=>i.id===n.id);return r&&(n.selected=r.selected),n})}function Ig({changedNodes:e,changedEdges:t,get:n,set:r}){const{nodeInternals:i,edges:o,onNodesChange:s,onEdgesChange:a,hasDefaultNodes:l,hasDefaultEdges:u}=n();e!=null&&e.length&&(l&&r({nodeInternals:Eve(e,i)}),s==null||s(e)),t!=null&&t.length&&(u&&r({edges:Pve(t,o)}),a==null||a(t))}const su=()=>{},kve={zoomIn:su,zoomOut:su,zoomTo:su,getZoom:()=>1,setViewport:su,getViewport:()=>({x:0,y:0,zoom:1}),fitView:()=>!1,setCenter:su,fitBounds:su,project:e=>e,viewportInitialized:!1},Ave=e=>({d3Zoom:e.d3Zoom,d3Selection:e.d3Selection}),Ove=()=>{const e=Xn(),{d3Zoom:t,d3Selection:n}=Yt(Ave,Ar);return E.useMemo(()=>n&&t?{zoomIn:i=>t.scaleBy(Ha(n,i==null?void 0:i.duration),1.2),zoomOut:i=>t.scaleBy(Ha(n,i==null?void 0:i.duration),1/1.2),zoomTo:(i,o)=>t.scaleTo(Ha(n,o==null?void 0:o.duration),i),getZoom:()=>e.getState().transform[2],setViewport:(i,o)=>{const[s,a,l]=e.getState().transform,u=ia.translate(i.x??s,i.y??a).scale(i.zoom??l);t.transform(Ha(n,o==null?void 0:o.duration),u)},getViewport:()=>{const[i,o,s]=e.getState().transform;return{x:i,y:o,zoom:s}},fitView:i=>dF(e.getState,i),setCenter:(i,o,s)=>{const{width:a,height:l,maxZoom:u}=e.getState(),c=typeof(s==null?void 0:s.zoom)<"u"?s.zoom:u,d=a/2-i*c,f=l/2-o*c,h=ia.translate(d,f).scale(c);t.transform(Ha(n,s==null?void 0:s.duration),h)},fitBounds:(i,o)=>{const{width:s,height:a,minZoom:l,maxZoom:u}=e.getState(),[c,d,f]=W$(i,s,a,l,u,(o==null?void 0:o.padding)??.1),h=ia.translate(c,d).scale(f);t.transform(Ha(n,o==null?void 0:o.duration),h)},project:i=>{const{transform:o,snapToGrid:s,snapGrid:a}=e.getState();return z$(i,o,s,a)},viewportInitialized:!0}:kve,[t,n])};function fF(){const e=Ove(),t=Xn(),n=E.useCallback(()=>t.getState().getNodes().map(m=>({...m})),[]),r=E.useCallback(m=>t.getState().nodeInternals.get(m),[]),i=E.useCallback(()=>{const{edges:m=[]}=t.getState();return m.map(S=>({...S}))},[]),o=E.useCallback(m=>{const{edges:S=[]}=t.getState();return S.find(v=>v.id===m)},[]),s=E.useCallback(m=>{const{getNodes:S,setNodes:v,hasDefaultNodes:y,onNodesChange:g}=t.getState(),b=S(),_=typeof m=="function"?m(b):m;if(y)v(_);else if(g){const w=_.length===0?b.map(x=>({type:"remove",id:x.id})):_.map(x=>({item:x,type:"reset"}));g(w)}},[]),a=E.useCallback(m=>{const{edges:S=[],setEdges:v,hasDefaultEdges:y,onEdgesChange:g}=t.getState(),b=typeof m=="function"?m(S):m;if(y)v(b);else if(g){const _=b.length===0?S.map(w=>({type:"remove",id:w.id})):b.map(w=>({item:w,type:"reset"}));g(_)}},[]),l=E.useCallback(m=>{const S=Array.isArray(m)?m:[m],{getNodes:v,setNodes:y,hasDefaultNodes:g,onNodesChange:b}=t.getState();if(g){const w=[...v(),...S];y(w)}else if(b){const _=S.map(w=>({item:w,type:"add"}));b(_)}},[]),u=E.useCallback(m=>{const S=Array.isArray(m)?m:[m],{edges:v=[],setEdges:y,hasDefaultEdges:g,onEdgesChange:b}=t.getState();if(g)y([...v,...S]);else if(b){const _=S.map(w=>({item:w,type:"add"}));b(_)}},[]),c=E.useCallback(()=>{const{getNodes:m,edges:S=[],transform:v}=t.getState(),[y,g,b]=v;return{nodes:m().map(_=>({..._})),edges:S.map(_=>({..._})),viewport:{x:y,y:g,zoom:b}}},[]),d=E.useCallback(({nodes:m,edges:S})=>{const{nodeInternals:v,getNodes:y,edges:g,hasDefaultNodes:b,hasDefaultEdges:_,onNodesDelete:w,onEdgesDelete:x,onNodesChange:C,onEdgesChange:k}=t.getState(),P=(m||[]).map(O=>O.id),A=(S||[]).map(O=>O.id),$=y().reduce((O,I)=>{const N=!P.includes(I.id)&&I.parentNode&&O.find(D=>D.id===I.parentNode);return(typeof I.deletable=="boolean"?I.deletable:!0)&&(P.includes(I.id)||N)&&O.push(I),O},[]),M=g.filter(O=>typeof O.deletable=="boolean"?O.deletable:!0),T=M.filter(O=>A.includes(O.id));if($||T){const O=H$($,M),I=[...T,...O],N=I.reduce((R,D)=>(R.includes(D.id)||R.push(D.id),R),[]);if((_||b)&&(_&&t.setState({edges:g.filter(R=>!N.includes(R.id))}),b&&($.forEach(R=>{v.delete(R.id)}),t.setState({nodeInternals:new Map(v)}))),N.length>0&&(x==null||x(I),k&&k(N.map(R=>({id:R,type:"remove"})))),$.length>0&&(w==null||w($),C)){const R=$.map(D=>({id:D.id,type:"remove"}));C(R)}}},[]),f=E.useCallback(m=>{const S=F0e(m),v=S?null:t.getState().nodeInternals.get(m.id);return[S?m:Q8(v),v,S]},[]),h=E.useCallback((m,S=!0,v)=>{const[y,g,b]=f(m);return y?(v||t.getState().getNodes()).filter(_=>{if(!b&&(_.id===g.id||!_.positionAbsolute))return!1;const w=Q8(_),x=nx(w,y);return S&&x>0||x>=m.width*m.height}):[]},[]),p=E.useCallback((m,S,v=!0)=>{const[y]=f(m);if(!y)return!1;const g=nx(y,S);return v&&g>0||g>=m.width*m.height},[]);return E.useMemo(()=>({...e,getNodes:n,getNode:r,getEdges:i,getEdge:o,setNodes:s,setEdges:a,addNodes:l,addEdges:u,toObject:c,deleteElements:d,getIntersectingNodes:h,isNodeIntersecting:p}),[e,n,r,i,o,s,a,l,u,c,d,h,p])}var Rve=({deleteKeyCode:e,multiSelectionKeyCode:t})=>{const n=Xn(),{deleteElements:r}=fF(),i=Nh(e),o=Nh(t);E.useEffect(()=>{if(i){const{edges:s,getNodes:a}=n.getState(),l=a().filter(c=>c.selected),u=s.filter(c=>c.selected);r({nodes:l,edges:u}),n.setState({nodesSelectionActive:!1})}},[i]),E.useEffect(()=>{n.setState({multiSelectionActive:o})},[o])};function Ive(e){const t=Xn();E.useEffect(()=>{let n;const r=()=>{var o,s;if(!e.current)return;const i=O3(e.current);(i.height===0||i.width===0)&&((s=(o=t.getState()).onError)==null||s.call(o,"004",ya.error004())),t.setState({width:i.width||500,height:i.height||500})};return r(),window.addEventListener("resize",r),e.current&&(n=new ResizeObserver(()=>r()),n.observe(e.current)),()=>{window.removeEventListener("resize",r),n&&e.current&&n.unobserve(e.current)}},[])}const F3={position:"absolute",width:"100%",height:"100%",top:0,left:0},Nve=(e,t)=>e.x!==t.x||e.y!==t.y||e.zoom!==t.k,m2=e=>({x:e.x,y:e.y,zoom:e.k}),au=(e,t)=>e.target.closest(`.${t}`),p9=(e,t)=>t===2&&Array.isArray(e)&&e.includes(2),Mve=e=>({d3Zoom:e.d3Zoom,d3Selection:e.d3Selection,d3ZoomHandler:e.d3ZoomHandler,userSelectionActive:e.userSelectionActive}),Dve=({onMove:e,onMoveStart:t,onMoveEnd:n,onPaneContextMenu:r,zoomOnScroll:i=!0,zoomOnPinch:o=!0,panOnScroll:s=!1,panOnScrollSpeed:a=.5,panOnScrollMode:l=ic.Free,zoomOnDoubleClick:u=!0,elementsSelectable:c,panOnDrag:d=!0,defaultViewport:f,translateExtent:h,minZoom:p,maxZoom:m,zoomActivationKeyCode:S,preventScrolling:v=!0,children:y,noWheelClassName:g,noPanClassName:b})=>{const _=E.useRef(),w=Xn(),x=E.useRef(!1),C=E.useRef(!1),k=E.useRef(null),P=E.useRef({x:0,y:0,zoom:0}),{d3Zoom:A,d3Selection:$,d3ZoomHandler:M,userSelectionActive:T}=Yt(Mve,Ar),O=Nh(S),I=E.useRef(0);return Ive(k),E.useEffect(()=>{if(k.current){const N=k.current.getBoundingClientRect(),R=R0e().scaleExtent([p,m]).translateExtent(h),D=Ti(k.current).call(R),L=ia.translate(f.x,f.y).scale(Dc(f.zoom,p,m)),V=[[0,0],[N.width,N.height]],z=R.constrain()(L,V,h);R.transform(D,z),w.setState({d3Zoom:R,d3Selection:D,d3ZoomHandler:D.on("wheel.zoom"),transform:[z.x,z.y,z.k],domNode:k.current.closest(".react-flow")})}},[]),E.useEffect(()=>{$&&A&&(s&&!O&&!T?$.on("wheel.zoom",N=>{if(au(N,g))return!1;N.preventDefault(),N.stopImmediatePropagation();const R=$.property("__zoom").k||1;if(N.ctrlKey&&o){const z=qi(N),U=-N.deltaY*(N.deltaMode===1?.05:N.deltaMode?1:.002)*10,K=R*Math.pow(2,U);A.scaleTo($,K,z);return}const D=N.deltaMode===1?20:1,L=l===ic.Vertical?0:N.deltaX*D,V=l===ic.Horizontal?0:N.deltaY*D;A.translateBy($,-(L/R)*a,-(V/R)*a)},{passive:!1}):typeof M<"u"&&$.on("wheel.zoom",function(N,R){if(!v||au(N,g))return null;N.preventDefault(),M.call(this,N,R)},{passive:!1}))},[T,s,l,$,A,M,O,o,v,g]),E.useEffect(()=>{A&&A.on("start",N=>{var D;if(!N.sourceEvent)return null;I.current=N.sourceEvent.button;const{onViewportChangeStart:R}=w.getState();if(x.current=!0,((D=N.sourceEvent)==null?void 0:D.type)==="mousedown"&&w.setState({paneDragging:!0}),t||R){const L=m2(N.transform);P.current=L,R==null||R(L),t==null||t(N.sourceEvent,L)}})},[A,t]),E.useEffect(()=>{A&&(T&&!x.current?A.on("zoom",null):T||A.on("zoom",N=>{const{onViewportChange:R}=w.getState();if(w.setState({transform:[N.transform.x,N.transform.y,N.transform.k]}),C.current=!!(r&&p9(d,I.current??0)),e||R){const D=m2(N.transform);R==null||R(D),e==null||e(N.sourceEvent,D)}}))},[T,A,e,d,r]),E.useEffect(()=>{A&&A.on("end",N=>{if(!N.sourceEvent)return null;const{onViewportChangeEnd:R}=w.getState();if(x.current=!1,w.setState({paneDragging:!1}),r&&p9(d,I.current??0)&&!C.current&&r(N.sourceEvent),C.current=!1,(n||R)&&Nve(P.current,N.transform)){const D=m2(N.transform);P.current=D,clearTimeout(_.current),_.current=setTimeout(()=>{R==null||R(D),n==null||n(N.sourceEvent,D)},s?150:0)}})},[A,s,d,n,r]),E.useEffect(()=>{A&&A.filter(N=>{const R=O||i,D=o&&N.ctrlKey;if(N.button===1&&N.type==="mousedown"&&(au(N,"react-flow__node")||au(N,"react-flow__edge")))return!0;if(!d&&!R&&!s&&!u&&!o||T||!u&&N.type==="dblclick"||au(N,g)&&N.type==="wheel"||au(N,b)&&N.type!=="wheel"||!o&&N.ctrlKey&&N.type==="wheel"||!R&&!s&&!D&&N.type==="wheel"||!d&&(N.type==="mousedown"||N.type==="touchstart")||Array.isArray(d)&&!d.includes(N.button)&&(N.type==="mousedown"||N.type==="touchstart"))return!1;const L=Array.isArray(d)&&d.includes(N.button)||!N.button||N.button<=1;return(!N.ctrlKey||N.type==="wheel")&&L})},[T,A,i,o,s,u,d,c,O]),j.jsx("div",{className:"react-flow__renderer",ref:k,style:F3,children:y})},Lve=e=>({userSelectionActive:e.userSelectionActive,userSelectionRect:e.userSelectionRect});function $ve(){const{userSelectionActive:e,userSelectionRect:t}=Yt(Lve,Ar);return e&&t?j.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:t.width,height:t.height,transform:`translate(${t.x}px, ${t.y}px)`}}):null}function g9(e,t){const n=e.find(r=>r.id===t.parentNode);if(n){const r=t.position.x+t.width-n.width,i=t.position.y+t.height-n.height;if(r>0||i>0||t.position.x<0||t.position.y<0){if(n.style={...n.style},n.style.width=n.style.width??n.width,n.style.height=n.style.height??n.height,r>0&&(n.style.width+=r),i>0&&(n.style.height+=i),t.position.x<0){const o=Math.abs(t.position.x);n.position.x=n.position.x-o,n.style.width+=o,t.position.x=0}if(t.position.y<0){const o=Math.abs(t.position.y);n.position.y=n.position.y-o,n.style.height+=o,t.position.y=0}n.width=n.style.width,n.height=n.style.height}}}function hF(e,t){if(e.some(r=>r.type==="reset"))return e.filter(r=>r.type==="reset").map(r=>r.item);const n=e.filter(r=>r.type==="add").map(r=>r.item);return t.reduce((r,i)=>{const o=e.filter(a=>a.id===i.id);if(o.length===0)return r.push(i),r;const s={...i};for(const a of o)if(a)switch(a.type){case"select":{s.selected=a.selected;break}case"position":{typeof a.position<"u"&&(s.position=a.position),typeof a.positionAbsolute<"u"&&(s.positionAbsolute=a.positionAbsolute),typeof a.dragging<"u"&&(s.dragging=a.dragging),s.expandParent&&g9(r,s);break}case"dimensions":{typeof a.dimensions<"u"&&(s.width=a.dimensions.width,s.height=a.dimensions.height),typeof a.updateStyle<"u"&&(s.style={...s.style||{},...a.dimensions}),typeof a.resizing=="boolean"&&(s.resizing=a.resizing),s.expandParent&&g9(r,s);break}case"remove":return r}return r.push(s),r},n)}function pF(e,t){return hF(e,t)}function Fve(e,t){return hF(e,t)}const Ls=(e,t)=>({id:e,type:"select",selected:t});function $u(e,t){return e.reduce((n,r)=>{const i=t.includes(r.id);return!r.selected&&i?(r.selected=!0,n.push(Ls(r.id,!0))):r.selected&&!i&&(r.selected=!1,n.push(Ls(r.id,!1))),n},[])}const y2=(e,t)=>n=>{n.target===t.current&&(e==null||e(n))},Bve=e=>({userSelectionActive:e.userSelectionActive,elementsSelectable:e.elementsSelectable,dragging:e.paneDragging}),gF=E.memo(({isSelecting:e,selectionMode:t=Ih.Full,panOnDrag:n,onSelectionStart:r,onSelectionEnd:i,onPaneClick:o,onPaneContextMenu:s,onPaneScroll:a,onPaneMouseEnter:l,onPaneMouseMove:u,onPaneMouseLeave:c,children:d})=>{const f=E.useRef(null),h=Xn(),p=E.useRef(0),m=E.useRef(0),S=E.useRef(),{userSelectionActive:v,elementsSelectable:y,dragging:g}=Yt(Bve,Ar),b=()=>{h.setState({userSelectionActive:!1,userSelectionRect:null}),p.current=0,m.current=0},_=M=>{o==null||o(M),h.getState().resetSelectedElements(),h.setState({nodesSelectionActive:!1})},w=M=>{if(Array.isArray(n)&&(n!=null&&n.includes(2))){M.preventDefault();return}s==null||s(M)},x=a?M=>a(M):void 0,C=M=>{const{resetSelectedElements:T,domNode:O}=h.getState();if(S.current=O==null?void 0:O.getBoundingClientRect(),!y||!e||M.button!==0||M.target!==f.current||!S.current)return;const{x:I,y:N}=oa(M,S.current);T(),h.setState({userSelectionRect:{width:0,height:0,startX:I,startY:N,x:I,y:N}}),r==null||r(M)},k=M=>{const{userSelectionRect:T,nodeInternals:O,edges:I,transform:N,onNodesChange:R,onEdgesChange:D,nodeOrigin:L,getNodes:V}=h.getState();if(!e||!S.current||!T)return;h.setState({userSelectionActive:!0,nodesSelectionActive:!1});const z=oa(M,S.current),U=T.startX??0,K=T.startY??0,q={...T,x:z.xJ.id),Q=F.map(J=>J.id);if(p.current!==Q.length){p.current=Q.length;const J=$u(X,Q);J.length&&(R==null||R(J))}if(m.current!==W.length){m.current=W.length;const J=$u(I,W);J.length&&(D==null||D(J))}h.setState({userSelectionRect:q})},P=M=>{if(M.button!==0)return;const{userSelectionRect:T}=h.getState();!v&&T&&M.target===f.current&&(_==null||_(M)),h.setState({nodesSelectionActive:p.current>0}),b(),i==null||i(M)},A=M=>{v&&(h.setState({nodesSelectionActive:p.current>0}),i==null||i(M)),b()},$=y&&(e||v);return j.jsxs("div",{className:yi(["react-flow__pane",{dragging:g,selection:e}]),onClick:$?void 0:y2(_,f),onContextMenu:y2(w,f),onWheel:y2(x,f),onMouseEnter:$?void 0:l,onMouseDown:$?C:void 0,onMouseMove:$?k:u,onMouseUp:$?P:void 0,onMouseLeave:$?A:c,ref:f,style:F3,children:[d,j.jsx($ve,{})]})});gF.displayName="Pane";const jve=e=>{const t=e.getNodes().filter(n=>n.selected);return{...U$(t,e.nodeOrigin),transformString:`translate(${e.transform[0]}px,${e.transform[1]}px) scale(${e.transform[2]})`,userSelectionActive:e.userSelectionActive}};function Vve({onSelectionContextMenu:e,noPanClassName:t,disableKeyboardA11y:n}){const r=Xn(),{width:i,height:o,x:s,y:a,transformString:l,userSelectionActive:u}=Yt(jve,Ar),c=lF(),d=E.useRef(null);if(E.useEffect(()=>{var p;n||(p=d.current)==null||p.focus({preventScroll:!0})},[n]),aF({nodeRef:d}),u||!i||!o)return null;const f=e?p=>{const m=r.getState().getNodes().filter(S=>S.selected);e(p,m)}:void 0,h=p=>{Object.prototype.hasOwnProperty.call(sc,p.key)&&c({x:sc[p.key].x,y:sc[p.key].y,isShiftPressed:p.shiftKey})};return j.jsx("div",{className:yi(["react-flow__nodesselection","react-flow__container",t]),style:{transform:l},children:j.jsx("div",{ref:d,className:"react-flow__nodesselection-rect",onContextMenu:f,tabIndex:n?void 0:-1,onKeyDown:n?void 0:h,style:{width:i,height:o,top:a,left:s}})})}var zve=E.memo(Vve);const Uve=e=>e.nodesSelectionActive,mF=({children:e,onPaneClick:t,onPaneMouseEnter:n,onPaneMouseMove:r,onPaneMouseLeave:i,onPaneContextMenu:o,onPaneScroll:s,deleteKeyCode:a,onMove:l,onMoveStart:u,onMoveEnd:c,selectionKeyCode:d,selectionOnDrag:f,selectionMode:h,onSelectionStart:p,onSelectionEnd:m,multiSelectionKeyCode:S,panActivationKeyCode:v,zoomActivationKeyCode:y,elementsSelectable:g,zoomOnScroll:b,zoomOnPinch:_,panOnScroll:w,panOnScrollSpeed:x,panOnScrollMode:C,zoomOnDoubleClick:k,panOnDrag:P,defaultViewport:A,translateExtent:$,minZoom:M,maxZoom:T,preventScrolling:O,onSelectionContextMenu:I,noWheelClassName:N,noPanClassName:R,disableKeyboardA11y:D})=>{const L=Yt(Uve),V=Nh(d),U=Nh(v)||P,K=V||f&&U!==!0;return Rve({deleteKeyCode:a,multiSelectionKeyCode:S}),j.jsx(Dve,{onMove:l,onMoveStart:u,onMoveEnd:c,onPaneContextMenu:o,elementsSelectable:g,zoomOnScroll:b,zoomOnPinch:_,panOnScroll:w,panOnScrollSpeed:x,panOnScrollMode:C,zoomOnDoubleClick:k,panOnDrag:!V&&U,defaultViewport:A,translateExtent:$,minZoom:M,maxZoom:T,zoomActivationKeyCode:y,preventScrolling:O,noWheelClassName:N,noPanClassName:R,children:j.jsxs(gF,{onSelectionStart:p,onSelectionEnd:m,onPaneClick:t,onPaneMouseEnter:n,onPaneMouseMove:r,onPaneMouseLeave:i,onPaneContextMenu:o,onPaneScroll:s,panOnDrag:U,isSelecting:!!K,selectionMode:h,children:[e,L&&j.jsx(zve,{onSelectionContextMenu:I,noPanClassName:R,disableKeyboardA11y:D})]})})};mF.displayName="FlowRenderer";var Gve=E.memo(mF);function Hve(e){return Yt(E.useCallback(n=>e?G$(n.nodeInternals,{x:0,y:0,width:n.width,height:n.height},n.transform,!0):n.getNodes(),[e]))}const Wve=e=>({nodesDraggable:e.nodesDraggable,nodesConnectable:e.nodesConnectable,nodesFocusable:e.nodesFocusable,elementsSelectable:e.elementsSelectable,updateNodeDimensions:e.updateNodeDimensions,onError:e.onError}),yF=e=>{const{nodesDraggable:t,nodesConnectable:n,nodesFocusable:r,elementsSelectable:i,updateNodeDimensions:o,onError:s}=Yt(Wve,Ar),a=Hve(e.onlyRenderVisibleElements),l=E.useRef(),u=E.useMemo(()=>{if(typeof ResizeObserver>"u")return null;const c=new ResizeObserver(d=>{const f=d.map(h=>({id:h.target.getAttribute("data-id"),nodeElement:h.target,forceUpdate:!0}));o(f)});return l.current=c,c},[]);return E.useEffect(()=>()=>{var c;(c=l==null?void 0:l.current)==null||c.disconnect()},[]),j.jsx("div",{className:"react-flow__nodes",style:F3,children:a.map(c=>{var _,w;let d=c.type||"default";e.nodeTypes[d]||(s==null||s("003",ya.error003(d)),d="default");const f=e.nodeTypes[d]||e.nodeTypes.default,h=!!(c.draggable||t&&typeof c.draggable>"u"),p=!!(c.selectable||i&&typeof c.selectable>"u"),m=!!(c.connectable||n&&typeof c.connectable>"u"),S=!!(c.focusable||r&&typeof c.focusable>"u"),v=e.nodeExtent?R3(c.positionAbsolute,e.nodeExtent):c.positionAbsolute,y=(v==null?void 0:v.x)??0,g=(v==null?void 0:v.y)??0,b=Cve({x:y,y:g,width:c.width??0,height:c.height??0,origin:e.nodeOrigin});return j.jsx(f,{id:c.id,className:c.className,style:c.style,type:d,data:c.data,sourcePosition:c.sourcePosition||ye.Bottom,targetPosition:c.targetPosition||ye.Top,hidden:c.hidden,xPos:y,yPos:g,xPosOrigin:b.x,yPosOrigin:b.y,selectNodesOnDrag:e.selectNodesOnDrag,onClick:e.onNodeClick,onMouseEnter:e.onNodeMouseEnter,onMouseMove:e.onNodeMouseMove,onMouseLeave:e.onNodeMouseLeave,onContextMenu:e.onNodeContextMenu,onDoubleClick:e.onNodeDoubleClick,selected:!!c.selected,isDraggable:h,isSelectable:p,isConnectable:m,isFocusable:S,resizeObserver:u,dragHandle:c.dragHandle,zIndex:((_=c[pn])==null?void 0:_.z)??0,isParent:!!((w=c[pn])!=null&&w.isParent),noDragClassName:e.noDragClassName,noPanClassName:e.noPanClassName,initialized:!!c.width&&!!c.height,rfId:e.rfId,disableKeyboardA11y:e.disableKeyboardA11y,ariaLabel:c.ariaLabel},c.id)})})};yF.displayName="NodeRenderer";var qve=E.memo(yF);const Kve=[{level:0,isMaxLevel:!0,edges:[]}];function Yve(e,t,n=!1){let r=-1;const i=e.reduce((s,a)=>{var c,d;const l=si(a.zIndex);let u=l?a.zIndex:0;if(n){const f=t.get(a.target),h=t.get(a.source),p=a.selected||(f==null?void 0:f.selected)||(h==null?void 0:h.selected),m=Math.max(((c=h==null?void 0:h[pn])==null?void 0:c.z)||0,((d=f==null?void 0:f[pn])==null?void 0:d.z)||0,1e3);u=(l?a.zIndex:0)+(p?m:0)}return s[u]?s[u].push(a):s[u]=[a],r=u>r?u:r,s},{}),o=Object.entries(i).map(([s,a])=>{const l=+s;return{edges:a,level:l,isMaxLevel:l===r}});return o.length===0?Kve:o}function Xve(e,t,n){const r=Yt(E.useCallback(i=>e?i.edges.filter(o=>{const s=t.get(o.source),a=t.get(o.target);return(s==null?void 0:s.width)&&(s==null?void 0:s.height)&&(a==null?void 0:a.width)&&(a==null?void 0:a.height)&&bve({sourcePos:s.positionAbsolute||{x:0,y:0},targetPos:a.positionAbsolute||{x:0,y:0},sourceWidth:s.width,sourceHeight:s.height,targetWidth:a.width,targetHeight:a.height,width:i.width,height:i.height,transform:i.transform})}):i.edges,[e,t]));return Yve(r,t,n)}const Qve=({color:e="none",strokeWidth:t=1})=>j.jsx("polyline",{stroke:e,strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:t,fill:"none",points:"-5,-4 0,0 -5,4"}),Zve=({color:e="none",strokeWidth:t=1})=>j.jsx("polyline",{stroke:e,strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:t,fill:e,points:"-5,-4 0,0 -5,4 -5,-4"}),m9={[i0.Arrow]:Qve,[i0.ArrowClosed]:Zve};function Jve(e){const t=Xn();return E.useMemo(()=>{var i,o;return Object.prototype.hasOwnProperty.call(m9,e)?m9[e]:((o=(i=t.getState()).onError)==null||o.call(i,"009",ya.error009(e)),null)},[e])}const e1e=({id:e,type:t,color:n,width:r=12.5,height:i=12.5,markerUnits:o="strokeWidth",strokeWidth:s,orient:a="auto-start-reverse"})=>{const l=Jve(t);return l?j.jsx("marker",{className:"react-flow__arrowhead",id:e,markerWidth:`${r}`,markerHeight:`${i}`,viewBox:"-10 -10 20 20",markerUnits:o,orient:a,refX:"0",refY:"0",children:j.jsx(l,{color:n,strokeWidth:s})}):null},t1e=({defaultColor:e,rfId:t})=>n=>{const r=[];return n.edges.reduce((i,o)=>([o.markerStart,o.markerEnd].forEach(s=>{if(s&&typeof s=="object"){const a=ox(s,t);r.includes(a)||(i.push({id:a,color:s.color||e,...s}),r.push(a))}}),i),[]).sort((i,o)=>i.id.localeCompare(o.id))},vF=({defaultColor:e,rfId:t})=>{const n=Yt(E.useCallback(t1e({defaultColor:e,rfId:t}),[e,t]),(r,i)=>!(r.length!==i.length||r.some((o,s)=>o.id!==i[s].id)));return j.jsx("defs",{children:n.map(r=>j.jsx(e1e,{id:r.id,type:r.type,color:r.color,width:r.width,height:r.height,markerUnits:r.markerUnits,strokeWidth:r.strokeWidth,orient:r.orient},r.id))})};vF.displayName="MarkerDefinitions";var n1e=E.memo(vF);const r1e=e=>({nodesConnectable:e.nodesConnectable,edgesFocusable:e.edgesFocusable,edgesUpdatable:e.edgesUpdatable,elementsSelectable:e.elementsSelectable,width:e.width,height:e.height,connectionMode:e.connectionMode,nodeInternals:e.nodeInternals,onError:e.onError}),bF=({defaultMarkerColor:e,onlyRenderVisibleElements:t,elevateEdgesOnSelect:n,rfId:r,edgeTypes:i,noPanClassName:o,onEdgeUpdate:s,onEdgeContextMenu:a,onEdgeMouseEnter:l,onEdgeMouseMove:u,onEdgeMouseLeave:c,onEdgeClick:d,edgeUpdaterRadius:f,onEdgeDoubleClick:h,onEdgeUpdateStart:p,onEdgeUpdateEnd:m,children:S})=>{const{edgesFocusable:v,edgesUpdatable:y,elementsSelectable:g,width:b,height:_,connectionMode:w,nodeInternals:x,onError:C}=Yt(r1e,Ar),k=Xve(t,x,n);return b?j.jsxs(j.Fragment,{children:[k.map(({level:P,edges:A,isMaxLevel:$})=>j.jsxs("svg",{style:{zIndex:P},width:b,height:_,className:"react-flow__edges react-flow__container",children:[$&&j.jsx(n1e,{defaultColor:e,rfId:r}),j.jsx("g",{children:A.map(M=>{const[T,O,I]=u9(x.get(M.source)),[N,R,D]=u9(x.get(M.target));if(!I||!D)return null;let L=M.type||"default";i[L]||(C==null||C("011",ya.error011(L)),L="default");const V=i[L]||i.default,z=w===El.Strict?R.target:(R.target??[]).concat(R.source??[]),U=l9(O.source,M.sourceHandle),K=l9(z,M.targetHandle),q=(U==null?void 0:U.position)||ye.Bottom,X=(K==null?void 0:K.position)||ye.Top,F=!!(M.focusable||v&&typeof M.focusable>"u"),W=typeof s<"u"&&(M.updatable||y&&typeof M.updatable>"u");if(!U||!K)return C==null||C("008",ya.error008(U,M)),null;const{sourceX:Q,sourceY:J,targetX:ne,targetY:Z}=vve(T,U,q,N,K,X);return j.jsx(V,{id:M.id,className:yi([M.className,o]),type:L,data:M.data,selected:!!M.selected,animated:!!M.animated,hidden:!!M.hidden,label:M.label,labelStyle:M.labelStyle,labelShowBg:M.labelShowBg,labelBgStyle:M.labelBgStyle,labelBgPadding:M.labelBgPadding,labelBgBorderRadius:M.labelBgBorderRadius,style:M.style,source:M.source,target:M.target,sourceHandleId:M.sourceHandle,targetHandleId:M.targetHandle,markerEnd:M.markerEnd,markerStart:M.markerStart,sourceX:Q,sourceY:J,targetX:ne,targetY:Z,sourcePosition:q,targetPosition:X,elementsSelectable:g,onEdgeUpdate:s,onContextMenu:a,onMouseEnter:l,onMouseMove:u,onMouseLeave:c,onClick:d,edgeUpdaterRadius:f,onEdgeDoubleClick:h,onEdgeUpdateStart:p,onEdgeUpdateEnd:m,rfId:r,ariaLabel:M.ariaLabel,isFocusable:F,isUpdatable:W,pathOptions:"pathOptions"in M?M.pathOptions:void 0,interactionWidth:M.interactionWidth},M.id)})})]},P)),S]}):null};bF.displayName="EdgeRenderer";var i1e=E.memo(bF);const o1e=e=>`translate(${e.transform[0]}px,${e.transform[1]}px) scale(${e.transform[2]})`;function s1e({children:e}){const t=Yt(o1e);return j.jsx("div",{className:"react-flow__viewport react-flow__container",style:{transform:t},children:e})}function a1e(e){const t=fF(),n=E.useRef(!1);E.useEffect(()=>{!n.current&&t.viewportInitialized&&e&&(setTimeout(()=>e(t),1),n.current=!0)},[e,t.viewportInitialized])}const l1e={[ye.Left]:ye.Right,[ye.Right]:ye.Left,[ye.Top]:ye.Bottom,[ye.Bottom]:ye.Top},SF=({nodeId:e,handleType:t,style:n,type:r=zs.Bezier,CustomComponent:i,connectionStatus:o})=>{var w,x,C;const{fromNode:s,handleId:a,toX:l,toY:u,connectionMode:c}=Yt(E.useCallback(k=>({fromNode:k.nodeInternals.get(e),handleId:k.connectionHandleId,toX:(k.connectionPosition.x-k.transform[0])/k.transform[2],toY:(k.connectionPosition.y-k.transform[1])/k.transform[2],connectionMode:k.connectionMode}),[e]),Ar),d=(w=s==null?void 0:s[pn])==null?void 0:w.handleBounds;let f=d==null?void 0:d[t];if(c===El.Loose&&(f=f||(d==null?void 0:d[t==="source"?"target":"source"])),!s||!f)return null;const h=a?f.find(k=>k.id===a):f[0],p=h?h.x+h.width/2:(s.width??0)/2,m=h?h.y+h.height/2:s.height??0,S=(((x=s.positionAbsolute)==null?void 0:x.x)??0)+p,v=(((C=s.positionAbsolute)==null?void 0:C.y)??0)+m,y=h==null?void 0:h.position,g=y?l1e[y]:null;if(!y||!g)return null;if(i)return j.jsx(i,{connectionLineType:r,connectionLineStyle:n,fromNode:s,fromHandle:h,fromX:S,fromY:v,toX:l,toY:u,fromPosition:y,toPosition:g,connectionStatus:o});let b="";const _={sourceX:S,sourceY:v,sourcePosition:y,targetX:l,targetY:u,targetPosition:g};return r===zs.Bezier?[b]=j$(_):r===zs.Step?[b]=ix({..._,borderRadius:0}):r===zs.SmoothStep?[b]=ix(_):r===zs.SimpleBezier?[b]=B$(_):b=`M${S},${v} ${l},${u}`,j.jsx("path",{d:b,fill:"none",className:"react-flow__connection-path",style:n})};SF.displayName="ConnectionLine";const u1e=e=>({nodeId:e.connectionNodeId,handleType:e.connectionHandleType,nodesConnectable:e.nodesConnectable,connectionStatus:e.connectionStatus,width:e.width,height:e.height});function c1e({containerStyle:e,style:t,type:n,component:r}){const{nodeId:i,handleType:o,nodesConnectable:s,width:a,height:l,connectionStatus:u}=Yt(u1e,Ar);return!(i&&o&&a&&s)?null:j.jsx("svg",{style:e,width:a,height:l,className:"react-flow__edges react-flow__connectionline react-flow__container",children:j.jsx("g",{className:yi(["react-flow__connection",u]),children:j.jsx(SF,{nodeId:i,handleType:o,style:t,type:n,CustomComponent:r,connectionStatus:u})})})}const _F=({nodeTypes:e,edgeTypes:t,onMove:n,onMoveStart:r,onMoveEnd:i,onInit:o,onNodeClick:s,onEdgeClick:a,onNodeDoubleClick:l,onEdgeDoubleClick:u,onNodeMouseEnter:c,onNodeMouseMove:d,onNodeMouseLeave:f,onNodeContextMenu:h,onSelectionContextMenu:p,onSelectionStart:m,onSelectionEnd:S,connectionLineType:v,connectionLineStyle:y,connectionLineComponent:g,connectionLineContainerStyle:b,selectionKeyCode:_,selectionOnDrag:w,selectionMode:x,multiSelectionKeyCode:C,panActivationKeyCode:k,zoomActivationKeyCode:P,deleteKeyCode:A,onlyRenderVisibleElements:$,elementsSelectable:M,selectNodesOnDrag:T,defaultViewport:O,translateExtent:I,minZoom:N,maxZoom:R,preventScrolling:D,defaultMarkerColor:L,zoomOnScroll:V,zoomOnPinch:z,panOnScroll:U,panOnScrollSpeed:K,panOnScrollMode:q,zoomOnDoubleClick:X,panOnDrag:F,onPaneClick:W,onPaneMouseEnter:Q,onPaneMouseMove:J,onPaneMouseLeave:ne,onPaneScroll:Z,onPaneContextMenu:ge,onEdgeUpdate:ae,onEdgeContextMenu:oe,onEdgeMouseEnter:Ce,onEdgeMouseMove:se,onEdgeMouseLeave:We,edgeUpdaterRadius:mt,onEdgeUpdateStart:$e,onEdgeUpdateEnd:Fe,noDragClassName:Ie,noWheelClassName:nt,noPanClassName:xt,elevateEdgesOnSelect:vn,disableKeyboardA11y:sn,nodeOrigin:Ot,nodeExtent:ee,rfId:be})=>(a1e(o),j.jsx(Gve,{onPaneClick:W,onPaneMouseEnter:Q,onPaneMouseMove:J,onPaneMouseLeave:ne,onPaneContextMenu:ge,onPaneScroll:Z,deleteKeyCode:A,selectionKeyCode:_,selectionOnDrag:w,selectionMode:x,onSelectionStart:m,onSelectionEnd:S,multiSelectionKeyCode:C,panActivationKeyCode:k,zoomActivationKeyCode:P,elementsSelectable:M,onMove:n,onMoveStart:r,onMoveEnd:i,zoomOnScroll:V,zoomOnPinch:z,zoomOnDoubleClick:X,panOnScroll:U,panOnScrollSpeed:K,panOnScrollMode:q,panOnDrag:F,defaultViewport:O,translateExtent:I,minZoom:N,maxZoom:R,onSelectionContextMenu:p,preventScrolling:D,noDragClassName:Ie,noWheelClassName:nt,noPanClassName:xt,disableKeyboardA11y:sn,children:j.jsxs(s1e,{children:[j.jsx(i1e,{edgeTypes:t,onEdgeClick:a,onEdgeDoubleClick:u,onEdgeUpdate:ae,onlyRenderVisibleElements:$,onEdgeContextMenu:oe,onEdgeMouseEnter:Ce,onEdgeMouseMove:se,onEdgeMouseLeave:We,onEdgeUpdateStart:$e,onEdgeUpdateEnd:Fe,edgeUpdaterRadius:mt,defaultMarkerColor:L,noPanClassName:xt,elevateEdgesOnSelect:!!vn,disableKeyboardA11y:sn,rfId:be,children:j.jsx(c1e,{style:y,type:v,component:g,containerStyle:b})}),j.jsx("div",{className:"react-flow__edgelabel-renderer"}),j.jsx(qve,{nodeTypes:e,onNodeClick:s,onNodeDoubleClick:l,onNodeMouseEnter:c,onNodeMouseMove:d,onNodeMouseLeave:f,onNodeContextMenu:h,selectNodesOnDrag:T,onlyRenderVisibleElements:$,noPanClassName:xt,noDragClassName:Ie,disableKeyboardA11y:sn,nodeOrigin:Ot,nodeExtent:ee,rfId:be})]})}));_F.displayName="GraphView";var d1e=E.memo(_F);const lx=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],Es={rfId:"1",width:0,height:0,transform:[0,0,1],nodeInternals:new Map,edges:[],onNodesChange:null,onEdgesChange:null,hasDefaultNodes:!1,hasDefaultEdges:!1,d3Zoom:null,d3Selection:null,d3ZoomHandler:void 0,minZoom:.5,maxZoom:2,translateExtent:lx,nodeExtent:lx,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionNodeId:null,connectionHandleId:null,connectionHandleType:"source",connectionPosition:{x:0,y:0},connectionStatus:null,connectionMode:El.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:[0,0],snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesUpdatable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,fitViewOnInit:!1,fitViewOnInitDone:!1,fitViewOnInitOptions:void 0,multiSelectionActive:!1,connectionStartHandle:null,connectionEndHandle:null,connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,connectionRadius:20,onError:B0e,isValidConnection:void 0},f1e=()=>Qpe((e,t)=>({...Es,setNodes:n=>{const{nodeInternals:r,nodeOrigin:i,elevateNodesOnSelect:o}=t();e({nodeInternals:g2(n,r,i,o)})},getNodes:()=>Array.from(t().nodeInternals.values()),setEdges:n=>{const{defaultEdgeOptions:r={}}=t();e({edges:n.map(i=>({...r,...i}))})},setDefaultNodesAndEdges:(n,r)=>{const i=typeof n<"u",o=typeof r<"u",s=i?g2(n,new Map,t().nodeOrigin,t().elevateNodesOnSelect):new Map;e({nodeInternals:s,edges:o?r:[],hasDefaultNodes:i,hasDefaultEdges:o})},updateNodeDimensions:n=>{const{onNodesChange:r,nodeInternals:i,fitViewOnInit:o,fitViewOnInitDone:s,fitViewOnInitOptions:a,domNode:l,nodeOrigin:u}=t(),c=l==null?void 0:l.querySelector(".react-flow__viewport");if(!c)return;const d=window.getComputedStyle(c),{m22:f}=new window.DOMMatrixReadOnly(d.transform),h=n.reduce((m,S)=>{const v=i.get(S.id);if(v){const y=O3(S.nodeElement);!!(y.width&&y.height&&(v.width!==y.width||v.height!==y.height||S.forceUpdate))&&(i.set(v.id,{...v,[pn]:{...v[pn],handleBounds:{source:d9(".source",S.nodeElement,f,u),target:d9(".target",S.nodeElement,f,u)}},...y}),m.push({id:v.id,type:"dimensions",dimensions:y}))}return m},[]);cF(i,u);const p=s||o&&!s&&dF(t,{initial:!0,...a});e({nodeInternals:new Map(i),fitViewOnInitDone:p}),(h==null?void 0:h.length)>0&&(r==null||r(h))},updateNodePositions:(n,r=!0,i=!1)=>{const{triggerNodeChanges:o}=t(),s=n.map(a=>{const l={id:a.id,type:"position",dragging:i};return r&&(l.positionAbsolute=a.positionAbsolute,l.position=a.position),l});o(s)},triggerNodeChanges:n=>{const{onNodesChange:r,nodeInternals:i,hasDefaultNodes:o,nodeOrigin:s,getNodes:a,elevateNodesOnSelect:l}=t();if(n!=null&&n.length){if(o){const u=pF(n,a()),c=g2(u,i,s,l);e({nodeInternals:c})}r==null||r(n)}},addSelectedNodes:n=>{const{multiSelectionActive:r,edges:i,getNodes:o}=t();let s,a=null;r?s=n.map(l=>Ls(l,!0)):(s=$u(o(),n),a=$u(i,[])),Ig({changedNodes:s,changedEdges:a,get:t,set:e})},addSelectedEdges:n=>{const{multiSelectionActive:r,edges:i,getNodes:o}=t();let s,a=null;r?s=n.map(l=>Ls(l,!0)):(s=$u(i,n),a=$u(o(),[])),Ig({changedNodes:a,changedEdges:s,get:t,set:e})},unselectNodesAndEdges:({nodes:n,edges:r}={})=>{const{edges:i,getNodes:o}=t(),s=n||o(),a=r||i,l=s.map(c=>(c.selected=!1,Ls(c.id,!1))),u=a.map(c=>Ls(c.id,!1));Ig({changedNodes:l,changedEdges:u,get:t,set:e})},setMinZoom:n=>{const{d3Zoom:r,maxZoom:i}=t();r==null||r.scaleExtent([n,i]),e({minZoom:n})},setMaxZoom:n=>{const{d3Zoom:r,minZoom:i}=t();r==null||r.scaleExtent([i,n]),e({maxZoom:n})},setTranslateExtent:n=>{var r;(r=t().d3Zoom)==null||r.translateExtent(n),e({translateExtent:n})},resetSelectedElements:()=>{const{edges:n,getNodes:r}=t(),o=r().filter(a=>a.selected).map(a=>Ls(a.id,!1)),s=n.filter(a=>a.selected).map(a=>Ls(a.id,!1));Ig({changedNodes:o,changedEdges:s,get:t,set:e})},setNodeExtent:n=>{const{nodeInternals:r}=t();r.forEach(i=>{i.positionAbsolute=R3(i.position,n)}),e({nodeExtent:n,nodeInternals:new Map(r)})},panBy:n=>{const{transform:r,width:i,height:o,d3Zoom:s,d3Selection:a,translateExtent:l}=t();if(!s||!a||!n.x&&!n.y)return!1;const u=ia.translate(r[0]+n.x,r[1]+n.y).scale(r[2]),c=[[0,0],[i,o]],d=s==null?void 0:s.constrain()(u,c,l);return s.transform(a,d),r[0]!==d.x||r[1]!==d.y||r[2]!==d.k},cancelConnection:()=>e({connectionNodeId:Es.connectionNodeId,connectionHandleId:Es.connectionHandleId,connectionHandleType:Es.connectionHandleType,connectionStatus:Es.connectionStatus,connectionStartHandle:Es.connectionStartHandle,connectionEndHandle:Es.connectionEndHandle}),reset:()=>e({...Es})})),wF=({children:e})=>{const t=E.useRef(null);return t.current||(t.current=f1e()),j.jsx(I0e,{value:t.current,children:e})};wF.displayName="ReactFlowProvider";const xF=({children:e})=>E.useContext(b1)?j.jsx(j.Fragment,{children:e}):j.jsx(wF,{children:e});xF.displayName="ReactFlowWrapper";function y9(e,t){return E.useRef(null),E.useMemo(()=>t(e),[e])}const h1e={input:J$,default:sx,output:tF,group:$3},p1e={default:o0,straight:M3,step:N3,smoothstep:S1,simplebezier:I3},g1e=[0,0],m1e=[15,15],y1e={x:0,y:0,zoom:1},v1e={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0},b1e=E.forwardRef(({nodes:e,edges:t,defaultNodes:n,defaultEdges:r,className:i,nodeTypes:o=h1e,edgeTypes:s=p1e,onNodeClick:a,onEdgeClick:l,onInit:u,onMove:c,onMoveStart:d,onMoveEnd:f,onConnect:h,onConnectStart:p,onConnectEnd:m,onClickConnectStart:S,onClickConnectEnd:v,onNodeMouseEnter:y,onNodeMouseMove:g,onNodeMouseLeave:b,onNodeContextMenu:_,onNodeDoubleClick:w,onNodeDragStart:x,onNodeDrag:C,onNodeDragStop:k,onNodesDelete:P,onEdgesDelete:A,onSelectionChange:$,onSelectionDragStart:M,onSelectionDrag:T,onSelectionDragStop:O,onSelectionContextMenu:I,onSelectionStart:N,onSelectionEnd:R,connectionMode:D=El.Strict,connectionLineType:L=zs.Bezier,connectionLineStyle:V,connectionLineComponent:z,connectionLineContainerStyle:U,deleteKeyCode:K="Backspace",selectionKeyCode:q="Shift",selectionOnDrag:X=!1,selectionMode:F=Ih.Full,panActivationKeyCode:W="Space",multiSelectionKeyCode:Q="Meta",zoomActivationKeyCode:J="Meta",snapToGrid:ne=!1,snapGrid:Z=m1e,onlyRenderVisibleElements:ge=!1,selectNodesOnDrag:ae=!0,nodesDraggable:oe,nodesConnectable:Ce,nodesFocusable:se,nodeOrigin:We=g1e,edgesFocusable:mt,edgesUpdatable:$e,elementsSelectable:Fe,defaultViewport:Ie=y1e,minZoom:nt=.5,maxZoom:xt=2,translateExtent:vn=lx,preventScrolling:sn=!0,nodeExtent:Ot,defaultMarkerColor:ee="#b1b1b7",zoomOnScroll:be=!0,zoomOnPinch:Te=!0,panOnScroll:Ne=!1,panOnScrollSpeed:ie=.5,panOnScrollMode:he=ic.Free,zoomOnDoubleClick:Zt=!0,panOnDrag:Rt=!0,onPaneClick:lt,onPaneMouseEnter:Zn,onPaneMouseMove:ko,onPaneMouseLeave:qr,onPaneScroll:Ao,onPaneContextMenu:ut,children:qe,onEdgeUpdate:An,onEdgeContextMenu:bn,onEdgeDoubleClick:Un,onEdgeMouseEnter:Jn,onEdgeMouseMove:hr,onEdgeMouseLeave:Vi,onEdgeUpdateStart:er,onEdgeUpdateEnd:On,edgeUpdaterRadius:Oo=10,onNodesChange:Ss,onEdgesChange:_s,noDragClassName:Kl="nodrag",noWheelClassName:Ro="nowheel",noPanClassName:tr="nopan",fitView:Ma=!1,fitViewOptions:Cb,connectOnClick:Tb=!0,attributionPosition:Eb,proOptions:Pb,defaultEdgeOptions:ws,elevateNodesOnSelect:kb=!0,elevateEdgesOnSelect:Ab=!1,disableKeyboardA11y:zp=!1,autoPanOnConnect:Ob=!0,autoPanOnNodeDrag:Rb=!0,connectionRadius:Ib=20,isValidConnection:ld,onError:Nb,style:Yl,id:Xl,...Mb},Ql)=>{const Up=y9(o,xve),Db=y9(s,yve),ud=Xl||"1";return j.jsx("div",{...Mb,style:{...Yl,...v1e},ref:Ql,className:yi(["react-flow",i]),"data-testid":"rf__wrapper",id:Xl,children:j.jsxs(xF,{children:[j.jsx(d1e,{onInit:u,onMove:c,onMoveStart:d,onMoveEnd:f,onNodeClick:a,onEdgeClick:l,onNodeMouseEnter:y,onNodeMouseMove:g,onNodeMouseLeave:b,onNodeContextMenu:_,onNodeDoubleClick:w,nodeTypes:Up,edgeTypes:Db,connectionLineType:L,connectionLineStyle:V,connectionLineComponent:z,connectionLineContainerStyle:U,selectionKeyCode:q,selectionOnDrag:X,selectionMode:F,deleteKeyCode:K,multiSelectionKeyCode:Q,panActivationKeyCode:W,zoomActivationKeyCode:J,onlyRenderVisibleElements:ge,selectNodesOnDrag:ae,defaultViewport:Ie,translateExtent:vn,minZoom:nt,maxZoom:xt,preventScrolling:sn,zoomOnScroll:be,zoomOnPinch:Te,zoomOnDoubleClick:Zt,panOnScroll:Ne,panOnScrollSpeed:ie,panOnScrollMode:he,panOnDrag:Rt,onPaneClick:lt,onPaneMouseEnter:Zn,onPaneMouseMove:ko,onPaneMouseLeave:qr,onPaneScroll:Ao,onPaneContextMenu:ut,onSelectionContextMenu:I,onSelectionStart:N,onSelectionEnd:R,onEdgeUpdate:An,onEdgeContextMenu:bn,onEdgeDoubleClick:Un,onEdgeMouseEnter:Jn,onEdgeMouseMove:hr,onEdgeMouseLeave:Vi,onEdgeUpdateStart:er,onEdgeUpdateEnd:On,edgeUpdaterRadius:Oo,defaultMarkerColor:ee,noDragClassName:Kl,noWheelClassName:Ro,noPanClassName:tr,elevateEdgesOnSelect:Ab,rfId:ud,disableKeyboardA11y:zp,nodeOrigin:We,nodeExtent:Ot}),j.jsx(lve,{nodes:e,edges:t,defaultNodes:n,defaultEdges:r,onConnect:h,onConnectStart:p,onConnectEnd:m,onClickConnectStart:S,onClickConnectEnd:v,nodesDraggable:oe,nodesConnectable:Ce,nodesFocusable:se,edgesFocusable:mt,edgesUpdatable:$e,elementsSelectable:Fe,elevateNodesOnSelect:kb,minZoom:nt,maxZoom:xt,nodeExtent:Ot,onNodesChange:Ss,onEdgesChange:_s,snapToGrid:ne,snapGrid:Z,connectionMode:D,translateExtent:vn,connectOnClick:Tb,defaultEdgeOptions:ws,fitView:Ma,fitViewOptions:Cb,onNodesDelete:P,onEdgesDelete:A,onNodeDragStart:x,onNodeDrag:C,onNodeDragStop:k,onSelectionDrag:T,onSelectionDragStart:M,onSelectionDragStop:O,noPanClassName:tr,nodeOrigin:We,rfId:ud,autoPanOnConnect:Ob,autoPanOnNodeDrag:Rb,onError:Nb,connectionRadius:Ib,isValidConnection:ld}),j.jsx(sve,{onSelectionChange:$}),qe,j.jsx(D0e,{proOptions:Pb,position:Eb}),j.jsx(hve,{rfId:ud,disableKeyboardA11y:zp})]})})});b1e.displayName="ReactFlow";const S1e=we.child({namespace:"schema"});function _1e(){const e=[];return function(t,n){if(typeof n!="object"||n===null)return n;for(;e.length>0&&e.at(-1)!==this;)e.pop();return e.includes(n)?"[Circular]":(e.push(n),n)}}const Mh=Hf("nodes/receivedOpenAPISchema",async(e,{dispatch:t,rejectWithValue:n})=>{try{const i=await(await fetch("openapi.json")).json();return S1e.info({openAPISchema:i},"Received OpenAPI schema"),JSON.parse(JSON.stringify(i,_1e()))}catch(r){return n({error:r})}}),ux={nodes:[],edges:[],schema:null,invocationTemplates:{},connectionStartParams:null,shouldShowGraphOverlay:!1},CF=Lt({name:"nodes",initialState:ux,reducers:{nodesChanged:(e,t)=>{e.nodes=pF(t.payload,e.nodes)},nodeAdded:(e,t)=>{e.nodes.push(t.payload)},edgesChanged:(e,t)=>{e.edges=Fve(t.payload,e.edges)},connectionStarted:(e,t)=>{e.connectionStartParams=t.payload},connectionMade:(e,t)=>{e.edges=V$(t.payload,e.edges)},connectionEnded:e=>{e.connectionStartParams=null},fieldValueChanged:(e,t)=>{const{nodeId:n,fieldName:r,value:i}=t.payload,o=e.nodes.findIndex(s=>s.id===n);o>-1&&(e.nodes[o].data.inputs[r].value=i)},imageCollectionFieldValueChanged:(e,t)=>{const{nodeId:n,fieldName:r,value:i}=t.payload,o=e.nodes.findIndex(a=>a.id===n);if(o===-1)return;const s=gr(e.nodes[o].data.inputs[r].value);if(!s){e.nodes[o].data.inputs[r].value=i;return}e.nodes[o].data.inputs[r].value=TZ(s.concat(i),"image_name")},shouldShowGraphOverlayChanged:(e,t)=>{e.shouldShowGraphOverlay=t.payload},nodeTemplatesBuilt:(e,t)=>{e.invocationTemplates=t.payload},nodeEditorReset:()=>({...ux})},extraReducers:e=>{e.addCase(Mh.fulfilled,(t,n)=>{t.schema=n.payload})}}),{nodesChanged:C8e,edgesChanged:T8e,nodeAdded:E8e,fieldValueChanged:cx,connectionMade:P8e,connectionStarted:k8e,connectionEnded:A8e,shouldShowGraphOverlayChanged:O8e,nodeTemplatesBuilt:B3,nodeEditorReset:TF,imageCollectionFieldValueChanged:w1e}=CF.actions,x1e=CF.reducer,C1e=e=>e.nodes,dx={codeformerFidelity:.75,facetoolStrength:.75,facetoolType:"gfpgan",hiresFix:!1,hiresStrength:.75,shouldLoopback:!1,shouldRunESRGAN:!1,shouldRunFacetool:!1,upscalingLevel:4,upscalingDenoising:.75,upscalingStrength:.75},EF=Lt({name:"postprocessing",initialState:dx,reducers:{setFacetoolStrength:(e,t)=>{e.facetoolStrength=t.payload},setCodeformerFidelity:(e,t)=>{e.codeformerFidelity=t.payload},setUpscalingLevel:(e,t)=>{e.upscalingLevel=t.payload},setUpscalingDenoising:(e,t)=>{e.upscalingDenoising=t.payload},setUpscalingStrength:(e,t)=>{e.upscalingStrength=t.payload},setHiresFix:(e,t)=>{e.hiresFix=t.payload},setHiresStrength:(e,t)=>{e.hiresStrength=t.payload},resetPostprocessingState:e=>({...e,...dx}),setShouldRunFacetool:(e,t)=>{e.shouldRunFacetool=t.payload},setFacetoolType:(e,t)=>{e.facetoolType=t.payload},setShouldRunESRGAN:(e,t)=>{e.shouldRunESRGAN=t.payload},setShouldLoopback:(e,t)=>{e.shouldLoopback=t.payload}}}),{resetPostprocessingState:R8e,setCodeformerFidelity:I8e,setFacetoolStrength:N8e,setFacetoolType:M8e,setHiresFix:D8e,setHiresStrength:L8e,setShouldLoopback:$8e,setShouldRunESRGAN:F8e,setShouldRunFacetool:B8e,setUpscalingLevel:j8e,setUpscalingDenoising:V8e,setUpscalingStrength:z8e}=EF.actions,T1e=EF.reducer,Op=me("app/userInvoked"),E1e={type:"logger",log(e){this.output("log",e)},warn(e){this.output("warn",e)},error(e){this.output("error",e)},output(e,t){console&&console[e]&&console[e].apply(console,t)}};class a0{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.init(t,n)}init(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.prefix=n.prefix||"i18next:",this.logger=t||E1e,this.options=n,this.debug=n.debug}log(){for(var t=arguments.length,n=new Array(t),r=0;r{this.observers[r]=this.observers[r]||[],this.observers[r].push(n)}),this}off(t,n){if(this.observers[t]){if(!n){delete this.observers[t];return}this.observers[t]=this.observers[t].filter(r=>r!==n)}}emit(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i{s(...r)}),this.observers["*"]&&[].concat(this.observers["*"]).forEach(s=>{s.apply(s,[t,...r])})}}function Nd(){let e,t;const n=new Promise((r,i)=>{e=r,t=i});return n.resolve=e,n.reject=t,n}function v9(e){return e==null?"":""+e}function P1e(e,t,n){e.forEach(r=>{t[r]&&(n[r]=t[r])})}function j3(e,t,n){function r(s){return s&&s.indexOf("###")>-1?s.replace(/###/g,"."):s}function i(){return!e||typeof e=="string"}const o=typeof t!="string"?[].concat(t):t.split(".");for(;o.length>1;){if(i())return{};const s=r(o.shift());!e[s]&&n&&(e[s]=new n),Object.prototype.hasOwnProperty.call(e,s)?e=e[s]:e={}}return i()?{}:{obj:e,k:r(o.shift())}}function b9(e,t,n){const{obj:r,k:i}=j3(e,t,Object);r[i]=n}function k1e(e,t,n,r){const{obj:i,k:o}=j3(e,t,Object);i[o]=i[o]||[],r&&(i[o]=i[o].concat(n)),r||i[o].push(n)}function l0(e,t){const{obj:n,k:r}=j3(e,t);if(n)return n[r]}function A1e(e,t,n){const r=l0(e,n);return r!==void 0?r:l0(t,n)}function PF(e,t,n){for(const r in t)r!=="__proto__"&&r!=="constructor"&&(r in e?typeof e[r]=="string"||e[r]instanceof String||typeof t[r]=="string"||t[r]instanceof String?n&&(e[r]=t[r]):PF(e[r],t[r],n):e[r]=t[r]);return e}function lu(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}var O1e={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/"};function R1e(e){return typeof e=="string"?e.replace(/[&<>"'\/]/g,t=>O1e[t]):e}const I1e=[" ",",","?","!",";"];function N1e(e,t,n){t=t||"",n=n||"";const r=I1e.filter(s=>t.indexOf(s)<0&&n.indexOf(s)<0);if(r.length===0)return!0;const i=new RegExp(`(${r.map(s=>s==="?"?"\\?":s).join("|")})`);let o=!i.test(e);if(!o){const s=e.indexOf(n);s>0&&!i.test(e.substring(0,s))&&(o=!0)}return o}function u0(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:".";if(!e)return;if(e[t])return e[t];const r=t.split(n);let i=e;for(let o=0;oo+s;)s++,a=r.slice(o,o+s).join(n),l=i[a];if(l===void 0)return;if(l===null)return null;if(t.endsWith(a)){if(typeof l=="string")return l;if(a&&typeof l[a]=="string")return l[a]}const u=r.slice(o+s).join(n);return u?u0(l,u,n):void 0}i=i[r[o]]}return i}function fx(e){return e&&e.indexOf("_")>0?e.replace("_","-"):e}class S9 extends _1{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{ns:["translation"],defaultNS:"translation"};super(),this.data=t||{},this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.options.ignoreJSONStructure===void 0&&(this.options.ignoreJSONStructure=!0)}addNamespaces(t){this.options.ns.indexOf(t)<0&&this.options.ns.push(t)}removeNamespaces(t){const n=this.options.ns.indexOf(t);n>-1&&this.options.ns.splice(n,1)}getResource(t,n,r){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};const o=i.keySeparator!==void 0?i.keySeparator:this.options.keySeparator,s=i.ignoreJSONStructure!==void 0?i.ignoreJSONStructure:this.options.ignoreJSONStructure;let a=[t,n];r&&typeof r!="string"&&(a=a.concat(r)),r&&typeof r=="string"&&(a=a.concat(o?r.split(o):r)),t.indexOf(".")>-1&&(a=t.split("."));const l=l0(this.data,a);return l||!s||typeof r!="string"?l:u0(this.data&&this.data[t]&&this.data[t][n],r,o)}addResource(t,n,r,i){let o=arguments.length>4&&arguments[4]!==void 0?arguments[4]:{silent:!1};const s=o.keySeparator!==void 0?o.keySeparator:this.options.keySeparator;let a=[t,n];r&&(a=a.concat(s?r.split(s):r)),t.indexOf(".")>-1&&(a=t.split("."),i=n,n=a[1]),this.addNamespaces(n),b9(this.data,a,i),o.silent||this.emit("added",t,n,r,i)}addResources(t,n,r){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{silent:!1};for(const o in r)(typeof r[o]=="string"||Object.prototype.toString.apply(r[o])==="[object Array]")&&this.addResource(t,n,o,r[o],{silent:!0});i.silent||this.emit("added",t,n,r)}addResourceBundle(t,n,r,i,o){let s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{silent:!1},a=[t,n];t.indexOf(".")>-1&&(a=t.split("."),i=r,r=n,n=a[1]),this.addNamespaces(n);let l=l0(this.data,a)||{};i?PF(l,r,o):l={...l,...r},b9(this.data,a,l),s.silent||this.emit("added",t,n,r)}removeResourceBundle(t,n){this.hasResourceBundle(t,n)&&delete this.data[t][n],this.removeNamespaces(n),this.emit("removed",t,n)}hasResourceBundle(t,n){return this.getResource(t,n)!==void 0}getResourceBundle(t,n){return n||(n=this.options.defaultNS),this.options.compatibilityAPI==="v1"?{...this.getResource(t,n)}:this.getResource(t,n)}getDataByLanguage(t){return this.data[t]}hasLanguageSomeTranslations(t){const n=this.getDataByLanguage(t);return!!(n&&Object.keys(n)||[]).find(i=>n[i]&&Object.keys(n[i]).length>0)}toJSON(){return this.data}}var kF={processors:{},addPostProcessor(e){this.processors[e.name]=e},handle(e,t,n,r,i){return e.forEach(o=>{this.processors[o]&&(t=this.processors[o].process(t,n,r,i))}),t}};const _9={};class c0 extends _1{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};super(),P1e(["resourceStore","languageUtils","pluralResolver","interpolator","backendConnector","i18nFormat","utils"],t,this),this.options=n,this.options.keySeparator===void 0&&(this.options.keySeparator="."),this.logger=io.create("translator")}changeLanguage(t){t&&(this.language=t)}exists(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}};if(t==null)return!1;const r=this.resolve(t,n);return r&&r.res!==void 0}extractFromKey(t,n){let r=n.nsSeparator!==void 0?n.nsSeparator:this.options.nsSeparator;r===void 0&&(r=":");const i=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator;let o=n.ns||this.options.defaultNS||[];const s=r&&t.indexOf(r)>-1,a=!this.options.userDefinedKeySeparator&&!n.keySeparator&&!this.options.userDefinedNsSeparator&&!n.nsSeparator&&!N1e(t,r,i);if(s&&!a){const l=t.match(this.interpolator.nestingRegexp);if(l&&l.length>0)return{key:t,namespaces:o};const u=t.split(r);(r!==i||r===i&&this.options.ns.indexOf(u[0])>-1)&&(o=u.shift()),t=u.join(i)}return typeof o=="string"&&(o=[o]),{key:t,namespaces:o}}translate(t,n,r){if(typeof n!="object"&&this.options.overloadTranslationOptionHandler&&(n=this.options.overloadTranslationOptionHandler(arguments)),typeof n=="object"&&(n={...n}),n||(n={}),t==null)return"";Array.isArray(t)||(t=[String(t)]);const i=n.returnDetails!==void 0?n.returnDetails:this.options.returnDetails,o=n.keySeparator!==void 0?n.keySeparator:this.options.keySeparator,{key:s,namespaces:a}=this.extractFromKey(t[t.length-1],n),l=a[a.length-1],u=n.lng||this.language,c=n.appendNamespaceToCIMode||this.options.appendNamespaceToCIMode;if(u&&u.toLowerCase()==="cimode"){if(c){const b=n.nsSeparator||this.options.nsSeparator;return i?{res:`${l}${b}${s}`,usedKey:s,exactUsedKey:s,usedLng:u,usedNS:l}:`${l}${b}${s}`}return i?{res:s,usedKey:s,exactUsedKey:s,usedLng:u,usedNS:l}:s}const d=this.resolve(t,n);let f=d&&d.res;const h=d&&d.usedKey||s,p=d&&d.exactUsedKey||s,m=Object.prototype.toString.apply(f),S=["[object Number]","[object Function]","[object RegExp]"],v=n.joinArrays!==void 0?n.joinArrays:this.options.joinArrays,y=!this.i18nFormat||this.i18nFormat.handleAsObject;if(y&&f&&(typeof f!="string"&&typeof f!="boolean"&&typeof f!="number")&&S.indexOf(m)<0&&!(typeof v=="string"&&m==="[object Array]")){if(!n.returnObjects&&!this.options.returnObjects){this.options.returnedObjectHandler||this.logger.warn("accessing an object - but returnObjects options is not enabled!");const b=this.options.returnedObjectHandler?this.options.returnedObjectHandler(h,f,{...n,ns:a}):`key '${s} (${this.language})' returned an object instead of string.`;return i?(d.res=b,d):b}if(o){const b=m==="[object Array]",_=b?[]:{},w=b?p:h;for(const x in f)if(Object.prototype.hasOwnProperty.call(f,x)){const C=`${w}${o}${x}`;_[x]=this.translate(C,{...n,joinArrays:!1,ns:a}),_[x]===C&&(_[x]=f[x])}f=_}}else if(y&&typeof v=="string"&&m==="[object Array]")f=f.join(v),f&&(f=this.extendTranslation(f,t,n,r));else{let b=!1,_=!1;const w=n.count!==void 0&&typeof n.count!="string",x=c0.hasDefaultValue(n),C=w?this.pluralResolver.getSuffix(u,n.count,n):"",k=n.ordinal&&w?this.pluralResolver.getSuffix(u,n.count,{ordinal:!1}):"",P=n[`defaultValue${C}`]||n[`defaultValue${k}`]||n.defaultValue;!this.isValidLookup(f)&&x&&(b=!0,f=P),this.isValidLookup(f)||(_=!0,f=s);const $=(n.missingKeyNoValueFallbackToKey||this.options.missingKeyNoValueFallbackToKey)&&_?void 0:f,M=x&&P!==f&&this.options.updateMissing;if(_||b||M){if(this.logger.log(M?"updateKey":"missingKey",u,l,s,M?P:f),o){const N=this.resolve(s,{...n,keySeparator:!1});N&&N.res&&this.logger.warn("Seems the loaded translations were in flat JSON format instead of nested. Either set keySeparator: false on init or make sure your translations are published in nested format.")}let T=[];const O=this.languageUtils.getFallbackCodes(this.options.fallbackLng,n.lng||this.language);if(this.options.saveMissingTo==="fallback"&&O&&O[0])for(let N=0;N{const L=x&&D!==f?D:$;this.options.missingKeyHandler?this.options.missingKeyHandler(N,l,R,L,M,n):this.backendConnector&&this.backendConnector.saveMissing&&this.backendConnector.saveMissing(N,l,R,L,M,n),this.emit("missingKey",N,l,R,f)};this.options.saveMissing&&(this.options.saveMissingPlurals&&w?T.forEach(N=>{this.pluralResolver.getSuffixes(N,n).forEach(R=>{I([N],s+R,n[`defaultValue${R}`]||P)})}):I(T,s,P))}f=this.extendTranslation(f,t,n,d,r),_&&f===s&&this.options.appendNamespaceToMissingKey&&(f=`${l}:${s}`),(_||b)&&this.options.parseMissingKeyHandler&&(this.options.compatibilityAPI!=="v1"?f=this.options.parseMissingKeyHandler(this.options.appendNamespaceToMissingKey?`${l}:${s}`:s,b?f:void 0):f=this.options.parseMissingKeyHandler(f))}return i?(d.res=f,d):f}extendTranslation(t,n,r,i,o){var s=this;if(this.i18nFormat&&this.i18nFormat.parse)t=this.i18nFormat.parse(t,{...this.options.interpolation.defaultVariables,...r},i.usedLng,i.usedNS,i.usedKey,{resolved:i});else if(!r.skipInterpolation){r.interpolation&&this.interpolator.init({...r,interpolation:{...this.options.interpolation,...r.interpolation}});const u=typeof t=="string"&&(r&&r.interpolation&&r.interpolation.skipOnVariables!==void 0?r.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables);let c;if(u){const f=t.match(this.interpolator.nestingRegexp);c=f&&f.length}let d=r.replace&&typeof r.replace!="string"?r.replace:r;if(this.options.interpolation.defaultVariables&&(d={...this.options.interpolation.defaultVariables,...d}),t=this.interpolator.interpolate(t,d,r.lng||this.language,r),u){const f=t.match(this.interpolator.nestingRegexp),h=f&&f.length;c1&&arguments[1]!==void 0?arguments[1]:{},r,i,o,s,a;return typeof t=="string"&&(t=[t]),t.forEach(l=>{if(this.isValidLookup(r))return;const u=this.extractFromKey(l,n),c=u.key;i=c;let d=u.namespaces;this.options.fallbackNS&&(d=d.concat(this.options.fallbackNS));const f=n.count!==void 0&&typeof n.count!="string",h=f&&!n.ordinal&&n.count===0&&this.pluralResolver.shouldUseIntlApi(),p=n.context!==void 0&&(typeof n.context=="string"||typeof n.context=="number")&&n.context!=="",m=n.lngs?n.lngs:this.languageUtils.toResolveHierarchy(n.lng||this.language,n.fallbackLng);d.forEach(S=>{this.isValidLookup(r)||(a=S,!_9[`${m[0]}-${S}`]&&this.utils&&this.utils.hasLoadedNamespace&&!this.utils.hasLoadedNamespace(a)&&(_9[`${m[0]}-${S}`]=!0,this.logger.warn(`key "${i}" for languages "${m.join(", ")}" won't get resolved as namespace "${a}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!")),m.forEach(v=>{if(this.isValidLookup(r))return;s=v;const y=[c];if(this.i18nFormat&&this.i18nFormat.addLookupKeys)this.i18nFormat.addLookupKeys(y,c,v,S,n);else{let b;f&&(b=this.pluralResolver.getSuffix(v,n.count,n));const _=`${this.options.pluralSeparator}zero`,w=`${this.options.pluralSeparator}ordinal${this.options.pluralSeparator}`;if(f&&(y.push(c+b),n.ordinal&&b.indexOf(w)===0&&y.push(c+b.replace(w,this.options.pluralSeparator)),h&&y.push(c+_)),p){const x=`${c}${this.options.contextSeparator}${n.context}`;y.push(x),f&&(y.push(x+b),n.ordinal&&b.indexOf(w)===0&&y.push(x+b.replace(w,this.options.pluralSeparator)),h&&y.push(x+_))}}let g;for(;g=y.pop();)this.isValidLookup(r)||(o=g,r=this.getResource(v,S,g,n))}))})}),{res:r,usedKey:i,exactUsedKey:o,usedLng:s,usedNS:a}}isValidLookup(t){return t!==void 0&&!(!this.options.returnNull&&t===null)&&!(!this.options.returnEmptyString&&t==="")}getResource(t,n,r){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return this.i18nFormat&&this.i18nFormat.getResource?this.i18nFormat.getResource(t,n,r,i):this.resourceStore.getResource(t,n,r,i)}static hasDefaultValue(t){const n="defaultValue";for(const r in t)if(Object.prototype.hasOwnProperty.call(t,r)&&n===r.substring(0,n.length)&&t[r]!==void 0)return!0;return!1}}function v2(e){return e.charAt(0).toUpperCase()+e.slice(1)}class w9{constructor(t){this.options=t,this.supportedLngs=this.options.supportedLngs||!1,this.logger=io.create("languageUtils")}getScriptPartFromCode(t){if(t=fx(t),!t||t.indexOf("-")<0)return null;const n=t.split("-");return n.length===2||(n.pop(),n[n.length-1].toLowerCase()==="x")?null:this.formatLanguageCode(n.join("-"))}getLanguagePartFromCode(t){if(t=fx(t),!t||t.indexOf("-")<0)return t;const n=t.split("-");return this.formatLanguageCode(n[0])}formatLanguageCode(t){if(typeof t=="string"&&t.indexOf("-")>-1){const n=["hans","hant","latn","cyrl","cans","mong","arab"];let r=t.split("-");return this.options.lowerCaseLng?r=r.map(i=>i.toLowerCase()):r.length===2?(r[0]=r[0].toLowerCase(),r[1]=r[1].toUpperCase(),n.indexOf(r[1].toLowerCase())>-1&&(r[1]=v2(r[1].toLowerCase()))):r.length===3&&(r[0]=r[0].toLowerCase(),r[1].length===2&&(r[1]=r[1].toUpperCase()),r[0]!=="sgn"&&r[2].length===2&&(r[2]=r[2].toUpperCase()),n.indexOf(r[1].toLowerCase())>-1&&(r[1]=v2(r[1].toLowerCase())),n.indexOf(r[2].toLowerCase())>-1&&(r[2]=v2(r[2].toLowerCase()))),r.join("-")}return this.options.cleanCode||this.options.lowerCaseLng?t.toLowerCase():t}isSupportedCode(t){return(this.options.load==="languageOnly"||this.options.nonExplicitSupportedLngs)&&(t=this.getLanguagePartFromCode(t)),!this.supportedLngs||!this.supportedLngs.length||this.supportedLngs.indexOf(t)>-1}getBestMatchFromCodes(t){if(!t)return null;let n;return t.forEach(r=>{if(n)return;const i=this.formatLanguageCode(r);(!this.options.supportedLngs||this.isSupportedCode(i))&&(n=i)}),!n&&this.options.supportedLngs&&t.forEach(r=>{if(n)return;const i=this.getLanguagePartFromCode(r);if(this.isSupportedCode(i))return n=i;n=this.options.supportedLngs.find(o=>{if(o===i)return o;if(!(o.indexOf("-")<0&&i.indexOf("-")<0)&&o.indexOf(i)===0)return o})}),n||(n=this.getFallbackCodes(this.options.fallbackLng)[0]),n}getFallbackCodes(t,n){if(!t)return[];if(typeof t=="function"&&(t=t(n)),typeof t=="string"&&(t=[t]),Object.prototype.toString.apply(t)==="[object Array]")return t;if(!n)return t.default||[];let r=t[n];return r||(r=t[this.getScriptPartFromCode(n)]),r||(r=t[this.formatLanguageCode(n)]),r||(r=t[this.getLanguagePartFromCode(n)]),r||(r=t.default),r||[]}toResolveHierarchy(t,n){const r=this.getFallbackCodes(n||this.options.fallbackLng||[],t),i=[],o=s=>{s&&(this.isSupportedCode(s)?i.push(s):this.logger.warn(`rejecting language code not found in supportedLngs: ${s}`))};return typeof t=="string"&&(t.indexOf("-")>-1||t.indexOf("_")>-1)?(this.options.load!=="languageOnly"&&o(this.formatLanguageCode(t)),this.options.load!=="languageOnly"&&this.options.load!=="currentOnly"&&o(this.getScriptPartFromCode(t)),this.options.load!=="currentOnly"&&o(this.getLanguagePartFromCode(t))):typeof t=="string"&&o(this.formatLanguageCode(t)),r.forEach(s=>{i.indexOf(s)<0&&o(this.formatLanguageCode(s))}),i}}let M1e=[{lngs:["ach","ak","am","arn","br","fil","gun","ln","mfe","mg","mi","oc","pt","pt-BR","tg","tl","ti","tr","uz","wa"],nr:[1,2],fc:1},{lngs:["af","an","ast","az","bg","bn","ca","da","de","dev","el","en","eo","es","et","eu","fi","fo","fur","fy","gl","gu","ha","hi","hu","hy","ia","it","kk","kn","ku","lb","mai","ml","mn","mr","nah","nap","nb","ne","nl","nn","no","nso","pa","pap","pms","ps","pt-PT","rm","sco","se","si","so","son","sq","sv","sw","ta","te","tk","ur","yo"],nr:[1,2],fc:2},{lngs:["ay","bo","cgg","fa","ht","id","ja","jbo","ka","km","ko","ky","lo","ms","sah","su","th","tt","ug","vi","wo","zh"],nr:[1],fc:3},{lngs:["be","bs","cnr","dz","hr","ru","sr","uk"],nr:[1,2,5],fc:4},{lngs:["ar"],nr:[0,1,2,3,11,100],fc:5},{lngs:["cs","sk"],nr:[1,2,5],fc:6},{lngs:["csb","pl"],nr:[1,2,5],fc:7},{lngs:["cy"],nr:[1,2,3,8],fc:8},{lngs:["fr"],nr:[1,2],fc:9},{lngs:["ga"],nr:[1,2,3,7,11],fc:10},{lngs:["gd"],nr:[1,2,3,20],fc:11},{lngs:["is"],nr:[1,2],fc:12},{lngs:["jv"],nr:[0,1],fc:13},{lngs:["kw"],nr:[1,2,3,4],fc:14},{lngs:["lt"],nr:[1,2,10],fc:15},{lngs:["lv"],nr:[1,2,0],fc:16},{lngs:["mk"],nr:[1,2],fc:17},{lngs:["mnk"],nr:[0,1,2],fc:18},{lngs:["mt"],nr:[1,2,11,20],fc:19},{lngs:["or"],nr:[2,1],fc:2},{lngs:["ro"],nr:[1,2,20],fc:20},{lngs:["sl"],nr:[5,1,2,3],fc:21},{lngs:["he","iw"],nr:[1,2,20,21],fc:22}],D1e={1:function(e){return+(e>1)},2:function(e){return+(e!=1)},3:function(e){return 0},4:function(e){return e%10==1&&e%100!=11?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2},5:function(e){return e==0?0:e==1?1:e==2?2:e%100>=3&&e%100<=10?3:e%100>=11?4:5},6:function(e){return e==1?0:e>=2&&e<=4?1:2},7:function(e){return e==1?0:e%10>=2&&e%10<=4&&(e%100<10||e%100>=20)?1:2},8:function(e){return e==1?0:e==2?1:e!=8&&e!=11?2:3},9:function(e){return+(e>=2)},10:function(e){return e==1?0:e==2?1:e<7?2:e<11?3:4},11:function(e){return e==1||e==11?0:e==2||e==12?1:e>2&&e<20?2:3},12:function(e){return+(e%10!=1||e%100==11)},13:function(e){return+(e!==0)},14:function(e){return e==1?0:e==2?1:e==3?2:3},15:function(e){return e%10==1&&e%100!=11?0:e%10>=2&&(e%100<10||e%100>=20)?1:2},16:function(e){return e%10==1&&e%100!=11?0:e!==0?1:2},17:function(e){return e==1||e%10==1&&e%100!=11?0:1},18:function(e){return e==0?0:e==1?1:2},19:function(e){return e==1?0:e==0||e%100>1&&e%100<11?1:e%100>10&&e%100<20?2:3},20:function(e){return e==1?0:e==0||e%100>0&&e%100<20?1:2},21:function(e){return e%100==1?1:e%100==2?2:e%100==3||e%100==4?3:0},22:function(e){return e==1?0:e==2?1:(e<0||e>10)&&e%10==0?2:3}};const L1e=["v1","v2","v3"],$1e=["v4"],x9={zero:0,one:1,two:2,few:3,many:4,other:5};function F1e(){const e={};return M1e.forEach(t=>{t.lngs.forEach(n=>{e[n]={numbers:t.nr,plurals:D1e[t.fc]}})}),e}class B1e{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.languageUtils=t,this.options=n,this.logger=io.create("pluralResolver"),(!this.options.compatibilityJSON||$1e.includes(this.options.compatibilityJSON))&&(typeof Intl>"u"||!Intl.PluralRules)&&(this.options.compatibilityJSON="v3",this.logger.error("Your environment seems not to be Intl API compatible, use an Intl.PluralRules polyfill. Will fallback to the compatibilityJSON v3 format handling.")),this.rules=F1e()}addRule(t,n){this.rules[t]=n}getRule(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(this.shouldUseIntlApi())try{return new Intl.PluralRules(fx(t),{type:n.ordinal?"ordinal":"cardinal"})}catch{return}return this.rules[t]||this.rules[this.languageUtils.getLanguagePartFromCode(t)]}needsPlural(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const r=this.getRule(t,n);return this.shouldUseIntlApi()?r&&r.resolvedOptions().pluralCategories.length>1:r&&r.numbers.length>1}getPluralFormsOfKey(t,n){let r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return this.getSuffixes(t,r).map(i=>`${n}${i}`)}getSuffixes(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};const r=this.getRule(t,n);return r?this.shouldUseIntlApi()?r.resolvedOptions().pluralCategories.sort((i,o)=>x9[i]-x9[o]).map(i=>`${this.options.prepend}${n.ordinal?`ordinal${this.options.prepend}`:""}${i}`):r.numbers.map(i=>this.getSuffix(t,i,n)):[]}getSuffix(t,n){let r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};const i=this.getRule(t,r);return i?this.shouldUseIntlApi()?`${this.options.prepend}${r.ordinal?`ordinal${this.options.prepend}`:""}${i.select(n)}`:this.getSuffixRetroCompatible(i,n):(this.logger.warn(`no plural rule found for: ${t}`),"")}getSuffixRetroCompatible(t,n){const r=t.noAbs?t.plurals(n):t.plurals(Math.abs(n));let i=t.numbers[r];this.options.simplifyPluralSuffix&&t.numbers.length===2&&t.numbers[0]===1&&(i===2?i="plural":i===1&&(i=""));const o=()=>this.options.prepend&&i.toString()?this.options.prepend+i.toString():i.toString();return this.options.compatibilityJSON==="v1"?i===1?"":typeof i=="number"?`_plural_${i.toString()}`:o():this.options.compatibilityJSON==="v2"||this.options.simplifyPluralSuffix&&t.numbers.length===2&&t.numbers[0]===1?o():this.options.prepend&&r.toString()?this.options.prepend+r.toString():r.toString()}shouldUseIntlApi(){return!L1e.includes(this.options.compatibilityJSON)}}function C9(e,t,n){let r=arguments.length>3&&arguments[3]!==void 0?arguments[3]:".",i=arguments.length>4&&arguments[4]!==void 0?arguments[4]:!0,o=A1e(e,t,n);return!o&&i&&typeof n=="string"&&(o=u0(e,n,r),o===void 0&&(o=u0(t,n,r))),o}class j1e{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.logger=io.create("interpolator"),this.options=t,this.format=t.interpolation&&t.interpolation.format||(n=>n),this.init(t)}init(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};t.interpolation||(t.interpolation={escapeValue:!0});const n=t.interpolation;this.escape=n.escape!==void 0?n.escape:R1e,this.escapeValue=n.escapeValue!==void 0?n.escapeValue:!0,this.useRawValueToEscape=n.useRawValueToEscape!==void 0?n.useRawValueToEscape:!1,this.prefix=n.prefix?lu(n.prefix):n.prefixEscaped||"{{",this.suffix=n.suffix?lu(n.suffix):n.suffixEscaped||"}}",this.formatSeparator=n.formatSeparator?n.formatSeparator:n.formatSeparator||",",this.unescapePrefix=n.unescapeSuffix?"":n.unescapePrefix||"-",this.unescapeSuffix=this.unescapePrefix?"":n.unescapeSuffix||"",this.nestingPrefix=n.nestingPrefix?lu(n.nestingPrefix):n.nestingPrefixEscaped||lu("$t("),this.nestingSuffix=n.nestingSuffix?lu(n.nestingSuffix):n.nestingSuffixEscaped||lu(")"),this.nestingOptionsSeparator=n.nestingOptionsSeparator?n.nestingOptionsSeparator:n.nestingOptionsSeparator||",",this.maxReplaces=n.maxReplaces?n.maxReplaces:1e3,this.alwaysFormat=n.alwaysFormat!==void 0?n.alwaysFormat:!1,this.resetRegExp()}reset(){this.options&&this.init(this.options)}resetRegExp(){const t=`${this.prefix}(.+?)${this.suffix}`;this.regexp=new RegExp(t,"g");const n=`${this.prefix}${this.unescapePrefix}(.+?)${this.unescapeSuffix}${this.suffix}`;this.regexpUnescape=new RegExp(n,"g");const r=`${this.nestingPrefix}(.+?)${this.nestingSuffix}`;this.nestingRegexp=new RegExp(r,"g")}interpolate(t,n,r,i){let o,s,a;const l=this.options&&this.options.interpolation&&this.options.interpolation.defaultVariables||{};function u(p){return p.replace(/\$/g,"$$$$")}const c=p=>{if(p.indexOf(this.formatSeparator)<0){const y=C9(n,l,p,this.options.keySeparator,this.options.ignoreJSONStructure);return this.alwaysFormat?this.format(y,void 0,r,{...i,...n,interpolationkey:p}):y}const m=p.split(this.formatSeparator),S=m.shift().trim(),v=m.join(this.formatSeparator).trim();return this.format(C9(n,l,S,this.options.keySeparator,this.options.ignoreJSONStructure),v,r,{...i,...n,interpolationkey:S})};this.resetRegExp();const d=i&&i.missingInterpolationHandler||this.options.missingInterpolationHandler,f=i&&i.interpolation&&i.interpolation.skipOnVariables!==void 0?i.interpolation.skipOnVariables:this.options.interpolation.skipOnVariables;return[{regex:this.regexpUnescape,safeValue:p=>u(p)},{regex:this.regexp,safeValue:p=>this.escapeValue?u(this.escape(p)):u(p)}].forEach(p=>{for(a=0;o=p.regex.exec(t);){const m=o[1].trim();if(s=c(m),s===void 0)if(typeof d=="function"){const v=d(t,o,i);s=typeof v=="string"?v:""}else if(i&&Object.prototype.hasOwnProperty.call(i,m))s="";else if(f){s=o[0];continue}else this.logger.warn(`missed to pass in variable ${m} for interpolating ${t}`),s="";else typeof s!="string"&&!this.useRawValueToEscape&&(s=v9(s));const S=p.safeValue(s);if(t=t.replace(o[0],S),f?(p.regex.lastIndex+=s.length,p.regex.lastIndex-=o[0].length):p.regex.lastIndex=0,a++,a>=this.maxReplaces)break}}),t}nest(t,n){let r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},i,o,s;function a(l,u){const c=this.nestingOptionsSeparator;if(l.indexOf(c)<0)return l;const d=l.split(new RegExp(`${c}[ ]*{`));let f=`{${d[1]}`;l=d[0],f=this.interpolate(f,s);const h=f.match(/'/g),p=f.match(/"/g);(h&&h.length%2===0&&!p||p.length%2!==0)&&(f=f.replace(/'/g,'"'));try{s=JSON.parse(f),u&&(s={...u,...s})}catch(m){return this.logger.warn(`failed parsing options string in nesting for key ${l}`,m),`${l}${c}${f}`}return delete s.defaultValue,l}for(;i=this.nestingRegexp.exec(t);){let l=[];s={...r},s=s.replace&&typeof s.replace!="string"?s.replace:s,s.applyPostProcessor=!1,delete s.defaultValue;let u=!1;if(i[0].indexOf(this.formatSeparator)!==-1&&!/{.*}/.test(i[1])){const c=i[1].split(this.formatSeparator).map(d=>d.trim());i[1]=c.shift(),l=c,u=!0}if(o=n(a.call(this,i[1].trim(),s),s),o&&i[0]===t&&typeof o!="string")return o;typeof o!="string"&&(o=v9(o)),o||(this.logger.warn(`missed to resolve ${i[1]} for nesting ${t}`),o=""),u&&(o=l.reduce((c,d)=>this.format(c,d,r.lng,{...r,interpolationkey:i[1].trim()}),o.trim())),t=t.replace(i[0],o),this.regexp.lastIndex=0}return t}}function V1e(e){let t=e.toLowerCase().trim();const n={};if(e.indexOf("(")>-1){const r=e.split("(");t=r[0].toLowerCase().trim();const i=r[1].substring(0,r[1].length-1);t==="currency"&&i.indexOf(":")<0?n.currency||(n.currency=i.trim()):t==="relativetime"&&i.indexOf(":")<0?n.range||(n.range=i.trim()):i.split(";").forEach(s=>{if(!s)return;const[a,...l]=s.split(":"),u=l.join(":").trim().replace(/^'+|'+$/g,"");n[a.trim()]||(n[a.trim()]=u),u==="false"&&(n[a.trim()]=!1),u==="true"&&(n[a.trim()]=!0),isNaN(u)||(n[a.trim()]=parseInt(u,10))})}return{formatName:t,formatOptions:n}}function uu(e){const t={};return function(r,i,o){const s=i+JSON.stringify(o);let a=t[s];return a||(a=e(i,o),t[s]=a),a(r)}}class z1e{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.logger=io.create("formatter"),this.options=t,this.formats={number:uu((n,r)=>{const i=new Intl.NumberFormat(n,{...r});return o=>i.format(o)}),currency:uu((n,r)=>{const i=new Intl.NumberFormat(n,{...r,style:"currency"});return o=>i.format(o)}),datetime:uu((n,r)=>{const i=new Intl.DateTimeFormat(n,{...r});return o=>i.format(o)}),relativetime:uu((n,r)=>{const i=new Intl.RelativeTimeFormat(n,{...r});return o=>i.format(o,r.range||"day")}),list:uu((n,r)=>{const i=new Intl.ListFormat(n,{...r});return o=>i.format(o)})},this.init(t)}init(t){const r=(arguments.length>1&&arguments[1]!==void 0?arguments[1]:{interpolation:{}}).interpolation;this.formatSeparator=r.formatSeparator?r.formatSeparator:r.formatSeparator||","}add(t,n){this.formats[t.toLowerCase().trim()]=n}addCached(t,n){this.formats[t.toLowerCase().trim()]=uu(n)}format(t,n,r){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};return n.split(this.formatSeparator).reduce((a,l)=>{const{formatName:u,formatOptions:c}=V1e(l);if(this.formats[u]){let d=a;try{const f=i&&i.formatParams&&i.formatParams[i.interpolationkey]||{},h=f.locale||f.lng||i.locale||i.lng||r;d=this.formats[u](a,h,{...c,...i,...f})}catch(f){this.logger.warn(f)}return d}else this.logger.warn(`there was no format function for ${u}`);return a},t)}}function U1e(e,t){e.pending[t]!==void 0&&(delete e.pending[t],e.pendingCount--)}class G1e extends _1{constructor(t,n,r){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{};super(),this.backend=t,this.store=n,this.services=r,this.languageUtils=r.languageUtils,this.options=i,this.logger=io.create("backendConnector"),this.waitingReads=[],this.maxParallelReads=i.maxParallelReads||10,this.readingCalls=0,this.maxRetries=i.maxRetries>=0?i.maxRetries:5,this.retryTimeout=i.retryTimeout>=1?i.retryTimeout:350,this.state={},this.queue=[],this.backend&&this.backend.init&&this.backend.init(r,i.backend,i)}queueLoad(t,n,r,i){const o={},s={},a={},l={};return t.forEach(u=>{let c=!0;n.forEach(d=>{const f=`${u}|${d}`;!r.reload&&this.store.hasResourceBundle(u,d)?this.state[f]=2:this.state[f]<0||(this.state[f]===1?s[f]===void 0&&(s[f]=!0):(this.state[f]=1,c=!1,s[f]===void 0&&(s[f]=!0),o[f]===void 0&&(o[f]=!0),l[d]===void 0&&(l[d]=!0)))}),c||(a[u]=!0)}),(Object.keys(o).length||Object.keys(s).length)&&this.queue.push({pending:s,pendingCount:Object.keys(s).length,loaded:{},errors:[],callback:i}),{toLoad:Object.keys(o),pending:Object.keys(s),toLoadLanguages:Object.keys(a),toLoadNamespaces:Object.keys(l)}}loaded(t,n,r){const i=t.split("|"),o=i[0],s=i[1];n&&this.emit("failedLoading",o,s,n),r&&this.store.addResourceBundle(o,s,r),this.state[t]=n?-1:2;const a={};this.queue.forEach(l=>{k1e(l.loaded,[o],s),U1e(l,t),n&&l.errors.push(n),l.pendingCount===0&&!l.done&&(Object.keys(l.loaded).forEach(u=>{a[u]||(a[u]={});const c=l.loaded[u];c.length&&c.forEach(d=>{a[u][d]===void 0&&(a[u][d]=!0)})}),l.done=!0,l.errors.length?l.callback(l.errors):l.callback())}),this.emit("loaded",a),this.queue=this.queue.filter(l=>!l.done)}read(t,n,r){let i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:0,o=arguments.length>4&&arguments[4]!==void 0?arguments[4]:this.retryTimeout,s=arguments.length>5?arguments[5]:void 0;if(!t.length)return s(null,{});if(this.readingCalls>=this.maxParallelReads){this.waitingReads.push({lng:t,ns:n,fcName:r,tried:i,wait:o,callback:s});return}this.readingCalls++;const a=(u,c)=>{if(this.readingCalls--,this.waitingReads.length>0){const d=this.waitingReads.shift();this.read(d.lng,d.ns,d.fcName,d.tried,d.wait,d.callback)}if(u&&c&&i{this.read.call(this,t,n,r,i+1,o*2,s)},o);return}s(u,c)},l=this.backend[r].bind(this.backend);if(l.length===2){try{const u=l(t,n);u&&typeof u.then=="function"?u.then(c=>a(null,c)).catch(a):a(null,u)}catch(u){a(u)}return}return l(t,n,a)}prepareLoading(t,n){let r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},i=arguments.length>3?arguments[3]:void 0;if(!this.backend)return this.logger.warn("No backend was added via i18next.use. Will not load resources."),i&&i();typeof t=="string"&&(t=this.languageUtils.toResolveHierarchy(t)),typeof n=="string"&&(n=[n]);const o=this.queueLoad(t,n,r,i);if(!o.toLoad.length)return o.pending.length||i(),null;o.toLoad.forEach(s=>{this.loadOne(s)})}load(t,n,r){this.prepareLoading(t,n,{},r)}reload(t,n,r){this.prepareLoading(t,n,{reload:!0},r)}loadOne(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"";const r=t.split("|"),i=r[0],o=r[1];this.read(i,o,"read",void 0,void 0,(s,a)=>{s&&this.logger.warn(`${n}loading namespace ${o} for language ${i} failed`,s),!s&&a&&this.logger.log(`${n}loaded namespace ${o} for language ${i}`,a),this.loaded(t,s,a)})}saveMissing(t,n,r,i,o){let s=arguments.length>5&&arguments[5]!==void 0?arguments[5]:{},a=arguments.length>6&&arguments[6]!==void 0?arguments[6]:()=>{};if(this.services.utils&&this.services.utils.hasLoadedNamespace&&!this.services.utils.hasLoadedNamespace(n)){this.logger.warn(`did not save key "${r}" as the namespace "${n}" was not yet loaded`,"This means something IS WRONG in your setup. You access the t function before i18next.init / i18next.loadNamespace / i18next.changeLanguage was done. Wait for the callback or Promise to resolve before accessing it!!!");return}if(!(r==null||r==="")){if(this.backend&&this.backend.create){const l={...s,isUpdate:o},u=this.backend.create.bind(this.backend);if(u.length<6)try{let c;u.length===5?c=u(t,n,r,i,l):c=u(t,n,r,i),c&&typeof c.then=="function"?c.then(d=>a(null,d)).catch(a):a(null,c)}catch(c){a(c)}else u(t,n,r,i,a,l)}!t||!t[0]||this.store.addResource(t[0],n,r,i)}}}function T9(){return{debug:!1,initImmediate:!0,ns:["translation"],defaultNS:["translation"],fallbackLng:["dev"],fallbackNS:!1,supportedLngs:!1,nonExplicitSupportedLngs:!1,load:"all",preload:!1,simplifyPluralSuffix:!0,keySeparator:".",nsSeparator:":",pluralSeparator:"_",contextSeparator:"_",partialBundledLanguages:!1,saveMissing:!1,updateMissing:!1,saveMissingTo:"fallback",saveMissingPlurals:!0,missingKeyHandler:!1,missingInterpolationHandler:!1,postProcess:!1,postProcessPassResolved:!1,returnNull:!1,returnEmptyString:!0,returnObjects:!1,joinArrays:!1,returnedObjectHandler:!1,parseMissingKeyHandler:!1,appendNamespaceToMissingKey:!1,appendNamespaceToCIMode:!1,overloadTranslationOptionHandler:function(t){let n={};if(typeof t[1]=="object"&&(n=t[1]),typeof t[1]=="string"&&(n.defaultValue=t[1]),typeof t[2]=="string"&&(n.tDescription=t[2]),typeof t[2]=="object"||typeof t[3]=="object"){const r=t[3]||t[2];Object.keys(r).forEach(i=>{n[i]=r[i]})}return n},interpolation:{escapeValue:!0,format:(e,t,n,r)=>e,prefix:"{{",suffix:"}}",formatSeparator:",",unescapePrefix:"-",nestingPrefix:"$t(",nestingSuffix:")",nestingOptionsSeparator:",",maxReplaces:1e3,skipOnVariables:!0}}}function E9(e){return typeof e.ns=="string"&&(e.ns=[e.ns]),typeof e.fallbackLng=="string"&&(e.fallbackLng=[e.fallbackLng]),typeof e.fallbackNS=="string"&&(e.fallbackNS=[e.fallbackNS]),e.supportedLngs&&e.supportedLngs.indexOf("cimode")<0&&(e.supportedLngs=e.supportedLngs.concat(["cimode"])),e}function Ng(){}function H1e(e){Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach(n=>{typeof e[n]=="function"&&(e[n]=e[n].bind(e))})}class Dh extends _1{constructor(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;if(super(),this.options=E9(t),this.services={},this.logger=io,this.modules={external:[]},H1e(this),n&&!this.isInitialized&&!t.isClone){if(!this.options.initImmediate)return this.init(t,n),this;setTimeout(()=>{this.init(t,n)},0)}}init(){var t=this;let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},r=arguments.length>1?arguments[1]:void 0;typeof n=="function"&&(r=n,n={}),!n.defaultNS&&n.defaultNS!==!1&&n.ns&&(typeof n.ns=="string"?n.defaultNS=n.ns:n.ns.indexOf("translation")<0&&(n.defaultNS=n.ns[0]));const i=T9();this.options={...i,...this.options,...E9(n)},this.options.compatibilityAPI!=="v1"&&(this.options.interpolation={...i.interpolation,...this.options.interpolation}),n.keySeparator!==void 0&&(this.options.userDefinedKeySeparator=n.keySeparator),n.nsSeparator!==void 0&&(this.options.userDefinedNsSeparator=n.nsSeparator);function o(c){return c?typeof c=="function"?new c:c:null}if(!this.options.isClone){this.modules.logger?io.init(o(this.modules.logger),this.options):io.init(null,this.options);let c;this.modules.formatter?c=this.modules.formatter:typeof Intl<"u"&&(c=z1e);const d=new w9(this.options);this.store=new S9(this.options.resources,this.options);const f=this.services;f.logger=io,f.resourceStore=this.store,f.languageUtils=d,f.pluralResolver=new B1e(d,{prepend:this.options.pluralSeparator,compatibilityJSON:this.options.compatibilityJSON,simplifyPluralSuffix:this.options.simplifyPluralSuffix}),c&&(!this.options.interpolation.format||this.options.interpolation.format===i.interpolation.format)&&(f.formatter=o(c),f.formatter.init(f,this.options),this.options.interpolation.format=f.formatter.format.bind(f.formatter)),f.interpolator=new j1e(this.options),f.utils={hasLoadedNamespace:this.hasLoadedNamespace.bind(this)},f.backendConnector=new G1e(o(this.modules.backend),f.resourceStore,f,this.options),f.backendConnector.on("*",function(h){for(var p=arguments.length,m=new Array(p>1?p-1:0),S=1;S1?p-1:0),S=1;S{h.init&&h.init(this)})}if(this.format=this.options.interpolation.format,r||(r=Ng),this.options.fallbackLng&&!this.services.languageDetector&&!this.options.lng){const c=this.services.languageUtils.getFallbackCodes(this.options.fallbackLng);c.length>0&&c[0]!=="dev"&&(this.options.lng=c[0])}!this.services.languageDetector&&!this.options.lng&&this.logger.warn("init: no languageDetector is used and no lng is defined"),["getResource","hasResourceBundle","getResourceBundle","getDataByLanguage"].forEach(c=>{this[c]=function(){return t.store[c](...arguments)}}),["addResource","addResources","addResourceBundle","removeResourceBundle"].forEach(c=>{this[c]=function(){return t.store[c](...arguments),t}});const l=Nd(),u=()=>{const c=(d,f)=>{this.isInitialized&&!this.initializedStoreOnce&&this.logger.warn("init: i18next is already initialized. You should call init just once!"),this.isInitialized=!0,this.options.isClone||this.logger.log("initialized",this.options),this.emit("initialized",this.options),l.resolve(f),r(d,f)};if(this.languages&&this.options.compatibilityAPI!=="v1"&&!this.isInitialized)return c(null,this.t.bind(this));this.changeLanguage(this.options.lng,c)};return this.options.resources||!this.options.initImmediate?u():setTimeout(u,0),l}loadResources(t){let r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Ng;const i=typeof t=="string"?t:this.language;if(typeof t=="function"&&(r=t),!this.options.resources||this.options.partialBundledLanguages){if(i&&i.toLowerCase()==="cimode")return r();const o=[],s=a=>{if(!a)return;this.services.languageUtils.toResolveHierarchy(a).forEach(u=>{o.indexOf(u)<0&&o.push(u)})};i?s(i):this.services.languageUtils.getFallbackCodes(this.options.fallbackLng).forEach(l=>s(l)),this.options.preload&&this.options.preload.forEach(a=>s(a)),this.services.backendConnector.load(o,this.options.ns,a=>{!a&&!this.resolvedLanguage&&this.language&&this.setResolvedLanguage(this.language),r(a)})}else r(null)}reloadResources(t,n,r){const i=Nd();return t||(t=this.languages),n||(n=this.options.ns),r||(r=Ng),this.services.backendConnector.reload(t,n,o=>{i.resolve(),r(o)}),i}use(t){if(!t)throw new Error("You are passing an undefined module! Please check the object you are passing to i18next.use()");if(!t.type)throw new Error("You are passing a wrong module! Please check the object you are passing to i18next.use()");return t.type==="backend"&&(this.modules.backend=t),(t.type==="logger"||t.log&&t.warn&&t.error)&&(this.modules.logger=t),t.type==="languageDetector"&&(this.modules.languageDetector=t),t.type==="i18nFormat"&&(this.modules.i18nFormat=t),t.type==="postProcessor"&&kF.addPostProcessor(t),t.type==="formatter"&&(this.modules.formatter=t),t.type==="3rdParty"&&this.modules.external.push(t),this}setResolvedLanguage(t){if(!(!t||!this.languages)&&!(["cimode","dev"].indexOf(t)>-1))for(let n=0;n-1)&&this.store.hasLanguageSomeTranslations(r)){this.resolvedLanguage=r;break}}}changeLanguage(t,n){var r=this;this.isLanguageChangingTo=t;const i=Nd();this.emit("languageChanging",t);const o=l=>{this.language=l,this.languages=this.services.languageUtils.toResolveHierarchy(l),this.resolvedLanguage=void 0,this.setResolvedLanguage(l)},s=(l,u)=>{u?(o(u),this.translator.changeLanguage(u),this.isLanguageChangingTo=void 0,this.emit("languageChanged",u),this.logger.log("languageChanged",u)):this.isLanguageChangingTo=void 0,i.resolve(function(){return r.t(...arguments)}),n&&n(l,function(){return r.t(...arguments)})},a=l=>{!t&&!l&&this.services.languageDetector&&(l=[]);const u=typeof l=="string"?l:this.services.languageUtils.getBestMatchFromCodes(l);u&&(this.language||o(u),this.translator.language||this.translator.changeLanguage(u),this.services.languageDetector&&this.services.languageDetector.cacheUserLanguage&&this.services.languageDetector.cacheUserLanguage(u)),this.loadResources(u,c=>{s(c,u)})};return!t&&this.services.languageDetector&&!this.services.languageDetector.async?a(this.services.languageDetector.detect()):!t&&this.services.languageDetector&&this.services.languageDetector.async?this.services.languageDetector.detect.length===0?this.services.languageDetector.detect().then(a):this.services.languageDetector.detect(a):a(t),i}getFixedT(t,n,r){var i=this;const o=function(s,a){let l;if(typeof a!="object"){for(var u=arguments.length,c=new Array(u>2?u-2:0),d=2;d`${l.keyPrefix}${f}${p}`):h=l.keyPrefix?`${l.keyPrefix}${f}${s}`:s,i.t(h,l)};return typeof t=="string"?o.lng=t:o.lngs=t,o.ns=n,o.keyPrefix=r,o}t(){return this.translator&&this.translator.translate(...arguments)}exists(){return this.translator&&this.translator.exists(...arguments)}setDefaultNamespace(t){this.options.defaultNS=t}hasLoadedNamespace(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};if(!this.isInitialized)return this.logger.warn("hasLoadedNamespace: i18next was not initialized",this.languages),!1;if(!this.languages||!this.languages.length)return this.logger.warn("hasLoadedNamespace: i18n.languages were undefined or empty",this.languages),!1;const r=n.lng||this.resolvedLanguage||this.languages[0],i=this.options?this.options.fallbackLng:!1,o=this.languages[this.languages.length-1];if(r.toLowerCase()==="cimode")return!0;const s=(a,l)=>{const u=this.services.backendConnector.state[`${a}|${l}`];return u===-1||u===2};if(n.precheck){const a=n.precheck(this,s);if(a!==void 0)return a}return!!(this.hasResourceBundle(r,t)||!this.services.backendConnector.backend||this.options.resources&&!this.options.partialBundledLanguages||s(r,t)&&(!i||s(o,t)))}loadNamespaces(t,n){const r=Nd();return this.options.ns?(typeof t=="string"&&(t=[t]),t.forEach(i=>{this.options.ns.indexOf(i)<0&&this.options.ns.push(i)}),this.loadResources(i=>{r.resolve(),n&&n(i)}),r):(n&&n(),Promise.resolve())}loadLanguages(t,n){const r=Nd();typeof t=="string"&&(t=[t]);const i=this.options.preload||[],o=t.filter(s=>i.indexOf(s)<0);return o.length?(this.options.preload=i.concat(o),this.loadResources(s=>{r.resolve(),n&&n(s)}),r):(n&&n(),Promise.resolve())}dir(t){if(t||(t=this.resolvedLanguage||(this.languages&&this.languages.length>0?this.languages[0]:this.language)),!t)return"rtl";const n=["ar","shu","sqr","ssh","xaa","yhd","yud","aao","abh","abv","acm","acq","acw","acx","acy","adf","ads","aeb","aec","afb","ajp","apc","apd","arb","arq","ars","ary","arz","auz","avl","ayh","ayl","ayn","ayp","bbz","pga","he","iw","ps","pbt","pbu","pst","prp","prd","ug","ur","ydd","yds","yih","ji","yi","hbo","men","xmn","fa","jpr","peo","pes","prs","dv","sam","ckb"],r=this.services&&this.services.languageUtils||new w9(T9());return n.indexOf(r.getLanguagePartFromCode(t))>-1||t.toLowerCase().indexOf("-arab")>1?"rtl":"ltr"}static createInstance(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1?arguments[1]:void 0;return new Dh(t,n)}cloneInstance(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Ng;const r=t.forkResourceStore;r&&delete t.forkResourceStore;const i={...this.options,...t,isClone:!0},o=new Dh(i);return(t.debug!==void 0||t.prefix!==void 0)&&(o.logger=o.logger.clone(t)),["store","services","language"].forEach(a=>{o[a]=this[a]}),o.services={...this.services},o.services.utils={hasLoadedNamespace:o.hasLoadedNamespace.bind(o)},r&&(o.store=new S9(this.store.data,i),o.services.resourceStore=o.store),o.translator=new c0(o.services,i),o.translator.on("*",function(a){for(var l=arguments.length,u=new Array(l>1?l-1:0),c=1;ctypeof e=="string"?{title:e,status:"info",isClosable:!0,duration:2500}:{status:"info",isClosable:!0,duration:2500,...e},U8e=()=>{const e=Kc(),t=wc(oee),n=nce();return E.useEffect(()=>{t.forEach(r=>{n(r)}),t.length>0&&e(W1e())},[e,n,t]),null},G8e=()=>{const e=Kc();return E.useCallback(n=>e(qt(oo(n))),[e])},AF={isConnected:!1,isProcessing:!1,shouldDisplayGuides:!0,isGFPGANAvailable:!0,isESRGANAvailable:!0,shouldConfirmOnDelete:!0,currentStep:0,totalSteps:0,currentIteration:0,totalIterations:0,currentStatusHasSteps:!1,isCancelable:!0,enableImageDebugging:!1,toastQueue:[],searchFolder:null,foundModels:null,openModel:null,progressImage:null,shouldAntialiasProgressImage:!1,sessionId:null,cancelType:"immediate",isCancelScheduled:!1,subscribedNodeIds:[],wereModelsReceived:!1,wasSchemaParsed:!1,consoleLogLevel:"debug",shouldLogToConsole:!0,statusTranslationKey:"common.statusDisconnected",canceledSession:"",infillMethods:["tile","patchmatch"],isPersisted:!1,language:"en",isUploading:!1},OF=Lt({name:"system",initialState:AF,reducers:{setIsProcessing:(e,t)=>{e.isProcessing=t.payload},setCurrentStatus:(e,t)=>{e.statusTranslationKey=t.payload},setShouldConfirmOnDelete:(e,t)=>{e.shouldConfirmOnDelete=t.payload},setShouldDisplayGuides:(e,t)=>{e.shouldDisplayGuides=t.payload},setIsCancelable:(e,t)=>{e.isCancelable=t.payload},setEnableImageDebugging:(e,t)=>{e.enableImageDebugging=t.payload},addToast:(e,t)=>{e.toastQueue.push(t.payload)},clearToastQueue:e=>{e.toastQueue=[]},setSearchFolder:(e,t)=>{e.searchFolder=t.payload},setFoundModels:(e,t)=>{e.foundModels=t.payload},setOpenModel:(e,t)=>{e.openModel=t.payload},cancelScheduled:e=>{e.isCancelScheduled=!0},scheduledCancelAborted:e=>{e.isCancelScheduled=!1},cancelTypeChanged:(e,t)=>{e.cancelType=t.payload},subscribedNodeIdsSet:(e,t)=>{e.subscribedNodeIds=t.payload},consoleLogLevelChanged:(e,t)=>{e.consoleLogLevel=t.payload},shouldLogToConsoleChanged:(e,t)=>{e.shouldLogToConsole=t.payload},shouldAntialiasProgressImageChanged:(e,t)=>{e.shouldAntialiasProgressImage=t.payload},isPersistedChanged:(e,t)=>{e.isPersisted=t.payload},languageChanged:(e,t)=>{e.language=t.payload},progressImageSet(e,t){e.progressImage=t.payload}},extraReducers(e){e.addCase(DL,(t,n)=>{t.sessionId=n.payload.sessionId,t.boardIdToAddTo=n.payload.boardId,t.canceledSession=""}),e.addCase($L,t=>{t.sessionId=null,t.boardIdToAddTo=void 0}),e.addCase(IL,t=>{t.isConnected=!0,t.isCancelable=!0,t.isProcessing=!1,t.currentStatusHasSteps=!1,t.currentStep=0,t.totalSteps=0,t.currentIteration=0,t.totalIterations=0,t.statusTranslationKey="common.statusConnected"}),e.addCase(ML,t=>{t.isConnected=!1,t.isProcessing=!1,t.isCancelable=!0,t.currentStatusHasSteps=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusDisconnected"}),e.addCase(BL,t=>{t.isCancelable=!0,t.isProcessing=!0,t.currentStatusHasSteps=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusGenerating"}),e.addCase(HL,(t,n)=>{const{step:r,total_steps:i,progress_image:o}=n.payload.data;t.isProcessing=!0,t.isCancelable=!0,t.currentStatusHasSteps=!0,t.currentStep=r+1,t.totalSteps=i,t.progressImage=o??null,t.statusTranslationKey="common.statusGenerating"}),e.addCase(jL,(t,n)=>{const{data:r}=n.payload;t.currentStatusHasSteps=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusProcessingComplete",t.canceledSession===r.graph_execution_state_id&&(t.isProcessing=!1,t.isCancelable=!0)}),e.addCase(w3,t=>{t.isProcessing=!1,t.isCancelable=!0,t.currentStatusHasSteps=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusError",t.progressImage=null,t.toastQueue.push(oo({title:tl("toast.serverError"),status:"error"}))}),e.addCase(UL,t=>{t.isProcessing=!1,t.isCancelable=!1,t.isCancelScheduled=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusConnected",t.progressImage=null}),e.addCase(Op,t=>{t.isProcessing=!0,t.isCancelable=!0,t.currentStatusHasSteps=!1,t.statusTranslationKey="common.statusPreparing"}),e.addCase(Nl.fulfilled,(t,n)=>{t.canceledSession=n.meta.arg.session_id,t.isProcessing=!1,t.isCancelable=!1,t.isCancelScheduled=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusConnected",t.progressImage=null,t.toastQueue.push(oo({title:tl("toast.canceled"),status:"warning"}))}),e.addCase(B3,t=>{t.wasSchemaParsed=!0}),e.addCase(Dr.pending,t=>{t.isUploading=!0}),e.addCase(Dr.rejected,t=>{t.isUploading=!1}),e.addCase(Dr.fulfilled,t=>{t.isUploading=!1}),e.addMatcher(hN,(t,n)=>{t.isProcessing=!1,t.isCancelable=!1,t.isCancelScheduled=!1,t.currentStep=0,t.totalSteps=0,t.statusTranslationKey="common.statusConnected",t.progressImage=null,t.toastQueue.push(oo({title:tl("toast.serverError"),status:"error"}))})}}),{setIsProcessing:H8e,setShouldConfirmOnDelete:W8e,setCurrentStatus:q8e,setShouldDisplayGuides:K8e,setIsCancelable:Y8e,setEnableImageDebugging:X8e,addToast:qt,clearToastQueue:W1e,setSearchFolder:Q8e,setFoundModels:Z8e,setOpenModel:J8e,cancelScheduled:e9e,scheduledCancelAborted:t9e,cancelTypeChanged:n9e,subscribedNodeIdsSet:r9e,consoleLogLevelChanged:i9e,shouldLogToConsoleChanged:o9e,isPersistedChanged:s9e,shouldAntialiasProgressImageChanged:a9e,languageChanged:l9e,progressImageSet:q1e}=OF.actions,K1e=OF.reducer,P9=we.child({namespace:"canvas"}),Y1e=()=>{pe({actionCreator:Ppe,effect:async(e,{dispatch:t,getState:n})=>{const r=n(),{sessionId:i,isProcessing:o}=r.system,s=e.payload;if(o){if(!s){P9.debug("No canvas session, skipping cancel");return}if(s!==i){P9.debug({data:{canvasSessionId:s,session_id:i}},"Canvas session does not match global session, skipping cancel");return}t(Nl({session_id:i}))}}})},X1e=me("app/appStarted"),Q1e=()=>{pe({actionCreator:X1e,effect:async(e,{getState:t,dispatch:n,unsubscribe:r,cancelActiveListeners:i})=>{i(),r(),await n(ea({categories:["general"],is_intermediate:!1,offset:0,limit:u6})),await n(ea({categories:["control","mask","user","other"],is_intermediate:!1,offset:0,limit:u6})),n(ZJ(!1))}})};we.child({namespace:"boards"});const Z1e=()=>{pe({actionCreator:QJ,effect:(e,{getState:t,dispatch:n})=>{var c,d;const r=e.payload,i=t(),o=b5(i);if(!r){n(ol((c=o[0])==null?void 0:c.image_name));return}const{categories:s}=i.gallery,a=o.filter(f=>{const h=s.includes(f.image_category),p=r?f.board_id===r:!0;return h&&p}),{data:l}=nh.endpoints.listAllBoards.select()(i),u=l==null?void 0:l.find(f=>f.board_id===r);if(!u){n(ol((d=o[0])==null?void 0:d.image_name));return}n(ol(u.cover_image_name??null)),a.length{pe({actionCreator:RF,effect:async(e,{dispatch:t,getState:n,condition:r})=>{const{board:i,imagesUsage:o}=e.payload,{board_id:s}=i,a=n(),l=a.gallery.selection[a.gallery.selection.length-1],u=l?Wa(a,l):void 0;u&&u.board_id===s&&t(ol(null)),o.isCanvasImage&&t(AL()),o.isControlNetImage&&t(qL()),o.isInitialImage&&t(xL()),o.isNodesImage&&t(TF());const c=b5(a).reduce((p,m)=>(m.board_id===s&&p.push(m.image_name),p),[]);t(XJ(c)),t(nh.endpoints.deleteBoardAndImages.initiate(s));const d=nh.endpoints.deleteBoardAndImages.select(s)(a),{isSuccess:f}=d;await r(()=>!!f,3e4)&&t(da.util.invalidateTags([{type:"Board",id:s},{type:"Image",id:Hd}]))}})},ebe=me("canvas/canvasSavedToGallery"),tbe=me("canvas/canvasCopiedToClipboard"),nbe=me("canvas/canvasDownloadedAsImage"),rbe=me("canvas/canvasMerged"),ibe=me("canvas/stagingAreaImageSaved");let IF=null,NF=null;const d9e=e=>{IF=e},w1=()=>IF,f9e=e=>{NF=e},obe=()=>NF,sbe=async e=>new Promise((t,n)=>{e.toBlob(r=>{if(r){t(r);return}n("Unable to create Blob")})}),d0=async(e,t)=>await sbe(e.toCanvas(t)),V3=async e=>{const t=w1();if(!t)return;const{shouldCropToBoundingBoxOnSave:n,boundingBoxCoordinates:r,boundingBoxDimensions:i}=e.canvas,o=t.clone();o.scale({x:1,y:1});const s=o.getAbsolutePosition(),a=n?{x:r.x+s.x,y:r.y+s.y,width:i.width,height:i.height}:o.getClientRect();return d0(o,a)},abe=e=>{navigator.clipboard.write([new ClipboardItem({[e.type]:e})])},lbe=we.child({namespace:"canvasCopiedToClipboardListener"}),ube=()=>{pe({actionCreator:tbe,effect:async(e,{dispatch:t,getState:n})=>{const r=n(),i=await V3(r);if(!i){lbe.error("Problem getting base layer blob"),t(qt({title:"Problem Copying Canvas",description:"Unable to export base layer",status:"error"}));return}abe(i),t(qt({title:"Canvas Copied to Clipboard",status:"success"}))}})},cbe=(e,t)=>{const n=URL.createObjectURL(e),r=document.createElement("a");r.href=n,r.download=t,document.body.appendChild(r),r.click(),document.body.removeChild(r),r.remove()},dbe=we.child({namespace:"canvasSavedToGalleryListener"}),fbe=()=>{pe({actionCreator:nbe,effect:async(e,{dispatch:t,getState:n})=>{const r=n(),i=await V3(r);if(!i){dbe.error("Problem getting base layer blob"),t(qt({title:"Problem Downloading Canvas",description:"Unable to export base layer",status:"error"}));return}cbe(i,"canvas.png"),t(qt({title:"Canvas Downloaded",status:"success"}))}})},hbe=async()=>{const e=w1();if(!e)return;const t=e.clone();return t.scale({x:1,y:1}),d0(t,t.getClientRect())},k9=we.child({namespace:"canvasCopiedToClipboardListener"}),pbe=()=>{pe({actionCreator:rbe,effect:async(e,{dispatch:t,getState:n,take:r})=>{const i=await hbe();if(!i){k9.error("Problem getting base layer blob"),t(qt({title:"Problem Merging Canvas",description:"Unable to export base layer",status:"error"}));return}const o=w1();if(!o){k9.error("Problem getting canvas base layer"),t(qt({title:"Problem Merging Canvas",description:"Unable to export base layer",status:"error"}));return}const s=o.getClientRect({relativeTo:o.getParent()}),a=t(Dr({file:new File([i],"mergedCanvas.png",{type:"image/png"}),image_category:"general",is_intermediate:!0,postUploadAction:{type:"TOAST_CANVAS_MERGED"}})),[{payload:l}]=await r(c=>Dr.fulfilled.match(c)&&c.meta.requestId===a.requestId),{image_name:u}=l;t(kpe({kind:"image",layer:"base",imageName:u,...s})),t(qt({title:"Canvas Merged",status:"success"}))}})},gbe=we.child({namespace:"canvasSavedToGalleryListener"}),mbe=()=>{pe({actionCreator:ebe,effect:async(e,{dispatch:t,getState:n,take:r})=>{const i=n(),o=await V3(i);if(!o){gbe.error("Problem getting base layer blob"),t(qt({title:"Problem Saving Canvas",description:"Unable to export base layer",status:"error"}));return}const s=t(Dr({file:new File([o],"savedCanvas.png",{type:"image/png"}),image_category:"general",is_intermediate:!1,postUploadAction:{type:"TOAST_CANVAS_SAVED_TO_GALLERY"}})),[{payload:a}]=await r(l=>Dr.fulfilled.match(l)&&l.meta.requestId===s.requestId);t(Ev(a))}})},ybe=we.child({namespace:"controlNet"}),vbe=(e,t)=>{if(!(Npe.match(e)||A8.match(e)||x3.match(e)||Mpe.match(e)||Dpe.match(e)))return!1;const{controlImage:r,processorType:i,shouldAutoConfig:o}=t.controlNet.controlNets[e.payload.controlNetId];if(A8.match(e)&&!o)return!1;const s=i!=="none",a=t.system.isProcessing;return s&&!a&&!!r},bbe=()=>{pe({predicate:vbe,effect:async(e,{dispatch:t,getState:n,cancelActiveListeners:r,delay:i})=>{const{controlNetId:o}=e.payload;r(),ybe.trace({data:e.payload},"ControlNet auto-process triggered"),await i(300),t(b3({controlNetId:o}))}})},Qc=me("system/sessionReadyToInvoke"),Sbe=e=>Pn(e)&&"image_name"in e&&js(e==null?void 0:e.image_name)&&"thumbnail_url"in e&&js(e==null?void 0:e.thumbnail_url)&&"image_url"in e&&js(e==null?void 0:e.image_url)&&"image_origin"in e&&js(e==null?void 0:e.image_origin)&&"created_at"in e&&js(e==null?void 0:e.created_at),MF=e=>(e==null?void 0:e.type)==="image_output",_be=e=>js(e)&&["internal","external"].includes(e),h9e=e=>Pn(e)&&js(H_(e,"image_name"))&&_be(H_(e,"image_origin")),A9=we.child({namespace:"controlNet"}),wbe=()=>{pe({actionCreator:b3,effect:async(e,{dispatch:t,getState:n,take:r,unsubscribe:i,subscribe:o})=>{const{controlNetId:s}=e.payload,a=n().controlNet.controlNets[s];if(!a.controlImage){A9.error("Unable to process ControlNet image");return}const l={nodes:{[a.processorNode.id]:{...a.processorNode,is_intermediate:!0,image:{image_name:a.controlImage}}}},u=t(ar({graph:l})),[c]=await r(h=>ar.fulfilled.match(h)&&h.meta.requestId===u.requestId),d=c.payload.id;t(Qc());const[f]=await r(h=>_3.match(h)&&h.payload.data.graph_execution_state_id===d);if(MF(f.payload.data.result)){const{image_name:h}=f.payload.data.result.image,[p]=await r(S=>yl.fulfilled.match(S)&&S.payload.image_name===h),m=p.payload;A9.debug({data:{arg:e.payload,processedControlImage:m}},"ControlNet image processed"),t(Ipe({controlNetId:s,processedControlImage:m.image_name}))}}})},f0=da.injectEndpoints({endpoints:e=>({getImageDTO:e.query({query:t=>({url:`images/${t}/metadata`}),providesTags:(t,n,r)=>{const i=[{type:"Image",id:r}];return t!=null&&t.board_id&&i.push({type:"Board",id:t.board_id}),i},keepUnusedDataFor:86400})})}),{useGetImageDTOQuery:p9e}=f0,Bl=da.injectEndpoints({endpoints:e=>({listBoardImages:e.query({query:({board_id:t,offset:n,limit:r})=>({url:`board_images/${t}`,method:"DELETE",body:{offset:n,limit:r}})}),addImageToBoard:e.mutation({query:({board_id:t,image_name:n})=>({url:"board_images/",method:"POST",body:{board_id:t,image_name:n}}),invalidatesTags:(t,n,r)=>[{type:"Board",id:r.board_id}],async onQueryStarted({image_name:t,...n},{dispatch:r,queryFulfilled:i}){const o=r(f0.util.updateQueryData("getImageDTO",t,s=>{Object.assign(s,n)}));try{await i}catch{o.undo()}}}),removeImageFromBoard:e.mutation({query:({board_id:t,image_name:n})=>({url:"board_images/",method:"DELETE",body:{board_id:t,image_name:n}}),invalidatesTags:(t,n,r)=>[{type:"Board",id:r.board_id}],async onQueryStarted({image_name:t,...n},{dispatch:r,queryFulfilled:i}){const o=r(f0.util.updateQueryData("getImageDTO",t,s=>{Object.assign(s,{board_id:null})}));try{await i}catch{o.undo()}}})})}),{useAddImageToBoardMutation:xbe,useRemoveImageFromBoardMutation:g9e,useListBoardImagesQuery:m9e}=Bl,DF=we.child({namespace:"boards"}),Cbe=()=>{pe({matcher:Bl.endpoints.addImageToBoard.matchFulfilled,effect:(e,{getState:t,dispatch:n})=>{const{board_id:r,image_name:i}=e.meta.arg.originalArgs;DF.debug({data:{board_id:r,image_name:i}},"Image added to board"),n(yl({image_name:i}))}})},Tbe=()=>{pe({matcher:Bl.endpoints.addImageToBoard.matchRejected,effect:(e,{getState:t,dispatch:n})=>{const{board_id:r,image_name:i}=e.meta.arg.originalArgs;DF.debug({data:{board_id:r,image_name:i}},"Problem adding image to board")}})},LF=we.child({namespace:"image"}),Ebe=()=>{pe({actionCreator:JL,effect:async(e,{dispatch:t,getState:n,condition:r})=>{const{imageDTO:i,imageUsage:o}=e.payload;t(ZL(!1));const{image_name:s}=i,a=n();if(a.gallery.selection[a.gallery.selection.length-1]===s){const f=S5(a).map(v=>v.image_name),h=f.findIndex(v=>v.toString()===s),p=f.filter(v=>v.toString()!==s),m=qo(h,0,p.length-1),S=p[m];t(ol(S||null))}o.isCanvasImage&&t(AL()),o.isControlNetImage&&t(qL()),o.isInitialImage&&t(xL()),o.isNodesImage&&t(TF()),t(YJ(s));const{requestId:u}=t(vl({image_name:s}));await r(d=>vl.fulfilled.match(d)&&d.meta.requestId===u,3e4)&&t(da.util.invalidateTags([{type:"Board",id:i.board_id}]))}})},Pbe=()=>{pe({actionCreator:vl.pending,effect:(e,{dispatch:t,getState:n})=>{}})},kbe=()=>{pe({actionCreator:vl.fulfilled,effect:(e,{dispatch:t,getState:n})=>{LF.debug({data:{image:e.meta.arg}},"Image deleted")}})},Abe=()=>{pe({actionCreator:vl.rejected,effect:(e,{dispatch:t,getState:n})=>{LF.debug({data:{image:e.meta.arg}},"Unable to delete image")}})};we.child({namespace:"dnd"});const $F=me("dnd/imageDropped"),Obe=()=>{pe({actionCreator:$F,effect:(e,{dispatch:t,getState:n})=>{const{activeData:r,overData:i}=e.payload,{actionType:o}=i,s=n();if(o==="SET_CURRENT_IMAGE"&&r.payloadType==="IMAGE_DTO"&&r.payload.imageDTO&&t(ol(r.payload.imageDTO.image_name)),o==="SET_INITIAL_IMAGE"&&r.payloadType==="IMAGE_DTO"&&r.payload.imageDTO&&t(Eh(r.payload.imageDTO)),o==="ADD_TO_BATCH"&&r.payloadType==="IMAGE_DTO"&&r.payload.imageDTO&&t(FI(r.payload.imageDTO.image_name)),o==="ADD_TO_BATCH"&&r.payloadType==="GALLERY_SELECTION"&&t(BI(s.gallery.selection)),o==="SET_CONTROLNET_IMAGE"&&r.payloadType==="IMAGE_DTO"&&r.payload.imageDTO){const{controlNetId:a}=i.context;t(x3({controlImage:r.payload.imageDTO.image_name,controlNetId:a}))}if(o==="SET_CANVAS_INITIAL_IMAGE"&&r.payloadType==="IMAGE_DTO"&&r.payload.imageDTO&&t(OL(r.payload.imageDTO)),o==="SET_NODES_IMAGE"&&r.payloadType==="IMAGE_DTO"&&r.payload.imageDTO){const{fieldName:a,nodeId:l}=i.context;t(cx({nodeId:l,fieldName:a,value:r.payload.imageDTO}))}if(o==="SET_MULTI_NODES_IMAGE"&&r.payloadType==="IMAGE_DTO"&&r.payload.imageDTO){const{fieldName:a,nodeId:l}=i.context;t(cx({nodeId:l,fieldName:a,value:[r.payload.imageDTO]}))}if(o==="SET_MULTI_NODES_IMAGE"&&r.payloadType==="GALLERY_SELECTION"){const{fieldName:a,nodeId:l}=i.context;t(w1e({nodeId:l,fieldName:a,value:s.gallery.selection.map(u=>({image_name:u}))}))}if(o==="MOVE_BOARD"&&r.payloadType==="IMAGE_DTO"&&r.payload.imageDTO&&i.context.boardId){const{image_name:a}=r.payload.imageDTO,{boardId:l}=i.context;t(Bl.endpoints.addImageToBoard.initiate({image_name:a,board_id:l}))}}})},hx=we.child({namespace:"image"}),Rbe=()=>{pe({actionCreator:yl.fulfilled,effect:(e,{getState:t,dispatch:n})=>{const r=e.payload,i=t();if(r.session_id===i.canvas.layerState.stagingArea.sessionId&&i.canvas.shouldAutoSave)n(Qi({image_name:r.image_name,is_intermediate:r.is_intermediate}));else if(r.is_intermediate){hx.trace({data:{image:r}},"Image metadata received (intermediate), skipping");return}hx.debug({data:{image:r}},"Image metadata received"),n(Ev(r))}})},Ibe=()=>{pe({actionCreator:yl.rejected,effect:(e,{getState:t,dispatch:n})=>{hx.debug({data:{image:e.meta.arg}},"Problem receiving image metadata")}})},FF=we.child({namespace:"boards"}),Nbe=()=>{pe({matcher:Bl.endpoints.removeImageFromBoard.matchFulfilled,effect:(e,{getState:t,dispatch:n})=>{const{board_id:r,image_name:i}=e.meta.arg.originalArgs;FF.debug({data:{board_id:r,image_name:i}},"Image added to board"),n(yl({image_name:i}))}})},Mbe=()=>{pe({matcher:Bl.endpoints.removeImageFromBoard.matchRejected,effect:(e,{getState:t,dispatch:n})=>{const{board_id:r,image_name:i}=e.meta.arg.originalArgs;FF.debug({data:{board_id:r,image_name:i}},"Problem adding image to board")}})};we.child({namespace:"image"});const Dbe=()=>{pe({actionCreator:Upe,effect:async(e,{dispatch:t,getState:n,condition:r})=>{const i=e.payload,o=n(),{shouldConfirmOnDelete:s}=o.system,a=Hpe(n());if(!a)return;const l=a.isCanvasImage||a.isInitialImage||a.isControlNetImage||a.isNodesImage;if(s||l){t(ZL(!0));return}t(JL({imageDTO:i,imageUsage:a}))}})},BF=we.child({namespace:"image"}),Lbe=()=>{pe({actionCreator:Qi.fulfilled,effect:(e,{dispatch:t,getState:n})=>{BF.debug({oldImage:e.meta.arg,updatedImage:e.payload},"Image updated")}})},$be=()=>{pe({actionCreator:Qi.rejected,effect:(e,{dispatch:t})=>{BF.debug({oldImage:e.meta.arg},"Image update failed")}})},jF=we.child({namespace:"image"}),Fbe=()=>{pe({actionCreator:Dr.fulfilled,effect:(e,{dispatch:t,getState:n})=>{const r=e.payload;if(jF.debug({arg:"",image:r},"Image uploaded"),e.payload.is_intermediate)return;t(Ev(r));const{postUploadAction:i}=e.meta.arg;if((i==null?void 0:i.type)==="TOAST_CANVAS_SAVED_TO_GALLERY"){t(qt({title:"Canvas Saved to Gallery",status:"success"}));return}if((i==null?void 0:i.type)==="TOAST_CANVAS_MERGED"){t(qt({title:"Canvas Merged",status:"success"}));return}if((i==null?void 0:i.type)==="SET_CANVAS_INITIAL_IMAGE"){t(OL(r));return}if((i==null?void 0:i.type)==="SET_CONTROLNET_IMAGE"){const{controlNetId:o}=i;t(x3({controlNetId:o,controlImage:r.image_name}));return}if((i==null?void 0:i.type)==="SET_INITIAL_IMAGE"){t(Eh(r));return}if((i==null?void 0:i.type)==="SET_NODES_IMAGE"){const{nodeId:o,fieldName:s}=i;t(cx({nodeId:o,fieldName:s,value:r}));return}if((i==null?void 0:i.type)==="TOAST_UPLOADED"){t(qt({title:"Image Uploaded",status:"success"}));return}if((i==null?void 0:i.type)==="ADD_TO_BATCH"){t(FI(r.image_name));return}}})},Bbe=()=>{pe({actionCreator:Dr.rejected,effect:(e,{dispatch:t})=>{const{formData:n,...r}=e.meta.arg,i={arg:{...r,formData:{file:""}}};jF.error({data:i},"Image upload failed"),t(qt({title:"Image Upload Failed",description:e.error.message,status:"error"}))}})},VF=we.child({namespace:"image"}),jbe=()=>{pe({actionCreator:_5.fulfilled,effect:(e,{getState:t,dispatch:n})=>{const r=e.payload;VF.debug({data:{image:r}},"Image URLs received");const{image_name:i,image_url:o,thumbnail_url:s}=r;n(KJ({id:i,changes:{image_url:o,thumbnail_url:s}}))}})},Vbe=()=>{pe({actionCreator:_5.rejected,effect:(e,{getState:t,dispatch:n})=>{VF.debug({data:{image:e.meta.arg}},"Problem getting image URLs")}})},zbe=me("generation/initialImageSelected"),Ube=me("generation/modelSelected"),Gbe=()=>{pe({actionCreator:zbe,effect:(e,{getState:t,dispatch:n})=>{if(!e.payload){n(qt(oo({title:tl("toast.imageNotLoadedDesc"),status:"error"})));return}if(Sbe(e.payload)){n(Eh(e.payload)),n(qt(oo(tl("toast.sentToImageToImage"))));return}const r=e.payload,i=Wa(t(),r);if(!i){n(qt(oo({title:tl("toast.imageNotLoadedDesc"),status:"error"})));return}n(Eh(i)),n(qt(oo(tl("toast.sentToImageToImage"))))}})},Hbe=()=>{pe({actionCreator:Ube,effect:(e,{getState:t,dispatch:n})=>{var l;const r=t(),[i,o,s]=e.payload.split("/");((l=r.generation.model)==null?void 0:l.base_model)!==i&&(n(qt(oo({title:"Base model changed, clearing submodels",status:"warning"}))),n(bpe(null)),n(Ype()));const a=Xy.parse({id:e.payload,base_model:i,name:s});n(vpe(a))}})},px=e=>!("$ref"in e),Wbe=e=>!("$ref"in e),y9e=500,qbe={integer:"integer",float:"float",number:"float",string:"string",boolean:"boolean",enum:"enum",ImageField:"image",image_collection:"image_collection",LatentsField:"latents",ConditioningField:"conditioning",UNetField:"unet",ClipField:"clip",VaeField:"vae",model:"model",vae_model:"vae_model",lora_model:"lora_model",array:"array",item:"item",ColorField:"color",ControlField:"control",control:"control",cfg_scale:"float",control_weight:"float"},Kbe=500,an=e=>`var(--invokeai-colors-${e}-${Kbe})`,v9e={integer:{color:"red",colorCssVar:an("red"),title:"Integer",description:"Integers are whole numbers, without a decimal point."},float:{color:"orange",colorCssVar:an("orange"),title:"Float",description:"Floats are numbers with a decimal point."},string:{color:"yellow",colorCssVar:an("yellow"),title:"String",description:"Strings are text."},boolean:{color:"green",colorCssVar:an("green"),title:"Boolean",description:"Booleans are true or false."},enum:{color:"blue",colorCssVar:an("blue"),title:"Enum",description:"Enums are values that may be one of a number of options."},image:{color:"purple",colorCssVar:an("purple"),title:"Image",description:"Images may be passed between nodes."},image_collection:{color:"purple",colorCssVar:an("purple"),title:"Image Collection",description:"A collection of images."},latents:{color:"pink",colorCssVar:an("pink"),title:"Latents",description:"Latents may be passed between nodes."},conditioning:{color:"cyan",colorCssVar:an("cyan"),title:"Conditioning",description:"Conditioning may be passed between nodes."},unet:{color:"red",colorCssVar:an("red"),title:"UNet",description:"UNet submodel."},clip:{color:"green",colorCssVar:an("green"),title:"Clip",description:"Tokenizer and text_encoder submodels."},vae:{color:"blue",colorCssVar:an("blue"),title:"Vae",description:"Vae submodel."},control:{color:"cyan",colorCssVar:an("cyan"),title:"Control",description:"Control info passed between nodes."},model:{color:"teal",colorCssVar:an("teal"),title:"Model",description:"Models are models."},vae_model:{color:"teal",colorCssVar:an("teal"),title:"VAE",description:"Models are models."},lora_model:{color:"teal",colorCssVar:an("teal"),title:"LoRA",description:"Models are models."},array:{color:"gray",colorCssVar:an("gray"),title:"Array",description:"TODO: Array type description."},item:{color:"gray",colorCssVar:an("gray"),title:"Collection Item",description:"TODO: Collection Item type description."},color:{color:"gray",colorCssVar:an("gray"),title:"Color",description:"A RGBA color."}},b2=e=>e.$ref.split("/").slice(-1)[0],Ybe=({schemaObject:e,baseField:t})=>{const n={...t,type:"integer",inputRequirement:"always",inputKind:"any",default:e.default??0};return e.multipleOf!==void 0&&(n.multipleOf=e.multipleOf),e.maximum!==void 0&&(n.maximum=e.maximum),e.exclusiveMaximum!==void 0&&(n.exclusiveMaximum=e.exclusiveMaximum),e.minimum!==void 0&&(n.minimum=e.minimum),e.exclusiveMinimum!==void 0&&(n.exclusiveMinimum=e.exclusiveMinimum),n},Xbe=({schemaObject:e,baseField:t})=>{const n={...t,type:"float",inputRequirement:"always",inputKind:"any",default:e.default??0};return e.multipleOf!==void 0&&(n.multipleOf=e.multipleOf),e.maximum!==void 0&&(n.maximum=e.maximum),e.exclusiveMaximum!==void 0&&(n.exclusiveMaximum=e.exclusiveMaximum),e.minimum!==void 0&&(n.minimum=e.minimum),e.exclusiveMinimum!==void 0&&(n.exclusiveMinimum=e.exclusiveMinimum),n},Qbe=({schemaObject:e,baseField:t})=>{const n={...t,type:"string",inputRequirement:"always",inputKind:"any",default:e.default??""};return e.minLength!==void 0&&(n.minLength=e.minLength),e.maxLength!==void 0&&(n.maxLength=e.maxLength),e.pattern!==void 0&&(n.pattern=e.pattern),n},Zbe=({schemaObject:e,baseField:t})=>({...t,type:"boolean",inputRequirement:"always",inputKind:"any",default:e.default??!1}),Jbe=({schemaObject:e,baseField:t})=>({...t,type:"model",inputRequirement:"always",inputKind:"direct",default:e.default??void 0}),eSe=({schemaObject:e,baseField:t})=>({...t,type:"vae_model",inputRequirement:"always",inputKind:"direct",default:e.default??void 0}),tSe=({schemaObject:e,baseField:t})=>({...t,type:"lora_model",inputRequirement:"always",inputKind:"direct",default:e.default??void 0}),nSe=({schemaObject:e,baseField:t})=>({...t,type:"image",inputRequirement:"always",inputKind:"any",default:e.default??void 0}),rSe=({schemaObject:e,baseField:t})=>({...t,type:"image_collection",inputRequirement:"always",inputKind:"any",default:e.default??void 0}),iSe=({schemaObject:e,baseField:t})=>({...t,type:"latents",inputRequirement:"always",inputKind:"connection",default:e.default??void 0}),oSe=({schemaObject:e,baseField:t})=>({...t,type:"conditioning",inputRequirement:"always",inputKind:"connection",default:e.default??void 0}),sSe=({schemaObject:e,baseField:t})=>({...t,type:"unet",inputRequirement:"always",inputKind:"connection",default:e.default??void 0}),aSe=({schemaObject:e,baseField:t})=>({...t,type:"clip",inputRequirement:"always",inputKind:"connection",default:e.default??void 0}),lSe=({schemaObject:e,baseField:t})=>({...t,type:"vae",inputRequirement:"always",inputKind:"connection",default:e.default??void 0}),uSe=({schemaObject:e,baseField:t})=>({...t,type:"control",inputRequirement:"always",inputKind:"connection",default:e.default??void 0}),cSe=({schemaObject:e,baseField:t})=>{const n=e.enum??[];return{...t,type:"enum",enumType:e.type??"string",options:n,inputRequirement:"always",inputKind:"direct",default:e.default??n[0]}},O9=({baseField:e})=>({...e,type:"array",inputRequirement:"always",inputKind:"direct",default:[]}),R9=({baseField:e})=>({...e,type:"item",inputRequirement:"always",inputKind:"direct",default:void 0}),dSe=({schemaObject:e,baseField:t})=>({...t,type:"color",inputRequirement:"always",inputKind:"direct",default:e.default??{r:127,g:127,b:127,a:255}}),zF=(e,t,n)=>{let r="";n&&t in n?r=n[t]:e.type?e.enum?r="enum":e.type&&(r=e.type):e.allOf?r=b2(e.allOf[0]):e.anyOf?r=b2(e.anyOf[0]):e.oneOf&&(r=b2(e.oneOf[0]));const i=qbe[r];if(!i)throw`Field type "${r}" is unknown!`;return i},fSe=(e,t,n)=>{const r=zF(e,t,n),i={name:t,title:e.title??"",description:e.description??""};if(["image"].includes(r))return nSe({schemaObject:e,baseField:i});if(["image_collection"].includes(r))return rSe({schemaObject:e,baseField:i});if(["latents"].includes(r))return iSe({schemaObject:e,baseField:i});if(["conditioning"].includes(r))return oSe({schemaObject:e,baseField:i});if(["unet"].includes(r))return sSe({schemaObject:e,baseField:i});if(["clip"].includes(r))return aSe({schemaObject:e,baseField:i});if(["vae"].includes(r))return lSe({schemaObject:e,baseField:i});if(["control"].includes(r))return uSe({schemaObject:e,baseField:i});if(["model"].includes(r))return Jbe({schemaObject:e,baseField:i});if(["vae_model"].includes(r))return eSe({schemaObject:e,baseField:i});if(["lora_model"].includes(r))return tSe({schemaObject:e,baseField:i});if(["enum"].includes(r))return cSe({schemaObject:e,baseField:i});if(["integer"].includes(r))return Ybe({schemaObject:e,baseField:i});if(["number","float"].includes(r))return Xbe({schemaObject:e,baseField:i});if(["string"].includes(r))return Qbe({schemaObject:e,baseField:i});if(["boolean"].includes(r))return Zbe({schemaObject:e,baseField:i});if(["array"].includes(r))return O9({schemaObject:e,baseField:i});if(["item"].includes(r))return R9({schemaObject:e,baseField:i});if(["color"].includes(r))return dSe({schemaObject:e,baseField:i});if(["array"].includes(r))return O9({schemaObject:e,baseField:i});if(["item"].includes(r))return R9({schemaObject:e,baseField:i})},hSe=(e,t,n)=>{const r=e.$ref.split("/").slice(-1)[0],i=t.components.schemas[r];return px(i)?Tv(i.properties,(s,a,l)=>{if(!["type","id"].includes(l)&&!["object"].includes(a.type)&&px(a)){const u=zF(a,l,n);s[l]={name:l,title:a.title??"",description:a.description??"",type:u}}return s},{}):{}},pSe=["id","type","is_intermediate"],gSe=["Graph","InvocationMeta"],mSe=e=>iI(e.components.schemas,(r,i)=>i.includes("Invocation")&&!i.includes("InvocationOutput")&&!gSe.some(o=>i.includes(o))).reduce((r,i)=>{var o,s,a;if(Wbe(i)){const l=i.properties.type.default,u=((o=i.ui)==null?void 0:o.title)??i.title.replace("Invocation",""),c=(s=i.ui)==null?void 0:s.type_hints,d={};if(l==="collect"){const m=i.properties.item;d.item={type:"item",name:"item",description:m.description??"",title:"Collection Item",inputKind:"connection",inputRequirement:"always",default:void 0}}else if(l==="iterate"){const m=i.properties.collection;d.collection={type:"array",name:"collection",title:m.title??"",default:[],description:m.description??"",inputRequirement:"always",inputKind:"connection"}}else Tv(i.properties,(m,S,v)=>{if(!pSe.includes(v)&&px(S)){const y=fSe(S,v,c);y&&(m[v]=y)}return m},d);const f=i.output;let h;if(l==="iterate"){const m=e.components.schemas.IterateInvocationOutput;h={item:{name:"item",title:m.title??"",description:m.description??"",type:"array"}}}else h=hSe(f,e,c);const p={title:u,type:l,tags:((a=i.ui)==null?void 0:a.tags)??[],description:i.description??"",inputs:d,outputs:h};Object.assign(r,{[l]:p})}return r},{}),S2=we.child({namespace:"schema"}),ySe=()=>{pe({actionCreator:Mh.fulfilled,effect:(e,{dispatch:t,getState:n})=>{const r=e.payload;S2.info({data:{schemaJSON:r}},"Dereferenced OpenAPI schema");const i=mSe(r);S2.info({data:{nodeTemplates:i}},`Built ${h5(i)} node templates`),t(B3(i))}}),pe({actionCreator:Mh.rejected,effect:(e,{dispatch:t,getState:n})=>{S2.error("Problem dereferencing OpenAPI Schema")}})},vSe=[EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError,globalThis.DOMException,globalThis.AssertionError,globalThis.SystemError].filter(Boolean).map(e=>[e.name,e]),bSe=new Map(vSe),SSe=[{property:"name",enumerable:!1},{property:"message",enumerable:!1},{property:"stack",enumerable:!1},{property:"code",enumerable:!0},{property:"cause",enumerable:!1}],gx=Symbol(".toJSON was called"),_Se=e=>{e[gx]=!0;const t=e.toJSON();return delete e[gx],t},wSe=e=>bSe.get(e)??Error,UF=({from:e,seen:t,to:n,forceEnumerable:r,maxDepth:i,depth:o,useToJSON:s,serialize:a})=>{if(!n)if(Array.isArray(e))n=[];else if(!a&&I9(e)){const u=wSe(e.name);n=new u}else n={};if(t.push(e),o>=i)return n;if(s&&typeof e.toJSON=="function"&&e[gx]!==!0)return _Se(e);const l=u=>UF({from:u,seen:[...t],forceEnumerable:r,maxDepth:i,depth:o,useToJSON:s,serialize:a});for(const[u,c]of Object.entries(e)){if(typeof Buffer=="function"&&Buffer.isBuffer(c)){n[u]="[object Buffer]";continue}if(c!==null&&typeof c=="object"&&typeof c.pipe=="function"){n[u]="[object Stream]";continue}if(typeof c!="function"){if(!c||typeof c!="object"){n[u]=c;continue}if(!t.includes(e[u])){o++,n[u]=l(e[u]);continue}n[u]="[Circular]"}}for(const{property:u,enumerable:c}of SSe)typeof e[u]<"u"&&e[u]!==null&&Object.defineProperty(n,u,{value:I9(e[u])?l(e[u]):e[u],enumerable:r?!0:c,configurable:!0,writable:!0});return n};function x1(e,t={}){const{maxDepth:n=Number.POSITIVE_INFINITY,useToJSON:r=!0}=t;return typeof e=="object"&&e!==null?UF({from:e,seen:[],forceEnumerable:!0,maxDepth:n,depth:0,useToJSON:r,serialize:!0}):typeof e=="function"?`[Function: ${e.name??"anonymous"}]`:e}function I9(e){return!!e&&typeof e=="object"&&"name"in e&&"message"in e&&"stack"in e}const GF=we.child({namespace:"gallery"}),xSe=()=>{pe({actionCreator:ea.fulfilled,effect:(e,{getState:t,dispatch:n})=>{const{items:r}=e.payload;GF.debug({data:{payload:e.payload}},`Received ${r.length} images`),r.forEach(i=>{n(f0.util.upsertQueryData("getImageDTO",i.image_name,i))})}})},CSe=()=>{pe({actionCreator:ea.rejected,effect:(e,{getState:t,dispatch:n})=>{e.payload&&GF.debug({data:{error:x1(e.payload)}},"Problem receiving images")}})};we.child({namespace:"batch"});const TSe=()=>{pe({actionCreator:nee,effect:(e,{dispatch:t,getState:n})=>{const{selection:r}=n().gallery;t(BI(r))}})},HF=we.child({namespace:"session"}),ESe=()=>{pe({actionCreator:Nl.pending,effect:(e,{getState:t,dispatch:n})=>{}})},PSe=()=>{pe({actionCreator:Nl.fulfilled,effect:(e,{getState:t,dispatch:n})=>{const{session_id:r}=e.meta.arg;HF.debug({data:{session_id:r}},`Session canceled (${r})`)}})},kSe=()=>{pe({actionCreator:Nl.rejected,effect:(e,{getState:t,dispatch:n})=>{if(e.payload){const{arg:r,error:i}=e.payload;HF.error({data:{arg:r,error:x1(i)}},"Problem canceling session")}}})},WF=we.child({namespace:"session"}),ASe=()=>{pe({actionCreator:ar.pending,effect:(e,{getState:t,dispatch:n})=>{}})},OSe=()=>{pe({actionCreator:ar.fulfilled,effect:(e,{getState:t,dispatch:n})=>{const r=e.payload;WF.debug({data:{session:r}},`Session created (${r.id})`)}})},RSe=()=>{pe({actionCreator:ar.rejected,effect:(e,{getState:t,dispatch:n})=>{if(e.payload){const{arg:r,error:i}=e.payload;WF.error({data:{arg:r,error:x1(i)}},"Problem creating session")}}})},qF=we.child({namespace:"session"}),ISe=()=>{pe({actionCreator:pp.pending,effect:(e,{getState:t,dispatch:n})=>{}})},NSe=()=>{pe({actionCreator:pp.fulfilled,effect:(e,{getState:t,dispatch:n})=>{const{session_id:r}=e.meta.arg;qF.debug({data:{session_id:r}},`Session invoked (${r})`)}})},MSe=()=>{pe({actionCreator:pp.rejected,effect:(e,{getState:t,dispatch:n})=>{if(e.payload){const{arg:r,error:i}=e.payload;qF.error({data:{arg:r,error:x1(i)}},"Problem invoking session")}}})},DSe=we.child({namespace:"session"}),LSe=()=>{pe({actionCreator:Qc,effect:(e,{getState:t,dispatch:n})=>{const{sessionId:r}=t().system;r&&(DSe.debug({session_id:r},`Session ready to invoke (${r})})`),n(pp({session_id:r})))}})},$Se=we.child({namespace:"socketio"}),FSe=()=>{pe({actionCreator:RL,effect:(e,{dispatch:t,getState:n})=>{const{timestamp:r}=e.payload;$Se.debug({timestamp:r},"Connected");const{nodes:i,config:o}=n(),{disabledTabs:s}=o;!i.schema&&!s.includes("nodes")&&t(Mh()),t(IL(e.payload))}})},BSe=we.child({namespace:"socketio"}),jSe=()=>{pe({actionCreator:NL,effect:(e,{dispatch:t,getState:n})=>{BSe.debug(e.payload,"Disconnected"),t(ML(e.payload))}})},N9=we.child({namespace:"socketio"}),VSe=()=>{pe({actionCreator:GL,effect:(e,{dispatch:t,getState:n})=>{if(n().system.canceledSession===e.payload.data.graph_execution_state_id){N9.trace(e.payload,"Ignored generator progress for canceled session");return}N9.trace(e.payload,`Generator progress (${e.payload.data.node.type})`),t(HL(e.payload))}})},zSe=we.child({namespace:"socketio"}),USe=()=>{pe({actionCreator:zL,effect:(e,{dispatch:t,getState:n})=>{zSe.debug(e.payload,`Session invocation complete (${e.payload.data.graph_execution_state_id})`),t(UL(e.payload))}})},GSe=we.child({namespace:"socketio"}),HSe=["dataURL_image"],WSe=()=>{pe({actionCreator:_3,effect:async(e,{dispatch:t,getState:n,take:r})=>{GSe.debug({data:e.payload},`Invocation complete (${e.payload.data.node.type})`);const i=e.payload.data.graph_execution_state_id,{cancelType:o,isCancelScheduled:s,boardIdToAddTo:a}=n().system;o==="scheduled"&&s&&t(Nl({session_id:i}));const{data:l}=e.payload,{result:u,node:c,graph_execution_state_id:d}=l;if(MF(u)&&!HSe.includes(c.type)){const{image_name:f}=u.image;t(yl({image_name:f}));const[{payload:h}]=await r(yl.fulfilled.match);d===n().canvas.layerState.stagingArea.sessionId&&t(Epe(h)),a&&!h.is_intermediate&&t(Bl.endpoints.addImageToBoard.initiate({board_id:a,image_name:f})),t(q1e(null))}t(jL(e.payload))}})},qSe=we.child({namespace:"socketio"}),KSe=()=>{pe({actionCreator:VL,effect:(e,{dispatch:t,getState:n})=>{qSe.error(e.payload,`Invocation error (${e.payload.data.node.type})`),t(w3(e.payload))}})},M9=we.child({namespace:"socketio"}),YSe=()=>{pe({actionCreator:FL,effect:(e,{dispatch:t,getState:n})=>{if(n().system.canceledSession===e.payload.data.graph_execution_state_id){M9.trace(e.payload,"Ignored invocation started for canceled session");return}M9.debug(e.payload,`Invocation started (${e.payload.data.node.type})`),t(BL(e.payload))}})},XSe=we.child({namespace:"socketio"}),QSe=()=>{pe({actionCreator:S3,effect:(e,{dispatch:t,getState:n})=>{XSe.debug(e.payload,`Subscribed (${e.payload.sessionId}))`),t(DL(e.payload))}})},ZSe=we.child({namespace:"socketio"}),JSe=()=>{pe({actionCreator:LL,effect:(e,{dispatch:t,getState:n})=>{ZSe.debug(e.payload,`Unsubscribed (${e.payload.sessionId})`),t($L(e.payload))}})},e2e=we.child({namespace:"canvas"}),t2e=()=>{pe({actionCreator:ibe,effect:async(e,{dispatch:t,getState:n,take:r})=>{const{imageName:i}=e.payload;t(Qi({image_name:i,is_intermediate:!1}));const[o]=await r(s=>(Qi.fulfilled.match(s)||Qi.rejected.match(s))&&s.meta.arg.image_name===i);if(Qi.rejected.match(o)){e2e.error({data:{arg:o.meta.arg}},"Image saving failed"),t(qt({title:"Image Saving Failed",description:o.error.message,status:"error"}));return}Qi.fulfilled.match(o)&&(t(Ev(o.payload)),t(qt({title:"Image Saved",status:"success"})))}})},Zc=e=>{const[t,n,r]=e.split("/");return{base_model:t,model_name:r}},KF=e=>{const[t,n,r]=e.split("/");return{base_model:t,model_name:r}},Ft="positive_conditioning",Kt="negative_conditioning",wn="text_to_latents",Fr="latents_to_image",Dt="noise",Uo="rand_int",Go="range_of_size",Jr="iterate",_t="main_model_loader",Md="vae_loader",n2e="lora_loader",dt="clip_skip",Ln="image_to_latents",tn="latents_to_latents",Ji="resize_image",As="inpaint",D9="control_net_collect",_2="dynamic_prompt",w2="image_collection",Mg="image_collection_iterate",z3="text_to_image_graph",h0="image_to_image_graph",YF="inpaint_graph",Rp=(e,t,n)=>{const{loras:r}=t.lora,i=h5(r);i>0&&(e.edges=e.edges.filter(a=>!(a.source.node_id===_t&&["unet"].includes(a.source.field))),e.edges=e.edges.filter(a=>!(a.source.node_id===dt&&["clip"].includes(a.source.field))));let o="",s=0;f5(r,a=>{const{id:l,name:u,weight:c}=a,d=KF(l),f=`${n2e}_${d.model_name.replace(".","_")}`,h={type:"lora_loader",id:f,lora:d,weight:c};e.nodes[f]=h,s===0?(e.edges.push({source:{node_id:_t,field:"unet"},destination:{node_id:f,field:"unet"}}),e.edges.push({source:{node_id:dt,field:"clip"},destination:{node_id:f,field:"clip"}})):(e.edges.push({source:{node_id:o,field:"unet"},destination:{node_id:f,field:"unet"}}),e.edges.push({source:{node_id:o,field:"clip"},destination:{node_id:f,field:"clip"}})),s===i-1&&(e.edges.push({source:{node_id:f,field:"unet"},destination:{node_id:n,field:"unet"}}),e.edges.push({source:{node_id:f,field:"clip"},destination:{node_id:Ft,field:"clip"}}),e.edges.push({source:{node_id:f,field:"clip"},destination:{node_id:Kt,field:"clip"}})),o=f,s+=1})},XF=e=>{const[t,n,r]=e.split("/");return{base_model:t,model_name:r}},Ip=(e,t)=>{const{vae:n}=t.generation,r=XF((n==null?void 0:n.id)||""),i=!n;i||(e.nodes[Md]={type:"vae_loader",id:Md,vae_model:r}),(e.id===z3||e.id===h0)&&e.edges.push({source:{node_id:i?_t:Md,field:"vae"},destination:{node_id:Fr,field:"vae"}}),e.id===h0&&e.edges.push({source:{node_id:i?_t:Md,field:"vae"},destination:{node_id:Ln,field:"vae"}}),e.id===YF&&e.edges.push({source:{node_id:i?_t:Md,field:"vae"},destination:{node_id:As,field:"vae"}})};we.child({namespace:"nodes"});const r2e=(e,t,n)=>{const{positivePrompt:r,negativePrompt:i,model:o,cfgScale:s,scheduler:a,steps:l,img2imgStrength:u,shouldFitToWidthHeight:c,iterations:d,seed:f,shouldRandomizeSeed:h,seamSize:p,seamBlur:m,seamSteps:S,seamStrength:v,tileSize:y,infillMethod:g,clipSkip:b}=e.generation,{width:_,height:w}=e.canvas.boundingBoxDimensions,{scaledBoundingBoxDimensions:x,boundingBoxScaleMethod:C}=e.canvas,k=Zc((o==null?void 0:o.id)||""),P={id:YF,nodes:{[As]:{type:"inpaint",id:As,steps:l,width:_,height:w,cfg_scale:s,scheduler:a,image:{image_name:t.image_name},strength:u,fit:c,mask:{image_name:n.image_name},seam_size:p,seam_blur:m,seam_strength:v,seam_steps:S,tile_size:g==="tile"?y:void 0,infill_method:g,inpaint_width:C!=="none"?x.width:void 0,inpaint_height:C!=="none"?x.height:void 0},[Ft]:{type:"compel",id:Ft,prompt:r},[Kt]:{type:"compel",id:Kt,prompt:i},[_t]:{type:"main_model_loader",id:_t,model:k},[dt]:{type:"clip_skip",id:dt,skipped_layers:b},[Go]:{type:"range_of_size",id:Go,size:d,step:1},[Jr]:{type:"iterate",id:Jr}},edges:[{source:{node_id:_t,field:"unet"},destination:{node_id:As,field:"unet"}},{source:{node_id:_t,field:"clip"},destination:{node_id:dt,field:"clip"}},{source:{node_id:dt,field:"clip"},destination:{node_id:Ft,field:"clip"}},{source:{node_id:dt,field:"clip"},destination:{node_id:Kt,field:"clip"}},{source:{node_id:Kt,field:"conditioning"},destination:{node_id:As,field:"negative_conditioning"}},{source:{node_id:Ft,field:"conditioning"},destination:{node_id:As,field:"positive_conditioning"}},{source:{node_id:Go,field:"collection"},destination:{node_id:Jr,field:"collection"}},{source:{node_id:Jr,field:"item"},destination:{node_id:As,field:"seed"}}]};if(Rp(P,e,As),Ip(P,e),h){const A={id:Uo,type:"rand_int"};P.nodes[Uo]=A,P.edges.push({source:{node_id:Uo,field:"a"},destination:{node_id:Go,field:"start"}})}else P.nodes[Go].start=f;return P},i2e=e=>iI(e,n=>n.isEnabled&&(!!n.processedControlImage||n.processorType==="none"&&!!n.controlImage)),C1=(e,t,n)=>{const{isEnabled:r,controlNets:i}=n.controlNet,o=i2e(i);if(r&&o.length){if(o.length>1){const s={id:D9,type:"collect"};e.nodes[s.id]=s,e.edges.push({source:{node_id:s.id,field:"collection"},destination:{node_id:t,field:"control"}})}o.forEach(s=>{const{controlNetId:a,controlImage:l,processedControlImage:u,beginStepPct:c,endStepPct:d,controlMode:f,model:h,processorType:p,weight:m}=s,S={id:`control_net_${a}`,type:"controlnet",begin_step_percent:c,end_step_percent:d,control_mode:f,control_model:h,control_weight:m};if(u&&p!=="none")S.image={image_name:u};else if(l)S.image={image_name:l};else return;e.nodes[S.id]=S,o.length>1?e.edges.push({source:{node_id:S.id,field:"control"},destination:{node_id:D9,field:"item"}}):e.edges.push({source:{node_id:S.id,field:"control"},destination:{node_id:t,field:"control"}})})}},T1=(e,t)=>{const{positivePrompt:n,iterations:r,seed:i,shouldRandomizeSeed:o}=t.generation,{combinatorial:s,isEnabled:a,maxPrompts:l}=t.dynamicPrompts;if(a){EZ(e.nodes[Ft],"prompt");const u={id:_2,type:"dynamic_prompt",max_prompts:s?l:r,combinatorial:s,prompt:n},c={id:Jr,type:"iterate"};if(e.nodes[_2]=u,e.nodes[Jr]=c,e.edges.push({source:{node_id:_2,field:"prompt_collection"},destination:{node_id:Jr,field:"collection"}},{source:{node_id:Jr,field:"item"},destination:{node_id:Ft,field:"prompt"}}),o){const d={id:Uo,type:"rand_int"};e.nodes[Uo]=d,e.edges.push({source:{node_id:Uo,field:"a"},destination:{node_id:Dt,field:"seed"}})}else e.nodes[Dt].seed=i}else{const u={id:Go,type:"range_of_size",size:r,step:1},c={id:Jr,type:"iterate"};if(e.nodes[Jr]=c,e.nodes[Go]=u,e.edges.push({source:{node_id:Go,field:"collection"},destination:{node_id:Jr,field:"collection"}}),e.edges.push({source:{node_id:Jr,field:"item"},destination:{node_id:Dt,field:"seed"}}),o){const d={id:Uo,type:"rand_int"};e.nodes[Uo]=d,e.edges.push({source:{node_id:Uo,field:"a"},destination:{node_id:Go,field:"start"}})}else u.start=i}};we.child({namespace:"nodes"});const o2e=(e,t)=>{const{positivePrompt:n,negativePrompt:r,model:i,cfgScale:o,scheduler:s,steps:a,img2imgStrength:l,clipSkip:u,shouldUseCpuNoise:c,shouldUseNoiseSettings:d}=e.generation,{width:f,height:h}=e.canvas.boundingBoxDimensions,p=Zc((i==null?void 0:i.id)||""),m=d?c:Fl.shouldUseCpuNoise,S={id:h0,nodes:{[Ft]:{type:"compel",id:Ft,prompt:n},[Kt]:{type:"compel",id:Kt,prompt:r},[Dt]:{type:"noise",id:Dt,use_cpu:m},[_t]:{type:"main_model_loader",id:_t,model:p},[dt]:{type:"clip_skip",id:dt,skipped_layers:u},[Fr]:{type:"l2i",id:Fr},[tn]:{type:"l2l",id:tn,cfg_scale:o,scheduler:s,steps:a,strength:l},[Ln]:{type:"i2l",id:Ln}},edges:[{source:{node_id:_t,field:"clip"},destination:{node_id:dt,field:"clip"}},{source:{node_id:dt,field:"clip"},destination:{node_id:Ft,field:"clip"}},{source:{node_id:dt,field:"clip"},destination:{node_id:Kt,field:"clip"}},{source:{node_id:tn,field:"latents"},destination:{node_id:Fr,field:"latents"}},{source:{node_id:Ln,field:"latents"},destination:{node_id:tn,field:"latents"}},{source:{node_id:Dt,field:"noise"},destination:{node_id:tn,field:"noise"}},{source:{node_id:_t,field:"unet"},destination:{node_id:tn,field:"unet"}},{source:{node_id:Kt,field:"conditioning"},destination:{node_id:tn,field:"negative_conditioning"}},{source:{node_id:Ft,field:"conditioning"},destination:{node_id:tn,field:"positive_conditioning"}}]};if(t.width!==f||t.height!==h){const v={id:Ji,type:"img_resize",image:{image_name:t.image_name},is_intermediate:!0,width:f,height:h};S.nodes[Ji]=v,S.edges.push({source:{node_id:Ji,field:"image"},destination:{node_id:Ln,field:"image"}}),S.edges.push({source:{node_id:Ji,field:"width"},destination:{node_id:Dt,field:"width"}}),S.edges.push({source:{node_id:Ji,field:"height"},destination:{node_id:Dt,field:"height"}})}else S.nodes[Ln].image={image_name:t.image_name},S.edges.push({source:{node_id:Ln,field:"width"},destination:{node_id:Dt,field:"width"}}),S.edges.push({source:{node_id:Ln,field:"height"},destination:{node_id:Dt,field:"height"}});return Rp(S,e,tn),Ip(S,e),T1(S,e),C1(S,tn,e),S},s2e=e=>{const{positivePrompt:t,negativePrompt:n,model:r,cfgScale:i,scheduler:o,steps:s,clipSkip:a,shouldUseCpuNoise:l,shouldUseNoiseSettings:u}=e.generation,{width:c,height:d}=e.canvas.boundingBoxDimensions,f=Zc((r==null?void 0:r.id)||""),h=u?l:Fl.shouldUseCpuNoise,p={id:z3,nodes:{[Ft]:{type:"compel",id:Ft,prompt:t},[Kt]:{type:"compel",id:Kt,prompt:n},[Dt]:{type:"noise",id:Dt,width:c,height:d,use_cpu:h},[wn]:{type:"t2l",id:wn,cfg_scale:i,scheduler:o,steps:s},[_t]:{type:"main_model_loader",id:_t,model:f},[dt]:{type:"clip_skip",id:dt,skipped_layers:a},[Fr]:{type:"l2i",id:Fr}},edges:[{source:{node_id:Kt,field:"conditioning"},destination:{node_id:wn,field:"negative_conditioning"}},{source:{node_id:Ft,field:"conditioning"},destination:{node_id:wn,field:"positive_conditioning"}},{source:{node_id:_t,field:"clip"},destination:{node_id:dt,field:"clip"}},{source:{node_id:dt,field:"clip"},destination:{node_id:Ft,field:"clip"}},{source:{node_id:dt,field:"clip"},destination:{node_id:Kt,field:"clip"}},{source:{node_id:_t,field:"unet"},destination:{node_id:wn,field:"unet"}},{source:{node_id:wn,field:"latents"},destination:{node_id:Fr,field:"latents"}},{source:{node_id:Dt,field:"noise"},destination:{node_id:wn,field:"noise"}}]};return Rp(p,e,wn),Ip(p,e),T1(p,e),C1(p,wn,e),p};we.child({namespace:"nodes"});const a2e=(e,t,n,r)=>{let i;if(t==="txt2img")i=s2e(e);else if(t==="img2img"){if(!n)throw new Error("Missing canvas init image");i=o2e(e,n)}else{if(!n||!r)throw new Error("Missing canvas init and mask images");i=r2e(e,n,r)}return f5(i.nodes,o=>{i.nodes[o.id].is_intermediate=!0}),i},QF=me("nodes/textToImageGraphBuilt"),ZF=me("nodes/imageToImageGraphBuilt"),JF=me("nodes/canvasGraphBuilt"),eB=me("nodes/nodesGraphBuilt"),l2e=hs(QF,ZF,JF,eB);var U3={exports:{}},E1={},tB={},De={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e._registerNode=e.Konva=e.glob=void 0;var t=Math.PI/180;function n(){return typeof window<"u"&&({}.toString.call(window)==="[object Window]"||{}.toString.call(window)==="[object global]")}e.glob=typeof Me<"u"?Me:typeof window<"u"?window:typeof WorkerGlobalScope<"u"?self:{},e.Konva={_global:e.glob,version:"9.2.0",isBrowser:n(),isUnminified:/param/.test(function(i){}.toString()),dblClickWindow:400,getAngle(i){return e.Konva.angleDeg?i*t:i},enableTrace:!1,pointerEventsEnabled:!0,autoDrawEnabled:!0,hitOnDragEnabled:!1,capturePointerEventsEnabled:!1,_mouseListenClick:!1,_touchListenClick:!1,_pointerListenClick:!1,_mouseInDblClickWindow:!1,_touchInDblClickWindow:!1,_pointerInDblClickWindow:!1,_mouseDblClickPointerId:null,_touchDblClickPointerId:null,_pointerDblClickPointerId:null,pixelRatio:typeof window<"u"&&window.devicePixelRatio||1,dragDistance:3,angleDeg:!0,showWarnings:!0,dragButtons:[0,1],isDragging(){return e.Konva.DD.isDragging},isDragReady(){return!!e.Konva.DD.node},releaseCanvasOnDestroy:!0,document:e.glob.document,_injectGlobal(i){e.glob.Konva=i}};const r=i=>{e.Konva[i.prototype.getClassName()]=i};e._registerNode=r,e.Konva._injectGlobal(e.Konva)})(De);var Vt={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.Util=e.Transform=void 0;const t=De;class n{constructor(b=[1,0,0,1,0,0]){this.dirty=!1,this.m=b&&b.slice()||[1,0,0,1,0,0]}reset(){this.m[0]=1,this.m[1]=0,this.m[2]=0,this.m[3]=1,this.m[4]=0,this.m[5]=0}copy(){return new n(this.m)}copyInto(b){b.m[0]=this.m[0],b.m[1]=this.m[1],b.m[2]=this.m[2],b.m[3]=this.m[3],b.m[4]=this.m[4],b.m[5]=this.m[5]}point(b){var _=this.m;return{x:_[0]*b.x+_[2]*b.y+_[4],y:_[1]*b.x+_[3]*b.y+_[5]}}translate(b,_){return this.m[4]+=this.m[0]*b+this.m[2]*_,this.m[5]+=this.m[1]*b+this.m[3]*_,this}scale(b,_){return this.m[0]*=b,this.m[1]*=b,this.m[2]*=_,this.m[3]*=_,this}rotate(b){var _=Math.cos(b),w=Math.sin(b),x=this.m[0]*_+this.m[2]*w,C=this.m[1]*_+this.m[3]*w,k=this.m[0]*-w+this.m[2]*_,P=this.m[1]*-w+this.m[3]*_;return this.m[0]=x,this.m[1]=C,this.m[2]=k,this.m[3]=P,this}getTranslation(){return{x:this.m[4],y:this.m[5]}}skew(b,_){var w=this.m[0]+this.m[2]*_,x=this.m[1]+this.m[3]*_,C=this.m[2]+this.m[0]*b,k=this.m[3]+this.m[1]*b;return this.m[0]=w,this.m[1]=x,this.m[2]=C,this.m[3]=k,this}multiply(b){var _=this.m[0]*b.m[0]+this.m[2]*b.m[1],w=this.m[1]*b.m[0]+this.m[3]*b.m[1],x=this.m[0]*b.m[2]+this.m[2]*b.m[3],C=this.m[1]*b.m[2]+this.m[3]*b.m[3],k=this.m[0]*b.m[4]+this.m[2]*b.m[5]+this.m[4],P=this.m[1]*b.m[4]+this.m[3]*b.m[5]+this.m[5];return this.m[0]=_,this.m[1]=w,this.m[2]=x,this.m[3]=C,this.m[4]=k,this.m[5]=P,this}invert(){var b=1/(this.m[0]*this.m[3]-this.m[1]*this.m[2]),_=this.m[3]*b,w=-this.m[1]*b,x=-this.m[2]*b,C=this.m[0]*b,k=b*(this.m[2]*this.m[5]-this.m[3]*this.m[4]),P=b*(this.m[1]*this.m[4]-this.m[0]*this.m[5]);return this.m[0]=_,this.m[1]=w,this.m[2]=x,this.m[3]=C,this.m[4]=k,this.m[5]=P,this}getMatrix(){return this.m}decompose(){var b=this.m[0],_=this.m[1],w=this.m[2],x=this.m[3],C=this.m[4],k=this.m[5],P=b*x-_*w;let A={x:C,y:k,rotation:0,scaleX:0,scaleY:0,skewX:0,skewY:0};if(b!=0||_!=0){var $=Math.sqrt(b*b+_*_);A.rotation=_>0?Math.acos(b/$):-Math.acos(b/$),A.scaleX=$,A.scaleY=P/$,A.skewX=(b*w+_*x)/P,A.skewY=0}else if(w!=0||x!=0){var M=Math.sqrt(w*w+x*x);A.rotation=Math.PI/2-(x>0?Math.acos(-w/M):-Math.acos(w/M)),A.scaleX=P/M,A.scaleY=M,A.skewX=0,A.skewY=(b*w+_*x)/P}return A.rotation=e.Util._getRotation(A.rotation),A}}e.Transform=n;var r="[object Array]",i="[object Number]",o="[object String]",s="[object Boolean]",a=Math.PI/180,l=180/Math.PI,u="#",c="",d="0",f="Konva warning: ",h="Konva error: ",p="rgb(",m={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,132,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,255,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,203],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[119,128,144],slategrey:[119,128,144],snow:[255,255,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],transparent:[255,255,255,0],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,5]},S=/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/,v=[];const y=typeof requestAnimationFrame<"u"&&requestAnimationFrame||function(g){setTimeout(g,60)};e.Util={_isElement(g){return!!(g&&g.nodeType==1)},_isFunction(g){return!!(g&&g.constructor&&g.call&&g.apply)},_isPlainObject(g){return!!g&&g.constructor===Object},_isArray(g){return Object.prototype.toString.call(g)===r},_isNumber(g){return Object.prototype.toString.call(g)===i&&!isNaN(g)&&isFinite(g)},_isString(g){return Object.prototype.toString.call(g)===o},_isBoolean(g){return Object.prototype.toString.call(g)===s},isObject(g){return g instanceof Object},isValidSelector(g){if(typeof g!="string")return!1;var b=g[0];return b==="#"||b==="."||b===b.toUpperCase()},_sign(g){return g===0||g>0?1:-1},requestAnimFrame(g){v.push(g),v.length===1&&y(function(){const b=v;v=[],b.forEach(function(_){_()})})},createCanvasElement(){var g=document.createElement("canvas");try{g.style=g.style||{}}catch{}return g},createImageElement(){return document.createElement("img")},_isInDocument(g){for(;g=g.parentNode;)if(g==document)return!0;return!1},_urlToImage(g,b){var _=e.Util.createImageElement();_.onload=function(){b(_)},_.src=g},_rgbToHex(g,b,_){return((1<<24)+(g<<16)+(b<<8)+_).toString(16).slice(1)},_hexToRgb(g){g=g.replace(u,c);var b=parseInt(g,16);return{r:b>>16&255,g:b>>8&255,b:b&255}},getRandomColor(){for(var g=(Math.random()*16777215<<0).toString(16);g.length<6;)g=d+g;return u+g},getRGB(g){var b;return g in m?(b=m[g],{r:b[0],g:b[1],b:b[2]}):g[0]===u?this._hexToRgb(g.substring(1)):g.substr(0,4)===p?(b=S.exec(g.replace(/ /g,"")),{r:parseInt(b[1],10),g:parseInt(b[2],10),b:parseInt(b[3],10)}):{r:0,g:0,b:0}},colorToRGBA(g){return g=g||"black",e.Util._namedColorToRBA(g)||e.Util._hex3ColorToRGBA(g)||e.Util._hex4ColorToRGBA(g)||e.Util._hex6ColorToRGBA(g)||e.Util._hex8ColorToRGBA(g)||e.Util._rgbColorToRGBA(g)||e.Util._rgbaColorToRGBA(g)||e.Util._hslColorToRGBA(g)},_namedColorToRBA(g){var b=m[g.toLowerCase()];return b?{r:b[0],g:b[1],b:b[2],a:1}:null},_rgbColorToRGBA(g){if(g.indexOf("rgb(")===0){g=g.match(/rgb\(([^)]+)\)/)[1];var b=g.split(/ *, */).map(Number);return{r:b[0],g:b[1],b:b[2],a:1}}},_rgbaColorToRGBA(g){if(g.indexOf("rgba(")===0){g=g.match(/rgba\(([^)]+)\)/)[1];var b=g.split(/ *, */).map((_,w)=>_.slice(-1)==="%"?w===3?parseInt(_)/100:parseInt(_)/100*255:Number(_));return{r:b[0],g:b[1],b:b[2],a:b[3]}}},_hex8ColorToRGBA(g){if(g[0]==="#"&&g.length===9)return{r:parseInt(g.slice(1,3),16),g:parseInt(g.slice(3,5),16),b:parseInt(g.slice(5,7),16),a:parseInt(g.slice(7,9),16)/255}},_hex6ColorToRGBA(g){if(g[0]==="#"&&g.length===7)return{r:parseInt(g.slice(1,3),16),g:parseInt(g.slice(3,5),16),b:parseInt(g.slice(5,7),16),a:1}},_hex4ColorToRGBA(g){if(g[0]==="#"&&g.length===5)return{r:parseInt(g[1]+g[1],16),g:parseInt(g[2]+g[2],16),b:parseInt(g[3]+g[3],16),a:parseInt(g[4]+g[4],16)/255}},_hex3ColorToRGBA(g){if(g[0]==="#"&&g.length===4)return{r:parseInt(g[1]+g[1],16),g:parseInt(g[2]+g[2],16),b:parseInt(g[3]+g[3],16),a:1}},_hslColorToRGBA(g){if(/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.test(g)){const[b,..._]=/hsl\((\d+),\s*([\d.]+)%,\s*([\d.]+)%\)/g.exec(g),w=Number(_[0])/360,x=Number(_[1])/100,C=Number(_[2])/100;let k,P,A;if(x===0)return A=C*255,{r:Math.round(A),g:Math.round(A),b:Math.round(A),a:1};C<.5?k=C*(1+x):k=C+x-C*x;const $=2*C-k,M=[0,0,0];for(let T=0;T<3;T++)P=w+1/3*-(T-1),P<0&&P++,P>1&&P--,6*P<1?A=$+(k-$)*6*P:2*P<1?A=k:3*P<2?A=$+(k-$)*(2/3-P)*6:A=$,M[T]=A*255;return{r:Math.round(M[0]),g:Math.round(M[1]),b:Math.round(M[2]),a:1}}},haveIntersection(g,b){return!(b.x>g.x+g.width||b.x+b.widthg.y+g.height||b.y+b.height1?(k=_,P=w,A=(_-x)*(_-x)+(w-C)*(w-C)):(k=g+M*(_-g),P=b+M*(w-b),A=(k-x)*(k-x)+(P-C)*(P-C))}return[k,P,A]},_getProjectionToLine(g,b,_){var w=e.Util.cloneObject(g),x=Number.MAX_VALUE;return b.forEach(function(C,k){if(!(!_&&k===b.length-1)){var P=b[(k+1)%b.length],A=e.Util._getProjectionToSegment(C.x,C.y,P.x,P.y,g.x,g.y),$=A[0],M=A[1],T=A[2];Tb.length){var k=b;b=g,g=k}for(w=0;w{b.width=0,b.height=0})},drawRoundedRectPath(g,b,_,w){let x=0,C=0,k=0,P=0;typeof w=="number"?x=C=k=P=Math.min(w,b/2,_/2):(x=Math.min(w[0]||0,b/2,_/2),C=Math.min(w[1]||0,b/2,_/2),P=Math.min(w[2]||0,b/2,_/2),k=Math.min(w[3]||0,b/2,_/2)),g.moveTo(x,0),g.lineTo(b-C,0),g.arc(b-C,C,C,Math.PI*3/2,0,!1),g.lineTo(b,_-P),g.arc(b-P,_-P,P,0,Math.PI/2,!1),g.lineTo(k,_),g.arc(k,_-k,k,Math.PI/2,Math.PI,!1),g.lineTo(0,x),g.arc(x,x,x,Math.PI,Math.PI*3/2,!1)}}})(Vt);var At={},Re={},fe={};Object.defineProperty(fe,"__esModule",{value:!0});fe.getComponentValidator=fe.getBooleanValidator=fe.getNumberArrayValidator=fe.getFunctionValidator=fe.getStringOrGradientValidator=fe.getStringValidator=fe.getNumberOrAutoValidator=fe.getNumberOrArrayOfNumbersValidator=fe.getNumberValidator=fe.alphaComponent=fe.RGBComponent=void 0;const ms=De,Ut=Vt;function ys(e){return Ut.Util._isString(e)?'"'+e+'"':Object.prototype.toString.call(e)==="[object Number]"||Ut.Util._isBoolean(e)?e:Object.prototype.toString.call(e)}function u2e(e){return e>255?255:e<0?0:Math.round(e)}fe.RGBComponent=u2e;function c2e(e){return e>1?1:e<1e-4?1e-4:e}fe.alphaComponent=c2e;function d2e(){if(ms.Konva.isUnminified)return function(e,t){return Ut.Util._isNumber(e)||Ut.Util.warn(ys(e)+' is a not valid value for "'+t+'" attribute. The value should be a number.'),e}}fe.getNumberValidator=d2e;function f2e(e){if(ms.Konva.isUnminified)return function(t,n){let r=Ut.Util._isNumber(t),i=Ut.Util._isArray(t)&&t.length==e;return!r&&!i&&Ut.Util.warn(ys(t)+' is a not valid value for "'+n+'" attribute. The value should be a number or Array('+e+")"),t}}fe.getNumberOrArrayOfNumbersValidator=f2e;function h2e(){if(ms.Konva.isUnminified)return function(e,t){var n=Ut.Util._isNumber(e),r=e==="auto";return n||r||Ut.Util.warn(ys(e)+' is a not valid value for "'+t+'" attribute. The value should be a number or "auto".'),e}}fe.getNumberOrAutoValidator=h2e;function p2e(){if(ms.Konva.isUnminified)return function(e,t){return Ut.Util._isString(e)||Ut.Util.warn(ys(e)+' is a not valid value for "'+t+'" attribute. The value should be a string.'),e}}fe.getStringValidator=p2e;function g2e(){if(ms.Konva.isUnminified)return function(e,t){const n=Ut.Util._isString(e),r=Object.prototype.toString.call(e)==="[object CanvasGradient]"||e&&e.addColorStop;return n||r||Ut.Util.warn(ys(e)+' is a not valid value for "'+t+'" attribute. The value should be a string or a native gradient.'),e}}fe.getStringOrGradientValidator=g2e;function m2e(){if(ms.Konva.isUnminified)return function(e,t){return Ut.Util._isFunction(e)||Ut.Util.warn(ys(e)+' is a not valid value for "'+t+'" attribute. The value should be a function.'),e}}fe.getFunctionValidator=m2e;function y2e(){if(ms.Konva.isUnminified)return function(e,t){const n=Int8Array?Object.getPrototypeOf(Int8Array):null;return n&&e instanceof n||(Ut.Util._isArray(e)?e.forEach(function(r){Ut.Util._isNumber(r)||Ut.Util.warn('"'+t+'" attribute has non numeric element '+r+". Make sure that all elements are numbers.")}):Ut.Util.warn(ys(e)+' is a not valid value for "'+t+'" attribute. The value should be a array of numbers.')),e}}fe.getNumberArrayValidator=y2e;function v2e(){if(ms.Konva.isUnminified)return function(e,t){var n=e===!0||e===!1;return n||Ut.Util.warn(ys(e)+' is a not valid value for "'+t+'" attribute. The value should be a boolean.'),e}}fe.getBooleanValidator=v2e;function b2e(e){if(ms.Konva.isUnminified)return function(t,n){return t==null||Ut.Util.isObject(t)||Ut.Util.warn(ys(t)+' is a not valid value for "'+n+'" attribute. The value should be an object with properties '+e),t}}fe.getComponentValidator=b2e;(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.Factory=void 0;const t=Vt,n=fe;var r="get",i="set";e.Factory={addGetterSetter(o,s,a,l,u){e.Factory.addGetter(o,s,a),e.Factory.addSetter(o,s,l,u),e.Factory.addOverloadedGetterSetter(o,s)},addGetter(o,s,a){var l=r+t.Util._capitalize(s);o.prototype[l]=o.prototype[l]||function(){var u=this.attrs[s];return u===void 0?a:u}},addSetter(o,s,a,l){var u=i+t.Util._capitalize(s);o.prototype[u]||e.Factory.overWriteSetter(o,s,a,l)},overWriteSetter(o,s,a,l){var u=i+t.Util._capitalize(s);o.prototype[u]=function(c){return a&&c!==void 0&&c!==null&&(c=a.call(this,c,s)),this._setAttr(s,c),l&&l.call(this),this}},addComponentsGetterSetter(o,s,a,l,u){var c=a.length,d=t.Util._capitalize,f=r+d(s),h=i+d(s),p,m;o.prototype[f]=function(){var v={};for(p=0;p{this._setAttr(s+d(b),void 0)}),this._fireChangeEvent(s,y,v),u&&u.call(this),this},e.Factory.addOverloadedGetterSetter(o,s)},addOverloadedGetterSetter(o,s){var a=t.Util._capitalize(s),l=i+a,u=r+a;o.prototype[s]=function(){return arguments.length?(this[l](arguments[0]),this):this[u]()}},addDeprecatedGetterSetter(o,s,a,l){t.Util.error("Adding deprecated "+s);var u=r+t.Util._capitalize(s),c=s+" property is deprecated and will be removed soon. Look at Konva change log for more information.";o.prototype[u]=function(){t.Util.error(c);var d=this.attrs[s];return d===void 0?a:d},e.Factory.addSetter(o,s,l,function(){t.Util.error(c)}),e.Factory.addOverloadedGetterSetter(o,s)},backCompat(o,s){t.Util.each(s,function(a,l){var u=o.prototype[l],c=r+t.Util._capitalize(a),d=i+t.Util._capitalize(a);function f(){u.apply(this,arguments),t.Util.error('"'+a+'" method is deprecated and will be removed soon. Use ""'+l+'" instead.')}o.prototype[a]=f,o.prototype[c]=f,o.prototype[d]=f})},afterSetFilter(){this._filterUpToDate=!1}}})(Re);var Ni={},ts={};Object.defineProperty(ts,"__esModule",{value:!0});ts.HitContext=ts.SceneContext=ts.Context=void 0;const nB=Vt,S2e=De;function _2e(e){var t=[],n=e.length,r=nB.Util,i,o;for(i=0;itypeof c=="number"?Math.floor(c):c)),o+=w2e+u.join(L9)+x2e)):(o+=a.property,t||(o+=k2e+a.val)),o+=E2e;return o}clearTrace(){this.traceArr=[]}_trace(t){var n=this.traceArr,r;n.push(t),r=n.length,r>=O2e&&n.shift()}reset(){var t=this.getCanvas().getPixelRatio();this.setTransform(1*t,0,0,1*t,0,0)}getCanvas(){return this.canvas}clear(t){var n=this.getCanvas();t?this.clearRect(t.x||0,t.y||0,t.width||0,t.height||0):this.clearRect(0,0,n.getWidth()/n.pixelRatio,n.getHeight()/n.pixelRatio)}_applyLineCap(t){const n=t.attrs.lineCap;n&&this.setAttr("lineCap",n)}_applyOpacity(t){var n=t.getAbsoluteOpacity();n!==1&&this.setAttr("globalAlpha",n)}_applyLineJoin(t){const n=t.attrs.lineJoin;n&&this.setAttr("lineJoin",n)}setAttr(t,n){this._context[t]=n}arc(t,n,r,i,o,s){this._context.arc(t,n,r,i,o,s)}arcTo(t,n,r,i,o){this._context.arcTo(t,n,r,i,o)}beginPath(){this._context.beginPath()}bezierCurveTo(t,n,r,i,o,s){this._context.bezierCurveTo(t,n,r,i,o,s)}clearRect(t,n,r,i){this._context.clearRect(t,n,r,i)}clip(...t){this._context.clip.apply(this._context,t)}closePath(){this._context.closePath()}createImageData(t,n){var r=arguments;if(r.length===2)return this._context.createImageData(t,n);if(r.length===1)return this._context.createImageData(t)}createLinearGradient(t,n,r,i){return this._context.createLinearGradient(t,n,r,i)}createPattern(t,n){return this._context.createPattern(t,n)}createRadialGradient(t,n,r,i,o,s){return this._context.createRadialGradient(t,n,r,i,o,s)}drawImage(t,n,r,i,o,s,a,l,u){var c=arguments,d=this._context;c.length===3?d.drawImage(t,n,r):c.length===5?d.drawImage(t,n,r,i,o):c.length===9&&d.drawImage(t,n,r,i,o,s,a,l,u)}ellipse(t,n,r,i,o,s,a,l){this._context.ellipse(t,n,r,i,o,s,a,l)}isPointInPath(t,n,r,i){return r?this._context.isPointInPath(r,t,n,i):this._context.isPointInPath(t,n,i)}fill(...t){this._context.fill.apply(this._context,t)}fillRect(t,n,r,i){this._context.fillRect(t,n,r,i)}strokeRect(t,n,r,i){this._context.strokeRect(t,n,r,i)}fillText(t,n,r,i){i?this._context.fillText(t,n,r,i):this._context.fillText(t,n,r)}measureText(t){return this._context.measureText(t)}getImageData(t,n,r,i){return this._context.getImageData(t,n,r,i)}lineTo(t,n){this._context.lineTo(t,n)}moveTo(t,n){this._context.moveTo(t,n)}rect(t,n,r,i){this._context.rect(t,n,r,i)}putImageData(t,n,r){this._context.putImageData(t,n,r)}quadraticCurveTo(t,n,r,i){this._context.quadraticCurveTo(t,n,r,i)}restore(){this._context.restore()}rotate(t){this._context.rotate(t)}save(){this._context.save()}scale(t,n){this._context.scale(t,n)}setLineDash(t){this._context.setLineDash?this._context.setLineDash(t):"mozDash"in this._context?this._context.mozDash=t:"webkitLineDash"in this._context&&(this._context.webkitLineDash=t)}getLineDash(){return this._context.getLineDash()}setTransform(t,n,r,i,o,s){this._context.setTransform(t,n,r,i,o,s)}stroke(t){t?this._context.stroke(t):this._context.stroke()}strokeText(t,n,r,i){this._context.strokeText(t,n,r,i)}transform(t,n,r,i,o,s){this._context.transform(t,n,r,i,o,s)}translate(t,n){this._context.translate(t,n)}_enableTrace(){var t=this,n=$9.length,r=this.setAttr,i,o,s=function(a){var l=t[a],u;t[a]=function(){return o=_2e(Array.prototype.slice.call(arguments,0)),u=l.apply(t,arguments),t._trace({method:a,args:o}),u}};for(i=0;i{i.dragStatus==="dragging"&&(r=!0)}),r},justDragged:!1,get node(){var r;return e.DD._dragElements.forEach(i=>{r=i.node}),r},_dragElements:new Map,_drag(r){const i=[];e.DD._dragElements.forEach((o,s)=>{const{node:a}=o,l=a.getStage();l.setPointersPositions(r),o.pointerId===void 0&&(o.pointerId=n.Util._getFirstPointerId(r));const u=l._changedPointerPositions.find(f=>f.id===o.pointerId);if(u){if(o.dragStatus!=="dragging"){var c=a.dragDistance(),d=Math.max(Math.abs(u.x-o.startPointerPos.x),Math.abs(u.y-o.startPointerPos.y));if(d{o.fire("dragmove",{type:"dragmove",target:o,evt:r},!0)})},_endDragBefore(r){const i=[];e.DD._dragElements.forEach(o=>{const{node:s}=o,a=s.getStage();if(r&&a.setPointersPositions(r),!a._changedPointerPositions.find(c=>c.id===o.pointerId))return;(o.dragStatus==="dragging"||o.dragStatus==="stopped")&&(e.DD.justDragged=!0,t.Konva._mouseListenClick=!1,t.Konva._touchListenClick=!1,t.Konva._pointerListenClick=!1,o.dragStatus="stopped");const u=o.node.getLayer()||o.node instanceof t.Konva.Stage&&o.node;u&&i.indexOf(u)===-1&&i.push(u)}),i.forEach(o=>{o.draw()})},_endDragAfter(r){e.DD._dragElements.forEach((i,o)=>{i.dragStatus==="stopped"&&i.node.fire("dragend",{type:"dragend",target:i.node,evt:r},!0),i.dragStatus!=="dragging"&&e.DD._dragElements.delete(o)})}},t.Konva.isBrowser&&(window.addEventListener("mouseup",e.DD._endDragBefore,!0),window.addEventListener("touchend",e.DD._endDragBefore,!0),window.addEventListener("mousemove",e.DD._drag),window.addEventListener("touchmove",e.DD._drag),window.addEventListener("mouseup",e.DD._endDragAfter,!1),window.addEventListener("touchend",e.DD._endDragAfter,!1))})(A1);Object.defineProperty(At,"__esModule",{value:!0});At.Node=void 0;const Be=Vt,Np=Re,Lg=Ni,Fa=De,Qr=A1,Xt=fe;var Pm="absoluteOpacity",$g="allEventListeners",Fo="absoluteTransform",F9="absoluteScale",Ba="canvas",F2e="Change",B2e="children",j2e="konva",mx="listening",B9="mouseenter",j9="mouseleave",V9="set",z9="Shape",km=" ",U9="stage",Os="transform",V2e="Stage",yx="visible",z2e=["xChange.konva","yChange.konva","scaleXChange.konva","scaleYChange.konva","skewXChange.konva","skewYChange.konva","rotationChange.konva","offsetXChange.konva","offsetYChange.konva","transformsEnabledChange.konva"].join(km);let U2e=1,Ee=class vx{constructor(t){this._id=U2e++,this.eventListeners={},this.attrs={},this.index=0,this._allEventListeners=null,this.parent=null,this._cache=new Map,this._attachedDepsListeners=new Map,this._lastPos=null,this._batchingTransformChange=!1,this._needClearTransformCache=!1,this._filterUpToDate=!1,this._isUnderCache=!1,this._dragEventId=null,this._shouldFireChangeEvents=!1,this.setAttrs(t),this._shouldFireChangeEvents=!0}hasChildren(){return!1}_clearCache(t){(t===Os||t===Fo)&&this._cache.get(t)?this._cache.get(t).dirty=!0:t?this._cache.delete(t):this._cache.clear()}_getCache(t,n){var r=this._cache.get(t),i=t===Os||t===Fo,o=r===void 0||i&&r.dirty===!0;return o&&(r=n.call(this),this._cache.set(t,r)),r}_calculate(t,n,r){if(!this._attachedDepsListeners.get(t)){const i=n.map(o=>o+"Change.konva").join(km);this.on(i,()=>{this._clearCache(t)}),this._attachedDepsListeners.set(t,!0)}return this._getCache(t,r)}_getCanvasCache(){return this._cache.get(Ba)}_clearSelfAndDescendantCache(t){this._clearCache(t),t===Fo&&this.fire("absoluteTransformChange")}clearCache(){if(this._cache.has(Ba)){const{scene:t,filter:n,hit:r}=this._cache.get(Ba);Be.Util.releaseCanvas(t,n,r),this._cache.delete(Ba)}return this._clearSelfAndDescendantCache(),this._requestDraw(),this}cache(t){var n=t||{},r={};(n.x===void 0||n.y===void 0||n.width===void 0||n.height===void 0)&&(r=this.getClientRect({skipTransform:!0,relativeTo:this.getParent()}));var i=Math.ceil(n.width||r.width),o=Math.ceil(n.height||r.height),s=n.pixelRatio,a=n.x===void 0?Math.floor(r.x):n.x,l=n.y===void 0?Math.floor(r.y):n.y,u=n.offset||0,c=n.drawBorder||!1,d=n.hitCanvasPixelRatio||1;if(!i||!o){Be.Util.error("Can not cache the node. Width or height of the node equals 0. Caching is skipped.");return}i+=u*2+1,o+=u*2+1,a-=u,l-=u;var f=new Lg.SceneCanvas({pixelRatio:s,width:i,height:o}),h=new Lg.SceneCanvas({pixelRatio:s,width:0,height:0,willReadFrequently:!0}),p=new Lg.HitCanvas({pixelRatio:d,width:i,height:o}),m=f.getContext(),S=p.getContext();return p.isCache=!0,f.isCache=!0,this._cache.delete(Ba),this._filterUpToDate=!1,n.imageSmoothingEnabled===!1&&(f.getContext()._context.imageSmoothingEnabled=!1,h.getContext()._context.imageSmoothingEnabled=!1),m.save(),S.save(),m.translate(-a,-l),S.translate(-a,-l),this._isUnderCache=!0,this._clearSelfAndDescendantCache(Pm),this._clearSelfAndDescendantCache(F9),this.drawScene(f,this),this.drawHit(p,this),this._isUnderCache=!1,m.restore(),S.restore(),c&&(m.save(),m.beginPath(),m.rect(0,0,i,o),m.closePath(),m.setAttr("strokeStyle","red"),m.setAttr("lineWidth",5),m.stroke(),m.restore()),this._cache.set(Ba,{scene:f,filter:h,hit:p,x:a,y:l}),this._requestDraw(),this}isCached(){return this._cache.has(Ba)}getClientRect(t){throw new Error('abstract "getClientRect" method call')}_transformedRect(t,n){var r=[{x:t.x,y:t.y},{x:t.x+t.width,y:t.y},{x:t.x+t.width,y:t.y+t.height},{x:t.x,y:t.y+t.height}],i,o,s,a,l=this.getAbsoluteTransform(n);return r.forEach(function(u){var c=l.point(u);i===void 0&&(i=s=c.x,o=a=c.y),i=Math.min(i,c.x),o=Math.min(o,c.y),s=Math.max(s,c.x),a=Math.max(a,c.y)}),{x:i,y:o,width:s-i,height:a-o}}_drawCachedSceneCanvas(t){t.save(),t._applyOpacity(this),t._applyGlobalCompositeOperation(this);const n=this._getCanvasCache();t.translate(n.x,n.y);var r=this._getCachedSceneCanvas(),i=r.pixelRatio;t.drawImage(r._canvas,0,0,r.width/i,r.height/i),t.restore()}_drawCachedHitCanvas(t){var n=this._getCanvasCache(),r=n.hit;t.save(),t.translate(n.x,n.y),t.drawImage(r._canvas,0,0,r.width/r.pixelRatio,r.height/r.pixelRatio),t.restore()}_getCachedSceneCanvas(){var t=this.filters(),n=this._getCanvasCache(),r=n.scene,i=n.filter,o=i.getContext(),s,a,l,u;if(t){if(!this._filterUpToDate){var c=r.pixelRatio;i.setSize(r.width/r.pixelRatio,r.height/r.pixelRatio);try{for(s=t.length,o.clear(),o.drawImage(r._canvas,0,0,r.getWidth()/c,r.getHeight()/c),a=o.getImageData(0,0,i.getWidth(),i.getHeight()),l=0;l{var n,r;if(!t)return this;for(n in t)n!==B2e&&(r=V9+Be.Util._capitalize(n),Be.Util._isFunction(this[r])?this[r](t[n]):this._setAttr(n,t[n]))}),this}isListening(){return this._getCache(mx,this._isListening)}_isListening(t){if(!this.listening())return!1;const r=this.getParent();return r&&r!==t&&this!==t?r._isListening(t):!0}isVisible(){return this._getCache(yx,this._isVisible)}_isVisible(t){if(!this.visible())return!1;const r=this.getParent();return r&&r!==t&&this!==t?r._isVisible(t):!0}shouldDrawHit(t,n=!1){if(t)return this._isVisible(t)&&this._isListening(t);var r=this.getLayer(),i=!1;Qr.DD._dragElements.forEach(s=>{s.dragStatus==="dragging"&&(s.node.nodeType==="Stage"||s.node.getLayer()===r)&&(i=!0)});var o=!n&&!Fa.Konva.hitOnDragEnabled&&i;return this.isListening()&&this.isVisible()&&!o}show(){return this.visible(!0),this}hide(){return this.visible(!1),this}getZIndex(){return this.index||0}getAbsoluteZIndex(){var t=this.getDepth(),n=this,r=0,i,o,s,a;function l(u){for(i=[],o=u.length,s=0;s0&&i[0].getDepth()<=t&&l(i)}return n.nodeType!==V2e&&l(n.getStage().getChildren()),r}getDepth(){for(var t=0,n=this.parent;n;)t++,n=n.parent;return t}_batchTransformChanges(t){this._batchingTransformChange=!0,t(),this._batchingTransformChange=!1,this._needClearTransformCache&&(this._clearCache(Os),this._clearSelfAndDescendantCache(Fo)),this._needClearTransformCache=!1}setPosition(t){return this._batchTransformChanges(()=>{this.x(t.x),this.y(t.y)}),this}getPosition(){return{x:this.x(),y:this.y()}}getRelativePointerPosition(){if(!this.getStage())return null;var t=this.getStage().getPointerPosition();if(!t)return null;var n=this.getAbsoluteTransform().copy();return n.invert(),n.point(t)}getAbsolutePosition(t){let n=!1,r=this.parent;for(;r;){if(r.isCached()){n=!0;break}r=r.parent}n&&!t&&(t=!0);var i=this.getAbsoluteTransform(t).getMatrix(),o=new Be.Transform,s=this.offset();return o.m=i.slice(),o.translate(s.x,s.y),o.getTranslation()}setAbsolutePosition(t){var n=this._clearTransform();this.attrs.x=n.x,this.attrs.y=n.y,delete n.x,delete n.y,this._clearCache(Os);var r=this._getAbsoluteTransform().copy();return r.invert(),r.translate(t.x,t.y),t={x:this.attrs.x+r.getTranslation().x,y:this.attrs.y+r.getTranslation().y},this._setTransform(n),this.setPosition({x:t.x,y:t.y}),this._clearCache(Os),this._clearSelfAndDescendantCache(Fo),this}_setTransform(t){var n;for(n in t)this.attrs[n]=t[n]}_clearTransform(){var t={x:this.x(),y:this.y(),rotation:this.rotation(),scaleX:this.scaleX(),scaleY:this.scaleY(),offsetX:this.offsetX(),offsetY:this.offsetY(),skewX:this.skewX(),skewY:this.skewY()};return this.attrs.x=0,this.attrs.y=0,this.attrs.rotation=0,this.attrs.scaleX=1,this.attrs.scaleY=1,this.attrs.offsetX=0,this.attrs.offsetY=0,this.attrs.skewX=0,this.attrs.skewY=0,t}move(t){var n=t.x,r=t.y,i=this.x(),o=this.y();return n!==void 0&&(i+=n),r!==void 0&&(o+=r),this.setPosition({x:i,y:o}),this}_eachAncestorReverse(t,n){var r=[],i=this.getParent(),o,s;if(!(n&&n._id===this._id)){for(r.unshift(this);i&&(!n||i._id!==n._id);)r.unshift(i),i=i.parent;for(o=r.length,s=0;s0?(this.parent.children.splice(t,1),this.parent.children.splice(t-1,0,this),this.parent._setChildrenIndices(),!0):!1}moveToBottom(){if(!this.parent)return Be.Util.warn("Node has no parent. moveToBottom function is ignored."),!1;var t=this.index;return t>0?(this.parent.children.splice(t,1),this.parent.children.unshift(this),this.parent._setChildrenIndices(),!0):!1}setZIndex(t){if(!this.parent)return Be.Util.warn("Node has no parent. zIndex parameter is ignored."),this;(t<0||t>=this.parent.children.length)&&Be.Util.warn("Unexpected value "+t+" for zIndex property. zIndex is just index of a node in children of its parent. Expected value is from 0 to "+(this.parent.children.length-1)+".");var n=this.index;return this.parent.children.splice(n,1),this.parent.children.splice(t,0,this),this.parent._setChildrenIndices(),this}getAbsoluteOpacity(){return this._getCache(Pm,this._getAbsoluteOpacity)}_getAbsoluteOpacity(){var t=this.opacity(),n=this.getParent();return n&&!n._isUnderCache&&(t*=n.getAbsoluteOpacity()),t}moveTo(t){return this.getParent()!==t&&(this._remove(),t.add(this)),this}toObject(){var t={},n=this.getAttrs(),r,i,o,s,a;t.attrs={};for(r in n)i=n[r],a=Be.Util.isObject(i)&&!Be.Util._isPlainObject(i)&&!Be.Util._isArray(i),!a&&(o=typeof this[r]=="function"&&this[r],delete n[r],s=o?o.call(this):null,n[r]=i,s!==i&&(t.attrs[r]=i));return t.className=this.getClassName(),Be.Util._prepareToStringify(t)}toJSON(){return JSON.stringify(this.toObject())}getParent(){return this.parent}findAncestors(t,n,r){var i=[];n&&this._isMatch(t)&&i.push(this);for(var o=this.parent;o;){if(o===r)return i;o._isMatch(t)&&i.push(o),o=o.parent}return i}isAncestorOf(t){return!1}findAncestor(t,n,r){return this.findAncestors(t,n,r)[0]}_isMatch(t){if(!t)return!1;if(typeof t=="function")return t(this);var n=t.replace(/ /g,"").split(","),r=n.length,i,o;for(i=0;i{try{const i=t==null?void 0:t.callback;i&&delete t.callback,Be.Util._urlToImage(this.toDataURL(t),function(o){n(o),i==null||i(o)})}catch(i){r(i)}})}toBlob(t){return new Promise((n,r)=>{try{const i=t==null?void 0:t.callback;i&&delete t.callback,this.toCanvas(t).toBlob(o=>{n(o),i==null||i(o)})}catch(i){r(i)}})}setSize(t){return this.width(t.width),this.height(t.height),this}getSize(){return{width:this.width(),height:this.height()}}getClassName(){return this.className||this.nodeType}getType(){return this.nodeType}getDragDistance(){return this.attrs.dragDistance!==void 0?this.attrs.dragDistance:this.parent?this.parent.getDragDistance():Fa.Konva.dragDistance}_off(t,n,r){var i=this.eventListeners[t],o,s,a;for(o=0;o=0;if(r&&!this.isDragging()){var i=!1;Qr.DD._dragElements.forEach(o=>{this.isAncestorOf(o.node)&&(i=!0)}),i||this._createDragElement(t)}})}_dragChange(){if(this.attrs.draggable)this._listenDrag();else{this._dragCleanup();var t=this.getStage();if(!t)return;const n=Qr.DD._dragElements.get(this._id),r=n&&n.dragStatus==="dragging",i=n&&n.dragStatus==="ready";r?this.stopDrag():i&&Qr.DD._dragElements.delete(this._id)}}_dragCleanup(){this.off("mousedown.konva"),this.off("touchstart.konva")}isClientRectOnScreen(t={x:0,y:0}){const n=this.getStage();if(!n)return!1;const r={x:-t.x,y:-t.y,width:n.width()+2*t.x,height:n.height()+2*t.y};return Be.Util.haveIntersection(r,this.getClientRect())}static create(t,n){return Be.Util._isString(t)&&(t=JSON.parse(t)),this._createNode(t,n)}static _createNode(t,n){var r=vx.prototype.getClassName.call(t),i=t.children,o,s,a;n&&(t.attrs.container=n),Fa.Konva[r]||(Be.Util.warn('Can not find a node with class name "'+r+'". Fallback to "Shape".'),r="Shape");const l=Fa.Konva[r];if(o=new l(t.attrs),i)for(s=i.length,a=0;a0}removeChildren(){return this.getChildren().forEach(t=>{t.parent=null,t.index=0,t.remove()}),this.children=[],this._requestDraw(),this}destroyChildren(){return this.getChildren().forEach(t=>{t.parent=null,t.index=0,t.destroy()}),this.children=[],this._requestDraw(),this}add(...t){if(t.length===0)return this;if(t.length>1){for(var n=0;n0?n[0]:void 0}_generalFind(t,n){var r=[];return this._descendants(i=>{const o=i._isMatch(t);return o&&r.push(i),!!(o&&n)}),r}_descendants(t){let n=!1;const r=this.getChildren();for(const i of r){if(n=t(i),n)return!0;if(i.hasChildren()&&(n=i._descendants(t),n))return!0}return!1}toObject(){var t=x2.Node.prototype.toObject.call(this);return t.children=[],this.getChildren().forEach(n=>{t.children.push(n.toObject())}),t}isAncestorOf(t){for(var n=t.getParent();n;){if(n._id===this._id)return!0;n=n.getParent()}return!1}clone(t){var n=x2.Node.prototype.clone.call(this,t);return this.getChildren().forEach(function(r){n.add(r.clone())}),n}getAllIntersections(t){var n=[];return this.find("Shape").forEach(function(r){r.isVisible()&&r.intersects(t)&&n.push(r)}),n}_clearSelfAndDescendantCache(t){var n;super._clearSelfAndDescendantCache(t),!this.isCached()&&((n=this.children)===null||n===void 0||n.forEach(function(r){r._clearSelfAndDescendantCache(t)}))}_setChildrenIndices(){var t;(t=this.children)===null||t===void 0||t.forEach(function(n,r){n.index=r}),this._requestDraw()}drawScene(t,n){var r=this.getLayer(),i=t||r&&r.getCanvas(),o=i&&i.getContext(),s=this._getCanvasCache(),a=s&&s.scene,l=i&&i.isCache;if(!this.isVisible()&&!l)return this;if(a){o.save();var u=this.getAbsoluteTransform(n).getMatrix();o.transform(u[0],u[1],u[2],u[3],u[4],u[5]),this._drawCachedSceneCanvas(o),o.restore()}else this._drawChildren("drawScene",i,n);return this}drawHit(t,n){if(!this.shouldDrawHit(n))return this;var r=this.getLayer(),i=t||r&&r.hitCanvas,o=i&&i.getContext(),s=this._getCanvasCache(),a=s&&s.hit;if(a){o.save();var l=this.getAbsoluteTransform(n).getMatrix();o.transform(l[0],l[1],l[2],l[3],l[4],l[5]),this._drawCachedHitCanvas(o),o.restore()}else this._drawChildren("drawHit",i,n);return this}_drawChildren(t,n,r){var i,o=n&&n.getContext(),s=this.clipWidth(),a=this.clipHeight(),l=this.clipFunc(),u=s&&a||l;const c=r===this;if(u){o.save();var d=this.getAbsoluteTransform(r),f=d.getMatrix();o.transform(f[0],f[1],f[2],f[3],f[4],f[5]),o.beginPath();let S;if(l)S=l.call(this,o,this);else{var h=this.clipX(),p=this.clipY();o.rect(h,p,s,a)}o.clip.apply(o,S),f=d.copy().invert().getMatrix(),o.transform(f[0],f[1],f[2],f[3],f[4],f[5])}var m=!c&&this.globalCompositeOperation()!=="source-over"&&t==="drawScene";m&&(o.save(),o._applyGlobalCompositeOperation(this)),(i=this.children)===null||i===void 0||i.forEach(function(S){S[t](n,r)}),m&&o.restore(),u&&o.restore()}getClientRect(t){var n;t=t||{};var r=t.skipTransform,i=t.relativeTo,o,s,a,l,u={x:1/0,y:1/0,width:0,height:0},c=this;(n=this.children)===null||n===void 0||n.forEach(function(m){if(m.visible()){var S=m.getClientRect({relativeTo:c,skipShadow:t.skipShadow,skipStroke:t.skipStroke});S.width===0&&S.height===0||(o===void 0?(o=S.x,s=S.y,a=S.x+S.width,l=S.y+S.height):(o=Math.min(o,S.x),s=Math.min(s,S.y),a=Math.max(a,S.x+S.width),l=Math.max(l,S.y+S.height)))}});for(var d=this.find("Shape"),f=!1,h=0;hX.indexOf("pointer")>=0?"pointer":X.indexOf("touch")>=0?"touch":"mouse",z=X=>{const F=V(X);if(F==="pointer")return i.Konva.pointerEventsEnabled&&L.pointer;if(F==="touch")return L.touch;if(F==="mouse")return L.mouse};function U(X={}){return(X.clipFunc||X.clipWidth||X.clipHeight)&&t.Util.warn("Stage does not support clipping. Please use clip for Layers or Groups."),X}const K="Pointer position is missing and not registered by the stage. Looks like it is outside of the stage container. You can set it manually from event: stage.setPointersPositions(event);";e.stages=[];class q extends r.Container{constructor(F){super(U(F)),this._pointerPositions=[],this._changedPointerPositions=[],this._buildDOM(),this._bindContentEvents(),e.stages.push(this),this.on("widthChange.konva heightChange.konva",this._resizeDOM),this.on("visibleChange.konva",this._checkVisibility),this.on("clipWidthChange.konva clipHeightChange.konva clipFuncChange.konva",()=>{U(this.attrs)}),this._checkVisibility()}_validateAdd(F){const W=F.getType()==="Layer",Q=F.getType()==="FastLayer";W||Q||t.Util.throw("You may only add layers to the stage.")}_checkVisibility(){if(!this.content)return;const F=this.visible()?"":"none";this.content.style.display=F}setContainer(F){if(typeof F===c){if(F.charAt(0)==="."){var W=F.slice(1);F=document.getElementsByClassName(W)[0]}else{var Q;F.charAt(0)!=="#"?Q=F:Q=F.slice(1),F=document.getElementById(Q)}if(!F)throw"Can not find container in document with id "+Q}return this._setAttr("container",F),this.content&&(this.content.parentElement&&this.content.parentElement.removeChild(this.content),F.appendChild(this.content)),this}shouldDrawHit(){return!0}clear(){var F=this.children,W=F.length,Q;for(Q=0;Q-1&&e.stages.splice(W,1),t.Util.releaseCanvas(this.bufferCanvas._canvas,this.bufferHitCanvas._canvas),this}getPointerPosition(){const F=this._pointerPositions[0]||this._changedPointerPositions[0];return F?{x:F.x,y:F.y}:(t.Util.warn(K),null)}_getPointerById(F){return this._pointerPositions.find(W=>W.id===F)}getPointersPositions(){return this._pointerPositions}getStage(){return this}getContent(){return this.content}_toKonvaCanvas(F){F=F||{},F.x=F.x||0,F.y=F.y||0,F.width=F.width||this.width(),F.height=F.height||this.height();var W=new o.SceneCanvas({width:F.width,height:F.height,pixelRatio:F.pixelRatio||1}),Q=W.getContext()._context,J=this.children;return(F.x||F.y)&&Q.translate(-1*F.x,-1*F.y),J.forEach(function(ne){if(ne.isVisible()){var Z=ne._toKonvaCanvas(F);Q.drawImage(Z._canvas,F.x,F.y,Z.getWidth()/Z.getPixelRatio(),Z.getHeight()/Z.getPixelRatio())}}),W}getIntersection(F){if(!F)return null;var W=this.children,Q=W.length,J=Q-1,ne;for(ne=J;ne>=0;ne--){const Z=W[ne].getIntersection(F);if(Z)return Z}return null}_resizeDOM(){var F=this.width(),W=this.height();this.content&&(this.content.style.width=F+d,this.content.style.height=W+d),this.bufferCanvas.setSize(F,W),this.bufferHitCanvas.setSize(F,W),this.children.forEach(Q=>{Q.setSize({width:F,height:W}),Q.draw()})}add(F,...W){if(arguments.length>1){for(var Q=0;QR&&t.Util.warn("The stage has "+J+" layers. Recommended maximum number of layers is 3-5. Adding more layers into the stage may drop the performance. Rethink your tree structure, you can use Konva.Group."),F.setSize({width:this.width(),height:this.height()}),F.draw(),i.Konva.isBrowser&&this.content.appendChild(F.canvas._canvas),this}getParent(){return null}getLayer(){return null}hasPointerCapture(F){return l.hasPointerCapture(F,this)}setPointerCapture(F){l.setPointerCapture(F,this)}releaseCapture(F){l.releaseCapture(F,this)}getLayers(){return this.children}_bindContentEvents(){i.Konva.isBrowser&&D.forEach(([F,W])=>{this.content.addEventListener(F,Q=>{this[W](Q)},{passive:!1})})}_pointerenter(F){this.setPointersPositions(F);const W=z(F.type);this._fire(W.pointerenter,{evt:F,target:this,currentTarget:this})}_pointerover(F){this.setPointersPositions(F);const W=z(F.type);this._fire(W.pointerover,{evt:F,target:this,currentTarget:this})}_getTargetShape(F){let W=this[F+"targetShape"];return W&&!W.getStage()&&(W=null),W}_pointerleave(F){const W=z(F.type),Q=V(F.type);if(W){this.setPointersPositions(F);var J=this._getTargetShape(Q),ne=!s.DD.isDragging||i.Konva.hitOnDragEnabled;J&&ne?(J._fireAndBubble(W.pointerout,{evt:F}),J._fireAndBubble(W.pointerleave,{evt:F}),this._fire(W.pointerleave,{evt:F,target:this,currentTarget:this}),this[Q+"targetShape"]=null):ne&&(this._fire(W.pointerleave,{evt:F,target:this,currentTarget:this}),this._fire(W.pointerout,{evt:F,target:this,currentTarget:this})),this.pointerPos=void 0,this._pointerPositions=[]}}_pointerdown(F){const W=z(F.type),Q=V(F.type);if(W){this.setPointersPositions(F);var J=!1;this._changedPointerPositions.forEach(ne=>{var Z=this.getIntersection(ne);if(s.DD.justDragged=!1,i.Konva["_"+Q+"ListenClick"]=!0,!(Z&&Z.isListening()))return;i.Konva.capturePointerEventsEnabled&&Z.setPointerCapture(ne.id),this[Q+"ClickStartShape"]=Z,Z._fireAndBubble(W.pointerdown,{evt:F,pointerId:ne.id}),J=!0;const ae=F.type.indexOf("touch")>=0;Z.preventDefault()&&F.cancelable&&ae&&F.preventDefault()}),J||this._fire(W.pointerdown,{evt:F,target:this,currentTarget:this,pointerId:this._pointerPositions[0].id})}}_pointermove(F){const W=z(F.type),Q=V(F.type);if(!W)return;s.DD.isDragging&&s.DD.node.preventDefault()&&F.cancelable&&F.preventDefault(),this.setPointersPositions(F);var J=!s.DD.isDragging||i.Konva.hitOnDragEnabled;if(!J)return;var ne={};let Z=!1;var ge=this._getTargetShape(Q);this._changedPointerPositions.forEach(ae=>{const oe=l.getCapturedShape(ae.id)||this.getIntersection(ae),Ce=ae.id,se={evt:F,pointerId:Ce};var We=ge!==oe;if(We&&ge&&(ge._fireAndBubble(W.pointerout,Object.assign({},se),oe),ge._fireAndBubble(W.pointerleave,Object.assign({},se),oe)),oe){if(ne[oe._id])return;ne[oe._id]=!0}oe&&oe.isListening()?(Z=!0,We&&(oe._fireAndBubble(W.pointerover,Object.assign({},se),ge),oe._fireAndBubble(W.pointerenter,Object.assign({},se),ge),this[Q+"targetShape"]=oe),oe._fireAndBubble(W.pointermove,Object.assign({},se))):ge&&(this._fire(W.pointerover,{evt:F,target:this,currentTarget:this,pointerId:Ce}),this[Q+"targetShape"]=null)}),Z||this._fire(W.pointermove,{evt:F,target:this,currentTarget:this,pointerId:this._changedPointerPositions[0].id})}_pointerup(F){const W=z(F.type),Q=V(F.type);if(!W)return;this.setPointersPositions(F);const J=this[Q+"ClickStartShape"],ne=this[Q+"ClickEndShape"];var Z={};let ge=!1;this._changedPointerPositions.forEach(ae=>{const oe=l.getCapturedShape(ae.id)||this.getIntersection(ae);if(oe){if(oe.releaseCapture(ae.id),Z[oe._id])return;Z[oe._id]=!0}const Ce=ae.id,se={evt:F,pointerId:Ce};let We=!1;i.Konva["_"+Q+"InDblClickWindow"]?(We=!0,clearTimeout(this[Q+"DblTimeout"])):s.DD.justDragged||(i.Konva["_"+Q+"InDblClickWindow"]=!0,clearTimeout(this[Q+"DblTimeout"])),this[Q+"DblTimeout"]=setTimeout(function(){i.Konva["_"+Q+"InDblClickWindow"]=!1},i.Konva.dblClickWindow),oe&&oe.isListening()?(ge=!0,this[Q+"ClickEndShape"]=oe,oe._fireAndBubble(W.pointerup,Object.assign({},se)),i.Konva["_"+Q+"ListenClick"]&&J&&J===oe&&(oe._fireAndBubble(W.pointerclick,Object.assign({},se)),We&&ne&&ne===oe&&oe._fireAndBubble(W.pointerdblclick,Object.assign({},se)))):(this[Q+"ClickEndShape"]=null,i.Konva["_"+Q+"ListenClick"]&&this._fire(W.pointerclick,{evt:F,target:this,currentTarget:this,pointerId:Ce}),We&&this._fire(W.pointerdblclick,{evt:F,target:this,currentTarget:this,pointerId:Ce}))}),ge||this._fire(W.pointerup,{evt:F,target:this,currentTarget:this,pointerId:this._changedPointerPositions[0].id}),i.Konva["_"+Q+"ListenClick"]=!1,F.cancelable&&Q!=="touch"&&F.preventDefault()}_contextmenu(F){this.setPointersPositions(F);var W=this.getIntersection(this.getPointerPosition());W&&W.isListening()?W._fireAndBubble($,{evt:F}):this._fire($,{evt:F,target:this,currentTarget:this})}_wheel(F){this.setPointersPositions(F);var W=this.getIntersection(this.getPointerPosition());W&&W.isListening()?W._fireAndBubble(N,{evt:F}):this._fire(N,{evt:F,target:this,currentTarget:this})}_pointercancel(F){this.setPointersPositions(F);const W=l.getCapturedShape(F.pointerId)||this.getIntersection(this.getPointerPosition());W&&W._fireAndBubble(_,l.createEvent(F)),l.releaseCapture(F.pointerId)}_lostpointercapture(F){l.releaseCapture(F.pointerId)}setPointersPositions(F){var W=this._getContentPosition(),Q=null,J=null;F=F||window.event,F.touches!==void 0?(this._pointerPositions=[],this._changedPointerPositions=[],Array.prototype.forEach.call(F.touches,ne=>{this._pointerPositions.push({id:ne.identifier,x:(ne.clientX-W.left)/W.scaleX,y:(ne.clientY-W.top)/W.scaleY})}),Array.prototype.forEach.call(F.changedTouches||F.touches,ne=>{this._changedPointerPositions.push({id:ne.identifier,x:(ne.clientX-W.left)/W.scaleX,y:(ne.clientY-W.top)/W.scaleY})})):(Q=(F.clientX-W.left)/W.scaleX,J=(F.clientY-W.top)/W.scaleY,this.pointerPos={x:Q,y:J},this._pointerPositions=[{x:Q,y:J,id:t.Util._getFirstPointerId(F)}],this._changedPointerPositions=[{x:Q,y:J,id:t.Util._getFirstPointerId(F)}])}_setPointerPosition(F){t.Util.warn('Method _setPointerPosition is deprecated. Use "stage.setPointersPositions(event)" instead.'),this.setPointersPositions(F)}_getContentPosition(){if(!this.content||!this.content.getBoundingClientRect)return{top:0,left:0,scaleX:1,scaleY:1};var F=this.content.getBoundingClientRect();return{top:F.top,left:F.left,scaleX:F.width/this.content.clientWidth||1,scaleY:F.height/this.content.clientHeight||1}}_buildDOM(){if(this.bufferCanvas=new o.SceneCanvas({width:this.width(),height:this.height()}),this.bufferHitCanvas=new o.HitCanvas({pixelRatio:1,width:this.width(),height:this.height()}),!!i.Konva.isBrowser){var F=this.container();if(!F)throw"Stage has no container. A container is required.";F.innerHTML="",this.content=document.createElement("div"),this.content.style.position="relative",this.content.style.userSelect="none",this.content.className="konvajs-content",this.content.setAttribute("role","presentation"),F.appendChild(this.content),this._resizeDOM()}}cache(){return t.Util.warn("Cache function is not allowed for stage. You may use cache only for layers, groups and shapes."),this}clearCache(){return this}batchDraw(){return this.getChildren().forEach(function(F){F.batchDraw()}),this}}e.Stage=q,q.prototype.nodeType=u,(0,a._registerNode)(q),n.Factory.addGetterSetter(q,"container")})(oB);var Mp={},mn={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.Shape=e.shapes=void 0;const t=De,n=Vt,r=Re,i=At,o=fe,s=De,a=Nr;var l="hasShadow",u="shadowRGBA",c="patternImage",d="linearGradient",f="radialGradient";let h;function p(){return h||(h=n.Util.createCanvasElement().getContext("2d"),h)}e.shapes={};function m(k){const P=this.attrs.fillRule;P?k.fill(P):k.fill()}function S(k){k.stroke()}function v(k){k.fill()}function y(k){k.stroke()}function g(){this._clearCache(l)}function b(){this._clearCache(u)}function _(){this._clearCache(c)}function w(){this._clearCache(d)}function x(){this._clearCache(f)}class C extends i.Node{constructor(P){super(P);let A;for(;A=n.Util.getRandomColor(),!(A&&!(A in e.shapes)););this.colorKey=A,e.shapes[A]=this}getContext(){return n.Util.warn("shape.getContext() method is deprecated. Please do not use it."),this.getLayer().getContext()}getCanvas(){return n.Util.warn("shape.getCanvas() method is deprecated. Please do not use it."),this.getLayer().getCanvas()}getSceneFunc(){return this.attrs.sceneFunc||this._sceneFunc}getHitFunc(){return this.attrs.hitFunc||this._hitFunc}hasShadow(){return this._getCache(l,this._hasShadow)}_hasShadow(){return this.shadowEnabled()&&this.shadowOpacity()!==0&&!!(this.shadowColor()||this.shadowBlur()||this.shadowOffsetX()||this.shadowOffsetY())}_getFillPattern(){return this._getCache(c,this.__getFillPattern)}__getFillPattern(){if(this.fillPatternImage()){var P=p();const A=P.createPattern(this.fillPatternImage(),this.fillPatternRepeat()||"repeat");if(A&&A.setTransform){const $=new n.Transform;$.translate(this.fillPatternX(),this.fillPatternY()),$.rotate(t.Konva.getAngle(this.fillPatternRotation())),$.scale(this.fillPatternScaleX(),this.fillPatternScaleY()),$.translate(-1*this.fillPatternOffsetX(),-1*this.fillPatternOffsetY());const M=$.getMatrix(),T=typeof DOMMatrix>"u"?{a:M[0],b:M[1],c:M[2],d:M[3],e:M[4],f:M[5]}:new DOMMatrix(M);A.setTransform(T)}return A}}_getLinearGradient(){return this._getCache(d,this.__getLinearGradient)}__getLinearGradient(){var P=this.fillLinearGradientColorStops();if(P){for(var A=p(),$=this.fillLinearGradientStartPoint(),M=this.fillLinearGradientEndPoint(),T=A.createLinearGradient($.x,$.y,M.x,M.y),O=0;Othis.fillEnabled()&&!!(this.fill()||this.fillPatternImage()||this.fillLinearGradientColorStops()||this.fillRadialGradientColorStops()))}hasStroke(){return this._calculate("hasStroke",["strokeEnabled","strokeWidth","stroke","strokeLinearGradientColorStops"],()=>this.strokeEnabled()&&this.strokeWidth()&&!!(this.stroke()||this.strokeLinearGradientColorStops()))}hasHitStroke(){const P=this.hitStrokeWidth();return P==="auto"?this.hasStroke():this.strokeEnabled()&&!!P}intersects(P){var A=this.getStage(),$=A.bufferHitCanvas,M;return $.getContext().clear(),this.drawHit($,null,!0),M=$.context.getImageData(Math.round(P.x),Math.round(P.y),1,1).data,M[3]>0}destroy(){return i.Node.prototype.destroy.call(this),delete e.shapes[this.colorKey],delete this.colorKey,this}_useBufferCanvas(P){var A;if(!this.getStage()||!((A=this.attrs.perfectDrawEnabled)!==null&&A!==void 0?A:!0))return!1;const M=P||this.hasFill(),T=this.hasStroke(),O=this.getAbsoluteOpacity()!==1;if(M&&T&&O)return!0;const I=this.hasShadow(),N=this.shadowForStrokeEnabled();return!!(M&&T&&I&&N)}setStrokeHitEnabled(P){n.Util.warn("strokeHitEnabled property is deprecated. Please use hitStrokeWidth instead."),P?this.hitStrokeWidth("auto"):this.hitStrokeWidth(0)}getStrokeHitEnabled(){return this.hitStrokeWidth()!==0}getSelfRect(){var P=this.size();return{x:this._centroid?-P.width/2:0,y:this._centroid?-P.height/2:0,width:P.width,height:P.height}}getClientRect(P={}){const A=P.skipTransform,$=P.relativeTo,M=this.getSelfRect(),O=!P.skipStroke&&this.hasStroke()&&this.strokeWidth()||0,I=M.width+O,N=M.height+O,R=!P.skipShadow&&this.hasShadow(),D=R?this.shadowOffsetX():0,L=R?this.shadowOffsetY():0,V=I+Math.abs(D),z=N+Math.abs(L),U=R&&this.shadowBlur()||0,K=V+U*2,q=z+U*2,X={width:K,height:q,x:-(O/2+U)+Math.min(D,0)+M.x,y:-(O/2+U)+Math.min(L,0)+M.y};return A?X:this._transformedRect(X,$)}drawScene(P,A){var $=this.getLayer(),M=P||$.getCanvas(),T=M.getContext(),O=this._getCanvasCache(),I=this.getSceneFunc(),N=this.hasShadow(),R,D,L,V=M.isCache,z=A===this;if(!this.isVisible()&&!z)return this;if(O){T.save();var U=this.getAbsoluteTransform(A).getMatrix();return T.transform(U[0],U[1],U[2],U[3],U[4],U[5]),this._drawCachedSceneCanvas(T),T.restore(),this}if(!I)return this;if(T.save(),this._useBufferCanvas()&&!V){R=this.getStage(),D=R.bufferCanvas,L=D.getContext(),L.clear(),L.save(),L._applyLineJoin(this);var K=this.getAbsoluteTransform(A).getMatrix();L.transform(K[0],K[1],K[2],K[3],K[4],K[5]),I.call(this,L,this),L.restore();var q=D.pixelRatio;N&&T._applyShadow(this),T._applyOpacity(this),T._applyGlobalCompositeOperation(this),T.drawImage(D._canvas,0,0,D.width/q,D.height/q)}else{if(T._applyLineJoin(this),!z){var K=this.getAbsoluteTransform(A).getMatrix();T.transform(K[0],K[1],K[2],K[3],K[4],K[5]),T._applyOpacity(this),T._applyGlobalCompositeOperation(this)}N&&T._applyShadow(this),I.call(this,T,this)}return T.restore(),this}drawHit(P,A,$=!1){if(!this.shouldDrawHit(A,$))return this;var M=this.getLayer(),T=P||M.hitCanvas,O=T&&T.getContext(),I=this.hitFunc()||this.sceneFunc(),N=this._getCanvasCache(),R=N&&N.hit;if(this.colorKey||n.Util.warn("Looks like your canvas has a destroyed shape in it. Do not reuse shape after you destroyed it. If you want to reuse shape you should call remove() instead of destroy()"),R){O.save();var D=this.getAbsoluteTransform(A).getMatrix();return O.transform(D[0],D[1],D[2],D[3],D[4],D[5]),this._drawCachedHitCanvas(O),O.restore(),this}if(!I)return this;if(O.save(),O._applyLineJoin(this),!(this===A)){var V=this.getAbsoluteTransform(A).getMatrix();O.transform(V[0],V[1],V[2],V[3],V[4],V[5])}return I.call(this,O,this),O.restore(),this}drawHitFromCache(P=0){var A=this._getCanvasCache(),$=this._getCachedSceneCanvas(),M=A.hit,T=M.getContext(),O=M.getWidth(),I=M.getHeight(),N,R,D,L,V,z;T.clear(),T.drawImage($._canvas,0,0,O,I);try{for(N=T.getImageData(0,0,O,I),R=N.data,D=R.length,L=n.Util._hexToRgb(this.colorKey),V=0;VP?(R[V]=L.r,R[V+1]=L.g,R[V+2]=L.b,R[V+3]=255):R[V+3]=0;T.putImageData(N,0,0)}catch(U){n.Util.error("Unable to draw hit graph from cached scene canvas. "+U.message)}return this}hasPointerCapture(P){return a.hasPointerCapture(P,this)}setPointerCapture(P){a.setPointerCapture(P,this)}releaseCapture(P){a.releaseCapture(P,this)}}e.Shape=C,C.prototype._fillFunc=m,C.prototype._strokeFunc=S,C.prototype._fillFuncHit=v,C.prototype._strokeFuncHit=y,C.prototype._centroid=!1,C.prototype.nodeType="Shape",(0,s._registerNode)(C),C.prototype.eventListeners={},C.prototype.on.call(C.prototype,"shadowColorChange.konva shadowBlurChange.konva shadowOffsetChange.konva shadowOpacityChange.konva shadowEnabledChange.konva",g),C.prototype.on.call(C.prototype,"shadowColorChange.konva shadowOpacityChange.konva shadowEnabledChange.konva",b),C.prototype.on.call(C.prototype,"fillPriorityChange.konva fillPatternImageChange.konva fillPatternRepeatChange.konva fillPatternScaleXChange.konva fillPatternScaleYChange.konva fillPatternOffsetXChange.konva fillPatternOffsetYChange.konva fillPatternXChange.konva fillPatternYChange.konva fillPatternRotationChange.konva",_),C.prototype.on.call(C.prototype,"fillPriorityChange.konva fillLinearGradientColorStopsChange.konva fillLinearGradientStartPointXChange.konva fillLinearGradientStartPointYChange.konva fillLinearGradientEndPointXChange.konva fillLinearGradientEndPointYChange.konva",w),C.prototype.on.call(C.prototype,"fillPriorityChange.konva fillRadialGradientColorStopsChange.konva fillRadialGradientStartPointXChange.konva fillRadialGradientStartPointYChange.konva fillRadialGradientEndPointXChange.konva fillRadialGradientEndPointYChange.konva fillRadialGradientStartRadiusChange.konva fillRadialGradientEndRadiusChange.konva",x),r.Factory.addGetterSetter(C,"stroke",void 0,(0,o.getStringOrGradientValidator)()),r.Factory.addGetterSetter(C,"strokeWidth",2,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"fillAfterStrokeEnabled",!1),r.Factory.addGetterSetter(C,"hitStrokeWidth","auto",(0,o.getNumberOrAutoValidator)()),r.Factory.addGetterSetter(C,"strokeHitEnabled",!0,(0,o.getBooleanValidator)()),r.Factory.addGetterSetter(C,"perfectDrawEnabled",!0,(0,o.getBooleanValidator)()),r.Factory.addGetterSetter(C,"shadowForStrokeEnabled",!0,(0,o.getBooleanValidator)()),r.Factory.addGetterSetter(C,"lineJoin"),r.Factory.addGetterSetter(C,"lineCap"),r.Factory.addGetterSetter(C,"sceneFunc"),r.Factory.addGetterSetter(C,"hitFunc"),r.Factory.addGetterSetter(C,"dash"),r.Factory.addGetterSetter(C,"dashOffset",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"shadowColor",void 0,(0,o.getStringValidator)()),r.Factory.addGetterSetter(C,"shadowBlur",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"shadowOpacity",1,(0,o.getNumberValidator)()),r.Factory.addComponentsGetterSetter(C,"shadowOffset",["x","y"]),r.Factory.addGetterSetter(C,"shadowOffsetX",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"shadowOffsetY",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"fillPatternImage"),r.Factory.addGetterSetter(C,"fill",void 0,(0,o.getStringOrGradientValidator)()),r.Factory.addGetterSetter(C,"fillPatternX",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"fillPatternY",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"fillLinearGradientColorStops"),r.Factory.addGetterSetter(C,"strokeLinearGradientColorStops"),r.Factory.addGetterSetter(C,"fillRadialGradientStartRadius",0),r.Factory.addGetterSetter(C,"fillRadialGradientEndRadius",0),r.Factory.addGetterSetter(C,"fillRadialGradientColorStops"),r.Factory.addGetterSetter(C,"fillPatternRepeat","repeat"),r.Factory.addGetterSetter(C,"fillEnabled",!0),r.Factory.addGetterSetter(C,"strokeEnabled",!0),r.Factory.addGetterSetter(C,"shadowEnabled",!0),r.Factory.addGetterSetter(C,"dashEnabled",!0),r.Factory.addGetterSetter(C,"strokeScaleEnabled",!0),r.Factory.addGetterSetter(C,"fillPriority","color"),r.Factory.addComponentsGetterSetter(C,"fillPatternOffset",["x","y"]),r.Factory.addGetterSetter(C,"fillPatternOffsetX",0,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"fillPatternOffsetY",0,(0,o.getNumberValidator)()),r.Factory.addComponentsGetterSetter(C,"fillPatternScale",["x","y"]),r.Factory.addGetterSetter(C,"fillPatternScaleX",1,(0,o.getNumberValidator)()),r.Factory.addGetterSetter(C,"fillPatternScaleY",1,(0,o.getNumberValidator)()),r.Factory.addComponentsGetterSetter(C,"fillLinearGradientStartPoint",["x","y"]),r.Factory.addComponentsGetterSetter(C,"strokeLinearGradientStartPoint",["x","y"]),r.Factory.addGetterSetter(C,"fillLinearGradientStartPointX",0),r.Factory.addGetterSetter(C,"strokeLinearGradientStartPointX",0),r.Factory.addGetterSetter(C,"fillLinearGradientStartPointY",0),r.Factory.addGetterSetter(C,"strokeLinearGradientStartPointY",0),r.Factory.addComponentsGetterSetter(C,"fillLinearGradientEndPoint",["x","y"]),r.Factory.addComponentsGetterSetter(C,"strokeLinearGradientEndPoint",["x","y"]),r.Factory.addGetterSetter(C,"fillLinearGradientEndPointX",0),r.Factory.addGetterSetter(C,"strokeLinearGradientEndPointX",0),r.Factory.addGetterSetter(C,"fillLinearGradientEndPointY",0),r.Factory.addGetterSetter(C,"strokeLinearGradientEndPointY",0),r.Factory.addComponentsGetterSetter(C,"fillRadialGradientStartPoint",["x","y"]),r.Factory.addGetterSetter(C,"fillRadialGradientStartPointX",0),r.Factory.addGetterSetter(C,"fillRadialGradientStartPointY",0),r.Factory.addComponentsGetterSetter(C,"fillRadialGradientEndPoint",["x","y"]),r.Factory.addGetterSetter(C,"fillRadialGradientEndPointX",0),r.Factory.addGetterSetter(C,"fillRadialGradientEndPointY",0),r.Factory.addGetterSetter(C,"fillPatternRotation",0),r.Factory.addGetterSetter(C,"fillRule",void 0,(0,o.getStringValidator)()),r.Factory.backCompat(C,{dashArray:"dash",getDashArray:"getDash",setDashArray:"getDash",drawFunc:"sceneFunc",getDrawFunc:"getSceneFunc",setDrawFunc:"setSceneFunc",drawHitFunc:"hitFunc",getDrawHitFunc:"getHitFunc",setDrawHitFunc:"setHitFunc"})})(mn);Object.defineProperty(Mp,"__esModule",{value:!0});Mp.Layer=void 0;const Do=Vt,C2=jl,cu=At,H3=Re,G9=Ni,K2e=fe,Y2e=mn,X2e=De;var Q2e="#",Z2e="beforeDraw",J2e="draw",lB=[{x:0,y:0},{x:-1,y:-1},{x:1,y:-1},{x:1,y:1},{x:-1,y:1}],e_e=lB.length;class ed extends C2.Container{constructor(t){super(t),this.canvas=new G9.SceneCanvas,this.hitCanvas=new G9.HitCanvas({pixelRatio:1}),this._waitingForDraw=!1,this.on("visibleChange.konva",this._checkVisibility),this._checkVisibility(),this.on("imageSmoothingEnabledChange.konva",this._setSmoothEnabled),this._setSmoothEnabled()}createPNGStream(){return this.canvas._canvas.createPNGStream()}getCanvas(){return this.canvas}getNativeCanvasElement(){return this.canvas._canvas}getHitCanvas(){return this.hitCanvas}getContext(){return this.getCanvas().getContext()}clear(t){return this.getContext().clear(t),this.getHitCanvas().getContext().clear(t),this}setZIndex(t){super.setZIndex(t);var n=this.getStage();return n&&n.content&&(n.content.removeChild(this.getNativeCanvasElement()),t{this.draw(),this._waitingForDraw=!1})),this}getIntersection(t){if(!this.isListening()||!this.isVisible())return null;for(var n=1,r=!1;;){for(let i=0;i0)return{antialiased:!0};return{}}drawScene(t,n){var r=this.getLayer(),i=t||r&&r.getCanvas();return this._fire(Z2e,{node:this}),this.clearBeforeDraw()&&i.getContext().clear(),C2.Container.prototype.drawScene.call(this,i,n),this._fire(J2e,{node:this}),this}drawHit(t,n){var r=this.getLayer(),i=t||r&&r.hitCanvas;return r&&r.clearBeforeDraw()&&r.getHitCanvas().getContext().clear(),C2.Container.prototype.drawHit.call(this,i,n),this}enableHitGraph(){return this.hitGraphEnabled(!0),this}disableHitGraph(){return this.hitGraphEnabled(!1),this}setHitGraphEnabled(t){Do.Util.warn("hitGraphEnabled method is deprecated. Please use layer.listening() instead."),this.listening(t)}getHitGraphEnabled(t){return Do.Util.warn("hitGraphEnabled method is deprecated. Please use layer.listening() instead."),this.listening()}toggleHitCanvas(){if(!(!this.parent||!this.parent.content)){var t=this.parent,n=!!this.hitCanvas._canvas.parentNode;n?t.content.removeChild(this.hitCanvas._canvas):t.content.appendChild(this.hitCanvas._canvas)}}destroy(){return Do.Util.releaseCanvas(this.getNativeCanvasElement(),this.getHitCanvas()._canvas),super.destroy()}}Mp.Layer=ed;ed.prototype.nodeType="Layer";(0,X2e._registerNode)(ed);H3.Factory.addGetterSetter(ed,"imageSmoothingEnabled",!0);H3.Factory.addGetterSetter(ed,"clearBeforeDraw",!0);H3.Factory.addGetterSetter(ed,"hitGraphEnabled",!0,(0,K2e.getBooleanValidator)());var R1={};Object.defineProperty(R1,"__esModule",{value:!0});R1.FastLayer=void 0;const t_e=Vt,n_e=Mp,r_e=De;class W3 extends n_e.Layer{constructor(t){super(t),this.listening(!1),t_e.Util.warn('Konva.Fast layer is deprecated. Please use "new Konva.Layer({ listening: false })" instead.')}}R1.FastLayer=W3;W3.prototype.nodeType="FastLayer";(0,r_e._registerNode)(W3);var td={};Object.defineProperty(td,"__esModule",{value:!0});td.Group=void 0;const i_e=Vt,o_e=jl,s_e=De;class q3 extends o_e.Container{_validateAdd(t){var n=t.getType();n!=="Group"&&n!=="Shape"&&i_e.Util.throw("You may only add groups and shapes to groups.")}}td.Group=q3;q3.prototype.nodeType="Group";(0,s_e._registerNode)(q3);var nd={};Object.defineProperty(nd,"__esModule",{value:!0});nd.Animation=void 0;const T2=De,H9=Vt;var E2=function(){return T2.glob.performance&&T2.glob.performance.now?function(){return T2.glob.performance.now()}:function(){return new Date().getTime()}}();class eo{constructor(t,n){this.id=eo.animIdCounter++,this.frame={time:0,timeDiff:0,lastTime:E2(),frameRate:0},this.func=t,this.setLayers(n)}setLayers(t){var n=[];return t?t.length>0?n=t:n=[t]:n=[],this.layers=n,this}getLayers(){return this.layers}addLayer(t){var n=this.layers,r=n.length,i;for(i=0;ithis.duration?this.yoyo?(this._time=this.duration,this.reverse()):this.finish():p<0?this.yoyo?(this._time=0,this.play()):this.reset():(this._time=p,this.update())}getTime(){return this._time}setPosition(p){this.prevPos=this._pos,this.propFunc(p),this._pos=p}getPosition(p){return p===void 0&&(p=this._time),this.func(p,this.begin,this._change,this.duration)}play(){this.state=a,this._startTime=this.getTimer()-this._time,this.onEnterFrame(),this.fire("onPlay")}reverse(){this.state=l,this._time=this.duration-this._time,this._startTime=this.getTimer()-this._time,this.onEnterFrame(),this.fire("onReverse")}seek(p){this.pause(),this._time=p,this.update(),this.fire("onSeek")}reset(){this.pause(),this._time=0,this.update(),this.fire("onReset")}finish(){this.pause(),this._time=this.duration,this.update(),this.fire("onFinish")}update(){this.setPosition(this.getPosition(this._time)),this.fire("onUpdate")}onEnterFrame(){var p=this.getTimer()-this._startTime;this.state===a?this.setTime(p):this.state===l&&this.setTime(this.duration-p)}pause(){this.state=s,this.fire("onPause")}getTimer(){return new Date().getTime()}}class f{constructor(p){var m=this,S=p.node,v=S._id,y,g=p.easing||e.Easings.Linear,b=!!p.yoyo,_;typeof p.duration>"u"?y=.3:p.duration===0?y=.001:y=p.duration,this.node=S,this._id=u++;var w=S.getLayer()||(S instanceof i.Konva.Stage?S.getLayers():null);w||t.Util.error("Tween constructor have `node` that is not in a layer. Please add node into layer first."),this.anim=new n.Animation(function(){m.tween.onEnterFrame()},w),this.tween=new d(_,function(x){m._tweenFunc(x)},g,0,1,y*1e3,b),this._addListeners(),f.attrs[v]||(f.attrs[v]={}),f.attrs[v][this._id]||(f.attrs[v][this._id]={}),f.tweens[v]||(f.tweens[v]={});for(_ in p)o[_]===void 0&&this._addAttr(_,p[_]);this.reset(),this.onFinish=p.onFinish,this.onReset=p.onReset,this.onUpdate=p.onUpdate}_addAttr(p,m){var S=this.node,v=S._id,y,g,b,_,w,x,C,k;if(b=f.tweens[v][p],b&&delete f.attrs[v][b][p],y=S.getAttr(p),t.Util._isArray(m))if(g=[],w=Math.max(m.length,y.length),p==="points"&&m.length!==y.length&&(m.length>y.length?(C=y,y=t.Util._prepareArrayForTween(y,m,S.closed())):(x=m,m=t.Util._prepareArrayForTween(m,y,S.closed()))),p.indexOf("fill")===0)for(_=0;_{this.anim.start()},this.tween.onReverse=()=>{this.anim.start()},this.tween.onPause=()=>{this.anim.stop()},this.tween.onFinish=()=>{var p=this.node,m=f.attrs[p._id][this._id];m.points&&m.points.trueEnd&&p.setAttr("points",m.points.trueEnd),this.onFinish&&this.onFinish.call(this)},this.tween.onReset=()=>{var p=this.node,m=f.attrs[p._id][this._id];m.points&&m.points.trueStart&&p.points(m.points.trueStart),this.onReset&&this.onReset()},this.tween.onUpdate=()=>{this.onUpdate&&this.onUpdate.call(this)}}play(){return this.tween.play(),this}reverse(){return this.tween.reverse(),this}reset(){return this.tween.reset(),this}seek(p){return this.tween.seek(p*1e3),this}pause(){return this.tween.pause(),this}finish(){return this.tween.finish(),this}destroy(){var p=this.node._id,m=this._id,S=f.tweens[p],v;this.pause();for(v in S)delete f.tweens[p][v];delete f.attrs[p][m]}}e.Tween=f,f.attrs={},f.tweens={},r.Node.prototype.to=function(h){var p=h.onFinish;h.node=this,h.onFinish=function(){this.destroy(),p&&p()};var m=new f(h);m.play()},e.Easings={BackEaseIn(h,p,m,S){var v=1.70158;return m*(h/=S)*h*((v+1)*h-v)+p},BackEaseOut(h,p,m,S){var v=1.70158;return m*((h=h/S-1)*h*((v+1)*h+v)+1)+p},BackEaseInOut(h,p,m,S){var v=1.70158;return(h/=S/2)<1?m/2*(h*h*(((v*=1.525)+1)*h-v))+p:m/2*((h-=2)*h*(((v*=1.525)+1)*h+v)+2)+p},ElasticEaseIn(h,p,m,S,v,y){var g=0;return h===0?p:(h/=S)===1?p+m:(y||(y=S*.3),!v||v0?t:n),c=s*n,d=a*(a>0?t:n),f=l*(l>0?n:t);return{x:u,y:r?-1*f:d,width:c-u,height:f-d}}}I1.Arc=vs;vs.prototype._centroid=!0;vs.prototype.className="Arc";vs.prototype._attrsAffectingSize=["innerRadius","outerRadius"];(0,l_e._registerNode)(vs);N1.Factory.addGetterSetter(vs,"innerRadius",0,(0,M1.getNumberValidator)());N1.Factory.addGetterSetter(vs,"outerRadius",0,(0,M1.getNumberValidator)());N1.Factory.addGetterSetter(vs,"angle",0,(0,M1.getNumberValidator)());N1.Factory.addGetterSetter(vs,"clockwise",!1,(0,M1.getBooleanValidator)());var D1={},Dp={};Object.defineProperty(Dp,"__esModule",{value:!0});Dp.Line=void 0;const L1=Re,u_e=mn,cB=fe,c_e=De;function bx(e,t,n,r,i,o,s){var a=Math.sqrt(Math.pow(n-e,2)+Math.pow(r-t,2)),l=Math.sqrt(Math.pow(i-n,2)+Math.pow(o-r,2)),u=s*a/(a+l),c=s*l/(a+l),d=n-u*(i-e),f=r-u*(o-t),h=n+c*(i-e),p=r+c*(o-t);return[d,f,h,p]}function q9(e,t){var n=e.length,r=[],i,o;for(i=2;i4){for(a=this.getTensionPoints(),l=a.length,u=o?0:4,o||t.quadraticCurveTo(a[0],a[1],a[2],a[3]);u{let u,c,d;u=l/2,c=0;for(let h=0;h<20;h++)d=u*e.tValues[20][h]+u,c+=e.cValues[20][h]*r(s,a,d);return u*c};e.getCubicArcLength=t;const n=(s,a,l)=>{l===void 0&&(l=1);const u=s[0]-2*s[1]+s[2],c=a[0]-2*a[1]+a[2],d=2*s[1]-2*s[0],f=2*a[1]-2*a[0],h=4*(u*u+c*c),p=4*(u*d+c*f),m=d*d+f*f;if(h===0)return l*Math.sqrt(Math.pow(s[2]-s[0],2)+Math.pow(a[2]-a[0],2));const S=p/(2*h),v=m/h,y=l+S,g=v-S*S,b=y*y+g>0?Math.sqrt(y*y+g):0,_=S*S+g>0?Math.sqrt(S*S+g):0,w=S+Math.sqrt(S*S+g)!==0?g*Math.log(Math.abs((y+b)/(S+_))):0;return Math.sqrt(h)/2*(y*b-S*_+w)};e.getQuadraticArcLength=n;function r(s,a,l){const u=i(1,l,s),c=i(1,l,a),d=u*u+c*c;return Math.sqrt(d)}const i=(s,a,l)=>{const u=l.length-1;let c,d;if(u===0)return 0;if(s===0){d=0;for(let f=0;f<=u;f++)d+=e.binomialCoefficients[u][f]*Math.pow(1-a,u-f)*Math.pow(a,f)*l[f];return d}else{c=new Array(u);for(let f=0;f{let u=1,c=s/a,d=(s-l(c))/a,f=0;for(;u>.001;){const h=l(c+d),p=Math.abs(s-h)/a;if(p500)break}return c};e.t2length=o})(dB);Object.defineProperty(rd,"__esModule",{value:!0});rd.Path=void 0;const d_e=Re,f_e=mn,h_e=De,du=dB;class ln extends f_e.Shape{constructor(t){super(t),this.dataArray=[],this.pathLength=0,this._readDataAttribute(),this.on("dataChange.konva",function(){this._readDataAttribute()})}_readDataAttribute(){this.dataArray=ln.parsePathData(this.data()),this.pathLength=ln.getPathLength(this.dataArray)}_sceneFunc(t){var n=this.dataArray;t.beginPath();for(var r=!1,i=0;ic?u:c,S=u>c?1:u/c,v=u>c?c/u:1;t.translate(a,l),t.rotate(h),t.scale(S,v),t.arc(0,0,m,d,d+f,1-p),t.scale(1/S,1/v),t.rotate(-h),t.translate(-a,-l);break;case"z":r=!0,t.closePath();break}}!r&&!this.hasFill()?t.strokeShape(this):t.fillStrokeShape(this)}getSelfRect(){var t=[];this.dataArray.forEach(function(u){if(u.command==="A"){var c=u.points[4],d=u.points[5],f=u.points[4]+d,h=Math.PI/180;if(Math.abs(c-f)f;p-=h){const m=ln.getPointOnEllipticalArc(u.points[0],u.points[1],u.points[2],u.points[3],p,0);t.push(m.x,m.y)}else for(let p=c+h;pn[i].pathLength;)t-=n[i].pathLength,++i;if(i===o)return r=n[i-1].points.slice(-2),{x:r[0],y:r[1]};if(t<.01)return r=n[i].points.slice(0,2),{x:r[0],y:r[1]};var s=n[i],a=s.points;switch(s.command){case"L":return ln.getPointOnLine(t,s.start.x,s.start.y,a[0],a[1]);case"C":return ln.getPointOnCubicBezier((0,du.t2length)(t,ln.getPathLength(n),m=>(0,du.getCubicArcLength)([s.start.x,a[0],a[2],a[4]],[s.start.y,a[1],a[3],a[5]],m)),s.start.x,s.start.y,a[0],a[1],a[2],a[3],a[4],a[5]);case"Q":return ln.getPointOnQuadraticBezier((0,du.t2length)(t,ln.getPathLength(n),m=>(0,du.getQuadraticArcLength)([s.start.x,a[0],a[2]],[s.start.y,a[1],a[3]],m)),s.start.x,s.start.y,a[0],a[1],a[2],a[3]);case"A":var l=a[0],u=a[1],c=a[2],d=a[3],f=a[4],h=a[5],p=a[6];return f+=h*t/s.pathLength,ln.getPointOnEllipticalArc(l,u,c,d,f,p)}return null}static getPointOnLine(t,n,r,i,o,s,a){s===void 0&&(s=n),a===void 0&&(a=r);var l=(o-r)/(i-n+1e-8),u=Math.sqrt(t*t/(1+l*l));i0&&!isNaN(p[0]);){var y=null,g=[],b=l,_=u,w,x,C,k,P,A,$,M,T,O;switch(h){case"l":l+=p.shift(),u+=p.shift(),y="L",g.push(l,u);break;case"L":l=p.shift(),u=p.shift(),g.push(l,u);break;case"m":var I=p.shift(),N=p.shift();if(l+=I,u+=N,y="M",s.length>2&&s[s.length-1].command==="z"){for(var R=s.length-2;R>=0;R--)if(s[R].command==="M"){l=s[R].points[0]+I,u=s[R].points[1]+N;break}}g.push(l,u),h="l";break;case"M":l=p.shift(),u=p.shift(),y="M",g.push(l,u),h="L";break;case"h":l+=p.shift(),y="L",g.push(l,u);break;case"H":l=p.shift(),y="L",g.push(l,u);break;case"v":u+=p.shift(),y="L",g.push(l,u);break;case"V":u=p.shift(),y="L",g.push(l,u);break;case"C":g.push(p.shift(),p.shift(),p.shift(),p.shift()),l=p.shift(),u=p.shift(),g.push(l,u);break;case"c":g.push(l+p.shift(),u+p.shift(),l+p.shift(),u+p.shift()),l+=p.shift(),u+=p.shift(),y="C",g.push(l,u);break;case"S":x=l,C=u,w=s[s.length-1],w.command==="C"&&(x=l+(l-w.points[2]),C=u+(u-w.points[3])),g.push(x,C,p.shift(),p.shift()),l=p.shift(),u=p.shift(),y="C",g.push(l,u);break;case"s":x=l,C=u,w=s[s.length-1],w.command==="C"&&(x=l+(l-w.points[2]),C=u+(u-w.points[3])),g.push(x,C,l+p.shift(),u+p.shift()),l+=p.shift(),u+=p.shift(),y="C",g.push(l,u);break;case"Q":g.push(p.shift(),p.shift()),l=p.shift(),u=p.shift(),g.push(l,u);break;case"q":g.push(l+p.shift(),u+p.shift()),l+=p.shift(),u+=p.shift(),y="Q",g.push(l,u);break;case"T":x=l,C=u,w=s[s.length-1],w.command==="Q"&&(x=l+(l-w.points[0]),C=u+(u-w.points[1])),l=p.shift(),u=p.shift(),y="Q",g.push(x,C,l,u);break;case"t":x=l,C=u,w=s[s.length-1],w.command==="Q"&&(x=l+(l-w.points[0]),C=u+(u-w.points[1])),l+=p.shift(),u+=p.shift(),y="Q",g.push(x,C,l,u);break;case"A":k=p.shift(),P=p.shift(),A=p.shift(),$=p.shift(),M=p.shift(),T=l,O=u,l=p.shift(),u=p.shift(),y="A",g=this.convertEndpointToCenterParameterization(T,O,l,u,$,M,k,P,A);break;case"a":k=p.shift(),P=p.shift(),A=p.shift(),$=p.shift(),M=p.shift(),T=l,O=u,l+=p.shift(),u+=p.shift(),y="A",g=this.convertEndpointToCenterParameterization(T,O,l,u,$,M,k,P,A);break}s.push({command:y||h,points:g,start:{x:b,y:_},pathLength:this.calcLength(b,_,y||h,g)})}(h==="z"||h==="Z")&&s.push({command:"z",points:[],start:void 0,pathLength:0})}return s}static calcLength(t,n,r,i){var o,s,a,l,u=ln;switch(r){case"L":return u.getLineLength(t,n,i[0],i[1]);case"C":return(0,du.getCubicArcLength)([t,i[0],i[2],i[4]],[n,i[1],i[3],i[5]],1);case"Q":return(0,du.getQuadraticArcLength)([t,i[0],i[2]],[n,i[1],i[3]],1);case"A":o=0;var c=i[4],d=i[5],f=i[4]+d,h=Math.PI/180;if(Math.abs(c-f)f;l-=h)a=u.getPointOnEllipticalArc(i[0],i[1],i[2],i[3],l,0),o+=u.getLineLength(s.x,s.y,a.x,a.y),s=a;else for(l=c+h;l1&&(a*=Math.sqrt(h),l*=Math.sqrt(h));var p=Math.sqrt((a*a*(l*l)-a*a*(f*f)-l*l*(d*d))/(a*a*(f*f)+l*l*(d*d)));o===s&&(p*=-1),isNaN(p)&&(p=0);var m=p*a*f/l,S=p*-l*d/a,v=(t+r)/2+Math.cos(c)*m-Math.sin(c)*S,y=(n+i)/2+Math.sin(c)*m+Math.cos(c)*S,g=function(P){return Math.sqrt(P[0]*P[0]+P[1]*P[1])},b=function(P,A){return(P[0]*A[0]+P[1]*A[1])/(g(P)*g(A))},_=function(P,A){return(P[0]*A[1]=1&&(k=0),s===0&&k>0&&(k=k-2*Math.PI),s===1&&k<0&&(k=k+2*Math.PI),[v,y,a,l,w,k,c,s]}}rd.Path=ln;ln.prototype.className="Path";ln.prototype._attrsAffectingSize=["data"];(0,h_e._registerNode)(ln);d_e.Factory.addGetterSetter(ln,"data");Object.defineProperty(D1,"__esModule",{value:!0});D1.Arrow=void 0;const $1=Re,p_e=Dp,fB=fe,g_e=De,K9=rd;class zl extends p_e.Line{_sceneFunc(t){super._sceneFunc(t);var n=Math.PI*2,r=this.points(),i=r,o=this.tension()!==0&&r.length>4;o&&(i=this.getTensionPoints());var s=this.pointerLength(),a=r.length,l,u;if(o){const f=[i[i.length-4],i[i.length-3],i[i.length-2],i[i.length-1],r[a-2],r[a-1]],h=K9.Path.calcLength(i[i.length-4],i[i.length-3],"C",f),p=K9.Path.getPointOnQuadraticBezier(Math.min(1,1-s/h),f[0],f[1],f[2],f[3],f[4],f[5]);l=r[a-2]-p.x,u=r[a-1]-p.y}else l=r[a-2]-r[a-4],u=r[a-1]-r[a-3];var c=(Math.atan2(u,l)+n)%n,d=this.pointerWidth();this.pointerAtEnding()&&(t.save(),t.beginPath(),t.translate(r[a-2],r[a-1]),t.rotate(c),t.moveTo(0,0),t.lineTo(-s,d/2),t.lineTo(-s,-d/2),t.closePath(),t.restore(),this.__fillStroke(t)),this.pointerAtBeginning()&&(t.save(),t.beginPath(),t.translate(r[0],r[1]),o?(l=(i[0]+i[2])/2-r[0],u=(i[1]+i[3])/2-r[1]):(l=r[2]-r[0],u=r[3]-r[1]),t.rotate((Math.atan2(-u,-l)+n)%n),t.moveTo(0,0),t.lineTo(-s,d/2),t.lineTo(-s,-d/2),t.closePath(),t.restore(),this.__fillStroke(t))}__fillStroke(t){var n=this.dashEnabled();n&&(this.attrs.dashEnabled=!1,t.setLineDash([])),t.fillStrokeShape(this),n&&(this.attrs.dashEnabled=!0)}getSelfRect(){const t=super.getSelfRect(),n=this.pointerWidth()/2;return{x:t.x-n,y:t.y-n,width:t.width+n*2,height:t.height+n*2}}}D1.Arrow=zl;zl.prototype.className="Arrow";(0,g_e._registerNode)(zl);$1.Factory.addGetterSetter(zl,"pointerLength",10,(0,fB.getNumberValidator)());$1.Factory.addGetterSetter(zl,"pointerWidth",10,(0,fB.getNumberValidator)());$1.Factory.addGetterSetter(zl,"pointerAtBeginning",!1);$1.Factory.addGetterSetter(zl,"pointerAtEnding",!0);var F1={};Object.defineProperty(F1,"__esModule",{value:!0});F1.Circle=void 0;const m_e=Re,y_e=mn,v_e=fe,b_e=De;class id extends y_e.Shape{_sceneFunc(t){t.beginPath(),t.arc(0,0,this.attrs.radius||0,0,Math.PI*2,!1),t.closePath(),t.fillStrokeShape(this)}getWidth(){return this.radius()*2}getHeight(){return this.radius()*2}setWidth(t){this.radius()!==t/2&&this.radius(t/2)}setHeight(t){this.radius()!==t/2&&this.radius(t/2)}}F1.Circle=id;id.prototype._centroid=!0;id.prototype.className="Circle";id.prototype._attrsAffectingSize=["radius"];(0,b_e._registerNode)(id);m_e.Factory.addGetterSetter(id,"radius",0,(0,v_e.getNumberValidator)());var B1={};Object.defineProperty(B1,"__esModule",{value:!0});B1.Ellipse=void 0;const K3=Re,S_e=mn,hB=fe,__e=De;class Oa extends S_e.Shape{_sceneFunc(t){var n=this.radiusX(),r=this.radiusY();t.beginPath(),t.save(),n!==r&&t.scale(1,r/n),t.arc(0,0,n,0,Math.PI*2,!1),t.restore(),t.closePath(),t.fillStrokeShape(this)}getWidth(){return this.radiusX()*2}getHeight(){return this.radiusY()*2}setWidth(t){this.radiusX(t/2)}setHeight(t){this.radiusY(t/2)}}B1.Ellipse=Oa;Oa.prototype.className="Ellipse";Oa.prototype._centroid=!0;Oa.prototype._attrsAffectingSize=["radiusX","radiusY"];(0,__e._registerNode)(Oa);K3.Factory.addComponentsGetterSetter(Oa,"radius",["x","y"]);K3.Factory.addGetterSetter(Oa,"radiusX",0,(0,hB.getNumberValidator)());K3.Factory.addGetterSetter(Oa,"radiusY",0,(0,hB.getNumberValidator)());var j1={};Object.defineProperty(j1,"__esModule",{value:!0});j1.Image=void 0;const P2=Vt,Ul=Re,w_e=mn,x_e=De,Lp=fe;let Eo=class pB extends w_e.Shape{constructor(t){super(t),this.on("imageChange.konva",()=>{this._setImageLoad()}),this._setImageLoad()}_setImageLoad(){const t=this.image();t&&t.complete||t&&t.readyState===4||t&&t.addEventListener&&t.addEventListener("load",()=>{this._requestDraw()})}_useBufferCanvas(){return super._useBufferCanvas(!0)}_sceneFunc(t){const n=this.getWidth(),r=this.getHeight(),i=this.cornerRadius(),o=this.attrs.image;let s;if(o){const a=this.attrs.cropWidth,l=this.attrs.cropHeight;a&&l?s=[o,this.cropX(),this.cropY(),a,l,0,0,n,r]:s=[o,0,0,n,r]}(this.hasFill()||this.hasStroke()||i)&&(t.beginPath(),i?P2.Util.drawRoundedRectPath(t,n,r,i):t.rect(0,0,n,r),t.closePath(),t.fillStrokeShape(this)),o&&(i&&t.clip(),t.drawImage.apply(t,s))}_hitFunc(t){var n=this.width(),r=this.height(),i=this.cornerRadius();t.beginPath(),i?P2.Util.drawRoundedRectPath(t,n,r,i):t.rect(0,0,n,r),t.closePath(),t.fillStrokeShape(this)}getWidth(){var t,n;return(t=this.attrs.width)!==null&&t!==void 0?t:(n=this.image())===null||n===void 0?void 0:n.width}getHeight(){var t,n;return(t=this.attrs.height)!==null&&t!==void 0?t:(n=this.image())===null||n===void 0?void 0:n.height}static fromURL(t,n,r=null){var i=P2.Util.createImageElement();i.onload=function(){var o=new pB({image:i});n(o)},i.onerror=r,i.crossOrigin="Anonymous",i.src=t}};j1.Image=Eo;Eo.prototype.className="Image";(0,x_e._registerNode)(Eo);Ul.Factory.addGetterSetter(Eo,"cornerRadius",0,(0,Lp.getNumberOrArrayOfNumbersValidator)(4));Ul.Factory.addGetterSetter(Eo,"image");Ul.Factory.addComponentsGetterSetter(Eo,"crop",["x","y","width","height"]);Ul.Factory.addGetterSetter(Eo,"cropX",0,(0,Lp.getNumberValidator)());Ul.Factory.addGetterSetter(Eo,"cropY",0,(0,Lp.getNumberValidator)());Ul.Factory.addGetterSetter(Eo,"cropWidth",0,(0,Lp.getNumberValidator)());Ul.Factory.addGetterSetter(Eo,"cropHeight",0,(0,Lp.getNumberValidator)());var Lc={};Object.defineProperty(Lc,"__esModule",{value:!0});Lc.Tag=Lc.Label=void 0;const V1=Re,C_e=mn,T_e=td,Y3=fe,gB=De;var mB=["fontFamily","fontSize","fontStyle","padding","lineHeight","text","width","height","pointerDirection","pointerWidth","pointerHeight"],E_e="Change.konva",P_e="none",Sx="up",_x="right",wx="down",xx="left",k_e=mB.length;class X3 extends T_e.Group{constructor(t){super(t),this.on("add.konva",function(n){this._addListeners(n.child),this._sync()})}getText(){return this.find("Text")[0]}getTag(){return this.find("Tag")[0]}_addListeners(t){var n=this,r,i=function(){n._sync()};for(r=0;r{n=Math.min(n,s.x),r=Math.max(r,s.x),i=Math.min(i,s.y),o=Math.max(o,s.y)}),{x:n,y:i,width:r-n,height:o-i}}getWidth(){return this.radius()*2}getHeight(){return this.radius()*2}setWidth(t){this.radius(t/2)}setHeight(t){this.radius(t/2)}}U1.RegularPolygon=Hl;Hl.prototype.className="RegularPolygon";Hl.prototype._centroid=!0;Hl.prototype._attrsAffectingSize=["radius"];(0,D_e._registerNode)(Hl);yB.Factory.addGetterSetter(Hl,"radius",0,(0,vB.getNumberValidator)());yB.Factory.addGetterSetter(Hl,"sides",0,(0,vB.getNumberValidator)());var G1={};Object.defineProperty(G1,"__esModule",{value:!0});G1.Ring=void 0;const bB=Re,L_e=mn,SB=fe,$_e=De;var Y9=Math.PI*2;class Wl extends L_e.Shape{_sceneFunc(t){t.beginPath(),t.arc(0,0,this.innerRadius(),0,Y9,!1),t.moveTo(this.outerRadius(),0),t.arc(0,0,this.outerRadius(),Y9,0,!0),t.closePath(),t.fillStrokeShape(this)}getWidth(){return this.outerRadius()*2}getHeight(){return this.outerRadius()*2}setWidth(t){this.outerRadius(t/2)}setHeight(t){this.outerRadius(t/2)}}G1.Ring=Wl;Wl.prototype.className="Ring";Wl.prototype._centroid=!0;Wl.prototype._attrsAffectingSize=["innerRadius","outerRadius"];(0,$_e._registerNode)(Wl);bB.Factory.addGetterSetter(Wl,"innerRadius",0,(0,SB.getNumberValidator)());bB.Factory.addGetterSetter(Wl,"outerRadius",0,(0,SB.getNumberValidator)());var H1={};Object.defineProperty(H1,"__esModule",{value:!0});H1.Sprite=void 0;const ql=Re,F_e=mn,B_e=nd,_B=fe,j_e=De;class Po extends F_e.Shape{constructor(t){super(t),this._updated=!0,this.anim=new B_e.Animation(()=>{var n=this._updated;return this._updated=!1,n}),this.on("animationChange.konva",function(){this.frameIndex(0)}),this.on("frameIndexChange.konva",function(){this._updated=!0}),this.on("frameRateChange.konva",function(){this.anim.isRunning()&&(clearInterval(this.interval),this._setInterval())})}_sceneFunc(t){var n=this.animation(),r=this.frameIndex(),i=r*4,o=this.animations()[n],s=this.frameOffsets(),a=o[i+0],l=o[i+1],u=o[i+2],c=o[i+3],d=this.image();if((this.hasFill()||this.hasStroke())&&(t.beginPath(),t.rect(0,0,u,c),t.closePath(),t.fillStrokeShape(this)),d)if(s){var f=s[n],h=r*2;t.drawImage(d,a,l,u,c,f[h+0],f[h+1],u,c)}else t.drawImage(d,a,l,u,c,0,0,u,c)}_hitFunc(t){var n=this.animation(),r=this.frameIndex(),i=r*4,o=this.animations()[n],s=this.frameOffsets(),a=o[i+2],l=o[i+3];if(t.beginPath(),s){var u=s[n],c=r*2;t.rect(u[c+0],u[c+1],a,l)}else t.rect(0,0,a,l);t.closePath(),t.fillShape(this)}_useBufferCanvas(){return super._useBufferCanvas(!0)}_setInterval(){var t=this;this.interval=setInterval(function(){t._updateIndex()},1e3/this.frameRate())}start(){if(!this.isRunning()){var t=this.getLayer();this.anim.setLayers(t),this._setInterval(),this.anim.start()}}stop(){this.anim.stop(),clearInterval(this.interval)}isRunning(){return this.anim.isRunning()}_updateIndex(){var t=this.frameIndex(),n=this.animation(),r=this.animations(),i=r[n],o=i.length/4;t{t=t.trim();const n=t.indexOf(" ")>=0,r=t.indexOf('"')>=0||t.indexOf("'")>=0;return n&&!r&&(t=`"${t}"`),t}).join(", ")}var Bg;function A2(){return Bg||(Bg=Cx.Util.createCanvasElement().getContext(q_e),Bg)}function iwe(e){e.fillText(this._partialText,this._partialTextX,this._partialTextY)}function owe(e){e.setAttr("miterLimit",2),e.strokeText(this._partialText,this._partialTextX,this._partialTextY)}function swe(e){return e=e||{},!e.fillLinearGradientColorStops&&!e.fillRadialGradientColorStops&&!e.fillPatternImage&&(e.fill=e.fill||"black"),e}class Qt extends U_e.Shape{constructor(t){super(swe(t)),this._partialTextX=0,this._partialTextY=0;for(var n=0;n1&&(v+=s)}}}_hitFunc(t){var n=this.getWidth(),r=this.getHeight();t.beginPath(),t.rect(0,0,n,r),t.closePath(),t.fillStrokeShape(this)}setText(t){var n=Cx.Util._isString(t)?t:t==null?"":t+"";return this._setAttr(K_e,n),this}getWidth(){var t=this.attrs.width===fu||this.attrs.width===void 0;return t?this.getTextWidth()+this.padding()*2:this.attrs.width}getHeight(){var t=this.attrs.height===fu||this.attrs.height===void 0;return t?this.fontSize()*this.textArr.length*this.lineHeight()+this.padding()*2:this.attrs.height}getTextWidth(){return this.textWidth}getTextHeight(){return Cx.Util.warn("text.getTextHeight() method is deprecated. Use text.height() - for full height and text.fontSize() - for one line height."),this.textHeight}measureSize(t){var n=A2(),r=this.fontSize(),i;return n.save(),n.font=this._getContextFont(),i=n.measureText(t),n.restore(),{width:i.width,height:r}}_getContextFont(){return this.fontStyle()+Fg+this.fontVariant()+Fg+(this.fontSize()+Z_e)+rwe(this.fontFamily())}_addTextLine(t){this.align()===Dd&&(t=t.trim());var r=this._getTextWidth(t);return this.textArr.push({text:t,width:r,lastInParagraph:!1})}_getTextWidth(t){var n=this.letterSpacing(),r=t.length;return A2().measureText(t).width+(r?n*(r-1):0)}_setTextData(){var t=this.text().split(` +`),n=+this.fontSize(),r=0,i=this.lineHeight()*n,o=this.attrs.width,s=this.attrs.height,a=o!==fu&&o!==void 0,l=s!==fu&&s!==void 0,u=this.padding(),c=o-u*2,d=s-u*2,f=0,h=this.wrap(),p=h!==Z9,m=h!==twe&&p,S=this.ellipsis();this.textArr=[],A2().font=this._getContextFont();for(var v=S?this._getTextWidth(k2):0,y=0,g=t.length;yc)for(;b.length>0;){for(var w=0,x=b.length,C="",k=0;w>>1,A=b.slice(0,P+1),$=this._getTextWidth(A)+v;$<=c?(w=P+1,C=A,k=$):x=P}if(C){if(m){var M,T=b[C.length],O=T===Fg||T===X9;O&&k<=c?M=C.length:M=Math.max(C.lastIndexOf(Fg),C.lastIndexOf(X9))+1,M>0&&(w=M,C=C.slice(0,w),k=this._getTextWidth(C))}C=C.trimRight(),this._addTextLine(C),r=Math.max(r,k),f+=i;var I=this._shouldHandleEllipsis(f);if(I){this._tryToAddEllipsisToLastLine();break}if(b=b.slice(w),b=b.trimLeft(),b.length>0&&(_=this._getTextWidth(b),_<=c)){this._addTextLine(b),f+=i,r=Math.max(r,_);break}}else break}else this._addTextLine(b),f+=i,r=Math.max(r,_),this._shouldHandleEllipsis(f)&&yd)break}this.textHeight=n,this.textWidth=r}_shouldHandleEllipsis(t){var n=+this.fontSize(),r=this.lineHeight()*n,i=this.attrs.height,o=i!==fu&&i!==void 0,s=this.padding(),a=i-s*2,l=this.wrap(),u=l!==Z9;return!u||o&&t+r>a}_tryToAddEllipsisToLastLine(){var t=this.attrs.width,n=t!==fu&&t!==void 0,r=this.padding(),i=t-r*2,o=this.ellipsis(),s=this.textArr[this.textArr.length-1];if(!(!s||!o)){if(n){var a=this._getTextWidth(s.text+k2)n?null:Ld.Path.getPointAtLengthOfDataArray(t,this.dataArray)}_readDataAttribute(){this.dataArray=Ld.Path.parsePathData(this.attrs.data),this.pathLength=this._getTextPathLength()}_sceneFunc(t){t.setAttr("font",this._getContextFont()),t.setAttr("textBaseline",this.textBaseline()),t.setAttr("textAlign","left"),t.save();var n=this.textDecoration(),r=this.fill(),i=this.fontSize(),o=this.glyphInfo;n==="underline"&&t.beginPath();for(var s=0;s=1){var r=n[0].p0;t.moveTo(r.x,r.y)}for(var i=0;ie+`.${OB}`).join(" "),tk="nodesRect",pwe=["widthChange","heightChange","scaleXChange","scaleYChange","skewXChange","skewYChange","rotationChange","offsetXChange","offsetYChange","transformsEnabledChange","strokeWidthChange"],gwe={"top-left":-45,"top-center":0,"top-right":45,"middle-right":-90,"middle-left":90,"bottom-left":-135,"bottom-center":180,"bottom-right":135};const mwe="ontouchstart"in Si.Konva._global;function ywe(e,t){if(e==="rotater")return"crosshair";t+=st.Util.degToRad(gwe[e]||0);var n=(st.Util.radToDeg(t)%360+360)%360;return st.Util._inRange(n,315+22.5,360)||st.Util._inRange(n,0,22.5)?"ns-resize":st.Util._inRange(n,45-22.5,45+22.5)?"nesw-resize":st.Util._inRange(n,90-22.5,90+22.5)?"ew-resize":st.Util._inRange(n,135-22.5,135+22.5)?"nwse-resize":st.Util._inRange(n,180-22.5,180+22.5)?"ns-resize":st.Util._inRange(n,225-22.5,225+22.5)?"nesw-resize":st.Util._inRange(n,270-22.5,270+22.5)?"ew-resize":st.Util._inRange(n,315-22.5,315+22.5)?"nwse-resize":(st.Util.error("Transformer has unknown angle for cursor detection: "+n),"pointer")}var g0=["top-left","top-center","top-right","middle-right","middle-left","bottom-left","bottom-center","bottom-right"],nk=1e8;function vwe(e){return{x:e.x+e.width/2*Math.cos(e.rotation)+e.height/2*Math.sin(-e.rotation),y:e.y+e.height/2*Math.cos(e.rotation)+e.width/2*Math.sin(e.rotation)}}function RB(e,t,n){const r=n.x+(e.x-n.x)*Math.cos(t)-(e.y-n.y)*Math.sin(t),i=n.y+(e.x-n.x)*Math.sin(t)+(e.y-n.y)*Math.cos(t);return Object.assign(Object.assign({},e),{rotation:e.rotation+t,x:r,y:i})}function bwe(e,t){const n=vwe(e);return RB(e,t,n)}function Swe(e,t,n){let r=t;for(let i=0;ii.isAncestorOf(this)?(st.Util.error("Konva.Transformer cannot be an a child of the node you are trying to attach"),!1):!0);this._nodes=t=n,t.length===1&&this.useSingleNodeRotation()?this.rotation(t[0].getAbsoluteRotation()):this.rotation(0),this._nodes.forEach(i=>{const o=()=>{this.nodes().length===1&&this.useSingleNodeRotation()&&this.rotation(this.nodes()[0].getAbsoluteRotation()),this._resetTransformCache(),!this._transforming&&!this.isDragging()&&this.update()},s=i._attrsAffectingSize.map(a=>a+"Change."+this._getEventNamespace()).join(" ");i.on(s,o),i.on(pwe.map(a=>a+`.${this._getEventNamespace()}`).join(" "),o),i.on(`absoluteTransformChange.${this._getEventNamespace()}`,o),this._proxyDrag(i)}),this._resetTransformCache();var r=!!this.findOne(".top-left");return r&&this.update(),this}_proxyDrag(t){let n;t.on(`dragstart.${this._getEventNamespace()}`,r=>{n=t.getAbsolutePosition(),!this.isDragging()&&t!==this.findOne(".back")&&this.startDrag(r,!1)}),t.on(`dragmove.${this._getEventNamespace()}`,r=>{if(!n)return;const i=t.getAbsolutePosition(),o=i.x-n.x,s=i.y-n.y;this.nodes().forEach(a=>{if(a===t||a.isDragging())return;const l=a.getAbsolutePosition();a.setAbsolutePosition({x:l.x+o,y:l.y+s}),a.startDrag(r)}),n=null})}getNodes(){return this._nodes||[]}getActiveAnchor(){return this._movingAnchorName}detach(){this._nodes&&this._nodes.forEach(t=>{t.off("."+this._getEventNamespace())}),this._nodes=[],this._resetTransformCache()}_resetTransformCache(){this._clearCache(tk),this._clearCache("transform"),this._clearSelfAndDescendantCache("absoluteTransform")}_getNodeRect(){return this._getCache(tk,this.__getNodeRect)}__getNodeShape(t,n=this.rotation(),r){var i=t.getClientRect({skipTransform:!0,skipShadow:!0,skipStroke:this.ignoreStroke()}),o=t.getAbsoluteScale(r),s=t.getAbsolutePosition(r),a=i.x*o.x-t.offsetX()*o.x,l=i.y*o.y-t.offsetY()*o.y;const u=(Si.Konva.getAngle(t.getAbsoluteRotation())+Math.PI*2)%(Math.PI*2),c={x:s.x+a*Math.cos(u)+l*Math.sin(-u),y:s.y+l*Math.cos(u)+a*Math.sin(u),width:i.width*o.x,height:i.height*o.y,rotation:u};return RB(c,-Si.Konva.getAngle(n),{x:0,y:0})}__getNodeRect(){var t=this.getNode();if(!t)return{x:-nk,y:-nk,width:0,height:0,rotation:0};const n=[];this.nodes().map(u=>{const c=u.getClientRect({skipTransform:!0,skipShadow:!0,skipStroke:this.ignoreStroke()});var d=[{x:c.x,y:c.y},{x:c.x+c.width,y:c.y},{x:c.x+c.width,y:c.y+c.height},{x:c.x,y:c.y+c.height}],f=u.getAbsoluteTransform();d.forEach(function(h){var p=f.point(h);n.push(p)})});const r=new st.Transform;r.rotate(-Si.Konva.getAngle(this.rotation()));var i,o,s,a;n.forEach(function(u){var c=r.point(u);i===void 0&&(i=s=c.x,o=a=c.y),i=Math.min(i,c.x),o=Math.min(o,c.y),s=Math.max(s,c.x),a=Math.max(a,c.y)}),r.invert();const l=r.point({x:i,y:o});return{x:l.x,y:l.y,width:s-i,height:a-o,rotation:Si.Konva.getAngle(this.rotation())}}getX(){return this._getNodeRect().x}getY(){return this._getNodeRect().y}getWidth(){return this._getNodeRect().width}getHeight(){return this._getNodeRect().height}_createElements(){this._createBack(),g0.forEach(function(t){this._createAnchor(t)}.bind(this)),this._createAnchor("rotater")}_createAnchor(t){var n=new dwe.Rect({stroke:"rgb(0, 161, 255)",fill:"white",strokeWidth:1,name:t+" _anchor",dragDistance:0,draggable:!0,hitStrokeWidth:mwe?10:"auto"}),r=this;n.on("mousedown touchstart",function(i){r._handleMouseDown(i)}),n.on("dragstart",i=>{n.stopDrag(),i.cancelBubble=!0}),n.on("dragend",i=>{i.cancelBubble=!0}),n.on("mouseenter",()=>{var i=Si.Konva.getAngle(this.rotation()),o=ywe(t,i);n.getStage().content&&(n.getStage().content.style.cursor=o),this._cursorChange=!0}),n.on("mouseout",()=>{n.getStage().content&&(n.getStage().content.style.cursor=""),this._cursorChange=!1}),this.add(n)}_createBack(){var t=new cwe.Shape({name:"back",width:0,height:0,draggable:!0,sceneFunc(n){var r=this.getParent(),i=r.padding();n.beginPath(),n.rect(-i,-i,this.width()+i*2,this.height()+i*2),n.moveTo(this.width()/2,-i),r.rotateEnabled()&&n.lineTo(this.width()/2,-r.rotateAnchorOffset()*st.Util._sign(this.height())-i),n.fillStrokeShape(this)},hitFunc:(n,r)=>{if(this.shouldOverdrawWholeArea()){var i=this.padding();n.beginPath(),n.rect(-i,-i,r.width()+i*2,r.height()+i*2),n.fillStrokeShape(r)}}});this.add(t),this._proxyDrag(t),t.on("dragstart",n=>{n.cancelBubble=!0}),t.on("dragmove",n=>{n.cancelBubble=!0}),t.on("dragend",n=>{n.cancelBubble=!0}),this.on("dragmove",n=>{this.update()})}_handleMouseDown(t){this._movingAnchorName=t.target.name().split(" ")[0];var n=this._getNodeRect(),r=n.width,i=n.height,o=Math.sqrt(Math.pow(r,2)+Math.pow(i,2));this.sin=Math.abs(i/o),this.cos=Math.abs(r/o),typeof window<"u"&&(window.addEventListener("mousemove",this._handleMouseMove),window.addEventListener("touchmove",this._handleMouseMove),window.addEventListener("mouseup",this._handleMouseUp,!0),window.addEventListener("touchend",this._handleMouseUp,!0)),this._transforming=!0;var s=t.target.getAbsolutePosition(),a=t.target.getStage().getPointerPosition();this._anchorDragOffset={x:a.x-s.x,y:a.y-s.y},this._fire("transformstart",{evt:t.evt,target:this.getNode()}),this._nodes.forEach(l=>{l._fire("transformstart",{evt:t.evt,target:l})})}_handleMouseMove(t){var n,r,i,o=this.findOne("."+this._movingAnchorName),s=o.getStage();s.setPointersPositions(t);const a=s.getPointerPosition();let l={x:a.x-this._anchorDragOffset.x,y:a.y-this._anchorDragOffset.y};const u=o.getAbsolutePosition();this.anchorDragBoundFunc()&&(l=this.anchorDragBoundFunc()(u,l,t)),o.setAbsolutePosition(l);const c=o.getAbsolutePosition();if(!(u.x===c.x&&u.y===c.y)){if(this._movingAnchorName==="rotater"){var d=this._getNodeRect();n=o.x()-d.width/2,r=-o.y()+d.height/2;let M=Math.atan2(-r,n)+Math.PI/2;d.height<0&&(M-=Math.PI);var f=Si.Konva.getAngle(this.rotation());const T=f+M,O=Si.Konva.getAngle(this.rotationSnapTolerance()),N=Swe(this.rotationSnaps(),T,O)-d.rotation,R=bwe(d,N);this._fitNodesInto(R,t);return}var h=this.shiftBehavior(),p;h==="inverted"?p=this.keepRatio()&&!t.shiftKey:h==="none"?p=this.keepRatio():p=this.keepRatio()||t.shiftKey;var g=this.centeredScaling()||t.altKey;if(this._movingAnchorName==="top-left"){if(p){var m=g?{x:this.width()/2,y:this.height()/2}:{x:this.findOne(".bottom-right").x(),y:this.findOne(".bottom-right").y()};i=Math.sqrt(Math.pow(m.x-o.x(),2)+Math.pow(m.y-o.y(),2));var S=this.findOne(".top-left").x()>m.x?-1:1,v=this.findOne(".top-left").y()>m.y?-1:1;n=i*this.cos*S,r=i*this.sin*v,this.findOne(".top-left").x(m.x-n),this.findOne(".top-left").y(m.y-r)}}else if(this._movingAnchorName==="top-center")this.findOne(".top-left").y(o.y());else if(this._movingAnchorName==="top-right"){if(p){var m=g?{x:this.width()/2,y:this.height()/2}:{x:this.findOne(".bottom-left").x(),y:this.findOne(".bottom-left").y()};i=Math.sqrt(Math.pow(o.x()-m.x,2)+Math.pow(m.y-o.y(),2));var S=this.findOne(".top-right").x()m.y?-1:1;n=i*this.cos*S,r=i*this.sin*v,this.findOne(".top-right").x(m.x+n),this.findOne(".top-right").y(m.y-r)}var y=o.position();this.findOne(".top-left").y(y.y),this.findOne(".bottom-right").x(y.x)}else if(this._movingAnchorName==="middle-left")this.findOne(".top-left").x(o.x());else if(this._movingAnchorName==="middle-right")this.findOne(".bottom-right").x(o.x());else if(this._movingAnchorName==="bottom-left"){if(p){var m=g?{x:this.width()/2,y:this.height()/2}:{x:this.findOne(".top-right").x(),y:this.findOne(".top-right").y()};i=Math.sqrt(Math.pow(m.x-o.x(),2)+Math.pow(o.y()-m.y,2));var S=m.x{r._fire("transformend",{evt:t,target:r})}),this._movingAnchorName=null}}_fitNodesInto(t,n){var r=this._getNodeRect();const i=1;if(st.Util._inRange(t.width,-this.padding()*2-i,i)){this.update();return}if(st.Util._inRange(t.height,-this.padding()*2-i,i)){this.update();return}const o=this.flipEnabled();var s=new st.Transform;if(s.rotate(Si.Konva.getAngle(this.rotation())),this._movingAnchorName&&t.width<0&&this._movingAnchorName.indexOf("left")>=0){const d=s.point({x:-this.padding()*2,y:0});if(t.x+=d.x,t.y+=d.y,t.width+=this.padding()*2,this._movingAnchorName=this._movingAnchorName.replace("left","right"),this._anchorDragOffset.x-=d.x,this._anchorDragOffset.y-=d.y,!o){this.update();return}}else if(this._movingAnchorName&&t.width<0&&this._movingAnchorName.indexOf("right")>=0){const d=s.point({x:this.padding()*2,y:0});if(this._movingAnchorName=this._movingAnchorName.replace("right","left"),this._anchorDragOffset.x-=d.x,this._anchorDragOffset.y-=d.y,t.width+=this.padding()*2,!o){this.update();return}}if(this._movingAnchorName&&t.height<0&&this._movingAnchorName.indexOf("top")>=0){const d=s.point({x:0,y:-this.padding()*2});if(t.x+=d.x,t.y+=d.y,this._movingAnchorName=this._movingAnchorName.replace("top","bottom"),this._anchorDragOffset.x-=d.x,this._anchorDragOffset.y-=d.y,t.height+=this.padding()*2,!o){this.update();return}}else if(this._movingAnchorName&&t.height<0&&this._movingAnchorName.indexOf("bottom")>=0){const d=s.point({x:0,y:this.padding()*2});if(this._movingAnchorName=this._movingAnchorName.replace("bottom","top"),this._anchorDragOffset.x-=d.x,this._anchorDragOffset.y-=d.y,t.height+=this.padding()*2,!o){this.update();return}}if(this.boundBoxFunc()){const d=this.boundBoxFunc()(r,t);d?t=d:st.Util.warn("boundBoxFunc returned falsy. You should return new bound rect from it!")}const a=1e7,l=new st.Transform;l.translate(r.x,r.y),l.rotate(r.rotation),l.scale(r.width/a,r.height/a);const u=new st.Transform;u.translate(t.x,t.y),u.rotate(t.rotation),u.scale(t.width/a,t.height/a);const c=u.multiply(l.invert());this._nodes.forEach(d=>{var f;const h=d.getParent().getAbsoluteTransform(),p=d.getTransform().copy();p.translate(d.offsetX(),d.offsetY());const m=new st.Transform;m.multiply(h.copy().invert()).multiply(c).multiply(h).multiply(p);const S=m.decompose();d.setAttrs(S),this._fire("transform",{evt:n,target:d}),d._fire("transform",{evt:n,target:d}),(f=d.getLayer())===null||f===void 0||f.batchDraw()}),this.rotation(st.Util._getRotation(t.rotation)),this._resetTransformCache(),this.update(),this.getLayer().batchDraw()}forceUpdate(){this._resetTransformCache(),this.update()}_batchChangeChild(t,n){this.findOne(t).setAttrs(n)}update(){var t,n=this._getNodeRect();this.rotation(st.Util._getRotation(n.rotation));var r=n.width,i=n.height,o=this.enabledAnchors(),s=this.resizeEnabled(),a=this.padding(),l=this.anchorSize();const u=this.find("._anchor");u.forEach(d=>{d.setAttrs({width:l,height:l,offsetX:l/2,offsetY:l/2,stroke:this.anchorStroke(),strokeWidth:this.anchorStrokeWidth(),fill:this.anchorFill(),cornerRadius:this.anchorCornerRadius()})}),this._batchChangeChild(".top-left",{x:0,y:0,offsetX:l/2+a,offsetY:l/2+a,visible:s&&o.indexOf("top-left")>=0}),this._batchChangeChild(".top-center",{x:r/2,y:0,offsetY:l/2+a,visible:s&&o.indexOf("top-center")>=0}),this._batchChangeChild(".top-right",{x:r,y:0,offsetX:l/2-a,offsetY:l/2+a,visible:s&&o.indexOf("top-right")>=0}),this._batchChangeChild(".middle-left",{x:0,y:i/2,offsetX:l/2+a,visible:s&&o.indexOf("middle-left")>=0}),this._batchChangeChild(".middle-right",{x:r,y:i/2,offsetX:l/2-a,visible:s&&o.indexOf("middle-right")>=0}),this._batchChangeChild(".bottom-left",{x:0,y:i,offsetX:l/2+a,offsetY:l/2-a,visible:s&&o.indexOf("bottom-left")>=0}),this._batchChangeChild(".bottom-center",{x:r/2,y:i,offsetY:l/2-a,visible:s&&o.indexOf("bottom-center")>=0}),this._batchChangeChild(".bottom-right",{x:r,y:i,offsetX:l/2-a,offsetY:l/2-a,visible:s&&o.indexOf("bottom-right")>=0}),this._batchChangeChild(".rotater",{x:r/2,y:-this.rotateAnchorOffset()*st.Util._sign(i)-a,visible:this.rotateEnabled()}),this._batchChangeChild(".back",{width:r,height:i,visible:this.borderEnabled(),stroke:this.borderStroke(),strokeWidth:this.borderStrokeWidth(),dash:this.borderDash(),x:0,y:0});const c=this.anchorStyleFunc();c&&u.forEach(d=>{c(d)}),(t=this.getLayer())===null||t===void 0||t.batchDraw()}isTransforming(){return this._transforming}stopTransform(){if(this._transforming){this._removeEvents();var t=this.findOne("."+this._movingAnchorName);t&&t.stopDrag()}}destroy(){return this.getStage()&&this._cursorChange&&this.getStage().content&&(this.getStage().content.style.cursor=""),ek.Group.prototype.destroy.call(this),this.detach(),this._removeEvents(),this}toObject(){return J9.Node.prototype.toObject.call(this)}clone(t){var n=J9.Node.prototype.clone.call(this,t);return n}getClientRect(){return this.nodes().length>0?super.getClientRect():{x:0,y:0,width:0,height:0}}}K1.Transformer=Ze;function _we(e){return e instanceof Array||st.Util.warn("enabledAnchors value should be an array"),e instanceof Array&&e.forEach(function(t){g0.indexOf(t)===-1&&st.Util.warn("Unknown anchor name: "+t+". Available names are: "+g0.join(", "))}),e||[]}Ze.prototype.className="Transformer";(0,fwe._registerNode)(Ze);ot.Factory.addGetterSetter(Ze,"enabledAnchors",g0,_we);ot.Factory.addGetterSetter(Ze,"flipEnabled",!0,(0,Na.getBooleanValidator)());ot.Factory.addGetterSetter(Ze,"resizeEnabled",!0);ot.Factory.addGetterSetter(Ze,"anchorSize",10,(0,Na.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"rotateEnabled",!0);ot.Factory.addGetterSetter(Ze,"rotationSnaps",[]);ot.Factory.addGetterSetter(Ze,"rotateAnchorOffset",50,(0,Na.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"rotationSnapTolerance",5,(0,Na.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"borderEnabled",!0);ot.Factory.addGetterSetter(Ze,"anchorStroke","rgb(0, 161, 255)");ot.Factory.addGetterSetter(Ze,"anchorStrokeWidth",1,(0,Na.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"anchorFill","white");ot.Factory.addGetterSetter(Ze,"anchorCornerRadius",0,(0,Na.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"borderStroke","rgb(0, 161, 255)");ot.Factory.addGetterSetter(Ze,"borderStrokeWidth",1,(0,Na.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"borderDash");ot.Factory.addGetterSetter(Ze,"keepRatio",!0);ot.Factory.addGetterSetter(Ze,"shiftBehavior","default");ot.Factory.addGetterSetter(Ze,"centeredScaling",!1);ot.Factory.addGetterSetter(Ze,"ignoreStroke",!1);ot.Factory.addGetterSetter(Ze,"padding",0,(0,Na.getNumberValidator)());ot.Factory.addGetterSetter(Ze,"node");ot.Factory.addGetterSetter(Ze,"nodes");ot.Factory.addGetterSetter(Ze,"boundBoxFunc");ot.Factory.addGetterSetter(Ze,"anchorDragBoundFunc");ot.Factory.addGetterSetter(Ze,"anchorStyleFunc");ot.Factory.addGetterSetter(Ze,"shouldOverdrawWholeArea",!1);ot.Factory.addGetterSetter(Ze,"useSingleNodeRotation",!0);ot.Factory.backCompat(Ze,{lineEnabled:"borderEnabled",rotateHandlerOffset:"rotateAnchorOffset",enabledHandlers:"enabledAnchors"});var Y1={};Object.defineProperty(Y1,"__esModule",{value:!0});Y1.Wedge=void 0;const X1=Re,wwe=mn,xwe=De,IB=fe,Cwe=De;class bs extends wwe.Shape{_sceneFunc(t){t.beginPath(),t.arc(0,0,this.radius(),0,xwe.Konva.getAngle(this.angle()),this.clockwise()),t.lineTo(0,0),t.closePath(),t.fillStrokeShape(this)}getWidth(){return this.radius()*2}getHeight(){return this.radius()*2}setWidth(t){this.radius(t/2)}setHeight(t){this.radius(t/2)}}Y1.Wedge=bs;bs.prototype.className="Wedge";bs.prototype._centroid=!0;bs.prototype._attrsAffectingSize=["radius"];(0,Cwe._registerNode)(bs);X1.Factory.addGetterSetter(bs,"radius",0,(0,IB.getNumberValidator)());X1.Factory.addGetterSetter(bs,"angle",0,(0,IB.getNumberValidator)());X1.Factory.addGetterSetter(bs,"clockwise",!1);X1.Factory.backCompat(bs,{angleDeg:"angle",getAngleDeg:"getAngle",setAngleDeg:"setAngle"});var Q1={};Object.defineProperty(Q1,"__esModule",{value:!0});Q1.Blur=void 0;const rk=Re,Twe=At,Ewe=fe;function ik(){this.r=0,this.g=0,this.b=0,this.a=0,this.next=null}var Pwe=[512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,289,287,285,282,280,278,275,273,271,269,267,265,263,261,259],kwe=[9,11,12,13,13,14,14,15,15,15,15,16,16,16,16,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,19,19,19,19,19,19,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24];function Awe(e,t){var n=e.data,r=e.width,i=e.height,o,s,a,l,u,c,d,f,h,p,m,S,v,y,g,b,_,w,x,C,k,P,A,$,M=t+t+1,T=r-1,O=i-1,I=t+1,N=I*(I+1)/2,R=new ik,D=null,L=R,V=null,z=null,U=Pwe[t],K=kwe[t];for(a=1;a>K,A!==0?(A=255/A,n[c]=(f*U>>K)*A,n[c+1]=(h*U>>K)*A,n[c+2]=(p*U>>K)*A):n[c]=n[c+1]=n[c+2]=0,f-=S,h-=v,p-=y,m-=g,S-=V.r,v-=V.g,y-=V.b,g-=V.a,l=d+((l=o+t+1)>K,A>0?(A=255/A,n[l]=(f*U>>K)*A,n[l+1]=(h*U>>K)*A,n[l+2]=(p*U>>K)*A):n[l]=n[l+1]=n[l+2]=0,f-=S,h-=v,p-=y,m-=g,S-=V.r,v-=V.g,y-=V.b,g-=V.a,l=o+((l=s+I)0&&Awe(t,n)};Q1.Blur=Owe;rk.Factory.addGetterSetter(Twe.Node,"blurRadius",0,(0,Ewe.getNumberValidator)(),rk.Factory.afterSetFilter);var Z1={};Object.defineProperty(Z1,"__esModule",{value:!0});Z1.Brighten=void 0;const ok=Re,Rwe=At,Iwe=fe,Nwe=function(e){var t=this.brightness()*255,n=e.data,r=n.length,i;for(i=0;i255?255:i,o=o<0?0:o>255?255:o,s=s<0?0:s>255?255:s,n[a]=i,n[a+1]=o,n[a+2]=s};J1.Contrast=Lwe;sk.Factory.addGetterSetter(Mwe.Node,"contrast",0,(0,Dwe.getNumberValidator)(),sk.Factory.afterSetFilter);var eb={};Object.defineProperty(eb,"__esModule",{value:!0});eb.Emboss=void 0;const va=Re,tb=At,$we=Vt,NB=fe,Fwe=function(e){var t=this.embossStrength()*10,n=this.embossWhiteLevel()*255,r=this.embossDirection(),i=this.embossBlend(),o=0,s=0,a=e.data,l=e.width,u=e.height,c=l*4,d=u;switch(r){case"top-left":o=-1,s=-1;break;case"top":o=-1,s=0;break;case"top-right":o=-1,s=1;break;case"right":o=0,s=1;break;case"bottom-right":o=1,s=1;break;case"bottom":o=1,s=0;break;case"bottom-left":o=1,s=-1;break;case"left":o=0,s=-1;break;default:$we.Util.error("Unknown emboss direction: "+r)}do{var f=(d-1)*c,h=o;d+h<1&&(h=0),d+h>u&&(h=0);var p=(d-1+h)*l*4,m=l;do{var S=f+(m-1)*4,v=s;m+v<1&&(v=0),m+v>l&&(v=0);var y=p+(m-1+v)*4,g=a[S]-a[y],b=a[S+1]-a[y+1],_=a[S+2]-a[y+2],w=g,x=w>0?w:-w,C=b>0?b:-b,k=_>0?_:-_;if(C>x&&(w=b),k>x&&(w=_),w*=t,i){var P=a[S]+w,A=a[S+1]+w,$=a[S+2]+w;a[S]=P>255?255:P<0?0:P,a[S+1]=A>255?255:A<0?0:A,a[S+2]=$>255?255:$<0?0:$}else{var M=n-w;M<0?M=0:M>255&&(M=255),a[S]=a[S+1]=a[S+2]=M}}while(--m)}while(--d)};eb.Emboss=Fwe;va.Factory.addGetterSetter(tb.Node,"embossStrength",.5,(0,NB.getNumberValidator)(),va.Factory.afterSetFilter);va.Factory.addGetterSetter(tb.Node,"embossWhiteLevel",.5,(0,NB.getNumberValidator)(),va.Factory.afterSetFilter);va.Factory.addGetterSetter(tb.Node,"embossDirection","top-left",null,va.Factory.afterSetFilter);va.Factory.addGetterSetter(tb.Node,"embossBlend",!1,null,va.Factory.afterSetFilter);var nb={};Object.defineProperty(nb,"__esModule",{value:!0});nb.Enhance=void 0;const ak=Re,Bwe=At,jwe=fe;function I2(e,t,n,r,i){var o=n-t,s=i-r,a;return o===0?r+s/2:s===0?r:(a=(e-t)/o,a=s*a+r,a)}const Vwe=function(e){var t=e.data,n=t.length,r=t[0],i=r,o,s=t[1],a=s,l,u=t[2],c=u,d,f,h=this.enhance();if(h!==0){for(f=0;fi&&(i=o),l=t[f+1],la&&(a=l),d=t[f+2],dc&&(c=d);i===r&&(i=255,r=0),a===s&&(a=255,s=0),c===u&&(c=255,u=0);var p,m,S,v,y,g,b,_,w;for(h>0?(m=i+h*(255-i),S=r-h*(r-0),y=a+h*(255-a),g=s-h*(s-0),_=c+h*(255-c),w=u-h*(u-0)):(p=(i+r)*.5,m=i+h*(i-p),S=r+h*(r-p),v=(a+s)*.5,y=a+h*(a-v),g=s+h*(s-v),b=(c+u)*.5,_=c+h*(c-b),w=u+h*(u-b)),f=0;fv?S:v;var y=s,g=o,b,_,w=360/g*Math.PI/180,x,C;for(_=0;_g?y:g;var b=s,_=o,w,x,C=n.polarRotation||0,k,P;for(c=0;ct&&(b=g,_=0,w=-1),i=0;i=0&&h=0&&p=0&&h=0&&p=255*4?255:0}return s}function nxe(e,t,n){for(var r=[.1111111111111111,.1111111111111111,.1111111111111111,.1111111111111111,.1111111111111111,.1111111111111111,.1111111111111111,.1111111111111111,.1111111111111111],i=Math.round(Math.sqrt(r.length)),o=Math.floor(i/2),s=[],a=0;a=0&&h=0&&p=n))for(o=m;o=r||(s=(n*o+i)*4,a+=b[s+0],l+=b[s+1],u+=b[s+2],c+=b[s+3],g+=1);for(a=a/g,l=l/g,u=u/g,c=c/g,i=h;i=n))for(o=m;o=r||(s=(n*o+i)*4,b[s+0]=a,b[s+1]=l,b[s+2]=u,b[s+3]=c)}};cb.Pixelate=cxe;dk.Factory.addGetterSetter(lxe.Node,"pixelSize",8,(0,uxe.getNumberValidator)(),dk.Factory.afterSetFilter);var db={};Object.defineProperty(db,"__esModule",{value:!0});db.Posterize=void 0;const fk=Re,dxe=At,fxe=fe,hxe=function(e){var t=Math.round(this.levels()*254)+1,n=e.data,r=n.length,i=255/t,o;for(o=0;o255?255:e<0?0:Math.round(e)});y0.Factory.addGetterSetter(r4.Node,"green",0,function(e){return this._filterUpToDate=!1,e>255?255:e<0?0:Math.round(e)});y0.Factory.addGetterSetter(r4.Node,"blue",0,pxe.RGBComponent,y0.Factory.afterSetFilter);var hb={};Object.defineProperty(hb,"__esModule",{value:!0});hb.RGBA=void 0;const $h=Re,pb=At,mxe=fe,yxe=function(e){var t=e.data,n=t.length,r=this.red(),i=this.green(),o=this.blue(),s=this.alpha(),a,l;for(a=0;a255?255:e<0?0:Math.round(e)});$h.Factory.addGetterSetter(pb.Node,"green",0,function(e){return this._filterUpToDate=!1,e>255?255:e<0?0:Math.round(e)});$h.Factory.addGetterSetter(pb.Node,"blue",0,mxe.RGBComponent,$h.Factory.afterSetFilter);$h.Factory.addGetterSetter(pb.Node,"alpha",1,function(e){return this._filterUpToDate=!1,e>1?1:e<0?0:e});var gb={};Object.defineProperty(gb,"__esModule",{value:!0});gb.Sepia=void 0;const vxe=function(e){var t=e.data,n=t.length,r,i,o,s;for(r=0;r127&&(u=255-u),c>127&&(c=255-c),d>127&&(d=255-d),t[l]=u,t[l+1]=c,t[l+2]=d}while(--a)}while(--o)};mb.Solarize=bxe;var yb={};Object.defineProperty(yb,"__esModule",{value:!0});yb.Threshold=void 0;const hk=Re,Sxe=At,_xe=fe,wxe=function(e){var t=this.threshold()*255,n=e.data,r=n.length,i;for(i=0;i{const{width:r,height:i}=t,o=document.createElement("div"),s=new Fd.Stage({container:o,width:r,height:i}),a=new Fd.Layer,l=new Fd.Layer;return a.add(new Fd.Rect({...t,fill:n?"black":"white"})),e.forEach(u=>l.add(new Fd.Line({points:u.points,stroke:n?"white":"black",strokeWidth:u.strokeWidth*2,tension:0,lineCap:"round",lineJoin:"round",shadowForStrokeEnabled:!1,globalCompositeOperation:u.tool==="brush"?"source-over":"destination-out"}))),s.add(a),s.add(l),o.remove(),s},lCe=async(e,t,n)=>new Promise((r,i)=>{const o=document.createElement("canvas");o.width=t,o.height=n;const s=o.getContext("2d"),a=new Image;if(!s){o.remove(),i("Unable to get context");return}a.onload=function(){s.drawImage(a,0,0),o.remove(),r(s.getImageData(0,0,t,n))},a.src=e}),mk=async(e,t)=>{const n=e.toDataURL(t);return await lCe(n,t.width,t.height)},uCe=we.child({namespace:"getCanvasDataURLs"}),cCe=async e=>{const t=w1(),n=obe();if(!t||!n){uCe.error("Unable to find canvas / stage");return}const{layerState:{objects:r},boundingBoxCoordinates:i,boundingBoxDimensions:o,isMaskEnabled:s,shouldPreserveMaskedArea:a}=e.canvas,l={...i,...o},u=t.clone();u.scale({x:1,y:1});const c=u.getAbsolutePosition(),d={x:l.x+c.x,y:l.y+c.y,width:l.width,height:l.height},f=await d0(u,d),h=await mk(u,d),p=await aCe(s?r.filter(jI):[],l,a),m=await d0(p,l),S=await mk(p,l);return{baseBlob:f,baseImageData:h,maskBlob:m,maskImageData:S}},dCe=e=>{let t=!0,n=!1;const r=e.length;let i=3;for(i;i{const t=e.length;let n=0;for(n;n{const{isPartiallyTransparent:n,isFullyTransparent:r}=dCe(e.data),i=fCe(t.data);return n?r?"txt2img":"outpaint":i?"inpaint":"img2img"},yk=e=>new Promise((t,n)=>{const r=new FileReader;r.onload=i=>t(r.result),r.onerror=i=>n(r.error),r.onabort=i=>n(new Error("Read aborted")),r.readAsDataURL(e)}),pCe=e=>{const t=window.open("");t&&e.forEach(n=>{const r=new Image;r.src=n.base64,t.document.write(n.caption),t.document.write("
"),t.document.write(r.outerHTML),t.document.write("

")})},N2=we.child({namespace:"invoke"}),gCe=()=>{pe({predicate:e=>Op.match(e)&&e.payload==="unifiedCanvas",effect:async(e,{getState:t,dispatch:n,take:r})=>{const i=t(),o=await cCe(i);if(!o){N2.error("Unable to create canvas data");return}const{baseBlob:s,baseImageData:a,maskBlob:l,maskImageData:u}=o,c=hCe(a,u);if(i.system.enableImageDebugging){const v=await yk(s),y=await yk(l);pCe([{base64:y,caption:"mask b64"},{base64:v,caption:"image b64"}])}N2.debug(`Generation mode: ${c}`);let d,f;if(["img2img","inpaint","outpaint"].includes(c)){const{requestId:v}=n(Dr({file:new File([s],"canvasInitImage.png",{type:"image/png"}),image_category:"general",is_intermediate:!0})),[{payload:y}]=await r(g=>Dr.fulfilled.match(g)&&g.meta.requestId===v);d=y}if(["inpaint","outpaint"].includes(c)){const{requestId:v}=n(Dr({file:new File([l],"canvasMaskImage.png",{type:"image/png"}),image_category:"mask",is_intermediate:!0})),[{payload:y}]=await r(g=>Dr.fulfilled.match(g)&&g.meta.requestId===v);f=y}const h=a2e(i,c,d,f);N2.debug({graph:h},"Canvas graph built"),n(JF(h));const{requestId:p}=n(ar({graph:h})),[m]=await r(v=>ar.fulfilled.match(v)&&v.meta.requestId===p),S=m.payload.id;["img2img","inpaint"].includes(c)&&d&&n(Qi({image_name:d.image_name,session_id:S})),["inpaint"].includes(c)&&f&&n(Qi({image_name:f.image_name,session_id:S})),i.canvas.layerState.stagingArea.boundingBox||n(Ape({sessionId:S,boundingBox:{...i.canvas.boundingBoxCoordinates,...i.canvas.boundingBoxDimensions}})),n(Ope(S)),n(Qc())}})},mCe=we.child({namespace:"nodes"}),yCe=e=>{const{positivePrompt:t,negativePrompt:n,model:r,cfgScale:i,scheduler:o,steps:s,initialImage:a,img2imgStrength:l,shouldFitToWidthHeight:u,width:c,height:d,clipSkip:f,shouldUseCpuNoise:h,shouldUseNoiseSettings:p}=e.generation,{isEnabled:m,imageNames:S,asInitialImage:v}=e.batch,y=m&&S.length>0&&v;if(!a&&!y)throw mCe.error("No initial image found in state"),new Error("No initial image found in state");const g=Zc((r==null?void 0:r.id)||""),b=p?h:Fl.shouldUseCpuNoise,_={id:h0,nodes:{[_t]:{type:"main_model_loader",id:_t,model:g},[dt]:{type:"clip_skip",id:dt,skipped_layers:f},[Ft]:{type:"compel",id:Ft,prompt:t},[Kt]:{type:"compel",id:Kt,prompt:n},[Dt]:{type:"noise",id:Dt,use_cpu:b},[Fr]:{type:"l2i",id:Fr},[tn]:{type:"l2l",id:tn,cfg_scale:i,scheduler:o,steps:s,strength:l},[Ln]:{type:"i2l",id:Ln}},edges:[{source:{node_id:_t,field:"unet"},destination:{node_id:tn,field:"unet"}},{source:{node_id:_t,field:"clip"},destination:{node_id:dt,field:"clip"}},{source:{node_id:dt,field:"clip"},destination:{node_id:Ft,field:"clip"}},{source:{node_id:dt,field:"clip"},destination:{node_id:Kt,field:"clip"}},{source:{node_id:tn,field:"latents"},destination:{node_id:Fr,field:"latents"}},{source:{node_id:Ln,field:"latents"},destination:{node_id:tn,field:"latents"}},{source:{node_id:Dt,field:"noise"},destination:{node_id:tn,field:"noise"}},{source:{node_id:Kt,field:"conditioning"},destination:{node_id:tn,field:"negative_conditioning"}},{source:{node_id:Ft,field:"conditioning"},destination:{node_id:tn,field:"positive_conditioning"}}]};if(u&&(a.width!==c||a.height!==d)){const w={id:Ji,type:"img_resize",image:{image_name:a.imageName},is_intermediate:!0,width:c,height:d};_.nodes[Ji]=w,_.edges.push({source:{node_id:Ji,field:"image"},destination:{node_id:Ln,field:"image"}}),_.edges.push({source:{node_id:Ji,field:"width"},destination:{node_id:Dt,field:"width"}}),_.edges.push({source:{node_id:Ji,field:"height"},destination:{node_id:Dt,field:"height"}})}else _.nodes[Ln].image={image_name:a.imageName},_.edges.push({source:{node_id:Ln,field:"width"},destination:{node_id:Dt,field:"width"}}),_.edges.push({source:{node_id:Ln,field:"height"},destination:{node_id:Dt,field:"height"}});if(m&&v&&S.length>0){delete _.nodes[Ln].image;const w={id:w2,type:"image_collection",images:S.map(C=>({image_name:C}))},x={id:Mg,type:"iterate"};_.nodes[w2]=w,_.nodes[Mg]=x,_.edges.push({source:{node_id:w2,field:"collection"},destination:{node_id:Mg,field:"collection"}}),_.edges.push({source:{node_id:Mg,field:"item"},destination:{node_id:Ln,field:"image"}})}return Rp(_,e,tn),Ip(_,e),T1(_,e),C1(_,tn,e),_},vCe=we.child({namespace:"invoke"}),bCe=()=>{pe({predicate:e=>Op.match(e)&&e.payload==="img2img",effect:async(e,{getState:t,dispatch:n,take:r})=>{const i=t(),o=yCe(i);n(ZF(o)),vCe.debug({data:o},"Image to Image graph built"),n(ar({graph:o})),await r(ar.fulfilled.match),n(Qc())}})};let Vg;const SCe=new Uint8Array(16);function _Ce(){if(!Vg&&(Vg=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!Vg))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return Vg(SCe)}const In=[];for(let e=0;e<256;++e)In.push((e+256).toString(16).slice(1));function wCe(e,t=0){return(In[e[t+0]]+In[e[t+1]]+In[e[t+2]]+In[e[t+3]]+"-"+In[e[t+4]]+In[e[t+5]]+"-"+In[e[t+6]]+In[e[t+7]]+"-"+In[e[t+8]]+In[e[t+9]]+"-"+In[e[t+10]]+In[e[t+11]]+In[e[t+12]]+In[e[t+13]]+In[e[t+14]]+In[e[t+15]]).toLowerCase()}const xCe=typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto),vk={randomUUID:xCe};function CCe(e,t,n){if(vk.randomUUID&&!t&&!e)return vk.randomUUID();e=e||{};const r=e.random||(e.rng||_Ce)();if(r[6]=r[6]&15|64,r[8]=r[8]&63|128,t){n=n||0;for(let i=0;i<16;++i)t[n+i]=r[i];return t}return wCe(r)}const TCe=e=>{if(e.type==="color"&&e.value){const t=gr(e.value),{r:n,g:r,b:i,a:o}=e.value,s=Math.max(0,Math.min(o*255,255));return Object.assign(t,{r:n,g:r,b:i,a:s}),t}return e.type==="model"&&e.value?Zc(e.value):e.type==="vae_model"&&e.value?XF(e.value):e.type==="lora_model"&&e.value?KF(e.value):e.value},ECe=e=>{const{nodes:t,edges:n}=e.nodes,i=t.filter(a=>a.type!=="progress_image").reduce((a,l,u)=>{const{id:c,data:d}=l,{type:f,inputs:h}=d,p=Tv(h,(S,v,y)=>{const g=TCe(v);return S[y]=g,S},{}),m={type:f,id:c,...p};return Object.assign(a,{[c]:m}),a},{}),o=n.reduce((a,l,u)=>{const{source:c,target:d,sourceHandle:f,targetHandle:h}=l;return a.push({source:{node_id:c,field:f},destination:{node_id:d,field:h}}),a},[]);return o.forEach(a=>{const l=i[a.destination.node_id],u=a.destination.field;i[a.destination.node_id]=sI(l,u)}),{id:CCe(),nodes:i,edges:o}},PCe=we.child({namespace:"invoke"}),kCe=()=>{pe({predicate:e=>Op.match(e)&&e.payload==="nodes",effect:async(e,{getState:t,dispatch:n,take:r})=>{const i=t(),o=ECe(i);n(eB(o)),PCe.debug({data:o},"Nodes graph built"),n(ar({graph:o})),await r(ar.fulfilled.match),n(Qc())}})},ACe=e=>{const{positivePrompt:t,negativePrompt:n,model:r,cfgScale:i,scheduler:o,steps:s,width:a,height:l,clipSkip:u,shouldUseCpuNoise:c,shouldUseNoiseSettings:d}=e.generation,f=Zc((r==null?void 0:r.id)||""),h=d?c:Fl.shouldUseCpuNoise,p={id:z3,nodes:{[_t]:{type:"main_model_loader",id:_t,model:f},[dt]:{type:"clip_skip",id:dt,skipped_layers:u},[Ft]:{type:"compel",id:Ft,prompt:t},[Kt]:{type:"compel",id:Kt,prompt:n},[Dt]:{type:"noise",id:Dt,width:a,height:l,use_cpu:h},[wn]:{type:"t2l",id:wn,cfg_scale:i,scheduler:o,steps:s},[Fr]:{type:"l2i",id:Fr}},edges:[{source:{node_id:_t,field:"clip"},destination:{node_id:dt,field:"clip"}},{source:{node_id:_t,field:"unet"},destination:{node_id:wn,field:"unet"}},{source:{node_id:dt,field:"clip"},destination:{node_id:Ft,field:"clip"}},{source:{node_id:dt,field:"clip"},destination:{node_id:Kt,field:"clip"}},{source:{node_id:Ft,field:"conditioning"},destination:{node_id:wn,field:"positive_conditioning"}},{source:{node_id:Kt,field:"conditioning"},destination:{node_id:wn,field:"negative_conditioning"}},{source:{node_id:wn,field:"latents"},destination:{node_id:Fr,field:"latents"}},{source:{node_id:Dt,field:"noise"},destination:{node_id:wn,field:"noise"}}]};return Rp(p,e,wn),Ip(p,e),T1(p,e),C1(p,wn,e),p},OCe=we.child({namespace:"invoke"}),RCe=()=>{pe({predicate:e=>Op.match(e)&&e.payload==="txt2img",effect:async(e,{getState:t,dispatch:n,take:r})=>{const i=t(),o=ACe(i);n(QF(o)),OCe.debug({data:o},"Text to Image graph built"),n(ar({graph:o})),await r(ar.fulfilled.match),n(Qc())}})},LB=h7(),pe=LB.startListening;Fbe();Bbe();Lbe();$be();Gbe();Ebe();Pbe();kbe();Abe();J1e();Dbe();Rbe();Ibe();jbe();Vbe();gCe();kCe();RCe();bCe();LSe();mbe();fbe();ube();pbe();t2e();Y1e();VSe();USe();WSe();KSe();YSe();FSe();jSe();QSe();JSe();ASe();OSe();RSe();ISe();NSe();MSe();ESe();PSe();kSe();xSe();CSe();wbe();bbe();Cbe();Tbe();Nbe();Mbe();Z1e();ySe();TSe();Obe();Hbe();Q1e();const S9e=["chakra-ui-color-mode","i18nextLng","ROARR_FILTER","ROARR_LOG"],ICe="@@invokeai-",NCe=["cursorPosition","isCanvasInitialized","doesCanvasNeedScaling"],MCe=["pendingControlImages"],DCe=["selection","entities","ids","isLoading","limit","offset","selectedBoardId","categories","galleryView","total","isInitialized"],LCe=["isLightboxOpen"],$Ce=["schema","invocationTemplates"],FCe=[],BCe=[],jCe=["currentIteration","currentStep","isCancelable","isConnected","isESRGANAvailable","isGFPGANAvailable","isProcessing","totalIterations","totalSteps","openModel","isCancelScheduled","progressImage","wereModelsReceived","wasSchemaParsed","isPersisted","isUploading"],VCe=["shouldShowImageDetails"],zCe={canvas:NCe,gallery:DCe,generation:FCe,lightbox:LCe,nodes:$Ce,postprocessing:BCe,system:jCe,ui:VCe,controlNet:MCe},UCe=(e,t)=>{const n=sI(e,zCe[t]);return JSON.stringify(n)},GCe={canvas:PL,gallery:NI,generation:Fl,lightbox:e$,nodes:ux,postprocessing:dx,system:AF,config:gN,ui:TL,hotkeys:sL,controlNet:qw},HCe=(e,t)=>$Q(JSON.parse(e),GCe[t]),WCe=e=>{if(l2e(e)&&e.payload.nodes){const t={};return{...e,payload:{...e.payload,nodes:t}}}return Mh.fulfilled.match(e)?{...e,payload:""}:B3.match(e)?{...e,payload:""}:e},qCe=["canvas/setCursorPosition","canvas/setStageCoordinates","canvas/setStageScale","canvas/setIsDrawing","canvas/setBoundingBoxCoordinates","canvas/setBoundingBoxDimensions","canvas/setIsDrawing","canvas/addPointToCurrentLine","socket/socketGeneratorProgress","socket/appSocketGeneratorProgress","hotkeys/shiftKeyPressed"],KCe=e=>e,YCe={canvas:Rpe,gallery:JJ,generation:Spe,lightbox:qpe,nodes:x1e,postprocessing:T1e,system:K1e,config:bne,ui:Tpe,hotkeys:zfe,controlNet:Lpe,boards:Vpe,dynamicPrompts:Bpe,batch:tee,imageDeletion:Gpe,lora:Xpe,[da.reducerPath]:da.reducer},XCe=zc(YCe),QCe=qH(XCe),ZCe=["canvas","gallery","generation","lightbox","nodes","postprocessing","system","ui","controlNet","dynamicPrompts","batch","lora"],JCe=WR({reducer:QCe,enhancers:[KH(window.localStorage,ZCe,{persistDebounce:300,serialize:UCe,unserialize:HCe,prefix:ICe})],middleware:e=>e({immutableCheck:!1,serializableCheck:!1}).concat(da.middleware).concat(EH).prepend(LB.middleware),devTools:{actionsDenylist:qCe,actionSanitizer:WCe,stateSanitizer:KCe,trace:!0}}),e5e=e=>e,t5e=""+new URL("logo-13003d72.png",import.meta.url).href,n5e=()=>j.jsxs(By,{position:"relative",width:"100vw",height:"100vh",alignItems:"center",justifyContent:"center",bg:"#151519",children:[j.jsx(s3,{src:t5e,w:"8rem",h:"8rem"}),j.jsx(l1,{label:"Loading",color:"grey",position:"absolute",size:"sm",width:"24px !important",height:"24px !important",right:"1.5rem",bottom:"1.5rem"})]}),r5e=E.memo(n5e);function Tx(e){"@babel/helpers - typeof";return Tx=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Tx(e)}var $B=[],i5e=$B.forEach,o5e=$B.slice;function Ex(e){return i5e.call(o5e.call(arguments,1),function(t){if(t)for(var n in t)e[n]===void 0&&(e[n]=t[n])}),e}function FB(){return typeof XMLHttpRequest=="function"||(typeof XMLHttpRequest>"u"?"undefined":Tx(XMLHttpRequest))==="object"}function s5e(e){return!!e&&typeof e.then=="function"}function a5e(e){return s5e(e)?e:Promise.resolve(e)}function l5e(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Px={exports:{}},zg={exports:{}},bk;function u5e(){return bk||(bk=1,function(e,t){var n=typeof self<"u"?self:Me,r=function(){function o(){this.fetch=!1,this.DOMException=n.DOMException}return o.prototype=n,new o}();(function(o){(function(s){var a={searchParams:"URLSearchParams"in o,iterable:"Symbol"in o&&"iterator"in Symbol,blob:"FileReader"in o&&"Blob"in o&&function(){try{return new Blob,!0}catch{return!1}}(),formData:"FormData"in o,arrayBuffer:"ArrayBuffer"in o};function l(T){return T&&DataView.prototype.isPrototypeOf(T)}if(a.arrayBuffer)var u=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],c=ArrayBuffer.isView||function(T){return T&&u.indexOf(Object.prototype.toString.call(T))>-1};function d(T){if(typeof T!="string"&&(T=String(T)),/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(T))throw new TypeError("Invalid character in header field name");return T.toLowerCase()}function f(T){return typeof T!="string"&&(T=String(T)),T}function h(T){var O={next:function(){var I=T.shift();return{done:I===void 0,value:I}}};return a.iterable&&(O[Symbol.iterator]=function(){return O}),O}function p(T){this.map={},T instanceof p?T.forEach(function(O,I){this.append(I,O)},this):Array.isArray(T)?T.forEach(function(O){this.append(O[0],O[1])},this):T&&Object.getOwnPropertyNames(T).forEach(function(O){this.append(O,T[O])},this)}p.prototype.append=function(T,O){T=d(T),O=f(O);var I=this.map[T];this.map[T]=I?I+", "+O:O},p.prototype.delete=function(T){delete this.map[d(T)]},p.prototype.get=function(T){return T=d(T),this.has(T)?this.map[T]:null},p.prototype.has=function(T){return this.map.hasOwnProperty(d(T))},p.prototype.set=function(T,O){this.map[d(T)]=f(O)},p.prototype.forEach=function(T,O){for(var I in this.map)this.map.hasOwnProperty(I)&&T.call(O,this.map[I],I,this)},p.prototype.keys=function(){var T=[];return this.forEach(function(O,I){T.push(I)}),h(T)},p.prototype.values=function(){var T=[];return this.forEach(function(O){T.push(O)}),h(T)},p.prototype.entries=function(){var T=[];return this.forEach(function(O,I){T.push([I,O])}),h(T)},a.iterable&&(p.prototype[Symbol.iterator]=p.prototype.entries);function m(T){if(T.bodyUsed)return Promise.reject(new TypeError("Already read"));T.bodyUsed=!0}function S(T){return new Promise(function(O,I){T.onload=function(){O(T.result)},T.onerror=function(){I(T.error)}})}function v(T){var O=new FileReader,I=S(O);return O.readAsArrayBuffer(T),I}function y(T){var O=new FileReader,I=S(O);return O.readAsText(T),I}function g(T){for(var O=new Uint8Array(T),I=new Array(O.length),N=0;N-1?O:T}function C(T,O){O=O||{};var I=O.body;if(T instanceof C){if(T.bodyUsed)throw new TypeError("Already read");this.url=T.url,this.credentials=T.credentials,O.headers||(this.headers=new p(T.headers)),this.method=T.method,this.mode=T.mode,this.signal=T.signal,!I&&T._bodyInit!=null&&(I=T._bodyInit,T.bodyUsed=!0)}else this.url=String(T);if(this.credentials=O.credentials||this.credentials||"same-origin",(O.headers||!this.headers)&&(this.headers=new p(O.headers)),this.method=x(O.method||this.method||"GET"),this.mode=O.mode||this.mode||null,this.signal=O.signal||this.signal,this.referrer=null,(this.method==="GET"||this.method==="HEAD")&&I)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(I)}C.prototype.clone=function(){return new C(this,{body:this._bodyInit})};function k(T){var O=new FormData;return T.trim().split("&").forEach(function(I){if(I){var N=I.split("="),R=N.shift().replace(/\+/g," "),D=N.join("=").replace(/\+/g," ");O.append(decodeURIComponent(R),decodeURIComponent(D))}}),O}function P(T){var O=new p,I=T.replace(/\r?\n[\t ]+/g," ");return I.split(/\r?\n/).forEach(function(N){var R=N.split(":"),D=R.shift().trim();if(D){var L=R.join(":").trim();O.append(D,L)}}),O}_.call(C.prototype);function A(T,O){O||(O={}),this.type="default",this.status=O.status===void 0?200:O.status,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in O?O.statusText:"OK",this.headers=new p(O.headers),this.url=O.url||"",this._initBody(T)}_.call(A.prototype),A.prototype.clone=function(){return new A(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new p(this.headers),url:this.url})},A.error=function(){var T=new A(null,{status:0,statusText:""});return T.type="error",T};var $=[301,302,303,307,308];A.redirect=function(T,O){if($.indexOf(O)===-1)throw new RangeError("Invalid status code");return new A(null,{status:O,headers:{location:T}})},s.DOMException=o.DOMException;try{new s.DOMException}catch{s.DOMException=function(O,I){this.message=O,this.name=I;var N=Error(O);this.stack=N.stack},s.DOMException.prototype=Object.create(Error.prototype),s.DOMException.prototype.constructor=s.DOMException}function M(T,O){return new Promise(function(I,N){var R=new C(T,O);if(R.signal&&R.signal.aborted)return N(new s.DOMException("Aborted","AbortError"));var D=new XMLHttpRequest;function L(){D.abort()}D.onload=function(){var V={status:D.status,statusText:D.statusText,headers:P(D.getAllResponseHeaders()||"")};V.url="responseURL"in D?D.responseURL:V.headers.get("X-Request-URL");var z="response"in D?D.response:D.responseText;I(new A(z,V))},D.onerror=function(){N(new TypeError("Network request failed"))},D.ontimeout=function(){N(new TypeError("Network request failed"))},D.onabort=function(){N(new s.DOMException("Aborted","AbortError"))},D.open(R.method,R.url,!0),R.credentials==="include"?D.withCredentials=!0:R.credentials==="omit"&&(D.withCredentials=!1),"responseType"in D&&a.blob&&(D.responseType="blob"),R.headers.forEach(function(V,z){D.setRequestHeader(z,V)}),R.signal&&(R.signal.addEventListener("abort",L),D.onreadystatechange=function(){D.readyState===4&&R.signal.removeEventListener("abort",L)}),D.send(typeof R._bodyInit>"u"?null:R._bodyInit)})}return M.polyfill=!0,o.fetch||(o.fetch=M,o.Headers=p,o.Request=C,o.Response=A),s.Headers=p,s.Request=C,s.Response=A,s.fetch=M,Object.defineProperty(s,"__esModule",{value:!0}),s})({})})(r),r.fetch.ponyfill=!0,delete r.fetch.polyfill;var i=r;t=i.fetch,t.default=i.fetch,t.fetch=i.fetch,t.Headers=i.Headers,t.Request=i.Request,t.Response=i.Response,e.exports=t}(zg,zg.exports)),zg.exports}(function(e,t){var n;if(typeof fetch=="function"&&(typeof Me<"u"&&Me.fetch?n=Me.fetch:typeof window<"u"&&window.fetch?n=window.fetch:n=fetch),typeof l5e<"u"&&(typeof window>"u"||typeof window.document>"u")){var r=n||u5e();r.default&&(r=r.default),t.default=r,e.exports=t.default}})(Px,Px.exports);var BB=Px.exports;const jB=kl(BB),Sk=Yk({__proto__:null,default:jB},[BB]);function v0(e){"@babel/helpers - typeof";return v0=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},v0(e)}var ns;typeof fetch=="function"&&(typeof global<"u"&&global.fetch?ns=global.fetch:typeof window<"u"&&window.fetch?ns=window.fetch:ns=fetch);var Fh;FB()&&(typeof global<"u"&&global.XMLHttpRequest?Fh=global.XMLHttpRequest:typeof window<"u"&&window.XMLHttpRequest&&(Fh=window.XMLHttpRequest));var b0;typeof ActiveXObject=="function"&&(typeof global<"u"&&global.ActiveXObject?b0=global.ActiveXObject:typeof window<"u"&&window.ActiveXObject&&(b0=window.ActiveXObject));!ns&&Sk&&!Fh&&!b0&&(ns=jB||Sk);typeof ns!="function"&&(ns=void 0);var kx=function(t,n){if(n&&v0(n)==="object"){var r="";for(var i in n)r+="&"+encodeURIComponent(i)+"="+encodeURIComponent(n[i]);if(!r)return t;t=t+(t.indexOf("?")!==-1?"&":"?")+r.slice(1)}return t},_k=function(t,n,r){ns(t,n).then(function(i){if(!i.ok)return r(i.statusText||"Error",{status:i.status});i.text().then(function(o){r(null,{status:i.status,data:o})}).catch(r)}).catch(r)},wk=!1,c5e=function(t,n,r,i){t.queryStringParams&&(n=kx(n,t.queryStringParams));var o=Ex({},typeof t.customHeaders=="function"?t.customHeaders():t.customHeaders);r&&(o["Content-Type"]="application/json");var s=typeof t.requestOptions=="function"?t.requestOptions(r):t.requestOptions,a=Ex({method:r?"POST":"GET",body:r?t.stringify(r):void 0,headers:o},wk?{}:s);try{_k(n,a,i)}catch(l){if(!s||Object.keys(s).length===0||!l.message||l.message.indexOf("not implemented")<0)return i(l);try{Object.keys(s).forEach(function(u){delete a[u]}),_k(n,a,i),wk=!0}catch(u){i(u)}}},d5e=function(t,n,r,i){r&&v0(r)==="object"&&(r=kx("",r).slice(1)),t.queryStringParams&&(n=kx(n,t.queryStringParams));try{var o;Fh?o=new Fh:o=new b0("MSXML2.XMLHTTP.3.0"),o.open(r?"POST":"GET",n,1),t.crossDomain||o.setRequestHeader("X-Requested-With","XMLHttpRequest"),o.withCredentials=!!t.withCredentials,r&&o.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),o.overrideMimeType&&o.overrideMimeType("application/json");var s=t.customHeaders;if(s=typeof s=="function"?s():s,s)for(var a in s)o.setRequestHeader(a,s[a]);o.onreadystatechange=function(){o.readyState>3&&i(o.status>=400?o.statusText:null,{status:o.status,data:o.responseText})},o.send(r)}catch(l){console&&console.log(l)}},f5e=function(t,n,r,i){if(typeof r=="function"&&(i=r,r=void 0),i=i||function(){},ns&&n.indexOf("file:")!==0)return c5e(t,n,r,i);if(FB()||typeof ActiveXObject=="function")return d5e(t,n,r,i);i(new Error("No fetch and no xhr implementation found!"))};function Bh(e){"@babel/helpers - typeof";return Bh=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Bh(e)}function h5e(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function xk(e,t){for(var n=0;n1&&arguments[1]!==void 0?arguments[1]:{},r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};h5e(this,e),this.services=t,this.options=n,this.allOptions=r,this.type="backend",this.init(t,n,r)}return p5e(e,[{key:"init",value:function(n){var r=this,i=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};this.services=n,this.options=Ex(i,this.options||{},y5e()),this.allOptions=o,this.services&&this.options.reloadInterval&&setInterval(function(){return r.reload()},this.options.reloadInterval)}},{key:"readMulti",value:function(n,r,i){this._readAny(n,n,r,r,i)}},{key:"read",value:function(n,r,i){this._readAny([n],n,[r],r,i)}},{key:"_readAny",value:function(n,r,i,o,s){var a=this,l=this.options.loadPath;typeof this.options.loadPath=="function"&&(l=this.options.loadPath(n,i)),l=a5e(l),l.then(function(u){if(!u)return s(null,{});var c=a.services.interpolator.interpolate(u,{lng:n.join("+"),ns:i.join("+")});a.loadUrl(c,s,r,o)})}},{key:"loadUrl",value:function(n,r,i,o){var s=this,a=typeof i=="string"?[i]:i,l=typeof o=="string"?[o]:o,u=this.options.parseLoadPayload(a,l);this.options.request(this.options,n,u,function(c,d){if(d&&(d.status>=500&&d.status<600||!d.status))return r("failed loading "+n+"; status code: "+d.status,!0);if(d&&d.status>=400&&d.status<500)return r("failed loading "+n+"; status code: "+d.status,!1);if(!d&&c&&c.message&&c.message.indexOf("Failed to fetch")>-1)return r("failed loading "+n+": "+c.message,!0);if(c)return r(c,!1);var f,h;try{typeof d.data=="string"?f=s.options.parse(d.data,i,o):f=d.data}catch{h="failed parsing "+n+" to json"}if(h)return r(h,!1);r(null,f)})}},{key:"create",value:function(n,r,i,o,s){var a=this;if(this.options.addPath){typeof n=="string"&&(n=[n]);var l=this.options.parsePayload(r,i,o),u=0,c=[],d=[];n.forEach(function(f){var h=a.options.addPath;typeof a.options.addPath=="function"&&(h=a.options.addPath(f,r));var p=a.services.interpolator.interpolate(h,{lng:f,ns:r});a.options.request(a.options,p,l,function(m,S){u+=1,c.push(m),d.push(S),u===n.length&&typeof s=="function"&&s(c,d)})})}}},{key:"reload",value:function(){var n=this,r=this.services,i=r.backendConnector,o=r.languageUtils,s=r.logger,a=i.language;if(!(a&&a.toLowerCase()==="cimode")){var l=[],u=function(d){var f=o.toResolveHierarchy(d);f.forEach(function(h){l.indexOf(h)<0&&l.push(h)})};u(a),this.allOptions.preload&&this.allOptions.preload.forEach(function(c){return u(c)}),l.forEach(function(c){n.allOptions.ns.forEach(function(d){i.read(c,d,"read",null,null,function(f,h){f&&s.warn("loading namespace ".concat(d," for language ").concat(c," failed"),f),!f&&h&&s.log("loaded namespace ".concat(d," for language ").concat(c),h),i.loaded("".concat(c,"|").concat(d),f,h)})})})}}}]),e}();zB.type="backend";Qn.use(zB).use(ehe).init({fallbackLng:"en",debug:!1,backend:{loadPath:"/locales/{{lng}}.json"},interpolation:{escapeValue:!1},returnNull:!1});const bo=Object.create(null);bo.open="0";bo.close="1";bo.ping="2";bo.pong="3";bo.message="4";bo.upgrade="5";bo.noop="6";const Am=Object.create(null);Object.keys(bo).forEach(e=>{Am[bo[e]]=e});const v5e={type:"error",data:"parser error"},UB=typeof Blob=="function"||typeof Blob<"u"&&Object.prototype.toString.call(Blob)==="[object BlobConstructor]",GB=typeof ArrayBuffer=="function",HB=e=>typeof ArrayBuffer.isView=="function"?ArrayBuffer.isView(e):e&&e.buffer instanceof ArrayBuffer,i4=({type:e,data:t},n,r)=>UB&&t instanceof Blob?n?r(t):Ck(t,r):GB&&(t instanceof ArrayBuffer||HB(t))?n?r(t):Ck(new Blob([t]),r):r(bo[e]+(t||"")),Ck=(e,t)=>{const n=new FileReader;return n.onload=function(){const r=n.result.split(",")[1];t("b"+(r||""))},n.readAsDataURL(e)};function Tk(e){return e instanceof Uint8Array?e:e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}let M2;function b5e(e,t){if(UB&&e.data instanceof Blob)return e.data.arrayBuffer().then(Tk).then(t);if(GB&&(e.data instanceof ArrayBuffer||HB(e.data)))return t(Tk(e.data));i4(e,!1,n=>{M2||(M2=new TextEncoder),t(M2.encode(n))})}const Ek="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Jd=typeof Uint8Array>"u"?[]:new Uint8Array(256);for(let e=0;e{let t=e.length*.75,n=e.length,r,i=0,o,s,a,l;e[e.length-1]==="="&&(t--,e[e.length-2]==="="&&t--);const u=new ArrayBuffer(t),c=new Uint8Array(u);for(r=0;r>4,c[i++]=(s&15)<<4|a>>2,c[i++]=(a&3)<<6|l&63;return u},_5e=typeof ArrayBuffer=="function",o4=(e,t)=>{if(typeof e!="string")return{type:"message",data:WB(e,t)};const n=e.charAt(0);return n==="b"?{type:"message",data:w5e(e.substring(1),t)}:Am[n]?e.length>1?{type:Am[n],data:e.substring(1)}:{type:Am[n]}:v5e},w5e=(e,t)=>{if(_5e){const n=S5e(e);return WB(n,t)}else return{base64:!0,data:e}},WB=(e,t)=>{switch(t){case"blob":return e instanceof Blob?e:new Blob([e]);case"arraybuffer":default:return e instanceof ArrayBuffer?e:e.buffer}},qB=String.fromCharCode(30),x5e=(e,t)=>{const n=e.length,r=new Array(n);let i=0;e.forEach((o,s)=>{i4(o,!1,a=>{r[s]=a,++i===n&&t(r.join(qB))})})},C5e=(e,t)=>{const n=e.split(qB),r=[];for(let i=0;i54;return o4(r?e:D2.decode(e),n)}const KB=4;function on(e){if(e)return E5e(e)}function E5e(e){for(var t in on.prototype)e[t]=on.prototype[t];return e}on.prototype.on=on.prototype.addEventListener=function(e,t){return this._callbacks=this._callbacks||{},(this._callbacks["$"+e]=this._callbacks["$"+e]||[]).push(t),this};on.prototype.once=function(e,t){function n(){this.off(e,n),t.apply(this,arguments)}return n.fn=t,this.on(e,n),this};on.prototype.off=on.prototype.removeListener=on.prototype.removeAllListeners=on.prototype.removeEventListener=function(e,t){if(this._callbacks=this._callbacks||{},arguments.length==0)return this._callbacks={},this;var n=this._callbacks["$"+e];if(!n)return this;if(arguments.length==1)return delete this._callbacks["$"+e],this;for(var r,i=0;itypeof self<"u"?self:typeof window<"u"?window:Function("return this")())();function YB(e,...t){return t.reduce((n,r)=>(e.hasOwnProperty(r)&&(n[r]=e[r]),n),{})}const P5e=ri.setTimeout,k5e=ri.clearTimeout;function vb(e,t){t.useNativeTimers?(e.setTimeoutFn=P5e.bind(ri),e.clearTimeoutFn=k5e.bind(ri)):(e.setTimeoutFn=ri.setTimeout.bind(ri),e.clearTimeoutFn=ri.clearTimeout.bind(ri))}const A5e=1.33;function O5e(e){return typeof e=="string"?R5e(e):Math.ceil((e.byteLength||e.size)*A5e)}function R5e(e){let t=0,n=0;for(let r=0,i=e.length;r=57344?n+=3:(r++,n+=4);return n}function I5e(e){let t="";for(let n in e)e.hasOwnProperty(n)&&(t.length&&(t+="&"),t+=encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t}function N5e(e){let t={},n=e.split("&");for(let r=0,i=n.length;r0);return t}function QB(){const e=Ak(+new Date);return e!==kk?(Pk=0,kk=e):e+"."+Ak(Pk++)}for(;Ug{this.readyState="paused",t()};if(this.polling||!this.writable){let r=0;this.polling&&(r++,this.once("pollComplete",function(){--r||n()})),this.writable||(r++,this.once("drain",function(){--r||n()}))}else n()}poll(){this.polling=!0,this.doPoll(),this.emitReserved("poll")}onData(t){const n=r=>{if(this.readyState==="opening"&&r.type==="open"&&this.onOpen(),r.type==="close")return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(r)};C5e(t,this.socket.binaryType).forEach(n),this.readyState!=="closed"&&(this.polling=!1,this.emitReserved("pollComplete"),this.readyState==="open"&&this.poll())}doClose(){const t=()=>{this.write([{type:"close"}])};this.readyState==="open"?t():this.once("open",t)}write(t){this.writable=!1,x5e(t,n=>{this.doWrite(n,()=>{this.writable=!0,this.emitReserved("drain")})})}uri(){const t=this.opts.secure?"https":"http",n=this.query||{};return this.opts.timestampRequests!==!1&&(n[this.opts.timestampParam]=QB()),!this.supportsBinary&&!n.sid&&(n.b64=1),this.createUri(t,n)}request(t={}){return Object.assign(t,{xd:this.xd,cookieJar:this.cookieJar},this.opts),new ac(this.uri(),t)}doWrite(t,n){const r=this.request({method:"POST",data:t});r.on("success",n),r.on("error",(i,o)=>{this.onError("xhr post error",i,o)})}doPoll(){const t=this.request();t.on("data",this.onData.bind(this)),t.on("error",(n,r)=>{this.onError("xhr poll error",n,r)}),this.pollXhr=t}}let ac=class Om extends on{constructor(t,n){super(),vb(this,n),this.opts=n,this.method=n.method||"GET",this.uri=t,this.data=n.data!==void 0?n.data:null,this.create()}create(){var t;const n=YB(this.opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");n.xdomain=!!this.opts.xd;const r=this.xhr=new JB(n);try{r.open(this.method,this.uri,!0);try{if(this.opts.extraHeaders){r.setDisableHeaderCheck&&r.setDisableHeaderCheck(!0);for(let i in this.opts.extraHeaders)this.opts.extraHeaders.hasOwnProperty(i)&&r.setRequestHeader(i,this.opts.extraHeaders[i])}}catch{}if(this.method==="POST")try{r.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch{}try{r.setRequestHeader("Accept","*/*")}catch{}(t=this.opts.cookieJar)===null||t===void 0||t.addCookies(r),"withCredentials"in r&&(r.withCredentials=this.opts.withCredentials),this.opts.requestTimeout&&(r.timeout=this.opts.requestTimeout),r.onreadystatechange=()=>{var i;r.readyState===3&&((i=this.opts.cookieJar)===null||i===void 0||i.parseCookies(r)),r.readyState===4&&(r.status===200||r.status===1223?this.onLoad():this.setTimeoutFn(()=>{this.onError(typeof r.status=="number"?r.status:0)},0))},r.send(this.data)}catch(i){this.setTimeoutFn(()=>{this.onError(i)},0);return}typeof document<"u"&&(this.index=Om.requestsCount++,Om.requests[this.index]=this)}onError(t){this.emitReserved("error",t,this.xhr),this.cleanup(!0)}cleanup(t){if(!(typeof this.xhr>"u"||this.xhr===null)){if(this.xhr.onreadystatechange=$5e,t)try{this.xhr.abort()}catch{}typeof document<"u"&&delete Om.requests[this.index],this.xhr=null}}onLoad(){const t=this.xhr.responseText;t!==null&&(this.emitReserved("data",t),this.emitReserved("success"),this.cleanup())}abort(){this.cleanup()}};ac.requestsCount=0;ac.requests={};if(typeof document<"u"){if(typeof attachEvent=="function")attachEvent("onunload",Ok);else if(typeof addEventListener=="function"){const e="onpagehide"in ri?"pagehide":"unload";addEventListener(e,Ok,!1)}}function Ok(){for(let e in ac.requests)ac.requests.hasOwnProperty(e)&&ac.requests[e].abort()}const a4=(()=>typeof Promise=="function"&&typeof Promise.resolve=="function"?t=>Promise.resolve().then(t):(t,n)=>n(t,0))(),Gg=ri.WebSocket||ri.MozWebSocket,Rk=!0,j5e="arraybuffer",Ik=typeof navigator<"u"&&typeof navigator.product=="string"&&navigator.product.toLowerCase()==="reactnative";class V5e extends s4{constructor(t){super(t),this.supportsBinary=!t.forceBase64}get name(){return"websocket"}doOpen(){if(!this.check())return;const t=this.uri(),n=this.opts.protocols,r=Ik?{}:YB(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(r.headers=this.opts.extraHeaders);try{this.ws=Rk&&!Ik?n?new Gg(t,n):new Gg(t):new Gg(t,n,r)}catch(i){return this.emitReserved("error",i)}this.ws.binaryType=this.socket.binaryType||j5e,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=t=>this.onClose({description:"websocket connection closed",context:t}),this.ws.onmessage=t=>this.onData(t.data),this.ws.onerror=t=>this.onError("websocket error",t)}write(t){this.writable=!1;for(let n=0;n{const s={};try{Rk&&this.ws.send(o)}catch{}i&&a4(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){typeof this.ws<"u"&&(this.ws.close(),this.ws=null)}uri(){const t=this.opts.secure?"wss":"ws",n=this.query||{};return this.opts.timestampRequests&&(n[this.opts.timestampParam]=QB()),this.supportsBinary||(n.b64=1),this.createUri(t,n)}check(){return!!Gg}}function z5e(e,t){return e.type==="message"&&typeof e.data!="string"&&t[0]>=48&&t[0]<=54}class U5e extends s4{get name(){return"webtransport"}doOpen(){typeof WebTransport=="function"&&(this.transport=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name]),this.transport.closed.then(()=>this.onClose()),this.transport.ready.then(()=>{this.transport.createBidirectionalStream().then(t=>{const n=t.readable.getReader();this.writer=t.writable.getWriter();let r;const i=()=>{n.read().then(({done:s,value:a})=>{s||(!r&&a.byteLength===1&&a[0]===54?r=!0:(this.onPacket(T5e(a,r,"arraybuffer")),r=!1),i())})};i();const o=this.query.sid?`0{"sid":"${this.query.sid}"}`:"0";this.writer.write(new TextEncoder().encode(o)).then(()=>this.onOpen())})}))}write(t){this.writable=!1;for(let n=0;n{z5e(r,o)&&this.writer.write(Uint8Array.of(54)),this.writer.write(o).then(()=>{i&&a4(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})})}}doClose(){var t;(t=this.transport)===null||t===void 0||t.close()}}const G5e={websocket:V5e,webtransport:U5e,polling:B5e},H5e=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,W5e=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];function Ox(e){const t=e,n=e.indexOf("["),r=e.indexOf("]");n!=-1&&r!=-1&&(e=e.substring(0,n)+e.substring(n,r).replace(/:/g,";")+e.substring(r,e.length));let i=H5e.exec(e||""),o={},s=14;for(;s--;)o[W5e[s]]=i[s]||"";return n!=-1&&r!=-1&&(o.source=t,o.host=o.host.substring(1,o.host.length-1).replace(/;/g,":"),o.authority=o.authority.replace("[","").replace("]","").replace(/;/g,":"),o.ipv6uri=!0),o.pathNames=q5e(o,o.path),o.queryKey=K5e(o,o.query),o}function q5e(e,t){const n=/\/{2,9}/g,r=t.replace(n,"/").split("/");return(t.slice(0,1)=="/"||t.length===0)&&r.splice(0,1),t.slice(-1)=="/"&&r.splice(r.length-1,1),r}function K5e(e,t){const n={};return t.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function(r,i,o){i&&(n[i]=o)}),n}let ej=class bu extends on{constructor(t,n={}){super(),this.writeBuffer=[],t&&typeof t=="object"&&(n=t,t=null),t?(t=Ox(t),n.hostname=t.host,n.secure=t.protocol==="https"||t.protocol==="wss",n.port=t.port,t.query&&(n.query=t.query)):n.host&&(n.hostname=Ox(n.host).host),vb(this,n),this.secure=n.secure!=null?n.secure:typeof location<"u"&&location.protocol==="https:",n.hostname&&!n.port&&(n.port=this.secure?"443":"80"),this.hostname=n.hostname||(typeof location<"u"?location.hostname:"localhost"),this.port=n.port||(typeof location<"u"&&location.port?location.port:this.secure?"443":"80"),this.transports=n.transports||["polling","websocket","webtransport"],this.writeBuffer=[],this.prevBufferLen=0,this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!0},n),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),typeof this.opts.query=="string"&&(this.opts.query=N5e(this.opts.query)),this.id=null,this.upgrades=null,this.pingInterval=null,this.pingTimeout=null,this.pingTimeoutTimer=null,typeof addEventListener=="function"&&(this.opts.closeOnBeforeunload&&(this.beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this.beforeunloadEventListener,!1)),this.hostname!=="localhost"&&(this.offlineEventListener=()=>{this.onClose("transport close",{description:"network connection lost"})},addEventListener("offline",this.offlineEventListener,!1))),this.open()}createTransport(t){const n=Object.assign({},this.opts.query);n.EIO=KB,n.transport=t,this.id&&(n.sid=this.id);const r=Object.assign({},this.opts.transportOptions[t],this.opts,{query:n,socket:this,hostname:this.hostname,secure:this.secure,port:this.port});return new G5e[t](r)}open(){let t;if(this.opts.rememberUpgrade&&bu.priorWebsocketSuccess&&this.transports.indexOf("websocket")!==-1)t="websocket";else if(this.transports.length===0){this.setTimeoutFn(()=>{this.emitReserved("error","No transports available")},0);return}else t=this.transports[0];this.readyState="opening";try{t=this.createTransport(t)}catch{this.transports.shift(),this.open();return}t.open(),this.setTransport(t)}setTransport(t){this.transport&&this.transport.removeAllListeners(),this.transport=t,t.on("drain",this.onDrain.bind(this)).on("packet",this.onPacket.bind(this)).on("error",this.onError.bind(this)).on("close",n=>this.onClose("transport close",n))}probe(t){let n=this.createTransport(t),r=!1;bu.priorWebsocketSuccess=!1;const i=()=>{r||(n.send([{type:"ping",data:"probe"}]),n.once("packet",d=>{if(!r)if(d.type==="pong"&&d.data==="probe"){if(this.upgrading=!0,this.emitReserved("upgrading",n),!n)return;bu.priorWebsocketSuccess=n.name==="websocket",this.transport.pause(()=>{r||this.readyState!=="closed"&&(c(),this.setTransport(n),n.send([{type:"upgrade"}]),this.emitReserved("upgrade",n),n=null,this.upgrading=!1,this.flush())})}else{const f=new Error("probe error");f.transport=n.name,this.emitReserved("upgradeError",f)}}))};function o(){r||(r=!0,c(),n.close(),n=null)}const s=d=>{const f=new Error("probe error: "+d);f.transport=n.name,o(),this.emitReserved("upgradeError",f)};function a(){s("transport closed")}function l(){s("socket closed")}function u(d){n&&d.name!==n.name&&o()}const c=()=>{n.removeListener("open",i),n.removeListener("error",s),n.removeListener("close",a),this.off("close",l),this.off("upgrading",u)};n.once("open",i),n.once("error",s),n.once("close",a),this.once("close",l),this.once("upgrading",u),this.upgrades.indexOf("webtransport")!==-1&&t!=="webtransport"?this.setTimeoutFn(()=>{r||n.open()},200):n.open()}onOpen(){if(this.readyState="open",bu.priorWebsocketSuccess=this.transport.name==="websocket",this.emitReserved("open"),this.flush(),this.readyState==="open"&&this.opts.upgrade){let t=0;const n=this.upgrades.length;for(;t{this.onClose("ping timeout")},this.pingInterval+this.pingTimeout),this.opts.autoUnref&&this.pingTimeoutTimer.unref()}onDrain(){this.writeBuffer.splice(0,this.prevBufferLen),this.prevBufferLen=0,this.writeBuffer.length===0?this.emitReserved("drain"):this.flush()}flush(){if(this.readyState!=="closed"&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){const t=this.getWritablePackets();this.transport.send(t),this.prevBufferLen=t.length,this.emitReserved("flush")}}getWritablePackets(){if(!(this.maxPayload&&this.transport.name==="polling"&&this.writeBuffer.length>1))return this.writeBuffer;let n=1;for(let r=0;r0&&n>this.maxPayload)return this.writeBuffer.slice(0,r);n+=2}return this.writeBuffer}write(t,n,r){return this.sendPacket("message",t,n,r),this}send(t,n,r){return this.sendPacket("message",t,n,r),this}sendPacket(t,n,r,i){if(typeof n=="function"&&(i=n,n=void 0),typeof r=="function"&&(i=r,r=null),this.readyState==="closing"||this.readyState==="closed")return;r=r||{},r.compress=r.compress!==!1;const o={type:t,data:n,options:r};this.emitReserved("packetCreate",o),this.writeBuffer.push(o),i&&this.once("flush",i),this.flush()}close(){const t=()=>{this.onClose("forced close"),this.transport.close()},n=()=>{this.off("upgrade",n),this.off("upgradeError",n),t()},r=()=>{this.once("upgrade",n),this.once("upgradeError",n)};return(this.readyState==="opening"||this.readyState==="open")&&(this.readyState="closing",this.writeBuffer.length?this.once("drain",()=>{this.upgrading?r():t()}):this.upgrading?r():t()),this}onError(t){bu.priorWebsocketSuccess=!1,this.emitReserved("error",t),this.onClose("transport error",t)}onClose(t,n){(this.readyState==="opening"||this.readyState==="open"||this.readyState==="closing")&&(this.clearTimeoutFn(this.pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),typeof removeEventListener=="function"&&(removeEventListener("beforeunload",this.beforeunloadEventListener,!1),removeEventListener("offline",this.offlineEventListener,!1)),this.readyState="closed",this.id=null,this.emitReserved("close",t,n),this.writeBuffer=[],this.prevBufferLen=0)}filterUpgrades(t){const n=[];let r=0;const i=t.length;for(;rtypeof ArrayBuffer.isView=="function"?ArrayBuffer.isView(e):e.buffer instanceof ArrayBuffer,tj=Object.prototype.toString,Z5e=typeof Blob=="function"||typeof Blob<"u"&&tj.call(Blob)==="[object BlobConstructor]",J5e=typeof File=="function"||typeof File<"u"&&tj.call(File)==="[object FileConstructor]";function l4(e){return X5e&&(e instanceof ArrayBuffer||Q5e(e))||Z5e&&e instanceof Blob||J5e&&e instanceof File}function Rm(e,t){if(!e||typeof e!="object")return!1;if(Array.isArray(e)){for(let n=0,r=e.length;n=0&&e.num{delete this.acks[t];for(let s=0;s{this.io.clearTimeoutFn(o),n.apply(this,[null,...s])}}emitWithAck(t,...n){const r=this.flags.timeout!==void 0||this._opts.ackTimeout!==void 0;return new Promise((i,o)=>{n.push((s,a)=>r?s?o(s):i(a):i(s)),this.emit(t,...n)})}_addToQueue(t){let n;typeof t[t.length-1]=="function"&&(n=t.pop());const r={id:this._queueSeq++,tryCount:0,pending:!1,args:t,flags:Object.assign({fromQueue:!0},this.flags)};t.push((i,...o)=>r!==this._queue[0]?void 0:(i!==null?r.tryCount>this._opts.retries&&(this._queue.shift(),n&&n(i)):(this._queue.shift(),n&&n(null,...o)),r.pending=!1,this._drainQueue())),this._queue.push(r),this._drainQueue()}_drainQueue(t=!1){if(!this.connected||this._queue.length===0)return;const n=this._queue[0];n.pending&&!t||(n.pending=!0,n.tryCount++,this.flags=n.flags,this.emit.apply(this,n.args))}packet(t){t.nsp=this.nsp,this.io._packet(t)}onopen(){typeof this.auth=="function"?this.auth(t=>{this._sendConnectPacket(t)}):this._sendConnectPacket(this.auth)}_sendConnectPacket(t){this.packet({type:Ge.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},t):t})}onerror(t){this.connected||this.emitReserved("connect_error",t)}onclose(t,n){this.connected=!1,delete this.id,this.emitReserved("disconnect",t,n)}onpacket(t){if(t.nsp===this.nsp)switch(t.type){case Ge.CONNECT:t.data&&t.data.sid?this.onconnect(t.data.sid,t.data.pid):this.emitReserved("connect_error",new Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));break;case Ge.EVENT:case Ge.BINARY_EVENT:this.onevent(t);break;case Ge.ACK:case Ge.BINARY_ACK:this.onack(t);break;case Ge.DISCONNECT:this.ondisconnect();break;case Ge.CONNECT_ERROR:this.destroy();const r=new Error(t.data.message);r.data=t.data.data,this.emitReserved("connect_error",r);break}}onevent(t){const n=t.data||[];t.id!=null&&n.push(this.ack(t.id)),this.connected?this.emitEvent(n):this.receiveBuffer.push(Object.freeze(n))}emitEvent(t){if(this._anyListeners&&this._anyListeners.length){const n=this._anyListeners.slice();for(const r of n)r.apply(this,t)}super.emit.apply(this,t),this._pid&&t.length&&typeof t[t.length-1]=="string"&&(this._lastOffset=t[t.length-1])}ack(t){const n=this;let r=!1;return function(...i){r||(r=!0,n.packet({type:Ge.ACK,id:t,data:i}))}}onack(t){const n=this.acks[t.id];typeof n=="function"&&(n.apply(this,t.data),delete this.acks[t.id])}onconnect(t,n){this.id=t,this.recovered=n&&this._pid===n,this._pid=n,this.connected=!0,this.emitBuffered(),this.emitReserved("connect"),this._drainQueue(!0)}emitBuffered(){this.receiveBuffer.forEach(t=>this.emitEvent(t)),this.receiveBuffer=[],this.sendBuffer.forEach(t=>{this.notifyOutgoingListeners(t),this.packet(t)}),this.sendBuffer=[]}ondisconnect(){this.destroy(),this.onclose("io server disconnect")}destroy(){this.subs&&(this.subs.forEach(t=>t()),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&this.packet({type:Ge.DISCONNECT}),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}close(){return this.disconnect()}compress(t){return this.flags.compress=t,this}get volatile(){return this.flags.volatile=!0,this}timeout(t){return this.flags.timeout=t,this}onAny(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(t),this}prependAny(t){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(t),this}offAny(t){if(!this._anyListeners)return this;if(t){const n=this._anyListeners;for(let r=0;r0&&e.jitter<=1?e.jitter:0,this.attempts=0}od.prototype.duration=function(){var e=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var t=Math.random(),n=Math.floor(t*this.jitter*e);e=Math.floor(t*10)&1?e+n:e-n}return Math.min(e,this.max)|0};od.prototype.reset=function(){this.attempts=0};od.prototype.setMin=function(e){this.ms=e};od.prototype.setMax=function(e){this.max=e};od.prototype.setJitter=function(e){this.jitter=e};class Nx extends on{constructor(t,n){var r;super(),this.nsps={},this.subs=[],t&&typeof t=="object"&&(n=t,t=void 0),n=n||{},n.path=n.path||"/socket.io",this.opts=n,vb(this,n),this.reconnection(n.reconnection!==!1),this.reconnectionAttempts(n.reconnectionAttempts||1/0),this.reconnectionDelay(n.reconnectionDelay||1e3),this.reconnectionDelayMax(n.reconnectionDelayMax||5e3),this.randomizationFactor((r=n.randomizationFactor)!==null&&r!==void 0?r:.5),this.backoff=new od({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(n.timeout==null?2e4:n.timeout),this._readyState="closed",this.uri=t;const i=n.parser||s3e;this.encoder=new i.Encoder,this.decoder=new i.Decoder,this._autoConnect=n.autoConnect!==!1,this._autoConnect&&this.open()}reconnection(t){return arguments.length?(this._reconnection=!!t,this):this._reconnection}reconnectionAttempts(t){return t===void 0?this._reconnectionAttempts:(this._reconnectionAttempts=t,this)}reconnectionDelay(t){var n;return t===void 0?this._reconnectionDelay:(this._reconnectionDelay=t,(n=this.backoff)===null||n===void 0||n.setMin(t),this)}randomizationFactor(t){var n;return t===void 0?this._randomizationFactor:(this._randomizationFactor=t,(n=this.backoff)===null||n===void 0||n.setJitter(t),this)}reconnectionDelayMax(t){var n;return t===void 0?this._reconnectionDelayMax:(this._reconnectionDelayMax=t,(n=this.backoff)===null||n===void 0||n.setMax(t),this)}timeout(t){return arguments.length?(this._timeout=t,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&this.backoff.attempts===0&&this.reconnect()}open(t){if(~this._readyState.indexOf("open"))return this;this.engine=new ej(this.uri,this.opts);const n=this.engine,r=this;this._readyState="opening",this.skipReconnect=!1;const i=xi(n,"open",function(){r.onopen(),t&&t()}),o=a=>{this.cleanup(),this._readyState="closed",this.emitReserved("error",a),t?t(a):this.maybeReconnectOnOpen()},s=xi(n,"error",o);if(this._timeout!==!1){const a=this._timeout,l=this.setTimeoutFn(()=>{i(),o(new Error("timeout")),n.close()},a);this.opts.autoUnref&&l.unref(),this.subs.push(()=>{this.clearTimeoutFn(l)})}return this.subs.push(i),this.subs.push(s),this}connect(t){return this.open(t)}onopen(){this.cleanup(),this._readyState="open",this.emitReserved("open");const t=this.engine;this.subs.push(xi(t,"ping",this.onping.bind(this)),xi(t,"data",this.ondata.bind(this)),xi(t,"error",this.onerror.bind(this)),xi(t,"close",this.onclose.bind(this)),xi(this.decoder,"decoded",this.ondecoded.bind(this)))}onping(){this.emitReserved("ping")}ondata(t){try{this.decoder.add(t)}catch(n){this.onclose("parse error",n)}}ondecoded(t){a4(()=>{this.emitReserved("packet",t)},this.setTimeoutFn)}onerror(t){this.emitReserved("error",t)}socket(t,n){let r=this.nsps[t];return r?this._autoConnect&&!r.active&&r.connect():(r=new nj(this,t,n),this.nsps[t]=r),r}_destroy(t){const n=Object.keys(this.nsps);for(const r of n)if(this.nsps[r].active)return;this._close()}_packet(t){const n=this.encoder.encode(t);for(let r=0;rt()),this.subs.length=0,this.decoder.destroy()}_close(){this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close"),this.engine&&this.engine.close()}disconnect(){return this._close()}onclose(t,n){this.cleanup(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",t,n),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;const t=this;if(this.backoff.attempts>=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{const n=this.backoff.duration();this._reconnecting=!0;const r=this.setTimeoutFn(()=>{t.skipReconnect||(this.emitReserved("reconnect_attempt",t.backoff.attempts),!t.skipReconnect&&t.open(i=>{i?(t._reconnecting=!1,t.reconnect(),this.emitReserved("reconnect_error",i)):t.onreconnect()}))},n);this.opts.autoUnref&&r.unref(),this.subs.push(()=>{this.clearTimeoutFn(r)})}}onreconnect(){const t=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",t)}}const Bd={};function Im(e,t){typeof e=="object"&&(t=e,e=void 0),t=t||{};const n=Y5e(e,t.path||"/socket.io"),r=n.source,i=n.id,o=n.path,s=Bd[i]&&o in Bd[i].nsps,a=t.forceNew||t["force new connection"]||t.multiplex===!1||s;let l;return a?l=new Nx(r,t):(Bd[i]||(Bd[i]=new Nx(r,t)),l=Bd[i]),n.query&&!t.query&&(t.query=n.queryKey),l.socket(n.path,t)}Object.assign(Im,{Manager:Nx,Socket:nj,io:Im,connect:Im});var l3e=/d{1,4}|D{3,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|W{1,2}|[LlopSZN]|"[^"]*"|'[^']*'/g,u3e=/\b(?:[A-Z]{1,3}[A-Z][TC])(?:[-+]\d{4})?|((?:Australian )?(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time)\b/g,c3e=/[^-+\dA-Z]/g;function d3e(e,t,n,r){if(arguments.length===1&&typeof e=="string"&&!/\d/.test(e)&&(t=e,e=void 0),e=e||e===0?e:new Date,e instanceof Date||(e=new Date(e)),isNaN(e))throw TypeError("Invalid date");t=String(Mk[t]||t||Mk.default);var i=t.slice(0,4);(i==="UTC:"||i==="GMT:")&&(t=t.slice(4),n=!0,i==="GMT:"&&(r=!0));var o=function(){return n?"getUTC":"get"},s=function(){return e[o()+"Date"]()},a=function(){return e[o()+"Day"]()},l=function(){return e[o()+"Month"]()},u=function(){return e[o()+"FullYear"]()},c=function(){return e[o()+"Hours"]()},d=function(){return e[o()+"Minutes"]()},f=function(){return e[o()+"Seconds"]()},h=function(){return e[o()+"Milliseconds"]()},p=function(){return n?0:e.getTimezoneOffset()},m=function(){return f3e(e)},S=function(){return h3e(e)},v={d:function(){return s()},dd:function(){return Rr(s())},ddd:function(){return pr.dayNames[a()]},DDD:function(){return Dk({y:u(),m:l(),d:s(),_:o(),dayName:pr.dayNames[a()],short:!0})},dddd:function(){return pr.dayNames[a()+7]},DDDD:function(){return Dk({y:u(),m:l(),d:s(),_:o(),dayName:pr.dayNames[a()+7]})},m:function(){return l()+1},mm:function(){return Rr(l()+1)},mmm:function(){return pr.monthNames[l()]},mmmm:function(){return pr.monthNames[l()+12]},yy:function(){return String(u()).slice(2)},yyyy:function(){return Rr(u(),4)},h:function(){return c()%12||12},hh:function(){return Rr(c()%12||12)},H:function(){return c()},HH:function(){return Rr(c())},M:function(){return d()},MM:function(){return Rr(d())},s:function(){return f()},ss:function(){return Rr(f())},l:function(){return Rr(h(),3)},L:function(){return Rr(Math.floor(h()/10))},t:function(){return c()<12?pr.timeNames[0]:pr.timeNames[1]},tt:function(){return c()<12?pr.timeNames[2]:pr.timeNames[3]},T:function(){return c()<12?pr.timeNames[4]:pr.timeNames[5]},TT:function(){return c()<12?pr.timeNames[6]:pr.timeNames[7]},Z:function(){return r?"GMT":n?"UTC":p3e(e)},o:function(){return(p()>0?"-":"+")+Rr(Math.floor(Math.abs(p())/60)*100+Math.abs(p())%60,4)},p:function(){return(p()>0?"-":"+")+Rr(Math.floor(Math.abs(p())/60),2)+":"+Rr(Math.floor(Math.abs(p())%60),2)},S:function(){return["th","st","nd","rd"][s()%10>3?0:(s()%100-s()%10!=10)*s()%10]},W:function(){return m()},WW:function(){return Rr(m())},N:function(){return S()}};return t.replace(l3e,function(y){return y in v?v[y]():y.slice(1,y.length-1)})}var Mk={default:"ddd mmm dd yyyy HH:MM:ss",shortDate:"m/d/yy",paddedShortDate:"mm/dd/yyyy",mediumDate:"mmm d, yyyy",longDate:"mmmm d, yyyy",fullDate:"dddd, mmmm d, yyyy",shortTime:"h:MM TT",mediumTime:"h:MM:ss TT",longTime:"h:MM:ss TT Z",isoDate:"yyyy-mm-dd",isoTime:"HH:MM:ss",isoDateTime:"yyyy-mm-dd'T'HH:MM:sso",isoUtcDateTime:"UTC:yyyy-mm-dd'T'HH:MM:ss'Z'",expiresHeaderFormat:"ddd, dd mmm yyyy HH:MM:ss Z"},pr={dayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"],timeNames:["a","p","am","pm","A","P","AM","PM"]},Rr=function(t){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:2;return String(t).padStart(n,"0")},Dk=function(t){var n=t.y,r=t.m,i=t.d,o=t._,s=t.dayName,a=t.short,l=a===void 0?!1:a,u=new Date,c=new Date;c.setDate(c[o+"Date"]()-1);var d=new Date;d.setDate(d[o+"Date"]()+1);var f=function(){return u[o+"Date"]()},h=function(){return u[o+"Month"]()},p=function(){return u[o+"FullYear"]()},m=function(){return c[o+"Date"]()},S=function(){return c[o+"Month"]()},v=function(){return c[o+"FullYear"]()},y=function(){return d[o+"Date"]()},g=function(){return d[o+"Month"]()},b=function(){return d[o+"FullYear"]()};return p()===n&&h()===r&&f()===i?l?"Tdy":"Today":v()===n&&S()===r&&m()===i?l?"Ysd":"Yesterday":b()===n&&g()===r&&y()===i?l?"Tmw":"Tomorrow":s},f3e=function(t){var n=new Date(t.getFullYear(),t.getMonth(),t.getDate());n.setDate(n.getDate()-(n.getDay()+6)%7+3);var r=new Date(n.getFullYear(),0,4);r.setDate(r.getDate()-(r.getDay()+6)%7+3);var i=n.getTimezoneOffset()-r.getTimezoneOffset();n.setHours(n.getHours()-i);var o=(n-r)/(864e5*7);return 1+Math.floor(o)},h3e=function(t){var n=t.getDay();return n===0&&(n=7),n},p3e=function(t){return(String(t).match(u3e)||[""]).pop().replace(c3e,"").replace(/GMT\+0000/g,"UTC")};const Wi=()=>d3e(new Date,"isoDateTime"),g3e=e=>{const{socket:t,storeApi:n,log:r}=e,{dispatch:i,getState:o}=n;t.on("connect",()=>{r.debug("Connected"),i(RL({timestamp:Wi()}));const{sessionId:s}=o().system;s&&(t.emit("subscribe",{session:s}),i(S3({sessionId:s,timestamp:Wi(),boardId:o().boards.selectedBoardId})))}),t.on("connect_error",s=>{s&&s.message&&s.data==="ERR_UNAUTHENTICATED"&&i(qt(oo({title:s.message,status:"error",duration:1e4})))}),t.on("disconnect",()=>{i(NL({timestamp:Wi()}))}),t.on("invocation_started",s=>{i(FL({data:s,timestamp:Wi()}))}),t.on("generator_progress",s=>{i(GL({data:s,timestamp:Wi()}))}),t.on("invocation_error",s=>{i(VL({data:s,timestamp:Wi()}))}),t.on("invocation_complete",s=>{i(_3({data:s,timestamp:Wi()}))}),t.on("graph_execution_state_complete",s=>{i(zL({data:s,timestamp:Wi()}))})},m3e=we.child({namespace:"socketio"}),Lk=()=>{let e=!1,t=`ws://${window.location.host}`;const n={timeout:6e4,path:"/ws/socket.io",autoConnect:!1};if(["nodes","package"].includes("production")){const o=th.get();o&&(t=o.replace(/^https?\:\/\//i,""));const s=eh.get();s&&(n.auth={token:s}),n.transports=["websocket","polling"]}const r=Im(t,n);return o=>s=>a=>{const{dispatch:l,getState:u}=o;if(e||(g3e({storeApi:o,socket:r,log:m3e}),e=!0,r.connect()),ar.fulfilled.match(a)){const c=a.payload.id,d=u().system.sessionId;d&&(r.emit("unsubscribe",{session:d}),l(LL({sessionId:d,timestamp:Wi()}))),r.emit("subscribe",{session:c}),l(S3({sessionId:c,timestamp:Wi(),boardId:u().gallery.selectedBoardId}))}s(a)}};function _9e(){for(var e=arguments.length,t=new Array(e),n=0;nr=>{t.forEach(i=>i(r))},t)}const bb=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function sd(e){const t=Object.prototype.toString.call(e);return t==="[object Window]"||t==="[object global]"}function c4(e){return"nodeType"in e}function fr(e){var t,n;return e?sd(e)?e:c4(e)&&(t=(n=e.ownerDocument)==null?void 0:n.defaultView)!=null?t:window:window}function d4(e){const{Document:t}=fr(e);return e instanceof t}function Fp(e){return sd(e)?!1:e instanceof fr(e).HTMLElement}function y3e(e){return e instanceof fr(e).SVGElement}function ad(e){return e?sd(e)?e.document:c4(e)?d4(e)?e:Fp(e)?e.ownerDocument:document:document:document}const So=bb?E.useLayoutEffect:E.useEffect;function Sb(e){const t=E.useRef(e);return So(()=>{t.current=e}),E.useCallback(function(){for(var n=arguments.length,r=new Array(n),i=0;i{e.current=setInterval(r,i)},[]),n=E.useCallback(()=>{e.current!==null&&(clearInterval(e.current),e.current=null)},[]);return[t,n]}function jh(e,t){t===void 0&&(t=[e]);const n=E.useRef(e);return So(()=>{n.current!==e&&(n.current=e)},t),n}function Bp(e,t){const n=E.useRef();return E.useMemo(()=>{const r=e(n.current);return n.current=r,r},[...t])}function S0(e){const t=Sb(e),n=E.useRef(null),r=E.useCallback(i=>{i!==n.current&&(t==null||t(i,n.current)),n.current=i},[]);return[n,r]}function _0(e){const t=E.useRef();return E.useEffect(()=>{t.current=e},[e]),t.current}let L2={};function _b(e,t){return E.useMemo(()=>{if(t)return t;const n=L2[e]==null?0:L2[e]+1;return L2[e]=n,e+"-"+n},[e,t])}function rj(e){return function(t){for(var n=arguments.length,r=new Array(n>1?n-1:0),i=1;i{const a=Object.entries(s);for(const[l,u]of a){const c=o[l];c!=null&&(o[l]=c+e*u)}return o},{...t})}}const lc=rj(1),w0=rj(-1);function b3e(e){return"clientX"in e&&"clientY"in e}function f4(e){if(!e)return!1;const{KeyboardEvent:t}=fr(e.target);return t&&e instanceof t}function S3e(e){if(!e)return!1;const{TouchEvent:t}=fr(e.target);return t&&e instanceof t}function Vh(e){if(S3e(e)){if(e.touches&&e.touches.length){const{clientX:t,clientY:n}=e.touches[0];return{x:t,y:n}}else if(e.changedTouches&&e.changedTouches.length){const{clientX:t,clientY:n}=e.changedTouches[0];return{x:t,y:n}}}return b3e(e)?{x:e.clientX,y:e.clientY}:null}const zh=Object.freeze({Translate:{toString(e){if(!e)return;const{x:t,y:n}=e;return"translate3d("+(t?Math.round(t):0)+"px, "+(n?Math.round(n):0)+"px, 0)"}},Scale:{toString(e){if(!e)return;const{scaleX:t,scaleY:n}=e;return"scaleX("+t+") scaleY("+n+")"}},Transform:{toString(e){if(e)return[zh.Translate.toString(e),zh.Scale.toString(e)].join(" ")}},Transition:{toString(e){let{property:t,duration:n,easing:r}=e;return t+" "+n+"ms "+r}}}),$k="a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]";function _3e(e){return e.matches($k)?e:e.querySelector($k)}const w3e={display:"none"};function x3e(e){let{id:t,value:n}=e;return Ve.createElement("div",{id:t,style:w3e},n)}const C3e={position:"fixed",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0 0 0 0)",clipPath:"inset(100%)",whiteSpace:"nowrap"};function T3e(e){let{id:t,announcement:n}=e;return Ve.createElement("div",{id:t,style:C3e,role:"status","aria-live":"assertive","aria-atomic":!0},n)}function E3e(){const[e,t]=E.useState("");return{announce:E.useCallback(r=>{r!=null&&t(r)},[]),announcement:e}}const ij=E.createContext(null);function P3e(e){const t=E.useContext(ij);E.useEffect(()=>{if(!t)throw new Error("useDndMonitor must be used within a children of ");return t(e)},[e,t])}function k3e(){const[e]=E.useState(()=>new Set),t=E.useCallback(r=>(e.add(r),()=>e.delete(r)),[e]);return[E.useCallback(r=>{let{type:i,event:o}=r;e.forEach(s=>{var a;return(a=s[i])==null?void 0:a.call(s,o)})},[e]),t]}const A3e={draggable:` + To pick up a draggable item, press the space bar. + While dragging, use the arrow keys to move the item. + Press space again to drop the item in its new position, or press escape to cancel. + `},O3e={onDragStart(e){let{active:t}=e;return"Picked up draggable item "+t.id+"."},onDragOver(e){let{active:t,over:n}=e;return n?"Draggable item "+t.id+" was moved over droppable area "+n.id+".":"Draggable item "+t.id+" is no longer over a droppable area."},onDragEnd(e){let{active:t,over:n}=e;return n?"Draggable item "+t.id+" was dropped over droppable area "+n.id:"Draggable item "+t.id+" was dropped."},onDragCancel(e){let{active:t}=e;return"Dragging was cancelled. Draggable item "+t.id+" was dropped."}};function R3e(e){let{announcements:t=O3e,container:n,hiddenTextDescribedById:r,screenReaderInstructions:i=A3e}=e;const{announce:o,announcement:s}=E3e(),a=_b("DndLiveRegion"),[l,u]=E.useState(!1);if(E.useEffect(()=>{u(!0)},[]),P3e(E.useMemo(()=>({onDragStart(d){let{active:f}=d;o(t.onDragStart({active:f}))},onDragMove(d){let{active:f,over:h}=d;t.onDragMove&&o(t.onDragMove({active:f,over:h}))},onDragOver(d){let{active:f,over:h}=d;o(t.onDragOver({active:f,over:h}))},onDragEnd(d){let{active:f,over:h}=d;o(t.onDragEnd({active:f,over:h}))},onDragCancel(d){let{active:f,over:h}=d;o(t.onDragCancel({active:f,over:h}))}}),[o,t])),!l)return null;const c=Ve.createElement(Ve.Fragment,null,Ve.createElement(x3e,{id:r,value:i.draggable}),Ve.createElement(T3e,{id:a,announcement:s}));return n?ii.createPortal(c,n):c}var cn;(function(e){e.DragStart="dragStart",e.DragMove="dragMove",e.DragEnd="dragEnd",e.DragCancel="dragCancel",e.DragOver="dragOver",e.RegisterDroppable="registerDroppable",e.SetDroppableDisabled="setDroppableDisabled",e.UnregisterDroppable="unregisterDroppable"})(cn||(cn={}));function x0(){}function Fk(e,t){return E.useMemo(()=>({sensor:e,options:t??{}}),[e,t])}function I3e(){for(var e=arguments.length,t=new Array(e),n=0;n[...t].filter(r=>r!=null),[...t])}const Fi=Object.freeze({x:0,y:0});function N3e(e,t){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function M3e(e,t){const n=Vh(e);if(!n)return"0 0";const r={x:(n.x-t.left)/t.width*100,y:(n.y-t.top)/t.height*100};return r.x+"% "+r.y+"%"}function D3e(e,t){let{data:{value:n}}=e,{data:{value:r}}=t;return n-r}function L3e(e,t){let{data:{value:n}}=e,{data:{value:r}}=t;return r-n}function $3e(e){let{left:t,top:n,height:r,width:i}=e;return[{x:t,y:n},{x:t+i,y:n},{x:t,y:n+r},{x:t+i,y:n+r}]}function F3e(e,t){if(!e||e.length===0)return null;const[n]=e;return t?n[t]:n}function B3e(e,t){const n=Math.max(t.top,e.top),r=Math.max(t.left,e.left),i=Math.min(t.left+t.width,e.left+e.width),o=Math.min(t.top+t.height,e.top+e.height),s=i-r,a=o-n;if(r{let{collisionRect:t,droppableRects:n,droppableContainers:r}=e;const i=[];for(const o of r){const{id:s}=o,a=n.get(s);if(a){const l=B3e(a,t);l>0&&i.push({id:s,data:{droppableContainer:o,value:l}})}}return i.sort(L3e)};function V3e(e,t){const{top:n,left:r,bottom:i,right:o}=t;return n<=e.y&&e.y<=i&&r<=e.x&&e.x<=o}const z3e=e=>{let{droppableContainers:t,droppableRects:n,pointerCoordinates:r}=e;if(!r)return[];const i=[];for(const o of t){const{id:s}=o,a=n.get(s);if(a&&V3e(r,a)){const u=$3e(a).reduce((d,f)=>d+N3e(r,f),0),c=Number((u/4).toFixed(4));i.push({id:s,data:{droppableContainer:o,value:c}})}}return i.sort(D3e)};function U3e(e,t,n){return{...e,scaleX:t&&n?t.width/n.width:1,scaleY:t&&n?t.height/n.height:1}}function oj(e,t){return e&&t?{x:e.left-t.left,y:e.top-t.top}:Fi}function G3e(e){return function(n){for(var r=arguments.length,i=new Array(r>1?r-1:0),o=1;o({...s,top:s.top+e*a.y,bottom:s.bottom+e*a.y,left:s.left+e*a.x,right:s.right+e*a.x}),{...n})}}const H3e=G3e(1);function sj(e){if(e.startsWith("matrix3d(")){const t=e.slice(9,-1).split(/, /);return{x:+t[12],y:+t[13],scaleX:+t[0],scaleY:+t[5]}}else if(e.startsWith("matrix(")){const t=e.slice(7,-1).split(/, /);return{x:+t[4],y:+t[5],scaleX:+t[0],scaleY:+t[3]}}return null}function W3e(e,t,n){const r=sj(t);if(!r)return e;const{scaleX:i,scaleY:o,x:s,y:a}=r,l=e.left-s-(1-i)*parseFloat(n),u=e.top-a-(1-o)*parseFloat(n.slice(n.indexOf(" ")+1)),c=i?e.width/i:e.width,d=o?e.height/o:e.height;return{width:c,height:d,top:u,right:l+c,bottom:u+d,left:l}}const q3e={ignoreTransform:!1};function jp(e,t){t===void 0&&(t=q3e);let n=e.getBoundingClientRect();if(t.ignoreTransform){const{transform:u,transformOrigin:c}=fr(e).getComputedStyle(e);u&&(n=W3e(n,u,c))}const{top:r,left:i,width:o,height:s,bottom:a,right:l}=n;return{top:r,left:i,width:o,height:s,bottom:a,right:l}}function Bk(e){return jp(e,{ignoreTransform:!0})}function K3e(e){const t=e.innerWidth,n=e.innerHeight;return{top:0,left:0,right:t,bottom:n,width:t,height:n}}function Y3e(e,t){return t===void 0&&(t=fr(e).getComputedStyle(e)),t.position==="fixed"}function X3e(e,t){t===void 0&&(t=fr(e).getComputedStyle(e));const n=/(auto|scroll|overlay)/;return["overflow","overflowX","overflowY"].some(i=>{const o=t[i];return typeof o=="string"?n.test(o):!1})}function h4(e,t){const n=[];function r(i){if(t!=null&&n.length>=t||!i)return n;if(d4(i)&&i.scrollingElement!=null&&!n.includes(i.scrollingElement))return n.push(i.scrollingElement),n;if(!Fp(i)||y3e(i)||n.includes(i))return n;const o=fr(e).getComputedStyle(i);return i!==e&&X3e(i,o)&&n.push(i),Y3e(i,o)?n:r(i.parentNode)}return e?r(e):n}function aj(e){const[t]=h4(e,1);return t??null}function $2(e){return!bb||!e?null:sd(e)?e:c4(e)?d4(e)||e===ad(e).scrollingElement?window:Fp(e)?e:null:null}function lj(e){return sd(e)?e.scrollX:e.scrollLeft}function uj(e){return sd(e)?e.scrollY:e.scrollTop}function Mx(e){return{x:lj(e),y:uj(e)}}var Cn;(function(e){e[e.Forward=1]="Forward",e[e.Backward=-1]="Backward"})(Cn||(Cn={}));function cj(e){return!bb||!e?!1:e===document.scrollingElement}function dj(e){const t={x:0,y:0},n=cj(e)?{height:window.innerHeight,width:window.innerWidth}:{height:e.clientHeight,width:e.clientWidth},r={x:e.scrollWidth-n.width,y:e.scrollHeight-n.height},i=e.scrollTop<=t.y,o=e.scrollLeft<=t.x,s=e.scrollTop>=r.y,a=e.scrollLeft>=r.x;return{isTop:i,isLeft:o,isBottom:s,isRight:a,maxScroll:r,minScroll:t}}const Q3e={x:.2,y:.2};function Z3e(e,t,n,r,i){let{top:o,left:s,right:a,bottom:l}=n;r===void 0&&(r=10),i===void 0&&(i=Q3e);const{isTop:u,isBottom:c,isLeft:d,isRight:f}=dj(e),h={x:0,y:0},p={x:0,y:0},m={height:t.height*i.y,width:t.width*i.x};return!u&&o<=t.top+m.height?(h.y=Cn.Backward,p.y=r*Math.abs((t.top+m.height-o)/m.height)):!c&&l>=t.bottom-m.height&&(h.y=Cn.Forward,p.y=r*Math.abs((t.bottom-m.height-l)/m.height)),!f&&a>=t.right-m.width?(h.x=Cn.Forward,p.x=r*Math.abs((t.right-m.width-a)/m.width)):!d&&s<=t.left+m.width&&(h.x=Cn.Backward,p.x=r*Math.abs((t.left+m.width-s)/m.width)),{direction:h,speed:p}}function J3e(e){if(e===document.scrollingElement){const{innerWidth:o,innerHeight:s}=window;return{top:0,left:0,right:o,bottom:s,width:o,height:s}}const{top:t,left:n,right:r,bottom:i}=e.getBoundingClientRect();return{top:t,left:n,right:r,bottom:i,width:e.clientWidth,height:e.clientHeight}}function fj(e){return e.reduce((t,n)=>lc(t,Mx(n)),Fi)}function e4e(e){return e.reduce((t,n)=>t+lj(n),0)}function t4e(e){return e.reduce((t,n)=>t+uj(n),0)}function hj(e,t){if(t===void 0&&(t=jp),!e)return;const{top:n,left:r,bottom:i,right:o}=t(e);aj(e)&&(i<=0||o<=0||n>=window.innerHeight||r>=window.innerWidth)&&e.scrollIntoView({block:"center",inline:"center"})}const n4e=[["x",["left","right"],e4e],["y",["top","bottom"],t4e]];class p4{constructor(t,n){this.rect=void 0,this.width=void 0,this.height=void 0,this.top=void 0,this.bottom=void 0,this.right=void 0,this.left=void 0;const r=h4(n),i=fj(r);this.rect={...t},this.width=t.width,this.height=t.height;for(const[o,s,a]of n4e)for(const l of s)Object.defineProperty(this,l,{get:()=>{const u=a(r),c=i[o]-u;return this.rect[l]+c},enumerable:!0});Object.defineProperty(this,"rect",{enumerable:!1})}}class Sf{constructor(t){this.target=void 0,this.listeners=[],this.removeAll=()=>{this.listeners.forEach(n=>{var r;return(r=this.target)==null?void 0:r.removeEventListener(...n)})},this.target=t}add(t,n,r){var i;(i=this.target)==null||i.addEventListener(t,n,r),this.listeners.push([t,n,r])}}function r4e(e){const{EventTarget:t}=fr(e);return e instanceof t?e:ad(e)}function F2(e,t){const n=Math.abs(e.x),r=Math.abs(e.y);return typeof t=="number"?Math.sqrt(n**2+r**2)>t:"x"in t&&"y"in t?n>t.x&&r>t.y:"x"in t?n>t.x:"y"in t?r>t.y:!1}var ei;(function(e){e.Click="click",e.DragStart="dragstart",e.Keydown="keydown",e.ContextMenu="contextmenu",e.Resize="resize",e.SelectionChange="selectionchange",e.VisibilityChange="visibilitychange"})(ei||(ei={}));function jk(e){e.preventDefault()}function i4e(e){e.stopPropagation()}var pt;(function(e){e.Space="Space",e.Down="ArrowDown",e.Right="ArrowRight",e.Left="ArrowLeft",e.Up="ArrowUp",e.Esc="Escape",e.Enter="Enter"})(pt||(pt={}));const pj={start:[pt.Space,pt.Enter],cancel:[pt.Esc],end:[pt.Space,pt.Enter]},o4e=(e,t)=>{let{currentCoordinates:n}=t;switch(e.code){case pt.Right:return{...n,x:n.x+25};case pt.Left:return{...n,x:n.x-25};case pt.Down:return{...n,y:n.y+25};case pt.Up:return{...n,y:n.y-25}}};class gj{constructor(t){this.props=void 0,this.autoScrollEnabled=!1,this.referenceCoordinates=void 0,this.listeners=void 0,this.windowListeners=void 0,this.props=t;const{event:{target:n}}=t;this.props=t,this.listeners=new Sf(ad(n)),this.windowListeners=new Sf(fr(n)),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleCancel=this.handleCancel.bind(this),this.attach()}attach(){this.handleStart(),this.windowListeners.add(ei.Resize,this.handleCancel),this.windowListeners.add(ei.VisibilityChange,this.handleCancel),setTimeout(()=>this.listeners.add(ei.Keydown,this.handleKeyDown))}handleStart(){const{activeNode:t,onStart:n}=this.props,r=t.node.current;r&&hj(r),n(Fi)}handleKeyDown(t){if(f4(t)){const{active:n,context:r,options:i}=this.props,{keyboardCodes:o=pj,coordinateGetter:s=o4e,scrollBehavior:a="smooth"}=i,{code:l}=t;if(o.end.includes(l)){this.handleEnd(t);return}if(o.cancel.includes(l)){this.handleCancel(t);return}const{collisionRect:u}=r.current,c=u?{x:u.left,y:u.top}:Fi;this.referenceCoordinates||(this.referenceCoordinates=c);const d=s(t,{active:n,context:r.current,currentCoordinates:c});if(d){const f=w0(d,c),h={x:0,y:0},{scrollableAncestors:p}=r.current;for(const m of p){const S=t.code,{isTop:v,isRight:y,isLeft:g,isBottom:b,maxScroll:_,minScroll:w}=dj(m),x=J3e(m),C={x:Math.min(S===pt.Right?x.right-x.width/2:x.right,Math.max(S===pt.Right?x.left:x.left+x.width/2,d.x)),y:Math.min(S===pt.Down?x.bottom-x.height/2:x.bottom,Math.max(S===pt.Down?x.top:x.top+x.height/2,d.y))},k=S===pt.Right&&!y||S===pt.Left&&!g,P=S===pt.Down&&!b||S===pt.Up&&!v;if(k&&C.x!==d.x){const A=m.scrollLeft+f.x,$=S===pt.Right&&A<=_.x||S===pt.Left&&A>=w.x;if($&&!f.y){m.scrollTo({left:A,behavior:a});return}$?h.x=m.scrollLeft-A:h.x=S===pt.Right?m.scrollLeft-_.x:m.scrollLeft-w.x,h.x&&m.scrollBy({left:-h.x,behavior:a});break}else if(P&&C.y!==d.y){const A=m.scrollTop+f.y,$=S===pt.Down&&A<=_.y||S===pt.Up&&A>=w.y;if($&&!f.x){m.scrollTo({top:A,behavior:a});return}$?h.y=m.scrollTop-A:h.y=S===pt.Down?m.scrollTop-_.y:m.scrollTop-w.y,h.y&&m.scrollBy({top:-h.y,behavior:a});break}}this.handleMove(t,lc(w0(d,this.referenceCoordinates),h))}}}handleMove(t,n){const{onMove:r}=this.props;t.preventDefault(),r(n)}handleEnd(t){const{onEnd:n}=this.props;t.preventDefault(),this.detach(),n()}handleCancel(t){const{onCancel:n}=this.props;t.preventDefault(),this.detach(),n()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll()}}gj.activators=[{eventName:"onKeyDown",handler:(e,t,n)=>{let{keyboardCodes:r=pj,onActivation:i}=t,{active:o}=n;const{code:s}=e.nativeEvent;if(r.start.includes(s)){const a=o.activatorNode.current;return a&&e.target!==a?!1:(e.preventDefault(),i==null||i({event:e.nativeEvent}),!0)}return!1}}];function Vk(e){return!!(e&&"distance"in e)}function zk(e){return!!(e&&"delay"in e)}class g4{constructor(t,n,r){var i;r===void 0&&(r=r4e(t.event.target)),this.props=void 0,this.events=void 0,this.autoScrollEnabled=!0,this.document=void 0,this.activated=!1,this.initialCoordinates=void 0,this.timeoutId=null,this.listeners=void 0,this.documentListeners=void 0,this.windowListeners=void 0,this.props=t,this.events=n;const{event:o}=t,{target:s}=o;this.props=t,this.events=n,this.document=ad(s),this.documentListeners=new Sf(this.document),this.listeners=new Sf(r),this.windowListeners=new Sf(fr(s)),this.initialCoordinates=(i=Vh(o))!=null?i:Fi,this.handleStart=this.handleStart.bind(this),this.handleMove=this.handleMove.bind(this),this.handleEnd=this.handleEnd.bind(this),this.handleCancel=this.handleCancel.bind(this),this.handleKeydown=this.handleKeydown.bind(this),this.removeTextSelection=this.removeTextSelection.bind(this),this.attach()}attach(){const{events:t,props:{options:{activationConstraint:n}}}=this;if(this.listeners.add(t.move.name,this.handleMove,{passive:!1}),this.listeners.add(t.end.name,this.handleEnd),this.windowListeners.add(ei.Resize,this.handleCancel),this.windowListeners.add(ei.DragStart,jk),this.windowListeners.add(ei.VisibilityChange,this.handleCancel),this.windowListeners.add(ei.ContextMenu,jk),this.documentListeners.add(ei.Keydown,this.handleKeydown),n){if(Vk(n))return;if(zk(n)){this.timeoutId=setTimeout(this.handleStart,n.delay);return}}this.handleStart()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll(),setTimeout(this.documentListeners.removeAll,50),this.timeoutId!==null&&(clearTimeout(this.timeoutId),this.timeoutId=null)}handleStart(){const{initialCoordinates:t}=this,{onStart:n}=this.props;t&&(this.activated=!0,this.documentListeners.add(ei.Click,i4e,{capture:!0}),this.removeTextSelection(),this.documentListeners.add(ei.SelectionChange,this.removeTextSelection),n(t))}handleMove(t){var n;const{activated:r,initialCoordinates:i,props:o}=this,{onMove:s,options:{activationConstraint:a}}=o;if(!i)return;const l=(n=Vh(t))!=null?n:Fi,u=w0(i,l);if(!r&&a){if(zk(a))return F2(u,a.tolerance)?this.handleCancel():void 0;if(Vk(a))return a.tolerance!=null&&F2(u,a.tolerance)?this.handleCancel():F2(u,a.distance)?this.handleStart():void 0}t.cancelable&&t.preventDefault(),s(l)}handleEnd(){const{onEnd:t}=this.props;this.detach(),t()}handleCancel(){const{onCancel:t}=this.props;this.detach(),t()}handleKeydown(t){t.code===pt.Esc&&this.handleCancel()}removeTextSelection(){var t;(t=this.document.getSelection())==null||t.removeAllRanges()}}const s4e={move:{name:"pointermove"},end:{name:"pointerup"}};class mj extends g4{constructor(t){const{event:n}=t,r=ad(n.target);super(t,s4e,r)}}mj.activators=[{eventName:"onPointerDown",handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;return!n.isPrimary||n.button!==0?!1:(r==null||r({event:n}),!0)}}];const a4e={move:{name:"mousemove"},end:{name:"mouseup"}};var Dx;(function(e){e[e.RightClick=2]="RightClick"})(Dx||(Dx={}));class yj extends g4{constructor(t){super(t,a4e,ad(t.event.target))}}yj.activators=[{eventName:"onMouseDown",handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;return n.button===Dx.RightClick?!1:(r==null||r({event:n}),!0)}}];const B2={move:{name:"touchmove"},end:{name:"touchend"}};class vj extends g4{constructor(t){super(t,B2)}static setup(){return window.addEventListener(B2.move.name,t,{capture:!1,passive:!1}),function(){window.removeEventListener(B2.move.name,t)};function t(){}}}vj.activators=[{eventName:"onTouchStart",handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;const{touches:i}=n;return i.length>1?!1:(r==null||r({event:n}),!0)}}];var _f;(function(e){e[e.Pointer=0]="Pointer",e[e.DraggableRect=1]="DraggableRect"})(_f||(_f={}));var C0;(function(e){e[e.TreeOrder=0]="TreeOrder",e[e.ReversedTreeOrder=1]="ReversedTreeOrder"})(C0||(C0={}));function l4e(e){let{acceleration:t,activator:n=_f.Pointer,canScroll:r,draggingRect:i,enabled:o,interval:s=5,order:a=C0.TreeOrder,pointerCoordinates:l,scrollableAncestors:u,scrollableAncestorRects:c,delta:d,threshold:f}=e;const h=c4e({delta:d,disabled:!o}),[p,m]=v3e(),S=E.useRef({x:0,y:0}),v=E.useRef({x:0,y:0}),y=E.useMemo(()=>{switch(n){case _f.Pointer:return l?{top:l.y,bottom:l.y,left:l.x,right:l.x}:null;case _f.DraggableRect:return i}},[n,i,l]),g=E.useRef(null),b=E.useCallback(()=>{const w=g.current;if(!w)return;const x=S.current.x*v.current.x,C=S.current.y*v.current.y;w.scrollBy(x,C)},[]),_=E.useMemo(()=>a===C0.TreeOrder?[...u].reverse():u,[a,u]);E.useEffect(()=>{if(!o||!u.length||!y){m();return}for(const w of _){if((r==null?void 0:r(w))===!1)continue;const x=u.indexOf(w),C=c[x];if(!C)continue;const{direction:k,speed:P}=Z3e(w,C,y,t,f);for(const A of["x","y"])h[A][k[A]]||(P[A]=0,k[A]=0);if(P.x>0||P.y>0){m(),g.current=w,p(b,s),S.current=P,v.current=k;return}}S.current={x:0,y:0},v.current={x:0,y:0},m()},[t,b,r,m,o,s,JSON.stringify(y),JSON.stringify(h),p,u,_,c,JSON.stringify(f)])}const u4e={x:{[Cn.Backward]:!1,[Cn.Forward]:!1},y:{[Cn.Backward]:!1,[Cn.Forward]:!1}};function c4e(e){let{delta:t,disabled:n}=e;const r=_0(t);return Bp(i=>{if(n||!r||!i)return u4e;const o={x:Math.sign(t.x-r.x),y:Math.sign(t.y-r.y)};return{x:{[Cn.Backward]:i.x[Cn.Backward]||o.x===-1,[Cn.Forward]:i.x[Cn.Forward]||o.x===1},y:{[Cn.Backward]:i.y[Cn.Backward]||o.y===-1,[Cn.Forward]:i.y[Cn.Forward]||o.y===1}}},[n,t,r])}function d4e(e,t){const n=t!==null?e.get(t):void 0,r=n?n.node.current:null;return Bp(i=>{var o;return t===null?null:(o=r??i)!=null?o:null},[r,t])}function f4e(e,t){return E.useMemo(()=>e.reduce((n,r)=>{const{sensor:i}=r,o=i.activators.map(s=>({eventName:s.eventName,handler:t(s.handler,r)}));return[...n,...o]},[]),[e,t])}var Uh;(function(e){e[e.Always=0]="Always",e[e.BeforeDragging=1]="BeforeDragging",e[e.WhileDragging=2]="WhileDragging"})(Uh||(Uh={}));var Lx;(function(e){e.Optimized="optimized"})(Lx||(Lx={}));const Uk=new Map;function h4e(e,t){let{dragging:n,dependencies:r,config:i}=t;const[o,s]=E.useState(null),{frequency:a,measure:l,strategy:u}=i,c=E.useRef(e),d=S(),f=jh(d),h=E.useCallback(function(v){v===void 0&&(v=[]),!f.current&&s(y=>y===null?v:y.concat(v.filter(g=>!y.includes(g))))},[f]),p=E.useRef(null),m=Bp(v=>{if(d&&!n)return Uk;if(!v||v===Uk||c.current!==e||o!=null){const y=new Map;for(let g of e){if(!g)continue;if(o&&o.length>0&&!o.includes(g.id)&&g.rect.current){y.set(g.id,g.rect.current);continue}const b=g.node.current,_=b?new p4(l(b),b):null;g.rect.current=_,_&&y.set(g.id,_)}return y}return v},[e,o,n,d,l]);return E.useEffect(()=>{c.current=e},[e]),E.useEffect(()=>{d||h()},[n,d]),E.useEffect(()=>{o&&o.length>0&&s(null)},[JSON.stringify(o)]),E.useEffect(()=>{d||typeof a!="number"||p.current!==null||(p.current=setTimeout(()=>{h(),p.current=null},a))},[a,d,h,...r]),{droppableRects:m,measureDroppableContainers:h,measuringScheduled:o!=null};function S(){switch(u){case Uh.Always:return!1;case Uh.BeforeDragging:return n;default:return!n}}}function m4(e,t){return Bp(n=>e?n||(typeof t=="function"?t(e):e):null,[t,e])}function p4e(e,t){return m4(e,t)}function g4e(e){let{callback:t,disabled:n}=e;const r=Sb(t),i=E.useMemo(()=>{if(n||typeof window>"u"||typeof window.MutationObserver>"u")return;const{MutationObserver:o}=window;return new o(r)},[r,n]);return E.useEffect(()=>()=>i==null?void 0:i.disconnect(),[i]),i}function wb(e){let{callback:t,disabled:n}=e;const r=Sb(t),i=E.useMemo(()=>{if(n||typeof window>"u"||typeof window.ResizeObserver>"u")return;const{ResizeObserver:o}=window;return new o(r)},[n]);return E.useEffect(()=>()=>i==null?void 0:i.disconnect(),[i]),i}function m4e(e){return new p4(jp(e),e)}function Gk(e,t,n){t===void 0&&(t=m4e);const[r,i]=E.useReducer(a,null),o=g4e({callback(l){if(e)for(const u of l){const{type:c,target:d}=u;if(c==="childList"&&d instanceof HTMLElement&&d.contains(e)){i();break}}}}),s=wb({callback:i});return So(()=>{i(),e?(s==null||s.observe(e),o==null||o.observe(document.body,{childList:!0,subtree:!0})):(s==null||s.disconnect(),o==null||o.disconnect())},[e]),r;function a(l){if(!e)return null;if(e.isConnected===!1){var u;return(u=l??n)!=null?u:null}const c=t(e);return JSON.stringify(l)===JSON.stringify(c)?l:c}}function y4e(e){const t=m4(e);return oj(e,t)}const Hk=[];function v4e(e){const t=E.useRef(e),n=Bp(r=>e?r&&r!==Hk&&e&&t.current&&e.parentNode===t.current.parentNode?r:h4(e):Hk,[e]);return E.useEffect(()=>{t.current=e},[e]),n}function b4e(e){const[t,n]=E.useState(null),r=E.useRef(e),i=E.useCallback(o=>{const s=$2(o.target);s&&n(a=>a?(a.set(s,Mx(s)),new Map(a)):null)},[]);return E.useEffect(()=>{const o=r.current;if(e!==o){s(o);const a=e.map(l=>{const u=$2(l);return u?(u.addEventListener("scroll",i,{passive:!0}),[u,Mx(u)]):null}).filter(l=>l!=null);n(a.length?new Map(a):null),r.current=e}return()=>{s(e),s(o)};function s(a){a.forEach(l=>{const u=$2(l);u==null||u.removeEventListener("scroll",i)})}},[i,e]),E.useMemo(()=>e.length?t?Array.from(t.values()).reduce((o,s)=>lc(o,s),Fi):fj(e):Fi,[e,t])}function Wk(e,t){t===void 0&&(t=[]);const n=E.useRef(null);return E.useEffect(()=>{n.current=null},t),E.useEffect(()=>{const r=e!==Fi;r&&!n.current&&(n.current=e),!r&&n.current&&(n.current=null)},[e]),n.current?w0(e,n.current):Fi}function S4e(e){E.useEffect(()=>{if(!bb)return;const t=e.map(n=>{let{sensor:r}=n;return r.setup==null?void 0:r.setup()});return()=>{for(const n of t)n==null||n()}},e.map(t=>{let{sensor:n}=t;return n}))}function _4e(e,t){return E.useMemo(()=>e.reduce((n,r)=>{let{eventName:i,handler:o}=r;return n[i]=s=>{o(s,t)},n},{}),[e,t])}function bj(e){return E.useMemo(()=>e?K3e(e):null,[e])}const j2=[];function w4e(e,t){t===void 0&&(t=jp);const[n]=e,r=bj(n?fr(n):null),[i,o]=E.useReducer(a,j2),s=wb({callback:o});return e.length>0&&i===j2&&o(),So(()=>{e.length?e.forEach(l=>s==null?void 0:s.observe(l)):(s==null||s.disconnect(),o())},[e]),i;function a(){return e.length?e.map(l=>cj(l)?r:new p4(t(l),l)):j2}}function Sj(e){if(!e)return null;if(e.children.length>1)return e;const t=e.children[0];return Fp(t)?t:e}function x4e(e){let{measure:t}=e;const[n,r]=E.useState(null),i=E.useCallback(u=>{for(const{target:c}of u)if(Fp(c)){r(d=>{const f=t(c);return d?{...d,width:f.width,height:f.height}:f});break}},[t]),o=wb({callback:i}),s=E.useCallback(u=>{const c=Sj(u);o==null||o.disconnect(),c&&(o==null||o.observe(c)),r(c?t(c):null)},[t,o]),[a,l]=S0(s);return E.useMemo(()=>({nodeRef:a,rect:n,setRef:l}),[n,a,l])}const C4e=[{sensor:mj,options:{}},{sensor:gj,options:{}}],T4e={current:{}},Nm={draggable:{measure:Bk},droppable:{measure:Bk,strategy:Uh.WhileDragging,frequency:Lx.Optimized},dragOverlay:{measure:jp}};class wf extends Map{get(t){var n;return t!=null&&(n=super.get(t))!=null?n:void 0}toArray(){return Array.from(this.values())}getEnabled(){return this.toArray().filter(t=>{let{disabled:n}=t;return!n})}getNodeFor(t){var n,r;return(n=(r=this.get(t))==null?void 0:r.node.current)!=null?n:void 0}}const E4e={activatorEvent:null,active:null,activeNode:null,activeNodeRect:null,collisions:null,containerNodeRect:null,draggableNodes:new Map,droppableRects:new Map,droppableContainers:new wf,over:null,dragOverlay:{nodeRef:{current:null},rect:null,setRef:x0},scrollableAncestors:[],scrollableAncestorRects:[],measuringConfiguration:Nm,measureDroppableContainers:x0,windowRect:null,measuringScheduled:!1},_j={activatorEvent:null,activators:[],active:null,activeNodeRect:null,ariaDescribedById:{draggable:""},dispatch:x0,draggableNodes:new Map,over:null,measureDroppableContainers:x0},Vp=E.createContext(_j),wj=E.createContext(E4e);function P4e(){return{draggable:{active:null,initialCoordinates:{x:0,y:0},nodes:new Map,translate:{x:0,y:0}},droppable:{containers:new wf}}}function k4e(e,t){switch(t.type){case cn.DragStart:return{...e,draggable:{...e.draggable,initialCoordinates:t.initialCoordinates,active:t.active}};case cn.DragMove:return e.draggable.active?{...e,draggable:{...e.draggable,translate:{x:t.coordinates.x-e.draggable.initialCoordinates.x,y:t.coordinates.y-e.draggable.initialCoordinates.y}}}:e;case cn.DragEnd:case cn.DragCancel:return{...e,draggable:{...e.draggable,active:null,initialCoordinates:{x:0,y:0},translate:{x:0,y:0}}};case cn.RegisterDroppable:{const{element:n}=t,{id:r}=n,i=new wf(e.droppable.containers);return i.set(r,n),{...e,droppable:{...e.droppable,containers:i}}}case cn.SetDroppableDisabled:{const{id:n,key:r,disabled:i}=t,o=e.droppable.containers.get(n);if(!o||r!==o.key)return e;const s=new wf(e.droppable.containers);return s.set(n,{...o,disabled:i}),{...e,droppable:{...e.droppable,containers:s}}}case cn.UnregisterDroppable:{const{id:n,key:r}=t,i=e.droppable.containers.get(n);if(!i||r!==i.key)return e;const o=new wf(e.droppable.containers);return o.delete(n),{...e,droppable:{...e.droppable,containers:o}}}default:return e}}function A4e(e){let{disabled:t}=e;const{active:n,activatorEvent:r,draggableNodes:i}=E.useContext(Vp),o=_0(r),s=_0(n==null?void 0:n.id);return E.useEffect(()=>{if(!t&&!r&&o&&s!=null){if(!f4(o)||document.activeElement===o.target)return;const a=i.get(s);if(!a)return;const{activatorNode:l,node:u}=a;if(!l.current&&!u.current)return;requestAnimationFrame(()=>{for(const c of[l.current,u.current]){if(!c)continue;const d=_3e(c);if(d){d.focus();break}}})}},[r,t,i,s,o]),null}function xj(e,t){let{transform:n,...r}=t;return e!=null&&e.length?e.reduce((i,o)=>o({transform:i,...r}),n):n}function O4e(e){return E.useMemo(()=>({draggable:{...Nm.draggable,...e==null?void 0:e.draggable},droppable:{...Nm.droppable,...e==null?void 0:e.droppable},dragOverlay:{...Nm.dragOverlay,...e==null?void 0:e.dragOverlay}}),[e==null?void 0:e.draggable,e==null?void 0:e.droppable,e==null?void 0:e.dragOverlay])}function R4e(e){let{activeNode:t,measure:n,initialRect:r,config:i=!0}=e;const o=E.useRef(!1),{x:s,y:a}=typeof i=="boolean"?{x:i,y:i}:i;So(()=>{if(!s&&!a||!t){o.current=!1;return}if(o.current||!r)return;const u=t==null?void 0:t.node.current;if(!u||u.isConnected===!1)return;const c=n(u),d=oj(c,r);if(s||(d.x=0),a||(d.y=0),o.current=!0,Math.abs(d.x)>0||Math.abs(d.y)>0){const f=aj(u);f&&f.scrollBy({top:d.y,left:d.x})}},[t,s,a,r,n])}const xb=E.createContext({...Fi,scaleX:1,scaleY:1});var $s;(function(e){e[e.Uninitialized=0]="Uninitialized",e[e.Initializing=1]="Initializing",e[e.Initialized=2]="Initialized"})($s||($s={}));const I4e=E.memo(function(t){var n,r,i,o;let{id:s,accessibility:a,autoScroll:l=!0,children:u,sensors:c=C4e,collisionDetection:d=j3e,measuring:f,modifiers:h,...p}=t;const m=E.useReducer(k4e,void 0,P4e),[S,v]=m,[y,g]=k3e(),[b,_]=E.useState($s.Uninitialized),w=b===$s.Initialized,{draggable:{active:x,nodes:C,translate:k},droppable:{containers:P}}=S,A=x?C.get(x):null,$=E.useRef({initial:null,translated:null}),M=E.useMemo(()=>{var ut;return x!=null?{id:x,data:(ut=A==null?void 0:A.data)!=null?ut:T4e,rect:$}:null},[x,A]),T=E.useRef(null),[O,I]=E.useState(null),[N,R]=E.useState(null),D=jh(p,Object.values(p)),L=_b("DndDescribedBy",s),V=E.useMemo(()=>P.getEnabled(),[P]),z=O4e(f),{droppableRects:U,measureDroppableContainers:K,measuringScheduled:q}=h4e(V,{dragging:w,dependencies:[k.x,k.y],config:z.droppable}),X=d4e(C,x),F=E.useMemo(()=>N?Vh(N):null,[N]),W=Ao(),Q=p4e(X,z.draggable.measure);R4e({activeNode:x?C.get(x):null,config:W.layoutShiftCompensation,initialRect:Q,measure:z.draggable.measure});const J=Gk(X,z.draggable.measure,Q),ne=Gk(X?X.parentElement:null),Z=E.useRef({activatorEvent:null,active:null,activeNode:X,collisionRect:null,collisions:null,droppableRects:U,draggableNodes:C,draggingNode:null,draggingNodeRect:null,droppableContainers:P,over:null,scrollableAncestors:[],scrollAdjustedTranslate:null}),ge=P.getNodeFor((n=Z.current.over)==null?void 0:n.id),ae=x4e({measure:z.dragOverlay.measure}),oe=(r=ae.nodeRef.current)!=null?r:X,Ce=w?(i=ae.rect)!=null?i:J:null,se=!!(ae.nodeRef.current&&ae.rect),We=y4e(se?null:J),mt=bj(oe?fr(oe):null),$e=v4e(w?ge??X:null),Fe=w4e($e),Ie=xj(h,{transform:{x:k.x-We.x,y:k.y-We.y,scaleX:1,scaleY:1},activatorEvent:N,active:M,activeNodeRect:J,containerNodeRect:ne,draggingNodeRect:Ce,over:Z.current.over,overlayNodeRect:ae.rect,scrollableAncestors:$e,scrollableAncestorRects:Fe,windowRect:mt}),nt=F?lc(F,k):null,xt=b4e($e),vn=Wk(xt),sn=Wk(xt,[J]),Ot=lc(Ie,vn),ee=Ce?H3e(Ce,Ie):null,be=M&&ee?d({active:M,collisionRect:ee,droppableRects:U,droppableContainers:V,pointerCoordinates:nt}):null,Te=F3e(be,"id"),[Ne,ie]=E.useState(null),he=se?Ie:lc(Ie,sn),Zt=U3e(he,(o=Ne==null?void 0:Ne.rect)!=null?o:null,J),Rt=E.useCallback((ut,qe)=>{let{sensor:An,options:bn}=qe;if(T.current==null)return;const Un=C.get(T.current);if(!Un)return;const Jn=ut.nativeEvent,hr=new An({active:T.current,activeNode:Un,event:Jn,options:bn,context:Z,onStart(er){const On=T.current;if(On==null)return;const Oo=C.get(On);if(!Oo)return;const{onDragStart:Ss}=D.current,_s={active:{id:On,data:Oo.data,rect:$}};ii.unstable_batchedUpdates(()=>{Ss==null||Ss(_s),_($s.Initializing),v({type:cn.DragStart,initialCoordinates:er,active:On}),y({type:"onDragStart",event:_s})})},onMove(er){v({type:cn.DragMove,coordinates:er})},onEnd:Vi(cn.DragEnd),onCancel:Vi(cn.DragCancel)});ii.unstable_batchedUpdates(()=>{I(hr),R(ut.nativeEvent)});function Vi(er){return async function(){const{active:Oo,collisions:Ss,over:_s,scrollAdjustedTranslate:Kl}=Z.current;let Ro=null;if(Oo&&Kl){const{cancelDrop:tr}=D.current;Ro={activatorEvent:Jn,active:Oo,collisions:Ss,delta:Kl,over:_s},er===cn.DragEnd&&typeof tr=="function"&&await Promise.resolve(tr(Ro))&&(er=cn.DragCancel)}T.current=null,ii.unstable_batchedUpdates(()=>{v({type:er}),_($s.Uninitialized),ie(null),I(null),R(null);const tr=er===cn.DragEnd?"onDragEnd":"onDragCancel";if(Ro){const Ma=D.current[tr];Ma==null||Ma(Ro),y({type:tr,event:Ro})}})}}},[C]),lt=E.useCallback((ut,qe)=>(An,bn)=>{const Un=An.nativeEvent,Jn=C.get(bn);if(T.current!==null||!Jn||Un.dndKit||Un.defaultPrevented)return;const hr={active:Jn};ut(An,qe.options,hr)===!0&&(Un.dndKit={capturedBy:qe.sensor},T.current=bn,Rt(An,qe))},[C,Rt]),Zn=f4e(c,lt);S4e(c),So(()=>{J&&b===$s.Initializing&&_($s.Initialized)},[J,b]),E.useEffect(()=>{const{onDragMove:ut}=D.current,{active:qe,activatorEvent:An,collisions:bn,over:Un}=Z.current;if(!qe||!An)return;const Jn={active:qe,activatorEvent:An,collisions:bn,delta:{x:Ot.x,y:Ot.y},over:Un};ii.unstable_batchedUpdates(()=>{ut==null||ut(Jn),y({type:"onDragMove",event:Jn})})},[Ot.x,Ot.y]),E.useEffect(()=>{const{active:ut,activatorEvent:qe,collisions:An,droppableContainers:bn,scrollAdjustedTranslate:Un}=Z.current;if(!ut||T.current==null||!qe||!Un)return;const{onDragOver:Jn}=D.current,hr=bn.get(Te),Vi=hr&&hr.rect.current?{id:hr.id,rect:hr.rect.current,data:hr.data,disabled:hr.disabled}:null,er={active:ut,activatorEvent:qe,collisions:An,delta:{x:Un.x,y:Un.y},over:Vi};ii.unstable_batchedUpdates(()=>{ie(Vi),Jn==null||Jn(er),y({type:"onDragOver",event:er})})},[Te]),So(()=>{Z.current={activatorEvent:N,active:M,activeNode:X,collisionRect:ee,collisions:be,droppableRects:U,draggableNodes:C,draggingNode:oe,draggingNodeRect:Ce,droppableContainers:P,over:Ne,scrollableAncestors:$e,scrollAdjustedTranslate:Ot},$.current={initial:Ce,translated:ee}},[M,X,be,ee,C,oe,Ce,U,P,Ne,$e,Ot]),l4e({...W,delta:k,draggingRect:ee,pointerCoordinates:nt,scrollableAncestors:$e,scrollableAncestorRects:Fe});const ko=E.useMemo(()=>({active:M,activeNode:X,activeNodeRect:J,activatorEvent:N,collisions:be,containerNodeRect:ne,dragOverlay:ae,draggableNodes:C,droppableContainers:P,droppableRects:U,over:Ne,measureDroppableContainers:K,scrollableAncestors:$e,scrollableAncestorRects:Fe,measuringConfiguration:z,measuringScheduled:q,windowRect:mt}),[M,X,J,N,be,ne,ae,C,P,U,Ne,K,$e,Fe,z,q,mt]),qr=E.useMemo(()=>({activatorEvent:N,activators:Zn,active:M,activeNodeRect:J,ariaDescribedById:{draggable:L},dispatch:v,draggableNodes:C,over:Ne,measureDroppableContainers:K}),[N,Zn,M,J,v,L,C,Ne,K]);return Ve.createElement(ij.Provider,{value:g},Ve.createElement(Vp.Provider,{value:qr},Ve.createElement(wj.Provider,{value:ko},Ve.createElement(xb.Provider,{value:Zt},u)),Ve.createElement(A4e,{disabled:(a==null?void 0:a.restoreFocus)===!1})),Ve.createElement(R3e,{...a,hiddenTextDescribedById:L}));function Ao(){const ut=(O==null?void 0:O.autoScrollEnabled)===!1,qe=typeof l=="object"?l.enabled===!1:l===!1,An=w&&!ut&&!qe;return typeof l=="object"?{...l,enabled:An}:{enabled:An}}}),N4e=E.createContext(null),qk="button",M4e="Droppable";function D4e(e){let{id:t,data:n,disabled:r=!1,attributes:i}=e;const o=_b(M4e),{activators:s,activatorEvent:a,active:l,activeNodeRect:u,ariaDescribedById:c,draggableNodes:d,over:f}=E.useContext(Vp),{role:h=qk,roleDescription:p="draggable",tabIndex:m=0}=i??{},S=(l==null?void 0:l.id)===t,v=E.useContext(S?xb:N4e),[y,g]=S0(),[b,_]=S0(),w=_4e(s,t),x=jh(n);So(()=>(d.set(t,{id:t,key:o,node:y,activatorNode:b,data:x}),()=>{const k=d.get(t);k&&k.key===o&&d.delete(t)}),[d,t]);const C=E.useMemo(()=>({role:h,tabIndex:m,"aria-disabled":r,"aria-pressed":S&&h===qk?!0:void 0,"aria-roledescription":p,"aria-describedby":c.draggable}),[r,h,m,S,p,c.draggable]);return{active:l,activatorEvent:a,activeNodeRect:u,attributes:C,isDragging:S,listeners:r?void 0:w,node:y,over:f,setNodeRef:g,setActivatorNodeRef:_,transform:v}}function L4e(){return E.useContext(wj)}const $4e="Droppable",F4e={timeout:25};function B4e(e){let{data:t,disabled:n=!1,id:r,resizeObserverConfig:i}=e;const o=_b($4e),{active:s,dispatch:a,over:l,measureDroppableContainers:u}=E.useContext(Vp),c=E.useRef({disabled:n}),d=E.useRef(!1),f=E.useRef(null),h=E.useRef(null),{disabled:p,updateMeasurementsFor:m,timeout:S}={...F4e,...i},v=jh(m??r),y=E.useCallback(()=>{if(!d.current){d.current=!0;return}h.current!=null&&clearTimeout(h.current),h.current=setTimeout(()=>{u(Array.isArray(v.current)?v.current:[v.current]),h.current=null},S)},[S]),g=wb({callback:y,disabled:p||!s}),b=E.useCallback((C,k)=>{g&&(k&&(g.unobserve(k),d.current=!1),C&&g.observe(C))},[g]),[_,w]=S0(b),x=jh(t);return E.useEffect(()=>{!g||!_.current||(g.disconnect(),d.current=!1,g.observe(_.current))},[_,g]),So(()=>(a({type:cn.RegisterDroppable,element:{id:r,key:o,disabled:n,node:_,rect:f,data:x}}),()=>a({type:cn.UnregisterDroppable,key:o,id:r})),[r]),E.useEffect(()=>{n!==c.current.disabled&&(a({type:cn.SetDroppableDisabled,id:r,key:o,disabled:n}),c.current.disabled=n)},[r,o,n,a]),{active:s,rect:f,isOver:(l==null?void 0:l.id)===r,node:_,over:l,setNodeRef:w}}function j4e(e){let{animation:t,children:n}=e;const[r,i]=E.useState(null),[o,s]=E.useState(null),a=_0(n);return!n&&!r&&a&&i(a),So(()=>{if(!o)return;const l=r==null?void 0:r.key,u=r==null?void 0:r.props.id;if(l==null||u==null){i(null);return}Promise.resolve(t(u,o)).then(()=>{i(null)})},[t,r,o]),Ve.createElement(Ve.Fragment,null,n,r?E.cloneElement(r,{ref:s}):null)}const V4e={x:0,y:0,scaleX:1,scaleY:1};function z4e(e){let{children:t}=e;return Ve.createElement(Vp.Provider,{value:_j},Ve.createElement(xb.Provider,{value:V4e},t))}const U4e={position:"fixed",touchAction:"none"},G4e=e=>f4(e)?"transform 250ms ease":void 0,H4e=E.forwardRef((e,t)=>{let{as:n,activatorEvent:r,adjustScale:i,children:o,className:s,rect:a,style:l,transform:u,transition:c=G4e}=e;if(!a)return null;const d=i?u:{...u,scaleX:1,scaleY:1},f={...U4e,width:a.width,height:a.height,top:a.top,left:a.left,transform:zh.Transform.toString(d),transformOrigin:i&&r?M3e(r,a):void 0,transition:typeof c=="function"?c(r):c,...l};return Ve.createElement(n,{className:s,style:f,ref:t},o)}),W4e=e=>t=>{let{active:n,dragOverlay:r}=t;const i={},{styles:o,className:s}=e;if(o!=null&&o.active)for(const[a,l]of Object.entries(o.active))l!==void 0&&(i[a]=n.node.style.getPropertyValue(a),n.node.style.setProperty(a,l));if(o!=null&&o.dragOverlay)for(const[a,l]of Object.entries(o.dragOverlay))l!==void 0&&r.node.style.setProperty(a,l);return s!=null&&s.active&&n.node.classList.add(s.active),s!=null&&s.dragOverlay&&r.node.classList.add(s.dragOverlay),function(){for(const[l,u]of Object.entries(i))n.node.style.setProperty(l,u);s!=null&&s.active&&n.node.classList.remove(s.active)}},q4e=e=>{let{transform:{initial:t,final:n}}=e;return[{transform:zh.Transform.toString(t)},{transform:zh.Transform.toString(n)}]},K4e={duration:250,easing:"ease",keyframes:q4e,sideEffects:W4e({styles:{active:{opacity:"0"}}})};function Y4e(e){let{config:t,draggableNodes:n,droppableContainers:r,measuringConfiguration:i}=e;return Sb((o,s)=>{if(t===null)return;const a=n.get(o);if(!a)return;const l=a.node.current;if(!l)return;const u=Sj(s);if(!u)return;const{transform:c}=fr(s).getComputedStyle(s),d=sj(c);if(!d)return;const f=typeof t=="function"?t:X4e(t);return hj(l,i.draggable.measure),f({active:{id:o,data:a.data,node:l,rect:i.draggable.measure(l)},draggableNodes:n,dragOverlay:{node:s,rect:i.dragOverlay.measure(u)},droppableContainers:r,measuringConfiguration:i,transform:d})})}function X4e(e){const{duration:t,easing:n,sideEffects:r,keyframes:i}={...K4e,...e};return o=>{let{active:s,dragOverlay:a,transform:l,...u}=o;if(!t)return;const c={x:a.rect.left-s.rect.left,y:a.rect.top-s.rect.top},d={scaleX:l.scaleX!==1?s.rect.width*l.scaleX/a.rect.width:1,scaleY:l.scaleY!==1?s.rect.height*l.scaleY/a.rect.height:1},f={x:l.x-c.x,y:l.y-c.y,...d},h=i({...u,active:s,dragOverlay:a,transform:{initial:l,final:f}}),[p]=h,m=h[h.length-1];if(JSON.stringify(p)===JSON.stringify(m))return;const S=r==null?void 0:r({active:s,dragOverlay:a,...u}),v=a.node.animate(h,{duration:t,easing:n,fill:"forwards"});return new Promise(y=>{v.onfinish=()=>{S==null||S(),y()}})}}let Kk=0;function Q4e(e){return E.useMemo(()=>{if(e!=null)return Kk++,Kk},[e])}const Z4e=Ve.memo(e=>{let{adjustScale:t=!1,children:n,dropAnimation:r,style:i,transition:o,modifiers:s,wrapperElement:a="div",className:l,zIndex:u=999}=e;const{activatorEvent:c,active:d,activeNodeRect:f,containerNodeRect:h,draggableNodes:p,droppableContainers:m,dragOverlay:S,over:v,measuringConfiguration:y,scrollableAncestors:g,scrollableAncestorRects:b,windowRect:_}=L4e(),w=E.useContext(xb),x=Q4e(d==null?void 0:d.id),C=xj(s,{activatorEvent:c,active:d,activeNodeRect:f,containerNodeRect:h,draggingNodeRect:S.rect,over:v,overlayNodeRect:S.rect,scrollableAncestors:g,scrollableAncestorRects:b,transform:w,windowRect:_}),k=m4(f),P=Y4e({config:r,draggableNodes:p,droppableContainers:m,measuringConfiguration:y}),A=k?S.setRef:void 0;return Ve.createElement(z4e,null,Ve.createElement(j4e,{animation:P},d&&x?Ve.createElement(H4e,{key:x,id:d.id,ref:A,as:a,activatorEvent:c,adjustScale:t,className:l,transition:o,rect:k,style:{zIndex:u,...i},transform:C},n):null))}),Hg=28,V2={w:Hg,h:Hg,maxW:Hg,maxH:Hg,shadow:"dark-lg",borderRadius:"lg",borderWidth:2,borderStyle:"dashed",borderColor:"base.100",opacity:.5,bg:"base.800",color:"base.50",_dark:{borderColor:"base.200",bg:"base.900",color:"base.100"}},J4e=wt(e5e,e=>{const t=e.gallery.selection.length,n=e.batch.selection.length;return{gallerySelectionCount:t,batchSelectionCount:n}},Ta),eTe=e=>{const{gallerySelectionCount:t,batchSelectionCount:n}=wc(J4e);if(e.dragData){if(e.dragData.payloadType==="IMAGE_DTO"){const{thumbnail_url:r,width:i,height:o}=e.dragData.payload.imageDTO;return j.jsx(l3,{sx:{position:"relative",width:"100%",height:"100%",display:"flex",alignItems:"center",justifyContent:"center",userSelect:"none",cursor:"none"},children:j.jsx(s3,{sx:{...V2},objectFit:"contain",src:r,width:i,height:o})})}return e.dragData.payloadType==="BATCH_SELECTION"?j.jsxs(By,{sx:{cursor:"none",userSelect:"none",position:"relative",alignItems:"center",justifyContent:"center",flexDir:"column",...V2},children:[j.jsx(Yd,{children:n}),j.jsx(Yd,{size:"sm",children:"Images"})]}):e.dragData.payloadType==="GALLERY_SELECTION"?j.jsxs(By,{sx:{cursor:"none",userSelect:"none",position:"relative",alignItems:"center",justifyContent:"center",flexDir:"column",...V2},children:[j.jsx(Yd,{children:t}),j.jsx(Yd,{size:"sm",children:"Images"})]}):null}},tTe=E.memo(eTe),nTe=e=>{let{activatorEvent:t,draggingNodeRect:n,transform:r}=e;if(n&&t){const i=Vh(t);if(!i)return r;const o=i.x-n.left,s=i.y-n.top;return{...r,x:r.x+o-n.width/2,y:r.y+s-n.height/2}}return r};function w9e(e){return B4e(e)}function x9e(e){return D4e(e)}const C9e=(e,t)=>{if(!e||!(t!=null&&t.data.current))return!1;const{actionType:n}=e,{payloadType:r}=t.data.current;if(e.id===t.data.current.id)return!1;switch(n){case"SET_CURRENT_IMAGE":return r==="IMAGE_DTO";case"SET_INITIAL_IMAGE":return r==="IMAGE_DTO";case"SET_CONTROLNET_IMAGE":return r==="IMAGE_DTO";case"SET_CANVAS_INITIAL_IMAGE":return r==="IMAGE_DTO";case"SET_NODES_IMAGE":return r==="IMAGE_DTO";case"SET_MULTI_NODES_IMAGE":return r==="IMAGE_DTO"||"GALLERY_SELECTION";case"ADD_TO_BATCH":return r==="IMAGE_DTO"||"GALLERY_SELECTION";case"MOVE_BOARD":return r==="IMAGE_DTO"||"GALLERY_SELECTION";default:return!1}};function rTe(e){return j.jsx(I4e,{...e})}const iTe=e=>{const[t,n]=E.useState(null),r=Kc(),i=E.useCallback(u=>{const c=u.active.data.current;c&&n(c)},[]),o=E.useCallback(u=>{var f;const c=u.active.data.current,d=(f=u.over)==null?void 0:f.data.current;!c||!d||(r($F({overData:d,activeData:c})),n(null))},[r]),s=Fk(yj,{activationConstraint:{delay:150,tolerance:5}}),a=Fk(vj,{activationConstraint:{delay:150,tolerance:5}}),l=I3e(s,a);return j.jsxs(rTe,{onDragStart:i,onDragEnd:o,sensors:l,collisionDetection:z3e,children:[e.children,j.jsx(Z4e,{dropAnimation:null,modifiers:[nTe],children:j.jsx(r3,{children:t&&j.jsx(n3.div,{layout:!0,initial:{opacity:0,scale:.7},animate:{opacity:1,scale:1,transition:{duration:.1}},children:j.jsx(tTe,{dragData:t})},"overlay-drag-image")})})]})},oTe=E.memo(iTe),sTe=E.createContext({isOpen:!1,onClose:()=>{},onClickAddToBoard:()=>{},handleAddToBoard:()=>{}}),aTe=e=>{const[t,n]=E.useState(),{isOpen:r,onOpen:i,onClose:o}=ND(),[s,a]=xbe(),l=E.useCallback(()=>{n(void 0),o()},[o]),u=E.useCallback(d=>{d&&(n(d),i())},[n,i]),c=E.useCallback(d=>{t&&(s({board_id:d,image_name:t.image_name}),l())},[s,l,t]);return j.jsx(sTe.Provider,{value:{isOpen:r,image:t,onClose:l,onClickAddToBoard:u,handleAddToBoard:c},children:e.children})},lTe=wt(e=>e.ui,e=>CL[e.activeTab],{memoizeOptions:{equalityCheck:ap}}),T9e=wt(e=>e.ui,e=>e.activeTab,{memoizeOptions:{equalityCheck:ap}}),E9e=wt(e=>e.ui,e=>e,{memoizeOptions:{equalityCheck:ap}}),Cj=e=>e.canvas,P9e=wt([Cj,lTe,lp],(e,t,n)=>e.layerState.stagingArea.images.length>0||t==="unifiedCanvas"&&n.isProcessing),k9e=e=>e.canvas.layerState.objects.find(rw),uTe=e=>e.generation,cTe=wt([e=>e,uTe,Cj,C1e,$pe,(e,t)=>t],(e,t,n,r,i,o)=>{const s=t.initialImage?Wa(e,t.initialImage.imageName):void 0,a=(s==null?void 0:s.board_id)===o,l=n.layerState.objects.some(f=>{if(f.kind==="image"){const h=Wa(e,f.imageName);return(h==null?void 0:h.board_id)===o}return!1}),u=r.nodes.some(f=>my(f.data.inputs,h=>{if(h.type==="image"&&h.value){const p=Wa(e,h.value.image_name);return(p==null?void 0:p.board_id)===o}return!1})),c=my(i.controlNets,f=>{const h=f.controlImage?Wa(e,f.controlImage):void 0,p=f.processedControlImage?Wa(e,f.processedControlImage):void 0;return(h==null?void 0:h.board_id)===o||(p==null?void 0:p.board_id)===o});return{isInitialImage:a,isCanvasImage:l,isNodesImage:u,isControlNetImage:c}},Ta),dTe=E.createContext({isOpen:!1,onClose:()=>{},onClickDeleteBoardImages:()=>{},handleDeleteBoardImages:()=>{},handleDeleteBoardOnly:()=>{}}),fTe=e=>{const[t,n]=E.useState(),{isOpen:r,onOpen:i,onClose:o}=ND(),s=Kc(),a=wc(h=>cTe(h,t==null?void 0:t.board_id)),[l]=qJ(),u=E.useCallback(()=>{n(void 0),o()},[o]),c=E.useCallback(h=>{console.log({board:h}),h&&(n(h),i())},[n,i]),d=E.useCallback(h=>{t&&(s(RF({board:t,imagesUsage:a})),u())},[s,u,t,a]),f=E.useCallback(h=>{t&&(l(h),u())},[l,u,t]);return j.jsx(dTe.Provider,{value:{isOpen:r,board:t,onClose:u,onClickDeleteBoardImages:c,handleDeleteBoardImages:d,handleDeleteBoardOnly:f,imagesUsage:a},children:e.children})},hTe=E.lazy(()=>uR(()=>import("./App-a44d46fe.js"),["./App-a44d46fe.js","./MantineProvider-8988d217.js","./App-4c33c38e.css"],import.meta.url)),pTe=E.lazy(()=>uR(()=>import("./ThemeLocaleProvider-3cf60466.js"),["./ThemeLocaleProvider-3cf60466.js","./MantineProvider-8988d217.js","./ThemeLocaleProvider-8d49f92d.css"],import.meta.url)),gTe=({apiUrl:e,token:t,config:n,headerComponent:r,middleware:i})=>(E.useEffect(()=>(t&&eh.set(t),e&&th.set(e),g7(),i&&i.length>0?V_(Lk(),...i):V_(Lk()),()=>{th.set(void 0),eh.set(void 0)}),[e,t,i]),j.jsx(Ve.StrictMode,{children:j.jsx(hG,{store:JCe,children:j.jsx(Ve.Suspense,{fallback:j.jsx(r5e,{}),children:j.jsx(pTe,{children:j.jsx(oTe,{children:j.jsx(aTe,{children:j.jsx(fTe,{children:j.jsx(hTe,{config:n,headerComponent:r})})})})})})})})),mTe=E.memo(gTe);z2.createRoot(document.getElementById("root")).render(j.jsx(mTe,{}));export{EEe as $,oce as A,Dn as B,vEe as C,r3 as D,n3 as E,Jv as F,Co as G,OEe as H,$l as I,u1 as J,kD as K,Bn as L,ah as M,Ay as N,Iu as O,are as P,bEe as Q,ym as R,Zu as S,no as T,kl as U,AG as V,Ve as W,bce as X,n8 as Y,Wie as Z,iy as _,Gc as a,Jj as a$,uce as a0,REe as a1,Ml as a2,DD as a3,Tce as a4,NEe as a5,IEe as a6,Yde as a7,qde as a8,Yv as a9,Ti as aA,R0e as aB,M0e as aC,Ar as aD,ia as aE,qi as aF,x8e as aG,U$ as aH,W0e as aI,wve as aJ,Vme as aK,Dc as aL,l3 as aM,By as aN,Yd as aO,wt as aP,lp as aQ,lTe as aR,Kc as aS,wc as aT,G8e as aU,cL as aV,Dr as aW,I5 as aX,Xc as aY,_Pe as aZ,l1 as a_,mp as aa,Ele as ab,SD as ac,Fn as ad,co as ae,wEe as af,pw as ag,yEe as ah,mm as ai,e8 as aj,kfe as ak,yce as al,t8 as am,afe as an,Cfe as ao,r2 as ap,ru as aq,i2 as ar,xg as as,lfe as at,MEe as au,Tp as av,yi as aw,Yt as ax,oc as ay,Xn as az,ff as b,ea as b$,STe as b0,vTe as b1,bTe as b2,Me as b3,CCe as b4,p9e as b5,dTe as b6,QJ as b7,CTe as b8,qJ as b9,Ube as bA,WEe as bB,f6e as bC,GEe as bD,w6e as bE,KEe as bF,r6e as bG,YEe as bH,i6e as bI,ZEe as bJ,s6e as bK,h9e as bL,zbe as bM,sTe as bN,Upe as bO,g9e as bP,c9e as bQ,nee as bR,BI as bS,u9e as bT,OL as bU,cPe as bV,_pe as bW,ol as bX,yTe as bY,S5 as bZ,PTe as b_,w9e as ba,s3 as bb,C9e as bc,y3 as bd,wD as be,xTe as bf,ER as bg,e5e as bh,Ta as bi,wTe as bj,xD as bk,g8e as bl,js as bm,x9e as bn,_9e as bo,mEe as bp,ahe as bq,zEe as br,UEe as bs,c6e as bt,d6e as bu,qEe as bv,y6e as bw,HEe as bx,n6e as by,XEe as bz,sp as c,a9e as c$,ND as c0,RTe as c1,II as c2,LTe as c3,ETe as c4,uhe as c5,DTe as c6,MTe as c7,z6e as c8,ii as c9,j8e as cA,D6e as cB,v8e as cC,W6e as cD,Wa as cE,BEe as cF,jEe as cG,$Ee as cH,FEe as cI,she as cJ,LEe as cK,da as cL,t5e as cM,Qn as cN,oEe as cO,l9e as cP,lEe as cQ,uEe as cR,q6e as cS,o9e as cT,S9e as cU,ICe as cV,i9e as cW,xpe as cX,K8e as cY,wpe as cZ,$6e as c_,ap as ca,E9e as cb,P9e as cc,j6e as cd,qo as ce,TD as cf,ED as cg,my as ch,Hpe as ci,W8e as cj,y8e as ck,ZL as cl,JL as cm,Kne as cn,O5 as co,EN as cp,Xne as cq,A4 as cr,b8 as cs,fEe as ct,M8e as cu,N8e as cv,I8e as cw,V8e as cx,z8e as cy,cEe as cz,gn as d,QD as d$,sEe as d0,X8e as d1,GTe as d2,xL as d3,VTe as d4,N6e as d5,$Te as d6,p8e as d7,d8e as d8,f8e as d9,r8e as dA,s8e as dB,n8e as dC,i2e as dD,JEe as dE,Op as dF,I6e as dG,x6e as dH,A6e as dI,u6e as dJ,uTe as dK,O6e as dL,R6e as dM,P6e as dN,k6e as dO,E6e as dP,T6e as dQ,S6e as dR,v6e as dS,e9e as dT,Nl as dU,n9e as dV,Dw as dW,qD as dX,YD as dY,KD as dZ,ZD as d_,h8e as da,_8e as db,w8e as dc,S8e as dd,ZR as de,gr as df,Hd as dg,f5 as dh,b8e as di,h5 as dj,VEe as dk,Ww as dl,A8 as dm,a8e as dn,$pe as dp,x3 as dq,Npe as dr,vu as ds,Dpe as dt,l8e as du,u8e as dv,LD as dw,c8e as dx,Mpe as dy,o8e as dz,QC as e,iPe as e$,DEe as e0,l6e as e1,bpe as e2,QEe as e3,Cpe as e4,Ko as e5,o6e as e6,b6e as e7,dEe as e8,yne as e9,P8e as eA,A8e as eB,b1e as eC,wF as eD,L8e as eE,D8e as eF,tB as eG,_V as eH,De as eI,Cj as eJ,kPe as eK,qPe as eL,WPe as eM,lPe as eN,$Pe as eO,YPe as eP,obe as eQ,ePe as eR,xPe as eS,Fd as eT,bPe as eU,tPe as eV,w1 as eW,wPe as eX,Q6e as eY,SPe as eZ,Z6e as e_,_6e as ea,F7 as eb,L6e as ec,Q8e as ed,Z8e as ee,gce as ef,F6e as eg,tZ as eh,J8e as ei,y9e as ej,s0 as ek,ye as el,v9e as em,fF as en,cx as eo,TZ as ep,hEe as eq,O8e as er,Mh as es,Tv as et,C1e as eu,E8e as ev,ECe as ew,C8e as ex,T8e as ey,k8e as ez,qc as f,g6e as f$,QTe as f0,XTe as f1,YTe as f2,KPe as f3,jI as f4,eh as f5,rw as f6,nEe as f7,rEe as f8,iEe as f9,zPe as fA,MPe as fB,IPe as fC,NPe as fD,e8e as fE,jPe as fF,t8e as fG,yPe as fH,mPe as fI,X6e as fJ,Y6e as fK,ZPe as fL,uPe as fM,rbe as fN,ebe as fO,tbe as fP,nbe as fQ,eEe as fR,AL as fS,M6e as fT,a6e as fU,C6e as fV,tEe as fW,gPe as fX,JPe as fY,h6e as fZ,p6e as f_,HPe as fa,sPe as fb,oPe as fc,Ppe as fd,GPe as fe,ibe as ff,nPe as fg,fPe as fh,hPe as fi,Wd as fj,APe as fk,PPe as fl,CPe as fm,ZTe as fn,JTe as fo,d9e as fp,f9e as fq,k9e as fr,vPe as fs,dPe as ft,OPe as fu,LPe as fv,RPe as fw,aPe as fx,J6e as fy,UPe as fz,Li as g,m6e as g0,T9e as g1,V6e as g2,G6e as g3,U6e as g4,H6e as g5,aEe as g6,vne as g7,X1e as g8,U8e as g9,gEe as ga,IN as gb,TEe as gc,$ie as gd,xEe as ge,SEe as gf,CEe as gg,ro as gh,_Ee as gi,pEe as gj,Gie as gk,Iie as gl,dre as gm,kEe as gn,AEe as go,Ca as h,Pn as i,vv as j,oI as k,k7 as l,Wc as m,mv as n,x7 as o,NK as p,E as q,_o as r,IK as s,PS as t,Qe as u,j as v,mi as w,li as x,ke as y,zn as z}; diff --git a/invokeai/frontend/web/dist/assets/inter-cyrillic-ext-wght-normal-848492d3.woff2 b/invokeai/frontend/web/dist/assets/inter-cyrillic-ext-wght-normal-848492d3.woff2 new file mode 100644 index 0000000000..f6aa99881c Binary files /dev/null and b/invokeai/frontend/web/dist/assets/inter-cyrillic-ext-wght-normal-848492d3.woff2 differ diff --git a/invokeai/frontend/web/dist/assets/inter-cyrillic-wght-normal-262a1054.woff2 b/invokeai/frontend/web/dist/assets/inter-cyrillic-wght-normal-262a1054.woff2 new file mode 100644 index 0000000000..8744543787 Binary files /dev/null and b/invokeai/frontend/web/dist/assets/inter-cyrillic-wght-normal-262a1054.woff2 differ diff --git a/invokeai/frontend/web/dist/assets/inter-greek-ext-wght-normal-fe977ddb.woff2 b/invokeai/frontend/web/dist/assets/inter-greek-ext-wght-normal-fe977ddb.woff2 new file mode 100644 index 0000000000..28a2d3a4c9 Binary files /dev/null and b/invokeai/frontend/web/dist/assets/inter-greek-ext-wght-normal-fe977ddb.woff2 differ diff --git a/invokeai/frontend/web/dist/assets/inter-greek-wght-normal-89b4a3fe.woff2 b/invokeai/frontend/web/dist/assets/inter-greek-wght-normal-89b4a3fe.woff2 new file mode 100644 index 0000000000..53f099f8ca Binary files /dev/null and b/invokeai/frontend/web/dist/assets/inter-greek-wght-normal-89b4a3fe.woff2 differ diff --git a/invokeai/frontend/web/dist/assets/inter-latin-ext-wght-normal-45606f83.woff2 b/invokeai/frontend/web/dist/assets/inter-latin-ext-wght-normal-45606f83.woff2 new file mode 100644 index 0000000000..80b17cbf1d Binary files /dev/null and b/invokeai/frontend/web/dist/assets/inter-latin-ext-wght-normal-45606f83.woff2 differ diff --git a/invokeai/frontend/web/dist/assets/inter-latin-wght-normal-450f3ba4.woff2 b/invokeai/frontend/web/dist/assets/inter-latin-wght-normal-450f3ba4.woff2 new file mode 100644 index 0000000000..fff3df969e Binary files /dev/null and b/invokeai/frontend/web/dist/assets/inter-latin-wght-normal-450f3ba4.woff2 differ diff --git a/invokeai/frontend/web/dist/assets/inter-vietnamese-wght-normal-ac4e131c.woff2 b/invokeai/frontend/web/dist/assets/inter-vietnamese-wght-normal-ac4e131c.woff2 new file mode 100644 index 0000000000..7ee67fb2b3 Binary files /dev/null and b/invokeai/frontend/web/dist/assets/inter-vietnamese-wght-normal-ac4e131c.woff2 differ diff --git a/invokeai/frontend/web/dist/index.html b/invokeai/frontend/web/dist/index.html index 6c4c1c21ae..fc99cc7681 100644 --- a/invokeai/frontend/web/dist/index.html +++ b/invokeai/frontend/web/dist/index.html @@ -12,7 +12,7 @@ margin: 0; } - + diff --git a/invokeai/frontend/web/dist/locales/en.json b/invokeai/frontend/web/dist/locales/en.json index 7a73bae411..b904219e9c 100644 --- a/invokeai/frontend/web/dist/locales/en.json +++ b/invokeai/frontend/web/dist/locales/en.json @@ -24,16 +24,13 @@ }, "common": { "hotkeysLabel": "Hotkeys", - "themeLabel": "Theme", + "darkMode": "Dark Mode", + "lightMode": "Light Mode", "languagePickerLabel": "Language", "reportBugLabel": "Report Bug", "githubLabel": "Github", "discordLabel": "Discord", "settingsLabel": "Settings", - "darkTheme": "Dark", - "lightTheme": "Light", - "greenTheme": "Green", - "oceanTheme": "Ocean", "langArabic": "العربية", "langEnglish": "English", "langDutch": "Nederlands", @@ -55,6 +52,8 @@ "unifiedCanvas": "Unified Canvas", "linear": "Linear", "nodes": "Node Editor", + "batch": "Batch Manager", + "modelManager": "Model Manager", "postprocessing": "Post Processing", "nodesDesc": "A node based system for the generation of images is under development currently. Stay tuned for updates about this amazing feature.", "postProcessing": "Post Processing", @@ -336,6 +335,7 @@ "modelManager": { "modelManager": "Model Manager", "model": "Model", + "vae": "VAE", "allModels": "All Models", "checkpointModels": "Checkpoints", "diffusersModels": "Diffusers", @@ -351,6 +351,7 @@ "scanForModels": "Scan For Models", "addManually": "Add Manually", "manual": "Manual", + "baseModel": "Base Model", "name": "Name", "nameValidationMsg": "Enter a name for your model", "description": "Description", @@ -363,6 +364,7 @@ "repoIDValidationMsg": "Online repository of your model", "vaeLocation": "VAE Location", "vaeLocationValidationMsg": "Path to where your VAE is located.", + "variant": "Variant", "vaeRepoID": "VAE Repo ID", "vaeRepoIDValidationMsg": "Online repository of your VAE", "width": "Width", @@ -524,7 +526,10 @@ "initialImage": "Initial Image", "showOptionsPanel": "Show Options Panel", "hidePreview": "Hide Preview", - "showPreview": "Show Preview" + "showPreview": "Show Preview", + "controlNetControlMode": "Control Mode", + "clipSkip": "Clip Skip", + "aspectRatio": "Ratio" }, "settings": { "models": "Models", @@ -547,7 +552,9 @@ "general": "General", "generation": "Generation", "ui": "User Interface", - "availableSchedulers": "Available Schedulers" + "favoriteSchedulers": "Favorite Schedulers", + "favoriteSchedulersPlaceholder": "No schedulers favorited", + "showAdvancedOptions": "Show Advanced Options" }, "toast": { "serverError": "Server Error", @@ -665,6 +672,7 @@ }, "ui": { "showProgressImages": "Show Progress Images", - "hideProgressImages": "Hide Progress Images" + "hideProgressImages": "Hide Progress Images", + "swapSizes": "Swap Sizes" } } diff --git a/invokeai/frontend/web/dist/locales/fi.json b/invokeai/frontend/web/dist/locales/fi.json new file mode 100644 index 0000000000..a6edd6d8b8 --- /dev/null +++ b/invokeai/frontend/web/dist/locales/fi.json @@ -0,0 +1,122 @@ +{ + "accessibility": { + "reset": "Resetoi", + "useThisParameter": "Käytä tätä parametria", + "modelSelect": "Mallin Valinta", + "exitViewer": "Poistu katselimesta", + "uploadImage": "Lataa kuva", + "copyMetadataJson": "Kopioi metadata JSON:iin", + "invokeProgressBar": "Invoken edistymispalkki", + "nextImage": "Seuraava kuva", + "previousImage": "Edellinen kuva", + "zoomIn": "Lähennä", + "flipHorizontally": "Käännä vaakasuoraan", + "zoomOut": "Loitonna", + "rotateCounterClockwise": "Kierrä vastapäivään", + "rotateClockwise": "Kierrä myötäpäivään", + "flipVertically": "Käännä pystysuoraan", + "showGallery": "Näytä galleria", + "modifyConfig": "Muokkaa konfiguraatiota", + "toggleAutoscroll": "Kytke automaattinen vieritys", + "toggleLogViewer": "Kytke lokin katselutila", + "showOptionsPanel": "Näytä asetukset" + }, + "common": { + "postProcessDesc2": "Erillinen käyttöliittymä tullaan julkaisemaan helpottaaksemme työnkulkua jälkikäsittelyssä.", + "training": "Kouluta", + "statusLoadingModel": "Ladataan mallia", + "statusModelChanged": "Malli vaihdettu", + "statusConvertingModel": "Muunnetaan mallia", + "statusModelConverted": "Malli muunnettu", + "langFrench": "Ranska", + "langItalian": "Italia", + "languagePickerLabel": "Kielen valinta", + "hotkeysLabel": "Pikanäppäimet", + "reportBugLabel": "Raportoi Bugista", + "langPolish": "Puola", + "themeLabel": "Teema", + "langDutch": "Hollanti", + "settingsLabel": "Asetukset", + "githubLabel": "Github", + "darkTheme": "Tumma", + "lightTheme": "Vaalea", + "greenTheme": "Vihreä", + "langGerman": "Saksa", + "langPortuguese": "Portugali", + "discordLabel": "Discord", + "langEnglish": "Englanti", + "oceanTheme": "Meren sininen", + "langRussian": "Venäjä", + "langUkranian": "Ukraina", + "langSpanish": "Espanja", + "upload": "Lataa", + "statusMergedModels": "Mallit yhdistelty", + "img2img": "Kuva kuvaksi", + "nodes": "Solmut", + "nodesDesc": "Solmupohjainen järjestelmä kuvien generoimiseen on parhaillaan kehitteillä. Pysy kuulolla päivityksistä tähän uskomattomaan ominaisuuteen liittyen.", + "postProcessDesc1": "Invoke AI tarjoaa monenlaisia jälkikäsittelyominaisuukisa. Kuvan laadun skaalaus sekä kasvojen korjaus ovat jo saatavilla WebUI:ssä. Voit ottaa ne käyttöön lisäasetusten valikosta teksti kuvaksi sekä kuva kuvaksi -välilehdiltä. Voit myös suoraan prosessoida kuvia käyttämällä kuvan toimintapainikkeita nykyisen kuvan yläpuolella tai tarkastelussa.", + "postprocessing": "Jälkikäsitellään", + "postProcessing": "Jälkikäsitellään", + "cancel": "Peruuta", + "close": "Sulje", + "accept": "Hyväksy", + "statusConnected": "Yhdistetty", + "statusError": "Virhe", + "statusProcessingComplete": "Prosessointi valmis", + "load": "Lataa", + "back": "Takaisin", + "statusGeneratingTextToImage": "Generoidaan tekstiä kuvaksi", + "trainingDesc2": "InvokeAI tukee jo mukautettujen upotusten kouluttamista tekstin inversiolla käyttäen pääskriptiä.", + "statusDisconnected": "Yhteys katkaistu", + "statusPreparing": "Valmistellaan", + "statusIterationComplete": "Iteraatio valmis", + "statusMergingModels": "Yhdistellään malleja", + "statusProcessingCanceled": "Valmistelu peruutettu", + "statusSavingImage": "Tallennetaan kuvaa", + "statusGeneratingImageToImage": "Generoidaan kuvaa kuvaksi", + "statusRestoringFacesGFPGAN": "Korjataan kasvoja (GFPGAN)", + "statusRestoringFacesCodeFormer": "Korjataan kasvoja (CodeFormer)", + "statusGeneratingInpainting": "Generoidaan sisällemaalausta", + "statusGeneratingOutpainting": "Generoidaan ulosmaalausta", + "statusRestoringFaces": "Korjataan kasvoja", + "pinOptionsPanel": "Kiinnitä asetukset -paneeli", + "loadingInvokeAI": "Ladataan Invoke AI:ta", + "loading": "Ladataan", + "statusGenerating": "Generoidaan", + "txt2img": "Teksti kuvaksi", + "trainingDesc1": "Erillinen työnkulku omien upotusten ja tarkastuspisteiden kouluttamiseksi käyttäen tekstin inversiota ja dreamboothia selaimen käyttöliittymässä.", + "postProcessDesc3": "Invoke AI:n komentorivi tarjoaa paljon muita ominaisuuksia, kuten esimerkiksi Embiggenin.", + "unifiedCanvas": "Yhdistetty kanvas", + "statusGenerationComplete": "Generointi valmis" + }, + "gallery": { + "uploads": "Lataukset", + "showUploads": "Näytä lataukset", + "galleryImageResetSize": "Resetoi koko", + "maintainAspectRatio": "Säilytä kuvasuhde", + "galleryImageSize": "Kuvan koko", + "pinGallery": "Kiinnitä galleria", + "showGenerations": "Näytä generaatiot", + "singleColumnLayout": "Yhden sarakkeen asettelu", + "generations": "Generoinnit", + "gallerySettings": "Gallerian asetukset", + "autoSwitchNewImages": "Vaihda uusiin kuviin automaattisesti", + "allImagesLoaded": "Kaikki kuvat ladattu", + "noImagesInGallery": "Ei kuvia galleriassa", + "loadMore": "Lataa lisää" + }, + "hotkeys": { + "keyboardShortcuts": "näppäimistön pikavalinnat", + "appHotkeys": "Sovelluksen pikanäppäimet", + "generalHotkeys": "Yleiset pikanäppäimet", + "galleryHotkeys": "Gallerian pikanäppäimet", + "unifiedCanvasHotkeys": "Yhdistetyn kanvaan pikanäppäimet", + "cancel": { + "desc": "Peruuta kuvan luominen", + "title": "Peruuta" + }, + "invoke": { + "desc": "Luo kuva" + } + } +} diff --git a/invokeai/frontend/web/dist/locales/mn.json b/invokeai/frontend/web/dist/locales/mn.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/invokeai/frontend/web/dist/locales/mn.json @@ -0,0 +1 @@ +{} diff --git a/invokeai/frontend/web/dist/locales/sv.json b/invokeai/frontend/web/dist/locales/sv.json new file mode 100644 index 0000000000..da2266135d --- /dev/null +++ b/invokeai/frontend/web/dist/locales/sv.json @@ -0,0 +1,254 @@ +{ + "accessibility": { + "copyMetadataJson": "Kopiera metadata JSON", + "zoomIn": "Zooma in", + "exitViewer": "Avslutningsvisare", + "modelSelect": "Välj modell", + "uploadImage": "Ladda upp bild", + "invokeProgressBar": "Invoke förloppsmätare", + "nextImage": "Nästa bild", + "toggleAutoscroll": "Växla automatisk rullning", + "flipHorizontally": "Vänd vågrätt", + "flipVertically": "Vänd lodrätt", + "zoomOut": "Zooma ut", + "toggleLogViewer": "Växla logvisare", + "reset": "Starta om", + "previousImage": "Föregående bild", + "useThisParameter": "Använd denna parametern", + "showGallery": "Visa galleri", + "rotateCounterClockwise": "Rotera moturs", + "rotateClockwise": "Rotera medurs", + "modifyConfig": "Ändra konfiguration", + "showOptionsPanel": "Visa inställningspanelen" + }, + "common": { + "hotkeysLabel": "Snabbtangenter", + "reportBugLabel": "Rapportera bugg", + "githubLabel": "Github", + "discordLabel": "Discord", + "settingsLabel": "Inställningar", + "darkTheme": "Mörk", + "lightTheme": "Ljus", + "greenTheme": "Grön", + "oceanTheme": "Hav", + "langEnglish": "Engelska", + "langDutch": "Nederländska", + "langFrench": "Franska", + "langGerman": "Tyska", + "langItalian": "Italienska", + "langArabic": "العربية", + "langHebrew": "עברית", + "langPolish": "Polski", + "langPortuguese": "Português", + "langBrPortuguese": "Português do Brasil", + "langSimplifiedChinese": "简体中文", + "langJapanese": "日本語", + "langKorean": "한국어", + "langRussian": "Русский", + "unifiedCanvas": "Förenad kanvas", + "nodesDesc": "Ett nodbaserat system för bildgenerering är under utveckling. Håll utkik för uppdateringar om denna fantastiska funktion.", + "langUkranian": "Украї́нська", + "langSpanish": "Español", + "postProcessDesc2": "Ett dedikerat användargränssnitt kommer snart att släppas för att underlätta mer avancerade arbetsflöden av efterbehandling.", + "trainingDesc1": "Ett dedikerat arbetsflöde för träning av dina egna inbäddningar och kontrollpunkter genom Textual Inversion eller Dreambooth från webbgränssnittet.", + "trainingDesc2": "InvokeAI stöder redan träning av anpassade inbäddningar med hjälp av Textual Inversion genom huvudscriptet.", + "upload": "Ladda upp", + "close": "Stäng", + "cancel": "Avbryt", + "accept": "Acceptera", + "statusDisconnected": "Frånkopplad", + "statusGeneratingTextToImage": "Genererar text till bild", + "statusGeneratingImageToImage": "Genererar Bild till bild", + "statusGeneratingInpainting": "Genererar Måla i", + "statusGenerationComplete": "Generering klar", + "statusModelConverted": "Modell konverterad", + "statusMergingModels": "Sammanfogar modeller", + "pinOptionsPanel": "Nåla fast inställningspanelen", + "loading": "Laddar", + "loadingInvokeAI": "Laddar Invoke AI", + "statusRestoringFaces": "Återskapar ansikten", + "languagePickerLabel": "Språkväljare", + "themeLabel": "Tema", + "txt2img": "Text till bild", + "nodes": "Noder", + "img2img": "Bild till bild", + "postprocessing": "Efterbehandling", + "postProcessing": "Efterbehandling", + "load": "Ladda", + "training": "Träning", + "postProcessDesc1": "Invoke AI erbjuder ett brett utbud av efterbehandlingsfunktioner. Uppskalning och ansiktsåterställning finns redan tillgängligt i webbgränssnittet. Du kommer åt dem ifrån Avancerade inställningar-menyn under Bild till bild-fliken. Du kan också behandla bilder direkt genom att använda knappen bildåtgärder ovanför nuvarande bild eller i bildvisaren.", + "postProcessDesc3": "Invoke AI's kommandotolk erbjuder många olika funktioner, bland annat \"Förstora\".", + "statusGenerating": "Genererar", + "statusError": "Fel", + "back": "Bakåt", + "statusConnected": "Ansluten", + "statusPreparing": "Förbereder", + "statusProcessingCanceled": "Bearbetning avbruten", + "statusProcessingComplete": "Bearbetning färdig", + "statusGeneratingOutpainting": "Genererar Fyll ut", + "statusIterationComplete": "Itterering klar", + "statusSavingImage": "Sparar bild", + "statusRestoringFacesGFPGAN": "Återskapar ansikten (GFPGAN)", + "statusRestoringFacesCodeFormer": "Återskapar ansikten (CodeFormer)", + "statusUpscaling": "Skala upp", + "statusUpscalingESRGAN": "Uppskalning (ESRGAN)", + "statusModelChanged": "Modell ändrad", + "statusLoadingModel": "Laddar modell", + "statusConvertingModel": "Konverterar modell", + "statusMergedModels": "Modeller sammanfogade" + }, + "gallery": { + "generations": "Generationer", + "showGenerations": "Visa generationer", + "uploads": "Uppladdningar", + "showUploads": "Visa uppladdningar", + "galleryImageSize": "Bildstorlek", + "allImagesLoaded": "Alla bilder laddade", + "loadMore": "Ladda mer", + "galleryImageResetSize": "Återställ storlek", + "gallerySettings": "Galleriinställningar", + "maintainAspectRatio": "Behåll bildförhållande", + "pinGallery": "Nåla fast galleri", + "noImagesInGallery": "Inga bilder i galleriet", + "autoSwitchNewImages": "Ändra automatiskt till nya bilder", + "singleColumnLayout": "Enkolumnslayout" + }, + "hotkeys": { + "generalHotkeys": "Allmänna snabbtangenter", + "galleryHotkeys": "Gallerisnabbtangenter", + "unifiedCanvasHotkeys": "Snabbtangenter för sammanslagskanvas", + "invoke": { + "title": "Anropa", + "desc": "Genererar en bild" + }, + "cancel": { + "title": "Avbryt", + "desc": "Avbryt bildgenerering" + }, + "focusPrompt": { + "desc": "Fokusera området för promptinmatning", + "title": "Fokusprompt" + }, + "pinOptions": { + "desc": "Nåla fast alternativpanelen", + "title": "Nåla fast alternativ" + }, + "toggleOptions": { + "title": "Växla inställningar", + "desc": "Öppna och stäng alternativpanelen" + }, + "toggleViewer": { + "title": "Växla visaren", + "desc": "Öppna och stäng bildvisaren" + }, + "toggleGallery": { + "title": "Växla galleri", + "desc": "Öppna eller stäng galleribyrån" + }, + "maximizeWorkSpace": { + "title": "Maximera arbetsyta", + "desc": "Stäng paneler och maximera arbetsyta" + }, + "changeTabs": { + "title": "Växla flik", + "desc": "Byt till en annan arbetsyta" + }, + "consoleToggle": { + "title": "Växla konsol", + "desc": "Öppna och stäng konsol" + }, + "setSeed": { + "desc": "Använd seed för nuvarande bild", + "title": "välj seed" + }, + "setParameters": { + "title": "Välj parametrar", + "desc": "Använd alla parametrar från nuvarande bild" + }, + "setPrompt": { + "desc": "Använd prompt för nuvarande bild", + "title": "Välj prompt" + }, + "restoreFaces": { + "title": "Återskapa ansikten", + "desc": "Återskapa nuvarande bild" + }, + "upscale": { + "title": "Skala upp", + "desc": "Skala upp nuvarande bild" + }, + "showInfo": { + "title": "Visa info", + "desc": "Visa metadata för nuvarande bild" + }, + "sendToImageToImage": { + "title": "Skicka till Bild till bild", + "desc": "Skicka nuvarande bild till Bild till bild" + }, + "deleteImage": { + "title": "Radera bild", + "desc": "Radera nuvarande bild" + }, + "closePanels": { + "title": "Stäng paneler", + "desc": "Stäng öppna paneler" + }, + "previousImage": { + "title": "Föregående bild", + "desc": "Visa föregående bild" + }, + "nextImage": { + "title": "Nästa bild", + "desc": "Visa nästa bild" + }, + "toggleGalleryPin": { + "title": "Växla gallerinål", + "desc": "Nålar fast eller nålar av galleriet i gränssnittet" + }, + "increaseGalleryThumbSize": { + "title": "Förstora galleriets bildstorlek", + "desc": "Förstora miniatyrbildernas storlek" + }, + "decreaseGalleryThumbSize": { + "title": "Minska gelleriets bildstorlek", + "desc": "Minska miniatyrbildernas storlek i galleriet" + }, + "decreaseBrushSize": { + "desc": "Förminska storleken på kanvas- pensel eller suddgummi", + "title": "Minska penselstorlek" + }, + "increaseBrushSize": { + "title": "Öka penselstorlek", + "desc": "Öka stoleken på kanvas- pensel eller suddgummi" + }, + "increaseBrushOpacity": { + "title": "Öka penselns opacitet", + "desc": "Öka opaciteten för kanvaspensel" + }, + "decreaseBrushOpacity": { + "desc": "Minska kanvaspenselns opacitet", + "title": "Minska penselns opacitet" + }, + "moveTool": { + "title": "Flytta", + "desc": "Tillåt kanvasnavigation" + }, + "fillBoundingBox": { + "title": "Fyll ram", + "desc": "Fyller ramen med pensels färg" + }, + "keyboardShortcuts": "Snabbtangenter", + "appHotkeys": "Appsnabbtangenter", + "selectBrush": { + "desc": "Välj kanvaspensel", + "title": "Välj pensel" + }, + "selectEraser": { + "desc": "Välj kanvassuddgummi", + "title": "Välj suddgummi" + }, + "eraseBoundingBox": { + "title": "Ta bort ram" + } + } +} diff --git a/invokeai/frontend/web/dist/locales/tr.json b/invokeai/frontend/web/dist/locales/tr.json new file mode 100644 index 0000000000..316908b4a9 --- /dev/null +++ b/invokeai/frontend/web/dist/locales/tr.json @@ -0,0 +1,64 @@ +{ + "accessibility": { + "invokeProgressBar": "Invoke ilerleme durumu", + "nextImage": "Sonraki Resim", + "useThisParameter": "Kullanıcı parametreleri", + "copyMetadataJson": "Metadata verilerini kopyala (JSON)", + "exitViewer": "Görüntüleme Modundan Çık", + "zoomIn": "Yakınlaştır", + "zoomOut": "Uzaklaştır", + "rotateCounterClockwise": "Döndür (Saat yönünün tersine)", + "rotateClockwise": "Döndür (Saat yönünde)", + "flipHorizontally": "Yatay Çevir", + "flipVertically": "Dikey Çevir", + "modifyConfig": "Ayarları Değiştir", + "toggleAutoscroll": "Otomatik kaydırmayı aç/kapat", + "toggleLogViewer": "Günlük Görüntüleyici Aç/Kapa", + "showOptionsPanel": "Ayarlar Panelini Göster", + "modelSelect": "Model Seçin", + "reset": "Sıfırla", + "uploadImage": "Resim Yükle", + "previousImage": "Önceki Resim", + "menu": "Menü", + "showGallery": "Galeriyi Göster" + }, + "common": { + "hotkeysLabel": "Kısayol Tuşları", + "themeLabel": "Tema", + "languagePickerLabel": "Dil Seçimi", + "reportBugLabel": "Hata Bildir", + "githubLabel": "Github", + "discordLabel": "Discord", + "settingsLabel": "Ayarlar", + "darkTheme": "Karanlık Tema", + "lightTheme": "Aydınlık Tema", + "greenTheme": "Yeşil Tema", + "oceanTheme": "Okyanus Tema", + "langArabic": "Arapça", + "langEnglish": "İngilizce", + "langDutch": "Hollandaca", + "langFrench": "Fransızca", + "langGerman": "Almanca", + "langItalian": "İtalyanca", + "langJapanese": "Japonca", + "langPolish": "Lehçe", + "langPortuguese": "Portekizce", + "langBrPortuguese": "Portekizcr (Brezilya)", + "langRussian": "Rusça", + "langSimplifiedChinese": "Çince (Basit)", + "langUkranian": "Ukraynaca", + "langSpanish": "İspanyolca", + "txt2img": "Metinden Resime", + "img2img": "Resimden Metine", + "linear": "Çizgisel", + "nodes": "Düğümler", + "postprocessing": "İşlem Sonrası", + "postProcessing": "İşlem Sonrası", + "postProcessDesc2": "Daha gelişmiş özellikler için ve iş akışını kolaylaştırmak için özel bir kullanıcı arayüzü çok yakında yayınlanacaktır.", + "postProcessDesc3": "Invoke AI komut satırı arayüzü, bir çok yeni özellik sunmaktadır.", + "langKorean": "Korece", + "unifiedCanvas": "Akıllı Tuval", + "nodesDesc": "Görüntülerin oluşturulmasında hazırladığımız yeni bir sistem geliştirme aşamasındadır. Bu harika özellikler ve çok daha fazlası için bizi takip etmeye devam edin.", + "postProcessDesc1": "Invoke AI son kullanıcıya yönelik bir çok özellik sunar. Görüntü kalitesi yükseltme, yüz restorasyonu WebUI üzerinden kullanılabilir. Metinden resime ve resimden metne araçlarına gelişmiş seçenekler menüsünden ulaşabilirsiniz. İsterseniz mevcut görüntü ekranının üzerindeki veya görüntüleyicideki görüntüyü doğrudan düzenleyebilirsiniz." + } +} diff --git a/invokeai/frontend/web/dist/locales/vi.json b/invokeai/frontend/web/dist/locales/vi.json new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/invokeai/frontend/web/dist/locales/vi.json @@ -0,0 +1 @@ +{} diff --git a/invokeai/frontend/web/package.json b/invokeai/frontend/web/package.json index c072a9d95c..81d6b0c7c7 100644 --- a/invokeai/frontend/web/package.json +++ b/invokeai/frontend/web/package.json @@ -23,8 +23,7 @@ "dev": "concurrently \"vite dev\" \"yarn run theme:watch\"", "dev:host": "concurrently \"vite dev --host\" \"yarn run theme:watch\"", "build": "yarn run lint && vite build", - "api:web": "openapi -i http://localhost:9090/openapi.json -o src/services/api --client axios --useOptions --useUnionTypes --indent 2 --request src/services/fixtures/request.ts", - "api:file": "openapi -i src/services/fixtures/openapi.json -o src/services/api --client axios --useOptions --useUnionTypes --indent 2 --request src/services/fixtures/request.ts", + "typegen": "npx ts-node scripts/typegen.ts", "preview": "vite preview", "lint:madge": "madge --circular src/main.tsx", "lint:eslint": "eslint --max-warnings=0 .", @@ -56,55 +55,61 @@ "dependencies": { "@chakra-ui/anatomy": "^2.1.1", "@chakra-ui/icons": "^2.0.19", - "@chakra-ui/react": "^2.6.0", - "@chakra-ui/styled-system": "^2.9.0", - "@chakra-ui/theme-tools": "^2.0.16", - "@dagrejs/graphlib": "^2.1.12", + "@chakra-ui/react": "^2.7.1", + "@chakra-ui/styled-system": "^2.9.1", + "@chakra-ui/theme-tools": "^2.0.18", + "@dagrejs/graphlib": "^2.1.13", "@dnd-kit/core": "^6.0.8", "@dnd-kit/modifiers": "^6.0.1", "@emotion/react": "^11.11.1", - "@emotion/styled": "^11.10.6", - "@floating-ui/react-dom": "^2.0.0", - "@fontsource/inter": "^4.5.15", - "@mantine/core": "^6.0.13", - "@mantine/hooks": "^6.0.13", + "@emotion/styled": "^11.11.0", + "@floating-ui/react-dom": "^2.0.1", + "@fontsource-variable/inter": "^5.0.3", + "@fontsource/inter": "^5.0.3", + "@mantine/core": "^6.0.14", + "@mantine/form": "^6.0.15", + "@mantine/hooks": "^6.0.14", "@reduxjs/toolkit": "^1.9.5", "@roarr/browser-log-writer": "^1.1.5", "chakra-ui-contextmenu": "^1.0.5", "dateformat": "^5.0.3", "downshift": "^7.6.0", - "formik": "^2.2.9", - "framer-motion": "^10.12.4", + "formik": "^2.4.2", + "framer-motion": "^10.12.17", "fuse.js": "^6.6.2", - "i18next": "^22.4.15", - "i18next-browser-languagedetector": "^7.0.1", - "i18next-http-backend": "^2.2.0", - "konva": "^9.0.1", + "i18next": "^23.2.3", + "i18next-browser-languagedetector": "^7.0.2", + "i18next-http-backend": "^2.2.1", + "konva": "^9.2.0", "lodash-es": "^4.17.21", - "overlayscrollbars": "^2.1.1", + "nanostores": "^0.9.2", + "openapi-fetch": "^0.6.1", + "overlayscrollbars": "^2.2.0", "overlayscrollbars-react": "^0.5.0", "patch-package": "^7.0.0", + "query-string": "^8.1.0", "re-resizable": "^6.9.9", "react": "^18.2.0", "react-colorful": "^5.6.1", "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", "react-hotkeys-hook": "4.4.0", - "react-i18next": "^12.2.2", - "react-icons": "^4.9.0", - "react-konva": "^18.2.7", - "react-redux": "^8.0.5", - "react-resizable-panels": "^0.0.42", + "react-i18next": "^13.0.1", + "react-icons": "^4.10.1", + "react-konva": "^18.2.10", + "react-redux": "^8.1.1", + "react-resizable-panels": "^0.0.52", "react-use": "^17.4.0", - "react-virtuoso": "^4.3.5", - "react-zoom-pan-pinch": "^3.0.7", - "reactflow": "^11.7.0", + "react-virtuoso": "^4.3.11", + "react-zoom-pan-pinch": "^3.0.8", + "reactflow": "^11.7.4", "redux-dynamic-middlewares": "^2.2.0", "redux-remember": "^3.3.1", "roarr": "^7.15.0", "serialize-error": "^11.0.0", - "socket.io-client": "^4.6.0", - "use-image": "^1.1.0", + "socket.io-client": "^4.7.0", + "use-debounce": "^9.0.4", + "use-image": "^1.1.1", "uuid": "^9.0.0", "zod": "^3.21.4" }, @@ -115,22 +120,22 @@ "ts-toolbelt": "^9.6.0" }, "devDependencies": { - "@chakra-ui/cli": "^2.4.0", + "@chakra-ui/cli": "^2.4.1", "@types/dateformat": "^5.0.0", "@types/lodash-es": "^4.14.194", - "@types/node": "^18.16.2", - "@types/react": "^18.2.0", - "@types/react-dom": "^18.2.1", + "@types/node": "^20.3.1", + "@types/react": "^18.2.14", + "@types/react-dom": "^18.2.6", "@types/react-redux": "^7.1.25", - "@types/react-transition-group": "^4.4.5", - "@types/uuid": "^9.0.0", - "@typescript-eslint/eslint-plugin": "^5.59.1", - "@typescript-eslint/parser": "^5.59.1", - "@vitejs/plugin-react-swc": "^3.3.0", + "@types/react-transition-group": "^4.4.6", + "@types/uuid": "^9.0.2", + "@typescript-eslint/eslint-plugin": "^5.60.0", + "@typescript-eslint/parser": "^5.60.0", + "@vitejs/plugin-react-swc": "^3.3.2", "axios": "^1.4.0", "babel-plugin-transform-imports": "^2.0.0", - "concurrently": "^8.0.1", - "eslint": "^8.39.0", + "concurrently": "^8.2.0", + "eslint": "^8.43.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.32.2", @@ -138,15 +143,16 @@ "form-data": "^4.0.0", "husky": "^8.0.3", "lint-staged": "^13.2.2", - "madge": "^6.0.0", - "openapi-types": "^12.1.0", + "madge": "^6.1.0", + "openapi-types": "^12.1.3", + "openapi-typescript": "^6.2.8", "openapi-typescript-codegen": "^0.24.0", "postinstall-postinstall": "^2.1.0", "prettier": "^2.8.8", - "rollup-plugin-visualizer": "^5.9.0", - "terser": "^5.17.1", + "rollup-plugin-visualizer": "^5.9.2", + "terser": "^5.18.1", "ts-toolbelt": "^9.6.0", - "vite": "^4.3.3", + "vite": "^4.3.9", "vite-plugin-css-injected-by-js": "^3.1.1", "vite-plugin-dts": "^2.3.0", "vite-plugin-eslint": "^1.8.1", diff --git a/invokeai/frontend/web/patches/@chakra-ui+cli+2.4.0.patch b/invokeai/frontend/web/patches/@chakra-ui+cli+2.4.0.patch deleted file mode 100644 index 03db6e8238..0000000000 --- a/invokeai/frontend/web/patches/@chakra-ui+cli+2.4.0.patch +++ /dev/null @@ -1,14 +0,0 @@ -diff --git a/node_modules/@chakra-ui/cli/dist/scripts/read-theme-file.worker.js b/node_modules/@chakra-ui/cli/dist/scripts/read-theme-file.worker.js -index 937cf0d..7dcc0c0 100644 ---- a/node_modules/@chakra-ui/cli/dist/scripts/read-theme-file.worker.js -+++ b/node_modules/@chakra-ui/cli/dist/scripts/read-theme-file.worker.js -@@ -50,7 +50,8 @@ async function readTheme(themeFilePath) { - project: tsConfig.configFileAbsolutePath, - compilerOptions: { - module: "CommonJS", -- esModuleInterop: true -+ esModuleInterop: true, -+ jsx: 'react' - }, - transpileOnly: true, - swc: true diff --git a/invokeai/frontend/web/public/locales/en.json b/invokeai/frontend/web/public/locales/en.json index eae0c07eff..f3436df5a7 100644 --- a/invokeai/frontend/web/public/locales/en.json +++ b/invokeai/frontend/web/public/locales/en.json @@ -24,16 +24,13 @@ }, "common": { "hotkeysLabel": "Hotkeys", - "themeLabel": "Theme", + "darkMode": "Dark Mode", + "lightMode": "Light Mode", "languagePickerLabel": "Language", "reportBugLabel": "Report Bug", "githubLabel": "Github", "discordLabel": "Discord", "settingsLabel": "Settings", - "darkTheme": "Dark", - "lightTheme": "Light", - "greenTheme": "Green", - "oceanTheme": "Ocean", "langArabic": "العربية", "langEnglish": "English", "langDutch": "Nederlands", @@ -55,6 +52,8 @@ "unifiedCanvas": "Unified Canvas", "linear": "Linear", "nodes": "Node Editor", + "batch": "Batch Manager", + "modelManager": "Model Manager", "postprocessing": "Post Processing", "nodesDesc": "A node based system for the generation of images is under development currently. Stay tuned for updates about this amazing feature.", "postProcessing": "Post Processing", @@ -103,7 +102,8 @@ "openInNewTab": "Open in New Tab", "dontAskMeAgain": "Don't ask me again", "areYouSure": "Are you sure?", - "imagePrompt": "Image Prompt" + "imagePrompt": "Image Prompt", + "clearNodes": "Are you sure you want to clear all nodes?" }, "gallery": { "generations": "Generations", @@ -336,6 +336,7 @@ "modelManager": { "modelManager": "Model Manager", "model": "Model", + "vae": "VAE", "allModels": "All Models", "checkpointModels": "Checkpoints", "diffusersModels": "Diffusers", @@ -351,6 +352,7 @@ "scanForModels": "Scan For Models", "addManually": "Add Manually", "manual": "Manual", + "baseModel": "Base Model", "name": "Name", "nameValidationMsg": "Enter a name for your model", "description": "Description", @@ -363,6 +365,7 @@ "repoIDValidationMsg": "Online repository of your model", "vaeLocation": "VAE Location", "vaeLocationValidationMsg": "Path to where your VAE is located.", + "variant": "Variant", "vaeRepoID": "VAE Repo ID", "vaeRepoIDValidationMsg": "Online repository of your VAE", "width": "Width", @@ -524,7 +527,10 @@ "initialImage": "Initial Image", "showOptionsPanel": "Show Options Panel", "hidePreview": "Hide Preview", - "showPreview": "Show Preview" + "showPreview": "Show Preview", + "controlNetControlMode": "Control Mode", + "clipSkip": "CLIP Skip", + "aspectRatio": "Ratio" }, "settings": { "models": "Models", @@ -548,7 +554,8 @@ "generation": "Generation", "ui": "User Interface", "favoriteSchedulers": "Favorite Schedulers", - "favoriteSchedulersPlaceholder": "No schedulers favorited" + "favoriteSchedulersPlaceholder": "No schedulers favorited", + "showAdvancedOptions": "Show Advanced Options" }, "toast": { "serverError": "Server Error", @@ -587,7 +594,11 @@ "metadataLoadFailed": "Failed to load metadata", "initialImageSet": "Initial Image Set", "initialImageNotSet": "Initial Image Not Set", - "initialImageNotSetDesc": "Could not load initial image" + "initialImageNotSetDesc": "Could not load initial image", + "nodesSaved": "Nodes Saved", + "nodesLoaded": "Nodes Loaded", + "nodesLoadedFailed": "Failed To Load Nodes", + "nodesCleared": "Nodes Cleared" }, "tooltip": { "feature": { @@ -666,6 +677,13 @@ }, "ui": { "showProgressImages": "Show Progress Images", - "hideProgressImages": "Hide Progress Images" + "hideProgressImages": "Hide Progress Images", + "swapSizes": "Swap Sizes" + }, + "nodes": { + "reloadSchema": "Reload Schema", + "saveNodes": "Save Nodes", + "loadNodes": "Load Nodes", + "clearNodes": "Clear Nodes" } } diff --git a/invokeai/frontend/web/scripts/package.json b/invokeai/frontend/web/scripts/package.json new file mode 100644 index 0000000000..3dbc1ca591 --- /dev/null +++ b/invokeai/frontend/web/scripts/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} diff --git a/invokeai/frontend/web/scripts/typegen.ts b/invokeai/frontend/web/scripts/typegen.ts new file mode 100644 index 0000000000..39d0b25d30 --- /dev/null +++ b/invokeai/frontend/web/scripts/typegen.ts @@ -0,0 +1,23 @@ +import fs from 'node:fs'; +import openapiTS from 'openapi-typescript'; + +const OPENAPI_URL = 'http://localhost:9090/openapi.json'; +const OUTPUT_FILE = 'src/services/api/schema.d.ts'; + +async function main() { + process.stdout.write( + `Generating types "${OPENAPI_URL}" --> "${OUTPUT_FILE}"...` + ); + const types = await openapiTS(OPENAPI_URL, { + exportType: true, + transform: (schemaObject, metadata) => { + if ('format' in schemaObject && schemaObject.format === 'binary') { + return schemaObject.nullable ? 'Blob | null' : 'Blob'; + } + }, + }); + fs.writeFileSync(OUTPUT_FILE, types); + process.stdout.write(` OK!\r\n`); +} + +main(); diff --git a/invokeai/frontend/web/src/app/components/App.tsx b/invokeai/frontend/web/src/app/components/App.tsx index 55fcc97745..8628360160 100644 --- a/invokeai/frontend/web/src/app/components/App.tsx +++ b/invokeai/frontend/web/src/app/components/App.tsx @@ -1,66 +1,41 @@ -import { Box, Flex, Grid, Portal } from '@chakra-ui/react'; +import { Flex, Grid, Portal } from '@chakra-ui/react'; import { useLogger } from 'app/logging/useLogger'; +import { appStarted } from 'app/store/middleware/listenerMiddleware/listeners/appStarted'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { PartialAppConfig } from 'app/types/invokeai'; import ImageUploader from 'common/components/ImageUploader'; -import Loading from 'common/components/Loading/Loading'; import GalleryDrawer from 'features/gallery/components/GalleryPanel'; +import DeleteImageModal from 'features/imageDeletion/components/DeleteImageModal'; import Lightbox from 'features/lightbox/components/Lightbox'; import SiteHeader from 'features/system/components/SiteHeader'; import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus'; -import { useIsApplicationReady } from 'features/system/hooks/useIsApplicationReady'; import { configChanged } from 'features/system/store/configSlice'; import { languageSelector } from 'features/system/store/systemSelectors'; import FloatingGalleryButton from 'features/ui/components/FloatingGalleryButton'; import FloatingParametersPanelButtons from 'features/ui/components/FloatingParametersPanelButtons'; import InvokeTabs from 'features/ui/components/InvokeTabs'; import ParametersDrawer from 'features/ui/components/ParametersDrawer'; -import { AnimatePresence, motion } from 'framer-motion'; import i18n from 'i18n'; -import { ReactNode, memo, useCallback, useEffect, useState } from 'react'; -import { APP_HEIGHT, APP_WIDTH } from 'theme/util/constants'; +import { ReactNode, memo, useEffect } from 'react'; +import DeleteBoardImagesModal from '../../features/gallery/components/Boards/DeleteBoardImagesModal'; +import UpdateImageBoardModal from '../../features/gallery/components/Boards/UpdateImageBoardModal'; import GlobalHotkeys from './GlobalHotkeys'; import Toaster from './Toaster'; -import DeleteImageModal from 'features/gallery/components/DeleteImageModal'; -import { requestCanvasRescale } from 'features/canvas/store/thunks/requestCanvasScale'; -import UpdateImageBoardModal from '../../features/gallery/components/Boards/UpdateImageBoardModal'; -import { useListModelsQuery } from 'services/apiSlice'; const DEFAULT_CONFIG = {}; interface Props { config?: PartialAppConfig; headerComponent?: ReactNode; - setIsReady?: (isReady: boolean) => void; } -const App = ({ - config = DEFAULT_CONFIG, - headerComponent, - setIsReady, -}: Props) => { +const App = ({ config = DEFAULT_CONFIG, headerComponent }: Props) => { const language = useAppSelector(languageSelector); const log = useLogger(); const isLightboxEnabled = useFeatureStatus('lightbox').isFeatureEnabled; - const isApplicationReady = useIsApplicationReady(); - - const { data: pipelineModels } = useListModelsQuery({ - model_type: 'pipeline', - }); - const { data: controlnetModels } = useListModelsQuery({ - model_type: 'controlnet', - }); - const { data: vaeModels } = useListModelsQuery({ model_type: 'vae' }); - const { data: loraModels } = useListModelsQuery({ model_type: 'lora' }); - const { data: embeddingModels } = useListModelsQuery({ - model_type: 'embedding', - }); - - const [loadingOverridden, setLoadingOverridden] = useState(false); - const dispatch = useAppDispatch(); useEffect(() => { @@ -72,26 +47,9 @@ const App = ({ dispatch(configChanged(config)); }, [dispatch, config, log]); - const handleOverrideClicked = useCallback(() => { - setLoadingOverridden(true); - }, []); - useEffect(() => { - if (isApplicationReady && setIsReady) { - setIsReady(true); - } - - if (isApplicationReady) { - // TODO: This is a jank fix for canvas not filling the screen on first load - setTimeout(() => { - dispatch(requestCanvasRescale()); - }, 200); - } - - return () => { - setIsReady && setIsReady(false); - }; - }, [dispatch, isApplicationReady, setIsReady]); + dispatch(appStarted()); + }, [dispatch]); return ( <> @@ -122,33 +80,6 @@ const App = ({ - - - {!isApplicationReady && !loadingOverridden && ( - - - - - - - )} - - @@ -158,6 +89,7 @@ const App = ({ + diff --git a/invokeai/frontend/web/src/app/components/ImageDnd/DragPreview.tsx b/invokeai/frontend/web/src/app/components/ImageDnd/DragPreview.tsx new file mode 100644 index 0000000000..9fb4bef595 --- /dev/null +++ b/invokeai/frontend/web/src/app/components/ImageDnd/DragPreview.tsx @@ -0,0 +1,126 @@ +import { Box, ChakraProps, Flex, Heading, Image } from '@chakra-ui/react'; +import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from 'app/store/store'; +import { useAppSelector } from 'app/store/storeHooks'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import { memo } from 'react'; +import { TypesafeDraggableData } from './typesafeDnd'; + +type OverlayDragImageProps = { + dragData: TypesafeDraggableData | null; +}; + +const BOX_SIZE = 28; + +const STYLES: ChakraProps['sx'] = { + w: BOX_SIZE, + h: BOX_SIZE, + maxW: BOX_SIZE, + maxH: BOX_SIZE, + shadow: 'dark-lg', + borderRadius: 'lg', + borderWidth: 2, + borderStyle: 'dashed', + borderColor: 'base.100', + opacity: 0.5, + bg: 'base.800', + color: 'base.50', + _dark: { + borderColor: 'base.200', + bg: 'base.900', + color: 'base.100', + }, +}; + +const selector = createSelector( + stateSelector, + (state) => { + const gallerySelectionCount = state.gallery.selection.length; + const batchSelectionCount = state.batch.selection.length; + + return { + gallerySelectionCount, + batchSelectionCount, + }; + }, + defaultSelectorOptions +); + +const DragPreview = (props: OverlayDragImageProps) => { + const { gallerySelectionCount, batchSelectionCount } = + useAppSelector(selector); + + if (!props.dragData) { + return; + } + + if (props.dragData.payloadType === 'IMAGE_DTO') { + const { thumbnail_url, width, height } = props.dragData.payload.imageDTO; + return ( + + + + ); + } + + if (props.dragData.payloadType === 'BATCH_SELECTION') { + return ( + + {batchSelectionCount} + Images + + ); + } + + if (props.dragData.payloadType === 'GALLERY_SELECTION') { + return ( + + {gallerySelectionCount} + Images + + ); + } + + return null; +}; + +export default memo(DragPreview); diff --git a/invokeai/frontend/web/src/app/components/ImageDnd/ImageDndContext.tsx b/invokeai/frontend/web/src/app/components/ImageDnd/ImageDndContext.tsx index 104073c023..1b8687bf8e 100644 --- a/invokeai/frontend/web/src/app/components/ImageDnd/ImageDndContext.tsx +++ b/invokeai/frontend/web/src/app/components/ImageDnd/ImageDndContext.tsx @@ -1,8 +1,5 @@ import { - DndContext, - DragEndEvent, DragOverlay, - DragStartEvent, MouseSensor, TouchSensor, pointerWithin, @@ -10,33 +7,45 @@ import { useSensors, } from '@dnd-kit/core'; import { PropsWithChildren, memo, useCallback, useState } from 'react'; -import OverlayDragImage from './OverlayDragImage'; -import { ImageDTO } from 'services/api'; -import { isImageDTO } from 'services/types/guards'; +import DragPreview from './DragPreview'; import { snapCenterToCursor } from '@dnd-kit/modifiers'; import { AnimatePresence, motion } from 'framer-motion'; +import { + DndContext, + DragEndEvent, + DragStartEvent, + TypesafeDraggableData, +} from './typesafeDnd'; +import { useAppDispatch } from 'app/store/storeHooks'; +import { imageDropped } from 'app/store/middleware/listenerMiddleware/listeners/imageDropped'; type ImageDndContextProps = PropsWithChildren; const ImageDndContext = (props: ImageDndContextProps) => { - const [draggedImage, setDraggedImage] = useState(null); + const [activeDragData, setActiveDragData] = + useState(null); + + const dispatch = useAppDispatch(); const handleDragStart = useCallback((event: DragStartEvent) => { - const dragData = event.active.data.current; - if (dragData && 'image' in dragData && isImageDTO(dragData.image)) { - setDraggedImage(dragData.image); + const activeData = event.active.data.current; + if (!activeData) { + return; } + setActiveDragData(activeData); }, []); const handleDragEnd = useCallback( (event: DragEndEvent) => { - const handleDrop = event.over?.data.current?.handleDrop; - if (handleDrop && typeof handleDrop === 'function' && draggedImage) { - handleDrop(draggedImage); + const activeData = event.active.data.current; + const overData = event.over?.data.current; + if (!activeData || !overData) { + return; } - setDraggedImage(null); + dispatch(imageDropped({ overData, activeData })); + setActiveDragData(null); }, - [draggedImage] + [dispatch] ); const mouseSensor = useSensor(MouseSensor, { @@ -46,6 +55,7 @@ const ImageDndContext = (props: ImageDndContextProps) => { const touchSensor = useSensor(TouchSensor, { activationConstraint: { delay: 150, tolerance: 5 }, }); + // TODO: Use KeyboardSensor - needs composition of multiple collisionDetection algos // Alternatively, fix `rectIntersection` collection detection to work with the drag overlay // (currently the drag element collision rect is not correctly calculated) @@ -63,7 +73,7 @@ const ImageDndContext = (props: ImageDndContextProps) => { {props.children} - {draggedImage && ( + {activeDragData && ( { transition: { duration: 0.1 }, }} > - + )} diff --git a/invokeai/frontend/web/src/app/components/ImageDnd/OverlayDragImage.tsx b/invokeai/frontend/web/src/app/components/ImageDnd/OverlayDragImage.tsx deleted file mode 100644 index 510dadc823..0000000000 --- a/invokeai/frontend/web/src/app/components/ImageDnd/OverlayDragImage.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { Box, Image } from '@chakra-ui/react'; -import { memo } from 'react'; -import { ImageDTO } from 'services/api'; - -type OverlayDragImageProps = { - image: ImageDTO; -}; - -const OverlayDragImage = (props: OverlayDragImageProps) => { - return ( - - - - ); -}; - -export default memo(OverlayDragImage); diff --git a/invokeai/frontend/web/src/app/components/ImageDnd/typesafeDnd.tsx b/invokeai/frontend/web/src/app/components/ImageDnd/typesafeDnd.tsx new file mode 100644 index 0000000000..1478ace748 --- /dev/null +++ b/invokeai/frontend/web/src/app/components/ImageDnd/typesafeDnd.tsx @@ -0,0 +1,201 @@ +// type-safe dnd from https://github.com/clauderic/dnd-kit/issues/935 +import { + Active, + Collision, + DndContextProps, + DndContext as OriginalDndContext, + Over, + Translate, + UseDraggableArguments, + UseDroppableArguments, + useDraggable as useOriginalDraggable, + useDroppable as useOriginalDroppable, +} from '@dnd-kit/core'; +import { ImageDTO } from 'services/api/types'; + +type BaseDropData = { + id: string; +}; + +export type CurrentImageDropData = BaseDropData & { + actionType: 'SET_CURRENT_IMAGE'; +}; + +export type InitialImageDropData = BaseDropData & { + actionType: 'SET_INITIAL_IMAGE'; +}; + +export type ControlNetDropData = BaseDropData & { + actionType: 'SET_CONTROLNET_IMAGE'; + context: { + controlNetId: string; + }; +}; + +export type CanvasInitialImageDropData = BaseDropData & { + actionType: 'SET_CANVAS_INITIAL_IMAGE'; +}; + +export type NodesImageDropData = BaseDropData & { + actionType: 'SET_NODES_IMAGE'; + context: { + nodeId: string; + fieldName: string; + }; +}; + +export type NodesMultiImageDropData = BaseDropData & { + actionType: 'SET_MULTI_NODES_IMAGE'; + context: { nodeId: string; fieldName: string }; +}; + +export type AddToBatchDropData = BaseDropData & { + actionType: 'ADD_TO_BATCH'; +}; + +export type MoveBoardDropData = BaseDropData & { + actionType: 'MOVE_BOARD'; + context: { boardId: string | null }; +}; + +export type TypesafeDroppableData = + | CurrentImageDropData + | InitialImageDropData + | ControlNetDropData + | CanvasInitialImageDropData + | NodesImageDropData + | AddToBatchDropData + | NodesMultiImageDropData + | MoveBoardDropData; + +type BaseDragData = { + id: string; +}; + +export type ImageDraggableData = BaseDragData & { + payloadType: 'IMAGE_DTO'; + payload: { imageDTO: ImageDTO }; +}; + +export type GallerySelectionDraggableData = BaseDragData & { + payloadType: 'GALLERY_SELECTION'; +}; + +export type BatchSelectionDraggableData = BaseDragData & { + payloadType: 'BATCH_SELECTION'; +}; + +export type TypesafeDraggableData = + | ImageDraggableData + | GallerySelectionDraggableData + | BatchSelectionDraggableData; + +interface UseDroppableTypesafeArguments + extends Omit { + data?: TypesafeDroppableData; +} + +type UseDroppableTypesafeReturnValue = Omit< + ReturnType, + 'active' | 'over' +> & { + active: TypesafeActive | null; + over: TypesafeOver | null; +}; + +export function useDroppable(props: UseDroppableTypesafeArguments) { + return useOriginalDroppable(props) as UseDroppableTypesafeReturnValue; +} + +interface UseDraggableTypesafeArguments + extends Omit { + data?: TypesafeDraggableData; +} + +type UseDraggableTypesafeReturnValue = Omit< + ReturnType, + 'active' | 'over' +> & { + active: TypesafeActive | null; + over: TypesafeOver | null; +}; + +export function useDraggable(props: UseDraggableTypesafeArguments) { + return useOriginalDraggable(props) as UseDraggableTypesafeReturnValue; +} + +interface TypesafeActive extends Omit { + data: React.MutableRefObject; +} + +interface TypesafeOver extends Omit { + data: React.MutableRefObject; +} + +export const isValidDrop = ( + overData: TypesafeDroppableData | undefined, + active: TypesafeActive | null +) => { + if (!overData || !active?.data.current) { + return false; + } + + const { actionType } = overData; + const { payloadType } = active.data.current; + + if (overData.id === active.data.current.id) { + return false; + } + + switch (actionType) { + case 'SET_CURRENT_IMAGE': + return payloadType === 'IMAGE_DTO'; + case 'SET_INITIAL_IMAGE': + return payloadType === 'IMAGE_DTO'; + case 'SET_CONTROLNET_IMAGE': + return payloadType === 'IMAGE_DTO'; + case 'SET_CANVAS_INITIAL_IMAGE': + return payloadType === 'IMAGE_DTO'; + case 'SET_NODES_IMAGE': + return payloadType === 'IMAGE_DTO'; + case 'SET_MULTI_NODES_IMAGE': + return payloadType === 'IMAGE_DTO' || 'GALLERY_SELECTION'; + case 'ADD_TO_BATCH': + return payloadType === 'IMAGE_DTO' || 'GALLERY_SELECTION'; + case 'MOVE_BOARD': + return ( + payloadType === 'IMAGE_DTO' || 'GALLERY_SELECTION' || 'BATCH_SELECTION' + ); + default: + return false; + } +}; + +interface DragEvent { + activatorEvent: Event; + active: TypesafeActive; + collisions: Collision[] | null; + delta: Translate; + over: TypesafeOver | null; +} + +export interface DragStartEvent extends Pick {} +export interface DragMoveEvent extends DragEvent {} +export interface DragOverEvent extends DragMoveEvent {} +export interface DragEndEvent extends DragEvent {} +export interface DragCancelEvent extends DragEndEvent {} + +export interface DndContextTypesafeProps + extends Omit< + DndContextProps, + 'onDragStart' | 'onDragMove' | 'onDragOver' | 'onDragEnd' | 'onDragCancel' + > { + onDragStart?(event: DragStartEvent): void; + onDragMove?(event: DragMoveEvent): void; + onDragOver?(event: DragOverEvent): void; + onDragEnd?(event: DragEndEvent): void; + onDragCancel?(event: DragCancelEvent): void; +} +export function DndContext(props: DndContextTypesafeProps) { + return ; +} diff --git a/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx b/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx index 141e62652d..105f8f18d7 100644 --- a/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx +++ b/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx @@ -7,7 +7,6 @@ import React, { } from 'react'; import { Provider } from 'react-redux'; import { store } from 'app/store/store'; -import { OpenAPI } from 'services/api'; import Loading from '../../common/components/Loading/Loading'; import { addMiddleware, resetMiddlewares } from 'redux-dynamic-middlewares'; @@ -17,12 +16,9 @@ import '../../i18n'; import { socketMiddleware } from 'services/events/middleware'; import { Middleware } from '@reduxjs/toolkit'; import ImageDndContext from './ImageDnd/ImageDndContext'; -import { - DeleteImageContext, - DeleteImageContextProvider, -} from 'app/contexts/DeleteImageContext'; -import UpdateImageBoardModal from '../../features/gallery/components/Boards/UpdateImageBoardModal'; import { AddImageToBoardContextProvider } from '../contexts/AddImageToBoardContext'; +import { $authToken, $baseUrl } from 'services/api/client'; +import { DeleteBoardImagesContextProvider } from '../contexts/DeleteBoardImagesContext'; const App = lazy(() => import('./App')); const ThemeLocaleProvider = lazy(() => import('./ThemeLocaleProvider')); @@ -32,7 +28,6 @@ interface Props extends PropsWithChildren { token?: string; config?: PartialAppConfig; headerComponent?: ReactNode; - setIsReady?: (isReady: boolean) => void; middleware?: Middleware[]; } @@ -41,18 +36,17 @@ const InvokeAIUI = ({ token, config, headerComponent, - setIsReady, middleware, }: Props) => { useEffect(() => { // configure API client token if (token) { - OpenAPI.TOKEN = token; + $authToken.set(token); } // configure API client base url if (apiUrl) { - OpenAPI.BASE = apiUrl; + $baseUrl.set(apiUrl); } // reset dynamically added middlewares @@ -69,6 +63,12 @@ const InvokeAIUI = ({ } else { addMiddleware(socketMiddleware()); } + + return () => { + // Reset the API client token and base url on unmount + $baseUrl.set(undefined); + $authToken.set(undefined); + }; }, [apiUrl, token, middleware]); return ( @@ -77,15 +77,11 @@ const InvokeAIUI = ({ }> - - - - - + + + + + diff --git a/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx b/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx index 82065d83e3..1e86e0ce1b 100644 --- a/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx +++ b/invokeai/frontend/web/src/app/components/ThemeLocaleProvider.tsx @@ -3,18 +3,11 @@ import { createLocalStorageManager, extendTheme, } from '@chakra-ui/react'; -import { RootState } from 'app/store/store'; -import { useAppSelector } from 'app/store/storeHooks'; -import { ReactNode, useEffect } from 'react'; +import { ReactNode, useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { theme as invokeAITheme } from 'theme/theme'; -import { greenTeaThemeColors } from 'theme/colors/greenTea'; -import { invokeAIThemeColors } from 'theme/colors/invokeAI'; -import { lightThemeColors } from 'theme/colors/lightTheme'; -import { oceanBlueColors } from 'theme/colors/oceanBlue'; - -import '@fontsource/inter/variable.css'; +import '@fontsource-variable/inter'; import { MantineProvider } from '@mantine/core'; import { mantineTheme } from 'mantine-theme/theme'; import 'overlayscrollbars/overlayscrollbars.css'; @@ -24,29 +17,19 @@ type ThemeLocaleProviderProps = { children: ReactNode; }; -const THEMES = { - dark: invokeAIThemeColors, - light: lightThemeColors, - green: greenTeaThemeColors, - ocean: oceanBlueColors, -}; - const manager = createLocalStorageManager('@@invokeai-color-mode'); function ThemeLocaleProvider({ children }: ThemeLocaleProviderProps) { const { i18n } = useTranslation(); - const currentTheme = useAppSelector( - (state: RootState) => state.ui.currentTheme - ); - const direction = i18n.dir(); - const theme = extendTheme({ - ...invokeAITheme, - colors: THEMES[currentTheme as keyof typeof THEMES], - direction, - }); + const theme = useMemo(() => { + return extendTheme({ + ...invokeAITheme, + direction, + }); + }, [direction]); useEffect(() => { document.body.dir = direction; diff --git a/invokeai/frontend/web/src/app/contexts/AddImageToBoardContext.tsx b/invokeai/frontend/web/src/app/contexts/AddImageToBoardContext.tsx index f5a856d3d8..f37f06d4b1 100644 --- a/invokeai/frontend/web/src/app/contexts/AddImageToBoardContext.tsx +++ b/invokeai/frontend/web/src/app/contexts/AddImageToBoardContext.tsx @@ -1,7 +1,7 @@ import { useDisclosure } from '@chakra-ui/react'; import { PropsWithChildren, createContext, useCallback, useState } from 'react'; -import { ImageDTO } from 'services/api'; -import { useAddImageToBoardMutation } from 'services/apiSlice'; +import { ImageDTO } from 'services/api/types'; +import { useAddImageToBoardMutation } from 'services/api/endpoints/boardImages'; export type ImageUsage = { isInitialImage: boolean; diff --git a/invokeai/frontend/web/src/app/contexts/DeleteBoardImagesContext.tsx b/invokeai/frontend/web/src/app/contexts/DeleteBoardImagesContext.tsx new file mode 100644 index 0000000000..15f9fab282 --- /dev/null +++ b/invokeai/frontend/web/src/app/contexts/DeleteBoardImagesContext.tsx @@ -0,0 +1,170 @@ +import { useDisclosure } from '@chakra-ui/react'; +import { PropsWithChildren, createContext, useCallback, useState } from 'react'; +import { BoardDTO } from 'services/api/types'; +import { useDeleteBoardMutation } from '../../services/api/endpoints/boards'; +import { defaultSelectorOptions } from '../store/util/defaultMemoizeOptions'; +import { createSelector } from '@reduxjs/toolkit'; +import { some } from 'lodash-es'; +import { canvasSelector } from 'features/canvas/store/canvasSelectors'; +import { controlNetSelector } from 'features/controlNet/store/controlNetSlice'; +import { selectImagesById } from 'features/gallery/store/gallerySlice'; +import { nodesSelector } from 'features/nodes/store/nodesSlice'; +import { generationSelector } from 'features/parameters/store/generationSelectors'; +import { RootState } from '../store/store'; +import { useAppDispatch, useAppSelector } from '../store/storeHooks'; +import { ImageUsage } from './DeleteImageContext'; +import { requestedBoardImagesDeletion } from 'features/gallery/store/actions'; + +export const selectBoardImagesUsage = createSelector( + [ + (state: RootState) => state, + generationSelector, + canvasSelector, + nodesSelector, + controlNetSelector, + (state: RootState, board_id?: string) => board_id, + ], + (state, generation, canvas, nodes, controlNet, board_id) => { + const initialImage = generation.initialImage + ? selectImagesById(state, generation.initialImage.imageName) + : undefined; + const isInitialImage = initialImage?.board_id === board_id; + + const isCanvasImage = canvas.layerState.objects.some((obj) => { + if (obj.kind === 'image') { + const image = selectImagesById(state, obj.imageName); + return image?.board_id === board_id; + } + return false; + }); + + const isNodesImage = nodes.nodes.some((node) => { + return some(node.data.inputs, (input) => { + if (input.type === 'image' && input.value) { + const image = selectImagesById(state, input.value.image_name); + return image?.board_id === board_id; + } + return false; + }); + }); + + const isControlNetImage = some(controlNet.controlNets, (c) => { + const controlImage = c.controlImage + ? selectImagesById(state, c.controlImage) + : undefined; + const processedControlImage = c.processedControlImage + ? selectImagesById(state, c.processedControlImage) + : undefined; + return ( + controlImage?.board_id === board_id || + processedControlImage?.board_id === board_id + ); + }); + + const imageUsage: ImageUsage = { + isInitialImage, + isCanvasImage, + isNodesImage, + isControlNetImage, + }; + + return imageUsage; + }, + defaultSelectorOptions +); + +type DeleteBoardImagesContextValue = { + /** + * Whether the move image dialog is open. + */ + isOpen: boolean; + /** + * Closes the move image dialog. + */ + onClose: () => void; + imagesUsage?: ImageUsage; + board?: BoardDTO; + onClickDeleteBoardImages: (board: BoardDTO) => void; + handleDeleteBoardImages: (boardId: string) => void; + handleDeleteBoardOnly: (boardId: string) => void; +}; + +export const DeleteBoardImagesContext = + createContext({ + isOpen: false, + onClose: () => undefined, + onClickDeleteBoardImages: () => undefined, + handleDeleteBoardImages: () => undefined, + handleDeleteBoardOnly: () => undefined, + }); + +type Props = PropsWithChildren; + +export const DeleteBoardImagesContextProvider = (props: Props) => { + const [boardToDelete, setBoardToDelete] = useState(); + const { isOpen, onOpen, onClose } = useDisclosure(); + const dispatch = useAppDispatch(); + + // Check where the board images to be deleted are used (eg init image, controlnet, etc.) + const imagesUsage = useAppSelector((state) => + selectBoardImagesUsage(state, boardToDelete?.board_id) + ); + + const [deleteBoard] = useDeleteBoardMutation(); + + // Clean up after deleting or dismissing the modal + const closeAndClearBoardToDelete = useCallback(() => { + setBoardToDelete(undefined); + onClose(); + }, [onClose]); + + const onClickDeleteBoardImages = useCallback( + (board?: BoardDTO) => { + console.log({ board }); + if (!board) { + return; + } + setBoardToDelete(board); + onOpen(); + }, + [setBoardToDelete, onOpen] + ); + + const handleDeleteBoardImages = useCallback( + (boardId: string) => { + if (boardToDelete) { + dispatch( + requestedBoardImagesDeletion({ board: boardToDelete, imagesUsage }) + ); + closeAndClearBoardToDelete(); + } + }, + [dispatch, closeAndClearBoardToDelete, boardToDelete, imagesUsage] + ); + + const handleDeleteBoardOnly = useCallback( + (boardId: string) => { + if (boardToDelete) { + deleteBoard(boardId); + closeAndClearBoardToDelete(); + } + }, + [deleteBoard, closeAndClearBoardToDelete, boardToDelete] + ); + + return ( + + {props.children} + + ); +}; diff --git a/invokeai/frontend/web/src/app/contexts/DeleteImageContext.tsx b/invokeai/frontend/web/src/app/contexts/DeleteImageContext.tsx deleted file mode 100644 index d01298944b..0000000000 --- a/invokeai/frontend/web/src/app/contexts/DeleteImageContext.tsx +++ /dev/null @@ -1,201 +0,0 @@ -import { useDisclosure } from '@chakra-ui/react'; -import { createSelector } from '@reduxjs/toolkit'; -import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; -import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; -import { requestedImageDeletion } from 'features/gallery/store/actions'; -import { systemSelector } from 'features/system/store/systemSelectors'; -import { - PropsWithChildren, - createContext, - useCallback, - useEffect, - useState, -} from 'react'; -import { ImageDTO } from 'services/api'; -import { RootState } from 'app/store/store'; -import { canvasSelector } from 'features/canvas/store/canvasSelectors'; -import { controlNetSelector } from 'features/controlNet/store/controlNetSlice'; -import { nodesSelecter } from 'features/nodes/store/nodesSlice'; -import { generationSelector } from 'features/parameters/store/generationSelectors'; -import { some } from 'lodash-es'; - -export type ImageUsage = { - isInitialImage: boolean; - isCanvasImage: boolean; - isNodesImage: boolean; - isControlNetImage: boolean; -}; - -export const selectImageUsage = createSelector( - [ - generationSelector, - canvasSelector, - nodesSelecter, - controlNetSelector, - (state: RootState, image_name?: string) => image_name, - ], - (generation, canvas, nodes, controlNet, image_name) => { - const isInitialImage = generation.initialImage?.imageName === image_name; - - const isCanvasImage = canvas.layerState.objects.some( - (obj) => obj.kind === 'image' && obj.imageName === image_name - ); - - const isNodesImage = nodes.nodes.some((node) => { - return some( - node.data.inputs, - (input) => input.type === 'image' && input.value === image_name - ); - }); - - const isControlNetImage = some( - controlNet.controlNets, - (c) => - c.controlImage === image_name || c.processedControlImage === image_name - ); - - const imageUsage: ImageUsage = { - isInitialImage, - isCanvasImage, - isNodesImage, - isControlNetImage, - }; - - return imageUsage; - }, - defaultSelectorOptions -); - -type DeleteImageContextValue = { - /** - * Whether the delete image dialog is open. - */ - isOpen: boolean; - /** - * Closes the delete image dialog. - */ - onClose: () => void; - /** - * Opens the delete image dialog and handles all deletion-related checks. - */ - onDelete: (image?: ImageDTO) => void; - /** - * The image pending deletion - */ - image?: ImageDTO; - /** - * The features in which this image is used - */ - imageUsage?: ImageUsage; - /** - * Immediately deletes an image. - * - * You probably don't want to use this - use `onDelete` instead. - */ - onImmediatelyDelete: () => void; -}; - -export const DeleteImageContext = createContext({ - isOpen: false, - onClose: () => undefined, - onImmediatelyDelete: () => undefined, - onDelete: () => undefined, -}); - -const selector = createSelector( - [systemSelector], - (system) => { - const { isProcessing, isConnected, shouldConfirmOnDelete } = system; - - return { - canDeleteImage: isConnected && !isProcessing, - shouldConfirmOnDelete, - }; - }, - defaultSelectorOptions -); - -type Props = PropsWithChildren; - -export const DeleteImageContextProvider = (props: Props) => { - const { canDeleteImage, shouldConfirmOnDelete } = useAppSelector(selector); - const [imageToDelete, setImageToDelete] = useState(); - const dispatch = useAppDispatch(); - const { isOpen, onOpen, onClose } = useDisclosure(); - - // Check where the image to be deleted is used (eg init image, controlnet, etc.) - const imageUsage = useAppSelector((state) => - selectImageUsage(state, imageToDelete?.image_name) - ); - - // Clean up after deleting or dismissing the modal - const closeAndClearImageToDelete = useCallback(() => { - setImageToDelete(undefined); - onClose(); - }, [onClose]); - - // Dispatch the actual deletion action, to be handled by listener middleware - const handleActualDeletion = useCallback( - (image: ImageDTO) => { - dispatch(requestedImageDeletion({ image, imageUsage })); - closeAndClearImageToDelete(); - }, - [closeAndClearImageToDelete, dispatch, imageUsage] - ); - - // This is intended to be called by the delete button in the dialog - const onImmediatelyDelete = useCallback(() => { - if (canDeleteImage && imageToDelete) { - handleActualDeletion(imageToDelete); - } - closeAndClearImageToDelete(); - }, [ - canDeleteImage, - imageToDelete, - closeAndClearImageToDelete, - handleActualDeletion, - ]); - - const handleGatedDeletion = useCallback( - (image: ImageDTO) => { - if (shouldConfirmOnDelete || some(imageUsage)) { - // If we should confirm on delete, or if the image is in use, open the dialog - onOpen(); - } else { - handleActualDeletion(image); - } - }, - [imageUsage, shouldConfirmOnDelete, onOpen, handleActualDeletion] - ); - - // Consumers of the context call this to delete an image - const onDelete = useCallback((image?: ImageDTO) => { - if (!image) { - return; - } - // Set the image to delete, then let the effect call the actual deletion - setImageToDelete(image); - }, []); - - useEffect(() => { - // We need to use an effect here to trigger the image usage selector, else we get a stale value - if (imageToDelete) { - handleGatedDeletion(imageToDelete); - } - }, [handleGatedDeletion, imageToDelete]); - - return ( - - {props.children} - - ); -}; diff --git a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/serialize.ts b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/serialize.ts index cb18d48301..ac1b9c5205 100644 --- a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/serialize.ts +++ b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/serialize.ts @@ -20,10 +20,8 @@ const serializationDenylist: { nodes: nodesPersistDenylist, postprocessing: postprocessingPersistDenylist, system: systemPersistDenylist, - // config: configPersistDenyList, ui: uiPersistDenylist, controlNet: controlNetDenylist, - // hotkeys: hotkeysPersistDenylist, }; export const serialize: SerializeFunction = (data, key) => { diff --git a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/unserialize.ts b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/unserialize.ts index 8f40b0bb59..23e6448987 100644 --- a/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/unserialize.ts +++ b/invokeai/frontend/web/src/app/store/enhancers/reduxRemember/unserialize.ts @@ -1,7 +1,6 @@ import { initialCanvasState } from 'features/canvas/store/canvasSlice'; import { initialControlNetState } from 'features/controlNet/store/controlNetSlice'; import { initialGalleryState } from 'features/gallery/store/gallerySlice'; -import { initialImagesState } from 'features/gallery/store/imagesSlice'; import { initialLightboxState } from 'features/lightbox/store/lightboxSlice'; import { initialNodesState } from 'features/nodes/store/nodesSlice'; import { initialGenerationState } from 'features/parameters/store/generationSlice'; @@ -26,7 +25,6 @@ const initialStates: { config: initialConfigState, ui: initialUIState, hotkeys: initialHotkeysState, - images: initialImagesState, controlNet: initialControlNetState, }; diff --git a/invokeai/frontend/web/src/app/store/middleware/devtools/actionSanitizer.ts b/invokeai/frontend/web/src/app/store/middleware/devtools/actionSanitizer.ts index 24b85e0f83..143b16594c 100644 --- a/invokeai/frontend/web/src/app/store/middleware/devtools/actionSanitizer.ts +++ b/invokeai/frontend/web/src/app/store/middleware/devtools/actionSanitizer.ts @@ -1,24 +1,14 @@ import { AnyAction } from '@reduxjs/toolkit'; import { isAnyGraphBuilt } from 'features/nodes/store/actions'; -import { forEach } from 'lodash-es'; -import { Graph } from 'services/api'; +import { nodeTemplatesBuilt } from 'features/nodes/store/nodesSlice'; +import { receivedOpenAPISchema } from 'services/api/thunks/schema'; +import { Graph } from 'services/api/types'; export const actionSanitizer = (action: A): A => { if (isAnyGraphBuilt(action)) { if (action.payload.nodes) { const sanitizedNodes: Graph['nodes'] = {}; - // Sanitize nodes as needed - forEach(action.payload.nodes, (node, key) => { - // Don't log the whole freaking dataURL - if (node.type === 'dataURL_image') { - const { dataURL, ...rest } = node; - sanitizedNodes[key] = { ...rest, dataURL: '' }; - } else { - sanitizedNodes[key] = { ...node }; - } - }); - return { ...action, payload: { ...action.payload, nodes: sanitizedNodes }, @@ -26,5 +16,19 @@ export const actionSanitizer = (action: A): A => { } } + if (receivedOpenAPISchema.fulfilled.match(action)) { + return { + ...action, + payload: '', + }; + } + + if (nodeTemplatesBuilt.match(action)) { + return { + ...action, + payload: '', + }; + } + return action; }; diff --git a/invokeai/frontend/web/src/app/store/middleware/devtools/actionsDenylist.ts b/invokeai/frontend/web/src/app/store/middleware/devtools/actionsDenylist.ts index eb54868735..8a6e112d27 100644 --- a/invokeai/frontend/web/src/app/store/middleware/devtools/actionsDenylist.ts +++ b/invokeai/frontend/web/src/app/store/middleware/devtools/actionsDenylist.ts @@ -9,4 +9,5 @@ export const actionsDenylist = [ 'canvas/addPointToCurrentLine', 'socket/socketGeneratorProgress', 'socket/appSocketGeneratorProgress', + 'hotkeys/shiftKeyPressed', ]; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts index cb641d00db..8c5873903c 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/index.ts @@ -1,49 +1,69 @@ +import type { TypedAddListener, TypedStartListening } from '@reduxjs/toolkit'; import { - createListenerMiddleware, - addListener, - ListenerEffect, AnyAction, + ListenerEffect, + addListener, + createListenerMiddleware, } from '@reduxjs/toolkit'; -import type { TypedStartListening, TypedAddListener } from '@reduxjs/toolkit'; -import type { RootState, AppDispatch } from '../../store'; -import { addInitialImageSelectedListener } from './listeners/initialImageSelected'; +import type { AppDispatch, RootState } from '../../store'; +import { addCommitStagingAreaImageListener } from './listeners/addCommitStagingAreaImageListener'; +import { addAppConfigReceivedListener } from './listeners/appConfigReceived'; +import { addAppStartedListener } from './listeners/appStarted'; +import { addBoardIdSelectedListener } from './listeners/boardIdSelected'; +import { addRequestedBoardImageDeletionListener } from './listeners/boardImagesDeleted'; +import { addCanvasCopiedToClipboardListener } from './listeners/canvasCopiedToClipboard'; +import { addCanvasDownloadedAsImageListener } from './listeners/canvasDownloadedAsImage'; +import { addCanvasMergedListener } from './listeners/canvasMerged'; +import { addCanvasSavedToGalleryListener } from './listeners/canvasSavedToGallery'; +import { addControlNetAutoProcessListener } from './listeners/controlNetAutoProcess'; +import { addControlNetImageProcessedListener } from './listeners/controlNetImageProcessed'; import { - addImageUploadedFulfilledListener, - addImageUploadedRejectedListener, -} from './listeners/imageUploaded'; + addImageAddedToBoardFulfilledListener, + addImageAddedToBoardRejectedListener, +} from './listeners/imageAddedToBoard'; import { addImageDeletedFulfilledListener, addImageDeletedPendingListener, addImageDeletedRejectedListener, addRequestedImageDeletionListener, } from './listeners/imageDeleted'; -import { addUserInvokedCanvasListener } from './listeners/userInvokedCanvas'; -import { addUserInvokedNodesListener } from './listeners/userInvokedNodes'; -import { addUserInvokedTextToImageListener } from './listeners/userInvokedTextToImage'; -import { addUserInvokedImageToImageListener } from './listeners/userInvokedImageToImage'; -import { addCanvasSavedToGalleryListener } from './listeners/canvasSavedToGallery'; -import { addCanvasDownloadedAsImageListener } from './listeners/canvasDownloadedAsImage'; -import { addCanvasCopiedToClipboardListener } from './listeners/canvasCopiedToClipboard'; -import { addCanvasMergedListener } from './listeners/canvasMerged'; -import { addGeneratorProgressEventListener as addGeneratorProgressListener } from './listeners/socketio/socketGeneratorProgress'; -import { addGraphExecutionStateCompleteEventListener as addGraphExecutionStateCompleteListener } from './listeners/socketio/socketGraphExecutionStateComplete'; -import { addInvocationCompleteEventListener as addInvocationCompleteListener } from './listeners/socketio/socketInvocationComplete'; -import { addInvocationErrorEventListener as addInvocationErrorListener } from './listeners/socketio/socketInvocationError'; -import { addInvocationStartedEventListener as addInvocationStartedListener } from './listeners/socketio/socketInvocationStarted'; -import { addSocketConnectedEventListener as addSocketConnectedListener } from './listeners/socketio/socketConnected'; -import { addSocketDisconnectedEventListener as addSocketDisconnectedListener } from './listeners/socketio/socketDisconnected'; -import { addSocketSubscribedEventListener as addSocketSubscribedListener } from './listeners/socketio/socketSubscribed'; -import { addSocketUnsubscribedEventListener as addSocketUnsubscribedListener } from './listeners/socketio/socketUnsubscribed'; -import { addSessionReadyToInvokeListener } from './listeners/sessionReadyToInvoke'; +import { addImageDroppedListener } from './listeners/imageDropped'; import { addImageMetadataReceivedFulfilledListener, addImageMetadataReceivedRejectedListener, } from './listeners/imageMetadataReceived'; +import { + addImageRemovedFromBoardFulfilledListener, + addImageRemovedFromBoardRejectedListener, +} from './listeners/imageRemovedFromBoard'; +import { addImageToDeleteSelectedListener } from './listeners/imageToDeleteSelected'; +import { + addImageUpdatedFulfilledListener, + addImageUpdatedRejectedListener, +} from './listeners/imageUpdated'; +import { + addImageUploadedFulfilledListener, + addImageUploadedRejectedListener, +} from './listeners/imageUploaded'; import { addImageUrlsReceivedFulfilledListener, addImageUrlsReceivedRejectedListener, } from './listeners/imageUrlsReceived'; +import { addInitialImageSelectedListener } from './listeners/initialImageSelected'; +import { addModelSelectedListener } from './listeners/modelSelected'; +import { addModelsLoadedListener } from './listeners/modelsLoaded'; +import { addReceivedOpenAPISchemaListener } from './listeners/receivedOpenAPISchema'; +import { + addReceivedPageOfImagesFulfilledListener, + addReceivedPageOfImagesRejectedListener, +} from './listeners/receivedPageOfImages'; +import { addSelectionAddedToBatchListener } from './listeners/selectionAddedToBatch'; +import { + addSessionCanceledFulfilledListener, + addSessionCanceledPendingListener, + addSessionCanceledRejectedListener, +} from './listeners/sessionCanceled'; import { addSessionCreatedFulfilledListener, addSessionCreatedPendingListener, @@ -54,34 +74,21 @@ import { addSessionInvokedPendingListener, addSessionInvokedRejectedListener, } from './listeners/sessionInvoked'; -import { - addSessionCanceledFulfilledListener, - addSessionCanceledPendingListener, - addSessionCanceledRejectedListener, -} from './listeners/sessionCanceled'; -import { - addImageUpdatedFulfilledListener, - addImageUpdatedRejectedListener, -} from './listeners/imageUpdated'; -import { - addReceivedPageOfImagesFulfilledListener, - addReceivedPageOfImagesRejectedListener, -} from './listeners/receivedPageOfImages'; +import { addSessionReadyToInvokeListener } from './listeners/sessionReadyToInvoke'; +import { addSocketConnectedEventListener as addSocketConnectedListener } from './listeners/socketio/socketConnected'; +import { addSocketDisconnectedEventListener as addSocketDisconnectedListener } from './listeners/socketio/socketDisconnected'; +import { addGeneratorProgressEventListener as addGeneratorProgressListener } from './listeners/socketio/socketGeneratorProgress'; +import { addGraphExecutionStateCompleteEventListener as addGraphExecutionStateCompleteListener } from './listeners/socketio/socketGraphExecutionStateComplete'; +import { addInvocationCompleteEventListener as addInvocationCompleteListener } from './listeners/socketio/socketInvocationComplete'; +import { addInvocationErrorEventListener as addInvocationErrorListener } from './listeners/socketio/socketInvocationError'; +import { addInvocationStartedEventListener as addInvocationStartedListener } from './listeners/socketio/socketInvocationStarted'; +import { addSocketSubscribedEventListener as addSocketSubscribedListener } from './listeners/socketio/socketSubscribed'; +import { addSocketUnsubscribedEventListener as addSocketUnsubscribedListener } from './listeners/socketio/socketUnsubscribed'; import { addStagingAreaImageSavedListener } from './listeners/stagingAreaImageSaved'; -import { addCommitStagingAreaImageListener } from './listeners/addCommitStagingAreaImageListener'; -import { addImageCategoriesChangedListener } from './listeners/imageCategoriesChanged'; -import { addControlNetImageProcessedListener } from './listeners/controlNetImageProcessed'; -import { addControlNetAutoProcessListener } from './listeners/controlNetAutoProcess'; -import { addUpdateImageUrlsOnConnectListener } from './listeners/updateImageUrlsOnConnect'; -import { - addImageAddedToBoardFulfilledListener, - addImageAddedToBoardRejectedListener, -} from './listeners/imageAddedToBoard'; -import { addBoardIdSelectedListener } from './listeners/boardIdSelected'; -import { - addImageRemovedFromBoardFulfilledListener, - addImageRemovedFromBoardRejectedListener, -} from './listeners/imageRemovedFromBoard'; +import { addUserInvokedCanvasListener } from './listeners/userInvokedCanvas'; +import { addUserInvokedImageToImageListener } from './listeners/userInvokedImageToImage'; +import { addUserInvokedNodesListener } from './listeners/userInvokedNodes'; +import { addUserInvokedTextToImageListener } from './listeners/userInvokedTextToImage'; export const listenerMiddleware = createListenerMiddleware(); @@ -123,6 +130,8 @@ addRequestedImageDeletionListener(); addImageDeletedPendingListener(); addImageDeletedFulfilledListener(); addImageDeletedRejectedListener(); +addRequestedBoardImageDeletionListener(); +addImageToDeleteSelectedListener(); // Image metadata addImageMetadataReceivedFulfilledListener(); @@ -189,15 +198,12 @@ addSessionCanceledRejectedListener(); addReceivedPageOfImagesFulfilledListener(); addReceivedPageOfImagesRejectedListener(); -// Gallery -addImageCategoriesChangedListener(); - // ControlNet addControlNetImageProcessedListener(); addControlNetAutoProcessListener(); // Update image URLs on connect -addUpdateImageUrlsOnConnectListener(); +// addUpdateImageUrlsOnConnectListener(); // Boards addImageAddedToBoardFulfilledListener(); @@ -205,3 +211,20 @@ addImageAddedToBoardRejectedListener(); addImageRemovedFromBoardFulfilledListener(); addImageRemovedFromBoardRejectedListener(); addBoardIdSelectedListener(); + +// Node schemas +addReceivedOpenAPISchemaListener(); + +// Batches +addSelectionAddedToBatchListener(); + +// DND +addImageDroppedListener(); + +// Models +addModelSelectedListener(); + +// app startup +addAppStartedListener(); +addModelsLoadedListener(); +addAppConfigReceivedListener(); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addCommitStagingAreaImageListener.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addCommitStagingAreaImageListener.ts index 90f71879a1..322cc51fa7 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addCommitStagingAreaImageListener.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/addCommitStagingAreaImageListener.ts @@ -1,7 +1,7 @@ import { startAppListening } from '..'; import { log } from 'app/logging/useLogger'; import { commitStagingAreaImage } from 'features/canvas/store/canvasSlice'; -import { sessionCanceled } from 'services/thunks/session'; +import { sessionCanceled } from 'services/api/thunks/session'; const moduleLog = log.child({ namespace: 'canvas' }); @@ -10,7 +10,7 @@ export const addCommitStagingAreaImageListener = () => { actionCreator: commitStagingAreaImage, effect: async (action, { dispatch, getState }) => { const state = getState(); - const { sessionId, isProcessing } = state.system; + const { sessionId: session_id, isProcessing } = state.system; const canvasSessionId = action.payload; if (!isProcessing) { @@ -23,12 +23,12 @@ export const addCommitStagingAreaImageListener = () => { return; } - if (canvasSessionId !== sessionId) { + if (canvasSessionId !== session_id) { moduleLog.debug( { data: { canvasSessionId, - sessionId, + session_id, }, }, 'Canvas session does not match global session, skipping cancel' @@ -36,7 +36,7 @@ export const addCommitStagingAreaImageListener = () => { return; } - dispatch(sessionCanceled({ sessionId })); + dispatch(sessionCanceled({ session_id })); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appConfigReceived.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appConfigReceived.ts new file mode 100644 index 0000000000..68148a192f --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appConfigReceived.ts @@ -0,0 +1,17 @@ +import { setInfillMethod } from 'features/parameters/store/generationSlice'; +import { appInfoApi } from 'services/api/endpoints/appInfo'; +import { startAppListening } from '..'; + +export const addAppConfigReceivedListener = () => { + startAppListening({ + matcher: appInfoApi.endpoints.getAppConfig.matchFulfilled, + effect: async (action, { getState, dispatch }) => { + const { infill_methods } = action.payload; + const infillMethod = getState().generation.infillMethod; + + if (!infill_methods.includes(infillMethod)) { + dispatch(setInfillMethod(infill_methods[0])); + } + }, + }); +}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appStarted.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appStarted.ts new file mode 100644 index 0000000000..dc38ba911a --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/appStarted.ts @@ -0,0 +1,43 @@ +import { createAction } from '@reduxjs/toolkit'; +import { + INITIAL_IMAGE_LIMIT, + isLoadingChanged, +} from 'features/gallery/store/gallerySlice'; +import { receivedPageOfImages } from 'services/api/thunks/image'; +import { startAppListening } from '..'; + +export const appStarted = createAction('app/appStarted'); + +export const addAppStartedListener = () => { + startAppListening({ + actionCreator: appStarted, + effect: async ( + action, + { getState, dispatch, unsubscribe, cancelActiveListeners } + ) => { + cancelActiveListeners(); + unsubscribe(); + // fill up the gallery tab with images + await dispatch( + receivedPageOfImages({ + categories: ['general'], + is_intermediate: false, + offset: 0, + limit: INITIAL_IMAGE_LIMIT, + }) + ); + + // fill up the assets tab with images + await dispatch( + receivedPageOfImages({ + categories: ['control', 'mask', 'user', 'other'], + is_intermediate: false, + offset: 0, + limit: INITIAL_IMAGE_LIMIT, + }) + ); + + dispatch(isLoadingChanged(false)); + }, + }); +}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts index eab4389ceb..6ce6665cc5 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardIdSelected.ts @@ -1,10 +1,15 @@ import { log } from 'app/logging/useLogger'; import { startAppListening } from '..'; -import { boardIdSelected } from 'features/gallery/store/boardSlice'; -import { selectImagesAll } from 'features/gallery/store/imagesSlice'; -import { IMAGES_PER_PAGE, receivedPageOfImages } from 'services/thunks/image'; -import { api } from 'services/apiSlice'; -import { imageSelected } from 'features/gallery/store/gallerySlice'; +import { + imageSelected, + selectImagesAll, + boardIdSelected, +} from 'features/gallery/store/gallerySlice'; +import { + IMAGES_PER_PAGE, + receivedPageOfImages, +} from 'services/api/thunks/image'; +import { boardsApi } from 'services/api/endpoints/boards'; const moduleLog = log.child({ namespace: 'boards' }); @@ -12,30 +17,31 @@ export const addBoardIdSelectedListener = () => { startAppListening({ actionCreator: boardIdSelected, effect: (action, { getState, dispatch }) => { - const boardId = action.payload; + const board_id = action.payload; // we need to check if we need to fetch more images const state = getState(); const allImages = selectImagesAll(state); - if (!boardId) { + if (!board_id) { // a board was unselected dispatch(imageSelected(allImages[0]?.image_name)); return; } - const { categories } = state.images; + const { categories } = state.gallery; const filteredImages = allImages.filter((i) => { const isInCategory = categories.includes(i.image_category); - const isInSelectedBoard = boardId ? i.board_id === boardId : true; + const isInSelectedBoard = board_id ? i.board_id === board_id : true; return isInCategory && isInSelectedBoard; }); // get the board from the cache - const { data: boards } = api.endpoints.listAllBoards.select()(state); - const board = boards?.find((b) => b.board_id === boardId); + const { data: boards } = + boardsApi.endpoints.listAllBoards.select()(state); + const board = boards?.find((b) => b.board_id === board_id); if (!board) { // can't find the board in cache... @@ -43,14 +49,16 @@ export const addBoardIdSelectedListener = () => { return; } - dispatch(imageSelected(board.cover_image_name)); + dispatch(imageSelected(board.cover_image_name ?? null)); // if we haven't loaded one full page of images from this board, load more if ( filteredImages.length < board.image_count && filteredImages.length < IMAGES_PER_PAGE ) { - dispatch(receivedPageOfImages({ categories, boardId })); + dispatch( + receivedPageOfImages({ categories, board_id, is_intermediate: false }) + ); } }, }); @@ -60,28 +68,29 @@ export const addBoardIdSelected_changeSelectedImage_listener = () => { startAppListening({ actionCreator: boardIdSelected, effect: (action, { getState, dispatch }) => { - const boardId = action.payload; + const board_id = action.payload; const state = getState(); // we need to check if we need to fetch more images - if (!boardId) { + if (!board_id) { // a board was unselected - we don't need to do anything return; } - const { categories } = state.images; + const { categories } = state.gallery; const filteredImages = selectImagesAll(state).filter((i) => { const isInCategory = categories.includes(i.image_category); - const isInSelectedBoard = boardId ? i.board_id === boardId : true; + const isInSelectedBoard = board_id ? i.board_id === board_id : true; return isInCategory && isInSelectedBoard; }); // get the board from the cache - const { data: boards } = api.endpoints.listAllBoards.select()(state); - const board = boards?.find((b) => b.board_id === boardId); + const { data: boards } = + boardsApi.endpoints.listAllBoards.select()(state); + const board = boards?.find((b) => b.board_id === board_id); if (!board) { // can't find the board in cache... return; @@ -92,7 +101,9 @@ export const addBoardIdSelected_changeSelectedImage_listener = () => { filteredImages.length < board.image_count && filteredImages.length < IMAGES_PER_PAGE ) { - dispatch(receivedPageOfImages({ categories, boardId })); + dispatch( + receivedPageOfImages({ categories, board_id, is_intermediate: false }) + ); } }, }); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardImagesDeleted.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardImagesDeleted.ts new file mode 100644 index 0000000000..4b48aa4626 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/boardImagesDeleted.ts @@ -0,0 +1,82 @@ +import { requestedBoardImagesDeletion } from 'features/gallery/store/actions'; +import { startAppListening } from '..'; +import { + imageSelected, + imagesRemoved, + selectImagesAll, + selectImagesById, +} from 'features/gallery/store/gallerySlice'; +import { resetCanvas } from 'features/canvas/store/canvasSlice'; +import { controlNetReset } from 'features/controlNet/store/controlNetSlice'; +import { clearInitialImage } from 'features/parameters/store/generationSlice'; +import { nodeEditorReset } from 'features/nodes/store/nodesSlice'; +import { LIST_TAG, api } from 'services/api'; +import { boardsApi } from '../../../../../services/api/endpoints/boards'; + +export const addRequestedBoardImageDeletionListener = () => { + startAppListening({ + actionCreator: requestedBoardImagesDeletion, + effect: async (action, { dispatch, getState, condition }) => { + const { board, imagesUsage } = action.payload; + + const { board_id } = board; + + const state = getState(); + const selectedImageName = + state.gallery.selection[state.gallery.selection.length - 1]; + + const selectedImage = selectedImageName + ? selectImagesById(state, selectedImageName) + : undefined; + + if (selectedImage && selectedImage.board_id === board_id) { + dispatch(imageSelected(null)); + } + + // We need to reset the features where the board images are in use - none of these work if their image(s) don't exist + + if (imagesUsage.isCanvasImage) { + dispatch(resetCanvas()); + } + + if (imagesUsage.isControlNetImage) { + dispatch(controlNetReset()); + } + + if (imagesUsage.isInitialImage) { + dispatch(clearInitialImage()); + } + + if (imagesUsage.isNodesImage) { + dispatch(nodeEditorReset()); + } + + // Preemptively remove from gallery + const images = selectImagesAll(state).reduce((acc: string[], img) => { + if (img.board_id === board_id) { + acc.push(img.image_name); + } + return acc; + }, []); + dispatch(imagesRemoved(images)); + + // Delete from server + dispatch(boardsApi.endpoints.deleteBoardAndImages.initiate(board_id)); + const result = + boardsApi.endpoints.deleteBoardAndImages.select(board_id)(state); + const { isSuccess } = result; + + // Wait for successful deletion, then trigger boards to re-fetch + const wasBoardDeleted = await condition(() => !!isSuccess, 30000); + + if (wasBoardDeleted) { + dispatch( + api.util.invalidateTags([ + { type: 'Board', id: board_id }, + { type: 'Image', id: LIST_TAG }, + ]) + ); + } + }, + }); +}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMerged.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMerged.ts index dd77e66c67..ce135ab3d0 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMerged.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasMerged.ts @@ -2,7 +2,7 @@ import { canvasMerged } from 'features/canvas/store/actions'; import { startAppListening } from '..'; import { log } from 'app/logging/useLogger'; import { addToast } from 'features/system/store/systemSlice'; -import { imageUploaded } from 'services/thunks/image'; +import { imageUploaded } from 'services/api/thunks/image'; import { setMergedCanvas } from 'features/canvas/store/canvasSlice'; import { getCanvasBaseLayer } from 'features/canvas/util/konvaInstanceProvider'; import { getFullBaseLayerBlob } from 'features/canvas/util/getFullBaseLayerBlob'; @@ -47,13 +47,11 @@ export const addCanvasMergedListener = () => { const imageUploadedRequest = dispatch( imageUploaded({ - formData: { - file: new File([blob], 'mergedCanvas.png', { - type: 'image/png', - }), - }, - imageCategory: 'general', - isIntermediate: true, + file: new File([blob], 'mergedCanvas.png', { + type: 'image/png', + }), + image_category: 'general', + is_intermediate: true, postUploadAction: { type: 'TOAST_CANVAS_MERGED', }, @@ -68,13 +66,13 @@ export const addCanvasMergedListener = () => { uploadedImageAction.meta.requestId === imageUploadedRequest.requestId ); - const mergedCanvasImage = payload; + const { image_name } = payload; dispatch( setMergedCanvas({ kind: 'image', layer: 'base', - image: mergedCanvasImage, + imageName: image_name, ...baseLayerRect, }) ); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasSavedToGallery.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasSavedToGallery.ts index b53b08cd27..610d89873f 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasSavedToGallery.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/canvasSavedToGallery.ts @@ -1,10 +1,10 @@ import { canvasSavedToGallery } from 'features/canvas/store/actions'; import { startAppListening } from '..'; import { log } from 'app/logging/useLogger'; -import { imageUploaded } from 'services/thunks/image'; +import { imageUploaded } from 'services/api/thunks/image'; import { getBaseLayerBlob } from 'features/canvas/util/getBaseLayerBlob'; import { addToast } from 'features/system/store/systemSlice'; -import { imageUpserted } from 'features/gallery/store/imagesSlice'; +import { imageUpserted } from 'features/gallery/store/gallerySlice'; const moduleLog = log.child({ namespace: 'canvasSavedToGalleryListener' }); @@ -30,13 +30,11 @@ export const addCanvasSavedToGalleryListener = () => { const imageUploadedRequest = dispatch( imageUploaded({ - formData: { - file: new File([blob], 'savedCanvas.png', { - type: 'image/png', - }), - }, - imageCategory: 'general', - isIntermediate: false, + file: new File([blob], 'savedCanvas.png', { + type: 'image/png', + }), + image_category: 'general', + is_intermediate: false, postUploadAction: { type: 'TOAST_CANVAS_SAVED_TO_GALLERY', }, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts index 7ff9a5118c..42387b8078 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/controlNetImageProcessed.ts @@ -1,14 +1,13 @@ -import { startAppListening } from '..'; -import { imageMetadataReceived } from 'services/thunks/image'; import { log } from 'app/logging/useLogger'; import { controlNetImageProcessed } from 'features/controlNet/store/actions'; -import { Graph } from 'services/api'; -import { sessionCreated } from 'services/thunks/session'; -import { sessionReadyToInvoke } from 'features/system/store/actions'; -import { socketInvocationComplete } from 'services/events/actions'; -import { isImageOutput } from 'services/types/guards'; import { controlNetProcessedImageChanged } from 'features/controlNet/store/controlNetSlice'; -import { pick } from 'lodash-es'; +import { sessionReadyToInvoke } from 'features/system/store/actions'; +import { isImageOutput } from 'services/api/guards'; +import { imageDTOReceived } from 'services/api/thunks/image'; +import { sessionCreated } from 'services/api/thunks/session'; +import { Graph } from 'services/api/types'; +import { socketInvocationComplete } from 'services/events/actions'; +import { startAppListening } from '..'; const moduleLog = log.child({ namespace: 'controlNet' }); @@ -64,10 +63,8 @@ export const addControlNetImageProcessedListener = () => { // Wait for the ImageDTO to be received const [imageMetadataReceivedAction] = await take( - ( - action - ): action is ReturnType => - imageMetadataReceived.fulfilled.match(action) && + (action): action is ReturnType => + imageDTOReceived.fulfilled.match(action) && action.payload.image_name === image_name ); const processedControlImage = imageMetadataReceivedAction.payload; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageAddedToBoard.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageAddedToBoard.ts index 0f404cab68..e4d8c74bf9 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageAddedToBoard.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageAddedToBoard.ts @@ -1,13 +1,13 @@ import { log } from 'app/logging/useLogger'; +import { boardImagesApi } from 'services/api/endpoints/boardImages'; +import { imageDTOReceived } from 'services/api/thunks/image'; import { startAppListening } from '..'; -import { imageMetadataReceived } from 'services/thunks/image'; -import { api } from 'services/apiSlice'; const moduleLog = log.child({ namespace: 'boards' }); export const addImageAddedToBoardFulfilledListener = () => { startAppListening({ - matcher: api.endpoints.addImageToBoard.matchFulfilled, + matcher: boardImagesApi.endpoints.addImageToBoard.matchFulfilled, effect: (action, { getState, dispatch }) => { const { board_id, image_name } = action.meta.arg.originalArgs; @@ -17,8 +17,8 @@ export const addImageAddedToBoardFulfilledListener = () => { ); dispatch( - imageMetadataReceived({ - imageName: image_name, + imageDTOReceived({ + image_name, }) ); }, @@ -27,7 +27,7 @@ export const addImageAddedToBoardFulfilledListener = () => { export const addImageAddedToBoardRejectedListener = () => { startAppListening({ - matcher: api.endpoints.addImageToBoard.matchRejected, + matcher: boardImagesApi.endpoints.addImageToBoard.matchRejected, effect: (action, { getState, dispatch }) => { const { board_id, image_name } = action.meta.arg.originalArgs; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageCategoriesChanged.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageCategoriesChanged.ts deleted file mode 100644 index 8f01b8d7b8..0000000000 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageCategoriesChanged.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { log } from 'app/logging/useLogger'; -import { startAppListening } from '..'; -import { receivedPageOfImages } from 'services/thunks/image'; -import { - imageCategoriesChanged, - selectFilteredImagesAsArray, -} from 'features/gallery/store/imagesSlice'; - -const moduleLog = log.child({ namespace: 'gallery' }); - -export const addImageCategoriesChangedListener = () => { - startAppListening({ - actionCreator: imageCategoriesChanged, - effect: (action, { getState, dispatch }) => { - const state = getState(); - const filteredImagesCount = selectFilteredImagesAsArray(state).length; - - if (!filteredImagesCount) { - dispatch( - receivedPageOfImages({ - categories: action.payload, - boardId: state.boards.selectedBoardId, - }) - ); - } - }, - }); -}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts index 224aa0d2aa..f083a716a4 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDeleted.ts @@ -1,18 +1,21 @@ -import { requestedImageDeletion } from 'features/gallery/store/actions'; -import { startAppListening } from '..'; -import { imageDeleted } from 'services/thunks/image'; import { log } from 'app/logging/useLogger'; -import { clamp } from 'lodash-es'; -import { imageSelected } from 'features/gallery/store/gallerySlice'; -import { - imageRemoved, - selectImagesIds, -} from 'features/gallery/store/imagesSlice'; import { resetCanvas } from 'features/canvas/store/canvasSlice'; import { controlNetReset } from 'features/controlNet/store/controlNetSlice'; -import { clearInitialImage } from 'features/parameters/store/generationSlice'; +import { + imageRemoved, + imageSelected, + selectFilteredImages, +} from 'features/gallery/store/gallerySlice'; +import { + imageDeletionConfirmed, + isModalOpenChanged, +} from 'features/imageDeletion/store/imageDeletionSlice'; import { nodeEditorReset } from 'features/nodes/store/nodesSlice'; -import { api } from 'services/apiSlice'; +import { clearInitialImage } from 'features/parameters/store/generationSlice'; +import { clamp } from 'lodash-es'; +import { api } from 'services/api'; +import { imageDeleted } from 'services/api/thunks/image'; +import { startAppListening } from '..'; const moduleLog = log.child({ namespace: 'image' }); @@ -21,17 +24,22 @@ const moduleLog = log.child({ namespace: 'image' }); */ export const addRequestedImageDeletionListener = () => { startAppListening({ - actionCreator: requestedImageDeletion, + actionCreator: imageDeletionConfirmed, effect: async (action, { dispatch, getState, condition }) => { - const { image, imageUsage } = action.payload; + const { imageDTO, imageUsage } = action.payload; - const { image_name } = image; + dispatch(isModalOpenChanged(false)); + + const { image_name } = imageDTO; const state = getState(); - const selectedImage = state.gallery.selectedImage; + const lastSelectedImage = + state.gallery.selection[state.gallery.selection.length - 1]; - if (selectedImage === image_name) { - const ids = selectImagesIds(state); + if (lastSelectedImage === image_name) { + const filteredImages = selectFilteredImages(state); + + const ids = filteredImages.map((i) => i.image_name); const deletedImageIndex = ids.findIndex( (result) => result.toString() === image_name @@ -50,7 +58,7 @@ export const addRequestedImageDeletionListener = () => { if (newSelectedImageId) { dispatch(imageSelected(newSelectedImageId as string)); } else { - dispatch(imageSelected()); + dispatch(imageSelected(null)); } } @@ -76,7 +84,7 @@ export const addRequestedImageDeletionListener = () => { dispatch(imageRemoved(image_name)); // Delete from server - const { requestId } = dispatch(imageDeleted({ imageName: image_name })); + const { requestId } = dispatch(imageDeleted({ image_name })); // Wait for successful deletion, then trigger boards to re-fetch const wasImageDeleted = await condition( @@ -88,7 +96,7 @@ export const addRequestedImageDeletionListener = () => { if (wasImageDeleted) { dispatch( - api.util.invalidateTags([{ type: 'Board', id: image.board_id }]) + api.util.invalidateTags([{ type: 'Board', id: imageDTO.board_id }]) ); } }, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDropped.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDropped.ts new file mode 100644 index 0000000000..24a5bffec7 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageDropped.ts @@ -0,0 +1,188 @@ +import { createAction } from '@reduxjs/toolkit'; +import { + TypesafeDraggableData, + TypesafeDroppableData, +} from 'app/components/ImageDnd/typesafeDnd'; +import { log } from 'app/logging/useLogger'; +import { + imageAddedToBatch, + imagesAddedToBatch, +} from 'features/batch/store/batchSlice'; +import { setInitialCanvasImage } from 'features/canvas/store/canvasSlice'; +import { controlNetImageChanged } from 'features/controlNet/store/controlNetSlice'; +import { imageSelected } from 'features/gallery/store/gallerySlice'; +import { + fieldValueChanged, + imageCollectionFieldValueChanged, +} from 'features/nodes/store/nodesSlice'; +import { initialImageChanged } from 'features/parameters/store/generationSlice'; +import { boardImagesApi } from 'services/api/endpoints/boardImages'; +import { startAppListening } from '../'; + +const moduleLog = log.child({ namespace: 'dnd' }); + +export const imageDropped = createAction<{ + overData: TypesafeDroppableData; + activeData: TypesafeDraggableData; +}>('dnd/imageDropped'); + +export const addImageDroppedListener = () => { + startAppListening({ + actionCreator: imageDropped, + effect: (action, { dispatch, getState }) => { + const { activeData, overData } = action.payload; + const { actionType } = overData; + const state = getState(); + + // set current image + if ( + actionType === 'SET_CURRENT_IMAGE' && + activeData.payloadType === 'IMAGE_DTO' && + activeData.payload.imageDTO + ) { + dispatch(imageSelected(activeData.payload.imageDTO.image_name)); + } + + // set initial image + if ( + actionType === 'SET_INITIAL_IMAGE' && + activeData.payloadType === 'IMAGE_DTO' && + activeData.payload.imageDTO + ) { + dispatch(initialImageChanged(activeData.payload.imageDTO)); + } + + // add image to batch + if ( + actionType === 'ADD_TO_BATCH' && + activeData.payloadType === 'IMAGE_DTO' && + activeData.payload.imageDTO + ) { + dispatch(imageAddedToBatch(activeData.payload.imageDTO.image_name)); + } + + // add multiple images to batch + if ( + actionType === 'ADD_TO_BATCH' && + activeData.payloadType === 'GALLERY_SELECTION' + ) { + dispatch(imagesAddedToBatch(state.gallery.selection)); + } + + // set control image + if ( + actionType === 'SET_CONTROLNET_IMAGE' && + activeData.payloadType === 'IMAGE_DTO' && + activeData.payload.imageDTO + ) { + const { controlNetId } = overData.context; + dispatch( + controlNetImageChanged({ + controlImage: activeData.payload.imageDTO.image_name, + controlNetId, + }) + ); + } + + // set canvas image + if ( + actionType === 'SET_CANVAS_INITIAL_IMAGE' && + activeData.payloadType === 'IMAGE_DTO' && + activeData.payload.imageDTO + ) { + dispatch(setInitialCanvasImage(activeData.payload.imageDTO)); + } + + // set nodes image + if ( + actionType === 'SET_NODES_IMAGE' && + activeData.payloadType === 'IMAGE_DTO' && + activeData.payload.imageDTO + ) { + const { fieldName, nodeId } = overData.context; + dispatch( + fieldValueChanged({ + nodeId, + fieldName, + value: activeData.payload.imageDTO, + }) + ); + } + + // set multiple nodes images (single image handler) + if ( + actionType === 'SET_MULTI_NODES_IMAGE' && + activeData.payloadType === 'IMAGE_DTO' && + activeData.payload.imageDTO + ) { + const { fieldName, nodeId } = overData.context; + dispatch( + fieldValueChanged({ + nodeId, + fieldName, + value: [activeData.payload.imageDTO], + }) + ); + } + + // set multiple nodes images (multiple images handler) + if ( + actionType === 'SET_MULTI_NODES_IMAGE' && + activeData.payloadType === 'GALLERY_SELECTION' + ) { + const { fieldName, nodeId } = overData.context; + dispatch( + imageCollectionFieldValueChanged({ + nodeId, + fieldName, + value: state.gallery.selection.map((image_name) => ({ + image_name, + })), + }) + ); + } + + // remove image from board + // TODO: remove board_id from `removeImageFromBoard()` endpoint + // TODO: handle multiple images + // if ( + // actionType === 'MOVE_BOARD' && + // activeData.payloadType === 'IMAGE_DTO' && + // activeData.payload.imageDTO && + // overData.boardId !== null + // ) { + // const { image_name } = activeData.payload.imageDTO; + // dispatch( + // boardImagesApi.endpoints.removeImageFromBoard.initiate({ image_name }) + // ); + // } + + // add image to board + if ( + actionType === 'MOVE_BOARD' && + activeData.payloadType === 'IMAGE_DTO' && + activeData.payload.imageDTO && + overData.context.boardId + ) { + const { image_name } = activeData.payload.imageDTO; + const { boardId } = overData.context; + dispatch( + boardImagesApi.endpoints.addImageToBoard.initiate({ + image_name, + board_id: boardId, + }) + ); + } + + // add multiple images to board + // TODO: add endpoint + // if ( + // actionType === 'ADD_TO_BATCH' && + // activeData.payloadType === 'IMAGE_NAMES' && + // activeData.payload.imageDTONames + // ) { + // dispatch(boardImagesApi.endpoints.addImagesToBoard.intiate({})); + // } + }, + }); +}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageMetadataReceived.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageMetadataReceived.ts index ed308f08a8..8a6d069ab0 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageMetadataReceived.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageMetadataReceived.ts @@ -1,13 +1,13 @@ import { log } from 'app/logging/useLogger'; +import { imageUpserted } from 'features/gallery/store/gallerySlice'; +import { imageDTOReceived, imageUpdated } from 'services/api/thunks/image'; import { startAppListening } from '..'; -import { imageMetadataReceived, imageUpdated } from 'services/thunks/image'; -import { imageUpserted } from 'features/gallery/store/imagesSlice'; const moduleLog = log.child({ namespace: 'image' }); export const addImageMetadataReceivedFulfilledListener = () => { startAppListening({ - actionCreator: imageMetadataReceived.fulfilled, + actionCreator: imageDTOReceived.fulfilled, effect: (action, { getState, dispatch }) => { const image = action.payload; @@ -19,8 +19,8 @@ export const addImageMetadataReceivedFulfilledListener = () => { ) { dispatch( imageUpdated({ - imageName: image.image_name, - requestBody: { is_intermediate: false }, + image_name: image.image_name, + is_intermediate: image.is_intermediate, }) ); } else if (image.is_intermediate) { @@ -40,7 +40,7 @@ export const addImageMetadataReceivedFulfilledListener = () => { export const addImageMetadataReceivedRejectedListener = () => { startAppListening({ - actionCreator: imageMetadataReceived.rejected, + actionCreator: imageDTOReceived.rejected, effect: (action, { getState, dispatch }) => { moduleLog.debug( { data: { image: action.meta.arg } }, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageRemovedFromBoard.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageRemovedFromBoard.ts index 40847ade3a..4cf144211c 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageRemovedFromBoard.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageRemovedFromBoard.ts @@ -1,13 +1,13 @@ import { log } from 'app/logging/useLogger'; +import { boardImagesApi } from 'services/api/endpoints/boardImages'; +import { imageDTOReceived } from 'services/api/thunks/image'; import { startAppListening } from '..'; -import { imageMetadataReceived } from 'services/thunks/image'; -import { api } from 'services/apiSlice'; const moduleLog = log.child({ namespace: 'boards' }); export const addImageRemovedFromBoardFulfilledListener = () => { startAppListening({ - matcher: api.endpoints.removeImageFromBoard.matchFulfilled, + matcher: boardImagesApi.endpoints.removeImageFromBoard.matchFulfilled, effect: (action, { getState, dispatch }) => { const { board_id, image_name } = action.meta.arg.originalArgs; @@ -17,8 +17,8 @@ export const addImageRemovedFromBoardFulfilledListener = () => { ); dispatch( - imageMetadataReceived({ - imageName: image_name, + imageDTOReceived({ + image_name, }) ); }, @@ -27,7 +27,7 @@ export const addImageRemovedFromBoardFulfilledListener = () => { export const addImageRemovedFromBoardRejectedListener = () => { startAppListening({ - matcher: api.endpoints.removeImageFromBoard.matchRejected, + matcher: boardImagesApi.endpoints.removeImageFromBoard.matchRejected, effect: (action, { getState, dispatch }) => { const { board_id, image_name } = action.meta.arg.originalArgs; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageToDeleteSelected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageToDeleteSelected.ts new file mode 100644 index 0000000000..531981126a --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageToDeleteSelected.ts @@ -0,0 +1,40 @@ +import { startAppListening } from '..'; +import { log } from 'app/logging/useLogger'; +import { + imageDeletionConfirmed, + imageToDeleteSelected, + isModalOpenChanged, + selectImageUsage, +} from 'features/imageDeletion/store/imageDeletionSlice'; + +const moduleLog = log.child({ namespace: 'image' }); + +export const addImageToDeleteSelectedListener = () => { + startAppListening({ + actionCreator: imageToDeleteSelected, + effect: async (action, { dispatch, getState, condition }) => { + const imageDTO = action.payload; + const state = getState(); + const { shouldConfirmOnDelete } = state.system; + const imageUsage = selectImageUsage(getState()); + + if (!imageUsage) { + // should never happen + return; + } + + const isImageInUse = + imageUsage.isCanvasImage || + imageUsage.isInitialImage || + imageUsage.isControlNetImage || + imageUsage.isNodesImage; + + if (shouldConfirmOnDelete || isImageInUse) { + dispatch(isModalOpenChanged(true)); + return; + } + + dispatch(imageDeletionConfirmed({ imageDTO, imageUsage })); + }, + }); +}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUpdated.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUpdated.ts index 6f8b46ec23..2e235aeb33 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUpdated.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUpdated.ts @@ -1,5 +1,5 @@ import { startAppListening } from '..'; -import { imageUpdated } from 'services/thunks/image'; +import { imageUpdated } from 'services/api/thunks/image'; import { log } from 'app/logging/useLogger'; const moduleLog = log.child({ namespace: 'image' }); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts index fc44d206c8..0cd852c3de 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUploaded.ts @@ -1,12 +1,13 @@ import { startAppListening } from '..'; -import { imageUploaded } from 'services/thunks/image'; +import { imageUploaded } from 'services/api/thunks/image'; import { addToast } from 'features/system/store/systemSlice'; import { log } from 'app/logging/useLogger'; -import { imageUpserted } from 'features/gallery/store/imagesSlice'; +import { imageUpserted } from 'features/gallery/store/gallerySlice'; import { setInitialCanvasImage } from 'features/canvas/store/canvasSlice'; import { controlNetImageChanged } from 'features/controlNet/store/controlNetSlice'; import { initialImageChanged } from 'features/parameters/store/generationSlice'; import { fieldValueChanged } from 'features/nodes/store/nodesSlice'; +import { imageAddedToBatch } from 'features/batch/store/batchSlice'; const moduleLog = log.child({ namespace: 'image' }); @@ -70,6 +71,11 @@ export const addImageUploadedFulfilledListener = () => { dispatch(addToast({ title: 'Image Uploaded', status: 'success' })); return; } + + if (postUploadAction?.type === 'ADD_TO_BATCH') { + dispatch(imageAddedToBatch(image.image_name)); + return; + } }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUrlsReceived.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUrlsReceived.ts index 2e365a20ac..0d8aa3d7c9 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUrlsReceived.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/imageUrlsReceived.ts @@ -1,7 +1,7 @@ import { log } from 'app/logging/useLogger'; import { startAppListening } from '..'; -import { imageUrlsReceived } from 'services/thunks/image'; -import { imageUpdatedOne } from 'features/gallery/store/imagesSlice'; +import { imageUrlsReceived } from 'services/api/thunks/image'; +import { imageUpdatedOne } from 'features/gallery/store/gallerySlice'; const moduleLog = log.child({ namespace: 'image' }); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/initialImageSelected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/initialImageSelected.ts index 9069e477ac..fe1a9bd806 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/initialImageSelected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/initialImageSelected.ts @@ -4,8 +4,8 @@ import { addToast } from 'features/system/store/systemSlice'; import { startAppListening } from '..'; import { initialImageSelected } from 'features/parameters/store/actions'; import { makeToast } from 'app/components/Toaster'; -import { selectImagesById } from 'features/gallery/store/imagesSlice'; -import { isImageDTO } from 'services/types/guards'; +import { selectImagesById } from 'features/gallery/store/gallerySlice'; +import { isImageDTO } from 'services/api/guards'; export const addInitialImageSelectedListener = () => { startAppListening({ diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts new file mode 100644 index 0000000000..5ab30570d9 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts @@ -0,0 +1,38 @@ +import { makeToast } from 'app/components/Toaster'; +import { modelSelected } from 'features/parameters/store/actions'; +import { + modelChanged, + vaeSelected, +} from 'features/parameters/store/generationSlice'; +import { zMainModel } from 'features/parameters/store/parameterZodSchemas'; +import { addToast } from 'features/system/store/systemSlice'; +import { startAppListening } from '..'; +import { lorasCleared } from '../../../../../features/lora/store/loraSlice'; + +export const addModelSelectedListener = () => { + startAppListening({ + actionCreator: modelSelected, + effect: (action, { getState, dispatch }) => { + const state = getState(); + const { base_model, model_name } = action.payload; + + if (state.generation.model?.base_model !== base_model) { + dispatch( + addToast( + makeToast({ + title: 'Base model changed, clearing submodels', + status: 'warning', + }) + ) + ); + dispatch(vaeSelected(null)); + dispatch(lorasCleared()); + // TODO: controlnet cleared + } + + const newModel = zMainModel.parse(action.payload); + + dispatch(modelChanged(newModel)); + }, + }); +}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts new file mode 100644 index 0000000000..ee02028848 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelsLoaded.ts @@ -0,0 +1,42 @@ +import { modelChanged } from 'features/parameters/store/generationSlice'; +import { some } from 'lodash-es'; +import { modelsApi } from 'services/api/endpoints/models'; +import { startAppListening } from '..'; + +export const addModelsLoadedListener = () => { + startAppListening({ + matcher: modelsApi.endpoints.getMainModels.matchFulfilled, + effect: async (action, { getState, dispatch }) => { + // models loaded, we need to ensure the selected model is available and if not, select the first one + + const currentModel = getState().generation.model; + + const isCurrentModelAvailable = some( + action.payload.entities, + (m) => + m?.model_name === currentModel?.model_name && + m?.base_model === currentModel?.base_model + ); + + if (isCurrentModelAvailable) { + return; + } + + const firstModelId = action.payload.ids[0]; + const firstModel = action.payload.entities[firstModelId]; + + if (!firstModel) { + // No models loaded at all + dispatch(modelChanged(null)); + return; + } + + dispatch( + modelChanged({ + base_model: firstModel.base_model, + model_name: firstModel.model_name, + }) + ); + }, + }); +}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedOpenAPISchema.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedOpenAPISchema.ts new file mode 100644 index 0000000000..3cc3147b45 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedOpenAPISchema.ts @@ -0,0 +1,35 @@ +import { receivedOpenAPISchema } from 'services/api/thunks/schema'; +import { startAppListening } from '..'; +import { log } from 'app/logging/useLogger'; +import { parseSchema } from 'features/nodes/util/parseSchema'; +import { nodeTemplatesBuilt } from 'features/nodes/store/nodesSlice'; +import { size } from 'lodash-es'; + +const schemaLog = log.child({ namespace: 'schema' }); + +export const addReceivedOpenAPISchemaListener = () => { + startAppListening({ + actionCreator: receivedOpenAPISchema.fulfilled, + effect: (action, { dispatch, getState }) => { + const schemaJSON = action.payload; + + schemaLog.info({ data: { schemaJSON } }, 'Dereferenced OpenAPI schema'); + + const nodeTemplates = parseSchema(schemaJSON); + + schemaLog.info( + { data: { nodeTemplates } }, + `Built ${size(nodeTemplates)} node templates` + ); + + dispatch(nodeTemplatesBuilt(nodeTemplates)); + }, + }); + + startAppListening({ + actionCreator: receivedOpenAPISchema.rejected, + effect: (action, { dispatch, getState }) => { + schemaLog.error('Problem dereferencing OpenAPI Schema'); + }, + }); +}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedPageOfImages.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedPageOfImages.ts index cde7e22e3d..3c11916be0 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedPageOfImages.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/receivedPageOfImages.ts @@ -1,7 +1,8 @@ import { log } from 'app/logging/useLogger'; import { startAppListening } from '..'; import { serializeError } from 'serialize-error'; -import { receivedPageOfImages } from 'services/thunks/image'; +import { receivedPageOfImages } from 'services/api/thunks/image'; +import { imagesApi } from 'services/api/endpoints/images'; const moduleLog = log.child({ namespace: 'gallery' }); @@ -9,11 +10,17 @@ export const addReceivedPageOfImagesFulfilledListener = () => { startAppListening({ actionCreator: receivedPageOfImages.fulfilled, effect: (action, { getState, dispatch }) => { - const page = action.payload; + const { items } = action.payload; moduleLog.debug( { data: { payload: action.payload } }, - `Received ${page.items.length} images` + `Received ${items.length} images` ); + + items.forEach((image) => { + dispatch( + imagesApi.util.upsertQueryData('getImageDTO', image.image_name, image) + ); + }); }, }); }; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/selectionAddedToBatch.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/selectionAddedToBatch.ts new file mode 100644 index 0000000000..dae72d92e7 --- /dev/null +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/selectionAddedToBatch.ts @@ -0,0 +1,19 @@ +import { startAppListening } from '..'; +import { log } from 'app/logging/useLogger'; +import { + imagesAddedToBatch, + selectionAddedToBatch, +} from 'features/batch/store/batchSlice'; + +const moduleLog = log.child({ namespace: 'batch' }); + +export const addSelectionAddedToBatchListener = () => { + startAppListening({ + actionCreator: selectionAddedToBatch, + effect: (action, { dispatch, getState }) => { + const { selection } = getState().gallery; + + dispatch(imagesAddedToBatch(selection)); + }, + }); +}; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCanceled.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCanceled.ts index 6274ad4dc8..85e2627d88 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCanceled.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCanceled.ts @@ -1,6 +1,6 @@ import { log } from 'app/logging/useLogger'; import { startAppListening } from '..'; -import { sessionCanceled } from 'services/thunks/session'; +import { sessionCanceled } from 'services/api/thunks/session'; import { serializeError } from 'serialize-error'; const moduleLog = log.child({ namespace: 'session' }); @@ -18,10 +18,10 @@ export const addSessionCanceledFulfilledListener = () => { startAppListening({ actionCreator: sessionCanceled.fulfilled, effect: (action, { getState, dispatch }) => { - const { sessionId } = action.meta.arg; + const { session_id } = action.meta.arg; moduleLog.debug( - { data: { sessionId } }, - `Session canceled (${sessionId})` + { data: { session_id } }, + `Session canceled (${session_id})` ); }, }); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCreated.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCreated.ts index fb8a64d2e3..a55bd07c4d 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCreated.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionCreated.ts @@ -1,6 +1,6 @@ import { log } from 'app/logging/useLogger'; import { startAppListening } from '..'; -import { sessionCreated } from 'services/thunks/session'; +import { sessionCreated } from 'services/api/thunks/session'; import { serializeError } from 'serialize-error'; const moduleLog = log.child({ namespace: 'session' }); @@ -30,6 +30,7 @@ export const addSessionCreatedRejectedListener = () => { effect: (action, { getState, dispatch }) => { if (action.payload) { const { arg, error } = action.payload; + const stringifiedError = JSON.stringify(error); moduleLog.error( { data: { @@ -37,7 +38,7 @@ export const addSessionCreatedRejectedListener = () => { error: serializeError(error), }, }, - `Problem creating session` + `Problem creating session: ${stringifiedError}` ); } }, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionInvoked.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionInvoked.ts index 272d1d9e1d..7fc2e07dcd 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionInvoked.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionInvoked.ts @@ -1,6 +1,6 @@ import { log } from 'app/logging/useLogger'; import { startAppListening } from '..'; -import { sessionInvoked } from 'services/thunks/session'; +import { sessionInvoked } from 'services/api/thunks/session'; import { serializeError } from 'serialize-error'; const moduleLog = log.child({ namespace: 'session' }); @@ -18,10 +18,10 @@ export const addSessionInvokedFulfilledListener = () => { startAppListening({ actionCreator: sessionInvoked.fulfilled, effect: (action, { getState, dispatch }) => { - const { sessionId } = action.meta.arg; + const { session_id } = action.meta.arg; moduleLog.debug( - { data: { sessionId } }, - `Session invoked (${sessionId})` + { data: { session_id } }, + `Session invoked (${session_id})` ); }, }); @@ -33,6 +33,7 @@ export const addSessionInvokedRejectedListener = () => { effect: (action, { getState, dispatch }) => { if (action.payload) { const { arg, error } = action.payload; + const stringifiedError = JSON.stringify(error); moduleLog.error( { data: { @@ -40,7 +41,7 @@ export const addSessionInvokedRejectedListener = () => { error: serializeError(error), }, }, - `Problem invoking session` + `Problem invoking session: ${stringifiedError}` ); } }, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionReadyToInvoke.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionReadyToInvoke.ts index 8d4262e7da..cc77403709 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionReadyToInvoke.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/sessionReadyToInvoke.ts @@ -1,5 +1,5 @@ import { startAppListening } from '..'; -import { sessionInvoked } from 'services/thunks/session'; +import { sessionInvoked } from 'services/api/thunks/session'; import { log } from 'app/logging/useLogger'; import { sessionReadyToInvoke } from 'features/system/store/actions'; @@ -9,13 +9,13 @@ export const addSessionReadyToInvokeListener = () => { startAppListening({ actionCreator: sessionReadyToInvoke, effect: (action, { getState, dispatch }) => { - const { sessionId } = getState().system; - if (sessionId) { + const { sessionId: session_id } = getState().system; + if (session_id) { moduleLog.debug( - { sessionId }, - `Session ready to invoke (${sessionId})})` + { session_id }, + `Session ready to invoke (${session_id})})` ); - dispatch(sessionInvoked({ sessionId })); + dispatch(sessionInvoked({ session_id })); } }, }); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts index bf54e63836..fe4bce682b 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketConnected.ts @@ -1,7 +1,6 @@ import { log } from 'app/logging/useLogger'; import { appSocketConnected, socketConnected } from 'services/events/actions'; -import { receivedPageOfImages } from 'services/thunks/image'; -import { receivedOpenAPISchema } from 'services/thunks/schema'; +import { receivedOpenAPISchema } from 'services/api/thunks/schema'; import { startAppListening } from '../..'; const moduleLog = log.child({ namespace: 'socketio' }); @@ -14,19 +13,10 @@ export const addSocketConnectedEventListener = () => { moduleLog.debug({ timestamp }, 'Connected'); - const { nodes, config, images } = getState(); + const { nodes, config } = getState(); const { disabledTabs } = config; - if (!images.ids.length) { - dispatch( - receivedPageOfImages({ - categories: ['general'], - isIntermediate: false, - }) - ); - } - if (!nodes.schema && !disabledTabs.includes('nodes')) { dispatch(receivedOpenAPISchema()); } diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationComplete.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationComplete.ts index c204f0bdfb..2d091af0b6 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationComplete.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationComplete.ts @@ -1,15 +1,15 @@ -import { addImageToStagingArea } from 'features/canvas/store/canvasSlice'; -import { startAppListening } from '../..'; import { log } from 'app/logging/useLogger'; +import { addImageToStagingArea } from 'features/canvas/store/canvasSlice'; +import { progressImageSet } from 'features/system/store/systemSlice'; +import { boardImagesApi } from 'services/api/endpoints/boardImages'; +import { isImageOutput } from 'services/api/guards'; +import { imageDTOReceived } from 'services/api/thunks/image'; +import { sessionCanceled } from 'services/api/thunks/session'; import { appSocketInvocationComplete, socketInvocationComplete, } from 'services/events/actions'; -import { imageMetadataReceived } from 'services/thunks/image'; -import { sessionCanceled } from 'services/thunks/session'; -import { isImageOutput } from 'services/types/guards'; -import { progressImageSet } from 'features/system/store/systemSlice'; -import { api } from 'services/apiSlice'; +import { startAppListening } from '../..'; const moduleLog = log.child({ namespace: 'socketio' }); const nodeDenylist = ['dataURL_image']; @@ -19,18 +19,18 @@ export const addInvocationCompleteEventListener = () => { actionCreator: socketInvocationComplete, effect: async (action, { dispatch, getState, take }) => { moduleLog.debug( - action.payload, + { data: action.payload }, `Invocation complete (${action.payload.data.node.type})` ); - const sessionId = action.payload.data.graph_execution_state_id; + const session_id = action.payload.data.graph_execution_state_id; const { cancelType, isCancelScheduled, boardIdToAddTo } = getState().system; // Handle scheduled cancelation if (cancelType === 'scheduled' && isCancelScheduled) { - dispatch(sessionCanceled({ sessionId })); + dispatch(sessionCanceled({ session_id })); } const { data } = action.payload; @@ -42,13 +42,13 @@ export const addInvocationCompleteEventListener = () => { // Get its metadata dispatch( - imageMetadataReceived({ - imageName: image_name, + imageDTOReceived({ + image_name, }) ); const [{ payload: imageDTO }] = await take( - imageMetadataReceived.fulfilled.match + imageDTOReceived.fulfilled.match ); // Handle canvas image @@ -61,7 +61,7 @@ export const addInvocationCompleteEventListener = () => { if (boardIdToAddTo && !imageDTO.is_intermediate) { dispatch( - api.endpoints.addImageToBoard.initiate({ + boardImagesApi.endpoints.addImageToBoard.initiate({ board_id: boardIdToAddTo, image_name, }) diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationError.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationError.ts index 51480bbad4..f0dd656097 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationError.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/socketio/socketInvocationError.ts @@ -13,7 +13,7 @@ export const addInvocationErrorEventListener = () => { effect: (action, { dispatch, getState }) => { moduleLog.error( action.payload, - `Invocation error (${action.payload.data.node.type})` + `Invocation error (${action.payload.data.node.type}): ${action.payload.data.error}` ); dispatch(appSocketInvocationError(action.payload)); }, diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/stagingAreaImageSaved.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/stagingAreaImageSaved.ts index 3e211f73bb..36840e5de1 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/stagingAreaImageSaved.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/stagingAreaImageSaved.ts @@ -1,8 +1,8 @@ import { stagingAreaImageSaved } from 'features/canvas/store/actions'; import { startAppListening } from '..'; import { log } from 'app/logging/useLogger'; -import { imageUpdated } from 'services/thunks/image'; -import { imageUpserted } from 'features/gallery/store/imagesSlice'; +import { imageUpdated } from 'services/api/thunks/image'; +import { imageUpserted } from 'features/gallery/store/gallerySlice'; import { addToast } from 'features/system/store/systemSlice'; const moduleLog = log.child({ namespace: 'canvas' }); @@ -11,14 +11,12 @@ export const addStagingAreaImageSavedListener = () => { startAppListening({ actionCreator: stagingAreaImageSaved, effect: async (action, { dispatch, getState, take }) => { - const { image_name } = action.payload; + const { imageName } = action.payload; dispatch( imageUpdated({ - imageName: image_name, - requestBody: { - is_intermediate: false, - }, + image_name: imageName, + is_intermediate: false, }) ); @@ -26,7 +24,7 @@ export const addStagingAreaImageSavedListener = () => { (action) => (imageUpdated.fulfilled.match(action) || imageUpdated.rejected.match(action)) && - action.meta.arg.imageName === image_name + action.meta.arg.image_name === imageName ); if (imageUpdated.rejected.match(imageUpdatedAction)) { diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateImageUrlsOnConnect.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateImageUrlsOnConnect.ts index b9ddcea4c3..490d99290d 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateImageUrlsOnConnect.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/updateImageUrlsOnConnect.ts @@ -3,13 +3,12 @@ import { startAppListening } from '..'; import { createSelector } from '@reduxjs/toolkit'; import { generationSelector } from 'features/parameters/store/generationSelectors'; import { canvasSelector } from 'features/canvas/store/canvasSelectors'; -import { nodesSelecter } from 'features/nodes/store/nodesSlice'; +import { nodesSelector } from 'features/nodes/store/nodesSlice'; import { controlNetSelector } from 'features/controlNet/store/controlNetSlice'; -import { ImageDTO } from 'services/api'; import { forEach, uniqBy } from 'lodash-es'; -import { imageUrlsReceived } from 'services/thunks/image'; +import { imageUrlsReceived } from 'services/api/thunks/image'; import { log } from 'app/logging/useLogger'; -import { selectImagesEntities } from 'features/gallery/store/imagesSlice'; +import { selectImagesEntities } from 'features/gallery/store/gallerySlice'; const moduleLog = log.child({ namespace: 'images' }); @@ -17,7 +16,7 @@ const selectAllUsedImages = createSelector( [ generationSelector, canvasSelector, - nodesSelecter, + nodesSelector, controlNetSelector, selectImagesEntities, ], @@ -37,7 +36,7 @@ const selectAllUsedImages = createSelector( nodes.nodes.forEach((node) => { forEach(node.data.inputs, (input) => { if (input.type === 'image' && input.value) { - allUsedImages.push(input.value); + allUsedImages.push(input.value.image_name); } }); }); @@ -83,7 +82,7 @@ export const addUpdateImageUrlsOnConnectListener = () => { allUsedImages.forEach((image_name) => { dispatch( imageUrlsReceived({ - imageName: image_name, + image_name, }) ); }); diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedCanvas.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedCanvas.ts index a26d872d50..1f9f773392 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedCanvas.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedCanvas.ts @@ -1,10 +1,10 @@ import { startAppListening } from '..'; -import { sessionCreated } from 'services/thunks/session'; +import { sessionCreated } from 'services/api/thunks/session'; import { buildCanvasGraph } from 'features/nodes/util/graphBuilders/buildCanvasGraph'; import { log } from 'app/logging/useLogger'; import { canvasGraphBuilt } from 'features/nodes/store/actions'; -import { imageUpdated, imageUploaded } from 'services/thunks/image'; -import { ImageDTO } from 'services/api'; +import { imageUpdated, imageUploaded } from 'services/api/thunks/image'; +import { ImageDTO } from 'services/api/types'; import { canvasSessionIdChanged, stagingAreaInitialized, @@ -75,13 +75,11 @@ export const addUserInvokedCanvasListener = () => { // upload the image, saving the request id const { requestId: initImageUploadedRequestId } = dispatch( imageUploaded({ - formData: { - file: new File([baseBlob], 'canvasInitImage.png', { - type: 'image/png', - }), - }, - imageCategory: 'general', - isIntermediate: true, + file: new File([baseBlob], 'canvasInitImage.png', { + type: 'image/png', + }), + image_category: 'general', + is_intermediate: true, }) ); @@ -100,13 +98,11 @@ export const addUserInvokedCanvasListener = () => { // upload the image, saving the request id const { requestId: maskImageUploadedRequestId } = dispatch( imageUploaded({ - formData: { - file: new File([maskBlob], 'canvasMaskImage.png', { - type: 'image/png', - }), - }, - imageCategory: 'mask', - isIntermediate: true, + file: new File([maskBlob], 'canvasMaskImage.png', { + type: 'image/png', + }), + image_category: 'mask', + is_intermediate: true, }) ); @@ -149,8 +145,8 @@ export const addUserInvokedCanvasListener = () => { if (['img2img', 'inpaint'].includes(generationMode) && canvasInitImage) { dispatch( imageUpdated({ - imageName: canvasInitImage.image_name, - requestBody: { session_id: sessionId }, + image_name: canvasInitImage.image_name, + session_id: sessionId, }) ); } @@ -159,8 +155,8 @@ export const addUserInvokedCanvasListener = () => { if (['inpaint'].includes(generationMode) && canvasMaskImage) { dispatch( imageUpdated({ - imageName: canvasMaskImage.image_name, - requestBody: { session_id: sessionId }, + image_name: canvasMaskImage.image_name, + session_id: sessionId, }) ); } diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedImageToImage.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedImageToImage.ts index 368d97a10f..202dd6f487 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedImageToImage.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedImageToImage.ts @@ -1,5 +1,5 @@ import { startAppListening } from '..'; -import { sessionCreated } from 'services/thunks/session'; +import { sessionCreated } from 'services/api/thunks/session'; import { log } from 'app/logging/useLogger'; import { imageToImageGraphBuilt } from 'features/nodes/store/actions'; import { userInvoked } from 'app/store/actions'; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedNodes.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedNodes.ts index 6fda3db0d6..9fb0009b70 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedNodes.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedNodes.ts @@ -1,5 +1,5 @@ import { startAppListening } from '..'; -import { sessionCreated } from 'services/thunks/session'; +import { sessionCreated } from 'services/api/thunks/session'; import { buildNodesGraph } from 'features/nodes/util/graphBuilders/buildNodesGraph'; import { log } from 'app/logging/useLogger'; import { nodesGraphBuilt } from 'features/nodes/store/actions'; diff --git a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedTextToImage.ts b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedTextToImage.ts index c76e0dfd4f..b024e94d9c 100644 --- a/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedTextToImage.ts +++ b/invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/userInvokedTextToImage.ts @@ -1,5 +1,5 @@ import { startAppListening } from '..'; -import { sessionCreated } from 'services/thunks/session'; +import { sessionCreated } from 'services/api/thunks/session'; import { log } from 'app/logging/useLogger'; import { textToImageGraphBuilt } from 'features/nodes/store/actions'; import { userInvoked } from 'app/store/actions'; diff --git a/invokeai/frontend/web/src/app/store/store.ts b/invokeai/frontend/web/src/app/store/store.ts index 57a97168a3..80688a1585 100644 --- a/invokeai/frontend/web/src/app/store/store.ts +++ b/invokeai/frontend/web/src/app/store/store.ts @@ -1,6 +1,7 @@ import { AnyAction, ThunkDispatch, + autoBatchEnhancer, combineReducers, configureStore, } from '@reduxjs/toolkit'; @@ -8,30 +9,32 @@ import { import dynamicMiddlewares from 'redux-dynamic-middlewares'; import { rememberEnhancer, rememberReducer } from 'redux-remember'; +import batchReducer from 'features/batch/store/batchSlice'; import canvasReducer from 'features/canvas/store/canvasSlice'; import controlNetReducer from 'features/controlNet/store/controlNetSlice'; +import dynamicPromptsReducer from 'features/dynamicPrompts/store/slice'; +import boardsReducer from 'features/gallery/store/boardSlice'; import galleryReducer from 'features/gallery/store/gallerySlice'; -import imagesReducer from 'features/gallery/store/imagesSlice'; +import imageDeletionReducer from 'features/imageDeletion/store/imageDeletionSlice'; import lightboxReducer from 'features/lightbox/store/lightboxSlice'; +import loraReducer from 'features/lora/store/loraSlice'; +import nodesReducer from 'features/nodes/store/nodesSlice'; import generationReducer from 'features/parameters/store/generationSlice'; import postprocessingReducer from 'features/parameters/store/postprocessingSlice'; -import systemReducer from 'features/system/store/systemSlice'; -// import sessionReducer from 'features/system/store/sessionSlice'; -import nodesReducer from 'features/nodes/store/nodesSlice'; -import boardsReducer from 'features/gallery/store/boardSlice'; import configReducer from 'features/system/store/configSlice'; +import systemReducer from 'features/system/store/systemSlice'; import hotkeysReducer from 'features/ui/store/hotkeysSlice'; import uiReducer from 'features/ui/store/uiSlice'; import { listenerMiddleware } from './middleware/listenerMiddleware'; -import { actionSanitizer } from './middleware/devtools/actionSanitizer'; -import { actionsDenylist } from './middleware/devtools/actionsDenylist'; -import { stateSanitizer } from './middleware/devtools/stateSanitizer'; +import { api } from 'services/api'; import { LOCALSTORAGE_PREFIX } from './constants'; import { serialize } from './enhancers/reduxRemember/serialize'; import { unserialize } from './enhancers/reduxRemember/unserialize'; -import { api } from 'services/apiSlice'; +import { actionSanitizer } from './middleware/devtools/actionSanitizer'; +import { actionsDenylist } from './middleware/devtools/actionsDenylist'; +import { stateSanitizer } from './middleware/devtools/stateSanitizer'; const allReducers = { canvas: canvasReducer, @@ -44,10 +47,12 @@ const allReducers = { config: configReducer, ui: uiReducer, hotkeys: hotkeysReducer, - images: imagesReducer, controlNet: controlNetReducer, boards: boardsReducer, - // session: sessionReducer, + dynamicPrompts: dynamicPromptsReducer, + batch: batchReducer, + imageDeletion: imageDeletionReducer, + lora: loraReducer, [api.reducerPath]: api.reducer, }; @@ -65,6 +70,9 @@ const rememberedKeys: (keyof typeof allReducers)[] = [ 'system', 'ui', 'controlNet', + 'dynamicPrompts', + 'batch', + 'lora', // 'boards', // 'hotkeys', // 'config', @@ -72,14 +80,18 @@ const rememberedKeys: (keyof typeof allReducers)[] = [ export const store = configureStore({ reducer: rememberedRootReducer, - enhancers: [ - rememberEnhancer(window.localStorage, rememberedKeys, { - persistDebounce: 300, - serialize, - unserialize, - prefix: LOCALSTORAGE_PREFIX, - }), - ], + enhancers: (existingEnhancers) => { + return existingEnhancers + .concat( + rememberEnhancer(window.localStorage, rememberedKeys, { + persistDebounce: 300, + serialize, + unserialize, + prefix: LOCALSTORAGE_PREFIX, + }) + ) + .concat(autoBatchEnhancer()); + }, middleware: (getDefaultMiddleware) => getDefaultMiddleware({ immutableCheck: false, @@ -100,3 +112,4 @@ export type AppGetState = typeof store.getState; export type RootState = ReturnType; export type AppThunkDispatch = ThunkDispatch; export type AppDispatch = typeof store.dispatch; +export const stateSelector = (state: RootState) => state; diff --git a/invokeai/frontend/web/src/app/types/invokeai.ts b/invokeai/frontend/web/src/app/types/invokeai.ts index 4532783ae6..229761dabb 100644 --- a/invokeai/frontend/web/src/app/types/invokeai.ts +++ b/invokeai/frontend/web/src/app/types/invokeai.ts @@ -93,7 +93,8 @@ export type AppFeature = | 'discordLink' | 'bugLink' | 'localization' - | 'consoleLogging'; + | 'consoleLogging' + | 'dynamicPrompting'; /** * A disable-able Stable Diffusion feature @@ -101,10 +102,15 @@ export type AppFeature = export type SDFeature = | 'controlNet' | 'noise' + | 'perlinNoise' + | 'noiseThreshold' | 'variation' | 'symmetry' | 'seamless' - | 'hires'; + | 'hires' + | 'lora' + | 'embedding' + | 'vae'; /** * Configuration options for the InvokeAI UI. @@ -171,6 +177,14 @@ export type AppConfig = { fineStep: number; coarseStep: number; }; + dynamicPrompts: { + maxPrompts: { + initial: number; + min: number; + sliderMax: number; + inputMax: number; + }; + }; }; }; diff --git a/invokeai/frontend/web/src/common/components/IAIButton.tsx b/invokeai/frontend/web/src/common/components/IAIButton.tsx index 3efae76d1e..d1e77537cc 100644 --- a/invokeai/frontend/web/src/common/components/IAIButton.tsx +++ b/invokeai/frontend/web/src/common/components/IAIButton.tsx @@ -15,10 +15,25 @@ export interface IAIButtonProps extends ButtonProps { } const IAIButton = forwardRef((props: IAIButtonProps, forwardedRef) => { - const { children, tooltip = '', tooltipProps, isChecked, ...rest } = props; + const { + children, + tooltip = '', + tooltipProps: { placement = 'top', hasArrow = true, ...tooltipProps } = {}, + isChecked, + ...rest + } = props; return ( - - diff --git a/invokeai/frontend/web/src/common/components/IAICollapse.tsx b/invokeai/frontend/web/src/common/components/IAICollapse.tsx index ec23793741..09dc1392e2 100644 --- a/invokeai/frontend/web/src/common/components/IAICollapse.tsx +++ b/invokeai/frontend/web/src/common/components/IAICollapse.tsx @@ -1,16 +1,28 @@ import { ChevronUpIcon } from '@chakra-ui/icons'; -import { Box, Collapse, Flex, Spacer, Switch } from '@chakra-ui/react'; +import { + Box, + Collapse, + Flex, + Spacer, + Text, + useColorMode, + useDisclosure, +} from '@chakra-ui/react'; +import { AnimatePresence, motion } from 'framer-motion'; import { PropsWithChildren, memo } from 'react'; +import { mode } from 'theme/util/mode'; export type IAIToggleCollapseProps = PropsWithChildren & { label: string; - isOpen: boolean; - onToggle: () => void; - withSwitch?: boolean; + activeLabel?: string; + defaultIsOpen?: boolean; }; const IAICollapse = (props: IAIToggleCollapseProps) => { - const { label, isOpen, onToggle, children, withSwitch = false } = props; + const { label, activeLabel, children, defaultIsOpen = false } = props; + const { isOpen, onToggle } = useDisclosure({ defaultIsOpen }); + const { colorMode } = useColorMode(); + return ( { alignItems: 'center', p: 2, px: 4, + gap: 2, borderTopRadius: 'base', borderBottomRadius: isOpen ? 0 : 'base', - bg: isOpen ? 'base.750' : 'base.800', - color: 'base.100', + bg: isOpen + ? mode('base.200', 'base.750')(colorMode) + : mode('base.150', 'base.800')(colorMode), + color: mode('base.900', 'base.100')(colorMode), _hover: { - bg: isOpen ? 'base.700' : 'base.750', + bg: isOpen + ? mode('base.250', 'base.700')(colorMode) + : mode('base.200', 'base.750')(colorMode), }, fontSize: 'sm', fontWeight: 600, @@ -35,22 +52,49 @@ const IAICollapse = (props: IAIToggleCollapseProps) => { }} > {label} + + {activeLabel && ( + + + {activeLabel} + + + )} + - {withSwitch && } - {!withSwitch && ( - - )} + - + {children} diff --git a/invokeai/frontend/web/src/common/components/IAIDndImage.tsx b/invokeai/frontend/web/src/common/components/IAIDndImage.tsx index e54b4a8872..959a70bc29 100644 --- a/invokeai/frontend/web/src/common/components/IAIDndImage.tsx +++ b/invokeai/frontend/web/src/common/components/IAIDndImage.tsx @@ -1,129 +1,128 @@ import { - Box, ChakraProps, Flex, Icon, - IconButtonProps, Image, + useColorMode, + useColorModeValue, } from '@chakra-ui/react'; -import { useDraggable, useDroppable } from '@dnd-kit/core'; import { useCombinedRefs } from '@dnd-kit/utilities'; import IAIIconButton from 'common/components/IAIIconButton'; -import { IAIImageLoadingFallback } from 'common/components/IAIImageFallback'; +import { + IAILoadingImageFallback, + IAINoContentFallback, +} from 'common/components/IAIImageFallback'; import ImageMetadataOverlay from 'common/components/ImageMetadataOverlay'; import { AnimatePresence } from 'framer-motion'; -import { ReactElement, SyntheticEvent, useCallback } from 'react'; +import { MouseEvent, ReactElement, SyntheticEvent } from 'react'; import { memo, useRef } from 'react'; -import { FaImage, FaTimes, FaUndo, FaUpload } from 'react-icons/fa'; -import { ImageDTO } from 'services/api'; +import { FaImage, FaUndo, FaUpload } from 'react-icons/fa'; +import { ImageDTO } from 'services/api/types'; import { v4 as uuidv4 } from 'uuid'; import IAIDropOverlay from './IAIDropOverlay'; -import { PostUploadAction, imageUploaded } from 'services/thunks/image'; -import { useDropzone } from 'react-dropzone'; -import { useAppDispatch } from 'app/store/storeHooks'; +import { PostUploadAction } from 'services/api/thunks/image'; +import { useImageUploadButton } from 'common/hooks/useImageUploadButton'; +import { mode } from 'theme/util/mode'; +import { + TypesafeDraggableData, + TypesafeDroppableData, + isValidDrop, + useDraggable, + useDroppable, +} from 'app/components/ImageDnd/typesafeDnd'; type IAIDndImageProps = { - image: ImageDTO | null | undefined; - onDrop: (droppedImage: ImageDTO) => void; - onReset?: () => void; + imageDTO: ImageDTO | undefined; onError?: (event: SyntheticEvent) => void; onLoad?: (event: SyntheticEvent) => void; - resetIconSize?: IconButtonProps['size']; + onClick?: (event: MouseEvent) => void; + onClickReset?: (event: MouseEvent) => void; withResetIcon?: boolean; + resetIcon?: ReactElement; + resetTooltip?: string; withMetadataOverlay?: boolean; isDragDisabled?: boolean; isDropDisabled?: boolean; isUploadDisabled?: boolean; - fallback?: ReactElement; - payloadImage?: ImageDTO | null | undefined; minSize?: number; postUploadAction?: PostUploadAction; imageSx?: ChakraProps['sx']; + fitContainer?: boolean; + droppableData?: TypesafeDroppableData; + draggableData?: TypesafeDraggableData; + dropLabel?: string; + isSelected?: boolean; + thumbnail?: boolean; + noContentFallback?: ReactElement; }; const IAIDndImage = (props: IAIDndImageProps) => { const { - image, - onDrop, - onReset, + imageDTO, + onClickReset, onError, - resetIconSize = 'md', + onClick, withResetIcon = false, withMetadataOverlay = false, isDropDisabled = false, isDragDisabled = false, isUploadDisabled = false, - fallback = , - payloadImage, minSize = 24, postUploadAction, imageSx, + fitContainer = false, + droppableData, + draggableData, + dropLabel, + isSelected = false, + thumbnail = false, + resetTooltip = 'Reset', + resetIcon = , + noContentFallback = , } = props; - const dispatch = useAppDispatch(); - const dndId = useRef(uuidv4()); - const { - isOver, - setNodeRef: setDroppableRef, - active: isDropActive, - } = useDroppable({ - id: dndId.current, - disabled: isDropDisabled, - data: { - handleDrop: onDrop, - }, - }); + const { colorMode } = useColorMode(); + + const dndId = useRef(uuidv4()); const { attributes, listeners, setNodeRef: setDraggableRef, isDragging, + active, } = useDraggable({ id: dndId.current, - data: { - image: payloadImage ? payloadImage : image, - }, - disabled: isDragDisabled || !image, + disabled: isDragDisabled || !imageDTO, + data: draggableData, }); - const handleOnDropAccepted = useCallback( - (files: Array) => { - const file = files[0]; - if (!file) { - return; - } + const { isOver, setNodeRef: setDroppableRef } = useDroppable({ + id: dndId.current, + disabled: isDropDisabled, + data: droppableData, + }); - dispatch( - imageUploaded({ - formData: { file }, - imageCategory: 'user', - isIntermediate: false, - postUploadAction, - }) - ); - }, - [dispatch, postUploadAction] + const setDndRef = useCombinedRefs(setDroppableRef, setDraggableRef); + + const { getUploadButtonProps, getUploadInputProps } = useImageUploadButton({ + postUploadAction, + isDisabled: isUploadDisabled, + }); + + const resetIconShadow = useColorModeValue( + `drop-shadow(0px 0px 0.1rem var(--invokeai-colors-base-600))`, + `drop-shadow(0px 0px 0.1rem var(--invokeai-colors-base-800))` ); - const { getRootProps, getInputProps } = useDropzone({ - accept: { 'image/png': ['.png'], 'image/jpeg': ['.jpg', '.jpeg', '.png'] }, - onDropAccepted: handleOnDropAccepted, - noDrag: true, - multiple: false, - disabled: isUploadDisabled, - }); - - const setNodeRef = useCombinedRefs(setDroppableRef, setDraggableRef); - const uploadButtonStyles = isUploadDisabled ? {} : { cursor: 'pointer', - bg: 'base.800', + bg: mode('base.200', 'base.800')(colorMode), _hover: { - bg: 'base.750', - color: 'base.300', + bg: mode('base.300', 'base.650')(colorMode), + color: mode('base.500', 'base.300')(colorMode), }, }; @@ -135,62 +134,70 @@ const IAIDndImage = (props: IAIDndImageProps) => { alignItems: 'center', justifyContent: 'center', position: 'relative', - minW: minSize, - minH: minSize, + minW: minSize ? minSize : undefined, + minH: minSize ? minSize : undefined, userSelect: 'none', - cursor: isDragDisabled || !image ? 'auto' : 'grab', + cursor: isDragDisabled || !imageDTO ? 'default' : 'pointer', }} {...attributes} {...listeners} - ref={setNodeRef} + ref={setDndRef} > - {image && ( + {imageDTO && ( } onError={onError} - objectFit="contain" draggable={false} sx={{ + objectFit: 'contain', maxW: 'full', maxH: 'full', borderRadius: 'base', + shadow: isSelected ? 'selected.light' : undefined, + _dark: { shadow: isSelected ? 'selected.dark' : undefined }, ...imageSx, }} /> - {withMetadataOverlay && } - {onReset && withResetIcon && ( - } + {onClickReset && withResetIcon && ( + - } - onClick={onReset} - /> - + /> )} - - {isDropActive && } - )} - {!image && ( + {!imageDTO && !isUploadDisabled && ( <> { borderRadius: 'base', transitionProperty: 'common', transitionDuration: '0.1s', - color: 'base.500', + color: mode('base.500', 'base.500')(colorMode), ...uploadButtonStyles, }} - {...getRootProps()} + {...getUploadButtonProps()} > - + - - {isDropActive && } - )} + {!imageDTO && isUploadDisabled && noContentFallback} + + {isValidDrop(droppableData, active) && !isDragging && ( + + )} + ); }; diff --git a/invokeai/frontend/web/src/common/components/IAIDropOverlay.tsx b/invokeai/frontend/web/src/common/components/IAIDropOverlay.tsx index 79105c00d6..573a900fef 100644 --- a/invokeai/frontend/web/src/common/components/IAIDropOverlay.tsx +++ b/invokeai/frontend/web/src/common/components/IAIDropOverlay.tsx @@ -1,6 +1,7 @@ -import { Flex, Text } from '@chakra-ui/react'; +import { Flex, Text, useColorMode } from '@chakra-ui/react'; import { motion } from 'framer-motion'; import { memo, useRef } from 'react'; +import { mode } from 'theme/util/mode'; import { v4 as uuidv4 } from 'uuid'; type Props = { @@ -11,6 +12,7 @@ type Props = { export const IAIDropOverlay = (props: Props) => { const { isOver, label = 'Drop' } = props; const motionId = useRef(uuidv4()); + const { colorMode } = useColorMode(); return ( { insetInlineStart: 0, w: 'full', h: 'full', - bg: 'base.900', + bg: mode('base.700', 'base.900')(colorMode), opacity: 0.7, borderRadius: 'base', alignItems: 'center', @@ -60,8 +62,10 @@ export const IAIDropOverlay = (props: Props) => { w: 'full', h: 'full', opacity: 1, - borderWidth: 2, - borderColor: isOver ? 'base.200' : 'base.500', + borderWidth: 3, + borderColor: isOver + ? mode('base.50', 'base.200')(colorMode) + : mode('base.100', 'base.500')(colorMode), borderRadius: 'base', borderStyle: 'dashed', transitionProperty: 'common', @@ -74,8 +78,10 @@ export const IAIDropOverlay = (props: Props) => { sx={{ fontSize: '2xl', fontWeight: 600, - transform: isOver ? 'scale(1.1)' : 'scale(1)', - color: isOver ? 'base.100' : 'base.500', + transform: isOver ? 'scale(1.02)' : 'scale(1)', + color: isOver + ? mode('base.50', 'base.50')(colorMode) + : mode('base.100', 'base.200')(colorMode), transitionProperty: 'common', transitionDuration: '0.1s', }} diff --git a/invokeai/frontend/web/src/common/components/IAIIconButton.tsx b/invokeai/frontend/web/src/common/components/IAIIconButton.tsx index 8ea06a1328..ed1514055e 100644 --- a/invokeai/frontend/web/src/common/components/IAIIconButton.tsx +++ b/invokeai/frontend/web/src/common/components/IAIIconButton.tsx @@ -29,7 +29,7 @@ const IAIIconButton = forwardRef((props: IAIIconButtonProps, forwardedRef) => { diff --git a/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx b/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx index 03a00d5b1c..a07071ee79 100644 --- a/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx +++ b/invokeai/frontend/web/src/common/components/IAIImageFallback.tsx @@ -1,69 +1,82 @@ import { As, + ChakraProps, Flex, - FlexProps, Icon, - IconProps, + Skeleton, Spinner, - SpinnerProps, + StyleProps, + Text, } from '@chakra-ui/react'; -import { ReactElement } from 'react'; import { FaImage } from 'react-icons/fa'; +import { ImageDTO } from 'services/api/types'; -type Props = FlexProps & { - spinnerProps?: SpinnerProps; -}; +type Props = { image: ImageDTO | undefined }; + +export const IAILoadingImageFallback = (props: Props) => { + if (props.image) { + return ( + + ); + } -export const IAIImageLoadingFallback = (props: Props) => { - const { spinnerProps, ...rest } = props; - const { sx, ...restFlexProps } = rest; return ( - + ); }; type IAINoImageFallbackProps = { - flexProps?: FlexProps; - iconProps?: IconProps; - as?: As; + label?: string; + icon?: As; + boxSize?: StyleProps['boxSize']; + sx?: ChakraProps['sx']; }; -export const IAINoImageFallback = (props: IAINoImageFallbackProps) => { - const { sx: flexSx, ...restFlexProps } = props.flexProps ?? { sx: {} }; - const { sx: iconSx, ...restIconProps } = props.iconProps ?? { sx: {} }; +export const IAINoContentFallback = (props: IAINoImageFallbackProps) => { + const { icon = FaImage, boxSize = 16 } = props; + return ( - + + {props.label && {props.label}} ); }; diff --git a/invokeai/frontend/web/src/common/components/IAIInput.tsx b/invokeai/frontend/web/src/common/components/IAIInput.tsx index 3cba36d2c9..d114fc5968 100644 --- a/invokeai/frontend/web/src/common/components/IAIInput.tsx +++ b/invokeai/frontend/web/src/common/components/IAIInput.tsx @@ -5,8 +5,10 @@ import { Input, InputProps, } from '@chakra-ui/react'; +import { useAppDispatch } from 'app/store/storeHooks'; import { stopPastePropagation } from 'common/util/stopPastePropagation'; -import { ChangeEvent, memo } from 'react'; +import { shiftKeyPressed } from 'features/ui/store/hotkeysSlice'; +import { ChangeEvent, KeyboardEvent, memo, useCallback } from 'react'; interface IAIInputProps extends InputProps { label?: string; @@ -25,6 +27,25 @@ const IAIInput = (props: IAIInputProps) => { ...rest } = props; + const dispatch = useAppDispatch(); + const handleKeyDown = useCallback( + (e: KeyboardEvent) => { + if (e.shiftKey) { + dispatch(shiftKeyPressed(true)); + } + }, + [dispatch] + ); + + const handleKeyUp = useCallback( + (e: KeyboardEvent) => { + if (!e.shiftKey) { + dispatch(shiftKeyPressed(false)); + } + }, + [dispatch] + ); + return ( { {...formControlProps} > {label !== '' && {label}} - + ); }; diff --git a/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx b/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx index c7ce1de4c1..dc6db707e7 100644 --- a/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx +++ b/invokeai/frontend/web/src/common/components/IAIMantineMultiSelect.tsx @@ -1,87 +1,148 @@ -import { Tooltip } from '@chakra-ui/react'; +import { Tooltip, useColorMode, useToken } from '@chakra-ui/react'; import { MultiSelect, MultiSelectProps } from '@mantine/core'; -import { memo } from 'react'; +import { useAppDispatch } from 'app/store/storeHooks'; +import { useChakraThemeTokens } from 'common/hooks/useChakraThemeTokens'; +import { shiftKeyPressed } from 'features/ui/store/hotkeysSlice'; +import { KeyboardEvent, RefObject, memo, useCallback } from 'react'; +import { mode } from 'theme/util/mode'; type IAIMultiSelectProps = MultiSelectProps & { tooltip?: string; + inputRef?: RefObject; }; const IAIMantineMultiSelect = (props: IAIMultiSelectProps) => { - const { searchable = true, tooltip, ...rest } = props; + const { searchable = true, tooltip, inputRef, ...rest } = props; + const dispatch = useAppDispatch(); + const { + base50, + base100, + base200, + base300, + base400, + base500, + base600, + base700, + base800, + base900, + accent200, + accent300, + accent400, + accent500, + accent600, + } = useChakraThemeTokens(); + const [boxShadow] = useToken('shadows', ['dark-lg']); + const { colorMode } = useColorMode(); + + const handleKeyDown = useCallback( + (e: KeyboardEvent) => { + if (e.shiftKey) { + dispatch(shiftKeyPressed(true)); + } + }, + [dispatch] + ); + + const handleKeyUp = useCallback( + (e: KeyboardEvent) => { + if (!e.shiftKey) { + dispatch(shiftKeyPressed(false)); + } + }, + [dispatch] + ); + return ( - + ({ label: { - color: 'var(--invokeai-colors-base-300)', + color: mode(base700, base300)(colorMode), fontWeight: 'normal', }, searchInput: { - '::placeholder': { - color: 'var(--invokeai-colors-base-700)', + ':placeholder': { + color: mode(base300, base700)(colorMode), }, }, input: { - backgroundColor: 'var(--invokeai-colors-base-900)', + backgroundColor: mode(base50, base900)(colorMode), borderWidth: '2px', - borderColor: 'var(--invokeai-colors-base-800)', - color: 'var(--invokeai-colors-base-100)', - padding: 10, + borderColor: mode(base200, base800)(colorMode), + color: mode(base900, base100)(colorMode), paddingRight: 24, fontWeight: 600, - '&:hover': { borderColor: 'var(--invokeai-colors-base-700)' }, + '&:hover': { borderColor: mode(base300, base600)(colorMode) }, '&:focus': { - borderColor: 'var(--invokeai-colors-accent-600)', + borderColor: mode(accent300, accent600)(colorMode), + }, + '&:is(:focus, :hover)': { + borderColor: mode(base400, base500)(colorMode), }, '&:focus-within': { - borderColor: 'var(--invokeai-colors-accent-600)', + borderColor: mode(accent200, accent600)(colorMode), + }, + '&[data-disabled]': { + backgroundColor: mode(base300, base700)(colorMode), + color: mode(base600, base400)(colorMode), + cursor: 'not-allowed', }, }, value: { - backgroundColor: 'var(--invokeai-colors-base-800)', - color: 'var(--invokeai-colors-base-100)', + backgroundColor: mode(base200, base800)(colorMode), + color: mode(base900, base100)(colorMode), button: { - color: 'var(--invokeai-colors-base-100)', + color: mode(base900, base100)(colorMode), }, '&:hover': { - backgroundColor: 'var(--invokeai-colors-base-700)', + backgroundColor: mode(base300, base700)(colorMode), cursor: 'pointer', }, }, dropdown: { - backgroundColor: 'var(--invokeai-colors-base-800)', - borderColor: 'var(--invokeai-colors-base-700)', + backgroundColor: mode(base200, base800)(colorMode), + borderColor: mode(base200, base800)(colorMode), + boxShadow, }, item: { - backgroundColor: 'var(--invokeai-colors-base-800)', - color: 'var(--invokeai-colors-base-200)', + backgroundColor: mode(base200, base800)(colorMode), + color: mode(base800, base200)(colorMode), padding: 6, '&[data-hovered]': { - color: 'var(--invokeai-colors-base-100)', - backgroundColor: 'var(--invokeai-colors-base-750)', + color: mode(base900, base100)(colorMode), + backgroundColor: mode(base300, base700)(colorMode), }, '&[data-active]': { - backgroundColor: 'var(--invokeai-colors-base-750)', + backgroundColor: mode(base300, base700)(colorMode), '&:hover': { - color: 'var(--invokeai-colors-base-100)', - backgroundColor: 'var(--invokeai-colors-base-750)', + color: mode(base900, base100)(colorMode), + backgroundColor: mode(base300, base700)(colorMode), }, }, '&[data-selected]': { - color: 'var(--invokeai-colors-base-50)', - backgroundColor: 'var(--invokeai-colors-accent-650)', + backgroundColor: mode(accent400, accent600)(colorMode), + color: mode(base50, base100)(colorMode), fontWeight: 600, '&:hover': { - backgroundColor: 'var(--invokeai-colors-accent-600)', + backgroundColor: mode(accent500, accent500)(colorMode), + color: mode('white', base50)(colorMode), }, }, + '&[data-disabled]': { + color: mode(base500, base600)(colorMode), + cursor: 'not-allowed', + }, }, rightSection: { width: 24, padding: 20, button: { - color: 'var(--invokeai-colors-base-100)', + color: mode(base900, base100)(colorMode), }, }, })} diff --git a/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx b/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx index 30517d0f41..99d0e8a615 100644 --- a/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx +++ b/invokeai/frontend/web/src/common/components/IAIMantineSelect.tsx @@ -1,6 +1,10 @@ -import { Tooltip } from '@chakra-ui/react'; +import { Tooltip, useColorMode, useToken } from '@chakra-ui/react'; import { Select, SelectProps } from '@mantine/core'; -import { memo } from 'react'; +import { useAppDispatch } from 'app/store/storeHooks'; +import { useChakraThemeTokens } from 'common/hooks/useChakraThemeTokens'; +import { shiftKeyPressed } from 'features/ui/store/hotkeysSlice'; +import { KeyboardEvent, RefObject, memo, useCallback, useState } from 'react'; +import { mode } from 'theme/util/mode'; export type IAISelectDataType = { value: string; @@ -10,61 +14,157 @@ export type IAISelectDataType = { type IAISelectProps = SelectProps & { tooltip?: string; + inputRef?: RefObject; }; const IAIMantineSelect = (props: IAISelectProps) => { - const { searchable = true, tooltip, ...rest } = props; + const { searchable = true, tooltip, inputRef, onChange, ...rest } = props; + const dispatch = useAppDispatch(); + const { + base50, + base100, + base200, + base300, + base400, + base500, + base600, + base700, + base800, + base900, + accent200, + accent300, + accent400, + accent500, + accent600, + } = useChakraThemeTokens(); + + const { colorMode } = useColorMode(); + const [searchValue, setSearchValue] = useState(''); + + // we want to capture shift keypressed even when an input is focused + const handleKeyDown = useCallback( + (e: KeyboardEvent) => { + if (e.shiftKey) { + dispatch(shiftKeyPressed(true)); + } + }, + [dispatch] + ); + + const handleKeyUp = useCallback( + (e: KeyboardEvent) => { + if (!e.shiftKey) { + dispatch(shiftKeyPressed(false)); + } + }, + [dispatch] + ); + + // wrap onChange to clear search value on select + const handleChange = useCallback( + (v: string | null) => { + setSearchValue(''); + + if (!onChange) { + return; + } + + onChange(v); + }, + [onChange] + ); + + const [boxShadow] = useToken('shadows', ['dark-lg']); + return (