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;y