From 23621306a1c5a21323e0734596d6ee9ee39da8ec Mon Sep 17 00:00:00 2001 From: haikdc Date: Fri, 13 Mar 2026 12:09:25 -0700 Subject: [PATCH] [Haik]: and so it begins --- .gitignore | 6 + GETTING_STARTED.md | 222 + LICENSE | 21 + README.md | 104 + backend/.env.example | 8 + backend/.gitignore | 18 + backend/__init__.py | 0 backend/apps/__init__.py | 0 backend/apps/agents/__init__.py | 0 backend/apps/agents/agent_manager.py | 1379 ++ backend/apps/agents/agents.py | 177 + backend/apps/agents/models.py | 75 + backend/apps/agents/worktree_manager.py | 130 + backend/apps/agents/ws_manager.py | 88 + backend/apps/dashboard_layout/__init__.py | 0 .../apps/dashboard_layout/dashboard_layout.py | 57 + backend/apps/dashboard_layout/models.py | 27 + backend/apps/dashboards/dashboards.py | 199 + backend/apps/dashboards/models.py | 42 + backend/apps/health/health.py | 33 + backend/apps/mcp_registry/__init__.py | 0 backend/apps/mcp_registry/mcp_registry.py | 393 + backend/apps/modes/__init__.py | 0 backend/apps/modes/models.py | 195 + backend/apps/modes/modes.py | 102 + backend/apps/outputs/__init__.py | 0 backend/apps/outputs/executor.py | 74 + backend/apps/outputs/models.py | 197 + backend/apps/outputs/outputs.py | 596 + backend/apps/settings/models.py | 14 + backend/apps/settings/settings.py | 109 + backend/apps/skill_registry/__init__.py | 0 backend/apps/skill_registry/skill_registry.py | 199 + backend/apps/skills/__init__.py | 0 backend/apps/skills/models.py | 32 + backend/apps/skills/skills.py | 215 + backend/apps/templates/__init__.py | 0 backend/apps/templates/models.py | 32 + backend/apps/templates/templates.py | 91 + backend/apps/tools_lib/__init__.py | 0 backend/apps/tools_lib/models.py | 75 + backend/apps/tools_lib/tools_lib.py | 729 + backend/config/Apps.py | 45 + backend/config/__init__.py | 0 backend/main.py | 91 + backend/requirements.txt | 11 + backend/run/_utils.sh | 202 + backend/run/dev.sh | 62 + debugger/.gitignore | 5 + debugger/README.md | 9 + debugger/debug.py | 57 + debugger/debugger_backend/DEFAULTS.py | 7 + debugger/debugger_backend/DebugFile.py | 39 + debugger/debugger_backend/Debugleton.py | 88 + debugger/debugger_backend/Directory.py | 200 + debugger/debugger_backend/File.py | 29 + debugger/debugger_backend/__init__.py | 0 debugger/debugger_backend/color_adjuster.py | 21 + debugger/debugger_backend/debug_arg_parser.py | 21 + debugger/debugger_backend/debugger_server.py | 49 + debugger/debugger_backend/log_config.py | 50 + debugger/debugger_backend/log_mode.py | 13 + debugger/debugger_backend/log_mode.txt | 1 + debugger/debugger_backend/path_mngr.py | 12 + debugger/debugger_backend/project_scanner.py | 149 + debugger/debugger_backend/requirements.txt | 3 + debugger/debugger_gui/.gitignore | 23 + debugger/debugger_gui/README.md | 70 + debugger/debugger_gui/package-lock.json | 19530 ++++++++++++++++ debugger/debugger_gui/package.json | 47 + debugger/debugger_gui/public/index.html | 43 + debugger/debugger_gui/public/logo.png | Bin 0 -> 175321 bytes debugger/debugger_gui/public/manifest.json | 25 + debugger/debugger_gui/public/robots.txt | 3 + debugger/debugger_gui/src/App.css | 29 + debugger/debugger_gui/src/App.js | 223 + .../debugger_gui/src/assets/collapsed.png | Bin 0 -> 7272 bytes .../debugger_gui/src/assets/color-picker.png | Bin 0 -> 17136 bytes .../debugger_gui/src/assets/color-reset.png | Bin 0 -> 58761 bytes .../src/assets/curved-arrow-clip-art.png | Bin 0 -> 88016 bytes debugger/debugger_gui/src/assets/emojis.js | 128 + debugger/debugger_gui/src/assets/expanded.png | Bin 0 -> 7661 bytes .../debugger_gui/src/assets/next-page.png | Bin 0 -> 19700 bytes .../debugger_gui/src/assets/prev-page.png | Bin 0 -> 19612 bytes debugger/debugger_gui/src/assets/pull.png | Bin 0 -> 10809 bytes debugger/debugger_gui/src/assets/push.png | Bin 0 -> 10666 bytes .../src/components/color-reset/ColorReset.css | 57 + .../src/components/color-reset/ColorReset.js | 30 + .../components/emoji-picker/EmojiPicker.css | 129 + .../components/emoji-picker/EmojiPicker.js | 141 + .../src/components/pull-button/PullButton.css | 49 + .../src/components/pull-button/PullButton.js | 32 + .../src/components/push-button/PushButton.css | 50 + .../src/components/push-button/PushButton.js | 33 + .../components/sync-section/SyncSection.css | 16 + .../components/sync-section/SyncSection.js | 17 + .../debugger_gui/src/components/tree/Tree.css | 7 + .../debugger_gui/src/components/tree/Tree.js | 33 + .../src/components/tree_node/TreeNode.css | 88 + .../src/components/tree_node/TreeNode.js | 52 + debugger/debugger_gui/src/index.css | 14 + debugger/debugger_gui/src/index.js | 9 + debugger/run.sh | 50 + debugger/setup.py | 8 + frontend/.gitignore | 104 + frontend/package.json | 62 + frontend/public/apple-touch-icon.png | Bin 0 -> 327756 bytes frontend/public/favicon.ico | Bin 0 -> 6010 bytes frontend/public/index.html | 14 + frontend/public/logo.png | Bin 0 -> 327756 bytes frontend/run/_utils.sh | 202 + frontend/run/dev.sh | 27 + frontend/src/app/Main.tsx | 173 + frontend/src/app/components/CommandPicker.tsx | 522 + .../src/app/components/DirectoryBrowser.tsx | 334 + .../components/ElementSelectionContext.tsx | 80 + .../app/components/GlobalApprovalOverlay.tsx | 203 + .../app/components/KeyboardShortcutsHelp.tsx | 93 + .../src/app/components/Layout/AppShell.tsx | 303 + .../src/app/components/RichPromptEditor.tsx | 366 + .../src/app/components/SelectionOverlay.tsx | 240 + .../src/app/components/SlashCommandPicker.tsx | 165 + .../src/app/components/richEditorUtils.ts | 158 + .../app/components/useDomElementSelector.ts | 339 + .../src/app/pages/AgentChat/AgentChat.tsx | 638 + .../src/app/pages/AgentChat/ApprovalBar.tsx | 1160 + .../app/pages/AgentChat/BranchNavigator.tsx | 53 + .../src/app/pages/AgentChat/ChatInput.tsx | 1148 + .../src/app/pages/AgentChat/DiffViewer.tsx | 139 + .../src/app/pages/AgentChat/MessageBubble.tsx | 653 + .../pages/AgentChat/TemplateInvokeModal.tsx | 183 + .../app/pages/AgentChat/ToolCallBubble.tsx | 1591 ++ .../app/pages/AgentChat/ToolGroupBubble.tsx | 198 + .../src/app/pages/AgentChat/ViewBubble.tsx | 277 + frontend/src/app/pages/Commands/Commands.tsx | 588 + .../src/app/pages/Dashboard/AgentCard.tsx | 754 + .../app/pages/Dashboard/CanvasControls.tsx | 87 + .../app/pages/Dashboard/CloseAgentDialog.tsx | 60 + .../src/app/pages/Dashboard/Dashboard.tsx | 400 + .../app/pages/Dashboard/DashboardToolbar.tsx | 639 + .../app/pages/Dashboard/DashboardViewCard.tsx | 360 + .../app/pages/Dashboard/useCanvasControls.ts | 323 + .../DashboardSelection/DashboardSelection.tsx | 334 + frontend/src/app/pages/Modes/Modes.tsx | 538 + frontend/src/app/pages/Settings/Settings.tsx | 561 + .../src/app/pages/Skills/SkillBuilderChat.tsx | 401 + frontend/src/app/pages/Skills/Skills.tsx | 759 + .../src/app/pages/Templates/Templates.tsx | 474 + frontend/src/app/pages/Tools/Tools.tsx | 1761 ++ frontend/src/app/pages/Views/CodeEditor.tsx | 87 + .../src/app/pages/Views/InputSchemaForm.tsx | 313 + frontend/src/app/pages/Views/ViewCard.tsx | 152 + frontend/src/app/pages/Views/ViewEditor.tsx | 1516 ++ frontend/src/app/pages/Views/ViewPreview.tsx | 163 + .../src/app/pages/Views/ViewRunDialog.tsx | 143 + frontend/src/app/pages/Views/Views.tsx | 143 + .../app/pages/Views/captureViewThumbnail.ts | 134 + .../pages/Views/useIframeElementSelector.ts | 342 + frontend/src/index.tsx | 6 + frontend/src/shared/hooks.ts | 5 + .../src/shared/hooks/useKeyboardShortcuts.ts | 67 + .../UnderConstruction.module.scss | 28 + .../UnderConstruction/UnderConstruction.tsx | 15 + frontend/src/shared/sanitizeSvg.ts | 48 + frontend/src/shared/state/API_ENDPOINTS.ts | 14 + frontend/src/shared/state/agentsSlice.ts | 862 + .../src/shared/state/dashboardLayoutSlice.ts | 317 + frontend/src/shared/state/dashboardsSlice.ts | 106 + frontend/src/shared/state/mcpRegistrySlice.ts | 114 + frontend/src/shared/state/modesSlice.ts | 87 + frontend/src/shared/state/outputsSlice.ts | 202 + frontend/src/shared/state/settingsSlice.ts | 107 + .../src/shared/state/skillRegistrySlice.ts | 126 + frontend/src/shared/state/skillsSlice.ts | 83 + frontend/src/shared/state/store.ts | 33 + frontend/src/shared/state/tempStateSlice.ts | 30 + frontend/src/shared/state/templatesSlice.ts | 116 + frontend/src/shared/state/toolsSlice.ts | 165 + frontend/src/shared/styles/ThemeContext.tsx | 52 + frontend/src/shared/styles/claudeTokens.ts | 117 + frontend/src/shared/styles/color.module.scss | 128 + frontend/src/shared/styles/getStyleValue.tsx | 12 + frontend/src/shared/styles/layout.module.scss | 62 + frontend/src/shared/styles/text.module.scss | 63 + frontend/src/shared/styles/utils.module.scss | 63 + frontend/src/shared/ws/WebSocketManager.ts | 292 + frontend/src/types/css-modules.d.ts | 14 + frontend/tsconfig.json | 27 + frontend/tsconfig.tsbuildinfo | 1 + frontend/webpack.config.js | 83 + 190 files changed, 51641 insertions(+) create mode 100644 .gitignore create mode 100644 GETTING_STARTED.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 backend/.env.example create mode 100644 backend/.gitignore create mode 100644 backend/__init__.py create mode 100644 backend/apps/__init__.py create mode 100644 backend/apps/agents/__init__.py create mode 100644 backend/apps/agents/agent_manager.py create mode 100644 backend/apps/agents/agents.py create mode 100644 backend/apps/agents/models.py create mode 100644 backend/apps/agents/worktree_manager.py create mode 100644 backend/apps/agents/ws_manager.py create mode 100644 backend/apps/dashboard_layout/__init__.py create mode 100644 backend/apps/dashboard_layout/dashboard_layout.py create mode 100644 backend/apps/dashboard_layout/models.py create mode 100644 backend/apps/dashboards/dashboards.py create mode 100644 backend/apps/dashboards/models.py create mode 100644 backend/apps/health/health.py create mode 100644 backend/apps/mcp_registry/__init__.py create mode 100644 backend/apps/mcp_registry/mcp_registry.py create mode 100644 backend/apps/modes/__init__.py create mode 100644 backend/apps/modes/models.py create mode 100644 backend/apps/modes/modes.py create mode 100644 backend/apps/outputs/__init__.py create mode 100644 backend/apps/outputs/executor.py create mode 100644 backend/apps/outputs/models.py create mode 100644 backend/apps/outputs/outputs.py create mode 100644 backend/apps/settings/models.py create mode 100644 backend/apps/settings/settings.py create mode 100644 backend/apps/skill_registry/__init__.py create mode 100644 backend/apps/skill_registry/skill_registry.py create mode 100644 backend/apps/skills/__init__.py create mode 100644 backend/apps/skills/models.py create mode 100644 backend/apps/skills/skills.py create mode 100644 backend/apps/templates/__init__.py create mode 100644 backend/apps/templates/models.py create mode 100644 backend/apps/templates/templates.py create mode 100644 backend/apps/tools_lib/__init__.py create mode 100644 backend/apps/tools_lib/models.py create mode 100644 backend/apps/tools_lib/tools_lib.py create mode 100644 backend/config/Apps.py create mode 100644 backend/config/__init__.py create mode 100644 backend/main.py create mode 100644 backend/requirements.txt create mode 100755 backend/run/_utils.sh create mode 100755 backend/run/dev.sh create mode 100644 debugger/.gitignore create mode 100644 debugger/README.md create mode 100644 debugger/debug.py create mode 100644 debugger/debugger_backend/DEFAULTS.py create mode 100644 debugger/debugger_backend/DebugFile.py create mode 100644 debugger/debugger_backend/Debugleton.py create mode 100644 debugger/debugger_backend/Directory.py create mode 100644 debugger/debugger_backend/File.py create mode 100644 debugger/debugger_backend/__init__.py create mode 100644 debugger/debugger_backend/color_adjuster.py create mode 100644 debugger/debugger_backend/debug_arg_parser.py create mode 100644 debugger/debugger_backend/debugger_server.py create mode 100644 debugger/debugger_backend/log_config.py create mode 100644 debugger/debugger_backend/log_mode.py create mode 100644 debugger/debugger_backend/log_mode.txt create mode 100644 debugger/debugger_backend/path_mngr.py create mode 100644 debugger/debugger_backend/project_scanner.py create mode 100644 debugger/debugger_backend/requirements.txt create mode 100644 debugger/debugger_gui/.gitignore create mode 100644 debugger/debugger_gui/README.md create mode 100644 debugger/debugger_gui/package-lock.json create mode 100644 debugger/debugger_gui/package.json create mode 100644 debugger/debugger_gui/public/index.html create mode 100644 debugger/debugger_gui/public/logo.png create mode 100644 debugger/debugger_gui/public/manifest.json create mode 100644 debugger/debugger_gui/public/robots.txt create mode 100644 debugger/debugger_gui/src/App.css create mode 100644 debugger/debugger_gui/src/App.js create mode 100644 debugger/debugger_gui/src/assets/collapsed.png create mode 100644 debugger/debugger_gui/src/assets/color-picker.png create mode 100644 debugger/debugger_gui/src/assets/color-reset.png create mode 100644 debugger/debugger_gui/src/assets/curved-arrow-clip-art.png create mode 100644 debugger/debugger_gui/src/assets/emojis.js create mode 100644 debugger/debugger_gui/src/assets/expanded.png create mode 100644 debugger/debugger_gui/src/assets/next-page.png create mode 100644 debugger/debugger_gui/src/assets/prev-page.png create mode 100644 debugger/debugger_gui/src/assets/pull.png create mode 100644 debugger/debugger_gui/src/assets/push.png create mode 100644 debugger/debugger_gui/src/components/color-reset/ColorReset.css create mode 100644 debugger/debugger_gui/src/components/color-reset/ColorReset.js create mode 100644 debugger/debugger_gui/src/components/emoji-picker/EmojiPicker.css create mode 100644 debugger/debugger_gui/src/components/emoji-picker/EmojiPicker.js create mode 100644 debugger/debugger_gui/src/components/pull-button/PullButton.css create mode 100644 debugger/debugger_gui/src/components/pull-button/PullButton.js create mode 100644 debugger/debugger_gui/src/components/push-button/PushButton.css create mode 100644 debugger/debugger_gui/src/components/push-button/PushButton.js create mode 100644 debugger/debugger_gui/src/components/sync-section/SyncSection.css create mode 100644 debugger/debugger_gui/src/components/sync-section/SyncSection.js create mode 100644 debugger/debugger_gui/src/components/tree/Tree.css create mode 100644 debugger/debugger_gui/src/components/tree/Tree.js create mode 100644 debugger/debugger_gui/src/components/tree_node/TreeNode.css create mode 100644 debugger/debugger_gui/src/components/tree_node/TreeNode.js create mode 100644 debugger/debugger_gui/src/index.css create mode 100644 debugger/debugger_gui/src/index.js create mode 100755 debugger/run.sh create mode 100644 debugger/setup.py create mode 100644 frontend/.gitignore create mode 100644 frontend/package.json create mode 100644 frontend/public/apple-touch-icon.png create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/public/index.html create mode 100644 frontend/public/logo.png create mode 100755 frontend/run/_utils.sh create mode 100755 frontend/run/dev.sh create mode 100644 frontend/src/app/Main.tsx create mode 100644 frontend/src/app/components/CommandPicker.tsx create mode 100644 frontend/src/app/components/DirectoryBrowser.tsx create mode 100644 frontend/src/app/components/ElementSelectionContext.tsx create mode 100644 frontend/src/app/components/GlobalApprovalOverlay.tsx create mode 100644 frontend/src/app/components/KeyboardShortcutsHelp.tsx create mode 100644 frontend/src/app/components/Layout/AppShell.tsx create mode 100644 frontend/src/app/components/RichPromptEditor.tsx create mode 100644 frontend/src/app/components/SelectionOverlay.tsx create mode 100644 frontend/src/app/components/SlashCommandPicker.tsx create mode 100644 frontend/src/app/components/richEditorUtils.ts create mode 100644 frontend/src/app/components/useDomElementSelector.ts create mode 100644 frontend/src/app/pages/AgentChat/AgentChat.tsx create mode 100644 frontend/src/app/pages/AgentChat/ApprovalBar.tsx create mode 100644 frontend/src/app/pages/AgentChat/BranchNavigator.tsx create mode 100644 frontend/src/app/pages/AgentChat/ChatInput.tsx create mode 100644 frontend/src/app/pages/AgentChat/DiffViewer.tsx create mode 100644 frontend/src/app/pages/AgentChat/MessageBubble.tsx create mode 100644 frontend/src/app/pages/AgentChat/TemplateInvokeModal.tsx create mode 100644 frontend/src/app/pages/AgentChat/ToolCallBubble.tsx create mode 100644 frontend/src/app/pages/AgentChat/ToolGroupBubble.tsx create mode 100644 frontend/src/app/pages/AgentChat/ViewBubble.tsx create mode 100644 frontend/src/app/pages/Commands/Commands.tsx create mode 100644 frontend/src/app/pages/Dashboard/AgentCard.tsx create mode 100644 frontend/src/app/pages/Dashboard/CanvasControls.tsx create mode 100644 frontend/src/app/pages/Dashboard/CloseAgentDialog.tsx create mode 100644 frontend/src/app/pages/Dashboard/Dashboard.tsx create mode 100644 frontend/src/app/pages/Dashboard/DashboardToolbar.tsx create mode 100644 frontend/src/app/pages/Dashboard/DashboardViewCard.tsx create mode 100644 frontend/src/app/pages/Dashboard/useCanvasControls.ts create mode 100644 frontend/src/app/pages/DashboardSelection/DashboardSelection.tsx create mode 100644 frontend/src/app/pages/Modes/Modes.tsx create mode 100644 frontend/src/app/pages/Settings/Settings.tsx create mode 100644 frontend/src/app/pages/Skills/SkillBuilderChat.tsx create mode 100644 frontend/src/app/pages/Skills/Skills.tsx create mode 100644 frontend/src/app/pages/Templates/Templates.tsx create mode 100644 frontend/src/app/pages/Tools/Tools.tsx create mode 100644 frontend/src/app/pages/Views/CodeEditor.tsx create mode 100644 frontend/src/app/pages/Views/InputSchemaForm.tsx create mode 100644 frontend/src/app/pages/Views/ViewCard.tsx create mode 100644 frontend/src/app/pages/Views/ViewEditor.tsx create mode 100644 frontend/src/app/pages/Views/ViewPreview.tsx create mode 100644 frontend/src/app/pages/Views/ViewRunDialog.tsx create mode 100644 frontend/src/app/pages/Views/Views.tsx create mode 100644 frontend/src/app/pages/Views/captureViewThumbnail.ts create mode 100644 frontend/src/app/pages/Views/useIframeElementSelector.ts create mode 100644 frontend/src/index.tsx create mode 100644 frontend/src/shared/hooks.ts create mode 100644 frontend/src/shared/hooks/useKeyboardShortcuts.ts create mode 100644 frontend/src/shared/modals/UnderConstruction/UnderConstruction.module.scss create mode 100644 frontend/src/shared/modals/UnderConstruction/UnderConstruction.tsx create mode 100644 frontend/src/shared/sanitizeSvg.ts create mode 100644 frontend/src/shared/state/API_ENDPOINTS.ts create mode 100644 frontend/src/shared/state/agentsSlice.ts create mode 100644 frontend/src/shared/state/dashboardLayoutSlice.ts create mode 100644 frontend/src/shared/state/dashboardsSlice.ts create mode 100644 frontend/src/shared/state/mcpRegistrySlice.ts create mode 100644 frontend/src/shared/state/modesSlice.ts create mode 100644 frontend/src/shared/state/outputsSlice.ts create mode 100644 frontend/src/shared/state/settingsSlice.ts create mode 100644 frontend/src/shared/state/skillRegistrySlice.ts create mode 100644 frontend/src/shared/state/skillsSlice.ts create mode 100644 frontend/src/shared/state/store.ts create mode 100644 frontend/src/shared/state/tempStateSlice.ts create mode 100644 frontend/src/shared/state/templatesSlice.ts create mode 100644 frontend/src/shared/state/toolsSlice.ts create mode 100644 frontend/src/shared/styles/ThemeContext.tsx create mode 100644 frontend/src/shared/styles/claudeTokens.ts create mode 100644 frontend/src/shared/styles/color.module.scss create mode 100644 frontend/src/shared/styles/getStyleValue.tsx create mode 100644 frontend/src/shared/styles/layout.module.scss create mode 100644 frontend/src/shared/styles/text.module.scss create mode 100644 frontend/src/shared/styles/utils.module.scss create mode 100644 frontend/src/shared/ws/WebSocketManager.ts create mode 100644 frontend/src/types/css-modules.d.ts create mode 100644 frontend/tsconfig.json create mode 100644 frontend/tsconfig.tsbuildinfo create mode 100644 frontend/webpack.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..4da81b08 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.DS_Store +.worktrees +.env +backend/data/** +!backend/data/outputs/ +!backend/data/outputs/*.json \ No newline at end of file diff --git a/GETTING_STARTED.md b/GETTING_STARTED.md new file mode 100644 index 00000000..70227318 --- /dev/null +++ b/GETTING_STARTED.md @@ -0,0 +1,222 @@ +# Getting Started + +A step-by-step guide to get Open Swarm running locally — from clone to launch. + +--- + +## Prerequisites + +Make sure the following are installed on your machine before proceeding: + +| Tool | Version | Check | +|------|---------|-------| +| **Git** | Any recent | `git --version` | +| **Python** | 3.11+ | `python --version` | +| **Node.js** | 18+ | `node --version` | +| **npm** | 9+ (ships with Node) | `npm --version` | + +### Installing prerequisites + +
+Node.js (via nvm) + +```bash +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash +source "$HOME/.nvm/nvm.sh" +nvm install 22 +nvm use 22 +``` + +
+ +--- + +## 1. Clone the repository + +```bash +git clone https://github.com//self-swarm.git +cd self-swarm +``` + +--- + +## 2. Backend setup (Configure environment variables) + +Copy the example environment file and fill in your values: + +```bash +cp backend/.env.example backend/.env +``` + +Edit `backend/.env` with your values: + +```env +# Backend server port +BACKEND_PORT=8324 + +# Google OAuth (optional — needed for Google Workspace tools) +GOOGLE_OAUTH_CLIENT_ID= +GOOGLE_OAUTH_CLIENT_SECRET= +``` + +--- + +## 3. Run the application + +You have two options: use the provided **run scripts** (recommended) or start each service manually. + +### Option A: Run scripts (recommended) + +These scripts handle virtual environments, dependency installation, and startup automatically. + +**Backend** (starts FastAPI server): + +```bash +./backend/run/dev.sh +``` + +**Frontend** (in a separate terminal): + +```bash +./frontend/run/dev.sh +``` + +### Option B: Manual startup + +**Terminal 1 — Backend server:** + +```bash +cd backend +source .venv/bin/activate +cd .. +python -m uvicorn backend.main:app --host 0.0.0.0 --port 8324 --reload --reload-dir backend +``` + +**Terminal 2 — Frontend dev server:** + +```bash +cd frontend +npm run dev +``` + +--- + +## 4. Open the app + +Once everything is running: + +| Service | URL | +|---------|-----| +| **Frontend (UI)** | [http://localhost:3000](http://localhost:3000) | +| **Backend API** | [http://localhost:8324](http://localhost:8324) | +| **API Docs (Swagger)** | [http://localhost:8324/docs](http://localhost:8324/docs) | + +--- + +## Google Workspace integration (optional) + +To use Google Calendar, Gmail, Drive, and other Google tools from your agents, you need to set up OAuth credentials. This is a one-time setup. + +### a. Create a Google Cloud project + +1. Go to the [Google Cloud Console](https://console.cloud.google.com/) +2. Create a new project (or select an existing one) +3. From the left sidebar, go to **APIs & Services → Library** +4. Enable the APIs you want to use: + - **Google Calendar API** + - **Gmail API** + - **Google Drive API** + - **Google Contacts API** (People API) + +### b. Create OAuth credentials + +1. Go to **APIs & Services → Credentials** +2. Click **Create Credentials → OAuth client ID** +3. If prompted, configure the **OAuth consent screen** first: + - Choose **External** (or Internal if you're on a Workspace org) + - Fill in the required app name and email fields + - Add the scopes you enabled above + - Add your Google account as a test user (required while the app is in "Testing" status) +4. Back on the credentials page, create an **OAuth client ID**: + - Application type: **Web application** + - Authorized redirect URIs: `http://localhost:8324/api/tools/oauth/callback` +5. Copy the **Client ID** and **Client Secret** + +### c. Add credentials to your `.env` + +Paste the values into `backend/.env`: + +```env +GOOGLE_OAUTH_CLIENT_ID=123456789-abc.apps.googleusercontent.com +GOOGLE_OAUTH_CLIENT_SECRET=GOCSPX-... +``` + +### d. Connect from the UI + +1. Open the **Tools** page in the sidebar +2. Add or select a Google Workspace tool +3. Click **Connect** — a Google sign-in popup will appear +4. Authorize the requested scopes +5. The popup closes and the tool status changes to **Connected** + +Your agents can now use Google Calendar, Gmail, Drive, etc. through MCP tools. + +--- + +## Project structure + +``` +self-swarm/ +├── backend/ +│ ├── apps/ # FastAPI route modules +│ │ ├── agents/ # Agent lifecycle, WebSocket, worktree management +│ │ ├── templates/ # Prompt template CRUD +│ │ ├── skills/ # Skills CRUD (synced to ~/.claude/skills/) +│ │ ├── tools_lib/ # Tool definitions CRUD +│ │ ├── modes/ # Agent mode configurations +│ │ ├── settings/ # App settings (API keys, preferences) +│ │ ├── outputs/ # Output management +│ │ └── dashboards/ # Dashboard layout persistence +│ ├── config/ # FastAPI app configuration +│ ├── data/ # Persistent JSON file storage +│ ├── run/ # Shell scripts for starting the backend +│ ├── main.py # FastAPI entrypoint +│ ├── requirements.txt # Python dependencies +│ └── .env # Environment variables (not committed) +├── frontend/ +│ ├── src/ +│ │ ├── app/ +│ │ │ ├── components/ # AppShell, CommandPicker, modals +│ │ │ └── pages/ # Dashboard, AgentChat, Templates, Skills, Tools, etc. +│ │ └── shared/ +│ │ ├── state/ # Redux slices +│ │ ├── ws/ # WebSocket manager +│ │ └── hooks/ # Custom React hooks +│ ├── public/ # Static assets +│ ├── webpack.config.js # Webpack bundler config +│ └── package.json # Node dependencies +├── debugger/ # Optional debugging tool +└── README.md +``` + +--- + +## Troubleshooting + +### Backend won't start — `ModuleNotFoundError` +Make sure you're running from the **project root** (not from `backend/`): +```bash +cd self-swarm +python -m uvicorn backend.main:app --host 0.0.0.0 --port 8324 --reload +``` + +### Frontend proxy errors / API calls failing +The frontend dev server proxies `/api` requests to `http://localhost:8324`. Make sure the backend is running first. + +### Mock mode vs real mode +If you see mock responses, either: +- `claude-agent-sdk` is not installed — run `pip install claude-agent-sdk` +- No Anthropic API key is configured — set `ANTHROPIC_API_KEY` env var or configure it in the Settings page + +### `playwright install` errors +Playwright requires browser binaries. Run `playwright install` after pip install to download them. diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..6eb33b2d --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 ClusterLabs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..0904df32 --- /dev/null +++ b/README.md @@ -0,0 +1,104 @@ +# Open Swarm — Agent Orchestrator + +A locally-running React + FastAPI application for managing multiple Claude Code instances in parallel. Designed for power users who run multiple agents simultaneously and need a unified interface to monitor, control, and coordinate them. + +## Features + +- **Multi-agent management** — Launch and monitor multiple Claude Code instances side by side +- **Git worktree isolation** — Each agent works on its own git worktree/branch to avoid conflicts +- **Real-time streaming** — WebSocket-based streaming of agent messages and status updates +- **HITL approvals** — Approve or deny tool usage requests from the dashboard or within each chat +- **Message branching** — Edit prior messages to fork conversations, navigate between branches +- **Prompt template library** — Reusable prompt templates with structured input fields, invoked via `/` commands +- **Skills library** — Manage skills synced to the native `~/.claude/skills/` directory +- **Tools library** — Define custom tool configurations (bash, MCP, Python) +- **Keyboard shortcuts** — Navigate between agents and approve/deny requests without a mouse +- **Diff viewer** — View uncommitted changes in each agent's worktree + +## Architecture + +``` +Frontend (React/TypeScript :3000) Backend (FastAPI/Python :8324) +┌─────────────────────────────┐ ┌──────────────────────────────┐ +│ Dashboard │◄────►│ REST API (/api/*) │ +│ Agent Chat (per session) │ │ WebSocket (/ws/*) │ +│ Templates / Skills / Tools │ │ Agent Manager │ +│ Slash Command Picker │ │ └─ Claude Agent SDK │ +│ Keyboard Shortcuts │ │ Worktree Manager │ +│ Diff Viewer │ │ Library Storage (JSON/files)│ +└─────────────────────────────┘ └──────────────────────────────┘ +``` + +## Quick Start + +### Prerequisites + +- Python 3.11+ +- Node.js 18+ +- Git +- An Anthropic API key (for real agent usage) — `export ANTHROPIC_API_KEY=...` + +### Backend + +```bash +bash backend/run/dev.sh +# API runs at http://localhost:8324 +# Docs at http://localhost:8324/docs +``` + +### Frontend + +```bash +bash frontend/run/dev.sh +# App runs at http://localhost:3000 +``` + +### Mock Mode + +If `claude-agent-sdk` is not installed, the backend runs in **mock mode** — agents simulate tool calls and responses so you can develop and test the UI without an API key. + +## Keyboard Shortcuts + +| Key | Action | +|-----|--------| +| `d` | Go to Dashboard | +| `t` | Go to Templates | +| `1`–`9` | Open agent by position | +| `Shift+A` | Approve all pending requests | +| `Shift+D` | Deny all pending requests | +| `?` | Show shortcuts help | + +## Slash Commands + +In the chat input, type `/` to invoke templates and skills: +- `/template-name` — Opens the template's input modal +- `/skill-name` — Inserts the skill content into the message + +## Project Structure + +``` +backend/ + apps/ + agents/ — Agent lifecycle, WebSocket, worktree management + templates/ — Prompt template CRUD (JSON file storage) + skills/ — Skills CRUD (synced to ~/.claude/skills/) + tools_lib/ — Tool definitions CRUD (JSON file storage) + health/ — Health check endpoint + config/ — FastAPI app configuration + data/ — Persistent JSON file storage (sessions, dashboards, settings, templates, tools, etc.) + +frontend/ + src/ + app/ + components/ — AppShell, NewAgentModal, SlashCommandPicker, KeyboardShortcutsHelp + pages/ + Dashboard/ — Agent overview grid with live status + AgentChat/ — Full chat UI with streaming, HITL, branching, diff viewer + Templates/ — Template library with editor + Skills/ — Skills library with editor + Tools/ — Tools library with editor + shared/ + state/ — Redux slices (agents, templates, skills, tools) + ws/ — WebSocket manager + hooks/ — Custom hooks (keyboard shortcuts) +``` diff --git a/backend/.env.example b/backend/.env.example new file mode 100644 index 00000000..4d293e35 --- /dev/null +++ b/backend/.env.example @@ -0,0 +1,8 @@ +# ============================================================================= +# Backend Server +# ============================================================================= +BACKEND_PORT=8324 + + +GOOGLE_OAUTH_CLIENT_ID=your-google-oauth-client-id.apps.googleusercontent.com +GOOGLE_OAUTH_CLIENT_SECRET=your-google-oauth-client-secret diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 00000000..6e519548 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,18 @@ +# ignore all py cache files +__pycache__/ +*.pyc +*.pyo +*.pyd +*.pyw +*.pyz +*.pywz +*.pyzw +*.pyzwz +*.pyzwzw + +# ignore everything in apps/db/snips (except .gitignore) +apps/db/snips/* +!apps/db/snips/.gitkeep + +# ignore everything in data/ +data/** \ No newline at end of file diff --git a/backend/__init__.py b/backend/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/apps/__init__.py b/backend/apps/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/apps/agents/__init__.py b/backend/apps/agents/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/apps/agents/agent_manager.py b/backend/apps/agents/agent_manager.py new file mode 100644 index 00000000..388db807 --- /dev/null +++ b/backend/apps/agents/agent_manager.py @@ -0,0 +1,1379 @@ +import asyncio +import json +import logging +import os +import time +from datetime import datetime +from uuid import uuid4 +from typing import Optional + +from backend.apps.agents.models import ( + AgentConfig, AgentSession, Message, MessageBranch, ApprovalRequest, ToolGroupMeta, +) +from backend.apps.agents.worktree_manager import WorktreeManager +from backend.apps.agents.ws_manager import ws_manager +from backend.apps.modes.modes import load_mode +from backend.apps.outputs.outputs import _load_all as load_all_outputs +from backend.apps.settings.settings import load_settings +from backend.apps.tools_lib.tools_lib import ( + _load_all as load_all_tools, + _sanitize_server_name, + derive_mcp_config, + load_builtin_permissions, + refresh_google_token, +) + +logger = logging.getLogger(__name__) + +os.environ.setdefault("CLAUDE_CODE_STREAM_CLOSE_TIMEOUT", "3600000") + +SESSIONS_DIR = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "data", "sessions", +) + + +def _save_session(session_id: str, doc_data: dict): + os.makedirs(SESSIONS_DIR, exist_ok=True) + with open(os.path.join(SESSIONS_DIR, f"{session_id}.json"), "w") as f: + json.dump(doc_data, f, indent=2) + + +def _load_session_data(session_id: str) -> dict | None: + path = os.path.join(SESSIONS_DIR, f"{session_id}.json") + if not os.path.exists(path): + return None + with open(path) as f: + return json.load(f) + + +def _delete_session_file(session_id: str): + path = os.path.join(SESSIONS_DIR, f"{session_id}.json") + if os.path.exists(path): + os.remove(path) + + +def _load_all_session_data() -> list[tuple[str, dict]]: + results = [] + if not os.path.exists(SESSIONS_DIR): + return results + for fname in os.listdir(SESSIONS_DIR): + if fname.endswith(".json"): + with open(os.path.join(SESSIONS_DIR, fname)) as f: + results.append((fname[:-5], json.load(f))) + return results + +FULL_TOOLS = [ + "Read", "Edit", "Write", "Bash", "Glob", "Grep", "AskUserQuestion", + "WebSearch", "WebFetch", "NotebookEdit", "TodoWrite", + "EnterPlanMode", "ExitPlanMode", "EnterWorktree", + "TaskOutput", "TaskStop", + "CronCreate", "CronList", "CronDelete", + "RenderOutput", +] + +REPO_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) + + +def _get_denied_tool_names(tool) -> set[str]: + """Return the set of MCP sub-tool names whose permission is 'deny'.""" + return { + key for key, value in tool.tool_permissions.items() + if not key.startswith("_") and value == "deny" + } + + +def _get_all_known_tool_names(tool) -> set[str]: + """Return all known sub-tool names for an MCP tool (from _tool_descriptions).""" + return set(tool.tool_permissions.get("_tool_descriptions", {}).keys()) + + +def _is_fully_denied(tool) -> bool: + """True when every known sub-tool on this MCP server is set to 'deny'.""" + known = _get_all_known_tool_names(tool) + if not known: + return False + return known <= _get_denied_tool_names(tool) + + +def get_all_tool_names() -> list[str]: + """FULL_TOOLS + installed MCP tool identifiers (mcp:). + + Builtin tools set to 'deny' and MCP servers whose every sub-tool + is denied are excluded. + """ + builtin_perms = load_builtin_permissions() + builtin_tools = [ + t for t in FULL_TOOLS + if builtin_perms.get(t, "always_allow") != "deny" + ] + mcp_names = [ + f"mcp:{t.name}" + for t in load_all_tools() + if t.mcp_config + and t.enabled + and t.auth_status in ("configured", "connected") + and not _is_fully_denied(t) + ] + return builtin_tools + mcp_names + + +class AgentManager: + def __init__(self): + self.sessions: dict[str, AgentSession] = {} + self.tasks: dict[str, asyncio.Task] = {} + self.worktree_mgr = WorktreeManager(REPO_ROOT) + + def _resolve_mode(self, mode_id: str) -> tuple[list[str], str | None, str | None]: + """Return (tools, system_prompt, default_folder) resolved from the mode store.""" + mode_def = load_mode(mode_id) + if mode_def: + tools = mode_def.tools if mode_def.tools is not None else get_all_tool_names() + return tools, mode_def.system_prompt, mode_def.default_folder + return get_all_tool_names(), None, None + + async def _build_mcp_servers(self, allowed_tools: list[str]) -> dict: + """Build the mcp_servers dict for ClaudeAgentOptions from installed MCP tools. + + Servers whose every sub-tool is denied are skipped entirely. + """ + mcp_servers: dict = {} + all_tools = load_all_tools() + mcp_tools = [t for t in all_tools if t.mcp_config and t.enabled and t.auth_status in ("configured", "connected")] + + for tool in mcp_tools: + tool_ref = f"mcp:{tool.name}" + if tool_ref not in allowed_tools and allowed_tools != get_all_tool_names(): + if not any(tool_ref == at for at in allowed_tools): + continue + + if _is_fully_denied(tool): + continue + + if tool.auth_type == "oauth2" and tool.auth_status == "connected": + await refresh_google_token(tool) + + config = derive_mcp_config(tool) + if config: + server_name = _sanitize_server_name(tool.name) + mcp_servers[server_name] = config + + return mcp_servers + + def _build_connected_tools_context(self, allowed_tools: list[str]) -> str | None: + """Build a context block describing connected MCP tools and their accounts. + + Tools set to 'deny' and fully-denied servers are excluded. + """ + all_tools = load_all_tools() + mcp_tools = [t for t in all_tools if t.mcp_config and t.enabled and t.auth_status in ("configured", "connected")] + + sections = [] + for tool in mcp_tools: + tool_ref = f"mcp:{tool.name}" + if tool_ref not in allowed_tools and allowed_tools != get_all_tool_names(): + continue + + if _is_fully_denied(tool): + continue + + server_name = _sanitize_server_name(tool.name) + denied = _get_denied_tool_names(tool) + tool_descs = { + k: v for k, v in tool.tool_permissions.get("_tool_descriptions", {}).items() + if k not in denied + } + if not tool_descs: + continue + + lines = [f"MCP Server: {server_name}"] + lines.append(f" Status: {tool.auth_status}") + + if tool.connected_account_email: + lines.append(f" Connected account: {tool.connected_account_email}") + lines.append( + f" IMPORTANT: When calling tools from this server that require an email " + f"parameter (e.g. user_google_email, user_email), always use " + f"\"{tool.connected_account_email}\" automatically — do NOT ask the user." + ) + + tool_names = list(tool_descs.keys()) + if tool_names: + lines.append(f" Available tools ({len(tool_names)}): {', '.join(tool_names[:15])}") + if len(tool_names) > 15: + lines.append(f" ... and {len(tool_names) - 15} more") + + sections.append("\n".join(lines)) + + if not sections: + return None + return ( + "\n" + "The following MCP tool servers are connected and available. " + "Use them directly when relevant to the user's request.\n\n" + + "\n\n".join(sections) + + "\n" + ) + + def _build_outputs_context(self) -> str | None: + """Build a context block describing available Outputs the agent can render.""" + import json as _json + all_outputs = load_all_outputs() + if not all_outputs: + return None + + sections = [] + for out in all_outputs: + lines = [f"- **{out.name}** (id: `{out.id}`)"] + if out.description: + lines.append(f" Description: {out.description}") + schema_str = _json.dumps(out.input_schema, indent=2) + lines.append(f" Input schema:\n```json\n{schema_str}\n```") + sections.append("\n".join(lines)) + + return ( + "\n" + "The following reusable View artifacts are available. " + "Use the RenderOutput tool to invoke one by providing its output_id " + "and the required input_data matching its schema.\n\n" + + "\n\n".join(sections) + + "\n" + ) + + def _compose_system_prompt(self, default_prompt: str | None, mode_prompt: str | None, session_prompt: str | None, connected_tools_ctx: str | None = None, outputs_ctx: str | None = None) -> str | None: + parts = [p for p in (default_prompt, mode_prompt, session_prompt, connected_tools_ctx, outputs_ctx) if p] + return "\n\n".join(parts) if parts else None + + async def launch_agent(self, config: AgentConfig) -> AgentSession: + session_id = uuid4().hex + branch_name = f"agent-{session_id[:8]}" + + worktree_path = await self.worktree_mgr.create_worktree(branch_name) + + mode_tools, _, mode_folder = self._resolve_mode(config.mode) + tools = mode_tools + + global_settings = load_settings() + effective_cwd = ( + config.target_directory + or mode_folder + or global_settings.default_folder + or str(REPO_ROOT) + ) + + if config.mode in ("view-builder", "skill-builder") and not config.target_directory: + effective_cwd = os.path.join(effective_cwd, session_id) + + os.makedirs(effective_cwd, exist_ok=True) + + session = AgentSession( + id=session_id, + name=config.name, + model=config.model, + mode=config.mode, + worktree_path=worktree_path, + branch_name=branch_name, + system_prompt=config.system_prompt, + allowed_tools=tools, + max_turns=config.max_turns, + cwd=effective_cwd, + dashboard_id=config.dashboard_id, + ) + self.sessions[session_id] = session + + await ws_manager.send_to_session(session_id, "agent:status", { + "session_id": session_id, + "status": "running", + "session": session.model_dump(mode="json"), + }) + + return session + + def _resolve_context_paths(self, context_paths: list | None) -> str: + """Read file contents / directory trees for attached context paths.""" + if not context_paths: + return "" + sections = [] + for cp in context_paths: + path = cp.get("path", "") + cp_type = cp.get("type", "file") + if not path or not os.path.exists(path): + sections.append(f"[Context: {path} — not found]") + continue + if cp_type == "file" and os.path.isfile(path): + try: + with open(path, "r", errors="replace") as f: + content = f.read(512_000) # ~500KB cap per file + sections.append( + f"\n{content}\n" + ) + except Exception as e: + sections.append(f"[Context: {path} — error reading: {e}]") + elif cp_type == "directory" and os.path.isdir(path): + tree_lines = self._build_dir_tree(path, max_depth=4) + sections.append( + f"\n{chr(10).join(tree_lines)}\n" + ) + else: + sections.append(f"[Context: {path} — type mismatch]") + return "\n\n".join(sections) + + def _build_dir_tree(self, root: str, max_depth: int = 4, prefix: str = "") -> list[str]: + """Build a recursive directory tree listing.""" + lines = [] + try: + entries = sorted(os.listdir(root)) + except PermissionError: + return [f"{prefix}[permission denied]"] + dirs = [e for e in entries if not e.startswith(".") and os.path.isdir(os.path.join(root, e))] + files = [e for e in entries if not e.startswith(".") and os.path.isfile(os.path.join(root, e))] + for f in files: + lines.append(f"{prefix}{f}") + for d in dirs: + lines.append(f"{prefix}{d}/") + if max_depth > 1: + sub = self._build_dir_tree(os.path.join(root, d), max_depth - 1, prefix + " ") + lines.extend(sub) + return lines + + def _resolve_forced_tools(self, forced_tools: list[str] | None) -> str: + """Build a context block describing explicitly requested tools.""" + if not forced_tools: + return "" + from backend.apps.tools_lib.models import BUILTIN_TOOLS + desc_map: dict[str, str] = {t.name: t.description for t in BUILTIN_TOOLS} + tool_to_server: dict[str, str] = {} + tool_to_email: dict[str, str] = {} + for t in load_all_tools(): + if not t.enabled or not t.tool_permissions: + continue + tool_descs = t.tool_permissions.get("_tool_descriptions", {}) + server_name = _sanitize_server_name(t.name) + for tn, td in tool_descs.items(): + desc_map[tn] = td + tool_to_server[tn] = server_name + if t.connected_account_email: + tool_to_email[tn] = t.connected_account_email + + lines = [] + for name in forced_tools: + desc = desc_map.get(name, "") + line = f"- {name}: {desc}" if desc else f"- {name}" + server = tool_to_server.get(name) + if server: + line += f"\n (MCP server: {server})" + email = tool_to_email.get(name) + if email: + line += f"\n (connected account: {email} — use this for any email parameter)" + lines.append(line) + + return ( + "\n" + "The user explicitly requested these tools be used. " + "Prioritize using them to address the user's request.\n" + + "\n".join(lines) + + "\n" + ) + + def _resolve_attached_skills(self, attached_skills: list | None) -> str: + """Build a context block injecting attached skill content into the prompt.""" + if not attached_skills: + return "" + sections = [] + for skill in attached_skills: + name = skill.get("name", "Unknown") + content = skill.get("content", "") + if content: + sections.append(f"[Using skill: {name}]\n\n{content}") + return "\n\n".join(sections) + + def _build_prompt_content(self, prompt: str, images: list | None = None, context_paths: list | None = None, forced_tools: list[str] | None = None, attached_skills: list | None = None): + """Build message content with optional image blocks, context, and forced tools for the Claude API.""" + context_text = self._resolve_context_paths(context_paths) + forced_tools_text = self._resolve_forced_tools(forced_tools) + skills_text = self._resolve_attached_skills(attached_skills) + + parts = [p for p in (forced_tools_text, context_text, skills_text, prompt) if p] + full_prompt = "\n\n".join(parts) + + if not images: + return full_prompt + content = [{"type": "text", "text": full_prompt}] + for img in images: + content.append({ + "type": "image", + "source": { + "type": "base64", + "media_type": img.get("media_type", "image/png"), + "data": img["data"], + }, + }) + return content + + async def _run_agent_loop(self, session_id: str, prompt: str, images: list | None = None, context_paths: list | None = None, forced_tools: list[str] | None = None, attached_skills: list | None = None): + """Run the Claude Agent SDK query loop for a session.""" + session = self.sessions.get(session_id) + if not session: + return + + prompt_content = self._build_prompt_content(prompt, images, context_paths, forced_tools, attached_skills) + + try: + from claude_agent_sdk import ( + query, ClaudeAgentOptions, AssistantMessage, ResultMessage, + ) + from claude_agent_sdk.types import ( + HookMatcher, PermissionResultAllow, PermissionResultDeny, + TextBlock, ToolUseBlock, StreamEvent, + ) + except ImportError: + logger.warning("claude_agent_sdk not installed, running in mock mode") + await self._run_mock_agent(session_id, prompt) + return + + session.status = "running" + + _builtin_perms = load_builtin_permissions() + + def _check_tool_permission(tool_name: str) -> str | None: + """Check tool permissions for both builtin and MCP tools. + Returns 'always_allow', 'deny', or None (ask).""" + if tool_name in _builtin_perms: + policy = _builtin_perms[tool_name] + if policy in ("always_allow", "deny"): + return policy + return None + + import re as _re + m = _re.match(r"mcp__([^_]+(?:-[^_]+)*)__(.+)", tool_name) + if not m: + return None + server_slug, mcp_tool_name = m.group(1), m.group(2) + for t in load_all_tools(): + if not t.mcp_config or not t.enabled: + continue + if _sanitize_server_name(t.name) == server_slug: + policy = t.tool_permissions.get(mcp_tool_name, "ask") + if policy in ("always_allow", "deny"): + return policy + return None + return None + + async def can_use_tool(tool_name, input_data, context): + if tool_name != "AskUserQuestion": + policy = _check_tool_permission(tool_name) + if policy == "always_allow": + return PermissionResultAllow(updated_input=input_data) + if policy == "deny": + return PermissionResultDeny(message="Tool denied by permission policy") + + request_id = uuid4().hex + approval_req = ApprovalRequest( + id=request_id, + session_id=session_id, + tool_name=tool_name, + tool_input=input_data if isinstance(input_data, dict) else {}, + ) + session.pending_approvals.append(approval_req) + session.status = "waiting_approval" + + await ws_manager.send_to_session(session_id, "agent:status", { + "session_id": session_id, + "status": "waiting_approval", + }) + + decision = await ws_manager.send_approval_request( + session_id, request_id, tool_name, + input_data if isinstance(input_data, dict) else {} + ) + + session.pending_approvals = [ + a for a in session.pending_approvals if a.id != request_id + ] + session.status = "running" + await ws_manager.send_to_session(session_id, "agent:status", { + "session_id": session_id, + "status": "running", + }) + + if decision.get("behavior") == "allow": + return PermissionResultAllow( + updated_input=decision.get("updated_input", input_data) + ) + else: + return PermissionResultDeny( + message=decision.get("message", "User denied this action") + ) + + tool_start_times: dict[str, float] = {} + + async def pre_tool_hook(input_data, tool_use_id, context): + if tool_use_id: + tool_start_times[tool_use_id] = time.time() + return {"continue_": True} + + async def post_tool_hook(input_data, tool_use_id, context): + elapsed_ms = None + if tool_use_id and tool_use_id in tool_start_times: + elapsed_ms = int((time.time() - tool_start_times.pop(tool_use_id)) * 1000) + + raw_response = input_data.get("tool_response", "") + + if isinstance(raw_response, list) and raw_response: + text_parts = [ + block.get("text", "") + for block in raw_response + if isinstance(block, dict) and block.get("type") == "text" + ] + if text_parts: + raw_response = "\n".join(text_parts) if len(text_parts) > 1 else text_parts[0] + + if isinstance(raw_response, str): + content = raw_response + else: + try: + import json as _json + content = _json.dumps(raw_response, indent=2, default=str) + except Exception: + content = str(raw_response) + + result_payload = {"text": content} + hook_tool_name = input_data.get("tool_name", "") + if hook_tool_name: + result_payload["tool_name"] = hook_tool_name + if elapsed_ms is not None: + result_payload["elapsed_ms"] = elapsed_ms + + result_msg = Message(role="tool_result", content=result_payload) + session.messages.append(result_msg) + await ws_manager.send_to_session(session_id, "agent:message", { + "session_id": session_id, + "message": result_msg.model_dump(mode="json"), + }) + return {"continue_": True} + + try: + _, mode_sys_prompt, _ = self._resolve_mode(session.mode) + connected_tools_ctx = self._build_connected_tools_context(session.allowed_tools) + outputs_ctx = self._build_outputs_context() + global_settings = load_settings() + composed_prompt = self._compose_system_prompt(global_settings.default_system_prompt, mode_sys_prompt, session.system_prompt, connected_tools_ctx, outputs_ctx) + + mcp_servers = await self._build_mcp_servers(session.allowed_tools) + + effective_allowed = [ + t for t in session.allowed_tools + if _builtin_perms.get(t, "always_allow") == "always_allow" + ] + if mcp_servers: + all_tools_list = load_all_tools() + for name in mcp_servers: + tool_def = next( + (t for t in all_tools_list + if t.mcp_config and t.enabled and _sanitize_server_name(t.name) == name), + None, + ) + if tool_def: + denied = _get_denied_tool_names(tool_def) + known = _get_all_known_tool_names(tool_def) + for tn in known - denied: + policy = tool_def.tool_permissions.get(tn, "ask") + if policy == "always_allow": + effective_allowed.append(f"mcp__{name}__{tn}") + else: + effective_allowed.append(f"mcp__{name}__*") + + options_kwargs = { + "model": session.model, + "can_use_tool": can_use_tool, + "hooks": { + "PreToolUse": [HookMatcher(matcher=None, hooks=[pre_tool_hook])], + "PostToolUse": [HookMatcher(matcher=None, hooks=[post_tool_hook])], + }, + "allowed_tools": effective_allowed, + "include_partial_messages": True, + } + if global_settings.anthropic_api_key: + options_kwargs["env"] = {"ANTHROPIC_API_KEY": global_settings.anthropic_api_key} + if mcp_servers: + options_kwargs["mcp_servers"] = mcp_servers + if composed_prompt: + options_kwargs["system_prompt"] = composed_prompt + if session.max_turns: + options_kwargs["max_turns"] = session.max_turns + + if session.cwd: + options_kwargs["cwd"] = session.cwd + + if session.sdk_session_id: + options_kwargs["resume"] = session.sdk_session_id + + options = ClaudeAgentOptions(**options_kwargs) + + async def prompt_stream(): + yield { + "type": "user", + "message": {"role": "user", "content": prompt_content}, + } + + stream_text_msg_id = None + stream_tool_msg_ids_ordered = [] + stream_block_index_map = {} + + async for message in query( + prompt=prompt_stream(), + options=options, + ): + if isinstance(message, StreamEvent): + event = message.event + event_type = event.get("type") + + if event_type == "content_block_start": + block = event.get("content_block", {}) + index = event.get("index") + block_type = block.get("type") + + if block_type == "text": + if stream_text_msg_id is None: + stream_text_msg_id = uuid4().hex + await ws_manager.send_to_session(session_id, "agent:stream_start", { + "session_id": session_id, + "message_id": stream_text_msg_id, + "role": "assistant", + }) + stream_block_index_map[index] = stream_text_msg_id + + elif block_type == "tool_use": + tool_msg_id = uuid4().hex + stream_tool_msg_ids_ordered.append(tool_msg_id) + stream_block_index_map[index] = tool_msg_id + await ws_manager.send_to_session(session_id, "agent:stream_start", { + "session_id": session_id, + "message_id": tool_msg_id, + "role": "tool_call", + "tool_name": block.get("name", ""), + }) + + elif event_type == "content_block_delta": + index = event.get("index") + delta = event.get("delta", {}) + delta_type = delta.get("type") + msg_id = stream_block_index_map.get(index) + + if msg_id and delta_type == "text_delta": + await ws_manager.send_to_session(session_id, "agent:stream_delta", { + "session_id": session_id, + "message_id": msg_id, + "delta": delta.get("text", ""), + }) + elif msg_id and delta_type == "input_json_delta": + await ws_manager.send_to_session(session_id, "agent:stream_delta", { + "session_id": session_id, + "message_id": msg_id, + "delta": delta.get("partial_json", ""), + }) + + elif event_type == "content_block_stop": + index = event.get("index") + msg_id = stream_block_index_map.get(index) + if msg_id and msg_id != stream_text_msg_id: + await ws_manager.send_to_session(session_id, "agent:stream_end", { + "session_id": session_id, + "message_id": msg_id, + }) + + elif event_type == "message_stop": + if stream_text_msg_id: + await ws_manager.send_to_session(session_id, "agent:stream_end", { + "session_id": session_id, + "message_id": stream_text_msg_id, + }) + + elif isinstance(message, AssistantMessage): + content_parts = [] + tool_uses = [] + for block in message.content: + if isinstance(block, TextBlock): + content_parts.append(block.text) + elif isinstance(block, ToolUseBlock): + tool_uses.append({ + "id": block.id, + "tool": block.name, + "input": block.input, + }) + + if content_parts: + asst_msg = Message( + id=stream_text_msg_id or uuid4().hex, + role="assistant", + content="\n".join(content_parts), + ) + session.messages.append(asst_msg) + await ws_manager.send_to_session(session_id, "agent:message", { + "session_id": session_id, + "message": asst_msg.model_dump(mode="json"), + }) + + for i, tu in enumerate(tool_uses): + msg_id = stream_tool_msg_ids_ordered[i] if i < len(stream_tool_msg_ids_ordered) else uuid4().hex + tool_msg = Message(id=msg_id, role="tool_call", content=tu) + session.messages.append(tool_msg) + await ws_manager.send_to_session(session_id, "agent:message", { + "session_id": session_id, + "message": tool_msg.model_dump(mode="json"), + }) + + stream_text_msg_id = None + stream_tool_msg_ids_ordered = [] + stream_block_index_map = {} + + elif isinstance(message, ResultMessage): + session.sdk_session_id = getattr(message, "session_id", None) + cost = getattr(message, "total_cost_usd", None) + if cost is not None: + session.cost_usd = cost + await ws_manager.send_to_session(session_id, "agent:cost_update", { + "session_id": session_id, + "cost_usd": session.cost_usd, + }) + + session.status = "completed" + except asyncio.CancelledError: + session.status = "stopped" + except Exception as e: + logger.exception(f"Agent {session_id} error: {e}") + session.status = "error" + error_msg = Message(role="system", content=f"Error: {str(e)}") + session.messages.append(error_msg) + await ws_manager.send_to_session(session_id, "agent:message", { + "session_id": session_id, + "message": error_msg.model_dump(mode="json"), + }) + finally: + if session_id in self.sessions: + await ws_manager.send_to_session(session_id, "agent:status", { + "session_id": session_id, + "status": session.status, + "session": session.model_dump(mode="json"), + }) + try: + _save_session(session_id, session.model_dump(mode="json")) + except Exception as e: + logger.warning(f"Failed to snapshot session {session_id}: {e}") + + async def _stream_text(self, session_id: str, msg_id: str, text: str, delay: float = 0.03): + """Emit stream_start, word-by-word deltas, and stream_end for a text message.""" + await ws_manager.send_to_session(session_id, "agent:stream_start", { + "session_id": session_id, + "message_id": msg_id, + "role": "assistant", + }) + words = text.split(" ") + for i, word in enumerate(words): + chunk = word if i == 0 else " " + word + await ws_manager.send_to_session(session_id, "agent:stream_delta", { + "session_id": session_id, + "message_id": msg_id, + "delta": chunk, + }) + await asyncio.sleep(delay) + await ws_manager.send_to_session(session_id, "agent:stream_end", { + "session_id": session_id, + "message_id": msg_id, + }) + + async def _stream_tool_input(self, session_id: str, msg_id: str, tool_name: str, input_json: str, delay: float = 0.02): + """Emit stream_start, chunked deltas, and stream_end for a tool_call input.""" + await ws_manager.send_to_session(session_id, "agent:stream_start", { + "session_id": session_id, + "message_id": msg_id, + "role": "tool_call", + "tool_name": tool_name, + }) + chunk_size = 12 + for i in range(0, len(input_json), chunk_size): + await ws_manager.send_to_session(session_id, "agent:stream_delta", { + "session_id": session_id, + "message_id": msg_id, + "delta": input_json[i:i + chunk_size], + }) + await asyncio.sleep(delay) + await ws_manager.send_to_session(session_id, "agent:stream_end", { + "session_id": session_id, + "message_id": msg_id, + }) + + async def _run_mock_agent(self, session_id: str, prompt: str): + """Mock agent loop for development without claude_agent_sdk installed.""" + session = self.sessions.get(session_id) + if not session: + return + + await asyncio.sleep(1) + + request_id = uuid4().hex + approval_req = ApprovalRequest( + id=request_id, + session_id=session_id, + tool_name="Bash", + tool_input={"command": f"echo 'Processing: {prompt}'", "description": "Echo the user prompt"}, + ) + session.pending_approvals.append(approval_req) + session.status = "waiting_approval" + await ws_manager.send_to_session(session_id, "agent:status", { + "session_id": session_id, + "status": "waiting_approval", + }) + + decision = await ws_manager.send_approval_request( + session_id, request_id, "Bash", + {"command": f"echo 'Processing: {prompt}'", "description": "Echo the user prompt"} + ) + + session.pending_approvals = [a for a in session.pending_approvals if a.id != request_id] + session.status = "running" + await ws_manager.send_to_session(session_id, "agent:status", { + "session_id": session_id, + "status": "running", + }) + + import json as _json + tool_input_content = {"tool": "Bash", "input": {"command": f"echo 'Processing: {prompt}'"}, "approved": decision.get("behavior") == "allow"} + tool_msg_id = uuid4().hex + await self._stream_tool_input( + session_id, tool_msg_id, "Bash", + _json.dumps(tool_input_content["input"], indent=2), + ) + tool_msg = Message(id=tool_msg_id, role="tool_call", content=tool_input_content) + session.messages.append(tool_msg) + await ws_manager.send_to_session(session_id, "agent:message", { + "session_id": session_id, + "message": tool_msg.model_dump(mode="json"), + }) + + await asyncio.sleep(1) + + if decision.get("behavior") == "allow": + tool_result = Message(role="tool_result", content=f"Processing: {prompt}") + session.messages.append(tool_result) + await ws_manager.send_to_session(session_id, "agent:message", { + "session_id": session_id, + "message": tool_result.model_dump(mode="json"), + }) + + await asyncio.sleep(1) + + asst_text = ( + f"I've processed your request: \"{prompt}\"\n\n" + "This is a mock response because `claude-agent-sdk` is not installed. " + "Install it with `pip install claude-agent-sdk` to use real Claude Code instances.\n\n" + f"The agent was configured with:\n- Model: {session.model}\n- Mode: {session.mode}\n- Worktree: {session.branch_name}" + ) + asst_msg_id = uuid4().hex + await self._stream_text(session_id, asst_msg_id, asst_text) + + asst_msg = Message(id=asst_msg_id, role="assistant", content=asst_text) + session.messages.append(asst_msg) + await ws_manager.send_to_session(session_id, "agent:message", { + "session_id": session_id, + "message": asst_msg.model_dump(mode="json"), + }) + + session.status = "completed" + session.cost_usd = 0.001 + await ws_manager.send_to_session(session_id, "agent:status", { + "session_id": session_id, + "status": "completed", + "session": session.model_dump(mode="json"), + }) + await ws_manager.send_to_session(session_id, "agent:cost_update", { + "session_id": session_id, + "cost_usd": session.cost_usd, + }) + + async def send_message( + self, + session_id: str, + prompt: str, + mode: str | None = None, + model: str | None = None, + images: list | None = None, + context_paths: list | None = None, + forced_tools: list[str] | None = None, + attached_skills: list | None = None, + ): + """Send a follow-up message to an existing session.""" + session = self.sessions.get(session_id) + if not session: + raise ValueError(f"Session {session_id} not found") + + existing = self.tasks.get(session_id) + if existing and not existing.done(): + return + + session_changed = False + if model and model != session.model: + session.model = model + session_changed = True + if mode and mode != session.mode: + session.mode = mode + mode_tools, _, _ = self._resolve_mode(mode) + session.allowed_tools = mode_tools + session_changed = True + if session_changed: + await ws_manager.send_to_session(session_id, "agent:status", { + "session_id": session_id, + "status": session.status, + "session": session.model_dump(mode="json"), + }) + + skill_meta = [{"id": s["id"], "name": s["name"]} for s in (attached_skills or [])] or None + image_meta = [{"data": img["data"], "media_type": img.get("media_type", "image/png")} for img in (images or [])] or None + user_msg = Message( + role="user", + content=prompt, + context_paths=context_paths if context_paths else None, + attached_skills=skill_meta, + forced_tools=forced_tools if forced_tools else None, + images=image_meta, + ) + session.messages.append(user_msg) + await ws_manager.send_to_session(session_id, "agent:message", { + "session_id": session_id, + "message": user_msg.model_dump(mode="json"), + }) + + task = asyncio.create_task(self._run_agent_loop(session_id, prompt, images=images, context_paths=context_paths, forced_tools=forced_tools, attached_skills=attached_skills)) + self.tasks[session_id] = task + + async def stop_agent(self, session_id: str, remove_worktree: bool = False): + """Stop a running agent.""" + task = self.tasks.get(session_id) + if task and not task.done(): + task.cancel() + try: + await task + except asyncio.CancelledError: + pass + + session = self.sessions.get(session_id) + if session: + session.status = "stopped" + await ws_manager.send_to_session(session_id, "agent:status", { + "session_id": session_id, + "status": "stopped", + "session": session.model_dump(mode="json"), + }) + + if remove_worktree and session and session.branch_name: + await self.worktree_mgr.remove_worktree(session.branch_name) + + def handle_approval(self, request_id: str, decision: dict): + """Resolve a pending HITL approval.""" + ws_manager.resolve_approval(request_id, decision) + + async def edit_message(self, session_id: str, message_id: str, new_content: str): + """Edit a prior user message, creating a new branch (fork).""" + session = self.sessions.get(session_id) + if not session: + raise ValueError(f"Session {session_id} not found") + + target_msg = None + for i, msg in enumerate(session.messages): + if msg.id == message_id: + target_msg = msg + break + + if not target_msg or target_msg.role != "user": + raise ValueError("Can only edit user messages") + + new_branch_id = uuid4().hex[:8] + new_branch = MessageBranch( + id=new_branch_id, + parent_branch_id=target_msg.branch_id, + fork_point_message_id=message_id, + ) + session.branches[new_branch_id] = new_branch + session.active_branch_id = new_branch_id + + edited_msg = Message( + role="user", + content=new_content, + branch_id=new_branch_id, + parent_id=target_msg.parent_id, + ) + session.messages.append(edited_msg) + + await ws_manager.send_to_session(session_id, "agent:message", { + "session_id": session_id, + "message": edited_msg.model_dump(mode="json"), + }) + await ws_manager.send_to_session(session_id, "agent:branch_created", { + "session_id": session_id, + "branch": new_branch.model_dump(mode="json"), + "active_branch_id": new_branch_id, + }) + + task = asyncio.create_task(self._run_agent_loop(session_id, new_content)) + self.tasks[session_id] = task + + async def switch_branch(self, session_id: str, branch_id: str): + session = self.sessions.get(session_id) + if not session: + raise ValueError(f"Session {session_id} not found") + if branch_id not in session.branches: + raise ValueError(f"Branch {branch_id} not found") + session.active_branch_id = branch_id + await ws_manager.send_to_session(session_id, "agent:branch_switched", { + "session_id": session_id, + "active_branch_id": branch_id, + }) + + async def generate_title(self, session_id: str, first_prompt: str) -> str: + """Use a cheap LLM call to generate a short chat title from the first user message.""" + session = self.sessions.get(session_id) + if not session: + raise ValueError(f"Session {session_id} not found") + + title = first_prompt[:40].strip() + try: + import anthropic + global_settings = load_settings() + client_kwargs = {} + if global_settings.anthropic_api_key: + client_kwargs["api_key"] = global_settings.anthropic_api_key + client = anthropic.AsyncAnthropic(**client_kwargs) + resp = await client.messages.create( + model="claude-sonnet-4-20250514", + max_tokens=30, + system="Generate a concise 3-6 word title for a chat that starts with this message. Return only the title, nothing else.", + messages=[{"role": "user", "content": first_prompt}], + ) + generated = resp.content[0].text.strip().strip('"\'') + if generated: + title = generated + except Exception as e: + logger.warning(f"Title generation failed, using fallback: {e}") + + session.name = title + await ws_manager.send_to_session(session_id, "agent:name_updated", { + "session_id": session_id, + "name": title, + }) + return title + + async def generate_group_meta( + self, + session_id: str, + group_id: str, + tool_calls: list[dict], + results_summary: list[str] | None = None, + is_refinement: bool = False, + ) -> dict: + """Use a cheap LLM call to generate a name + SVG icon for a tool group.""" + session = self.sessions.get(session_id) + if not session: + raise ValueError(f"Session {session_id} not found") + + fallback_name = tool_calls[0].get("tool", "Tool calls") if tool_calls else "Tool calls" + fallback_name = fallback_name.split("__")[-1].replace("_", " ").title() if "__" in fallback_name else fallback_name + + name = fallback_name + svg = "" + + try: + import anthropic, json as _json + global_settings = load_settings() + client_kwargs = {} + if global_settings.anthropic_api_key: + client_kwargs["api_key"] = global_settings.anthropic_api_key + client = anthropic.AsyncAnthropic(**client_kwargs) + + tool_desc = "\n".join( + f"- {tc.get('tool', '?')}: {tc.get('input_summary', '')}" for tc in tool_calls + ) + user_content = f"Tool actions:\n{tool_desc}" + if results_summary: + user_content += f"\n\nResults:\n" + "\n".join(f"- {r}" for r in results_summary) + + system = ( + "Generate a concise 2-5 word name and a minimal SVG icon for a group of tool actions.\n\n" + "Return ONLY valid JSON: {\"name\": \"...\", \"svg\": \"...\"}\n\n" + "Name rules:\n" + "- 2-5 words, title case, describes the action (e.g. \"Email Inbox Search\", \"Reading Project Files\")\n\n" + "SVG rules:\n" + "- 24x24 viewBox\n" + "- Use currentColor for all stroke/fill values\n" + "- Simple geometric shapes only (line, circle, rect, path, polyline)\n" + "- No text elements, no embedded images, no gradients, no filters\n" + "- Minimal: 1-3 shapes, stroke-width=\"1.5\", fill=\"none\" unless intentional\n" + "- Return ONLY the inner SVG elements (no outer tag)\n" + "- Max 400 characters for the svg string" + ) + + resp = await client.messages.create( + model="claude-sonnet-4-20250514", + max_tokens=300, + system=system, + messages=[{"role": "user", "content": user_content}], + ) + + raw = resp.content[0].text.strip() + if raw.startswith("```"): + raw = raw.split("\n", 1)[-1].rsplit("```", 1)[0].strip() + parsed = _json.loads(raw) + if parsed.get("name"): + name = parsed["name"].strip().strip("\"'") + if parsed.get("svg"): + svg = parsed["svg"].strip() + except Exception as e: + logger.warning(f"Group meta generation failed, using fallback: {e}") + + meta = ToolGroupMeta(id=group_id, name=name, svg=svg, is_refined=is_refinement) + session.tool_group_meta[group_id] = meta + + await ws_manager.send_to_session(session_id, "agent:group_meta_updated", { + "session_id": session_id, + "group_id": group_id, + "name": name, + "svg": svg, + "is_refined": is_refinement, + }) + + return {"name": name, "svg": svg, "is_refined": is_refinement} + + async def update_session(self, session_id: str, **fields): + """Update mutable session fields (system_prompt, name).""" + session = self.sessions.get(session_id) + if not session: + raise ValueError(f"Session {session_id} not found") + + allowed = {"system_prompt", "name"} + for key, value in fields.items(): + if key in allowed: + setattr(session, key, value) + + await ws_manager.send_to_session(session_id, "agent:status", { + "session_id": session_id, + "status": session.status, + "session": session.model_dump(mode="json"), + }) + + @staticmethod + def _build_search_text(session: AgentSession, max_len: int = 5000) -> str: + """Build a search-indexing string from the session name and message content.""" + parts = [session.name or ""] + for msg in session.messages: + if msg.role in ("user", "assistant") and isinstance(msg.content, str): + parts.append(msg.content) + text = " ".join(parts) + return text[:max_len] + + async def close_session(self, session_id: str) -> None: + """Close a session: pause the agent if running, persist to JSON file, + and remove from in-memory state. Worktree is kept on disk for resume.""" + task = self.tasks.get(session_id) + if task and not task.done(): + task.cancel() + try: + await task + except asyncio.CancelledError: + pass + + session = self.sessions.get(session_id) + if not session: + raise ValueError(f"Session {session_id} not found") + + if session.status in ("running", "waiting_approval"): + session.status = "stopped" + session.closed_at = datetime.now() + session.pending_approvals = [] + + doc_data = session.model_dump(mode="json") + doc_data["search_text"] = self._build_search_text(session) + + _save_session(session_id, doc_data) + + await ws_manager.send_to_session(session_id, "agent:closed", { + "session_id": session_id, + "status": session.status, + "name": session.name, + "model": session.model, + "mode": session.mode, + "created_at": session.created_at.isoformat() if session.created_at else None, + "closed_at": session.closed_at.isoformat() if session.closed_at else None, + "cost_usd": session.cost_usd, + "dashboard_id": session.dashboard_id, + }) + + self.sessions.pop(session_id, None) + self.tasks.pop(session_id, None) + logger.info(f"Session {session_id} closed and persisted") + + async def delete_session(self, session_id: str) -> None: + """Permanently delete a session: remove from memory, JSON file, worktree, and branch.""" + task = self.tasks.get(session_id) + if task and not task.done(): + task.cancel() + try: + await task + except asyncio.CancelledError: + pass + + session = self.sessions.pop(session_id, None) + self.tasks.pop(session_id, None) + + branch_name: str | None = None + if session: + branch_name = session.branch_name + else: + data = _load_session_data(session_id) + if data: + branch_name = data.get("branch_name") + + if branch_name: + await self.worktree_mgr.remove_worktree(branch_name) + await self.worktree_mgr.delete_branch(branch_name) + + _delete_session_file(session_id) + logger.info(f"Session {session_id} permanently deleted") + + async def resume_session(self, session_id: str) -> AgentSession: + """Restore a closed session from JSON file back into active memory.""" + if session_id in self.sessions: + return self.sessions[session_id] + + data = _load_session_data(session_id) + if data is None: + raise ValueError(f"Session {session_id} not found in history") + + session = AgentSession(**data) + + if session.branch_name: + worktree_path = os.path.join(self.worktree_mgr.worktrees_dir, session.branch_name) + if not os.path.exists(worktree_path): + try: + worktree_path = await self.worktree_mgr.create_worktree(session.branch_name) + except RuntimeError: + new_branch = f"agent-{session_id[:8]}" + worktree_path = await self.worktree_mgr.create_worktree(new_branch) + session.branch_name = new_branch + session.worktree_path = worktree_path + + session.closed_at = None + self.sessions[session_id] = session + + _delete_session_file(session_id) + + await ws_manager.send_to_session(session_id, "agent:status", { + "session_id": session_id, + "status": session.status, + "session": session.model_dump(mode="json"), + }) + + logger.info(f"Session {session_id} resumed from history") + return session + + def get_history( + self, + q: str = "", + limit: int = 20, + offset: int = 0, + dashboard_id: str | None = None, + ) -> dict: + """Return paginated, optionally filtered summaries of closed sessions.""" + all_data = _load_all_session_data() + all_data.sort(key=lambda pair: pair[1].get("closed_at") or "", reverse=True) + + q_lower = q.strip().lower() + history = [] + for sid, data in all_data: + if dashboard_id and data.get("dashboard_id") != dashboard_id: + continue + if q_lower: + name = (data.get("name") or "").lower() + search_text = (data.get("search_text") or "").lower() + if q_lower not in name and q_lower not in search_text: + continue + history.append({ + "id": data.get("id", sid), + "name": data.get("name", "Untitled"), + "status": data.get("status", "stopped"), + "model": data.get("model", "sonnet"), + "mode": data.get("mode", "agent"), + "created_at": data.get("created_at"), + "closed_at": data.get("closed_at"), + "cost_usd": data.get("cost_usd", 0), + "dashboard_id": data.get("dashboard_id"), + }) + + total = len(history) + page = history[offset : offset + limit] + return { + "sessions": page, + "total": total, + "has_more": offset + limit < total, + } + + async def reconcile_on_startup(self) -> None: + """Mark any stale running sessions as stopped.""" + for sid, data in _load_all_session_data(): + if data.get("status") in ("running", "waiting_approval"): + data["status"] = "stopped" + _save_session(sid, data) + logger.info(f"Marked stale session {sid} as stopped") + + async def persist_all_sessions(self) -> None: + """Flush every in-memory session to JSON files (for graceful shutdown).""" + for session_id, session in list(self.sessions.items()): + if session.status in ("running", "waiting_approval"): + session.status = "stopped" + session.pending_approvals = [] + session.closed_at = session.closed_at or datetime.now() + doc_data = session.model_dump(mode="json") + doc_data["search_text"] = self._build_search_text(session) + _save_session(session_id, doc_data) + logger.info(f"Persisted session {session_id} on shutdown") + self.sessions.clear() + self.tasks.clear() + + async def restore_all_sessions(self) -> None: + """On startup, reload all persisted sessions from JSON files back into memory.""" + for sid, data in _load_all_session_data(): + try: + session = AgentSession(**data) + except Exception as e: + logger.warning(f"Skipping corrupt session file {sid}: {e}") + continue + if session.status in ("running", "waiting_approval"): + session.status = "stopped" + session.closed_at = None + session.pending_approvals = [] + if session.branch_name: + worktree_path = os.path.join( + self.worktree_mgr.worktrees_dir, session.branch_name + ) + if not os.path.exists(worktree_path): + try: + worktree_path = await self.worktree_mgr.create_worktree( + session.branch_name + ) + except RuntimeError: + logger.warning( + f"Could not restore worktree for session {session.id}, skipping" + ) + continue + session.worktree_path = worktree_path + self.sessions[session.id] = session + _delete_session_file(sid) + logger.info(f"Restored session {session.id}") + + def get_all_sessions(self, dashboard_id: str | None = None) -> list[AgentSession]: + if dashboard_id: + return [s for s in self.sessions.values() if s.dashboard_id == dashboard_id] + return list(self.sessions.values()) + + def get_session(self, session_id: str) -> Optional[AgentSession]: + return self.sessions.get(session_id) + +agent_manager = AgentManager() diff --git a/backend/apps/agents/agents.py b/backend/apps/agents/agents.py new file mode 100644 index 00000000..890ab856 --- /dev/null +++ b/backend/apps/agents/agents.py @@ -0,0 +1,177 @@ +from backend.config.Apps import SubApp +from backend.apps.agents.agent_manager import agent_manager +from backend.apps.agents.ws_manager import ws_manager +from backend.apps.agents.models import AgentConfig, ApprovalResponse +from contextlib import asynccontextmanager +from fastapi import WebSocket, WebSocketDisconnect, HTTPException +from fastapi.responses import JSONResponse +import json +import logging + +logger = logging.getLogger(__name__) + +@asynccontextmanager +async def agents_lifespan(): + logger.info("Agents sub-app starting") + await agent_manager.worktree_mgr.cleanup_all_worktrees() + await agent_manager.reconcile_on_startup() + await agent_manager.restore_all_sessions() + yield + logger.info("Agents sub-app shutting down") + for session_id in list(agent_manager.tasks.keys()): + await agent_manager.stop_agent(session_id) + await agent_manager.persist_all_sessions() + +agents = SubApp("agents", agents_lifespan) + +# REST Endpoints + +@agents.router.get("/sessions") +async def list_sessions(dashboard_id: str = ""): + sessions = agent_manager.get_all_sessions(dashboard_id=dashboard_id or None) + return {"sessions": [s.model_dump(mode="json") for s in sessions]} + +@agents.router.get("/sessions/{session_id}") +async def get_session(session_id: str): + session = agent_manager.get_session(session_id) + if not session: + raise HTTPException(status_code=404, detail="Session not found") + return session.model_dump(mode="json") + +@agents.router.post("/launch") +async def launch_agent(config: AgentConfig): + session = await agent_manager.launch_agent(config) + return {"session_id": session.id, "session": session.model_dump(mode="json")} + +@agents.router.post("/sessions/{session_id}/message") +async def send_message(session_id: str, body: dict): + prompt = body.get("prompt", "") + if not prompt: + raise HTTPException(status_code=400, detail="prompt is required") + await agent_manager.send_message( + session_id, + prompt, + mode=body.get("mode"), + model=body.get("model"), + images=body.get("images"), + context_paths=body.get("context_paths"), + forced_tools=body.get("forced_tools"), + attached_skills=body.get("attached_skills"), + ) + return {"ok": True} + +@agents.router.post("/sessions/{session_id}/stop") +async def stop_agent(session_id: str, body: dict = {}): + remove_worktree = body.get("remove_worktree", False) + await agent_manager.stop_agent(session_id, remove_worktree=remove_worktree) + return {"ok": True} + +@agents.router.post("/approval") +async def handle_approval(response: ApprovalResponse): + agent_manager.handle_approval(response.request_id, { + "behavior": response.behavior, + "message": response.message, + "updated_input": response.updated_input, + }) + return {"ok": True} + +@agents.router.post("/sessions/{session_id}/edit_message") +async def edit_message(session_id: str, body: dict): + message_id = body.get("message_id") + new_content = body.get("content", "") + if not message_id or not new_content: + raise HTTPException(status_code=400, detail="message_id and content are required") + await agent_manager.edit_message(session_id, message_id, new_content) + return {"ok": True} + +@agents.router.post("/sessions/{session_id}/switch_branch") +async def switch_branch(session_id: str, body: dict): + branch_id = body.get("branch_id", "") + if not branch_id: + raise HTTPException(status_code=400, detail="branch_id is required") + await agent_manager.switch_branch(session_id, branch_id) + return {"ok": True} + +@agents.router.post("/sessions/{session_id}/generate-title") +async def generate_title(session_id: str, body: dict): + prompt = body.get("prompt", "") + if not prompt: + raise HTTPException(status_code=400, detail="prompt is required") + title = await agent_manager.generate_title(session_id, prompt) + return {"title": title} + +@agents.router.post("/sessions/{session_id}/generate-group-meta") +async def generate_group_meta(session_id: str, body: dict): + group_id = body.get("group_id", "") + tool_calls = body.get("tool_calls", []) + if not group_id or not tool_calls: + raise HTTPException(status_code=400, detail="group_id and tool_calls are required") + result = await agent_manager.generate_group_meta( + session_id, + group_id, + tool_calls, + results_summary=body.get("results_summary"), + is_refinement=body.get("is_refinement", False), + ) + return result + +@agents.router.patch("/sessions/{session_id}") +async def update_session(session_id: str, body: dict): + session = agent_manager.get_session(session_id) + if not session: + raise HTTPException(status_code=404, detail="Session not found") + await agent_manager.update_session(session_id, **body) + return {"ok": True} + +@agents.router.get("/sessions/{session_id}/branches") +async def get_branches(session_id: str): + session = agent_manager.get_session(session_id) + if not session: + raise HTTPException(status_code=404, detail="Session not found") + return { + "branches": {k: v.model_dump(mode="json") for k, v in session.branches.items()}, + "active_branch_id": session.active_branch_id, + } + +@agents.router.post("/sessions/{session_id}/close") +async def close_session(session_id: str): + try: + await agent_manager.close_session(session_id) + except ValueError as e: + raise HTTPException(status_code=404, detail=str(e)) + return {"ok": True} + +@agents.router.delete("/sessions/{session_id}") +async def delete_session(session_id: str): + await agent_manager.delete_session(session_id) + return {"ok": True} + +@agents.router.get("/history") +async def get_history(q: str = "", limit: int = 20, offset: int = 0, dashboard_id: str = ""): + return agent_manager.get_history( + q=q, limit=limit, offset=offset, + dashboard_id=dashboard_id or None, + ) + +@agents.router.post("/sessions/{session_id}/resume") +async def resume_session(session_id: str): + try: + session = await agent_manager.resume_session(session_id) + except ValueError as e: + raise HTTPException(status_code=404, detail=str(e)) + return {"session": session.model_dump(mode="json")} + +@agents.router.get("/worktrees") +async def list_worktrees(): + worktrees = await agent_manager.worktree_mgr.list_worktrees() + return {"worktrees": worktrees} + +@agents.router.get("/sessions/{session_id}/diff") +async def get_session_diff(session_id: str): + session = agent_manager.get_session(session_id) + if not session: + raise HTTPException(status_code=404, detail="Session not found") + if not session.branch_name: + return {"diff": ""} + diff = await agent_manager.worktree_mgr.get_worktree_diff(session.branch_name) + return {"diff": diff} diff --git a/backend/apps/agents/models.py b/backend/apps/agents/models.py new file mode 100644 index 00000000..06805ac0 --- /dev/null +++ b/backend/apps/agents/models.py @@ -0,0 +1,75 @@ +from pydantic import BaseModel, Field +from typing import Optional, Literal, Any +from datetime import datetime +from uuid import uuid4 + +class AgentConfig(BaseModel): + name: str = Field(default_factory=lambda: f"Agent-{uuid4().hex[:6]}") + model: str = "sonnet" + mode: str = "agent" + system_prompt: Optional[str] = None + allowed_tools: list[str] = Field(default_factory=lambda: ["Read", "Edit", "Write", "Bash", "Glob", "Grep", "AskUserQuestion"]) + max_turns: Optional[int] = None + target_directory: Optional[str] = None # if None, uses repo root + dashboard_id: Optional[str] = None + +class ApprovalRequest(BaseModel): + id: str = Field(default_factory=lambda: uuid4().hex) + session_id: str + tool_name: str + tool_input: dict[str, Any] + created_at: datetime = Field(default_factory=datetime.now) + +class ApprovalResponse(BaseModel): + request_id: str + behavior: Literal["allow", "deny"] + message: Optional[str] = None + updated_input: Optional[dict[str, Any]] = None + +class Message(BaseModel): + id: str = Field(default_factory=lambda: uuid4().hex) + role: Literal["user", "assistant", "tool_call", "tool_result", "system"] + content: Any # str or list of content blocks + timestamp: datetime = Field(default_factory=datetime.now) + branch_id: str = "main" + parent_id: Optional[str] = None + context_paths: Optional[list[dict]] = None + attached_skills: Optional[list[dict]] = None + forced_tools: Optional[list[str]] = None + images: Optional[list[dict]] = None + +class MessageBranch(BaseModel): + id: str = Field(default_factory=lambda: uuid4().hex) + parent_branch_id: Optional[str] = None + fork_point_message_id: Optional[str] = None + created_at: datetime = Field(default_factory=datetime.now) + +class ToolGroupMeta(BaseModel): + id: str + name: str + svg: str = "" + is_refined: bool = False + +class AgentSession(BaseModel): + id: str = Field(default_factory=lambda: uuid4().hex) + name: str + status: Literal["running", "waiting_approval", "completed", "error", "stopped"] = "running" + model: str = "sonnet" + mode: str = "agent" + worktree_path: Optional[str] = None + branch_name: Optional[str] = None + sdk_session_id: Optional[str] = None + system_prompt: Optional[str] = None + allowed_tools: list[str] = Field(default_factory=list) + max_turns: Optional[int] = None + cwd: Optional[str] = None + created_at: datetime = Field(default_factory=datetime.now) + closed_at: Optional[datetime] = None + cost_usd: float = 0.0 + tokens: dict[str, int] = Field(default_factory=lambda: {"input": 0, "output": 0}) + messages: list[Message] = Field(default_factory=list) + pending_approvals: list[ApprovalRequest] = Field(default_factory=list) + branches: dict[str, "MessageBranch"] = Field(default_factory=lambda: {"main": MessageBranch(id="main")}) + active_branch_id: str = "main" + tool_group_meta: dict[str, "ToolGroupMeta"] = Field(default_factory=dict) + dashboard_id: Optional[str] = None diff --git a/backend/apps/agents/worktree_manager.py b/backend/apps/agents/worktree_manager.py new file mode 100644 index 00000000..ebddb7e1 --- /dev/null +++ b/backend/apps/agents/worktree_manager.py @@ -0,0 +1,130 @@ +import asyncio +import os +import shutil +import logging + +logger = logging.getLogger(__name__) + +class WorktreeManager: + def __init__(self, repo_root: str): + self.repo_root = repo_root + self.worktrees_dir = os.path.join(repo_root, ".worktrees") + os.makedirs(self.worktrees_dir, exist_ok=True) + + async def create_worktree(self, branch_name: str) -> str: + """Create a new git worktree and return its path.""" + worktree_path = os.path.join(self.worktrees_dir, branch_name) + if os.path.exists(worktree_path): + return worktree_path + + proc = await asyncio.create_subprocess_exec( + "git", "worktree", "add", worktree_path, "-b", branch_name, + cwd=self.repo_root, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + stdout, stderr = await proc.communicate() + if proc.returncode != 0: + proc = await asyncio.create_subprocess_exec( + "git", "worktree", "add", worktree_path, branch_name, + cwd=self.repo_root, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + stdout, stderr = await proc.communicate() + if proc.returncode != 0: + raise RuntimeError(f"Failed to create worktree: {stderr.decode()}") + + logger.info(f"Created worktree at {worktree_path} on branch {branch_name}") + return worktree_path + + async def remove_worktree(self, branch_name: str) -> None: + """Remove a git worktree.""" + worktree_path = os.path.join(self.worktrees_dir, branch_name) + if not os.path.exists(worktree_path): + return + + proc = await asyncio.create_subprocess_exec( + "git", "worktree", "remove", worktree_path, "--force", + cwd=self.repo_root, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + await proc.communicate() + logger.info(f"Removed worktree at {worktree_path}") + + async def list_worktrees(self) -> list[dict]: + """List all worktrees with their branch and path info.""" + proc = await asyncio.create_subprocess_exec( + "git", "worktree", "list", "--porcelain", + cwd=self.repo_root, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + stdout, _ = await proc.communicate() + + worktrees = [] + current = {} + for line in stdout.decode().strip().split("\n"): + if line.startswith("worktree "): + if current: + worktrees.append(current) + current = {"path": line.split(" ", 1)[1]} + elif line.startswith("HEAD "): + current["head"] = line.split(" ", 1)[1] + elif line.startswith("branch "): + current["branch"] = line.split(" ", 1)[1].replace("refs/heads/", "") + elif line == "": + if current: + worktrees.append(current) + current = {} + if current: + worktrees.append(current) + return worktrees + + async def delete_branch(self, branch_name: str) -> None: + """Delete a local git branch.""" + proc = await asyncio.create_subprocess_exec( + "git", "branch", "-D", branch_name, + cwd=self.repo_root, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + stdout, stderr = await proc.communicate() + if proc.returncode == 0: + logger.info(f"Deleted branch {branch_name}") + else: + logger.warning(f"Could not delete branch {branch_name}: {stderr.decode().strip()}") + + async def cleanup_all_worktrees(self) -> None: + """Remove all worktree directories and prune stale git worktree refs.""" + if os.path.exists(self.worktrees_dir): + for entry in os.listdir(self.worktrees_dir): + entry_path = os.path.join(self.worktrees_dir, entry) + if os.path.isdir(entry_path): + shutil.rmtree(entry_path, ignore_errors=True) + logger.info("Removed all worktree directories") + + proc = await asyncio.create_subprocess_exec( + "git", "worktree", "prune", + cwd=self.repo_root, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + await proc.communicate() + logger.info("Pruned stale git worktree refs") + + async def get_worktree_diff(self, branch_name: str) -> str: + """Get the diff of uncommitted changes in a worktree.""" + worktree_path = os.path.join(self.worktrees_dir, branch_name) + if not os.path.exists(worktree_path): + return "" + + proc = await asyncio.create_subprocess_exec( + "git", "diff", "HEAD", + cwd=worktree_path, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + stdout, _ = await proc.communicate() + return stdout.decode() diff --git a/backend/apps/agents/ws_manager.py b/backend/apps/agents/ws_manager.py new file mode 100644 index 00000000..3d17b326 --- /dev/null +++ b/backend/apps/agents/ws_manager.py @@ -0,0 +1,88 @@ +import asyncio +import json +import logging +from fastapi import WebSocket + +logger = logging.getLogger(__name__) + +class ConnectionManager: + """Manages WebSocket connections and bridges HITL approval requests.""" + + def __init__(self): + self.connections: dict[str, list[WebSocket]] = {} + self.global_connections: list[WebSocket] = [] + self.pending_futures: dict[str, asyncio.Future] = {} + + async def connect_session(self, session_id: str, websocket: WebSocket): + await websocket.accept() + if session_id not in self.connections: + self.connections[session_id] = [] + self.connections[session_id].append(websocket) + + async def connect_global(self, websocket: WebSocket): + await websocket.accept() + self.global_connections.append(websocket) + + def disconnect_session(self, session_id: str, websocket: WebSocket): + if session_id in self.connections: + self.connections[session_id] = [ + ws for ws in self.connections[session_id] if ws != websocket + ] + if not self.connections[session_id]: + del self.connections[session_id] + + def disconnect_global(self, websocket: WebSocket): + self.global_connections = [ + ws for ws in self.global_connections if ws != websocket + ] + + async def send_to_session(self, session_id: str, event: str, data: dict): + """Send a message to all connections watching a specific session.""" + payload = json.dumps({"event": event, "session_id": session_id, "data": data}) + for ws in self.connections.get(session_id, []): + try: + await ws.send_text(payload) + except Exception: + pass + for ws in self.global_connections: + try: + await ws.send_text(payload) + except Exception: + pass + + async def broadcast_global(self, event: str, data: dict): + """Send a message to all global (dashboard) connections.""" + payload = json.dumps({"event": event, "data": data}) + for ws in self.global_connections: + try: + await ws.send_text(payload) + except Exception: + pass + + async def send_approval_request( + self, session_id: str, request_id: str, tool_name: str, tool_input: dict + ) -> dict: + """Send an approval request and wait for the user's response. + Returns the approval decision dict.""" + future = asyncio.get_event_loop().create_future() + self.pending_futures[request_id] = future + + await self.send_to_session(session_id, "agent:approval_request", { + "request_id": request_id, + "tool_name": tool_name, + "tool_input": tool_input, + }) + + try: + result = await future + return result + finally: + self.pending_futures.pop(request_id, None) + + def resolve_approval(self, request_id: str, decision: dict): + """Resolve a pending approval Future with the user's decision.""" + future = self.pending_futures.get(request_id) + if future and not future.done(): + future.set_result(decision) + +ws_manager = ConnectionManager() diff --git a/backend/apps/dashboard_layout/__init__.py b/backend/apps/dashboard_layout/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/apps/dashboard_layout/dashboard_layout.py b/backend/apps/dashboard_layout/dashboard_layout.py new file mode 100644 index 00000000..c3f23355 --- /dev/null +++ b/backend/apps/dashboard_layout/dashboard_layout.py @@ -0,0 +1,57 @@ +import json +import os +import logging +from contextlib import asynccontextmanager +from backend.config.Apps import SubApp +from backend.apps.dashboard_layout.models import DashboardLayout, DashboardLayoutUpdate + +logger = logging.getLogger(__name__) + +DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "data", "dashboard_layout") +LAYOUT_FILE = os.path.join(DATA_DIR, "layout.json") + + +@asynccontextmanager +async def dashboard_layout_lifespan(): + os.makedirs(DATA_DIR, exist_ok=True) + yield + + +dashboard_layout = SubApp("dashboard_layout", dashboard_layout_lifespan) + + +def _default_layout() -> DashboardLayout: + return DashboardLayout(cards={}) + + +def _load() -> DashboardLayout: + if not os.path.exists(LAYOUT_FILE): + return _default_layout() + try: + with open(LAYOUT_FILE) as f: + data = json.load(f) + if "columns" in data and "cards" not in data: + logger.info("Detected old column-based layout format, resetting to empty canvas") + return _default_layout() + return DashboardLayout(**data) + except Exception: + logger.exception("Failed to load dashboard layout, returning default") + return _default_layout() + + +def _save(layout: DashboardLayout): + with open(LAYOUT_FILE, "w") as f: + json.dump(layout.model_dump(), f, indent=2) + + +@dashboard_layout.router.get("") +async def get_layout(): + layout = _load() + return layout.model_dump() + + +@dashboard_layout.router.put("") +async def update_layout(body: DashboardLayoutUpdate): + layout = DashboardLayout(cards=body.cards, view_cards=body.view_cards) + _save(layout) + return layout.model_dump() diff --git a/backend/apps/dashboard_layout/models.py b/backend/apps/dashboard_layout/models.py new file mode 100644 index 00000000..65193747 --- /dev/null +++ b/backend/apps/dashboard_layout/models.py @@ -0,0 +1,27 @@ +from pydantic import BaseModel, Field + + +class CardPosition(BaseModel): + session_id: str + x: float = 0 + y: float = 0 + width: float = 420 + height: float = 280 + + +class ViewCardPosition(BaseModel): + output_id: str + x: float = 0 + y: float = 0 + width: float = 480 + height: float = 360 + + +class DashboardLayout(BaseModel): + cards: dict[str, CardPosition] = Field(default_factory=dict) + view_cards: dict[str, ViewCardPosition] = Field(default_factory=dict) + + +class DashboardLayoutUpdate(BaseModel): + cards: dict[str, CardPosition] + view_cards: dict[str, ViewCardPosition] = Field(default_factory=dict) diff --git a/backend/apps/dashboards/dashboards.py b/backend/apps/dashboards/dashboards.py new file mode 100644 index 00000000..1c2d2a45 --- /dev/null +++ b/backend/apps/dashboards/dashboards.py @@ -0,0 +1,199 @@ +import json +import os +import logging +from contextlib import asynccontextmanager +from datetime import datetime +from uuid import uuid4 + +from backend.config.Apps import SubApp +from backend.apps.dashboards.models import ( + Dashboard, + DashboardCreate, + DashboardUpdate, + DashboardLayout, + CardPosition, + ViewCardPosition, +) +from fastapi import HTTPException + +logger = logging.getLogger(__name__) + +BACKEND_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +DATA_DIR = os.path.join(BACKEND_DIR, "data", "dashboards") +SESSIONS_DIR = os.path.join(BACKEND_DIR, "data", "sessions") + +OLD_LAYOUT_DIR = os.path.join(BACKEND_DIR, "data", "dashboard_layout") +OLD_LAYOUT_FILE = os.path.join(OLD_LAYOUT_DIR, "layout.json") + + +def _load_all() -> list[Dashboard]: + result = [] + if not os.path.exists(DATA_DIR): + return result + for fname in os.listdir(DATA_DIR): + if fname.endswith(".json"): + with open(os.path.join(DATA_DIR, fname)) as f: + result.append(Dashboard(**json.load(f))) + return result + + +def _save(dashboard: Dashboard): + with open(os.path.join(DATA_DIR, f"{dashboard.id}.json"), "w") as f: + json.dump(dashboard.model_dump(mode="json"), f, indent=2) + + +def _load(dashboard_id: str) -> Dashboard: + path = os.path.join(DATA_DIR, f"{dashboard_id}.json") + if not os.path.exists(path): + raise HTTPException(status_code=404, detail="Dashboard not found") + with open(path) as f: + return Dashboard(**json.load(f)) + + +def _delete(dashboard_id: str): + path = os.path.join(DATA_DIR, f"{dashboard_id}.json") + if os.path.exists(path): + os.remove(path) + + +def _migrate_if_needed(): + """One-time migration: if no dashboards exist, create 'Dashboard 1' from old layout.""" + existing = _load_all() + if existing: + return + + logger.info("No dashboards found — running one-time migration") + + layout = DashboardLayout() + if os.path.exists(OLD_LAYOUT_FILE): + try: + with open(OLD_LAYOUT_FILE) as f: + data = json.load(f) + if "cards" in data: + layout = DashboardLayout(**data) + logger.info("Migrated layout from old layout.json") + except Exception: + logger.exception("Failed to read old layout.json, using empty layout") + + dashboard = Dashboard(name="Dashboard 1", layout=layout) + _save(dashboard) + logger.info(f"Created default dashboard: {dashboard.id}") + + if os.path.exists(SESSIONS_DIR): + count = 0 + for fname in os.listdir(SESSIONS_DIR): + if not fname.endswith(".json"): + continue + fpath = os.path.join(SESSIONS_DIR, fname) + with open(fpath) as f: + session_data = json.load(f) + session_data["dashboard_id"] = dashboard.id + with open(fpath, "w") as f: + json.dump(session_data, f, indent=2) + count += 1 + if count: + logger.info(f"Tagged {count} existing chat sessions with dashboard_id={dashboard.id}") + + +@asynccontextmanager +async def dashboards_lifespan(): + os.makedirs(DATA_DIR, exist_ok=True) + _migrate_if_needed() + yield + + +dashboards = SubApp("dashboards", dashboards_lifespan) + + +@dashboards.router.get("/list") +async def list_dashboards(): + all_dashboards = _load_all() + all_dashboards.sort(key=lambda d: d.updated_at or d.created_at, reverse=True) + items = [] + for d in all_dashboards: + dumped = d.model_dump(mode="json") + items.append({ + "id": dumped["id"], + "name": dumped.get("name", "Untitled"), + "created_at": dumped.get("created_at"), + "updated_at": dumped.get("updated_at"), + }) + return {"dashboards": items} + + +@dashboards.router.post("/create") +async def create_dashboard(body: DashboardCreate): + dashboard = Dashboard(name=body.name) + _save(dashboard) + return dashboard.model_dump(mode="json") + + +@dashboards.router.get("/{dashboard_id}") +async def get_dashboard(dashboard_id: str): + dashboard = _load(dashboard_id) + return dashboard.model_dump(mode="json") + + +@dashboards.router.put("/{dashboard_id}") +async def update_dashboard(dashboard_id: str, body: DashboardUpdate): + dashboard = _load(dashboard_id) + if body.name is not None: + dashboard.name = body.name + if body.layout is not None: + dashboard.layout = body.layout + dashboard.updated_at = datetime.now() + _save(dashboard) + return dashboard.model_dump(mode="json") + + +@dashboards.router.delete("/{dashboard_id}") +async def delete_dashboard(dashboard_id: str): + _load(dashboard_id) + + if os.path.exists(SESSIONS_DIR): + for fname in os.listdir(SESSIONS_DIR): + if not fname.endswith(".json"): + continue + fpath = os.path.join(SESSIONS_DIR, fname) + try: + with open(fpath) as f: + data = json.load(f) + if data.get("dashboard_id") == dashboard_id: + os.remove(fpath) + except Exception: + logger.warning(f"Failed to read/delete session file {fname}") + + from backend.apps.agents.agent_manager import agent_manager + to_remove = [ + sid for sid, sess in agent_manager.sessions.items() + if getattr(sess, "dashboard_id", None) == dashboard_id + ] + for sid in to_remove: + try: + await agent_manager.delete_session(sid) + except Exception: + logger.warning(f"Failed to delete active session {sid} during dashboard deletion") + + _delete(dashboard_id) + return {"ok": True} + + +@dashboards.router.post("/{dashboard_id}/duplicate") +async def duplicate_dashboard(dashboard_id: str): + source = _load(dashboard_id) + source_data = source.model_dump(mode="json") + new_id = uuid4().hex + now = datetime.now().isoformat() + + new_dashboard = { + **source_data, + "id": new_id, + "name": f"{source_data.get('name', 'Untitled')} (copy)", + "created_at": now, + "updated_at": now, + "layout": {"cards": {}, "view_cards": source_data.get("layout", {}).get("view_cards", {})}, + } + with open(os.path.join(DATA_DIR, f"{new_id}.json"), "w") as f: + json.dump(new_dashboard, f, indent=2) + + return new_dashboard diff --git a/backend/apps/dashboards/models.py b/backend/apps/dashboards/models.py new file mode 100644 index 00000000..149f2069 --- /dev/null +++ b/backend/apps/dashboards/models.py @@ -0,0 +1,42 @@ +from pydantic import BaseModel, Field +from typing import Optional +from datetime import datetime +from uuid import uuid4 + + +class CardPosition(BaseModel): + session_id: str + x: float = 0 + y: float = 0 + width: float = 420 + height: float = 280 + + +class ViewCardPosition(BaseModel): + output_id: str + x: float = 0 + y: float = 0 + width: float = 480 + height: float = 360 + + +class DashboardLayout(BaseModel): + cards: dict[str, CardPosition] = Field(default_factory=dict) + view_cards: dict[str, ViewCardPosition] = Field(default_factory=dict) + + +class Dashboard(BaseModel): + id: str = Field(default_factory=lambda: uuid4().hex) + name: str = "Untitled Dashboard" + created_at: datetime = Field(default_factory=datetime.now) + updated_at: datetime = Field(default_factory=datetime.now) + layout: DashboardLayout = Field(default_factory=DashboardLayout) + + +class DashboardCreate(BaseModel): + name: str = "Untitled Dashboard" + + +class DashboardUpdate(BaseModel): + name: Optional[str] = None + layout: Optional[DashboardLayout] = None diff --git a/backend/apps/health/health.py b/backend/apps/health/health.py new file mode 100644 index 00000000..1ffbddfd --- /dev/null +++ b/backend/apps/health/health.py @@ -0,0 +1,33 @@ +from backend.config.Apps import SubApp +from contextlib import asynccontextmanager +from fastapi.responses import PlainTextResponse +from typeguard import typechecked +import debug +from fastapi import status, HTTPException + +@asynccontextmanager +async def health_lifespan(): + debug("START") + yield + debug("END") + +health = SubApp("health", health_lifespan) + +###################################### +# Health Check Endpoints # +###################################### + +@health.router.get("/check") +@typechecked +async def check() -> PlainTextResponse: + debug("Health check successful") + # Use PlainTextResponse instead of JSONResponse for AWS ALB compatibility + # ALB health checks can be sensitive to JSON responses and Content-Length headers + return PlainTextResponse( + content="OK", + status_code=status.HTTP_200_OK, + headers={ + "Content-Type": "text/plain", + "Content-Length": "2" + } + ) \ No newline at end of file diff --git a/backend/apps/mcp_registry/__init__.py b/backend/apps/mcp_registry/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/apps/mcp_registry/mcp_registry.py b/backend/apps/mcp_registry/mcp_registry.py new file mode 100644 index 00000000..4a8bdeac --- /dev/null +++ b/backend/apps/mcp_registry/mcp_registry.py @@ -0,0 +1,393 @@ +import asyncio +import logging +import os +import re +import time +from contextlib import asynccontextmanager +from typing import Optional + +import httpx +from fastapi import Query +from backend.config.Apps import SubApp + +logger = logging.getLogger(__name__) + +REGISTRY_BASE = "https://registry.modelcontextprotocol.io/v0.1" +PAGE_LIMIT = 100 +REFRESH_INTERVAL_S = 3600 + +GITHUB_TOKEN = os.environ.get("GITHUB_TOKEN", "") +GITHUB_BATCH = 4000 if GITHUB_TOKEN else 50 +GITHUB_CONCURRENT = 10 + +_cache: dict[str, dict] = {} +_cache_updated_at: float = 0 +_refresh_task: Optional[asyncio.Task] = None +_stars_cache: dict[str, int] = {} + + +def _extract_gh_repo(repo_url: str) -> Optional[str]: + """Parse 'owner/repo' from a GitHub URL.""" + if not repo_url or "github.com" not in repo_url: + return None + parts = repo_url.rstrip("/").split("/") + try: + idx = next(i for i, p in enumerate(parts) if "github.com" in p) + if len(parts) > idx + 2: + owner = parts[idx + 1] + repo = parts[idx + 2].removesuffix(".git") + return f"{owner}/{repo}" + except StopIteration: + pass + return None + + +def _extract_server(entry: dict) -> Optional[dict]: + """Extract a flat server record from a registry entry, keeping only latest versions.""" + meta = entry.get("_meta", {}).get("io.modelcontextprotocol.registry/official", {}) + if not meta.get("isLatest"): + return None + + srv = entry.get("server", {}) + name = srv.get("name", "") + if not name: + return None + + remotes = srv.get("remotes", []) + remote_url = "" + remote_type = "" + if remotes: + remote_url = remotes[0].get("url", "") + remote_type = remotes[0].get("type", "") + + repo = srv.get("repository", {}) + + packages = srv.get("packages", []) + env_vars = [] + if packages: + env_vars = packages[0].get("environmentVariables", []) + + pub_meta = srv.get("_meta", {}).get("io.modelcontextprotocol.registry/publisher-provided", {}) + + icons = srv.get("icons", []) + icon_url = icons[0]["src"] if icons else "" + repo_url = repo.get("url", "") if isinstance(repo, dict) else "" + if not icon_url and repo_url and "github.com" in repo_url: + parts = repo_url.rstrip("/").split("/") + gh_idx = next((i for i, p in enumerate(parts) if "github.com" in p), -1) + if gh_idx >= 0 and len(parts) > gh_idx + 1: + icon_url = f"https://github.com/{parts[gh_idx + 1]}.png?size=64" + + return { + "name": name, + "title": srv.get("title", ""), + "description": srv.get("description", ""), + "version": srv.get("version", ""), + "websiteUrl": srv.get("websiteUrl", ""), + "repositoryUrl": repo_url, + "remoteUrl": remote_url, + "remoteType": remote_type, + "iconUrl": icon_url, + "environmentVariables": env_vars, + "keywords": pub_meta.get("keywords", []), + "license": pub_meta.get("license", ""), + "stars": None, + "source": "community", + } + + +async def _fetch_all_servers() -> dict[str, dict]: + """Paginate through the full registry and return a dict keyed by server name.""" + servers: dict[str, dict] = {} + cursor: Optional[str] = None + pages = 0 + + async with httpx.AsyncClient(timeout=30.0) as client: + while True: + params: dict = {"limit": PAGE_LIMIT} + if cursor: + params["cursor"] = cursor + + try: + resp = await client.get(f"{REGISTRY_BASE}/servers", params=params) + resp.raise_for_status() + data = resp.json() + except Exception as e: + logger.warning(f"MCP registry fetch failed on page {pages}: {e}") + break + + entries = data.get("servers", []) + if not entries: + break + + for entry in entries: + record = _extract_server(entry) + if record: + servers[record["name"]] = record + + pages += 1 + next_cursor = data.get("metadata", {}).get("nextCursor") + if not next_cursor: + break + cursor = next_cursor + + logger.info(f"MCP registry cache refreshed: {len(servers)} servers from {pages} pages") + return servers + + +GOOGLE_README_URL = "https://raw.githubusercontent.com/google/mcp/main/README.md" +GOOGLE_ICON_URL = "https://github.com/google.png?size=64" +_ENTRY_RE = re.compile(r"\[\*\*(.+?)\*\*\]\((.+?)\)(?:[,\s]*(.+))?") + + +def _slugify(name: str) -> str: + return re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") + + +def _parse_google_readme(text: str) -> dict[str, dict]: + servers: dict[str, dict] = {} + section: Optional[str] = None + + for line in text.splitlines(): + stripped = line.strip() + if "remote mcp servers" in stripped.lower() and stripped.startswith("#"): + section = "remote" + continue + if "open-source mcp servers" in stripped.lower() and stripped.startswith("#"): + section = "open-source" + continue + if stripped.startswith("#") and section is not None: + # Hit a new top-level section (e.g. Examples, Resources), stop parsing + if not stripped.lower().startswith("### **"): + section = None + continue + if section is None: + continue + + m = _ENTRY_RE.search(stripped) + if not m: + continue + + title = m.group(1).strip() + url = m.group(2).strip() + desc_raw = (m.group(3) or "").strip().rstrip(".") + + slug = _slugify(title) + key = f"google/{slug}" + + is_github = "github.com" in url or "go.dev" in url + repo_url = url if is_github else "" + website_url = url if not is_github else "" + + if section == "remote": + remote_type = "google-cloud-remote" + description = desc_raw or f"Google Cloud managed MCP server for {title}" + else: + remote_type = "open-source" + description = desc_raw or f"Google open-source MCP server for {title}" + + servers[key] = { + "name": key, + "title": title, + "description": description, + "version": "", + "websiteUrl": website_url, + "repositoryUrl": repo_url, + "remoteUrl": "", + "remoteType": remote_type, + "iconUrl": GOOGLE_ICON_URL, + "environmentVariables": [], + "keywords": ["google", section], + "license": "Apache-2.0", + "stars": None, + "source": "google", + } + + return servers + + +async def _fetch_google_servers() -> dict[str, dict]: + """Fetch and parse Google's MCP server catalog from their GitHub README.""" + try: + async with httpx.AsyncClient(timeout=15.0) as client: + resp = await client.get(GOOGLE_README_URL) + resp.raise_for_status() + servers = _parse_google_readme(resp.text) + logger.info(f"Google MCP catalog: parsed {len(servers)} servers") + return servers + except Exception as e: + logger.warning(f"Google MCP catalog fetch failed: {e}") + return {} + + +async def _fetch_github_stars(servers: dict[str, dict]): + """Batch-fetch GitHub star counts for servers with GitHub repos. + + Uses an in-memory cache so stars accumulate across refresh cycles even + when rate-limited (60 req/hr unauthenticated, 5 000 with GITHUB_TOKEN). + """ + global _stars_cache + + needed: list[str] = [] + for srv in servers.values(): + gh = _extract_gh_repo(srv.get("repositoryUrl", "")) + if gh and gh not in _stars_cache and gh not in needed: + needed.append(gh) + + if not needed: + logger.info(f"GitHub stars: all {len(_stars_cache)} repos cached, 0 to fetch") + _apply_stars(servers) + return + + to_fetch = needed[: GITHUB_BATCH] + logger.info( + f"GitHub stars: fetching {len(to_fetch)} repos " + f"({len(_stars_cache)} cached, {len(needed)} pending)" + ) + + headers: dict[str, str] = {"Accept": "application/vnd.github.v3+json"} + if GITHUB_TOKEN: + headers["Authorization"] = f"token {GITHUB_TOKEN}" + + sem = asyncio.Semaphore(GITHUB_CONCURRENT) + rate_limited = False + fetched = 0 + + async def _fetch_one(client: httpx.AsyncClient, repo: str): + nonlocal rate_limited, fetched + if rate_limited: + return + async with sem: + if rate_limited: + return + try: + resp = await client.get( + f"https://api.github.com/repos/{repo}", headers=headers + ) + if resp.status_code == 200: + _stars_cache[repo] = resp.json().get("stargazers_count", 0) + fetched += 1 + elif resp.status_code in (403, 429): + rate_limited = True + logger.warning("GitHub API rate-limited, stopping star fetch") + elif resp.status_code == 404: + _stars_cache[repo] = 0 + fetched += 1 + except Exception as exc: + logger.debug(f"GitHub stars fetch failed for {repo}: {exc}") + + async with httpx.AsyncClient(timeout=15.0) as client: + await asyncio.gather(*[_fetch_one(client, r) for r in to_fetch]) + + logger.info(f"GitHub stars: fetched {fetched} new, {len(_stars_cache)} total cached") + _apply_stars(servers) + + +def _apply_stars(servers: dict[str, dict]): + for srv in servers.values(): + gh = _extract_gh_repo(srv.get("repositoryUrl", "")) + srv["stars"] = _stars_cache.get(gh) if gh else None + + +async def _refresh_loop(): + """Background loop that refreshes the cache on startup and then hourly.""" + global _cache, _cache_updated_at + while True: + try: + community, google = await asyncio.gather( + _fetch_all_servers(), + _fetch_google_servers(), + ) + _cache = {**community, **google} + await _fetch_github_stars(_cache) + _cache_updated_at = time.time() + except Exception as e: + logger.exception(f"MCP registry refresh error: {e}") + await asyncio.sleep(REFRESH_INTERVAL_S) + + +@asynccontextmanager +async def mcp_registry_lifespan(): + global _refresh_task + _refresh_task = asyncio.create_task(_refresh_loop()) + yield + if _refresh_task: + _refresh_task.cancel() + try: + await _refresh_task + except asyncio.CancelledError: + pass + + +mcp_registry = SubApp("mcp-registry", mcp_registry_lifespan) + + +@mcp_registry.router.get("/stats") +async def registry_stats(): + google = sum(1 for s in _cache.values() if s.get("source") == "google") + community = sum(1 for s in _cache.values() if s.get("source") == "community") + return { + "total": len(_cache), + "google": google, + "community": community, + "lastUpdated": _cache_updated_at, + } + + +@mcp_registry.router.get("/search") +async def registry_search( + q: str = Query("", description="Search query"), + limit: int = Query(20, ge=1, le=100), + offset: int = Query(0, ge=0), + sort: str = Query("name", description="Sort by: name, stars"), + source: str = Query("", description="Filter by source: google, community, or empty for all"), +): + pool = _cache.values() + if source: + pool = [s for s in pool if s.get("source") == source] + + query_lower = q.lower().strip() + + if not query_lower: + results = list(pool) + else: + results = [] + for srv in pool: + searchable = f"{srv['name']} {srv['title']} {srv['description']} {' '.join(srv.get('keywords', []))}".lower() + if query_lower in searchable: + results.append(srv) + + if sort == "stars": + results.sort(key=lambda s: (s.get("stars") is None, -(s.get("stars") or 0), s["name"])) + else: + results.sort(key=lambda s: s["name"]) + + total = len(results) + page = results[offset : offset + limit] + + summary = [ + { + "name": s["name"], + "title": s["title"], + "description": s["description"], + "version": s["version"], + "remoteUrl": s["remoteUrl"], + "remoteType": s["remoteType"], + "repositoryUrl": s["repositoryUrl"], + "websiteUrl": s["websiteUrl"], + "iconUrl": s.get("iconUrl", ""), + "stars": s.get("stars"), + "source": s.get("source", "community"), + } + for s in page + ] + + return {"servers": summary, "total": total, "offset": offset, "limit": limit} + + +@mcp_registry.router.get("/detail/{server_name:path}") +async def registry_detail(server_name: str): + srv = _cache.get(server_name) + if not srv: + return {"error": "Server not found"}, 404 + return {"server": srv} diff --git a/backend/apps/modes/__init__.py b/backend/apps/modes/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/apps/modes/models.py b/backend/apps/modes/models.py new file mode 100644 index 00000000..3a884199 --- /dev/null +++ b/backend/apps/modes/models.py @@ -0,0 +1,195 @@ +import os +from pydantic import BaseModel, Field +from typing import Optional +from uuid import uuid4 + +OUTPUTS_WORKSPACE = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "data", "outputs_workspace", +) + +SKILLS_WORKSPACE = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "data", "skills_workspace", +) + + +class Mode(BaseModel): + id: str = Field(default_factory=lambda: uuid4().hex) + name: str + description: str = "" + system_prompt: Optional[str] = None + tools: Optional[list[str]] = None + default_next_mode: Optional[str] = None + is_builtin: bool = False + icon: str = "smart_toy" + color: str = "#818cf8" + default_folder: Optional[str] = None + + +class ModeCreate(BaseModel): + name: str + description: str = "" + system_prompt: Optional[str] = None + tools: Optional[list[str]] = None + default_next_mode: Optional[str] = None + icon: str = "smart_toy" + color: str = "#818cf8" + default_folder: Optional[str] = None + + +class ModeUpdate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + system_prompt: Optional[str] = None + tools: Optional[list[str]] = None + default_next_mode: Optional[str] = None + icon: Optional[str] = None + color: Optional[str] = None + default_folder: Optional[str] = None + + +BUILTIN_MODES: list[Mode] = [ + Mode( + id="agent", + name="Agent", + description="Full autonomous agent with read and write access to tools.", + system_prompt=None, + tools=None, + default_next_mode=None, + is_builtin=True, + icon="smart_toy", + color="#818cf8", + ), + Mode( + id="ask", + name="Ask", + description="Answer questions about the codebase. Read-only, no edits or changes.", + system_prompt="Answer questions about the codebase. Do not make any edits or changes.", + tools=["Read", "Glob", "Grep", "AskUserQuestion"], + default_next_mode=None, + is_builtin=True, + icon="question_answer", + color="#4ade80", + ), + Mode( + id="plan", + name="Plan", + description="Analyze requests and produce a detailed step-by-step plan without executing.", + system_prompt="Analyze the request and produce a detailed step-by-step plan. Do not execute the plan or make any changes.", + tools=["Read", "Glob", "Grep", "AskUserQuestion"], + default_next_mode="agent", + is_builtin=True, + icon="map", + color="#fbbf24", + ), + Mode( + id="view-builder", + name="View Builder", + description="Create and iterate on reusable View artifacts.", + system_prompt=( + "You are helping the user build a reusable View — a self-contained " + "web app rendered in an iframe.\n\n" + "Your working directory is a dedicated workspace folder for this view. " + "You can create any file structure you need using the Write tool.\n\n" + "## Required files\n\n" + "1. **index.html** — The entry point. A complete HTML document. " + "React 18 is available via esm.sh CDN imports:\n" + ' \n' + " The structured input data is available at `window.OUTPUT_INPUT` (object) " + "and any server-side result at `window.OUTPUT_BACKEND_RESULT`.\n\n" + "2. **schema.json** — A JSON Schema object defining the structured input " + "the view accepts. Example:\n" + ' {"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}\n\n' + "3. **meta.json** — Metadata for this view. Always write this file with " + "a short name and one-sentence description. Example:\n" + ' {"name":"Sales Dashboard","description":"Interactive dashboard showing sales metrics"}\n\n' + "## Optional files\n\n" + "- **backend.py** — Python code that receives `input_data` as " + "a global dict and must assign its result to a global `result` dict.\n" + "- **Any additional files** — You can create subdirectories and split code " + "across multiple files. For example:\n" + " - `components/Chart.js` — Reusable components\n" + " - `utils/helpers.js` — Utility functions\n" + " - `styles/main.css` — Stylesheets\n\n" + "Files are served from the workspace, so relative imports work naturally:\n" + ' ``\n' + ' ``\n' + " `import { helper } from './utils/helpers.js'` (in ES modules)\n\n" + "## Guidelines\n\n" + "Write files immediately when you have code ready. The user can see " + "a live preview that auto-refreshes from these files. Always write the " + "complete file content (do not use Edit for partial patches on first creation). " + "For complex views, split code into separate files to keep things organized." + ), + tools=None, + default_next_mode=None, + is_builtin=True, + icon="view_quilt", + color="#f472b6", + default_folder=OUTPUTS_WORKSPACE, + ), + Mode( + id="skill-builder", + name="Skill Builder", + description="Create and iterate on skills using AI-assisted vibe coding.", + system_prompt=( + "You are a Skill Builder — an AI assistant that helps users create, " + "refine, and iterate on Claude skills (SKILL.md files).\n\n" + "## How Skills Work\n\n" + "A skill is a Markdown file that teaches Claude how to perform a specific task. " + "Skills have YAML frontmatter with `name` and `description` fields, followed by " + "the skill body in Markdown. The description is the primary triggering mechanism — " + "it tells Claude when to use the skill.\n\n" + "## Your Working Directory\n\n" + "Your working directory is a dedicated workspace folder for this skill. " + "Write your output directly to these files using the Write tool:\n\n" + "1. **SKILL.md** — The complete skill file with YAML frontmatter and Markdown body. " + "Example frontmatter:\n" + " ```\n" + " ---\n" + " name: my-skill\n" + " description: When to trigger and what this skill does.\n" + " ---\n" + " ```\n\n" + "2. **meta.json** — Metadata for the skill builder UI. Always write this file. Example:\n" + ' {"name":"My Skill","description":"A short description","command":"my-skill"}\n\n' + "Write these files immediately when you have content ready. The user can see " + "a live preview that auto-refreshes from these files. Always write the " + "complete file content (do not use Edit for partial patches on first creation).\n\n" + "## Skill Creation Process\n\n" + "1. **Understand intent** — Ask what the skill should do, when it should trigger, " + "and what the expected output format is.\n" + "2. **Draft the skill** — Write a SKILL.md with clear instructions, examples, " + "and good progressive disclosure.\n" + "3. **Iterate** — Refine based on user feedback. Update the files each time.\n\n" + "## Skill Writing Best Practices\n\n" + "- Keep SKILL.md under 500 lines; use bundled reference files for large content.\n" + "- The `description` frontmatter is the primary trigger. Make it slightly \"pushy\" — " + "include both what the skill does AND specific contexts for when to use it.\n" + "- Use imperative form in instructions.\n" + "- Include examples with input/output pairs when helpful.\n" + "- Define output formats explicitly with templates.\n" + "- Use theory of mind — explain *why* things matter rather than just MUST directives.\n" + "- Think about edge cases, error handling, and progressive disclosure.\n\n" + "## Skill Anatomy\n\n" + "```\n" + "skill-name/\n" + "├── SKILL.md (required) — YAML frontmatter + Markdown instructions\n" + "└── Bundled Resources (optional)\n" + " ├── scripts/ — Executable code for repetitive tasks\n" + " ├── references/ — Docs loaded into context as needed\n" + " └── assets/ — Files used in output\n" + "```\n\n" + "Be collaborative and flexible. If the user wants to \"just vibe\", skip the formal " + "process and iterate freely. Always write updated files so the preview stays current." + ), + tools=None, + default_next_mode=None, + is_builtin=True, + icon="psychology", + color="#10b981", + default_folder=SKILLS_WORKSPACE, + ), +] diff --git a/backend/apps/modes/modes.py b/backend/apps/modes/modes.py new file mode 100644 index 00000000..a9c134f7 --- /dev/null +++ b/backend/apps/modes/modes.py @@ -0,0 +1,102 @@ +import json +import os +import logging +from contextlib import asynccontextmanager +from fastapi import HTTPException +from backend.config.Apps import SubApp +from backend.apps.modes.models import Mode, ModeCreate, ModeUpdate, BUILTIN_MODES + +logger = logging.getLogger(__name__) + +DATA_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), "data", "modes") + + +@asynccontextmanager +async def modes_lifespan(): + os.makedirs(DATA_DIR, exist_ok=True) + for builtin in BUILTIN_MODES: + _save(builtin) + yield + + +modes = SubApp("modes", modes_lifespan) + + +def _load_all() -> list[Mode]: + result = [] + if not os.path.exists(DATA_DIR): + return result + for fname in os.listdir(DATA_DIR): + if fname.endswith(".json"): + with open(os.path.join(DATA_DIR, fname)) as f: + result.append(Mode(**json.load(f))) + return result + + +def _save(mode: Mode): + with open(os.path.join(DATA_DIR, f"{mode.id}.json"), "w") as f: + json.dump(mode.model_dump(), f, indent=2) + + +def _load(mode_id: str) -> Mode: + path = os.path.join(DATA_DIR, f"{mode_id}.json") + if not os.path.exists(path): + raise HTTPException(status_code=404, detail="Mode not found") + with open(path) as f: + return Mode(**json.load(f)) + + +def load_mode(mode_id: str) -> Mode | None: + """Public helper for other modules to resolve a mode by ID.""" + path = os.path.join(DATA_DIR, f"{mode_id}.json") + if not os.path.exists(path): + return None + with open(path) as f: + return Mode(**json.load(f)) + + +@modes.router.get("/list") +async def list_modes(): + return {"modes": [m.model_dump() for m in _load_all()]} + + +@modes.router.get("/{mode_id}") +async def get_mode(mode_id: str): + return _load(mode_id).model_dump() + + +@modes.router.post("/create") +async def create_mode(body: ModeCreate): + mode = Mode( + name=body.name, + description=body.description, + system_prompt=body.system_prompt, + tools=body.tools, + default_next_mode=body.default_next_mode, + icon=body.icon, + color=body.color, + default_folder=body.default_folder, + is_builtin=False, + ) + _save(mode) + return {"ok": True, "mode": mode.model_dump()} + + +@modes.router.put("/{mode_id}") +async def update_mode(mode_id: str, body: ModeUpdate): + mode = _load(mode_id) + for k, v in body.model_dump(exclude_none=True).items(): + setattr(mode, k, v) + _save(mode) + return {"ok": True, "mode": mode.model_dump()} + + +@modes.router.delete("/{mode_id}") +async def delete_mode(mode_id: str): + mode = _load(mode_id) + if mode.is_builtin: + raise HTTPException(status_code=403, detail="Cannot delete built-in modes") + path = os.path.join(DATA_DIR, f"{mode_id}.json") + if os.path.exists(path): + os.remove(path) + return {"ok": True} diff --git a/backend/apps/outputs/__init__.py b/backend/apps/outputs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/apps/outputs/executor.py b/backend/apps/outputs/executor.py new file mode 100644 index 00000000..2ce9bd87 --- /dev/null +++ b/backend/apps/outputs/executor.py @@ -0,0 +1,74 @@ +import asyncio +import json +import logging +import sys +from dataclasses import dataclass + +logger = logging.getLogger(__name__) + +TIMEOUT_SECONDS = 30 + + +@dataclass +class BackendExecResult: + result: dict + stdout: str + stderr: str + + +async def execute_backend_code(code: str, input_data: dict) -> BackendExecResult: + """Execute user-provided Python code in a subprocess. + + The code receives ``input_data`` as a global dict and must assign its + result to a global ``result`` dict. User print() calls are captured + separately from the result via an in-process StringIO redirect. + """ + + preamble = ( + "import json, sys, io\n" + "_orig_stdout = sys.stdout\n" + "_capture = io.StringIO()\n" + "sys.stdout = _capture\n" + "input_data = json.loads(sys.stdin.read())\n" + "result = {}\n" + ) + postamble = ( + "\nsys.stdout = _orig_stdout\n" + 'json.dump({"__stdout__": _capture.getvalue(), "__result__": result}, sys.stdout)\n' + ) + wrapper = preamble + code + postamble + + proc = await asyncio.create_subprocess_exec( + sys.executable, "-c", wrapper, + stdin=asyncio.subprocess.PIPE, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + + try: + stdout, stderr = await asyncio.wait_for( + proc.communicate(input=json.dumps(input_data).encode()), + timeout=TIMEOUT_SECONDS, + ) + except asyncio.TimeoutError: + proc.kill() + await proc.wait() + raise RuntimeError(f"Backend code execution timed out after {TIMEOUT_SECONDS}s") + + stderr_text = stderr.decode(errors="replace").strip() + + if proc.returncode != 0: + raise RuntimeError(f"Backend code error (exit {proc.returncode}): {stderr_text}") + + try: + parsed = json.loads(stdout.decode()) + return BackendExecResult( + result=parsed.get("__result__", {}), + stdout=parsed.get("__stdout__", ""), + stderr=stderr_text, + ) + except json.JSONDecodeError: + raw = stdout.decode(errors="replace").strip() + raise RuntimeError( + f"Backend code did not produce valid JSON. Raw output: {raw[:500]}" + ) diff --git a/backend/apps/outputs/models.py b/backend/apps/outputs/models.py new file mode 100644 index 00000000..79e1b922 --- /dev/null +++ b/backend/apps/outputs/models.py @@ -0,0 +1,197 @@ +from pydantic import BaseModel, Field, model_validator +from typing import Optional, Any +from uuid import uuid4 +from datetime import datetime + + +class AutoRunConfig(BaseModel): + enabled: bool = False + prompt: str = "" + context_paths: list[dict[str, str]] = Field(default_factory=list) + forced_tools: list[dict[str, Any]] = Field(default_factory=list) + mode: str = "agent" + model: str = "sonnet" + + +class Output(BaseModel): + id: str = Field(default_factory=lambda: uuid4().hex) + name: str + description: str = "" + icon: str = "view_quilt" + input_schema: dict[str, Any] = Field(default_factory=lambda: { + "type": "object", + "properties": {}, + "required": [], + }) + files: dict[str, str] = Field(default_factory=dict) + permission: str = "ask" + auto_run_config: Optional[AutoRunConfig] = None + thumbnail: Optional[str] = None + created_at: str = Field(default_factory=lambda: datetime.now().isoformat()) + updated_at: str = Field(default_factory=lambda: datetime.now().isoformat()) + + @model_validator(mode="before") + @classmethod + def _migrate_flat_fields(cls, data: Any) -> Any: + """Migrate legacy frontend_code/backend_code fields into the files dict.""" + if not isinstance(data, dict): + return data + if "files" not in data or not data["files"]: + files: dict[str, str] = {} + fc = data.pop("frontend_code", None) + bc = data.pop("backend_code", None) + if fc: + files["index.html"] = fc + if bc: + files["backend.py"] = bc + data["files"] = files + else: + data.pop("frontend_code", None) + data.pop("backend_code", None) + return data + + @property + def frontend_code(self) -> str: + return self.files.get("index.html", "") + + @property + def backend_code(self) -> str | None: + return self.files.get("backend.py") + + +class OutputCreate(BaseModel): + name: str + description: str = "" + icon: str = "view_quilt" + input_schema: dict[str, Any] = Field(default_factory=lambda: { + "type": "object", + "properties": {}, + "required": [], + }) + files: dict[str, str] = Field(default_factory=dict) + auto_run_config: Optional[dict[str, Any]] = None + thumbnail: Optional[str] = None + + @model_validator(mode="before") + @classmethod + def _migrate_flat_fields(cls, data: Any) -> Any: + if not isinstance(data, dict): + return data + if "files" not in data or not data["files"]: + files: dict[str, str] = {} + fc = data.pop("frontend_code", None) + bc = data.pop("backend_code", None) + if fc: + files["index.html"] = fc + if bc: + files["backend.py"] = bc + data["files"] = files + else: + data.pop("frontend_code", None) + data.pop("backend_code", None) + return data + + +class OutputUpdate(BaseModel): + name: Optional[str] = None + description: Optional[str] = None + icon: Optional[str] = None + input_schema: Optional[dict[str, Any]] = None + files: Optional[dict[str, str]] = None + permission: Optional[str] = None + auto_run_config: Optional[dict[str, Any]] = None + thumbnail: Optional[str] = None + + @model_validator(mode="before") + @classmethod + def _migrate_flat_fields(cls, data: Any) -> Any: + if not isinstance(data, dict): + return data + if "files" not in data: + files: dict[str, str] = {} + fc = data.pop("frontend_code", None) + bc = data.pop("backend_code", None) + if fc: + files["index.html"] = fc + if bc: + files["backend.py"] = bc + if files: + data["files"] = files + else: + data.pop("frontend_code", None) + data.pop("backend_code", None) + return data + + +class OutputExecute(BaseModel): + output_id: str + input_data: dict[str, Any] = Field(default_factory=dict) + + +class OutputExecuteResult(BaseModel): + output_id: str + output_name: str + frontend_code: str + input_data: dict[str, Any] + backend_result: Optional[dict[str, Any]] = None + stdout: Optional[str] = None + stderr: Optional[str] = None + error: Optional[str] = None + + +class AutoRunRequest(BaseModel): + prompt: str + input_schema: dict[str, Any] = Field(default_factory=dict) + backend_code: Optional[str] = None + context_paths: list[dict[str, str]] = Field(default_factory=list) + forced_tools: list[str] = Field(default_factory=list) + model: str = "sonnet" + + +class AutoRunAgentRequest(BaseModel): + prompt: str + input_schema: dict[str, Any] = Field(default_factory=dict) + output_id: str + model: str = "sonnet" + forced_tools: list[str] = Field(default_factory=list) + context_paths: list[dict[str, str]] = Field(default_factory=list) + + +class WorkspaceSeedRequest(BaseModel): + workspace_id: str + files: Optional[dict[str, str]] = None + meta: Optional[dict[str, Any]] = None + + @model_validator(mode="before") + @classmethod + def _migrate_flat_fields(cls, data: Any) -> Any: + """Accept legacy frontend_code/backend_code/schema_json fields.""" + if not isinstance(data, dict): + return data + if "files" not in data: + files: dict[str, str] = {} + fc = data.pop("frontend_code", None) + bc = data.pop("backend_code", None) + sj = data.pop("schema_json", None) + if fc: + files["index.html"] = fc + if bc: + files["backend.py"] = bc + if sj: + files["schema.json"] = sj + if files: + data["files"] = files + else: + data.pop("frontend_code", None) + data.pop("backend_code", None) + data.pop("schema_json", None) + return data + + +class VibeCodeRequest(BaseModel): + prompt: str + current_frontend_code: str = "" + current_backend_code: str = "" + current_schema: str = "" + name: str = "" + description: str = "" diff --git a/backend/apps/outputs/outputs.py b/backend/apps/outputs/outputs.py new file mode 100644 index 00000000..2e22eac4 --- /dev/null +++ b/backend/apps/outputs/outputs.py @@ -0,0 +1,596 @@ +import json +import os +import logging +import mimetypes +import base64 +from datetime import datetime +from contextlib import asynccontextmanager +from fastapi import HTTPException, Query +from fastapi.responses import Response +from jsonschema import validate as schema_validate, ValidationError as SchemaValidationError +from backend.config.Apps import SubApp +from backend.apps.outputs.models import ( + Output, OutputCreate, OutputUpdate, OutputExecute, OutputExecuteResult, + VibeCodeRequest, AutoRunRequest, AutoRunConfig, AutoRunAgentRequest, + WorkspaceSeedRequest, +) +from backend.apps.outputs.executor import execute_backend_code +from backend.apps.settings.settings import load_settings + +logger = logging.getLogger(__name__) + +MODEL_MAP = { + "sonnet": "claude-sonnet-4-20250514", + "opus": "claude-opus-4-20250514", + "haiku": "claude-haiku-4-20250414", +} + + +def _resolve_model(short_name: str) -> str: + return MODEL_MAP.get(short_name, short_name) + + +def _get_anthropic_client(): + """Create an AsyncAnthropic client, pulling the API key from app settings if + the ANTHROPIC_API_KEY env var isn't set.""" + import anthropic + + if os.environ.get("ANTHROPIC_API_KEY"): + return anthropic.AsyncAnthropic() + + settings = load_settings() + if settings.anthropic_api_key: + return anthropic.AsyncAnthropic(api_key=settings.anthropic_api_key) + + return anthropic.AsyncAnthropic() + + +def _validate_against_schema(data: dict, schema: dict) -> str | None: + """Validate *data* against *schema*. Return an error string or None.""" + try: + schema_validate(instance=data, schema=schema) + return None + except SchemaValidationError as exc: + path = " -> ".join(str(p) for p in exc.absolute_path) if exc.absolute_path else "(root)" + return f"Schema validation failed at {path}: {exc.message}" + +DATA_DIR = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "data", "outputs", +) + +WORKSPACE_DIR = os.path.join( + os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), + "data", "outputs_workspace", +) + + +def _build_data_injection(input_json: str, result_json: str) -> str: + """Build a

Invalid OAuth state

", status_code=400) + + tool = _load(tool_id) + client_id = os.environ.get("GOOGLE_OAUTH_CLIENT_ID", "") + client_secret = os.environ.get("GOOGLE_OAUTH_CLIENT_SECRET", "") + redirect_uri = "http://localhost:8324/api/tools/oauth/callback" + + async with httpx.AsyncClient(timeout=15.0) as client: + resp = await client.post(GOOGLE_TOKEN_URL, data={ + "code": code, + "client_id": client_id, + "client_secret": client_secret, + "redirect_uri": redirect_uri, + "grant_type": "authorization_code", + }) + + if resp.status_code != 200: + logger.warning(f"OAuth token exchange failed: {resp.text}") + return HTMLResponse(f"

Token exchange failed

{resp.text}
", status_code=400) + + tokens = resp.json() + access_token = tokens.get("access_token", "") + tool.oauth_tokens = { + "access_token": access_token, + "refresh_token": tokens.get("refresh_token", ""), + "token_expiry": time.time() + tokens.get("expires_in", 3600), + } + tool.auth_status = "connected" + + if access_token: + try: + async with httpx.AsyncClient(timeout=10.0) as info_client: + info_resp = await info_client.get( + GOOGLE_USERINFO_URL, + headers={"Authorization": f"Bearer {access_token}"}, + ) + if info_resp.status_code == 200: + tool.connected_account_email = info_resp.json().get("email") + except Exception as e: + logger.warning(f"Failed to fetch Google userinfo: {e}") + + _save(tool) + + return HTMLResponse(""" + +

Connected successfully!

+

You can close this window.

+ + + """) + + +@tools_lib.router.get("/{tool_id}") +async def get_tool(tool_id: str): + return _load(tool_id).model_dump() + + +@tools_lib.router.post("/create") +async def create_tool(body: ToolCreate): + tool = ToolDefinition( + name=body.name, + description=body.description, + command=body.command, + mcp_config=body.mcp_config, + credentials=body.credentials, + auth_type=body.auth_type, + auth_status=body.auth_status, + ) + _save(tool) + return {"ok": True, "tool": tool.model_dump()} + + +_XBIRD_CONFIG_DIR = os.path.join(os.path.expanduser("~"), ".config", "xbird") +_XBIRD_CONFIG_PATH = os.path.join(_XBIRD_CONFIG_DIR, "config.json") + + +async def _fetch_twitter_screen_name(auth_token: str, ct0: str) -> str | None: + """Fetch the logged-in Twitter/X screen name using session cookies.""" + try: + async with httpx.AsyncClient(timeout=10.0) as client: + resp = await client.get( + "https://api.twitter.com/1.1/account/verify_credentials.json", + headers={"x-csrf-token": ct0}, + cookies={"auth_token": auth_token, "ct0": ct0}, + ) + if resp.status_code == 200: + screen_name = resp.json().get("screen_name") + return f"@{screen_name}" if screen_name else None + except Exception as e: + logger.warning("Failed to fetch Twitter screen name: %s", e) + return None + + +def _sync_external_config(tool: ToolDefinition): + """Write credentials to external config files for tools that need them. + + xbird reads auth from ~/.config/xbird/config.json rather than env vars, + so we sync credentials there when the user connects via the UI. + """ + if tool.name == "xbird" and tool.credentials: + auth_token = tool.credentials.get("TWITTER_AUTH_TOKEN", "") + ct0 = tool.credentials.get("TWITTER_CT0", "") + if auth_token and ct0: + os.makedirs(_XBIRD_CONFIG_DIR, exist_ok=True) + config = {} + if os.path.exists(_XBIRD_CONFIG_PATH): + try: + with open(_XBIRD_CONFIG_PATH) as f: + config = json.load(f) + except Exception: + pass + config["auth_token"] = auth_token + config["ct0"] = ct0 + with open(_XBIRD_CONFIG_PATH, "w") as f: + json.dump(config, f, indent=2) + os.chmod(_XBIRD_CONFIG_PATH, 0o600) + logger.info("Synced xbird credentials to %s", _XBIRD_CONFIG_PATH) + elif tool.name == "xbird" and not tool.credentials: + if os.path.exists(_XBIRD_CONFIG_PATH): + try: + with open(_XBIRD_CONFIG_PATH) as f: + config = json.load(f) + config.pop("auth_token", None) + config.pop("ct0", None) + with open(_XBIRD_CONFIG_PATH, "w") as f: + json.dump(config, f, indent=2) + logger.info("Cleared xbird credentials from %s", _XBIRD_CONFIG_PATH) + except Exception: + pass + + +@tools_lib.router.put("/{tool_id}") +async def update_tool(tool_id: str, body: ToolUpdate): + tool = _load(tool_id) + for k, v in body.model_dump(exclude_none=True).items(): + setattr(tool, k, v) + _sync_external_config(tool) + + if tool.name == "xbird" and tool.auth_status == "connected" and tool.credentials: + auth_token = tool.credentials.get("TWITTER_AUTH_TOKEN", "") + ct0 = tool.credentials.get("TWITTER_CT0", "") + if auth_token and ct0: + screen_name = await _fetch_twitter_screen_name(auth_token, ct0) + if screen_name: + tool.connected_account_email = screen_name + + _save(tool) + return {"ok": True, "tool": tool.model_dump()} + + +@tools_lib.router.delete("/{tool_id}") +async def delete_tool(tool_id: str): + path = os.path.join(DATA_DIR, f"{tool_id}.json") + if os.path.exists(path): + os.remove(path) + return {"ok": True} + + +# --------------------------------------------------------------------------- +# MCP config derivation +# --------------------------------------------------------------------------- + +def _sanitize_server_name(name: str) -> str: + """Convert a tool name into a valid MCP server identifier (alphanumeric + hyphens).""" + return re.sub(r"[^a-z0-9]+", "-", name.lower()).strip("-") + + +def _resolve_command(command: str) -> str | None: + """Find a command on PATH, falling back to common user-local bin directories.""" + found = shutil.which(command) + if found: + return found + home = os.path.expanduser("~") + extra_dirs = [ + os.path.join(home, ".bun", "bin"), + os.path.join(home, ".cargo", "bin"), + os.path.join(home, ".local", "bin"), + "/opt/homebrew/bin", + ] + for d in extra_dirs: + candidate = os.path.join(d, command) + if os.path.isfile(candidate) and os.access(candidate, os.X_OK): + return candidate + return None + + +def derive_mcp_config(tool: ToolDefinition) -> Optional[dict]: + """Build the claude_agent_sdk mcp_servers config entry for a tool. + + Returns None if the tool cannot be configured (e.g. missing data). + """ + if not tool.mcp_config: + return None + + config: dict = dict(tool.mcp_config) + + if tool.credentials: + if config.get("type") in ("http", "sse"): + headers = config.setdefault("headers", {}) + for key, val in tool.credentials.items(): + if key.lower() in ("authorization", "api_key", "api-key"): + headers.setdefault("Authorization", f"Bearer {val}") + else: + env = config.setdefault("env", {}) + env.update(tool.credentials) + + if tool.auth_type == "oauth2" and tool.oauth_tokens.get("access_token"): + if config.get("type") in ("http", "sse"): + headers = config.setdefault("headers", {}) + headers["Authorization"] = f"Bearer {tool.oauth_tokens['access_token']}" + else: + env = config.setdefault("env", {}) + env["OAUTH_ACCESS_TOKEN"] = tool.oauth_tokens["access_token"] + if tool.oauth_tokens.get("refresh_token"): + env["GOOGLE_WORKSPACE_REFRESH_TOKEN"] = tool.oauth_tokens["refresh_token"] + client_id = os.environ.get("GOOGLE_OAUTH_CLIENT_ID", "") + client_secret = os.environ.get("GOOGLE_OAUTH_CLIENT_SECRET", "") + if client_id: + env["GOOGLE_WORKSPACE_CLIENT_ID"] = client_id + if client_secret: + env["GOOGLE_WORKSPACE_CLIENT_SECRET"] = client_secret + + if config.get("type") == "stdio" and config.get("command"): + resolved = _resolve_command(config["command"]) + if resolved: + config["command"] = resolved + + return config + + +# --------------------------------------------------------------------------- +# OAuth2 flow for Google Workspace (and other OAuth providers) +# --------------------------------------------------------------------------- + + +# --------------------------------------------------------------------------- +# MCP tool discovery +# --------------------------------------------------------------------------- + +_READ_PREFIXES = ("get", "list", "read", "search", "fetch", "find", "query", "count", "check", "describe", "show", "download", "browse", "analy", "explain") +_WRITE_PREFIXES = ("create", "write", "delete", "update", "send", "remove", "modify", "add", "set", "put", "post", "patch", "insert", "move", "copy", "rename", "archive", "trash", "publish", "approve", "reject") + + +_SERVICE_RULES: list[tuple[list[str], str, str]] = [ + # (keywords, service_name, group) + # Google Workspace + (["gmail"], "Gmail", "Google"), + (["drive"], "Drive", "Google"), + (["calendar", "event", "freebusy"], "Calendar", "Google"), + (["spreadsheet", "sheet"], "Sheets", "Google"), + (["doc", "paragraph", "table"], "Docs", "Google"), + (["chat", "space", "reaction", "message"], "Chat", "Google"), + (["form", "publish_settings"], "Forms", "Google"), + (["presentation", "slide", "page"], "Slides", "Google"), + (["task_list", "task"], "Tasks", "Google"), + (["contact"], "Contacts", "Google"), + (["script", "deployment", "version", "trigger"], "Apps Script", "Google"), + (["search_custom", "search_engine"], "Search", "Google"), + # Reddit (before Twitter so "search_reddit" etc. don't mis-match) + (["subreddit"], "Subreddits", "Reddit"), + (["search_reddit"], "Search", "Reddit"), + (["post_detail"], "Posts", "Reddit"), + (["user_analysis"], "Users", "Reddit"), + (["reddit_explain"], "Reference", "Reddit"), + # Twitter / X + (["tweet", "thread", "reply", "replies", "quote", "retweet", "article"], "Tweets", "Twitter"), + (["timeline", "home", "news", "trending"], "Timeline", "Twitter"), + (["follower", "following", "follow", "unfollow"], "Network", "Twitter"), + (["like", "unlike", "bookmark"], "Engagement", "Twitter"), + (["mention"], "Mentions", "Twitter"), + (["user", "profile"], "Users", "Twitter"), + (["media", "upload", "image", "video"], "Media", "Twitter"), + (["search"], "Search", "Twitter"), + (["list", "list_member"], "Lists", "Twitter"), +] + + +def _categorize_tool(name: str) -> str: + lower = name.lower().replace("_", " ").replace("-", " ").strip() + for word in lower.split(): + for prefix in _READ_PREFIXES: + if word.startswith(prefix): + return "read" + for prefix in _WRITE_PREFIXES: + if word.startswith(prefix): + return "write" + return "write" + + +def _extract_service(name: str) -> tuple[str, str]: + """Extract the service and group from a tool name (e.g. 'search_gmail_messages' -> ('Gmail', 'Google')).""" + lower = name.lower() + for keywords, display, group in _SERVICE_RULES: + for kw in keywords: + if kw in lower: + return display, group + return "Other", "" + + +def _parse_sse_json(text: str) -> dict | None: + """Extract JSON from an SSE response body (handles `data: {...}` lines).""" + for line in text.splitlines(): + stripped = line.strip() + if stripped.startswith("data:"): + payload = stripped[len("data:"):].strip() + if payload: + try: + return json.loads(payload) + except json.JSONDecodeError: + continue + try: + return json.loads(text) + except json.JSONDecodeError: + return None + + +async def _discover_mcp_tools_http(url: str, headers: dict | None = None) -> list[dict]: + """Connect to a Streamable HTTP MCP server and call tools/list via JSON-RPC POST.""" + h = { + "Content-Type": "application/json", + "Accept": "application/json, text/event-stream", + **(headers or {}), + } + async with httpx.AsyncClient(timeout=30.0) as client: + init_resp = await client.post(url, headers=h, json={ + "jsonrpc": "2.0", "id": 1, "method": "initialize", + "params": {"protocolVersion": "2025-03-26", "capabilities": {}, + "clientInfo": {"name": "self-swarm", "version": "0.1.0"}}, + }) + if init_resp.status_code not in (200, 201): + raise HTTPException(status_code=502, detail=f"MCP initialize failed: {init_resp.status_code}") + + session_id = init_resp.headers.get("mcp-session-id", "") + if session_id: + h["mcp-session-id"] = session_id + + await client.post(url, headers=h, json={ + "jsonrpc": "2.0", "method": "notifications/initialized", + }) + + list_resp = await client.post(url, headers=h, json={ + "jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {}, + }) + if list_resp.status_code not in (200, 201): + raise HTTPException(status_code=502, detail=f"MCP tools/list failed: {list_resp.status_code}") + + ct = list_resp.headers.get("content-type", "") + if "text/event-stream" in ct: + data = _parse_sse_json(list_resp.text) + else: + data = list_resp.json() + + if not data: + raise HTTPException(status_code=502, detail="Empty response from MCP server") + + tools_list = data.get("result", {}).get("tools", []) + return [{"name": t.get("name", ""), "description": t.get("description", "")} for t in tools_list] + + +async def _discover_mcp_tools_sse(url: str, headers: dict | None = None) -> list[dict]: + """Connect to a legacy SSE MCP server (GET event-stream + POST messages) and call tools/list.""" + from mcp.client.sse import sse_client + from mcp import ClientSession + from mcp.types import Implementation + + try: + async with sse_client( + url=url, + headers=headers, + timeout=30, + sse_read_timeout=30, + ) as (read_stream, write_stream): + async with ClientSession( + read_stream, + write_stream, + client_info=Implementation(name="self-swarm", version="0.1.0"), + ) as session: + await session.initialize() + result = await session.list_tools() + return [{"name": t.name, "description": t.description or ""} for t in result.tools] + except BaseExceptionGroup as eg: + first = eg.exceptions[0] if eg.exceptions else eg + raise HTTPException(status_code=502, detail=f"SSE discovery failed: {first}") from first + + +async def _discover_mcp_tools_stdio(command: str, args: list[str] | None = None, env: dict | None = None) -> list[dict]: + """Spawn a stdio MCP server process and call tools/list via JSON-RPC over stdin/stdout.""" + cmd_path = _resolve_command(command) + if not cmd_path: + raise HTTPException(status_code=400, detail=f"Command '{command}' not found on PATH or common install locations") + + proc_env = {**os.environ, **(env or {})} + + proc = await asyncio.create_subprocess_exec( + cmd_path, *(args or []), + stdin=asyncio.subprocess.PIPE, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + env=proc_env, + ) + + async def _send(msg: dict) -> None: + line = json.dumps(msg) + "\n" + proc.stdin.write(line.encode()) + await proc.stdin.drain() + + async def _recv() -> dict: + """Read JSON-RPC responses, skipping notification lines (no 'id' field).""" + while True: + line = await asyncio.wait_for(proc.stdout.readline(), timeout=30.0) + if not line: + stderr_out = "" + try: + stderr_out = (await asyncio.wait_for(proc.stderr.read(4096), timeout=2.0)).decode(errors="replace") + except (asyncio.TimeoutError, Exception): + pass + raise HTTPException( + status_code=502, + detail=f"MCP stdio process exited unexpectedly{': ' + stderr_out if stderr_out else ''}", + ) + stripped = line.decode(errors="replace").strip() + if not stripped: + continue + try: + data = json.loads(stripped) + except json.JSONDecodeError: + continue + if "id" in data: + return data + + try: + await _send({ + "jsonrpc": "2.0", "id": 1, "method": "initialize", + "params": { + "protocolVersion": "2025-03-26", + "capabilities": {}, + "clientInfo": {"name": "self-swarm", "version": "0.1.0"}, + }, + }) + await _recv() + + await _send({"jsonrpc": "2.0", "method": "notifications/initialized"}) + + await _send({"jsonrpc": "2.0", "id": 2, "method": "tools/list", "params": {}}) + data = await _recv() + + tools_list = data.get("result", {}).get("tools", []) + return [{"name": t.get("name", ""), "description": t.get("description", "")} for t in tools_list] + + except HTTPException: + raise + except asyncio.TimeoutError: + raise HTTPException(status_code=504, detail="MCP stdio server timed out during discovery") + finally: + try: + proc.stdin.close() + except Exception: + pass + try: + proc.terminate() + await asyncio.wait_for(proc.wait(), timeout=5.0) + except Exception: + proc.kill() + + +@tools_lib.router.post("/{tool_id}/discover") +async def discover_tools(tool_id: str): + tool = _load(tool_id) + config = derive_mcp_config(tool) + if not config: + raise HTTPException(status_code=400, detail="Cannot derive MCP config for tool") + + transport = config.get("type", "") + + try: + if transport == "stdio": + command = config.get("command", "") + if not command: + raise HTTPException(status_code=400, detail="stdio transport requires a 'command' in MCP config") + raw_tools = await _discover_mcp_tools_stdio( + command=command, + args=config.get("args"), + env=config.get("env"), + ) + elif transport in ("http", "sse") or config.get("url"): + url = config.get("url", "") + if not url: + raise HTTPException(status_code=400, detail="HTTP/SSE transport requires a 'url' in MCP config") + if transport == "sse": + raw_tools = await _discover_mcp_tools_sse(url, config.get("headers")) + else: + try: + raw_tools = await _discover_mcp_tools_http(url, config.get("headers")) + except HTTPException: + logger.info(f"Streamable HTTP failed for {tool.name}, retrying with SSE transport") + raw_tools = await _discover_mcp_tools_sse(url, config.get("headers")) + else: + raise HTTPException(status_code=400, detail=f"Unsupported MCP transport type: '{transport}'. Use 'stdio', 'http', or 'sse'.") + except HTTPException: + raise + except Exception as e: + logger.warning(f"MCP tool discovery failed for {tool.name}: {e}") + raise HTTPException(status_code=502, detail=f"Discovery failed: {e}") + + services: dict[str, dict[str, list[str]]] = {} + service_groups: dict[str, list[str]] = {} + permissions: dict[str, Any] = {} + + for t in raw_tools: + name = t["name"] + cat = _categorize_tool(name) + svc, group = _extract_service(name) + if svc not in services: + services[svc] = {"read": [], "write": []} + services[svc][cat].append(name) + permissions[name] = tool.tool_permissions.get(name, "ask") + if group: + service_groups.setdefault(group, []) + if svc not in service_groups[group]: + service_groups[group].append(svc) + + all_read = [n for s in services.values() for n in s["read"]] + all_write = [n for s in services.values() for n in s["write"]] + permissions["_categories"] = {"read": all_read, "write": all_write} + permissions["_services"] = services + permissions["_service_groups"] = service_groups + permissions["_tool_descriptions"] = {t["name"]: t["description"] for t in raw_tools} + + tool.tool_permissions = permissions + _save(tool) + + return {"ok": True, "tool": tool.model_dump()} + + +@tools_lib.router.post("/{tool_id}/oauth/start") +async def oauth_start(tool_id: str): + _load(tool_id) + client_id = os.environ.get("GOOGLE_OAUTH_CLIENT_ID", "") + if not client_id: + raise HTTPException(status_code=400, detail="GOOGLE_OAUTH_CLIENT_ID not set in backend .env") + + redirect_uri = "http://localhost:8324/api/tools/oauth/callback" + state = tool_id + + _pending_oauth[state] = tool_id + + params = { + "client_id": client_id, + "redirect_uri": redirect_uri, + "response_type": "code", + "scope": " ".join(GOOGLE_SCOPES), + "access_type": "offline", + "prompt": "consent", + "state": state, + } + auth_url = f"{GOOGLE_AUTH_URL}?{urlencode(params)}" + return {"auth_url": auth_url} + + + + +async def refresh_google_token(tool: ToolDefinition) -> Optional[str]: + """Refresh an expired Google OAuth token. Returns the fresh access_token or None.""" + if tool.auth_type != "oauth2": + return None + refresh_token = tool.oauth_tokens.get("refresh_token") + if not refresh_token: + return None + expiry = tool.oauth_tokens.get("token_expiry", 0) + if time.time() < expiry - 60: + return tool.oauth_tokens.get("access_token") + + client_id = os.environ.get("GOOGLE_OAUTH_CLIENT_ID", "") + client_secret = os.environ.get("GOOGLE_OAUTH_CLIENT_SECRET", "") + if not client_id or not client_secret: + return None + + try: + async with httpx.AsyncClient(timeout=15.0) as client: + resp = await client.post(GOOGLE_TOKEN_URL, data={ + "client_id": client_id, + "client_secret": client_secret, + "refresh_token": refresh_token, + "grant_type": "refresh_token", + }) + if resp.status_code == 200: + data = resp.json() + new_token = data["access_token"] + tool.oauth_tokens["access_token"] = new_token + tool.oauth_tokens["token_expiry"] = time.time() + data.get("expires_in", 3600) + + if not tool.connected_account_email: + try: + async with httpx.AsyncClient(timeout=10.0) as info_client: + info_resp = await info_client.get( + GOOGLE_USERINFO_URL, + headers={"Authorization": f"Bearer {new_token}"}, + ) + if info_resp.status_code == 200: + tool.connected_account_email = info_resp.json().get("email") + except Exception: + pass + + _save(tool) + return new_token + except Exception as e: + logger.warning(f"Google token refresh failed for tool {tool.id}: {e}") + return None diff --git a/backend/config/Apps.py b/backend/config/Apps.py new file mode 100644 index 00000000..ce8ffb3a --- /dev/null +++ b/backend/config/Apps.py @@ -0,0 +1,45 @@ +from fastapi import FastAPI, APIRouter +import debug +from uuid import uuid4 +from typing import List +from contextlib import asynccontextmanager +from contextlib import AsyncExitStack +from typing import Callable + + +class SubApp: + def __init__(self, name:str, lifespan:Callable): + debug("START", name) + self.id = uuid4() + self.name = name + self.prefix = f"/api/{name}" + self.lifespan = lifespan + self.router = APIRouter() + debug("END") + + def __str__(self): + return f"SubApp(name={self.name}, prefix={self.prefix}, id={self.id})" + +class MainApp: + def __init__(self, sub_apps: List[SubApp]): + debug("START") + + @asynccontextmanager + async def lifespan(app: FastAPI): + async with AsyncExitStack() as stack: + for sub_app in sub_apps: + debug(sub_app.name) + await stack.enter_async_context(sub_app.lifespan()) + print("\nCheck out the API docs at: http://127.0.0.1:8324/docs\n") + yield + + self.app = FastAPI(lifespan=lifespan) + + # Include all sub-app routers in the main app with their prefixes + for sub_app in sub_apps: + self.app.include_router( + sub_app.router, + prefix=sub_app.prefix, + tags=[sub_app.name] + ) + debug("END") \ No newline at end of file diff --git a/backend/config/__init__.py b/backend/config/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 00000000..d3708a9f --- /dev/null +++ b/backend/main.py @@ -0,0 +1,91 @@ +from fastapi.responses import JSONResponse +from backend.config.Apps import MainApp +from backend.apps.health.health import health +from backend.apps.agents.agents import agents +from backend.apps.agents.ws_manager import ws_manager +from backend.apps.templates.templates import templates +from backend.apps.skills.skills import skills +from backend.apps.tools_lib.tools_lib import tools_lib +from backend.apps.modes.modes import modes +from backend.apps.settings.settings import settings +from backend.apps.mcp_registry.mcp_registry import mcp_registry +from backend.apps.skill_registry.skill_registry import skill_registry +from backend.apps.outputs.outputs import outputs +from backend.apps.dashboards.dashboards import dashboards +from fastapi.middleware.cors import CORSMiddleware +from fastapi import WebSocket, WebSocketDisconnect +import json + +main_app = MainApp([health, agents, templates, skills, tools_lib, modes, settings, mcp_registry, skill_registry, outputs, dashboards]) +app = main_app.app + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +@app.websocket("/ws/agents/{session_id}") +async def websocket_session(websocket: WebSocket, session_id: str): + await ws_manager.connect_session(session_id, websocket) + try: + while True: + data = await websocket.receive_text() + msg = json.loads(data) + event = msg.get("event") + payload = msg.get("data", {}) + + if event == "agent:send_message": + from backend.apps.agents.agent_manager import agent_manager + await agent_manager.send_message( + session_id, + payload.get("prompt", ""), + mode=payload.get("mode"), + model=payload.get("model"), + images=payload.get("images"), + ) + elif event == "agent:approval_response": + from backend.apps.agents.agent_manager import agent_manager + agent_manager.handle_approval(payload.get("request_id"), { + "behavior": payload.get("behavior", "deny"), + "message": payload.get("message"), + "updated_input": payload.get("updated_input"), + }) + elif event == "agent:edit_message": + from backend.apps.agents.agent_manager import agent_manager + await agent_manager.edit_message( + session_id, + payload.get("message_id", ""), + payload.get("content", ""), + ) + elif event == "agent:stop": + from backend.apps.agents.agent_manager import agent_manager + await agent_manager.stop_agent(session_id) + except WebSocketDisconnect: + ws_manager.disconnect_session(session_id, websocket) + +@app.websocket("/ws/dashboard") +async def websocket_dashboard(websocket: WebSocket): + await ws_manager.connect_global(websocket) + try: + while True: + data = await websocket.receive_text() + msg = json.loads(data) + event = msg.get("event") + payload = msg.get("data", {}) + + if event == "agent:approval_response": + from backend.apps.agents.agent_manager import agent_manager + agent_manager.handle_approval(payload.get("request_id"), { + "behavior": payload.get("behavior", "deny"), + "message": payload.get("message"), + "updated_input": payload.get("updated_input"), + }) + except WebSocketDisconnect: + ws_manager.disconnect_global(websocket) + +if __name__ == "__main__": + import uvicorn + uvicorn.run("backend.main:app", host="0.0.0.0", port=8324, reload=True) diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 00000000..813faf0e --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,11 @@ +anthropic +claude-agent-sdk +jsonschema +fastapi[standard] +pydantic==2.10.5 +langchain-core==0.3.51 +langchain-openai==0.3.12 +pytest==8.3.4 +pytest-asyncio==0.25.2 +typeguard==4.4.2 +python-dotenv==1.1.1 \ No newline at end of file diff --git a/backend/run/_utils.sh b/backend/run/_utils.sh new file mode 100755 index 00000000..ea052bb5 --- /dev/null +++ b/backend/run/_utils.sh @@ -0,0 +1,202 @@ +#!/bin/bash +# Flag processing function with namespacing and global variable declaration +UTILS_FILE_ABSPATH="$(readlink -f "${BASH_SOURCE[0]}")" +if [[ "$OSTYPE" == "darwin"* ]]; then + # echo "In macOS utils sed START" + # echo "UTILS_ABSPATH: $UTILS_FILE_ABSPATH" + sed -i '' 's/\r//g' "$UTILS_FILE_ABSPATH" + # echo "In macOS utils sed END" +else + # echo "NOT in macOS utils START" + # echo "UTILS_ABSPATH: $UTILS_FILE_ABSPATH" + sed -i 's/\r//g' "$UTILS_FILE_ABSPATH" + # echo "NOT in macOS utils END" +fi +chmod +x "$UTILS_FILE_ABSPATH" + +RUN_DIR_ABSPATH="$(dirname "$UTILS_FILE_ABSPATH")" +BACKEND_DIR_ABSPATH="$(dirname "$RUN_DIR_ABSPATH")" + +formatted_error() { + # Arguments: error message and array of conflicting flags + local initial_message="$1" + shift + local conflicting_flags=("$@") + + # Red color for the error message box + local COLOR_CODE='\033[0;31m' + local NC='\033[0m' # No Color + + # Start the error message with the initial message + local error_message="$initial_message" + + # Add each conflicting flag on a new line with indentation + for conflict in "${conflicting_flags[@]}"; do + error_message+="\n $conflict" # Replacing `\t` with four spaces + done + + # Prepare for printing by finding max length of each line in the message + local lines=() + local max_length=0 + + # Use printf to interpret new lines and calculate max length with spaces instead of tabs + while IFS= read -r line; do + # Substitute tabs with spaces for consistent width measurement + local line_with_spaces="${line//$'\t'/ }" + lines+=("$line_with_spaces") + if (( ${#line_with_spaces} > max_length )); then + max_length=${#line_with_spaces} + fi + done <<< "$(printf "$error_message")" + + # Create the top and bottom borders based on the maximum line length + local border=$(printf '%*s' "$((max_length + 4))" '' | tr ' ' '-') + + # Print the formatted error message with a red box + printf "\n${COLOR_CODE}%s${NC}\n" "$border" + for line in "${lines[@]}"; do + printf "${COLOR_CODE}| %-*s |${NC}\n" "$max_length" "$line" + done + printf "${COLOR_CODE}| %-*s |${NC}\n" "$max_length" "" + printf "${COLOR_CODE}%s${NC}\n" "$border" +} + + +function process_flags() { + local -n flags_to_commands="$1" # Reference to the dictionary of flags and commands + local -n exclusives="$2" # Reference to the list of exclusive flag groups + local namespace="$3" # Unique prefix for variables + local calling_script_name="$(basename "$(readlink -f "${BASH_SOURCE[1]}")")" + local caller_id="${FUNCNAME[1]}" + local should_exit=false + if [ "$caller_id" == "main" ]; then + caller_id="$calling_script_name" + fi + # echo "caller_id: $caller_id" + # echo "Initializing flags with namespace: $namespace" + + # Initialize flag variables with namespacing in the sourcing script context + for flag in "${!flags_to_commands[@]}"; do + # Convert flag to uppercase variable name and apply namespace, e.g., MYAPP_FLAG1 + local flag_var="${namespace}_${flag^^}" # Prefix and uppercase + flag_var="${flag_var//-}" # Remove dashes + eval "declare -g $flag_var=false" # Initialize as global false + + # Diagnostic output for each initialized variable + # echo "Initialized $flag_var as false" + done + + # echo "Parsing command line arguments: $@" + + # Parse command line arguments and set flags + local unsupported_flags=() + # local potential_typos=() + for arg in "$@"; do + # echo "Processing argument: $arg" + if [[ -n "${flags_to_commands[$arg]}" ]]; then + # echo "Flag found: $arg" + local flag_var="${namespace}_${arg^^}" # Prefix and uppercase + flag_var="${flag_var//-}" # Remove dashes + eval "declare -g $flag_var=true" # Set as global true + # echo "Set $flag_var to true" + # echo "Executing command for $arg: ${flags_to_commands[$arg]}" + eval "${flags_to_commands[$arg]}" + else + if [[ "$arg" == "-"* ]]; then + # echo "Flag not found: $arg" + unsupported_flags+=("$arg") + if [[ -n "${flags_to_commands[-$arg]}" ]]; then + # echo "Potential typo: $arg" + unsupported_flags+=("\t*Note: Potential typo detected.") + unsupported_flags+=("\tDid you mean: -$arg") + fi + fi + fi + done + # Check exclusive flag groups for conflicts + # echo "Checking exclusive flag groups" + for group in "${exclusives[@]}"; do + local count=0 + local conflicting_flags=() + for flag in $group; do + local flag_var="${namespace}_${flag^^}" + flag_var="${flag_var//-}" + if [[ "$(eval echo "\$$flag_var")" == "true" ]]; then + conflicting_flags+=("$flag") + # count=$((count + 1)) + # ec "$flag_var is true in exclusive group" + fi + done + if (( ${#conflicting_flags[@]} > 1 )); then + # echo "found conflicting flags" + formatted_error "Error: $caller_id\n-----------------------------------------\nIncompatible flags:\nThe flags below cannot be used together\n-----------------------------------------\n" "${conflicting_flags[@]}" + should_exit=true + fi + done + # echo "should_exit: $should_exit" + # echo "unsupported_flags: ${#unsupported_flags[@]}" + if (( ${#unsupported_flags[@]} > 0 )); then + # echo "found unsupported flags 2" + formatted_error "Error: $caller_id\n-------------------------------------------------\nUnsupported flags:\nThe flags below are not supported by this script\n-------------------------------------------------\n" "${unsupported_flags[@]}" + should_exit=true + fi + if [[ $should_exit == true ]]; then + exit 1 + fi +} + + + +formatted_echo() { + local COLOR_CODE='\033[0m' # No Color + local NC='\033[0m' # No Color variable + # local message="$2" + # If the second argument is empty, then theres no color specified, so we use the first argument as the message + if [[ -z "$2" ]]; then + message="$1" + else + message="$2" + fi + + declare -A format_flags + format_flags=( + [--red]="COLOR_CODE='\033[0;31m'" + [--green]="COLOR_CODE='\033[0;32m'" + [--yellow]="COLOR_CODE='\033[0;33m'" + [--blue]="COLOR_CODE='\033[0;34m'" + [--purple]="COLOR_CODE='\033[0;35m'" + [--cyan]="COLOR_CODE='\033[0;36m'" + ) + exclusive_format_flags=( + "--red --green --yellow --blue --purple --cyan" + ) + + # Pass the arguments with the namespace "FORMAT" + process_flags format_flags exclusive_format_flags "FORMAT" "$@" + + # Process the message + local text + text=$(printf "%b" "$message") + + # Expand any escaped characters in the input (e.g., \n) + local lines=() + local max_length=0 + + # Read the text line by line and find the maximum length + while IFS= read -r line; do + lines+=("$line") + if (( ${#line} > max_length )); then + max_length=${#line} + fi + done <<< "$text" + + # Create the top and bottom borders based on the maximum line length + local border=$(printf '%*s' "$((max_length + 4))" '' | tr ' ' '-') + + # Print the formatted box with selected color + printf "\n${COLOR_CODE}%s${NC}\n" "$border" + for line in "${lines[@]}"; do + printf "${COLOR_CODE}| %-*s |${NC}\n" "$max_length" "$line" + done + printf "${COLOR_CODE}%s${NC}\n" "$border" +} \ No newline at end of file diff --git a/backend/run/dev.sh b/backend/run/dev.sh new file mode 100755 index 00000000..92eede71 --- /dev/null +++ b/backend/run/dev.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# The comment above is shebang, DO NOT REMOVE +DEV_ABSPATH="$(readlink -f "${BASH_SOURCE[0]}")" +if [[ "$OSTYPE" == "darwin"* ]]; then + # echo "In macOS server sed START" + # echo "SERVER_ABSPATH: $SERVER_ABSPATH" + sed -i '' 's/\r//g' "$DEV_ABSPATH" + # echo "In macOS server sed END" +else + # echo "NOT in macOS server START" + # echo "SERVER_ABSPATH: $SERVER_ABSPATH" + sed -i 's/\r//g' "$DEV_ABSPATH" + # echo "NOT in macOS server START" +fi +chmod +x "$DEV_ABSPATH" +source "$(dirname "$DEV_ABSPATH")/_utils.sh" + + +PROJECT_ROOT_ABSPATH="$(dirname "$BACKEND_DIR_ABSPATH")" + +# Cleanup function on exit +cleanup() { + formatted_echo --yellow "Shutting down..." + cd - > /dev/null 2>&1 +} +trap cleanup EXIT INT TERM + +# --- Create virtual environment if it doesn't exist --- +VENV_DIR="$BACKEND_DIR_ABSPATH/.venv" +if [[ ! -d "$VENV_DIR" ]]; then + formatted_echo --green "Creating virtual environment..." + python -m venv "$VENV_DIR" +fi +source "$VENV_DIR/bin/activate" + +# --- Install custom debugger module if not already installed --- +DEBUGGER_DIR_ABSPATH="$PROJECT_ROOT_ABSPATH/debugger" +if ! pip show debug > /dev/null 2>&1; then + formatted_echo --green "Installing debugger module..." + cd "$DEBUGGER_DIR_ABSPATH" + pip install -e . + if [[ $? -ne 0 ]]; then + formatted_error "Failed to install debugger module." + exit 1 + fi +fi + +# --- Install Python dependencies --- +formatted_echo --green "Installing dependencies..." +cd "$BACKEND_DIR_ABSPATH" +pip install -r requirements.txt +if [[ $? -ne 0 ]]; then + formatted_error "Failed to install Python dependencies." + exit 1 +fi + +# --- Start the backend server --- +formatted_echo --green "Starting backend server on http://0.0.0.0:8324 ..." +cd "$PROJECT_ROOT_ABSPATH" +python -m uvicorn backend.main:app --host 0.0.0.0 --port 8324 --reload \ + --reload-dir "$BACKEND_DIR_ABSPATH" \ + --reload-exclude '*.pyc' diff --git a/debugger/.gitignore b/debugger/.gitignore new file mode 100644 index 00000000..22eaa101 --- /dev/null +++ b/debugger/.gitignore @@ -0,0 +1,5 @@ +*.egg-info/ +__pycache__ +.venv/ +debug_toggles.json +needs_resync.txt \ No newline at end of file diff --git a/debugger/README.md b/debugger/README.md new file mode 100644 index 00000000..2e1a088b --- /dev/null +++ b/debugger/README.md @@ -0,0 +1,9 @@ +# Installation + +1. Navigate to this directory: + + +2. Install the package in development mode: + ```bash + pip install -e . + ``` \ No newline at end of file diff --git a/debugger/debug.py b/debugger/debug.py new file mode 100644 index 00000000..bef85d4a --- /dev/null +++ b/debugger/debug.py @@ -0,0 +1,57 @@ +import re +import inspect +import os +from debugger_backend.log_config import log_config +from debugger_backend.Debugleton import Debugleton +from debugger_backend.color_adjuster import rgb_to_ansi, bold_and_italicize_text, hex_to_rgb +from debugger_backend.debug_arg_parser import is_text, is_error + +def debug(*args, mode:str='debug', override_max_chars:bool=False): + frame = inspect.currentframe().f_back + code = frame.f_code + line_no = frame.f_lineno + calling_function_name = frame.f_code.co_name + calling_file_name = os.path.basename(code.co_filename) + if calling_function_name == "": + calling_function_name = calling_file_name + # Retrieve the file path of the calling function + file_path = os.path.abspath(code.co_filename) + # print(f"FILE PATH: {file_path}") + t_color, t_is_on, t_emoji = Debugleton().find_file_info(file_path) + # print(f"DEBUGGING: {t_color}, {t_is_on}") + max_chars = 3000 + + with open(code.co_filename, 'r', encoding='utf-8') as f: + lines = f.readlines() + line = lines[line_no - 1] + leading_spaces = len(line) - len(line.lstrip(' ')) + indent = leading_spaces // 4 + arg_names = re.findall(r'debug\((.*?)\)', line)[0].split(', ') + for arg_name, arg_value in zip(arg_names, args): + indent_str = ' |\t' * indent + if indent > 0: + indent_str = indent_str[:-3] + ' |-- ' + arg_is_error = is_error(arg_value, arg_name) + arg_is_text = is_text(arg_value, arg_name) + if arg_is_error: + t_color = "#FE3F3F" + t_emoji = "❌" + t_is_on = True + + arg_len = len(str(arg_value)) + if arg_len > max_chars and not override_max_chars: + if not arg_is_text: arg_value = str(arg_value) + arg_value = arg_value[:int(max_chars/2)] + "...\n..." + arg_value[arg_len-int(max_chars/2):] + + function_print_str = calling_function_name if 'self' not in frame.f_locals else f'{frame.f_locals["self"].__class__.__name__}.{calling_function_name}' + # color = COLORS.get(function_print_str, white) + color = hex_to_rgb(t_color) + if arg_is_text: + print_str = f"{t_emoji}{rgb_to_ansi(color)}{indent_str}[{function_print_str}] : {bold_and_italicize_text(arg_value)}\033[0m" + else: + print_str = f"{t_emoji}{rgb_to_ansi(color)}{indent_str}[{function_print_str}] : {arg_name} = {arg_value}\033[0m" + if t_is_on: log_config.debug_custom(print_str, mode) + +# Assign the function to the module's __call__ attribute +import sys +sys.modules[__name__] = debug diff --git a/debugger/debugger_backend/DEFAULTS.py b/debugger/debugger_backend/DEFAULTS.py new file mode 100644 index 00000000..129962ab --- /dev/null +++ b/debugger/debugger_backend/DEFAULTS.py @@ -0,0 +1,7 @@ +import os +TOGGLE_FILE = os.path.join(os.path.dirname(__file__), 'debug_toggles.json') +DEFAULT_COLOR = '#ffffff' +DEFAULT_TOGGLED = False +DEFAULT_SET_MANUALLY = False +DEFAULT_EMOJI = '⚫' +ROOT_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) \ No newline at end of file diff --git a/debugger/debugger_backend/DebugFile.py b/debugger/debugger_backend/DebugFile.py new file mode 100644 index 00000000..870566cf --- /dev/null +++ b/debugger/debugger_backend/DebugFile.py @@ -0,0 +1,39 @@ +import os +from debugger_backend.File import File +from debugger_backend.DEFAULTS import DEFAULT_COLOR, DEFAULT_TOGGLED, DEFAULT_SET_MANUALLY, DEFAULT_EMOJI + +class DebugFile(File): + def __init__(self, filename, path, color=DEFAULT_COLOR, is_toggled=DEFAULT_TOGGLED, + set_manually=DEFAULT_SET_MANUALLY, emoji=DEFAULT_EMOJI, directory=None): + super().__init__(filename, path) + self.color = color + self.is_toggled = is_toggled + self.set_manually = set_manually + self.emoji = emoji + self.directory = directory # Reference to parent directory + + def to_dict(self): + """ + Converts the DebugFile object to a dictionary format. + """ + return { + "name": os.path.basename(self.filename), + "color": self.color, + "is_toggled": self.is_toggled, + "set_manually": self.set_manually, + "emoji": self.emoji + } + + @classmethod + def from_dict(cls, file_dict, directory): + """ + Creates a DebugFile object from a dictionary loaded from JSON. + """ + filename = os.path.join(directory.path, file_dict["name"]) + return cls( + filename=filename, + color=file_dict.get("color", DEFAULT_COLOR), + is_toggled=file_dict.get("is_toggled", DEFAULT_TOGGLED), + set_manually=file_dict.get("set_manually", DEFAULT_SET_MANUALLY), + directory=directory + ) diff --git a/debugger/debugger_backend/Debugleton.py b/debugger/debugger_backend/Debugleton.py new file mode 100644 index 00000000..7c97ae2e --- /dev/null +++ b/debugger/debugger_backend/Debugleton.py @@ -0,0 +1,88 @@ +# Haik: sorry bout the filename + +import threading +from debugger_backend.project_scanner import update_debug_toggles +from debugger_backend.Directory import Directory +from debugger_backend.DebugFile import DebugFile +from debugger_backend.DEFAULTS import DEFAULT_COLOR, DEFAULT_TOGGLED, DEFAULT_EMOJI +import os +import time + +NEEDS_RESYNC_FILE = os.path.join(os.path.dirname(__file__), 'needs_resync.txt') + +class Debugleton: + _instance = None + _lock = threading.Lock() # Lock for thread-safe singleton creation + sync_lock: threading.Lock + + def __new__(cls, *args, **kwargs): + # Double-checked locking for thread-safe singleton creation + if cls._instance is None: + with cls._lock: + if cls._instance is None: + cls._instance = super(Debugleton, cls).__new__(cls) + print("\033[38;5;120m\n---------------------------------\033[0m") + print("\033[38;5;120m|\tDEBUGLETON INIT \t|\033[0m") + cls._instance.dir = None + print("\033[38;5;120m|\tScanning Project...\t|\033[0m") + cls._instance.sync_lock = threading.Lock() + cls._instance.sync_lock.acquire(blocking=False) + cls._instance.sync_to_saved(is_first_sync=True) + cls._instance.sync_lock.release() + print("\033[38;5;120m|\t...Project Scanned\t|\033[0m") + print("\033[38;5;120m|\tDEBUGLETON INIT DONE\t|\033[0m") + print("\033[38;5;120m---------------------------------\n\033[0m") + # else: print("DEBUGLETON Already initialized INNER") + # else: print("DEBUGLETON Already initialized OUTER") + return cls._instance + + + def sync_to_saved(self, is_first_sync=False): + # print(f"[sync_to_saved]: START") + if not is_first_sync: self.sync_lock.acquire() + # print(f"[sync_to_saved]: Acquired sync lock") + self.dir = update_debug_toggles(save_to_file=False) + # print(f"Synced to saved dir: {self.dir}") + self.abspaths, self.instances = self.dir.get_ordered_abspaths_and_instances() + # print(f"Synced to abspaths: {self.abspaths}") + with open(NEEDS_RESYNC_FILE, 'w') as f: + f.write('0') + if not is_first_sync: self.sync_lock.release() + # print(f"[sync_to_saved]: Released sync lock") + # print(f"[sync_to_saved]: END") + + def needs_resync(self): + # print(f"[needs_resync]: START") + num_tries = 0 + while self.is_syncing(): + print(f"Waiting for Debugleton to sync... ({num_tries})") + time.sleep(5) + num_tries += 1 + if num_tries > 10: + print(f""" + NOTE: Debugleton is taking a long time, there's one scenario where it breaks: + \n\t- If running in docker, and you deleted one of the root dirs in the volumes of docker compose, + \n\t then the debugger will not be able to find the project and will get stuck in an infinite loop. + \n\t- In this case, you can restart the docker container and delete the volume in the docker compose file and it will resync. + """) + with open(NEEDS_RESYNC_FILE, 'r') as f: + does_need_resync = True if f.read().strip() == '1' else False + # if does_need_resync: print("Resyncing Debugleton...") + # print(f"[needs_resync]: END") + return does_need_resync + + def is_syncing(self): + return self.sync_lock.locked() + + def find_file_info(self, filepath: str): + filepath = filepath.lower() + # print(f"Finding file info for {filepath}") + if self.needs_resync(): + self.sync_to_saved() + try: + filepath_id = self.abspaths.index(filepath) + match = self.instances[filepath_id] + return match.color, match.is_toggled, match.emoji + except ValueError: + print(f"Filepath not found: {filepath}") + return DEFAULT_COLOR, DEFAULT_TOGGLED, DEFAULT_EMOJI \ No newline at end of file diff --git a/debugger/debugger_backend/Directory.py b/debugger/debugger_backend/Directory.py new file mode 100644 index 00000000..412e0ab3 --- /dev/null +++ b/debugger/debugger_backend/Directory.py @@ -0,0 +1,200 @@ +import os +import json +import colorsys +from pathlib import Path +from debugger_backend.DebugFile import DebugFile +from debugger_backend.DEFAULTS import DEFAULT_COLOR, DEFAULT_TOGGLED, DEFAULT_SET_MANUALLY, DEFAULT_EMOJI +from debugger_backend.path_mngr import get_abspath, get_root_rel_path + +class Directory: + def __init__(self, path, color=DEFAULT_COLOR, is_toggled=DEFAULT_TOGGLED, + set_manually=DEFAULT_SET_MANUALLY, emoji=DEFAULT_EMOJI): + self.path = path + # print(f"Directory init: {self.path}") + self.children = [] # Can contain DebugFile or other Directory objects + self.color = color + self.is_toggled = is_toggled + self.set_manually = set_manually + self.emoji = emoji + + def __str__(self): + return f"Directory: {self.path}\nNum Children: {len(self.children)}\nColor: {self.color}\nToggled: {self.is_toggled}\nSet Manually: {self.set_manually}" + + def get_abspath(self): + return get_abspath(self.path) + + def add_child(self, child): + """ + Adds a child to the directory (either a DebugFile or another Directory). + """ + self.children.append(child) + + def get_ordered_abspaths_and_instances(self): + # print("[get_ordered_abspaths]: START") + curr_file_path = os.path.abspath(__file__) + root_dir = os.path.dirname(os.path.dirname(os.path.dirname(curr_file_path))) + # print(f"[get_ordered_abspaths]: Curr path: {curr_file_path}") + # print(f"[get_ordered_abspaths]: Dir path: {root_dir}") + def construct_ordered_abspaths(dir: Directory, ordered_abspaths: list): + dir_path = dir.path + full_path = os.path.join(root_dir, dir_path) + ordered_abspaths.append({"abspath": full_path, "instance": dir}) + # print(f"\t[construct_ordered_abspaths]: Full path: {full_path}") + for child in dir.children: + child_abspath = os.path.join(root_dir, child.path).lower() + if os.path.isdir(child_abspath): + construct_ordered_abspaths(child, ordered_abspaths) + elif os.path.isfile(child_abspath): + # print(f"\t[construct_ordered_abspaths]: Child is file: {child_abspath}") + ordered_abspaths.append({"abspath": child_abspath, "instance": child}) + else: + print(f"\033[38;5;120mEntry is non existent: {child_abspath}\033[0m") + # print(f"\t[construct_ordered_abspaths]: Finished for dir: {full_path}") + # print(f"\t[construct_ordered_abspaths]: RETURNING FROM DIR: {full_path}") + return ordered_abspaths + ordered_abspaths_and_instances = construct_ordered_abspaths(self, []) + # print("[get_ordered_abspaths]: Finished getting ordered abspaths and instances") + # for abspath_and_instance in ordered_abspaths_and_instances: + # abspath = abspath_and_instance["abspath"] + # print(f"\t[get_ordered_abspaths]: Abspath: {abspath}") + ordered_abspaths = [abspath_and_instance["abspath"] for abspath_and_instance in ordered_abspaths_and_instances] + ordered_instances = [abspath_and_instance["instance"] for abspath_and_instance in ordered_abspaths_and_instances] + return ordered_abspaths, ordered_instances + + + def build_structure(self): + print("[build_structure]: START") + root_dir = self.get_abspath() + # print(f"[build_structure]: Root dir: {root_dir}") + excluded_dirs = [".venv", "debugger", "node_modules", ".git", "__pycache__"] + project_structure = [] + + def construct_project_structure(dir_path: str, parent_dir: Directory): + # print(f"[build_structure]: Scanning dir: {dir_path}") + with os.scandir(dir_path) as it: + for entry in it: + # print(f"[build_structure]: Entry: {entry.path}") + if any(excluded_dir in entry.path for excluded_dir in excluded_dirs): + # print(f"[build_structure]: Excluding {entry.path}") + continue + root_rel_path = get_root_rel_path(entry.path) + if entry.is_dir(): + subdir = Directory(root_rel_path) + construct_project_structure(entry.path, subdir) + parent_dir.add_child(subdir) + elif entry.is_file(): + debug_file = DebugFile(filename=entry.name, path=root_rel_path) + if debug_file.calls_debug_function(): + parent_dir.add_child(debug_file) + else: + raise Exception(f"[build_structure]: Entry is not dir or file: {entry.path}") + + construct_project_structure(root_dir, self) + # [print(f"[build_structure]: {file}") for file in project_structure] + # print(f"[build_structure]: END") + return + + def to_dict(self): + """ + Converts the Directory object to a dictionary format, recursively. + """ + return { + "name": os.path.basename(self.path), + "color": self.color, + "is_toggled": self.is_toggled, + "set_manually": self.set_manually, + "emoji": self.emoji, + "children": [child.to_dict() if isinstance(child, DebugFile) else child.to_dict() for child in self.children] + } + + def prune_empty(self): + # Recursively prune empty directories + # Base case) if the current directory has no children, return + # Recursive case) for each of the directories in the current directory, call prune_empty + # then remove the directory from the children of the current directory if it has no children + for child in self.children[:]: + if isinstance(child, Directory): + # Recursively prune empty subdirectories + child.prune_empty() + # If the subdirectory is empty after pruning, remove it + if len(child.children) == 0: + self.children.remove(child) + + def propagate_toggled_state(self): + """ + Propagates the toggled state down the hierarchy. + """ + for child in self.children: + if isinstance(child, DebugFile) and not child.set_manually: + child.is_toggled = self.is_toggled + elif isinstance(child, Directory) and not child.set_manually: + child.is_toggled = self.is_toggled + child.propagate_toggled_state() + + def propagate_color(self, parent_color=DEFAULT_COLOR): + """ + Propagates the color from parent to children. + """ + if self.color == DEFAULT_COLOR: + self.color = lighten_color(parent_color) + for child in self.children: + if isinstance(child, DebugFile) and child.color == DEFAULT_COLOR: + child.color = lighten_color(self.color) + elif isinstance(child, Directory): + child.propagate_color(self.color) + + def load_from_json(self, json_data): + """ + Loads a directory structure from a JSON file into this Directory instance. + """ + for item in json_data: + if 'children' in item: + subdir = Directory( + path=os.path.join(self.path, item['name']), + color=item.get('color', DEFAULT_COLOR), + is_toggled=item.get('is_toggled', DEFAULT_TOGGLED), + set_manually=item.get('set_manually', DEFAULT_SET_MANUALLY), + emoji=item.get('emoji', DEFAULT_EMOJI) + ) + + subdir.load_from_json(item['children']) + self.add_child(subdir) + else: + # debug_file = DebugFile.from_dict(item, self) + debug_file = DebugFile( + filename=item['name'], + path=os.path.join(self.path, item['name']), + color=item.get('color', DEFAULT_COLOR), + is_toggled=item.get('is_toggled', DEFAULT_TOGGLED), + set_manually=item.get('set_manually', DEFAULT_SET_MANUALLY), + emoji=item.get('emoji', DEFAULT_EMOJI), + directory=self + ) + self.add_child(debug_file) + + def reset_colors(self): + """ + Resets the color of all DebugFile and Directory objects in this directory structure to the default color. + """ + self.color = DEFAULT_COLOR + for child in self.children: + if isinstance(child, DebugFile): + child.color = DEFAULT_COLOR + elif isinstance(child, Directory): + child.reset_colors() + + +def lighten_color(color, amount=0.1): + """ + Lightens the given color by the specified amount. + """ + try: + color = color.lstrip('#') + r, g, b = int(color[:2], 16), int(color[2:4], 16), int(color[4:6], 16) + h, l, s = colorsys.rgb_to_hls(r / 255.0, g / 255.0, b / 255.0) + l = min(1, l + amount) + r, g, b = colorsys.hls_to_rgb(h, l, s) + return '#{:02x}{:02x}{:02x}'.format(int(r * 255), int(g * 255), int(b * 255)) + except Exception as e: + print(f"Error lightening color {color}: {e}") + return color diff --git a/debugger/debugger_backend/File.py b/debugger/debugger_backend/File.py new file mode 100644 index 00000000..f785a9eb --- /dev/null +++ b/debugger/debugger_backend/File.py @@ -0,0 +1,29 @@ +import os +from debugger_backend.path_mngr import get_abspath + +class File: + def __init__(self, filename, path): + self.filename = filename + self.path = path + + def get_abspath(self): + return get_abspath(self.path) + + def calls_debug_function(self): + """ + Checks if the file calls the debug function. + """ + full_path = self.get_abspath() + + if not full_path.endswith('.py') or full_path.endswith('.pyc'): + result = False + else: + try: + with open(full_path, 'r', encoding='utf-8') as file: + content = file.read() + result = 'debug(' in content + except (UnicodeDecodeError, FileNotFoundError) as e: + print(f"Error reading file {full_path}") + result = False + # print(f"??calls_debug_function?? {result}") + return result \ No newline at end of file diff --git a/debugger/debugger_backend/__init__.py b/debugger/debugger_backend/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/debugger/debugger_backend/color_adjuster.py b/debugger/debugger_backend/color_adjuster.py new file mode 100644 index 00000000..de7abf22 --- /dev/null +++ b/debugger/debugger_backend/color_adjuster.py @@ -0,0 +1,21 @@ +import colorsys + +def adjust_brightness(color, brightness_factor): + hls = colorsys.rgb_to_hls(*[x/255.0 for x in color]) # Convert RGB to HLS + hls = (hls[0], max(0, min(1, hls[1] + brightness_factor)), hls[2]) # Adjust lightness + rgb = [int(x*255.0) for x in colorsys.hls_to_rgb(*hls)] # Convert back to RGB + return rgb + + +def rgb_to_ansi(rgb): + return '\033[38;2;{};{};{}m'.format(*rgb) + +def bold_and_italicize_text(text): + return f"\033[1m\033[3m{text}\033[0m" + +def hex_to_rgb(hex_code): + # Remove the '#' symbol if it exists + hex_code = hex_code.lstrip('#') + + # Convert the hex code to RGB + return tuple(int(hex_code[i:i+2], 16) for i in (0, 2, 4)) \ No newline at end of file diff --git a/debugger/debugger_backend/debug_arg_parser.py b/debugger/debugger_backend/debug_arg_parser.py new file mode 100644 index 00000000..fcabb1f0 --- /dev/null +++ b/debugger/debugger_backend/debug_arg_parser.py @@ -0,0 +1,21 @@ + +def is_fstring(arg_name): + if not isinstance(arg_name, str): + return False + # print(f"arg_name: {arg_name}") + fstring_start_values = ["f'", "f\""] + num_start_matches = sum(arg_name.startswith(start_value) for start_value in fstring_start_values) + conditions = [num_start_matches == 1] + return all(conditions) + +def is_text(arg_value, arg_name): + arg_is_text = isinstance(arg_value, str) and len(arg_name) > 2 and arg_name[1:len(arg_name)-1] == arg_value and not arg_name.endswith(")") + if not arg_is_text: + arg_is_text = is_fstring(arg_name) + # print(f"is_text: {arg_is_text}") + return arg_is_text + +def is_error(arg_value, arg_name): + arg_is_error = isinstance(arg_value, Exception) or "error" in str(arg_value).lower() or "error" in str(arg_name).lower() + return arg_is_error + diff --git a/debugger/debugger_backend/debugger_server.py b/debugger/debugger_backend/debugger_server.py new file mode 100644 index 00000000..12277dc5 --- /dev/null +++ b/debugger/debugger_backend/debugger_server.py @@ -0,0 +1,49 @@ +from flask import Flask, request, jsonify, Response +from flask_cors import CORS +from debugger_backend.project_scanner import update_debug_toggles, dir_to_output_format +import json +import os +NEEDS_RESYNC_FILE = os.path.join(os.path.dirname(__file__), 'needs_resync.txt') +DEBUG_TOGGLE_FILE = os.path.join(os.path.dirname(__file__), 'debug_toggles.json') +app = Flask(__name__) +CORS(app) + +@app.route('/pull_structure', methods=['GET']) +def api_get_structure(): + print("GET /get_structure") + scanned_dir=update_debug_toggles(save_to_file=True) + # print("\n\nPS scanned_dir: ", scanned_dir) + output = dir_to_output_format(scanned_dir) + output = json.dumps(output, ensure_ascii=False, indent=4) + # print("output: ", output) + return Response(output, mimetype='application/json') + +@app.route('/push_structure', methods=['POST']) +def api_push_structure(): + print("POST /push_structure") + data = request.get_json() + data = data['projectStructure'] + # print(data) + with open(DEBUG_TOGGLE_FILE, 'w', encoding='utf-8') as file: + json.dump(data, file, indent=4) + with open(NEEDS_RESYNC_FILE, 'w') as f: + f.write('1') + return jsonify({"status": "success"}) + +@app.route('/reset_color', methods=['POST']) +def api_reset_color(): + print("POST /reset_color") + scanned_dir=update_debug_toggles(save_to_file=False) + scanned_dir.reset_colors() + # print("RS: scanned_dir: ", scanned_dir) + output = dir_to_output_format(scanned_dir) + output = json.dumps(output, ensure_ascii=False, indent=4) + # print("RS: output: ", output) + return Response(output, mimetype='application/json') + + + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=6969, debug=False) + + diff --git a/debugger/debugger_backend/log_config.py b/debugger/debugger_backend/log_config.py new file mode 100644 index 00000000..19a3b14a --- /dev/null +++ b/debugger/debugger_backend/log_config.py @@ -0,0 +1,50 @@ +import logging +from debugger_backend.log_mode import get_log_mode, set_log_mode + +class LogConfig: + _instance = None + MODES = { + "all": 1, + "debug": 10, + "test": 20, + } + + def __new__(cls): + if cls._instance is None: + cls._instance = super(LogConfig, cls).__new__(cls) + cls._instance._initialize_logger() + return cls._instance + + def _initialize_logger(self): + for name, level in self.MODES.items(): + logging.addLevelName(level, name.upper()) + self.logger = logging.getLogger('custom_logger') + self.logger.propagate = False # Prevent log propagation + handler = logging.StreamHandler() + formatter = logging.Formatter('%(message)s') + handler.setFormatter(formatter) + + # Remove existing handlers to prevent duplicate logging + if self.logger.hasHandlers(): + self.logger.handlers.clear() + + self.logger.addHandler(handler) + self.set_debug_mode(get_log_mode()) + + def debug_custom(self, message, mode = None, *args, **kwargs): + if mode is None: + mode = get_log_mode() + if self.logger.isEnabledFor(self.MODES[mode]): + self.logger._log(self.MODES[mode], message, args, **kwargs) + + def set_debug_mode(self, mode): + current_mode = get_log_mode() + # print(f"Setting debug mode from {current_mode} -> to {mode}") + if mode not in self.MODES: raise ValueError(f"Invalid mode: {mode}") + set_log_mode(mode) + self.logger.setLevel(self.MODES[mode]) + + def get_debug_mode(self): + return get_log_mode() + +log_config = LogConfig() diff --git a/debugger/debugger_backend/log_mode.py b/debugger/debugger_backend/log_mode.py new file mode 100644 index 00000000..e1051782 --- /dev/null +++ b/debugger/debugger_backend/log_mode.py @@ -0,0 +1,13 @@ +import os + +# LOG_MODE_FILE = 'debugger/log_mode.txt' +LOG_MODE_FILE = os.path.join(os.path.dirname(__file__), 'log_mode.txt') +def set_log_mode(mode): + with open(LOG_MODE_FILE, 'w') as f: + f.write(mode) + +def get_log_mode(): + if os.path.exists(LOG_MODE_FILE): + with open(LOG_MODE_FILE, 'r') as f: + return f.read().strip() + return 'all' # Default to 'all' if the file doesn't exist diff --git a/debugger/debugger_backend/log_mode.txt b/debugger/debugger_backend/log_mode.txt new file mode 100644 index 00000000..baa60444 --- /dev/null +++ b/debugger/debugger_backend/log_mode.txt @@ -0,0 +1 @@ +all \ No newline at end of file diff --git a/debugger/debugger_backend/path_mngr.py b/debugger/debugger_backend/path_mngr.py new file mode 100644 index 00000000..0b47d49a --- /dev/null +++ b/debugger/debugger_backend/path_mngr.py @@ -0,0 +1,12 @@ +import os +from debugger_backend.DEFAULTS import ROOT_DIR + +def get_abspath(path: str): + return os.path.join(ROOT_DIR, path) + +def get_root_rel_path(path: str): + assert path.startswith(ROOT_DIR) + path = path[len(ROOT_DIR):] + while path.startswith(os.sep): + path = path[1:] + return path diff --git a/debugger/debugger_backend/project_scanner.py b/debugger/debugger_backend/project_scanner.py new file mode 100644 index 00000000..81a93df6 --- /dev/null +++ b/debugger/debugger_backend/project_scanner.py @@ -0,0 +1,149 @@ +import os +import json +import colorsys +from typing import Union +from debugger_backend.Directory import Directory +from debugger_backend.DEFAULTS import DEFAULT_COLOR, DEFAULT_TOGGLED, DEFAULT_SET_MANUALLY, TOGGLE_FILE, DEFAULT_EMOJI, ROOT_DIR +from debugger_backend.DebugFile import DebugFile +from collections import OrderedDict + +def merge_directories(json_dir: Directory, scanned_dir: Directory): + """ + Merges two Directory instances: one loaded from JSON (json_dir) and one built from scanning (scanned_dir). + The values from json_dir take precedence where attributes overlap. + It matches based on full directory and file structure, not just file names. + """ + # print(f"Merging JSON_DIR: {json_dir.path}\n with SCAN_DIR: {scanned_dir.path}") + json_abspaths, json_instances = json_dir.get_ordered_abspaths_and_instances() + # print(f"json_abspaths: {json_abspaths}") + scanned_abspaths, scanned_instances = scanned_dir.get_ordered_abspaths_and_instances() + # print(f"scanned_abspaths: {scanned_abspaths}") + + def find_matching_in_structure(scanned_child: Union[DebugFile, Directory], json_dir: Directory): + assert json_dir in json_instances, f"JSON_DIR: {json_dir.path} not in json_instances" + assert scanned_child in scanned_instances, f"SCANNED_CHILD: {scanned_child.path} not in scanned_instances" + scanned_id = scanned_instances.index(scanned_child) + scanned_abspath = scanned_abspaths[scanned_id] + json_instance = None + try: + json_id = json_abspaths.index(scanned_abspath) + json_instance = json_instances[json_id] + # print(f"Match found: {scanned_child.path} == {json_instance.path}") + except ValueError: + # print(f"SCANNED_ABSPATH: {scanned_abspath} not in JSON_ABSPATHS") + pass + return json_instance + + def construct_merged_dir(json_dir: Directory, scanned_dir: Directory): + for scanned_child in scanned_dir.children: + # Use the new recursive function to find the corresponding child in the JSON directory structure + matching_json_child = find_matching_in_structure(scanned_child, json_dir) + + if isinstance(scanned_child, DebugFile) and matching_json_child: + # Merge attributes from the JSON-loaded structure + scanned_child.color = matching_json_child.color + scanned_child.is_toggled = matching_json_child.is_toggled + scanned_child.set_manually = matching_json_child.set_manually + scanned_child.emoji = matching_json_child.emoji + + elif isinstance(scanned_child, Directory) and matching_json_child: + # Merge directory attributes + scanned_child.color = matching_json_child.color + scanned_child.is_toggled = matching_json_child.is_toggled + scanned_child.set_manually = matching_json_child.set_manually + scanned_child.emoji = matching_json_child.emoji + + # Recursively merge the subdirectories + construct_merged_dir(matching_json_child, scanned_child) + else: + scanned_child.color = DEFAULT_COLOR + scanned_child.is_toggled = DEFAULT_TOGGLED + scanned_child.set_manually = DEFAULT_SET_MANUALLY + scanned_child.emoji = DEFAULT_EMOJI + + construct_merged_dir(json_dir, scanned_dir) + + +def update_debug_toggles(save_to_file=True) -> Directory: + # print(f"[update_debug_toggles]: START") + json_loaded_dir = None + if os.path.exists(TOGGLE_FILE): + with open(TOGGLE_FILE, 'r', encoding='utf-8') as file: + try: + json_data = json.load(file) + json_loaded_dir = Directory("") + json_loaded_dir = Directory(path="", + color=json_data[0].get('color', DEFAULT_COLOR), + is_toggled=json_data[0].get('is_toggled', DEFAULT_TOGGLED), + set_manually=json_data[0].get('set_manually', DEFAULT_SET_MANUALLY), + emoji=json_data[0].get('emoji', DEFAULT_EMOJI) + ) + # print(f"Root: {json_loaded_dir}") + # print("Json Children 1:") + # [print(child.path) for child in json_loaded_dir.children] + + json_loaded_dir.load_from_json(json_data[0]['children']) # Assuming the root is in json_data[0] + # print("Json Children 2:") + # [print(child.path) for child in json_loaded_dir.children] + + except json.JSONDecodeError: + ValueError("Error: JSON file could not be decoded.") + else: + print("No JSON file found") + # 1. Create a directory structure from the filesystem scan + # print("Scanning directory...") + scanned_dir = Directory(path="", + color=json_loaded_dir.color if json_loaded_dir else DEFAULT_COLOR, + is_toggled=json_loaded_dir.is_toggled if json_loaded_dir else DEFAULT_TOGGLED, + set_manually=json_loaded_dir.set_manually if json_loaded_dir else DEFAULT_SET_MANUALLY, + emoji=json_loaded_dir.emoji if json_loaded_dir else DEFAULT_EMOJI + ) + # print(f"\n\nNum Children 1: {len(scanned_dir.children)}") + # [print(child.path) for child in scanned_dir.children] + scanned_dir.build_structure() + # print(f"\n\nNum Children 2: {len(scanned_dir.children)}") + # [print(child.path) for child in scanned_dir.children] + scanned_dir.prune_empty() + # print(f"\n\nNum Children 3: {len(scanned_dir.children)}") + # [print(child.path) for child in scanned_dir.children] + + # print("1.1 Merged Dir First Child: ", scanned_dir.children[0]) + # 4. Propagate the toggled state and color through the merged structure + scanned_dir.propagate_toggled_state() + # print(f"\n\nNum Children 4: {len(scanned_dir.children)}") + # [print(child.path) for child in scanned_dir.children] + + # 3. Merge the two directory structures + if json_loaded_dir: + merge_directories(json_loaded_dir, scanned_dir) + + # print(f"\n\nNum Children 5: {len(scanned_dir.children)}") + scanned_dir.propagate_color() + output = dir_to_output_format(scanned_dir) + # print(f"\n\nNum Children 6: {len(scanned_dir.children)}") + + + # 5. Write the updated structure back to the JSON file + if save_to_file: + with open(TOGGLE_FILE, 'w', encoding='utf-8') as file: + json.dump(output, file, ensure_ascii=False, indent=4) + # print(f"[update_debug_toggles]: END") + return scanned_dir + +def dir_to_output_format(input_dir): + root_node = { + "name": "root", + "color": input_dir.color, # Use input_dir's color + "is_toggled": input_dir.is_toggled, # Use input_dir's toggled state + "set_manually": input_dir.set_manually, # Use input_dir's set_manually + "emoji": input_dir.emoji, # Use input_dir's emoji + "children": input_dir.to_dict()["children"] + } + return [ordered(root_node)] + +def ordered(obj): + if isinstance(obj, dict): + return OrderedDict((k, ordered(v)) for k, v in obj.items()) + if isinstance(obj, list): + return [ordered(x) for x in obj] + return obj diff --git a/debugger/debugger_backend/requirements.txt b/debugger/debugger_backend/requirements.txt new file mode 100644 index 00000000..cf8e4eb5 --- /dev/null +++ b/debugger/debugger_backend/requirements.txt @@ -0,0 +1,3 @@ +Flask==2.0.1 +Flask-Cors==4.0.1 +Werkzeug==2.0.3 \ No newline at end of file diff --git a/debugger/debugger_gui/.gitignore b/debugger/debugger_gui/.gitignore new file mode 100644 index 00000000..4d29575d --- /dev/null +++ b/debugger/debugger_gui/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/debugger/debugger_gui/README.md b/debugger/debugger_gui/README.md new file mode 100644 index 00000000..58beeacc --- /dev/null +++ b/debugger/debugger_gui/README.md @@ -0,0 +1,70 @@ +# Getting Started with Create React App + +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Runs the app in the development mode.\ +Open [http://localhost:3000](http://localhost:3000) to view it in your browser. + +The page will reload when you make changes.\ +You may also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.\ +See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.\ +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.\ +Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `npm run eject` + +**Note: this is a one-way operation. Once you `eject`, you can't go back!** + +If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. + +You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). + +### Code Splitting + +This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) + +### Analyzing the Bundle Size + +This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) + +### Making a Progressive Web App + +This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) + +### Advanced Configuration + +This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) + +### Deployment + +This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) + +### `npm run build` fails to minify + +This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) diff --git a/debugger/debugger_gui/package-lock.json b/debugger/debugger_gui/package-lock.json new file mode 100644 index 00000000..07e6b39d --- /dev/null +++ b/debugger/debugger_gui/package-lock.json @@ -0,0 +1,19530 @@ +{ + "name": "debugger-gui", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "debugger-gui", + "version": "0.1.0", + "dependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/icons-material": "^5.16.0", + "@mui/material": "^5.16.0", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "axios": "^1.7.2", + "emoji-mart": "^5.6.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-scripts": "5.0.1", + "web-vitals": "^2.1.4" + }, + "devDependencies": { + "cross-env": "^7.0.3" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", + "license": "MIT" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.0.tgz", + "integrity": "sha512-INCKxTtbXtcNbUZ3YXutwMpEleqttcswhAdee7dhuoVrD2cnuc3PqtERBtxkX5nziX9vnBL8WXmSGwv8CuPV6g==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.0.tgz", + "integrity": "sha512-qETICbZSLe7uXv9VE8T/RWOdIE5qqyTucOt4zLYMafj2MRO271VGgLd4RACJMeBO37UPWhXiKMBk7YlJ0fOzQA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.9.tgz", + "integrity": "sha512-5UXfgpK0j0Xr/xIdgdLEhOFxaDZ0bRPWJJchRpqOSur/3rZoPbqqki5mm0p4NE2cs28krBEiSM2MB7//afRSQQ==", + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/eslint-parser/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.0.tgz", + "integrity": "sha512-/AIkAmInnWwgEAJGQr9vY0c66Mj6kjkE2ZPB1PurTRaRAh3U+J45sAQMjQDJdh4WbR3l0x5xkimXBKyBXXAu2w==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.0", + "@babel/types": "^7.26.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", + "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", + "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", + "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.1.tgz", + "integrity": "sha512-reoQYNiAJreZNsJzyrDNzFQ+IQ5JFiIzAHJg9bn94S3l+4++J7RsIhNMoB+lgP/9tpmiAQqspv+xfdxTSzREOw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", + "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-decorators": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", + "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", + "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", + "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz", + "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-flow": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", + "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-simple-access": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz", + "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", + "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", + "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz", + "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", + "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "license": "MIT" + }, + "node_modules/@csstools/normalize.css": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==", + "license": "CC0-1.0" + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "license": "CC0-1.0", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.13.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", + "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz", + "integrity": "sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", + "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz", + "integrity": "sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "license": "BSD-3-Clause" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/console/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/core/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/globals/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/transform/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", + "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.16.7.tgz", + "integrity": "sha512-UrGwDJCXEszbDI7yV047BYU5A28eGJ79keTCP4cc74WyncuVrnurlmIRxaHL8YK+LI1Kzq+/JM52IAkNnv4u+Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz", + "integrity": "sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.16.7", + "@mui/system": "^5.16.7", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.3.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", + "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.16.6", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", + "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", + "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.16.6", + "@mui/styled-engine": "^5.16.6", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.18", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.18.tgz", + "integrity": "sha512-uvK9dWeyCJl/3ocVnTOS6nlji/Knj8/tVqVX03UVTpdmTJYu/s4jtDd9Kvv0nRGE0CUSNW1UYAci7PYypjealg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", + "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz", + "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==", + "license": "MIT", + "dependencies": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "license": "MIT" + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "license": "MIT" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", + "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "license": "Apache-2.0", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "license": "MIT", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", + "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/react/node_modules/@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@testing-library/react/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "license": "Apache-2.0", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/user-event": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.12", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz", + "integrity": "sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz", + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==", + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/jest/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@types/jest/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.8.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.2.tgz", + "integrity": "sha512-NzaRNFV+FZkvK/KLCsNdTvID0SThyrs5SHB6tsD/lajr22FGC73N2QeDPM2wHtVde8mgcXuSsHQkH5cX1pbPLw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.8" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "license": "MIT" + }, + "node_modules/@types/q": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "license": "MIT" + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.9", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", + "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", + "license": "MIT", + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "license": "BSD-3-Clause" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz", + "integrity": "sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-array-method-boxes-properly": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "license": "MIT", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-jest/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/babel-loader": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.4", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "license": "MIT", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", + "license": "MIT" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", + "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/bfj": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + "license": "MIT", + "dependencies": { + "bluebird": "^3.7.2", + "check-types": "^11.2.3", + "hoopy": "^0.1.4", + "jsonpath": "^1.1.1", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "license": "BSD-2-Clause" + }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001674", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001674.tgz", + "integrity": "sha512-jOsKlZVRnzfhLojb+Ykb+gyUSp9Xb57So+fAiFlLzzTKpqg8xxSav0e40c8/4F/v9N8QSvrRRaLeVzQbLqomYw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/check-types": { + "version": "11.2.3", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz", + "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==", + "license": "MIT" + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "license": "MIT", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/coa/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/coa/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coa/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/coa/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "license": "MIT" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", + "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", + "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "license": "MIT", + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "license": "CC0-1.0", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "license": "MIT" + }, + "node_modules/cssdb": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "CC0-1.0" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "license": "BSD-2-Clause" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "license": "MIT" + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "license": "MIT" + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "license": "Apache-2.0" + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "license": "MIT" + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "license": "BSD-2-Clause" + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.49", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.49.tgz", + "integrity": "sha512-ZXfs1Of8fDb6z7WEYZjXpgIRF6MEu8JdeGA0A40aZq6OQbS+eJpnnV49epZRna2DU/YsEjSQuGtQPPtvt6J65A==", + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-mart": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz", + "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", + "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "license": "BSD-3-Clause", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.1.0", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "license": "MIT", + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "license": "MIT", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "license": "MIT" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "license": "MIT" + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + "license": "(Apache-2.0 OR MPL-1.1)" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", + "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + "license": "ISC" + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "license": "MIT", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-circus/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "license": "MIT", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-cli/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-config/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-each/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-node/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-haste-map/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-jasmine2/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "license": "MIT", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "license": "MIT", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-runner/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "license": "MIT", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-runtime/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-snapshot/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-validate/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "license": "MIT", + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "license": "MIT" + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "license": "MIT", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "license": "MIT", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "license": "MIT", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "license": "MIT", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "license": "MIT", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz", + "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + "license": "MIT", + "dependencies": { + "esprima": "1.2.2", + "static-eval": "2.0.2", + "underscore": "1.12.1" + } + }, + "node_modules/jsonpath/node_modules/esprima": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", + "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.13", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz", + "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==", + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + "license": "MIT", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "gopd": "^1.0.1", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "license": "CC0-1.0", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "license": "CC0-1.0", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "license": "MIT", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "license": "CC0-1.0", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "license": "CC0-1.0", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "license": "CC0-1.0", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "license": "MIT", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/postcss-svgo/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "license": "CC0-1.0" + }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "license": "MIT", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "license": "MIT", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "license": "MIT", + "dependencies": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "license": "MIT" + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", + "license": "MIT" + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.0.tgz", + "integrity": "sha512-TVILVSz2jY5D47F4mA4MppkBrafEaiUWJO/TcZHEIuI13AqoZMkK1WMA4Om1YkYbTx+9Ki1/tSUXbceyr9saRg==", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", + "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.11.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz", + "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "license": "MIT", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "license": "ISC" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", + "license": "CC0-1.0" + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "license": "MIT", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "license": "ISC" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "license": "MIT" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "license": "MIT" + }, + "node_modules/static-eval": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + "license": "MIT", + "dependencies": { + "escodegen": "^1.8.1" + } + }, + "node_modules/static-eval/node_modules/escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=4.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/static-eval/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/static-eval/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/static-eval/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-eval/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "license": "MIT", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/svgo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "license": "BSD-2-Clause" + }, + "node_modules/svgo/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svgo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/svgo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz", + "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "license": "MIT" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "license": "Apache-2.0" + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "license": "MIT" + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "license": "ISC", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-vitals": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.95.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", + "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "license": "MIT", + "dependencies": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "webpack": "^4.44.2 || ^5.47.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", + "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", + "license": "MIT", + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "license": "MIT", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "license": "MIT", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "license": "BSD-2-Clause" + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", + "license": "MIT" + }, + "node_modules/workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "license": "MIT", + "dependencies": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "license": "MIT", + "dependencies": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "license": "MIT", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "node_modules/workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", + "license": "MIT" + }, + "node_modules/workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "license": "MIT", + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/workbox-window": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "license": "MIT", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "license": "Apache-2.0" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/debugger/debugger_gui/package.json b/debugger/debugger_gui/package.json new file mode 100644 index 00000000..cb8176f9 --- /dev/null +++ b/debugger/debugger_gui/package.json @@ -0,0 +1,47 @@ +{ + "name": "debugger-gui", + "version": "0.1.0", + "private": true, + "dependencies": { + "@emotion/react": "^11.11.4", + "@emotion/styled": "^11.11.5", + "@mui/icons-material": "^5.16.0", + "@mui/material": "^5.16.0", + "@testing-library/jest-dom": "^5.17.0", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^13.5.0", + "axios": "^1.7.2", + "emoji-mart": "^5.6.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-scripts": "5.0.1", + "web-vitals": "^2.1.4" + }, + "scripts": { + "start": "cross-env PORT=6970 react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "cross-env": "^7.0.3" + } +} diff --git a/debugger/debugger_gui/public/index.html b/debugger/debugger_gui/public/index.html new file mode 100644 index 00000000..aa0a2b3b --- /dev/null +++ b/debugger/debugger_gui/public/index.html @@ -0,0 +1,43 @@ + + + + + + + + + + + + + CL-Debug + + + +
+ + + diff --git a/debugger/debugger_gui/public/logo.png b/debugger/debugger_gui/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..716c9202e53231c0d57a63c588d7b147bb4d3328 GIT binary patch literal 175321 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�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 literal 0 HcmV?d00001 diff --git a/debugger/debugger_gui/public/manifest.json b/debugger/debugger_gui/public/manifest.json new file mode 100644 index 00000000..080d6c77 --- /dev/null +++ b/debugger/debugger_gui/public/manifest.json @@ -0,0 +1,25 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "icons": [ + { + "src": "favicon.ico", + "sizes": "64x64 32x32 24x24 16x16", + "type": "image/x-icon" + }, + { + "src": "logo192.png", + "type": "image/png", + "sizes": "192x192" + }, + { + "src": "logo512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/debugger/debugger_gui/public/robots.txt b/debugger/debugger_gui/public/robots.txt new file mode 100644 index 00000000..e9e57dc4 --- /dev/null +++ b/debugger/debugger_gui/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/debugger/debugger_gui/src/App.css b/debugger/debugger_gui/src/App.css new file mode 100644 index 00000000..04f3ff2a --- /dev/null +++ b/debugger/debugger_gui/src/App.css @@ -0,0 +1,29 @@ +.app-container { + display: flex; + flex-direction: column; + width: 90vw; + height: 100%; + padding-left: 5vw; + padding-right: 5vw; + padding-bottom: 5vh; + align-items: center; +} + +.app-header { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + + width: 100%; + height: 10vh; + + font-family: 'Consolas', monospace; + font-size: 3.45rem; + font-weight: bold; /* Changed from 900 to bold */ + color: #d8d8d8; + text-align: center; + + margin-bottom: 2vh; + margin-top: 2vh; +} \ No newline at end of file diff --git a/debugger/debugger_gui/src/App.js b/debugger/debugger_gui/src/App.js new file mode 100644 index 00000000..ef8d4122 --- /dev/null +++ b/debugger/debugger_gui/src/App.js @@ -0,0 +1,223 @@ +import React, { useState } from 'react'; +import { Container } from '@mui/material'; +// import PullButton from './components/pull-button/PullButton'; // Import the FetchButton component +import SyncSection from './components/sync-section/SyncSection'; // Import the FetchButton component + +import Tree from './components/tree/Tree'; // Import the Tree component +import './App.css'; + +const App = () => { + const [projectStructure, setProjectStructure] = useState(null); + const [expanded, setExpanded] = useState({}); + + const handleExpandClick = (id) => { + setExpanded((prevExpanded) => ({ ...prevExpanded, [id]: !prevExpanded[id] })); + }; + + const handleCheckboxChange = (nodeId, checked) => { + console.log("Handle checkbox change on node: ", nodeId, " with checked: ", checked); // Log the checkbox change + + const updateNode = (nodes, pathParts, checked, forceCheck = false) => { + return nodes.map((node) => { + if (node.name === pathParts[0]) { + // Check if the node should be force-checked due to a child being checked + const shouldCheck = checked || forceCheck; + + if (pathParts.length === 1) { + console.log("Node found: ", node.name, " With current checked: ", node.is_toggled); + return { ...node, is_toggled: shouldCheck, children: updateChildren(node.children, shouldCheck) }; + } + + // Recursively update children + if (node.children) { + const updatedChildren = updateNode(node.children, pathParts.slice(1), checked, shouldCheck); + return { ...node, is_toggled: shouldCheck, children: updatedChildren }; + } + + return { ...node, is_toggled: shouldCheck }; + } + return node; + }); + }; + + // Function to update the state of child nodes + const updateChildren = (children, checked) => { + if (!children) return []; + return children.map((child) => ({ + ...child, + is_toggled: checked, + children: updateChildren(child.children, checked) + })); + }; + + setProjectStructure((prevStructure) => { + if (!prevStructure) return prevStructure; + const pathParts = nodeId.split('/'); + const updatedStructure = updateNode(prevStructure, pathParts, checked); + return updatedStructure; + }); + }; + + const handleEmojiChange = (nodeId, emoji) => { + console.log("Handle emoji change on node: ", nodeId, " with emoji: ", emoji); + + // Function to recursively propagate the emoji to all children but not update the ancestors + const propagateEmojiToChildren = (node) => { + if (!node.children) return node; // If no children, return the node as is + + const updatedChildren = node.children.map((child) => ({ + ...child, + emoji, // Set the new emoji to the child node + children: propagateEmojiToChildren(child).children, // Recursively propagate to deeper children + })); + + return { ...node, children: updatedChildren }; // Update the node's children but not the node itself + }; + + const updateNode = (nodes, pathParts, emoji) => { + return nodes.map((node) => { + if (node.name === pathParts[0]) { + // Update the emoji of the node itself if this is the target node + let updatedNode = { ...node }; + + if (pathParts.length === 1) { + // This is the target node, update its emoji + updatedNode.emoji = emoji; + } + + // If this node has children and we haven't reached the target node yet + if (node.children && pathParts.length > 1) { + const updatedChildren = updateNode(node.children, pathParts.slice(1), emoji); + updatedNode = { ...updatedNode, children: updatedChildren }; + } + + // If we've reached the target node, propagate the emoji to its children + if (pathParts.length === 1 && node.children) { + updatedNode.children = propagateEmojiToChildren(node).children; + } + + return updatedNode; + } + + return node; // No match, return the node as is + }); + }; + + setProjectStructure((prevStructure) => { + if (!prevStructure) return prevStructure; + + const pathParts = nodeId.split('/'); + const updatedStructure = updateNode(prevStructure, pathParts, emoji); + + return updatedStructure; + }); + }; + + + + + const defaultColor = '#ff0000'; // Define the default color + + const handleColorChange = (nodeId, color) => { + console.log("Handle color change on node: ", nodeId, " with color: ", color); // Log the color change + const amount = 50; // Define the amount to lighten the color + + const updateNode = (nodes, pathParts, color, isOriginalParent = false) => { + console.log("HIT updateNode with color: ", color); // Log the color + return nodes.map((node) => { + if (node.name === pathParts[0]) { + let name = node.name; + let newColor = node.color; + let is_toggled = node.is_toggled; + let set_manually = node.set_manually; + + // If the node is the target node + if (pathParts.length === 1) { + console.log("Node found: ", node.name, " With current color: ", node.color); + console.log("Setting color to: ", color); + console.log("Is original parent: ", isOriginalParent, " Set manually: ", set_manually); + if (isOriginalParent) { + set_manually = true; + } + newColor = color; + } + + if (node.children) { + // Update children nodes + const updatedChildren = updateNode(node.children, pathParts.slice(1), color, isOriginalParent); + + // Check and propagate the color to children if needed + const propagatedChildren = updatedChildren.map((child) => { + console.log("Checking child: ", child.name); + console.log("Child set manually: ", child.set_manually); + if (!child.set_manually) { + console.log("Propagating color to child: ", child.name); + const newPath = [...pathParts.slice(1), child.name]; + return updateNode([child], newPath, lightenColor(color, amount), false)[0]; + } + return child; + }); + console.log("RETURN 1 node: ", node.name, " with color: ", newColor); + return { + ...node, + name: name, + color: newColor, + is_toggled: is_toggled, + set_manually: set_manually, + children: propagatedChildren + }; + } + console.log("RETURN 2 node: ", node.name, " with color: ", newColor); + return { ...node, name: name, color: newColor, is_toggled, set_manually}; + } + return node; + }); + }; + + // Helper function to lighten a color (example implementation) + const lightenColor = (color, amount = 50) => { + if (!color || typeof color !== 'string' || !color.startsWith('#') || color.length !== 7) { + throw new Error('Invalid color format. Expected format is #RRGGBB. But got: ' + color); + } + + const colorInt = parseInt(color.slice(1), 16); + const r = Math.min(255, (colorInt >> 16) + amount); + const g = Math.min(255, ((colorInt >> 8) & 0x00FF) + amount); + const b = Math.min(255, (colorInt & 0x0000FF) + amount); + const newColorInt = (r << 16) + (g << 8) + b; + // Corrected console.log statement + console.log(`Old color: ${color}, New color: #${newColorInt.toString(16).padStart(6, '0')}`); // Log the old and new color + return `#${newColorInt.toString(16).padStart(6, '0')}`; + }; + + setProjectStructure((prevStructure) => { + if (!prevStructure) return prevStructure; + const pathParts = nodeId.split('/'); + const updatedStructure = updateNode(prevStructure, pathParts, color, true); + console.log('Updated structure:', updatedStructure); + return updatedStructure; + }); + }; + + + return ( +
+
+ Cluster Labs Debugger v0 +
+ {/* */} + {/* */} + + +
+ ); +}; + +export default App; diff --git a/debugger/debugger_gui/src/assets/collapsed.png b/debugger/debugger_gui/src/assets/collapsed.png new file mode 100644 index 0000000000000000000000000000000000000000..accf4f2d12dd00aa5add95d5efc51ff465898cf7 GIT binary patch literal 7272 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 literal 0 HcmV?d00001 diff --git a/debugger/debugger_gui/src/assets/color-picker.png b/debugger/debugger_gui/src/assets/color-picker.png new file mode 100644 index 0000000000000000000000000000000000000000..e47cabdb8f7653d017300812889da85bdb8ac385 GIT binary patch literal 17136 zcmYLx1yq#J_csl~(uj0QN=xU8OAAOzNH<7#cPt={Akr;@bmx*wH`0wXEZy-ge*eGo zvWEj_o{1Z?cW!*G zMksa>5NHtOK=0H&5DzofTo(i!#{%X&*mXy7s8N_@=*0bbz7F9 zA;gD_({zx40f`2|7;QAOnkg9+w7ELc`n?08rEyJyEdaFw5|8?+WZGbKbktu$LgJ}e zzr0;kLc%}s>8`CkMrwEaCvh>cr2#Q&F(iLu#ODIL4IBO=6zEHg$1M@jXU5TDMmv3eKyXO7 zJG1?15&wCb>{8U2p7fuKn>5mB7Ue2!riKH#Q6)zI4dlj>Wu1B1(yuEN@9CWyq1gc! zm1c1UGnyzz$g=<-NV{wfL>Yqz9^sztdxdPLCvHr= znn)4(ybic7fJnYk$VK%CU>S+MgLh|{@)z_^%MGY8lSe~2guZvuE2**GiW{-?$@Z1c zlxeNzqUJZ<;1yUf?iu6Lj2hWH&><_$ea=E^jVc?${YP0EIcZvs(*>885Eca}sVJXS?_bP{)PlQlPub`3RaL}*$sl9nMUR$N$l z@>s+?dCYt{pvLXAuE%UPs06Ox>`o*MkxoA;5Q(n3cmqk;TG4d{X4M)aTx859h@=nA zGgYdBnnDru5I`p*7tQ#6yV>{Pl4s(7qk?7&v@C+Sz>9dkT-g9*(Ao3^hd>zWsSbh> z6Q=3M85FedX`>1SH8H4rl?a{7D8+=fZ=&k30ChiW%EQAN3EATQJTI;f1d(V>iB)(I zQOORn)r7&#gE4VjWS45GR2?ig)P9nq0sE zKk?xSBx2?-h#{1!?UH->WBW=uuMVk;t2hUhbg|((+!E`bZ6TsSiR}wU{ zo-`PtMbnPz@d99aB)26+4?2>==FpZ;$tr9_BF3l=DEYd5XqT^tZ^y;;3Yn8=CG><- z#w3u9*f3L1(UdpEMTmNhBRa5LTQ*7>F01c#0YlZeT@b$$Jb$b8ZLdSa7|c5>)-4RS zxRK|LhtmZVZlg?)`nbE#z#Y(6lxMHgiL^m%m`65oLR1nM7|IpU7dy$bVjOrwtW`c^ zAPaqegcX06Fit;H#^fE?H(KPR13`ijXA4uQ$V_zrrAUCAE4!)f6~GqMrm{PwDV#=4 z&{5m?Iowu;i@Cur)7X8#{fIwwyOS&YuGIRjEpdfEZCE00ckJv2sCN@5kR@M$3U9xzz~yrt z+w$7l0(OlFF5y+NZp{4fN{*LZ~x_7ba^a>vA_TAe|dFO3WB1(`nW2C;o(d zBev{uq@h|)8QEHyA-=_|p~{)KNZbosrgOj#EZiTSSw76FLd*H66o@LX)xQT=<0)ca zt!~Z1YD89+|5PoO%@2Wlyc35TYBs{|ph)AyhI%3)pM@&Zyj}^8`#AdN?QrN&3ab1@ z4YBkP`ruea>xC6%NXoH9nCn>BM3g{rBApwiZ z_Z?}7q(X;bj_(HA;+}rb?8B(^I%&0l^{CAGQ3T{@lA+*P?64nm@gEBNNDzomt0I7Fas7yyuF;DXH<%1Thj

b+ptxldv=eY2;?Wv&P ziFcXl`)9mGU9U`3ctg(kZo@VsIztPQY4?&@hN!*c&>k))@s%b?Ac28)WdMR(^_(bO zl6FMSo~MniFXyD}r+dx|=Z5H?`ZX8D$#(@?^nAuvoN1_wJ|djeeWLC~p)E;^OlL=g zUm;{SKEbY$hl~*DsH+xGzYs#u-~-AAvDKOpySaKOKe*FMqM)5!UrkO<+CE^c;-u9g zoE>^nP)iPf(NsNqOkzN-UgajI>ZiMTA5X8K4cuBNt{L7spU*Y2y}J82pj@gO{%X?n z%#}y(Q+oG+bHk0>^3sS;Gry64t3mFS1EZ6DR^BQ{@MtxoI7MuFd_NM=q#1dC36Vl* z@#owtS-aUQKJrylJdesRrYR0&#IhEM{N?W!Ut->d2NI5Zi&EqDSe*G!oS#%|4iOO> zHh$pWexw1;qt=|>F?nUlp$+wHuOa^0wLnUo++YV5_)ry<=>mqaMQO%8a0Jukq0K}!wbN8}1@`t-44Phz|0Eh8c!+yv zNkk{qzkme3tCCa~LbPIVoj6+tth&=!-Li?k!~aQrFUZ>aY|l<3``BViG)NQ|1z^iD zM#1~r2k5z_5y}$7=T1v|_mQY{>@@2mSSEPxQKTWm=4Z3-bwqUV zp|pSAw6sT_6qg{b0?U(*mn^>D-c7qTKk$CirC;f{r&EGktLmulRCjGf$J|^_WYzX9 z^$vwv0iM^QJ{=qOAty|-$w zhrJC68d_Rl@Gy)1UenRZQs;drs<{?|V-`{PYDdg}rpxzNQ~}rN&5bsiHQv#SHOcR4 zI}uNMRVr#hJ+KanE>R!R*FtB8h;Bt#ZY@#9oRj1PiZfg@`bu@?Cn|E(S*X27qV>~P-5 z(#Ey#k&_okUl%u6G>g&8v#e!ELYQJ!%{UW$TBQdW*#jCz3Ec%o{fa0l zcnZc;UGixMb6={leM^I~%-rKGT39+5j{9fCz7J`wLUv8C9s{1`O`lKECc_~O^= zJ(lC6Lzce|QEROxpyFM5Fgc@K7&`K@kI!%cs$!O1A}H04Y7j&U&rUGdeWlFJs_XOrOY!Lqxj<_|M z(_N{3|4ekl-W-(S=3F((mY6oor-@2+z!>~1It;Y9bY!g=sP^u*c;GIt;_p`PkG`|p zVV}j`HzsG8_kLnN)g98}Q>?a)1qI5fXv|w!dp_2mVfBC-?p8_2QycaI8;2Bka* z%nzj~6oCOXUV`i5_OIC&Ms#|l51cQ2pGtUh{x(p(CXEW%J-d7`v!c=3$PSXfwIZ1p zM{>+!I;vuS9jdi0zK;3RO$b!)kQTS;dBu2R4!3~BM}uTig4<#$a#<+F^5pnN>y)c! zDEer!^34)=wo$f#DHmWuY8(%s3o|eaDnWQ@qI~;dR%5*M8}A-UpL0xHs(Ti&DU|Qj z)RIwHXx$>Y&+O%;zzA|P{%VZ_X7kjr8<#XRGlmP$1w%zQvNwI@jeD?vI5&UvSHMn18y8g3@=WXX4pgpfqm4)Kk&u^1@3bJoM<#hOPS5 zyk?JBs?059;WIto2#35VcWm}vrH8X4UdHQT&D7=B&O@Uc{(p# z^mgyNMTHT+{yBc<)HPqfUBF3Jy06p%EEql6Q(rQt5|*K+tyM?FFz_NHb4P4K;Lrt$e1JaN3x(K1>(vu|Y=_P`y6Zh}qOvmKZksMEsOzYd!41Z_muEEmC$YuwgbUy03 zi#lMBk8t>U5B-^ASz~S{d&KtD6BhvYCC=h78k63P3XL#zo$J3&jwzH+dk1E|?gbut z_gFn{CmwkX94yo~IP$B%J^KE57YZf@+DiJq(_I%#PJ116N0s6pnI{;TOy>wZZv#WB zX*FN#mxx8@Hl4?S9QA}7-mDZRF^eN%f?&Hs{myY;Au@2MUyX!?$(?aRHv+$0Q1M9y z6O}Nn%g5P4)k*1eScmR7xh3kq@fu#Zb28M{Gu;ZCAgNXfM)2~abArV=M=%1)GW9Q4 z>VASG(U@+(kzL2~#vl59-&{`~zZ>Glh_-C9oMN;{sPBtSL?_G*nLmo3Srl`!7ENyG z--zD7k^ZxPadnFQDw!(yzX&Y`+a1Jo=e9 z#JS3ml(Y}GG;b3*CTW;fJZ=PjpyZ>mvV2e7G0Mzge5I+!sLcisM+hk))R~_W6T|y zI_P(1GL&_kE}n`KZ7`K0u&!Z8l)YoMAuXyR@ns0wJTM2mn$sJQFIJu#+@r+wNmD4WES_Rvhi;S6IHXpbk%c55RSWxz2n>J>86~s-iNe> z*~BaKJb`9YwllRpoS+T8STFu-arvXXv;X_xz$PC2yys5t24vOGEBE`dr?$CUU5jkZ zmaL|g#5Xb>^$VM?mzoYIw3YVGd1N{9sQcSklAz&N6NQ-9Mt>{KOZh2mHlQ)@bb*@? z^rT4ry_078jM}PjM49N%^o9#df2~r@xAqdWl)eIzkiG!fDypmfi`yu04d~Y7+J)}1 zKL6owZOdI!GiV3bcjfKRDzTrhH?%TGI?F5%#O7GQw&VOEvRz(rc|~libbV5H-}-7Z z-|_m!7jn)nnn!xFUT5rxVb2mKpuyCY4qhdADa}d%h-_pE&dUv+5;B#C)cVs*piO(- z53xgPjIf{Us3K4zqa={T@FzJQ?ahMvKrL*t)oSSKJ0N-Q)?geW*&yZgZOpK z-K8nDWL7WE2^BV2x0F(TtgL-xrPvFVO!lxaCX+|)^~G!wEX?ebaGU>Hlz(q=$|~)e z5B+g1TTkPq8SWa=LPgs?^@=SzYBTSk2!H(NYth_mj8TMr)=ED)_3JjAH4Bq83=UQ| zO#Eo2iA25G$iVKtP)L(f>04JV*LM8YnSodkuZGBoX^5m$Yr93D>ynntX32p>uDd@b ztN&|QXW4`mW9S3Wtu*TDiZnT3ulE-5?EbTc1VQVa+Q&J1&%{p}G3)GmMJV;~gkp+R zOj}8%NFH`+mT}f-)a9FT?_qW3acZ2ZpTVH0TeAh{HFMrum&vifR zp1I#?+HZn^ytW+0W%30D`~t>A+to{8>LUX0y@rL?xBx47SLO~eAE8*T6^HN;U+;H= zqlth3{JE6RaD?dkGErMFYGmMws85AX(YgxC_?@W3m)GIRfBNW;4%a^CDYLd&M0&jW zV_qQDNnpdpaCDd9}s+DAx$j3!cJm`Y<)Gn(4b|hgb ziQ5xO`HTL|la|w$zB8`wDxF<&W^BOo7)UHe&VWiIQDhYXifHU=qfVf@U%8F7nsnht znIst@Pm44c&-G+nT}q={T?XplOvRAB_VM_l>VjZ_-VR$`!7!4S^SI>yYz;aT!$TWT zQ9LY}OX;LtSHQkcG%qI`^0>RZ%a39r6ysWaorNKCJ$Un9R&vjD**P8qC>2ccsVYW4*BXCKy&EYrz$`AySpD&TwqDu4@-J6#Th-UC9325Qj zDFiem?qmPj{m*AtGLDo=lsi+k(u9kz;yFl|!x1s}dB0MH85#Ojr>g;hvt)n(#6yzo z3Z;mK6@pg$j(@`;0i0;F_WHq1D~rc}1nFKJ#-m)}hIIh70Ux!BKr8mlWhPTcBG%i2 z6-a0hVE=Gw&5q@_D>+BX5lo~1*5?8m>3y>ncTzh*3o}6%=kY}WyN2RLS(#mE1B^X5+*{V|3p z2?DYq1pQeIrCUr_(q2?WmyXskh)nQV4!9ls>1cgQ=a5cWl__39QIY>m{Q^+2)oRX7 z-7N5@ZDWd1Y53l}<3{lo$-nd^GW@8>;>KQUmS^VzAb*~eT*eT5Uce9&xzw{<9m=^( zynB;v`A)y{4DJUniSM6ipvf#8UQSxq-tJF9PBZQq>6hVQsiy>8JM8YU66USHi5#zl z&(agifA`|8f{yCziz_#e zc*~|RBmzyslaF8Gv9DaknY$ThyIIjf$hFV(^Srzl)%Lwdu{^F~JfEY+o#dJKx^AdB zOkSUT5NtGBJj!+hNnxH>W(NZ?U&O>X@x7xv{V)kb{Cq&C;RT6cM}UJ8v$CTP1M#d4f0bzo>BnZz%Vzl@YG3j@ z@x;Gw!{_9q@&>_yQd|(XnsGM0jtINQ#+NxP`;D@lDfH7s%hu!v>G*m5C!??x!TK~7_RtPi}o+UkBlkO5^fXCmT~fI9*Xu$)%$AK}5`V5s&% zlZ$h3-}_^3lu;qY4Rec1JnhO4(3PgO8~4cf6l|BKOY-=CP3Q5~taTb7;n1m&-stxA zmt)7NpSD-zI5UFlV0Q*!@^v&c2!sy+$=F^jz9i2(gXO14UowxfF2Tl1fgrwi{ zv*C-5dkYFLE^O=5y!Yqn{xmy4f+jm0u2vND7BJjJ&?+Nor~GN_lL`sFA)N=^wG9be zb8_iqO4X`{GUrsW{J9=^`<|U~8y)_%)yuxnylL}e2 z9k>S;L>3B%iwHJlamGm>vV7pZtd{3w5bGEYFF_hYMB$VcF^-Zg?BD4>D9FgZEqI?i zU5`npwS^k>RT0>WHu3?QI$dWPG9)+3B>g?U6eollcnt{nL52|jLwP7wgWn?OXXH}K z#QQJGm!%Oh6r?nB&l~7GN!ucdn003^n^vrj4R8;ZO^cKz{px`u4PS42(E4)?Uh(fw zCGEfXDkjL^^0*@JdMAhn=a{3t&)@pyFQX~SN?y)S9+4KC-2BXHiHm4H_Io88aoQEq$Y*FVx32^XEd4PpbM+-N$ z;VtBCFro(!q4KAN(ooMo@L)*ui{W2^%lrF#>>z>n$BcQZ$GhR9&xw5@O2@k#;);(f zim1Mp<#*KfI}9Lj+R6D_Nq@ba(ESIoEP6#PNGE}ibm2`lv$GrCw(EMg_^iweG}-a( zyaD0Q%gAaE=8SCdgW>F0YJ&28DF9^Buu_t^43;x)RCY}(L@fLGl8K5iJIuh>lBmf1 zT)-d8c-(iQk)aR0zL|+8>+A@P3pDPx@qVTXFb^tq&%#T-V@VxW?DCyLe6$cm!1oRa zmfDZVKKG;FWLn6vkWti*?whz~Qm0X2D3+4TDyYzmNjEd=w-zKwjfZYHTsrc=C9V!t zVvBUZD4O!{)X|)e{j)Yw4^N{{TvZT$cV4=O;r^|yqLi=rNNJ(jo3!tu&wI>7-9*6H zi2gN7kzYqn?7-DH{5UrLTIP{%f<;0HD~FEutn9KG!aH>5wRjjhzvN%xZcUAOQ}U&M zKzu`QW=X?BmtLTT$@+qvmX@EjI}8be%72@)I)b4RD;Aa`5GwXnjCy6b9%5eY38KN5 z9qR%{AE1eV+__5NAz<#A*O9jp(YtY$V4J2%Lk= zOgT$Od@PbQgTET!2o+P7E)z4FL1zz{e2k{>?ASFck}!1D%ZPrLh%L4j%PoYD{C2Xj zG+Qh9iNXFS_Rd$|5y74F97(r zH|lBis8L8Ou9Pt0%opTx(07?p@k~fI%q5mfv9e2}uNTsb$Wd3GGc7-J8gPsR2Cx9> zJUHp;V^8FxqUouNNMV$zd?)div|ci+*k?#|St^^9cAwbFqh7B}6_L7`!Xu6fyjJ?7 zFd;<8QO+YM|8jg=EX`U{k(QgeelST4QLa16G7rW5&6@bwIOLEX-ySq4@OTW;3y*(2O70KrdM^f zS@l;INQw>#U&c~}t@*PX1z4DIA)~1q1G^t%KGkXYIzML{ufX89f%H^Vz;_B3S&wN5 z4(#O`b7N>r>$3FS{L*$D6C@07<(S{Vfe&7Ia$Afa?kA?_W6lmI$efu7A1{03i0gh0^^?f zrUahp;Aud+60}VINzxsC%k5!!Ob~?lBCJgZ^VIG&AGXlfgx~>7ef`+Mnn6qdFhOA` z9l$W#2=KkQb0z8y4iM4C)0KI8Fw)QK#N|opuB%SD!~beR4yT5W>zHi1B%@@d$Pq?I z)zmm{`@fhYyye&g-l589)wMCB>HOjB>}~T8)cjn~PF7~7T?)>+9_u4hXXbED8hJMz zj^PWy2NR&iEu0}vmpzxFm|07WCYr8-HQ0BP*gZ}Z5knf0Aoqjt2M7diCc_!VbcAP{ zy&jB6>>Rh|f+`b?rFIXJocZAHCQI5B&0h5#hLbQIlMj_>U?4BaPo1459jiW0_8U1D zPEPR#19-I@|v9k_Ir7@Br zi25A}Bx8|*RnBJz=HVpVG>HEV=OKxczpFHx)D-v~@esdsFyO*E5}X0=3!ffhl>K2K zbJz}nA|DwIPA~#;5BEpu&E45`$`aQ{@SXV)A)GU=I2_~~smxkH|rdkP*tJsjQ??_9vE1YwpO8D7O7;0l5U6sco%2}U$Vvoo+I~fB#DRKXD`t# zN+@CfN3Jy2F$6lF0e`53tB>W%oTtND3$IJ-cn%Q#ea4b;7lN(?R5mS zSo2Gdj*jFcv}G#wbnIaL#|<6;4qkZjW}MA2_$Y__ordVY=ASso&2#%3#rfrBYV1R_ zCxD^Qf0{Knrjh&QmsRL*bRIVLUpxp8G_jDCm6hvrQg3jfxLwC-O213gc5!c!|63ZA zC4u3#gD!`R@HznHKhh1eIN32!~JiXY2#G}uQ`fPw`sRufALvHrMpp|9~?u0 zxd?Ns~6rf8snzn&PuQQgwIje`RU)BKo6q!g~LbV&9GxB0^EVJvLOxgVQRPKPxFUkBeoxW7q5JuX0KXnI)0Lq|I-Sl3C*=@ zm5qmqW+@yJafQ7YB^w*z;m`!lps|%p)0^pcgJSp@FS9!(G3NPFW1%ISjw5JhF%=@oMM6uO-lUE!I)FC{JHN=Rf;Ya4h zu@M>vpf3Xisg0_KJ>U;(M)RQ=0Dv992a?&F)5Cqo0|f*2U2)6rUvQBYhKHk9qw7gO zMG0ZF`2`illEL!e@@4_MdrJ7YhLAs^k#(en! z+jYagLb{EFI3jzUj`<*LiMR)N9OEWgo4;F4_{GE8Oc#0BAB(u!#8D-P&S~gR`y1_- zwWC3D(wF;OfO{02(Vk zv&f|XA@OA_$dVNOOi0e)|Mt2R2SIwn11tDwAELOZ&RIMznlFDYE=9ZDUhVT1m)JQH z*LHjNEsN+kOP$<3XJwYV==_H{3U*})^lN2Z$j+7>$x;zzL657ncKh#BYi~$3qLL2V z`a8`H4p0`-0{>>jdT;!- z&lsy#(IEBdDet3G%!>K=e6VviqqJXZ1w`Juc%0*t#Ax>}+hsnCK$)z?&10zxr%$7N zS|EwUid(BCKPXiuTjMq4!{q3$?>EU!HZlr|MRRWs9?3Y5CGYLJf=RNSMnnQb$~C6) zn^0ljN>$xDA@(Z|bv5i%&*-71W-KBzN?$8)e#h3a$7=^stMQxc8eY05gcwxukM}~< zv3R!M_`iN0Z3)2b)lW$BrCRK{gf4j6MMx9oP&YSFbq7=!J>nP!E3T1qUiZt!0EtuTC)mH%1&IX4-!@7x-GqHrgu8)v!$&&%FRK> z&0MO7O-E*i=qoA9G@a?VK#knLKoZFEyy7vp$E-CyH9XS`k@o zlXnSG#^diOfEZX)$PJE8uErntZkZ(P@m}K}=C4g@iim{nXT;gMxE8-ByUnC)-k*Ix z`>Gyy{O*IeF~_5DSYmmg#33guRk=ID;HDCO;?Y~ue0ZPLl-ki})Rk~e{T#uq6J?in za$kmIH1neq)9PlCrQ8+icKcV6ZePcRRSxlR5uTwIEQ_%z3xc*T<8!XLt<%~s1 z)&J=35lhnTrFW@O7IV-rnEGBkzUyoxVo*HuchF-EjKnP3T{0g3kCg@Qsi*Qt>AIE@ zghW)gQmn^yR~D?3=4cz=VO2@SnR^|T0nAYpHh3DFfXC}YB!RSsnkax~gLC%|?A;sO zOyMVF#7*Yqf%UISKeGw9?h<|whZ$+n^5%UPp-cy7Q0e|UD{0A>iIjj!KRsK};`Zk} zvAscmLLU(Gvp0@MB$0UW$po*!o`Xl^exbxGD5=W5;9Ly871?b40;W~7V`+bYO!5c@ zZKP~bcV-QPEoLRnb;_ZEjeZU7mCWanlVr1~d6p0OJz4G{0nP(<_f+PH6p!>HpeY7P zWtJT^F}kxMI52(%?=IF?r3$z3wr>Ci*pV>)fOZ-+_fWhNLoZ+(ZR6*olpx)g0I~X?*&{Vk~8!|^w6UD zq$BOla?C^Fh7?*zQMua16W}xRZT$=eefU81w2U8aSt!jTe)Lw+Uj*NZN0kWrC!ioK zG}A_pk;hRgSMm1Yoea(sM`kU3^}E45!=lVMPiv zi|$rxgN6O}fx%z9k?8 zwkps2yWKhQfT9w-yoS66Kh5~esAKI$&MP4(?R9ud?box#v)p#w9D`muTy3Loe=xyx zSFK-r*>AC%>dpAp_hL0xC^tW8L&)?cvx)}HzTbsg=0bX_tHJB^v%lhZT1g!xfDj$C z^R>onfml>gp+8Jx6J8%OC@TFqz1}LA6#|(ji9J{C>!;CjuY@V<5%Sq0d=Q=ad?Q%w zY9E_Xgf)-?%$%uImusLW9Zg9BnEEiA3P7o4w zDbzZ%rU+N8UiHcxh)gtY8#-BO4POWk|4~i9GM~4HPni(sU5kq9${yQ1Rf|R;$j3!< zi(di0)>ayRTS30-a`kQN1N8+_%AM;GCp&t$1_!)f&hH`}C7B#mTEG5Jzy07yjVGl; z)19|){3qm7i!>D+>b@|WC6G3pM~j1jP2_48Mg}Xb9C^UU^7*o@o#~!Z8dCc>a3Lxm z<)qnoFz(gN-fFt%LX*d_0mX5Ly}XdgDE^X^9Oy_SV`mavR}GsIvJMl!v{n657(0)- zLUk!o_LsqFx*M{@EzaM?Q;Jj-btD0o(ntdM~w|2XMDr{ z7WVMV>SAGs(hPW^ww~t5cZIMOee%|y>EPl0^n?z7W#qxmo1$9br!syq|HYL2J(=wd z1_i^m;}MT{OP>qFcOGUpx*q?K^t{ET{sWzfAzmTH3L?81k>*cPe`x4aupXe(hJ#9e zxwB)@kmO!{0UVvA)e*7puZamypW(fMv0$uXc?TjE-#P}mXU}R!A}oP*&+N?XadtLp zYz+4LH#Ko4KbcDXc$Bw5dz^CcdgLBcccoVP_4unVO?FO!THsO~>5mjsE~TxuI6TMa zeh+sx#e*&LptG{0)LjAC4vbRzX1tuHMbX)W@nK?2Vs5iR{xI|~_lVoq%*ce^iu#Pa z)D%^N7Nrm0vMik6v(@Lkd%L@!g@<{}mw#whwsc)rt=S{_o_e@wjfb6i@nEyZ_~Aq9 za$BRLny2Q&n`DWX=@#{NG7CNn35LZQJ9_v_vAq)~MW!Gx@k%o0A*4!1aROv)8JPdj z%%Nq;4?We*zw_$=zJShxb$@=2gK|mbNdAPm^7J}r(=WagxcGYvc1IN?_^4Xz@kwfQ z#DttHD(2hAHox>wRVZ|=uzW33qCd)i-gXix7++x7-r@YP+~ACVi6Rkc?#6Mk-*JsezY{#higohmRUh$rD?Of-TVZtm)zYJr&nc&<)2v z#WQD^t(gz}n-UZ-L~vsgpR}XDT0H=eW*sc8MEG1dLFa6Y+7qm-k zhaQeg|FA`roA^GL7V(~VN&04L_n4rEAz2d$Y;j2j=#8JGabu^^X~Rb zSMZ{}0xSg_D)r{Gra`BDfARFJ_<&PpugYD4(&il_8k@SZg;7u%c|Rk|MNW$Oi$!EC zWAcKBAFrdV)_ZuU9z?ys`}fIe0&>8qD&%iIm+*>2EK(|`#b@Bn@@8`-OXZxj%5uPL z{>jvR)|OD$OE+4V4d=Gm0=njp@3NE~YwQhJYuRo}^Q!+Q3v@XJh7V`#ORn|#T`1<) zPvd@iM#_G)ac;>%{hIGI+>SY4E?{q`ljZJ?w9-2vNd58LcV*y<^fZ=Ue~pLY3?26V zM!zG}Qjb+2Xmm?1BjAwFklst85XsRY@(8>sgHinhahzNKMx+(h`sfbg{pHhUxY0GS zWr_8@$ce8&RAAH)aGVk;Yqmcj0V=h6`knx5YVivH>JLQ+{gM5>;<;Z0e*SD&#?f*> zf_gTcY~()m%NxB;ww0pF06w3(XUNwRWNsMyD2N1jlRyeOktJe}cf$h<3CjX#ZWumU!m6w7T(?EwOnkOT@F+uuI(w=|VNn=lwZVR_o zI~;9eUqWlk>3nD-BGTUhcr0(ezA(VQkqe+bh3DNKddr)w&db@Ad!|{>%fLtIyVr6@ zdQ!+)ge&YcbhxvO9bseJgkBUkOO%O^Jsimo)cCh#d!oAVY^m-(w3e)jOD==Y!o((I z16_D)^lVlx_ec7*U8U`y!Y18=1H<5NdCYM5w~!l3HAHTDp_)icM-7n7y#=YXf&_|B z7QMW&HO8RVYx2ohQPHY690lwa?s6SZF%;l#(bxiKbz+5ItK@FY?>Ar36?nhI$=zX` zgVFV+Ff^qUbp3zy*Z(C>u?&vXjtFuj&V4y;wFu^=GDCA0hF%BvZR8h3$meDZRoInz zZmpbbO!%d*da*^l=}-rYZpJ~hgXsb)EsIh9uP^xfod1udTKbzF0_k*|C6Q7pJFjh19@LC=W;m}w$aN0fhvXTV`%PYo)j#j zdUkS@`S>B_ae)O{MIJcu>9Mx0G$PhT4_+qGClpZQqu$*SQg&8>7g`K-flwzuT`FDk~<@se= zJkMP4luCD0epWeB`5Lv{umyh36iH!g+tZ{gC1=vah=vUqdCe5;qxD8a5>RD;Q0#fn z9^C$yB#sLvzTU;!?xce190WS+2TQVcYY4yZO?xi4$oGkn;&|x$B9qM_eq+;>rqjx` z0_kVbv(k)GD;PHRe&K<|__G|(%mh+Ox$^PI=6WYw4Cw^)`Tn9AE|17Au1kd@RD(5M zYB4x>nDbkE_TKegnSxFzcW;wSXG;6vNm*=1nMFRsfRsKDh5Sckvq=KXAezFE?x}P* zoaR*0f54UW8GpH-FFcNg9-oQDHvwpO_Lg8wR=(ZPhpqilmzXA+8jO9fC z=WojRy9kGq@f9Q@(sy3P5%SNdFRK%m+<&Oj4iD?EudJ2-5`AyKbui_|IzUuFq;ifZ z-cHoK^NKBJn7rb^_J>l4%FjD3 zyj8%=>=Z&PMh~32=UmT>q_NyyL;{^*_)6zU;FW`}VuScRhYP?p04`|vO2qX_!lgU8 zfLsV18QWUpXc_BY84Azx_xh}+7u=v>4OIlhvE$>f2L`}%^dAApxZpd$`1+IsR)t;L zcjwPwaSyayOD??dz&i)GEdW~_1j)`$Uo}^dlmA}^_H{Q9j;4EI`Gc_nB8t`L^}(&f zB(4jH3$MStCNYe@6O~&(pdfZ2-#l0_{@*>2SwrO$4g>=YSe9 z(610#QXqH0FHB^;nN**{QyZ0>z*{yNNq8}KKbCgj~d6fYKSRcXYl^pL%bqN>QqY;Z0a^>|SK02nI zu?391Z%`oQm_ZL_-~!SviT+--=^+O0(9RLO9^`|}5s=VWYqBXVdI`hV#yciJ8RF~E z!vWyc7EPk*@R%YpofB=SfMsZ@o~ukUYuxW^hVl#p&xs8^DaSQpb|U#ZG#CK~&o>}< zQ{#v$1B|f1W7Th|^3x-dYNaC<-5E%6?pk0HuJ9fbK%=#3UDRg>gCE5- zZRe0c7sL4M&SM{@lezK$>TB;58Wa-or{{r5gl(u>#N>%#)h1wDT=1?@L%!_J0*D8zV`u%@GJKT0+$pNZ?C*f*U4 zp#Amc^{y8`0~pU=+zTNfASFD%7XW@$xxxmKWo#j_HzNv-##_o1j#t~%88m0Yaoz{* zC(nJi=t3f8r`fEWvk`B8wTibye+jrI?hXJq0ow2{zUIqJYGrF+0lFL%T-t3mr8gIo zAM_ZbHEZkSn?wbOwK|bFnk0sn%JDMmLc$+MW>&&weVdp3bUN!B8UI})4@Om*xWRY~ zD%R~5$hzLD`28k{{^2oD5yNj zN}#6>cJc|y+r^>|#K@s6>WRau;B>>OUr#5x|43OUjyrE#2-(iG%<{aVDE3P+Php$b zUlcOdUmR|v`N!)L5{85^HR~n4Gn z9x0#vqkFH~75;3O7zUktP1_9)|9fq~mNqb#Pp%zvSLD<`2{C{Wb!+@304WCb{^J3o zn&3n|_*(R7)#my3et1sVb!NjM;2=p9Ce%t~0)Uieo(8VAceBIEL<*cZ=68}o)nJ2BX@`P~$IXRByo zBl3U4z%`Km>{aS|R$$=^95vLc{S{@VAi9w7(!dYY_sPCUF(_)Fvx_GoHro(ct3z&D07zN|R@mVWsR(XeHP{F_eJTjcj#!20fqb*nfD-G62dUe zvw?z74BvJcKk%{T@j)mPPQ0uWmu((GSmXkk?_1q1s+ELDUuHa!5a9uE{GS{6qPiFu zTq*EJn3)Kea06lTFbXDWVl5U(&STMNyoh}17RZR4SGjYmBY6@nF>P%!l{mxyfWHA9 z0bAKMWVGxa#wUl<&Yg^RQqv~*7nzMN?XU6ikL+1R4pb7+hK zGU}Q%it03zQSoU_ZM7B-A&}VOQ^Ck3z7Qss7KrdridZM>|ARLN)-Rptbxs(tz%}U! z2&I^##CZfL=THSq$!6lqf^=0R?wyGo{{ z`Ja2$DdO88M2Y`L8ua2&119!G-MFc|)-#pHof=MhOo(7jX+I4gQZ=s8QNU_5PGTg; zyLto(m6t<{cx6QF)LWQisFNT5enjPeaIQ+0+0^ZBzHp5VY7Ea4WRGTf^DfEa(cNV@ zTa4kP)tjWRhVLh9E&jV1oJba5%;)>|M&7ZkMkfUa!tWZjT> z!Dbjr)2}go0giqjpUe05?K(xch7(<1(dlfhjoQ1X5p9T^Bm;wG2cd_hi^sJh^uZBo)i zxyApm{HwvdM~!SR-$iVm<1*C`GW0~s0LRBUO#jJn-U50eQ0Ii$F$-H1ZH$dyn(!e< z_vsCGV7b!oy_Efr`mX!)-Jp!gGCoq6E+K!sE*{O~VAYMEc|Aw0|0sc~f?G=HE#$Cn zRa?)qd(3K;m`TGcYbd6=TS}b}yyjnw`!xm}{^2*ywELVx*@iZ&Ae*r^)t(SNzqgCy z<+B|Pmc#GEne2bBmAMa6G>D$Pp9tp9lEs7EL7!2sQOduI)AB}?^sjKC`{3w`_^Mr9 z3%qdXoK;tG^uDvlQ21X#&Wne>u_6i@S)TiFjIoNj#7kITEs*|duve~+_5(KkGYuGFb}Q<1k$~K8`Hza1FnPx zQ;5K1uofP*n+M%-PujEjD_1lS90&GN!9OPZWvJ%oyre~~YT$HN1VuP*fRy*)dcBv~ z+&^vp$xRq`!wc7?hv7pKfp|ke2Z|;uYkHnv4gt}#UKVu!1oD&lYfMdiReV)K6)`$+ zESeTQt}x|S3+XxGU$yJvhZ26&5dQp83=pxkm;O^N^$0ZnT`|l+4bHuWL~F0d(*Gcz zXmlZDBWd4Wv?R^XiNyjJLa5Pa_4g6w-=zQgH825)Y%aO3sv($y5Z#Kt9w0&1WclD( z(LV#qeTbIN<*xg1qgdn)KRb#{!)^tsrS{TMM8g=%wb70aZeXY2Whu9=AqkGsYFqU5a!5PW{m@|Vkj!T*C)%e%Lk-Xa|R#Bt7LWjL?l`Y!t zK>mtf6vr^w?K@@_0frV*oHCRARZ+P9E8fyxgV%zGGGeIX_qVt@{R;QEiNa{CCzzdC zp&>By_8*qV$H>r-waz%xNm3@a0W1O(5{>_v6s9_Re__Ou%pXutVsM$AYX|f_(XcY| z|I=g6MxnW|v*!se(_CW>!649)J38=MqA{0?rbL|q;8EN`@0{!oKc0fPToOcHvmhP_ z?+!$=-mmN8>xix)@~Pk%k~5{gN?5wqmQi9XhVQWE=0vh2frpaiG?#UW3~~VA$Y`ju zS@c!m1jjRhzeK_S>==v|O5P)74A?pyI@z&$8FcyCHEsf62={B3;&rYjl)<6&iEI0f zqIkddwPoYtDjVCgbvm=1H>RQPfB=!3?AWyFo8|FeC_WfM8D9)s2vllZjhAVhX&I_n zFp(s3V?y{>obG<3{=-nd#$e&F=*efvmQ@dOuMwg}Po!`YF4&Cw!+|t?nNiu%k0dCm z0U96#+)(JG_)YBkhWg+Fg=+kXcR5GjI$4L1B7y$0k|DNUf0eRD@+TlI;V2s`8+(7` zK%zj1KG72l>1q1HVRCI8J!J89#SMAu*!I3!GG-)jdEkn7*1#2;uU>Bv{kh^3z!eC$ z#3MkJQ9|F<#8bAybF@7bx<*46z*6oo>(%uB$*IDv{xANJ+@xy>co{(ARS9({+Xpm+j}M@m$LZy%#2UsB23P6Z1X+7VXKtWY{ z%@ST{p+iR~VYZ(TBUi3|FX%}{?FQGM>q=n33X=6kDEwr;fL!@CDRx(9Zv7JJUVUa2_ns{ItM(fDcC%<}sKsazMYYxoCbhEh)`w>w!6kQLhx_sL& zpPJ#~w;SL~e##-Cy4;**%R!!oYFl;rQeZUNWl?+Thc4TlmFQzC${l6G94hl~LF{7j#r{ zel-y2lxcD0(umMPY#qgYx{?mM{5@QK6{i2Dw}Dc&Np$mgcXgquMLLMq#cMO{KqM2+ zkzE9?xVu|}chc(p)5`Mr*Dv>bb+h{c*Me4sI!7u$?SfxE?mmrzE?UnkFfPu4VI7-u zTS0-;;z!lBbmCY1?1USyI7?HkI>_+fb`L<5?L6Sj(sx=P52=3qBnbpu+I+k*}kg_s#?K-D|v*qv&7g4xgY!=F<9y3@*hAZ0qh#4vqiwzqgc0zP$s{bYu|7@fy zMz9~#6-7jwbM#{mt{nS`jo^n4EjMOO1e%V@?6`B_pP;5lXjraKCx#Jwb}TJ zRAqWeG#z;XZ%1WNfq(1{Gn*BwU^~?(qIX>M)p=4{%@w65Q*9}bACY6#NY^8ChIAR7 z3@@8Ra*AZ|U|o3pyLVNpug;xJy%vksXx9v0htfQXu6JITKr~Ih8ll<_*uJU-lGKKF zoRWu`m?&qFW==2l#u0JUsyMJ2LxvqfNessBKCCRclX!a!?r_AXKF?>&)bpet~q)Ve}jSnEne-@iN{+;f=``g zkTU^j8wLS(Ou(BMm;2Sq_6mm+cxBtw2oRxLj!Trq4%e^9rc_W^vhNz350^dDZEcG=^` z)T>iFCP}4i6lzHJXp`>gB_xt287O$l%$Id7)R*t!vzk$6)!lg@+#+pDhHhT!+d#I5 z`npda_!_@0rpc(Q>z$TXvm7ty7bwCBMZDP#)(&mwnVX zYQjV&Y%U2eW&KU+uU@V{eV_^mb|U&+)p@=z5Ec%P?3r_p7_@vo^9kHb6{H|2u_&DK z7W7R%ad+TDc#iD8MB;IkLg%ss$l)HOv0pIt4p5<4oL9Ov`9Y*Vh^YM?zR{4B5WdoVS05>9u z_@-q?trlL5(%^rbc;v3Yj{yf917B;fHsy9I>37~G$!~1Y-yF%sArI2Jki|;sMJFzU z#7n}(?}H)*uE+aVCkNYCVF4I^jpmioy*p$*3+{@6!uvb%$wjwWb8iBG+*Juh4 z4b+KEqiAEu`6-|dc5aVo7zRpcgv1AFYav7Jw}!1_9-=*oI;-fIQ)iRLM9Q5K z_<>tKw?Me-WugQiFfnmBb`;^q0611oi)^GYe21gpCCIW+E+XI6HnO_Jdg_SNrK#QYsaxTq zwJ?B&2@SCSN?qY5vDk}H;`9|+>$r3x7 zGk)F|{ch=!`Qqb-Ne#Jua34u7mr^MWG1+9La-pg#Js8WB;j6~CU&hh@jnJEu&_x%BM*R61$&qVYHiIjy{IhsE6ZC_{9j8hk88g_wv>p~92)4)X#pSwD%NpEW5k~}TV zE?6`5PUlx=3XNKTKg~6TruEsUugsdLK?KYp*h8~w zlbEtyJb63GXNDEG$-K3ws3;>c@|_OzgIJlyS(ykIFYjoTH_t0{DeZ`hB5pq$8>7## zFZh&LO$4tFuf*1MN!Eso;DW%fNy9xHOn=szF!cr0cAc*z9&aWbIelrfDaH0N4t+nz)GaapNxCtb8U~4=%n}~n1K#c*ex?^`VQZE zSeVWB0`ANwr6*D4R{k7CU@QpFgZqn%&+a938H$iC2_#e`c{j0K4xTIK93Dnh+tWsc za$>Zy%H$eDKh+U$fpioURi&awSRz#Fc_+wJSvBcBppnGnog8(9ALGU=RZ4mdJ~CEe z&zSZ$-8X2(ACpxrx5*?&1Bv3K=`;EySe}0tNTlH;={4<;K{S+tIipp?^~m-zg)3Sa z-WEnsJmPm~mNJN=wBdJYZWIRGnkmy)NnJm_a(UUM?*Rd?=60+k%t?AX2Fb`tTAr)xU3RPF?u3vvB|x5iGF^;0(}Ze`3@wm!2MFajIYIR^G#6j{ ztGy=$4lmkPmJLC|h$Pyx(YRr@D2IWDavN4xwaaVd1@U6EJo-J1 ztqWH3s`8xW+P!K&7{S8rD~xVf5a@gJ3| zaw-jl$=n5HM|WDVQ-VCr(q0idOKf>dR|tT6Y9mx|b>u2Ii#im5v^5>9&Q7^ATT1IT zIl7_i_}(;g!ylw*mRaE+-O(gLwnXjNl6S7SPw_=S1uu>2xli*id}I(ik%m@mozF82 ztO-?tyPxG8`d(->Gs#%Wqvi7q8K^5-{JJGld0&!FiwYf1tz!I(H%bZ>#fmW6-YuV< zS2w5!iSwd~m=RpO?ot5N46Sm~H0@5I0>#=_kXz*%NG$Wa7fo$Wg1~c)y6>i zHq$~e8FbIeJ&`Ei3E`Wy{-b+T80$CBJU-Kf_(L+Z-;$o@mjh>H7fZ_fi+4FUjM}&y zE;W(CQwJC3!QX7Jj^r0TUn)@bo}M=f4gFA@{E$`(MriSa3ZqTU zM<~`0gBIvqmKC>5??^ju_kQ8}Xf){5jZDIG4bfDhmyVw~W!&eP{J_@G^UNwA_h}}l(F{X&NF11J1>_CYpR{UI6wAs%87dF$zOPz z8w4K0a;LpHrg)}BeOh$X82gg2BQhh(S@|3kl<4@i2<& zfZqX;6!jXQZ@7j#i)WEXtHU{0{Zco0M4%^;Qw>g6cdD%_-hUb@k70V9eN5nGF6@8* z!+|yudY`Hc@zPmCeZ#1WXWX=!5oy3paiA5sps%oJqTs3$b~Zo*XA2E*7hX&;Y!=h! zi6~u^;&e!mW%tBG@wq4%@=9n7Ys+@Sa?r?ri!%VtC6Yq7diGsVXc%2ysOZgZW!H#s zHD_2N*{6XVZh%+8GP9sWifQfCx~y1#&sFX)A2?cUpgfc?q-YIZskO_u_)ht`4%v$P zC&}j|k{R&{b;>m&;%rD{4IkvHSxK0>SsZ4qBdp2xO{+GiJ!C;Vr`)o?)yDgFIheBNKKE{X z{xj*Tky(HCZ@4U0P(;lA>JipJ)$>8Qr}4~m-wEQ8ZU_rPPalz&<)L9BUSW_Xb0P)? z9pG+yww@e?kBU8T%N};VEEU?ivqa*yk;_JsI*#iK9`$U!u%7O#^FSg`|DX`yl_#8e zt75yB^H%idvRj!G*wBia%-ULu>5fQMbN9Wf*0&(;troGIJ1QC~Q6wp)7O0L46c=Oh zMR0>t{U_hL`*nIj%>Hc=%OCHqEWN>1Hpd(KMV8dItC;Yi`hm_zYr6u4m6Xm;$SD-` zF{&@6g11$ZjZNjksL}utuNuLC@M0Q7D?oVLv>!jC(M@O)X}kaUS7aY1Qjvj=gpty* zlO&-SK7R~P6-HaW2{^s@HVRXA+nhEan=l!Utd1lQi)yr4jIZ0pOc>q1F@&11JS6`) zz3w&5>VjZZpH1^7QCY{B-opnz_15{xyOnE~)watq{sDe9>fOJ05LcZ|p+9!=x1l7T z>sTxOv&ykGD*_EWngQdB*BBWRCYo(Vn?2%a=U$3MEUiIaqea1j zpD`O}qFgv%5#Cwnq8)1SM(dCIKx*mPk6S5A>;EOHW6eWHelUZpX5|CUmO#exJ}m5JoG;NO^X8@J|ku>mGe{%?jPS|DC(;aY#7s2GF>F2L|?#Bh1inX zMleo(`dZ;v`DIP-eF>R)uSZt!vVvqkZbZ}v_*px(+>vygj=Yt>sX^2U8B${i>8lE4 z;61f>UO{@Qg-XCZiJ@a1y`%tP-}Am$Er*^ayr?{=&bW^)jc{s2NcWWMJw-)4K+|O{ zfqZ(p^X?dyiAprwX&gD9_(II@kONjkeP5y>qzZZ`|TZ54gLTSqexk0SeuQzBwe z8iNK>!Ge`QrUPFfPTtig<-j)%S0SMB`-DyUGW%A~x?j8RGrrudFYutu9GLfx5w@z7 zYH#@XOA>{2d_-^wB){&Bs+#5RTJy?I8{&@yNnIu=&YINpM>RNgZfxG_=wP0yQz!B< z!8k+pZ3x+nyL5@2J}_NCcNA{6Cvh4eA%(tvyf3?Gwd=vn;_xU^x%sg1-k(Nf0LBrm zp$l_~d&_RZvcl6lzL!OPwAn$FMvFtsiX7TOqIpaT~p{=?2X0JG`vN@7Z4 z3N>=o^GhL3uS1Sl6(O;2|HnZ zx%)uvyZA5&4B_QjC%mHuh9tBhyB*9tm=*)paN*V*K@B&$rM%$ves+{apn*uR0XvUl zc`tGKsIX zkX+UI1HH=!I@N&3@cZjpWlKzRQkRH@zP}X%QkE%WjDNVy-74Qb@JgP>X++@5mh8l< znd^xl2Cm`P+HFr;(?LB@{yZrAphU$SuOib{%UszMufx`el_$EPuerx#69tL>7PO-M zba#ItqSIgkGo`C9zj)FkIg$JYXP!|KIWhT*N`r<7+;MsBdWGAm zpzzT&V&Pe|j{;JoQ+577p%q|0Fho{-H2&?5Ajo?EtCufgSo2nYRN8W$Fb?q=; zf}=kcSH?^?Y}JAlWkaiaF8;l)_2dntL-7bzUYLR9#Lbd$Pa{ z(W^IN=G*70u%W33l>W1A;<5tP0*e&X>mG%FK#j5`@R?%3I@cd1iUDbi`Hwl5=YN?# z)PV3k;rhv*Sqpp?Y5QwgA+`H;Q?VV-0*Cp*?RE6tKTSL=!Y0Ms4V_I1Z|d)jeTyG5 z*dg#_;yFq#q{9oL6!ghkr1O`2Ua}iRYd0ov`~tTc|61R{#6(l9yxS1I_YT8U&;;e? z(iJ{r)ZocyM)55wlbF19%kx}GkTiw_sH2cR@;%Yl!t(bToKS6ze$9D#X4G*AukQYf zN;#p3D3NKadgB1~+!Jvy%8~)eKtQcC+t!E%^Ah7;0ekFd71e~84kDy;bhwj=;vIgC zvZ*_+QGkyQ)&&X(z={XO!3OUqM~0jbp5*5Op|7gPR25K;<}MpjK2y?Buuy~C!iP)9 zt^<;Fmd?|l40R-KB7;zG zH_E(L`dN7v1&E@a7aA^!vRvcj0G%S6b#9C!rch{%VCH+xW6!*80eFRXuG&a;6# z5rrV$z*&{Qrkg^iOCWI((M?QYO-6w@+r5uGJRm*4 z4=Qe}WNMh#Ih{AE?^~|k=CmG@=c#b@hoWLBA^mO#Fk0>r*kD9_xq3->XSQ=cP%bwN z>G(e{JVwT)R9Ls=(lRl*Yq~O*xMXBn++V%KGNmU(7&5%1oBsNvK98A?hYd^W3>DGd z?K&f4zz)aEhYofYp6$8U5b1xLKNLEabFm#`uX!rDY0s6ddm^0lAV|VwMbeRawwZ1^ z3P5cG`ep{Yk|O_@_!c>}6^bcn^Q;H=yzS<3Lv}nrtC$+jy*)7=#=Z_7%vgput)EG=)PrB$3}?PQ$Uc03|80|O zjxlrc*xq*yqsgcLZASP*FWj*Y^d4@cQNS-a0sO9oHm%FJI)eRy%v`cM1=NRGg9 zzn~gx#-#`aM$5_qgEW(gK&VM1M;E)SjgC&+J<;dCOyvqX`m5FSeAzNj5ut?oBn@|n=zvp_R@Ju*lW%gzF-;REs`IxCNZmAjaSDp3gUp}*NpcXD#hJCX(tAx+Znwv?N z0BQ-G{ul|Io|yF3%=~k@Siy3xr#{{eO-K32#j{Sxj63w`yN{~5viW#oTNU4G^K{q0 z8Kn)jVP9={$I!vpSd!rSXO47uR?M;j5yshOe5o<DaId)neTo6$i~M=8iCj;6`r<3}7I}Od z+gtk7#K#mD66uAfd5P5KT2r7uaZ!fe3p(R`%>QyXKjfxYeq)Iae-xbeSj7D|I^Z24 zybnvFd!%9u9ky@Y#<#fkqR57KSBCQb_7!Zyz|v6cofN=yAM)91@!uFu!_*3Ax;Lc$ zF5478u$)^tWJzp;cb%9&ni8|=$L)^_Atvj5)dwVFrH@g0910Z?X5@5mboxU|R-8d` zHqI__5UUS^kG3i^xkYHpjPn&+b*32WwHv$v-9uJDIo0?^s(wv12fH{Edr|V!DCJ@+ zNIc*euPdce`nz(b{4jUpmQTu)>@npwJ-+^jf+P2V%)ya^MNziy1dUj5i(Qd6bLGtndsTnr5+FpAGJk2UTlO${Lz|C72-7dR(Un zEY-ZNs`{3U;@k7`+>F9ghJo~lPK$=9I1fnD2U%6dA)CYSBiA3jTlf$k^3DS#UVzL5 z2WHk*-wy9{@W1;>0Vj2tNWnu7O|Y?WuzPa4JEip;H<8?k ztj{>?g^DS}C`trXjU!XrW)LyO>0zoYmh|VCzQ|$qea6m@Y2TD1w28Sj#=h&Ds%Kqq zE&%a91ew8j67H^bg# zt^xz-$>Xy#Q%scImgs9Tyj*Q?V&=J9tVF~3Pb|p&Ah==*#J={YlBBexhF)g= zvI1FXMayUY+1ra>@*-t_{#%j(*AT^b^;KNeMFq@01r0(wc8TDzkUY`P0G(OWFLf-d9z1a|+i41&syzKZz^AH%)A1%jL0390rNZme+x) z#XvbL6}lNx&-7g7xw0w5m{)}B9}flqhq1qAf}Av`T0ELF)Roz1%mL{eBJ-7zM3>cn z?p6m2d1>b~uuZH+(8y7<%nC`;}0o^wG)%?qdm`ARYKx3aVDkS-=I8vv#h*-Iu_?iE|`;u^#Eeqy$fcuuaEvE<| zyraDG&9N<53=(04&aV`TUH)@lY;yER?N-#H@S_0cUZ;yF-KdP^(B1uT*Cg=T}+Ibzp0s2tGK>vwK??#L2lNZxKZMD_zxVnl9C{%%o;oY*nZ8EG! zt$%YFpu18Y3|5@Js4gmE<)v4C=dNO2U}kt%)l%8C;9)WC&1*pg%jkp7g|5sLw=TPt z`O|ztW%@*b0u-FvP9B*Q=(bIjEGvv+Jl_FPTbk=J3FV4mnp0GUp)Iza#$X9T``Z z=f7;@L8uH|3t={;pW0?$v@_=uur90cVBhL&o~QU@LX%-}=JcO(8R>5W0G;eVnuwOS zcq^i64l$um{G9%ZFk22wSPfPj@Sos{_2?TuSevxv-h8Wa=vLuzcs7oqS^%(EVHmVA zA%mN&^*>TWrh}W`Y7Cj zShdm}wPAVIS1OYAD+fs$FV0-`XJA4)N^HOM&o+P_#U^6Q%WitRclsbu$VqmodT!#N zA3LW-G}<<>F{Ct;<0`FpZwHUB;lMYVFA5Ze&u z(Y1l@mk%}hlYdmJnir7lM(9crlN-H$eDgoaB+0*4*p#W#)<|ilWia@rEd8IS=0sDo%Lb4UTm{Kc**d$3ks73G~CXeb5Ah-ng9^z z`;jYXmBeIgzt+_0-c*GHHbwFi*FelXLhO-ft;1h!0>&xWo99I4c~8#zbQe;FJdsK_ z-Eio<=pI?X^smODe^woAP|Pw>c`smj5o>!7qd%%3#6Q9Tf(!%IO2sEw{{uP#2PPc< zl29KvZpHkqbkeev2Hl(7TxD}zphs()fc-gH<3Ck0l+E2h_@JvW>L|AbJYIfC@1yOq z|1m>Bkw;zVZ|Ve8*^kg%=vCe$=}!9rBt#|i*-m{)!coyikx!%kq^C&z6$8!6Bx=$P z|4JYl0F+S-D!KGqz=e#m8t>cn)+sX1jf2~ukgUM$H72GM0>I)!d<&ODfxC1)pT7F< zuFoJKM{+Hc>Uql4cTY0Mj#q^uuK=JSrL9V470afF<)0J5TBawQlNoI&$B-B^>>86> z&I?uCe;W(5TRvFv%i%`t{O6$i)aj3ott{xrh;S8Reog@~%$7{bfwp2syv7%0zJbA!gHV1BPxK2Wf#FA=@S!ee%-j&9uLy&Zh(ei2w9T zliKItJHOP~XNj}4Ut z52;4?{$Br?1Yn58;eE257v9v%?-bPbt@d&S85v`Uh}6u(n#^A{elRum`Mb0UxQhvp zYnBjpw9R?Q-lLTX@~R$QRdX)tDh|9$UMow|0qdBbB^wcGYsHSh{B_o1Lv~Hs*3|AIMFkda(%cex~oId z*XzB;y4TpTQFeB=^Xuj_$}K&>A&^9c%5O&qxc5x4x ze5#+u6KsyBXEc2OUT3rgyu4WXcv$?^|K&eaIG`04_7_nY=j4iJIoM`E{)>y9{M5>l z8R}Xnd+=YbSBg;^vYuK3|DQaFLJt_nNX32+q^(b~*st#H)=_Ft zYj#%Omt}2P4ly5VE*XDb9!e|xS0@6H)pE5H!c1dpV?O5n@EXD^YV1DjO!8yro? z0gpW+?_(XX&4O|zGTk8aoEFo$5iu`1DSrTMo*T^gQ*pHDiWa)x)1R$_&9Pzd(r!Qh zGV)1akn_d%K=87&(rbJ1is5D0Nf4qTj{lVM$^{`*!A6(!{^C4nPGP!b_~N|1Ddv-B zt5fdpuh;~lVW6_B>NzLS(l9)*#kjft*E z89lScYvTvhaID^OZpuJ-V|%8o42um?zX4NxoO(OFKTK|){@8DD0H&l~_1&XC)j}nf zNYn|n$j@_|FW~XWrS(juW=fl(z{ztLQ?bim#C&&a$Y+BCGG$ajz)q^Gz{dd?EQ*L| zeWqeIhDnluNzCdwQ#xgP!b1UZGGNhy3|QSt-rwbIJP5xyPPE=wZbnw)%lekIJ8Nl9 z=_^N%^N!U(U^4RX<5_a-NRgU(J~O%JR+$C6?=xzi2Pr?{3LK$D+6WHG?%DX5(|*Yr z*WRVRA={xe;L2@6oZnkEn89n;ams@xR+GRiyzDlO63>{WHnj7)ChC}o$ z5sTB*uI>1hSs87&r_j(q?{M9j=D)*jJ1X`3ZY8yS4Ihu^;l+G!Fe-`B%a!!9#Kp4G@@zBs@U%cu-;cjYqo};1(0;Gg_G(gGgD_-VeacJ>w1?K%HP7+K+@ewyt_W!+`E zwT>XX5sL+*_7}#7bX+iX_{atfTGmnge5IlGn1N~ zIh9X{LvbQ>i}fZAF*Q&Th81I_N$p1g!idOk+nvOeMFa2Vh>-*MHKwRv8taq+3_jJ$ z!Cxl5#YU<<@Ir+bfn9O#gNC1FSeazrqNK3jCdWir#7 z+2Ag5(01>^T%5JZ&#VFMp*UvVm0M-W)cUdI#oonC=q8#To9aBb!)d#K(W)aosh-P3 zvSD1MWxZ5S=#SZ6Y{EXdT)*PoG8g_iNwJ2o{qR^cC3YWv3mNvdvejrHCBJi17r#T5 z9(aTp<M+xgTAkE?(9zh_la4ep{u%V%0`_ac`*1E`)2Hm=cr zJm+EN*dKMzOQ%!Q7-)Wy6usOGo1lKAy&H~x{LX7ftuPs4CMPNa0-xcyAG_t>v};Qx zmjpgvoO$&^R>+!RESOfBfSLDfRzHA;6ngSH{u8Ih1ojdfTfJ6b#sk;?btjey2Wi3* zp!Dw0i;LAEN&61J2YdOv;4%LXu=K-de#;L-BQBjnA`LR?hCnIzt?Hr2QnZKl>szc4 z{+^0}r*Su+%|I1q)&}fDi7vfZc&lWQrc^dkJYr~$C!n#USK>C4vbAc3wqclTu-X(i z=%&HU&r{(H%qXB>@M6GRfK~RnygQHYuTb?Ve`vwinrwc|ZQ>>aQ84HVCyngwWk&Vo zz;pL*W~oGqD}8R@Wu^=Zh~eeA+PY{C?W8lC=dW(h)_~hIpF&>Hb&gx*0`~pp`v8sY z0!Y!Qm`;)N536(m$Qe4&jiFZbl1hkO_Ehb{^^Xp^SfbV+(SS?Cb~B09}X3=9*hj+TrDc*^S1f_3aS* zN&3$%I$Zku;VBy~oE<9jzEEehp`GlqWo@nE;iy(k@%-(I%1-~J8&DrG*Qn%1dr{j6 z`D~}S;|&$l!KP8?Zv2A@iAFjKcSW$MdxCab?FZzMRqM9j{fQVI!1(E*0dq^5 zSJn+e@(KC868xM+AKva6oz@FHZOU!+3n{XC()Tn5-^1sJ$Eh;@`3%qobP3UmkYkj| zwSqQz7YUmWO=q(?{tETrwZ*@K{}6vv#k%YB0cj&9i-d;??r}td*jUnJQ0$&}W>5FG z8ETd?dZ+Xo&?t<>WF3#AJuyE}YK@|W`!`;EoUAAO@jieu94sxihVc@LFc9WU_bjZE zEo7EM^X?3_-O0`!5!F|RX;TDcvuy_=*Y}JtxMoEi5pSDD$O~ib`C=wyYO;Pu@d=A*aK*r_-gNDar`3Ez=-$W4nKK)!^j*0w|7 z_X>N#geWyx+cI}kbby+16S=aX9ufNFN4EUWo@C$}@~JsD0G>r>ab{Si>w5U34|)QI z?>D|0j1wNePS^}VsL1`@1#npy$O7Iyopru#84cJC!nbjO7*$Ny+kwDR{wJ1uLq-TX zo0yLH({w>^f$U4Tw-tYg!lr)DEm{>6=# zY>;K4rMmdMY=oQ&Ujd^olBsnlMw=Y_ySt7wSS4!nbNzW_LpLKo z;hbWkZ@|h4Flf-BpOijh7;7|$?)cheSOCp?re)EjBODvGN#&uvg6}_A3v?qb5Dhc$ z?hMCjWwBr;MnF^i2GZ)QoQUYZDs>TK9?YOeQUwsb;Cxv%8lJ`*Y*^cI7jygUJDz`` zCe+*dZkX=ObDJ4P_MH#W@RCWNjc1c!GSaEJTCPWYpDv03eORG&*nP6gLWgeCzHL8Z zVq+v8r=`x!oygmnh<;CC=zA|_>I*wupVuBi&xF9w3HglOpUupa#%O>483nXdn)ilD zBr-)Uh|vq9mY;28T~U-f=G|#7xU*-p_xwJd|C>(5S|t$p32AuNI_`RrIjsl6&u^I1 z`IiD0U-oQ!``3^h6%cjJ^hh2`!FCT5SQpDWg98~mg@p{A zd-kQi>jrgqs1DxD8&+?3F_GhFv<=hfptwQLDA&jw>b91AyBUU(2euC%4Q+5h6SihP zLP`46x_(CaObcm@B_F>kNlQrRN@EQckP*#^K&w>vvN0?EZKQ{tk>O?M5Nsebi|Txo zpA6jt77XrrEZB-qLcjYk*9mcRE3^MxakyIJbhJIZ(@X0ZPo*ON(Ob0i6%TV#?KdJ3 zA3(rMgj#mSq`AR~7Y>szD%7ap3Lxue8qPqED3fG&ef-#j8JV1c1g`^

    KFUm9rf&9SVm&IH@n$r}Sqd2Q^sGcb6;0Bzi<~ut_`fq7 z?kw4dtKfXVpx!F1HBJcpw!cq9qDpQmLcd+F`?dFTP- zgM67y(^dalUlyiHsZ`+j3%}}~HNTRp(OP@XR;G5xn#MEhBgr6@%gd6?+7U8ha<$3( z0Y_PC&-I9{n`?Bx=(OrO)5N}zu>mPss9SUz7{qzSVCtwq_#h8`VZb9=8?PBJP53m~ z*j)6v`w-woJo@Uh?{fS)Im{FrlEXUQ(e(&a2R!}<)c1|O=d1I$DF{q+2!Ax}=SW0W z3;(0@G4fw((QaFK%lfz81-6+1;ddoWBeZ&VpsA*g8v?j=nkiw#FHfOxCoa;~ZdX3_Y2ybiN3Nh*zw?T-$gF zi}7NX^jRYgy;C>{CjdrCb&Z53tPkpgN63>JwX@3~{aW}G7XFp_?qY~B714npqkAk_ zO)L}FqJ-;)k#0cT#n!Sl>t_wG{fr7R7sIUM2UhtujfigetvS|g0S*?=(hT7X6Ak3c zA9ePx%mq;;yd>?s6Ow0(hBtb<5YCM`N90@tYyO*JzI%cRu7Yl8{q#{3_UX3dS36cG zfpndX{6^YVOIL=XN41wA*W&y$jhXC|i}I5mRrpHZ;$@lrR^B_4`L6n*M?$7W*_V-`2MBa!valY7a6%vjAAetuioRQ!n5*U3U zxz}MvO4ni*6bj@lKwVcu^3%D3>__I&nhbVU+q>bsbXa#D@mgUu&zAY`OAR_v`AliR zw-%ZDNr4{)LX&kIsZfhZH zB<8Q>HjkU3*mQ)Fz$7u+qx~sr$(5LtPvdd6X2Nne-)f$*ac#9!3Nx6>Hh`+xY@N?m@n~X|iMg`zSK? zet!61);4vFlu~dPGg95mgZ!M%od*{qMalb*|0deHQ zzu!qgiI5#^j}ZkHT`XzPuz#+tZ+r9dsk&u~)RO`vK$w75`f)Y&d4urQmnN&ZECbQb za94tE=wY_O3o^`R?nRYBes-04V7$=V?+>Yj)Gn7|zD+q{Ulm~Z!3>%9-FaNsQqx8<*Hfy1MP zz~ajeF@b;tfLjB&$ln3U{;KJhFY%r4LNxur`7|-9mk6eq-bBs49jNx$d&~TeO_w%t zpSGoi3v~eh0y?vfrW+S&ERdP5V*sU+Mvaw@uRVG;@h57Npcx`-~H}`wQ!k| z=S|CM9&_V!m4wJ+P%{=#bmVSlmz5u7s?msO0_@i1{#x!*{ah|{^Hs66h-U9@alSTr zs)5CdmX^UJ_is-hi8J7V>IJyvXnMpiPw4xuui3>6FF^pZWfFz$E-Z`dra9F-nM*O7 zEAq&GygQ}7cXs^un#1Szyk3Kzf=VL#XXZc%Rzcj3TdfR6jq1A?LHwVdJ{nSS3CWIC z9~1ozpD2#nC?&|}W#K$8j5Vcu-2o6wiMBzeq3_k(&|MoUJ`B#aKstYHv`Y2NUn|Eh zt7ouqv>eLpDZX_p%O8)nq8!%ITxcmN(mFJOU$sGViAgWqj&%~!QPO;sZ2?RLfS)mO zx&3ClkkyDkr<`DMx8)N_TmRz3c*4Sh1F&4u#)Ra`_GOVn`nlKC1*(U=LI!N7uQ_`Y zlh;mHtni4x+a4xq+glP!e@(?Z1U!=y0FTcs!Dr0GhsHYvWWNKyyzrn_=9oj*5AVTT6~FQ(J)lo@UZM7$@51) z@VAhiRe*KhIuUt<(R8?qk1T8NtZJR;DP!p_MJOF4Fep1jga4=}z~F{;Yb)P2zm%fY z<$dxQU5;>@qK8HeJtgHzYS&JZOZvie?rwhs`qs@$<9&-HmwrZ}2LN@}!?_2bDp^0nRpex(Mh~Bj~OrEnZaP55lnzxsW#}3TC61xH#@PX{II|Z?eKOji?_N z93Jj%+?V-sgyC^85z0zj$;~yMSd^~ezxOA%$&JU%)lz8+bCF(|p|xCFha~TN?{thT zyrvqj^}8bP?B>3!;H!la5Z^D0YKO7398|9Z*GM6Tewf{hRQniYnSh-Fe*IK+tcs%i1vj$s`nL&-Ts>3KpgvxrAmmVW`OlF;$h0Q< z;iwT^Y@O`0h5($gYdRrwrcA2LN!+0#^nfqYPz~PkLWH_{H)hZ9XP2Maz^%|OE+w}h z@0|0??kJSVnvJ#Fm!Ho-I7&UWEQm&9Gy$D8%E4Xt0wfJ2Y{8FF?hIAeM<0f$Jebtj zAZa|hCb$+;_Eyi6W649kYM6x%Atj=~ej9M*s&EXwe^#bLT;VQ7kJYLem)kHmodnv< z3H@OgWxwpWDy72I{xNUHE0Ktw#E$w$9%G{2d#6!czH3>(Ok0pUx#$rDbztd3RtW|+ z0Q*6OurKtBkQzHzjXw-8wRz|Gv898Aazcz-)pnHG$tZVYUmQ@~;ZR(TQQ_aF+Tlc% z5m$xFfSMMZ6qlJRaO~xevQMl~D1Q0ZCmI%?bCI|22icWvrcnH*HRwrH{Eyq$cPZsR zcolBVy{&zSp?+HaXS6*qE!05l>ve-h)9bKxWJCclBNz|m6;1xEwxErT*$Nz^H(tIE z%T?%ZxwVFY`IPus0_-+z)Vy>@(q&FeT(JQPkFQwm$jx;WKha@cX$tBmqr%`ZTNMx~ zm&tp3YwPmoU)N+oaliG(Zvy#=KmzNBMp^~>Y1TU5FlsCUgoB&=oynI@6lDB$?6cX0 zyeFb5*7Dq#zYcDhjFhFY-9f~~j@`V^{T2el9T7i=Q-DWUebVFX2#7obb}}cJbPxP0 zm^y9Cj+5GK0JiggUfy90NW|_0bQ*LG^Nrd}?mD#tX+ECs1PymFt4{_u&(alId+hVF zF9MUj_$hWS1c7kmKVjvp>Tc?mRB%kowQKn8>1zvnrge+|J_bTZB(@!6nY+i3&P(Kjbp`mwCWdC8qes zO=Zy7*7@4u1tZL5$B8=gK9oFAy&g*%-=lflsQMI#bm#4 zylj+0%s8r$e7PW~o0=wil%3W$_&<0Q9(t|{CnHSxO-b;`)_?X>@x{U*JV>rnfHG1M z@=315i{;{=7j}O<*%n2lf@{wS8d> zh4b3xaM3vIX^(fD8l}d?6d*4YSucSyEqoTO2C_sO#~H~>v^q%*YmHBezxynGZ@6Cl zMQ3tb(UXST)gk0RKw0}yCh%j&p?V+-K{VM0g4kJ#4B`T1>l;EUe4rI|t5c%;je}8( z1qX|c@A&wX4F~U@vv@VK_}?bT6+R(v^X*$shB-`3RX{w4=ZfzFd;c0fI{>X#;v<8^DOL`(R#rs+>twN|W5XC( z9>r}QbOD%9YBQGwqe%DOS0>;%Q#w;qh=h?ezL;wEfb|P^X4r7ttJWzQ0l2b@7`RJP zZo!@1+WDJ7&sM=(aKkaL$x3=T#A|-P+JIq_F}(+@;zKX`y1q}<8b7S_276>`VfYgM zWEg|8n~6J!^|9!o4*%xw#Q)&5xWoh31)!uNxAv<8u$?2=!y5NnI+$#nmbjU!AK*Mhn`P*H2KO}| z#VSps4TJy_Jqc~P+5WI+?-NteB$Z4!GeN@72TLeKwoUMAo?OWdIpTH%Zs$u7?)}*m z^!zFn86^$|I6aF?SVzDyPQ4l!;?n27w{q8b2d%9Lv`QW0QalYOc*yMEy|j%;Z+<@> zQ^1Qm zmi4?ZRP}Np(Q>HnhhRHdJ7VYIpd(=BK1zLw%4)gYa>I>&8 zfGpo(dA657tW>v!$WH&JgozpaDbncPm3wA%cDOUh2c{di_%TeqTI&=|-Xfa&_Cdvt znHVbf^dm(*t9~&{>LtCc+Kj8d%ielbopfPQChehB!IlbU4wWBFdVu?NJMzn|&@lk9 z^_iaE!w5MoTnkq5VOt1()Bm2<=f*fcpW*jAt4l)083P^WogmGi!N&5YhR2yB;=|-E z0urH{k$PlI%B0^XCYKc{#hi-{G4^yOt}EHhJj0*6Ff;$fgdw-;-1G1uRvt-wXx;kH zm+u`yt*ocMZEd}F1o7f<2^_glt;B^pHc`roLV)YXM;4q^$90gK#sjr#53{X$uGYAy zJ~3~t9S4>q75A@IWko|R6b9p~sQujGE%@LDA+oO!3K^w!`1zFniuBKJ@31AXRdDc} z4Z=LTF68mEj4N6bAdw)$S*CH330;ipP% z;72#l4M@ex86cIvsuaj4<)v%Upmf65;QG(hwQFja_rY83p`ZdKX^zDn@Lrh zGaYLIjSu&opc7HIV7n#aAd(x-@$zIcH$WyKXA3gzH4au5jgh1SmL&v?BRm{vyj%XI zImz&YPQ18I8Ez851$JTNb>7N)q4}C>?0MpZ5~(g16q0TqzwGuvYAWq7o&qd~COnSN za-Y^Oua24~cWXI+i&(iogjloq3bOL5Q%w&jU8#&K(WzUmyjPcy;ptP*wFmCJ(;vg- zaLs~deq6{~2^-$yarcRyJ6<)d9&2&WGZwRb-@B5(J%Ft168@N;K;vwugfKJfvn~o* z;7B;*JqX=2k@e-H3mJ;)oRne0e@S8{W4Mm?eW3+_U*UmNE;JIOkITnp6DiC{yLXOU zLX{k;soy{Sd@5iEW|au!8|PQKD{7+jqez!~kI5e{eqBA7w}4(DT|CryDQJ8&IZ(&dJYmHL$ydIX%9-(oeAUulQ6T- z#+^oyuJUHq#NMmhOg61mxYB+ow(0?PeM`%oNRkjY_LCp4h#F zT}2JSIAg9+N#T+dbOBZfv?2XrhO{N=WGxD=X2k*((?-R~PW;17JHbIrk~`@cGvu7F zh=V(&ff2ngqsgGuW9WFf= zaq&9$c%j|??ow)-m;m4@nq2t~bf&>77lZD^o# zWl!j=-Q+mQk7mc-Zp=g-Kj0qT2!|1bG8d$%Q6A+oq?|RF>LxfQ>0yM?zprh2?OzAF zj8prlO~Zn7-GbdiYVAfMX2@Ll;q!IV^uA4YCUoj0b_56D_@ z4R1uiP(0ao)`L=9W*(xRODgn$jU`XU1dmQab0!51(}St%%j|c@ zEf=*7(3XSEnr~v4&PL@BqhICYJ9Mrty>Fp-0EVAmI`-*tZp2A-<1q!^hmiT3(Uc2S zedY~WL|Rxz&$9+m9EfY0;7oxMBy_uWmo?1u16xY%OOoS$C@1%@;Xrdiwi@N0=8JGF zLnX4{8L)x{4`mc|Xy=i>J%W6#V$O>O*XU+7Vi`xo#XfgsA)vWuqMH~beM1%kEdm?5 zPY$q4BT>k3<@tH#+w|hTW~ux8)3x5YDOeO6z*+%`m1Z`s%SjQoB2;Acs$#2FXrmJDcaAI(~&*czuFsS3j7 z@%53)H_i4Ds4Rr@51ei+o-wjS!rsFRN7wNp_e-aGz&~K6OV_3~5X}UlBNQWBEoFB1 zJ4*!@(69E}fia3XC_roSNdPs%da9?tO=YirAwNAc(@^p$TYhfDVoaw2LF;49T4?jq zz`y5b$aoecXP31u-p5={T3G;Ptv#zHDbpw1RfGSL3SxNwo|20Qs=Sn=c^1&F zlQsR_3b860lOKwQ0lx7~>~|J2{pt?K6y=n&-OqLI;Ua8P8MbL=#vYW-40Ql1WyYD^ z%`3<%Dk`xHIo@OI20Kp<&T!TqEC4QFXWJVwo@$IHm`guU6bR|#Y}*^VM#`IaBSG*2 z;LfcrxS>RqK)A=Ycc5JIX#t<`#^SgDdHG$Ih|MNN+iWr$`t zztRwlaM$0niJ9AEFd)3`J(F{DO0F+@u``h_{;6%-Cjn0668YK>kq1^Iwdl@Vwb%7c zA|5ZF>tL|}5~o{V;sFi>UQ06%5u26C$dkn1f$~36NxwPGSK7Rh zkBBWQ<5zUHqL;8Ugx|%{%Q={B?pJ5tJ?ESzbY~Je(N_Z&PKr6s&6bfOr1amLhfD@% z>CeS;#bKnyq0oxqLO<%IM}&*%8nVHM z*CeX@-Sx}ee?>1r{Qji`{ueKt4S`))z77I>$(vXw-6bTU^o$r`ivbmSEIgeG_$&9i z83r7@r*?IY5O?f(3CF|b7|d?!FKt5-mQ0Au``d+T)TX<)Ti^+SIVb#<8HOxCSq{ zA5NSG&YH?l7z}Q>8BOz{71t+!nrjB|06|hu)!qKRhk-Dj&si;#nag&cM6zNm;_)8Y z)%$-06m3iQcOmc4J?Itm>kg2Ax0%?h298&egFaE(yE~C1n&(>CpSV-Z`xtf}U_rRg z8uEbRQ%y=uaKZUdxuE!GLb0h8+mg)=%?|gJuA*q7x_WtIXi3gzw>HGtEsFe;EeCA8 z27T#qRxY!~o8fs>cXgr5lFf^lT`zA@Q+p$Worm;1qV?JQ&DlH9f7Kr1AA^8%4j8=Fy+MVl0{Wh;@?Innd37Si-d_A{ApOgg0vx0fKxsGhVwk$3P`jQil`1XXW4P6 zMN1MRA+!Bn9kXX`!Vl#F6F6xnk~>f3wy0-uAJ@zOE1F$9xAJNCP$|WE1hQdlPLS^U zzxj0v10sG8Ig@@G%BhfsHR`0_)mG4jCP%->Kp41aY|)*qsK1O{a6vkk?}TDY=0%(s=g`@VRS-l-N^g83$VR z0FQ3WmW(pUBX4VommIm?dpUbW!FKZ%c=mE>Hpm^H?#F17ER$Nq0(i0^x`Ah3l23-% z;Oco0Iig=61yP>UoYO9He;tu+hbl~lra9iD((P|>PG`|?=}fa;p+f){0= z=!sv_WIZsn^)n4K4Z()h;7wij(RV*p-~mmMz`+T~cQCFgt!g`fWlms+ z0H1?H^`{r*aHY^y4GfF7)MciI#R1u{M#W<|rPw?V(zvIOb`oCOzUEh+_e9*Ao5#kI zA5(GV=RSChIb~ra3Oia0S25`B&1?OxQOCRnb9!u$0+hSacP)FXD%q2&0k*TAQ~YuH z9<(EZ@bHVrE%ATVr7jk17(!?DY3Wl4`&*k`qw;d07qM4K*2C2F?p%;}ZMF9~kTo3$ z1b`17WP>Fy@Ia@vG9AzQ)5WRUTXhi_zto}!Y{kvB4jDZIPf{w6<;1F;e=AZ}enxK! zoUK_;JbBNBr-RK~Q1eYGVLCNAJk)w4)#{Us#a!ioR(!ldYHBki444i4EK2lMg&R*^ zeX-Oa_INWn{Z;Y&qLML2lk3k4h?h%^X@;Z#Zpo9I>~4bNqUey?bQMEhlM=lmpzn=! z+G5yL+Xl9^Jhh*^y?e*{=xW;e4r;oedde=GN|d@8?@G@Ijc_|$!udSE%9&B$*-s6A zN3Zo&CKkQ+m%X$-Yn3QH^^Y(){=YLM(E$J$%g!q`RQsYvFPj5ITp}*E8e3Y8&V>?5 zTV>sC&Akhvx2I17wOdI@PDW@bEqg#{OW)ht)Vu7zG_)F9U8ABF6+v1Q+aI0Omv}S) zL!A9- zyAn<57&La*G}@dPG}cmJIUU>BX>c?ryVwWU3q5H{Wg~3$wI8i>+IFoA&)mp&d5h8& z6IK(m!Jst$ZmGNYF@^aL2KZB+q~xZN?GHmX-36n5k)5WsnM^pV7ap+%*8eGoE?L<+A%>L7Jyslik{4i;58 z{ju0~;$~2MbC(CR8ty`*~v4Fc`Iv>+;`ef8aiN=z)sS>)U$^v(Tx^)}YBaPzBC~Up;fEJCbR2FU&%VMTx8k9 z(fThlas})$LBGF`Hnib_*;@z-QiRc+l=fKfVTTzxvS zT^w%ZMW=#73Q#j%aLX9|su}g;pU2OGiS)u=URXsV{=+yVijCzHSHHEk8WQlLXz^f;)R{Non)u>+$>0Tn`OohoGO_tKAW?bx^v`q&T0T+J z7aqfGV>3@vY6i8B`t8(V@e0}WiLKvt#&vghb8P$Lu%nGTgE?y7$4L7c__$s!1{AK| z=lR8~{qnapx+m>}>MJTRQB&KT$;5xd$%+&3$;v5?!24d1Zhsps-P%3`oxcY|iN0Jl zp^>{cRB|3`XbxhCx@z+0?VlIqnvVm7k&_g4U&m2hD%N8kI5)+WTF zs=j{Htt8JIx?pR(UA;S{HCwvSZ3or3iQLdyJG8#mVhPLqEAWQtuOfr$kJnqkm}fJ| zaej^2d)?z&Nn%OIvHCWat(wty9M3DiI~|$G@CH8}Ct4Z#5Mnb1)>;-` z<-zwDi1^>J=lLuV(hhLF%Q8=Lp1MGTJucAQB0xNsRthN>eSI(EwWhnbQzLdySmF{c z@rdeIZ0vh{R<%k_YLo2zjH|^;ki!+SHoGMd0RrUMgI0)9)hTFp8EJDcL;$2;nYjt` zDVZN;s08NKm~B16Thu<=J1Bx{qjJ3a=vR@zcSe8s2>~eAePpx3WYTRGZOz923zQk8 zPKC?kfB8Y#%6(9MUtj@<)=WXZRB~ROSmRWcHm}iN+CO70OVGpnuWyWt_OlTluiTY3 z=pyvACyj&@nUYhv>1eafm7p!A%4 zTdXcA1u4)&JnL2N4C8$75$`zZ8u9q z^R8O!$wj>SA%mS90V2)*NdIlum7`mNhRp5V1}jqrESB-DH3$c;Xq2_?GYO^tpSzykbjxvUxnC4T9L zzlcC}v{5}}&&O?>2WAHo-?pzE?_{oudLYZ+=+HAY2ZoqqPYPNfFe>z;veS=7&WGIA zK7O%=zP1jM56K6gsR@T0(uS$2;~abwo9MwVnD2zhc``_aj7SAYT?DiLP9SvM^r~CV z+AZ(S1zxg@dBceOXNP{F(^z<_1>6^nR$fORbw5P~A2}}YlFU90A~|;EoT!hr$CTi5 zG9^Bw2?N!f23MW|r0<_O$dWXH?>DRoY2^b zti+SV7o=%>alI|KV%5gJEnHX-@|68)vBQWE=Ty)l|1Lz%L?=}Z_!nxJ%0SDH5l5#{ zsUbq7a1Eq6&HdG6R%mPOA|`D}dzGYbPsc1xLG@5jSt>-s15LvW)o~svgI-U&_t_yL z6BBwcc}F!DP1Vl5Y~Wzt8ghESTH;%GDG$U?cW7aX+^A|3r&m?DP=6w~0$?4?D1zuj zUuzW&3Zju;{^up@RJ%sLlQ@5e7+?|Y;YW?H*9^BaZt?u7%>>@UV?_L$V?o#rfl01m z4o-LuUfGC)LCS*{Z{V1hU@Fc;ff{6UKK5VJa<1P{PCk7daA854;j)(=U%)(ssb!TB z0v94|dY+8pSNFkI5p*K?#>NGL9n6k@;}{aeiZ=jfM~Gki@N5HWGSq$0cmZ3#kem5- zK=kVrri1W2Glse-B!9Gm{vC0wzp}gf>mh*YU?d%|Z|kBspAlsZ$A$s9$b&bW1az$I z3ZHDfR5b`D!bFT3EO;5TnD=FYz|K%b$Iua_4|<;l0%d7>4iAyo z$;aKt_b|*s228#AJ1fkj=O+$E%YDxd>W|M*A6ffM#P*q$tr|=Jlmijq$>YW{5x{F=z3%E600^g2d6@%5~&^l_IBmca0yLb ze$e7+d8f5w10NR`h4A-4vjL^mTwD*qZ5N?lAB(c|ug#OemV<@1iSoGD{d4L_Bb{vYOn1)q; z?Z4Y5It*@Apv+lGJ~Mi{2gkt!ie+CG=B{!Btqm?wVI*u=^Q__#xMh;0?fSzWtH^A4LKgHYG1bBp$$)F) zQ#CcdjCJYYXpq$O#c1K2&BRk;BwiW9?wJtdY2N{e4P$Lyu&cT>998i34r}gqL0j!u zM8zJNWX0Ye>QL<~?qiPQrt3Tymvd{(R(Z{1tKq4}l+OkEt8@lqX*&>^lWO3AP z(cvtRd5y8qpX|iI*1Vu>;}roy=(AauMRO%X1VQ0b+z2&l>5o)zn7~ou%4_ng+eMHW z8_MjUC|s5rSGi-pep@^Wk;WJsJ}5*kB|1%~Qp$3eSm5#X_60>c-F+^rlfSE@;RDVX z4SsU$(aHAmc9lbd!+%cFZ5LMVO5U>;w7w?`{+#Z~3OWh4;Zr}Tw~y)-?!&+Fz93Tl zlX)iv%X4P&e0nh@v$r?7$Nz&T?8dJ+eCH@@3VxfwBBL96Y0wlB-E2aH$c~0UyS4h? z_fb{Q>0kM`2_WYdjbcy)!AzXaih81)w9!=4&5zUQ8gjp6r|Bsv&1>y@tX9jBE0b*j za)Lr>#`g#xu0NSs|8S$T_=byd|5%)_v{n^h!~Q)nIoJy)RwfoyExu>he1iJ9gqD*u zYV*cfcFkL4ELwcF5LO^Q++CYIiFIJvy@%a$(!i5lfxOm*u{!b*M(8R}lQ?EX&5eHT zuhfXM)QYQY4e9hm!J1W=5~tszQ%^VYbsR{vuE6&F5>lAsxU1oguFT!sZv%abqkY#V z(B6Smg_gGLSL9Hq_n0WCs2bnX+t5#1Rl_u>h(=Qd3>)-SYV3gB>7+)ivxDCKZ_WR2 zgHn~?6}bTyrlc;l4Yt3XA){=KW`!5oj(!X`Z><)!X%GD_#j85$CEGd+Kf!v}-Gtxx zV6~Uig}WTbWli!Z{i9=lH%sX9_QJ;Kt>_odluom>QdbUkXbN-rO>&JBUF_cqBU7YA zYvFZsmr5XZZy=pwdXc@t{fREWsMEB&Y^AGead6X)$>Q+wr8HX7E zWGHHA&QmNUt|qSKo(>EiPMM-_X;J*X!{m6)^lShtYu|p|#9{>p4IW=_DTV)KoDDuGE_YITO+U`SuB7PMZ$4;NjSIzj%a#TfSkBpg z&bdl8?&WObXl8Ou1*W+5Bq>|^FKGfCoT}x|08v;F za%qQ7_azejyXcmhu>S|=OOr~YVzyLrJB%+^x!hb;lr#`06#k%qtKZ0yn?G&zWoX~1 zqwhqkc^-7R&LzE?PDWZ>7AuC6r46Dyp4We8AVRrC03OesF3WQ=%5kp_v?k(DmgG$; zl`-1y$U^k7=o14S9X_T`p}o~bx(z|>$}`8w2=DqKTPk@NFn#+aiHP!e3m?h(2;c^D zn0*ko{ERl}3k^YmP=?w~riA^r%_f%zi>K;<5=S_Ji#-EE0t@K%&*nrEo@Q#2S)!+WQ{*)F3gYf|~82qvV`~@7uP}v&gehyw6 zpj^>MT-lC{RDnJe?1KZe2oo4>tyL8 zD%}Q?Pz5`X@RBxOo3#>t1+zo1iP+#tA=uo!@2Wetv#&vCnH@rDV7x`wbPsOYh|)l# z_JR@Lc)yx@wS8=MlQsJtH&=5IKHjYrcOeUVWWWgHA<_B89`5ct`Q5j4mverLMswYO z?XQ>84wvqh7_`5eO}NbaBnNd!z}JrOY(%M@9v}U<#6v2>U%tnpuua6xA?MNb_p&O=5X`o_SQTKA*_viy5gRCI7x$^M zeu6*R6a94gU}pF42Kf*E0XNWLzs9$A`Rm);Od)AwU==|gMAPI}-n+|}yI9qO=5R=4 z$v2`q8}YJdf=^I__a^TJSxy`sb{mNr(MLeSzke5aT_H5g43=J+kRoM}jP}V{SlnY{ z1_=5lwamc6zLJ$gy2R#`EUUOE-u(JK`cA=sc9DW0)V0Wif9v$f0jB+f2GyfQngju^ zhH|&}h0D#bqFbI(5&GcVa}0o#-T=~pWD!?1R$feCzoE%y5*L(9^KQ60KAZU^$vw!V zc5`~EUA}%b>qq@9giAQ*b`YOW8m-Em)-rjz>-Jbvsf3Bg-hC(ay>Q+8@366Qx0@E< z*_RHEA9I99NImw{(LF!wDb}}hWQ^We*o~?2xS@U=aJuqVXTH9N&vSmababdSP0IdB zMc@jvVw=XtX|2i=|CS)VT_Z`A0bc@I*4zVN(fV^O82`1IfKkaY>ZvO;y^_CpOmc4n zKc3s)Q$}Xi$*>sgt$I)ShkG(%_dsnJQ6P5L5#g(SdYg0&@720su>iNg-M)57Q6#L3 zGT5zwnm#C+LRW`60G0unt6DDBspWXAq$GM(6AOnb;WSC;SPSc^~%hWm-JlKJmA&5`IBWvzu_Aq`j_avaIA=%G&0Xp5E@p2&0;aT&U z{QN0c=hzn3*3-(6wiOx*;OWYM%dI&oZovIp5F2I>BhaBf-nx)cZni;=Pvlm2!#kQH z_W%Idigxu6&|6f?Rm%sD%<50&z)7rS8ah@B1i2jEK#X;H)@QfAy{^$g%`Pu5kNNaX zv_y#+8%3Coq?f5(HekVw4PafW0*g5AdOU=O;QUhidslm-aFGziki$Kd#v$W^YpXt< z!m$poy)0GtPIFVKhUb#n;;zT}PWW33^3Bw)*R4z}rq|PW`)}xem8n$GJbZ|sf?S&y zDjSgfz~Dml_f$*eJm=V|EXY+$olrna3*mRG7A_tMQ=XW27A{8wKnC7;+l|!FHVtda zQ(A>TI-NLXK+;59QbcTj)w~Q0?D9&H_u(gI2G@tyoY8GDQAkT8=R*tOYgQqXUB6C^ z{y;vJGkY3E-SU1CZck1|J0caH#8zq%swcXoN%+5|}IJ8c5Btky4r;ZH;4 zZVq#^vHPu+1)J^bnFKc(C+c$_pgDXKg->OEdm{mZCQ~Fj6B2SMpqV4i_SW9K4uY<# z!q@Eg?`GUb9p4bGuUbQsSldJ6jy^q%tZVZw6OAYbTS%6BDHwa01p)?@$9P-lrIkQQ zlPHCuw|fHJf3p3ufG+ROG+A{Sb3Q$4DcCV<_jX#oF|_W|-eGLc!Fu~suDXJ2HMX>X zz`3N3*|4r%3ZK&J>hqLAB)P|2b>E6bd1QQg|POP?;f8k`~t;#=$RpZTG z(9{dh&6InvXsAj4gX`2w*3kef#`ra5(XY4WGA>`K-mZ^5yja<;2H;@ok{kkwNS+Q` z`Coq1?m>7~2^>2ruPKE?%e2s()eB*9^z;tXLGuEU)svZ zYfjBCN_hw;TO;UC%5Or4jKz=-}~p;At9FIuECkw6>H1wGxKQ zDmKGgIJxb{Z)dc4yUmLwFK(169L;)~x%L>4&QzQldK)+b?wZ|~R>ameE+!=`A|5?# zFI=GX6^#kIlNn_|KL)Jth7d?;X%y8J^F$wPEJETZA^ew;-RO^^Qt255l)i84<|`iR zE%va`s$Cw!wC7h~hC7vIUhkieL~pSSQgFu^MSSuozO2G_8WS00aI#L-+Kb)l51d`~ z1b|Ka1!-wResB{8N;rtf(iU`{%#v1o?)JSMWq__1)RyVGDi@9g#&}2p^Y=-af+(sX zT*Job{d(F}oJ*lq)@2&%8aR`W=JqpR;><1#|M0)@x`IHM4qHoI;%CgWPa6J7_snOb zG}N5;Cv53qec#1?Dsd7J+x`I){{`=9J- zGx~eq0j5bDY1ls5Z2pPE;%KJ(fz^kFg6NfuO5o*+aKC^v6mht z{@|*cfa&bQ7uuP)7n$pVpS(4QlP3;LZ6(?lC;6-0+Bd4-ZX55{`KJ^vb8`N&K@67s znzF|3>n_F%PzO0D^L}xmW9PFxdy{nWWTr|0;W|i|HhycJ0v6qOFTF@=ph;p)T+-3KuS&QU?3HiLF-VL zoY1L#M_xwn>5u!Rl(>3^D~&NxlsJv|vEJV>8ISMOcaV09q8s8y>+YcwTMy=z=3jPv zMD|e**Ty?Fr5xHSI?cYz()(GXNbN~>1w(ZG(*PaAhRvt}f>0rYs+MronhfCD>7}ln zIO3Q#ukbCHnO)NOQ3B6j6j!RTs29fv)WaXBM$e*fz9B_kY%0y-7SKbRpK9*?HI5n# zrW;RR)>dS#`KB8`nFucEaZ8=4SCEhWppGw$+0a8k)N)E6A|->(IgrR=6!dZlLcjgu z0(pm;)-Z>tYB@bw8gU()wBp|oJ~5q#_$xEAw;o9Fm zj*^Q?<1v%TFX^6T+PJ-=cad2Q29@>lm3LLi813n+AAyab9>tCSHkHILXBpdgIa}qp zol%X2=u6zjfkNx*RubN-J2{vO-dj)rbP7}%;K+F{!D5fSSw_ZL2UBQjm7$7Yo+u_1ODzhvq!HA;VdHmgU^&cuWnDB=BXlsb3er1c{AHeIY&FAqGdyO&(D`xeRL zz~JlP9K4lK+W8}3!f~^i+_ZN$i%71A-K?bmJ06e8tzmEWh(u(1#<%G+#(Z>~s~UL( zrZnJ=%_%=vjt&4g%wY&e^H*G)&>ePGGxi$tVk7m=G%m9vG4}iy*rkM@P8m$+&Gr7D@%QU zT24Qye5Glm*CVvGb#r#$MxbA2Hcm3#MDnz1^ghr zwdP>gA^pjmJg%Xr6R9|)L5rtp?dj1g>??eWCWUL=9R-t~t)ac)hs~(nk}GFgd5vjz|R*%lnZz_sfMdd~H8mS_+PYc! z{`6364OM>TJ|>B}r+{wELJZlFVJ#yP9i5-OtM%C>cbO{Hteu;lCv9lqkaK?9%kv2$ zsT-yeS$oG(a`@+0dpY=L=GYV`$@L>Lsverw9*9h6EbqQ)?%?-3p@8-2`^kQJQlR@n z#VY)hitFcY-UYK?fcA-9k$D)sdcmZP*O#VI5P83QO>^PZ)z$90z zPZ@k>(qIDOOY_B-<`n`V2fr-`R9w}gW2R;=5-{5H$tr)+yJ1Gg6a>=>oM$v1DxF;T zK_=ZJ$_+hp;xQ0fl17oR1!&m9u*eG+1Am|EV&0L0+js(wz#k)SdDI=mBGTM67^yN` zQc>|#fF`$SzhfF3$>#!%t*C(4E?l2x7je=}cJX2NRV&M*ONOxajMK;6ur8MdYspM%=&c zL3ubN2|T{8>ANuXF4ric4p6}jYf%_5@DR&QP!3BdkNtG33DHkW4oOKMlI)kEC!m6X zsuCIYmRj!L4X4z8Z2={}Qx|y?r)k8HAk2F;Kw_WZVfvPTLGo>4u_CMZ_DtjIHWd5Xb2um>ByJ!lH7uUY z-S*fw!EQEc&2k`%Xxb^?S*QuR!)w$kQ?7E>bP`zxOa@}vt=jP}zthPQ65^IXS4`5l zgUk2>$+%x97}m+3e{-P=n0h-(*W@X&d2WWt%m&6UPE75+Pohn`5B$I#Dclp>Gn=gs^htKbP^$XeL2@Ni{Y ztt8YBJF*mbK#hLp=kLU`)#oKoAHgzWuxRjr(myF z{Jc91a9;n+)Gy(vIIS0uH16{5fOReTy>baFY4V`6d<}_*E(0i@8Y5k{!SUhY?yqTU zyGb_SBv9l^A#+G?`Z~h9@8z&)V@E0L;m_W_&ykrx6I#UiD~16LYK<~;$p-@ywQhI~ z*M+HU%BsOk{<*cQOpIbDU^ZEGO zXKZ4^KffR*vF>IFktLhu_qTgGZWkejp-2C4dNw%2UwTOuzIo>SA#>f~Cg|)eRwE0E za8MZRztPqmcec4-s-B$Q^J2z)C-Tu~fg3cB)IaE%^MEq=A4|e+T`ENN{r;mg& zH<4ZnfF+01m7p`Dke^h;82b$H<- z>j3-2#wWz;a%gPkR7MpX0vKD>6e+s-|9)c%-`xi4WxfNRuaUB(=NVs)kd5QFmU05O zE~DZ}tEyYwq=yUH`(r)V=W|BD%VtS}z(LCy577{WZi>fc5IuyG7B^KwDjLv=DEe2y4|@Bl7`jAGnVxc?cf{IksG$U=?@KxbGOzb5gf5 zSwezvl5e0BIbk_5Mw@MAzQb>x=M91W z)@-39UXyD2dUSMju&Wr+UaY}Q7Kqz?g4T?w&{y`EC&|np=Dr=?y5S#!pfNLX$sxYB zvFh{zvj|pG8q!`iH{o2$t&mkWcyP3H(%p~({=GL);5I>-GbIB@)c@ zg|QNeIZ=BF;&P#-&zp9DILAAHf;OCi6)S5sD!;LKW06D^FK_|9IW<&%&1eaZMgUV* zwMrs!v3z6+jbkLmFA*fbd#qhmy#dTLkoAXZCNfJ?_hhRlXLf6d3Q(L+5c;qb?S-`Ggd>ZB#Mf__=3d*DeM#asFCVh0;~FTT8|V^yM5Kb zGbN;4ne{0OeQrpeq#9_~B@@V+Y3?ZIE>SOeE!eqR`l={h_1unM#SHWw+TwapQ5aiY<+2c=_|0Jgri1;Hb zgv7g;d15bfO#tPx$2bpt{d3Q=hXA;WgaR)K>fEa>L>cP;Y(mhkEN!Y1#D^is`(Sz3Er@B-T2>J5aK_vQ@!g(^NkC5iDz9lE{U+ ziNHRI9T+-#7dQU$W10h0%xe;lz?#{g57g zH5d3gKR`zn_8;~N6&*_zH#Y=aW#Ca~VC6-RLLEP{+y!uzHqHy^Yf(+YV>+R}76HrV zm?@BJaE+S1gb|+gmfPvA1oyVdCHU^+;uY_9N5>fj-@7X{i-<9OCTo-j%`QfZkb}8* z2PoF`(2sjl9|Yj^qQFwFY2exFt)l8lVS%(NA{%gcNo1bCy{UefhQtFS^%Dm0#K{p= z9{h)EGcd9H7+4rQ6DK34X5XMM$}pAbU{1KZ+Rt(Ee|5cgJk{?TKVBy)qcXx#WRGl$ zWS+?0k-a55*~vU*A7mtZMMgH68RyNh%g8D_BO%FN;d{T1(dYXc^`FPA;X+KyQ|a3aFA_6ye!sY^@v(Jnd|J?YyJ>VI zZW^n3m_he(lD#$%_?yuqv$vrmobOxC+a+!vN^Z<}zN^)@SrFw#C z^4{m$<_*|VFBzm@!sicBYTY;Nm*%`|x+{5%?45 z6qq4{U9jLjz1gT!+ggHp6R+{}wqNBX+>i?V0i(mw8wvAV1QqEiJ4?>bArkANL4~8OkG7s6_hc(gQpd)mVCfmsuegt3mk$e8Nzi?kmY6hg8n2<7yW?x%8W^OI? zJ9Re5U5tUBiz4S92t9yk6NbO;by$zNFx)X`JJK)RiRuI^0ytTO)PG`9_YGG$A`oRM z&Cgx(?IGy2P0**PKLGb^J7^KQ2X?Q)K^y5XP^K{Ff$XZp>2xWfl+nQ~DTh5NsG4%M z0;`Q(j%lkUFtU5MyhhbJU!+pHnksk)e;?(xkp$>| ziX8IVp?M9S*kE)D0AmUYTsFTl(Q4?BGfn!y2P<8QpbB+4w4>@EertPYuA8bAgXV!P zNH@~=$@f|T8mBQLzuUd0iy3MNd;SN(b#n@fCvZRvmo}#w>L}jq+vvV$chR*0gLd$1 zenlgGpyG8jP%#P*<8r;_5kU1FxWiGQq(mNh8Dz1LAeQl{#UUj4QNZOLZfeJ+wAhh* zfxU_jy-Mm5gSj=HkhwHWT-?{zd1ad58rz;LeM<~DYH62{W_)H}oA2{Ug8$QM;8v*= z|4l;DDSy5EMIO`viF}A_TJiUVa?ORUj0;<4cSf=bueH=exJ6|Igzcddmt77&|9SIm zZOz|eYI-h1oW)(P^!c8RCHHs>znOR3Wj+tDX##K_5R-ns(ozZ1{&wmrII%tuO3*CK z;cO2$_YT_P9Y4Xl2BHabhh3t`Vzdmoph{yV{LJTVca;w-dnuUSoS6ghc%(C|wU=^b z$$4UHVz)lFC!&XyDZPX;OV*30l-?kDQWnSxNHik8(0y)0{REwtO3!Sluxw%@dKT4F zMO_ij@lJA4gk7;7v%xlHnI88Dl$A6z!wb@KsTSRxr95xlz| zYRGs;AZsoANPpLK{(jWd6?Jj>BD^FlMvVyR&polr)L@2{1;{d$v94jSeV}q>t^bk- z?zWcW1WoZvDyqZlFeh&^vLuk*9A->+?6{_Q*Oo|GiWl|-3M*6hK4PtB9q zki46@WMZEb1O5MPQ4C~i-Svd zU~u&sT0DqIl^ka7*WS7LyW}X(0?=s#F67Ke4bK2R=W*ZVf>0@4@GzBoucE11)u@_S zeN#VXQbkjjNP54|7;kL26dYv6NB<av8fcV=g2M-m8flpBL&+Y5@Yq)TjDmrq^Q<%~s8R&d|tsU~Y0c3@`jp z0_^v0g6Q& zX5A+F`@2(88Q4h64E8Tyow`yGzrntW@TkUlzB(|je29$e2kj{3IcosP4Wiv~D4+Hz z(pO5@=!Ph-%cJ043JRRJ|2%5!Q^;5xDCm)!?A+iZbk=meSwU@X;xx*LeG|Y5+S@;{ z>tqk?PJR}=7^44F*z*Laf!-7+Br^E~E-UTll%h+R-F< zF?^)m;Q#X##tUupF6<;scb+K6@14{`oxEofhLmL4XI7Khw{LZSbJ3k=cj|@ly4wHs z5!$Env|OV%=l^ibNAMAwtvBbQ*X;jy6+j1&oF#DUN~i@tk1}4@`G5W#-I!d)%ss^l zFn*PBQ+!TaFpmft3mO&$z@VBpnE#)j(}rJ;sEy-vHvykc`+t8LS@ksAPTfMu5a0*O zA$CuE&0}5x8cJ+iuQ%s|1fo$AzR2N8AoZA=E%@41PJX>{y(jbxjEt&$r`QqJAJ*kX5l_K!saU5xVy%~NV@&DQLq$AXG zCr}?Mx^5wMX>rGEanHMNYu}K@Vq7e|oV0J}a!C#4V<`;0zPh2orvYFRxVh)%{JldT zKB++AnazP~IP2dAc^gMNIpJH_svy z=N0}5z6LFiBHm8nEm0pMe+P$_y|^A5M?arh%d^7v=$3RlG7(9A0AqM88er}SBj=B$ z*q>Vu=SB=knrcgSUVi-v+(jqIT|9bBwHT3fHF^bAOMbb=dEtY?Kq+c{#AHZQR|Y@ z;U>*F-UyEK^;fm2^<6ul;s{?kavtu7=)}(7A^*DYh;mfYKrNUnQGDI<3P3V!7)s^Y z)7)nzBx|E5lNDZzT=3|sp+8+mFf1#Wi zCNB@2uI1uY7NF{kcCVLh-RW|%-mgu@v>bq3oq+>ca~$dT@|JyAy>=#FHKmjIzr4LK z;u36Sb_}GEm>o)FjU*l4CeL8vJoZ)XU`;{J>BsG|{KF60JM6I_pQ^@RcjZ)Ah*-5j6e#=b2h8?e;Ghe<&KC(mLI&bHX94;U@#%@@g28sVaPh4jcKz z`-e$Mu6u^HL|yb&TrSI@qUg6rj-AN>eEdY57-5Ef3!aM#Kd8?Q)ZN#b=OBH$wY8NR zEy6@~0_+2B>kb&WGY1_EvS|K`U-N_K*z6NzaFeqWRwx_n&@C>WGA4^4j;mDr@ITf~ zoa?NLKevabd~VhCTR7unaKFj*wM|Y?>kXTuRz>f!R5&0s!#w~+%KV>h;Iqk7wprbhMROS^vG`jV? zSm@u*)?tRu@`ktjdyDvx{VrqK>-ehLLTQ~Fq}pXE?B}sLH1>xKYn}zY6rE(` zD7P-srqfCh+6ZamhKYvcJcik-&JAJhvT$D2v3_E}wM(`rw=DNUp_5KxUo;^MBxr_K z3_kdPTg`EiNWj8i_NNbcv>**saWuUgr28KRgNPfL6*+vzvQUzxu z`G{uWY;kSsQ_w!zI)tZso>R5u1Y)(Z4W(n2*71%Yv|hU~>b>K(@~%ZT!)er+gM-$g zL_gJ+f04;Ft;U7hG}&^!dCGsTsj-{h=%lOyT!>O2_41KPNWI={#k)1%esiq**YeyF z%D;Yw2JTg2IXQ6WFlT1c?e~dvx8QONR$Ce&B>r=bd}nH`Za(mMy}6W3Q=cfe1L3H4 zO50{UKO!-ARK2Z_@112_Q)452^V^$#K#5eGd06e+@zr?k^a4ZL;#^M7NyHU;pipPG zDGE@EkaXuub00lOmHnld_kmo=xIYn3fjTMtblE(Kh>5Mr-Lt68bIyfK+T_8|Mdex% zVzzW{gx+dJe(~{=$M3yU5)YGusgJc+ie+0LN_2SbLzUnU^*&O1m3aC>rR5K=s{&W; z_yE&-oaN?;T|Otv!DB>!{=KpxCgI_1x$V7>@o(b2Nwg=&98nJYIQDylg!<-0iLLm{ zJIf2u?aDzj10D4|uWL0tr}`itSMj<|{XTaI+A|oQBj!$QqX`6oTk%TPt4I5aZpUpv zXOPxl;5@ngp59vHi)0iALD~)!!kZ$rB28|E=w#!`0n;G>;=;88APG1oT8+mm+)3L} z+8;a6Tr@wS_v!z89~14R7~yt?Hv(&pc*(>^zNCN>0gmDsciKS_``#4KzOMF4U&Tq~Ss z*by5^raY!=nh+32X_?#0;W>NL2m05}eP-gG`iZJv-inpj`TL>Kd{@@R4n}cYHc8Z` zi4JGz8~(j3_SZ2K`2*mz1%TU##;KOFJT-cr;hWe*GW_JtY*6goW692Dh~>W?UBcV( zwL$z&RCqnZpSvcXE79b>*O@duA+kHZ_M&pD*vtA?28JZuT0OR_5(2Kt_@CD!MQHwX zoz#G-Ci=$4EPmKxx>VIocJ4DXx9M!YgkH9Byx0T1KJ>=PC9+D&^UyQ7;y|BTtJOt3 zQQ7e8x##6D<6T+rZZ}ZvaU^&-@}P5IV0br6fiZ=P&S6c3<4$sIP=9OWF60p+(1wh!Ap0Mcg8?_>)&?}>T7Jg=*$?}hzRhn_-d z-=a~qf6yc}Ue$PwLb>3_{7;F~hf7I|yT+MkqM{z?8HL7VIA@_W!`PJyskh3s4u#jE#H1iSgV z#kSxv^8b0P00A=D>Mn1oEC#$Ko%)zCBjPK}?kkzfA~*rf!dk3OWuNYqh z-&uwNCTd1lN7&hR6wAYOI`hTzWlQR*IGO*z9vMl47z)5RVWHy13eZ*7zah3IL4_99#Q-3T}Rooxn2M6U5X-{9GX)` zDU!g4_Y&_4>xb8Qr#6b_Oy7_-Ov?SuF<$*VP493@F?1K8a35)G^zF0ivYPg56m{e; zXWIBy7~FZ^rrb)hjW_np?a@0ly&tg)0=CD`G9o4Q`sq{1S6<(57X(X{)^H$S*1zLU z9DQxD0ZyDFc2a9X%Oi)*S=<=e=dSBnU;Z67)7-Z3c`A94f_%{^lu(oAM3)d%L21Z? zqUF81uGQTopDncLGb$hk40-%0x5sKvH&;yfR^RNLoMjM)$-}*z%nW8lr%3#%QeW)W zSs!?u>d4^kaL;8Bs4-l#u@@%$C<54^%;_b-jEAAHpu_nXDQo&^oOh^OWTN|ZZB?-l zpxjQHZrY?*^`DA=NS)9ZfM+bDE?4^Vf-L>*B-tqNF#h$@qALW>J!GG>@P9x_90L2~ zS0_aiAack^6b%Pv-4I1Y8_~JWR^ORsvVkEw)z3a2OeMvt_q@R%XR`km|6wmO6JT5| z!4Z)*JO0k9`-0M=36|RO zqom8xg260OL#nyHW!+V&k26w@Fw0$8P5(An3ZB_W`oGuB&;kV8%143U+-Cb)qibdL zVdiJo@P1c?Ew#W>f*D4S>-eG7<}(;0yYhE+Q7V#=wQ=dA@nTUb=^vSPe@t~Gxk%^PujO7{)cAwuIs>;RYq>)K?%6nl@18*nW||i- z7@ZV4fLOT>WUGTw3I}Sg`x&;<`c!6;tET?erVSIVWX@ZyiIa!luJ+gAwBX}5YMnX) zw{H@SjPFW)TlX(j&=gr>Q83KcP{LT@tJnuLSg1YSg6ciwO}^XwBg$<$T8Buf36?#- z=4r9gndXp(FQJWo4Z~>(!EMqy6$uSaqLE=~{YN7d9RlfK=CfltNSugtG4D9t@E7!Z z`q9yH`}sdP8-Nf~ywb#8d8^3ngTla=yqALd9WZ`(@=-y)$FqO_Z2Y6jdlHB(Q9_@( z_*3f>W~9zPya(=mvJg-F=4g)6?qn7uFI~l*i#Iw{T&0g@L!9Sp zXk5u@j6%0%CJ91wxv}OLk`EVD&#dNnaax%Sw>9(9x<|@=tMsxSY)3ULgCau<5;o=I zUMCQwL8t*vx^KD2%dyEBKGOJQmzv;}eh{HnC3xzWo`roQkkx-Q(OUfs2cz45xgGT> zS|9Q zlmem*2va{XoPh-u1_qnZdqtZ{D`o!7lQ(>%UVA7^Jd*v`sE3K?fItgMV;mo+KPV{U z9@6#R?9l|b?rnE^_Z0=+&N=SEhPL`NF$|-+81b~?KlPN)4JJ|1`CSMO{Iz!r#eCxd z22AMKo!x7`1q4#bA)49@xKrH771QlqFqZv@dHdN0J(w$)02MC&G* zFOKvN^S1d@yW-$LBCtzdGwLZGXR!dbjtZg7XN=8(Xn-;Q#h%F%1! zs;b>jHIKw;N(yFfN5QOvfr-^ki4&fjSsICEP2;#Lb;`gGUfljjd6Zbyw;`)YNyLXTZ0ffr$l|Jg|WK-ksp zPh=)wq^Q2pxvQy;rN3a!dJ%zU&C$PmdiR0+`MN^Le5|aYKKZa%@&m|PsmFNIPw-Yt zM4@FVx5H214`?I&0n28*B_87WGwp>*8$MFQ)psQcJX5X1C+j&hK=vA^#XNlpWZ;ke z142z@mw?Hfk;jnW(Z7%^s|46m+<{DaFqoo2|2|}n zr5d(Zh7L8#K` zRwldG_qgiDZxdrg;|8xBq;nbetEIs5=ctJaN9}KeOZmvja&_fDuT$1B;Q&MjD8%a82pDxhEd@SGz8YD} zTKb;S=gY{_V56{CWK1AV%QnxJ+^LWdfP(x(g%{~Rds+;hI= zMtj$Lw*#P$>sf!g3nm90Egkt62dY^kYIL*PTDNn{T1%8SoYBhuf_&z7&` z+4hO#>gAJ`655_nbTRYz<17K2J_cAESKm-ntz~A-@bVUK=lfDNC;WCXG23f+4`WX+ zJ78>>9(01>4(|^aVC3oZ&UgyO4A%Nv{pgT~G0Zj29%G+?A`*Oz)L-DOc8_ZEufF{h zn<+JRryZrp9$&58d706ig$L?5`Al{_`~*3RRy7t4E@Dx?KY*alG-)|N?UVr0Ywh1& zu>OU3;5oZt(jT@-ce>lhxS&Z;#6spv32IsWYAhhA(@71W#(D$YO*qN~pgve(qoMdYBS%^mbAViAY=E~)0=XIOVbM2_bg#c@B_9yAq z8{enc1%)Fu)aeaQe6&f&vmf!vCsJaI;k@sRR;N~L(rYGyVv-*Qp^E-6^1Nq{=Q=4l z26HbpbDArsnYg4Gxu#@+W?9>~N19sfZ%r06-UK;0%&RyYLQqvI6uOmt>5QuQuhtS!hTwuenka+VUNt@|8AqX%H^ z6sLCvBN?3h$7uiH6Bp4aUNcjWGq-Yi(ET5fWE;gZJBpiRVg4eEH{TQz-02dYiZ32Fy5IirI?X;z!N)bFf@S!>EQ{1+x_Ucq=O-8lK^%PAlbIPGx zR$M^_JjWYNLx4~vsS#sBhiFMtVlV1zot<6wMghPY%x`-mHXDal?a3nh5X$yBZe4zMPI`|4Hf^7_wiiqwfSx$_ntSRSYYg-!zRBhZ(Y3*Co$|9+gieqv$M z-a=Ms#=E+SE`iy#uedKOwWqooF>&+dgcba3-t?)Osajy1E+~JWkhZ#5;Ieqy0PhzY@Xcmn_@x5qHtdLL4#U=Gp z1>DTyBA2hVqpZAcwxe2mXSy?RE>n*uQVD;yUUCzK^JF=|GZjw~G`IPbj4{79VqG(aV@|~84RMfNVd%)qyRR(U_D7Wg2)Txw zq2i*roFRw$orimzfR6aaEm!gZ*o%gqt-*1;q4+Jr)(p5<7NeIxiQbJ^+5!Ej8|6Jw zwQ+-PQMJ!FYySSqN1uyz6FR8{@NV$AE>V2J{CTGFw=JY>g$K%{&=*dw3k%#|!&>%< z)r&RD7U$3(BF&=a77i5*LxcHJ@3Iq-!uf(XG}}P>9fZO+ZE3epWWX2A4J)}+KC)Cl zd(haiV=(q+BGis$k=wxT@2&52z(^dJ;#SA8UAtYtL;eTN6ZS~{?8?U@&LEt?&F3bR z|FAN0%Z!wQce}aqgLXu%Wg&j@)(ddGleNJ};691ceD;)%&PQUJcKK}I{rC11Mt@CJ zR!wykWexk)?mTuOgD7i`2bv1Q7{}-GVcqS=)(;LJQIP%A67vHukL@Xp6rmE38V5S} z$a}b2(>G;}71`sM7mBaC8J}1d;4KRds`=^uvsohw6FiQI>w9=3nsaY~>u2^8`6r_>AMsExI{o#+T za=LMH4({Rz9CCD6CCEppxNIlNG9-b87~Quy|9 zqeI%$vnWUFKEvycQ51cqGOJU=ZEGG{co6Z5{h4?;ez-rpxuS5)(L$I*`YLS1Y@nz? zpiflpfKM54$w+pUekh@2YAp&Kr)g>NKFPu(N9R-7RO7ENSm8r3z{qE93-@<*P;oWDjqTc(!HK(_SuLQ zFQ5f21O;beG0 zjN$&gX7P@eM`AiDgv}U%FcW*Z*KBRk6RmC`fWQ5{sGUyzjGtHu#Vzjgm3){E{twe0F^d%cV5Fvl*NpIEUic zR;%F9sQ@VQkgETN6}(A)Mj#YEPz*82;Hl8D+D?N*zqtvFHCutiN}KZqfM|lRYqf7Z z_u67b(kayEW-=T&)xWW+em|va{$whLcH{V$z;%YQH@`kudl(FCzRw-2c|Ju?P6Wvl zz@#zf2U8ibh0}C6S5mxnkwr8A?ax|yZVMl4-N_P!XA|(W%c3e&l;r&Q3uj%Ih$&jX zz6L5hHnLVwI_l5@_``6oiNjgC+XX#ZQx^BSe<|dXLIsFtVT%_DGdNB4Ov1uTmp^sx zyC$=W>=%H;){!~WJYTh11Y9^kp>=-IHoLq85Q4VGQpnikEPNzY6et^`MBKaSG3p(*0@YQBZCL_C zfxI$`qFSbE?K&uFdNxNVP{8->@0pyR-Fr}gBjZI|;IWR#$NfeBwqQ%*x(m%7Oy|P# zQ%6XHX|KNZV|5G9z?s7DWAn2jYb3bhXPO;BRRn;h)ufJpjCcccCGM>ku9#Q;+mOTG zz5Xz(xpYSA&BG7THJXrK_J2BsRP~&i>g8`HYirQIuIGJ>9jmPgU>R%6Q9%`B85N^_ zu2yP5KR<_5M%hersY|iF9>Tb-%ib{eXNsoh!T6v+-e8k<8r3d7mNz_7#@c-xVrAuh z@T3r=lHwDk;1YgsEx;W2H?`Uf)?RbJpmMn-P!sb5d8gn-&Zs>psX^I=45&C7x{{>{ zFfO1|W`f=RWzs_EUge5h!btDgm~R(=n%huf}Xbdt4aZP|CY_p@Ey} zvUpO#q~MY9sg0l&^C+;1%%oQL;>%d9Q6cb~$v2{N=j9w^;(mNdo{UC8r0Vs5ZLkAl}0YLc-b}?-7t4Q2&hUW--@DeZz(TJkV9*}?_&#% zyb^C6z}bS^1dwIbO`Nf@X-j3aY0|I>MFkUT1b;(69Y~cX$TW3H#ieSo@Nir-XMac_ z5vE+K-CtH?jmCwNh^0}J&ewNEH*RS!9ALAaY`HtLWPW zCN9e*sE`(vQsS1ZyI@>Y!^00$(%g~T=f~)UZq$>qnU3TM7@^L9y(08rQRKr)q{B+B z%G+7*)bc^mii)x82b+aM{v!V`gV9X`%%njC?g^+L_e56G>4PKl?+Xz@I(3E>EVbZv zNrCe(=ZO~W4&IhIq3rMG^DDdihcC*vfWLfu$jd<=CPhHS_K3jUP&JFkilTtz>61OlMv}%2gE!_AQ|HRzU3*fm6Naudvnn_adUTj~6U(F4nrQwMe9BJ>)90 zFjN;sP>3ljntn~b{~3D?H(!+1wYPXU@id^lfr%EIZ1jo?OjadNR`2Uxd5J zm_+=iwL$>q!d5{f{1tw@IOO|+_8LGcvD^{IlC|8WH5Fc(UGnmB`?>m*D>@IOlmigI zfvH@S%kJ1}^U;AeIMO564QiIORG@WzZ|c#S^tWP!C3hs-HTap~D^Nw6n`|SNf*D$a zuX5vb;Zw2U61eNO-Ex1dLo#jKyN12B;?$rZA{3n?KN-n2K42 zqJ>>EhGvJD*O6ML?XNB-k->kwmot`~{Iu$Okq#4(8M13Dw~qaMl{DguM5*bI@U<46 z!!;%+%jM5s-X!fDaJhHwtwn)>?`R!l950wC5_tION?__pe##|j8bBzZ<1BE(QBSXl zzF*?A7-`-mx4@supt+J!9jl1*dfTA#RomalGss+6;00e7o=|k$o{4c_R4(qoGH}w; z)R1Oh8tIdw$eoxuO+9rcrdH)a!QxQoJ7SU8*4GoXPa)0Nl^8n2o_d!ij+0ur5aj@+ zpKMikvHs3&PNIngsMD5Hl)+%p+KzWoPhV#Q)WlkUy5{0wuD`<%v%ocdth%{AfN%M` z7f*?Lq6Th(%De*3Qkoo;*|&LR`HCZ^Em-&-rdL#nyy8AZL2U|0kw*p>32s~y(KDsV zKgB#@0BD+t^yVHwLCKpmVvq3#elxNLSMk!_Z#z1xI-?72WBmrDZ>nodaNP2E*T1;v zRe8t%S>wbRuZ3_elo)y=v=<6mS3GRX-*18-4>*XexpaeNJwF61aNlhEgjPZsUcGmA z<9VW^ceuq5J$9@DBi)-m_u>KAQ2RzEp4-fCEbk|6hkvHqe3YL`p>PPK8##qL#fp-g zTZvBpF$`x(IpnTuR^D88NC@gpna_)?LZy2*iJR+szI(+j!^oqHc71=1!sa$t!14!$ z_McG;FM+(a>CuLl2HD|faC~4NwAT81-ep{fUYSO%-a|d|$E8~`EKdz-l^N71t!(oL zz6MR$AiLLQ`&qz&i~y}=Z~Sou53ehy*y8+`&^_}7T+SvSr!q08DP}E_S{1HiwG#Qq zbBXJLnd-+ZK3qixkZjYgRfEM?KG1a<+6!-OSuCA^_N-#W5;)kZu% z4su+#s1HN4BBj|gZzkI{2=`sjp0*^sf>M(jg032#Jl}E-Mh-rC?Z37j@yvWSkvpWfA`Y{?Sz4v{+fcd20+AYbLPyo3snEDV$B zlb5D2hX9??w~!{fZFczzP6czxT5EO@byoDc<$+P+Rwr{?k4b3r`>_4sS+v6WP7^E1l?F_SB7X;K8MloE9nL zWDI`T1sQTTa}wx10yenj;aw z-+N!Ht?A}2DO$$8#FY3fkL#)d5%Lg6z93FMPd3^9%N?`CrkCv!sfT1{AaRv;7CGIR z*mUh)o~yKIUzAv%bwg~x5{02Sb%zIUpDYJV?^*F(FPItbl%8D}aabhGjP}XW#(zPf zB}`*;P~RQ|iCU`J*tk}Wo?Dx6`06b;`?^cac4UqP8o13Kt@la& z+|B6=ebtrf(vSLe_^a7qN_ZIM7k>U04*zveZRZb0=6@LMC@3Pz4x;Ml2rK7gyCfJZ zHJJn=A~O|#0)JF17p4x0t8802Y=LchbyPSkyRakB0hua)rJhCJy9{P%^eS3+#Uc*u3Cq7h$UjU z!NkEPtNmB>1Esiz(Nlv-Zdj8-cNKHXF9MGiI7&UzwtTOX^AE`Egu|M82CA|UOUZge zLtUZ=)%yz|M(goy*Gz5;KzF_&3UcYnf#W$Bts;QhPabNDaa`fi+8gJZ$vJ zb8(~f;jK}{ZHME+l3Nt*9!4{@ z{Jj13Zn)qLWB^WpiAmWNyu@AFjlFAuq^7im(JTD*ly*6mA2mR869GmDvrCpDMVcZN zJ)z0HGA6CZSSUz^b%4JRP~8ZUHerOHue{&X=%zpM?8bP6H|pDAT$O@R6u^%`>f!{< z)6z&@td!Q$H(GxFIL5@{gA^x!>>_k&Gr*)xUiYGVh!mfv9#F@az|9!Qk~UW#$>4@|XV)Tfc=k0M}Ex8vL5w=i9?K?)(kdSxi;rZEr|% z48VDCk&wVn_haL&q5+GPa?S@DjNw=-c@ZD(AGyBd9UbTL!vGD3n@!d&zHFUu}i1O=Lc{O`Mf?g{Sqd!sAB|`R`J~ zGH}A%@fS6pz4^SN&$<$~qVt#~Qf(j*TPBYP2Ai{7kNJv7+)FY$*K<3X#OC&#ei_=~ zT2Lfeik_4BIeC%#UUL2+??Pwp*x-FB1R2f68ZIu{Sp7pT~`5z^nLON+R%ktRRC8T?&zhN7R~!|JGHv zE}J(!+7*}A>^kw_YTw;?Eym`*?t6m<%L@JA&7-g)h|KSMAG$uX$y&4KDuKswpBHFK zoL6zs!tGPW&*!*)cUC6jrdYEJ0LOc^*r2WIR9|ziu5+`+5+%*1eU!Me!U@P_B!AEs z^d-WO^?Z27ZASht{U+g#@xF}ykyoXK^RJ(CxYq@0I6CDERgPoQhxnk6{@aU`MFGp( ztUIlhW4yTzLH>#0gi{rK|2*0-@LD|dY7no}=sZJ9ROHnK^6uCTGg{_C;F;Vmh3_4Q zsQ)COd7x1m1a-)vIQ<4*oet4wBDxH&($h8kyd}h)ziiBhyBElUwhlC2NRa5(J&>;( z{NfI}g&)$_jPHJp!FoO+P)YNZOU9Qb-&}h`rf;L4N_$xn65cbbjY|;Pa>)Q5WjG&XcbI@kgI0KKY!J~p5%Ek z9rK)L<5jp^u!(L@t9JKgx$L;OpuT|odztDJ64~_&HdG6viTxXa)6hDAv=v>%1h`IY zWkp#kYK`^0PTOI*wKI^ zGVfCn-(qBBWa`gY=oK)X)XS$Zw9-8Rf;@{C+E(D?wn?;($N41 z3}TI!C_3JiSnk^wXAUgYB2;PX>u$$j^m2&p(-Z9b`5q`^hbwHf_!`_N5#Tz;o&0o@ zhmlv2Y2}9!7%PgMp@Ko&g1Ri+J_ddI*64hMqQMjGyTP;Il{XWX?g6ISKtmc#Cnw-R z+_qw$`jZ@wYrl-~AbH>HsVXUdf5-lFt$SbGVI}W!3Og8XLa0G~u8F?xj;oIDTd8?r zXdAw03D{s$PkLYO(F_zYQAUk$w58&+#AjBc;~EzZP7v>LgX>y}653C{_r9*BHa+U~ zKodKH;gu=6hFqbN$_r{}y-1|3gMJPlub-d9jtl{7WMw_SNj|M#z4G&@_XV8*1&{?u zB&W;MTJr8hyc$Q;*mo3yy_C129Sl(XBl7jfN!Paf;9b`m%I|m^q{6YQdrfw(HPgRY z@Rk*a&{6GAM6@rXw9X~rOAcFLItDa{gDvbV%Hc;p!kO!cOs|Odh5cU7V?tTo*Ms!V_1Lea5dlmEf$OnCWWPT`>_HGRh9mb)9?bTjh*Ub3qz58F@_McB%J1Ta0hc9bt`8DgwSD}`m!>j+P~pPt9I zh%MM;yWu7+cnu&z&oi*>{x3C7)JMxUJu63OKc7|mZtdfg4D^8N6Yzk>DB9^Lvz?|1 z_T_jzRp|2XPdEwzmsW=dNzfH}is6aec}T0r1(!tBf2a@UZ>lks1F>A~3& zP`R#fPq|_a46s&HX9!%0a zIxMV6lf(hNOO}@`A#4@s2%=ih1(D=npt9I~Y#{I=(YDH@8VLgz(PPf@=a0xud!D4# zH(Bz)#%=qg;M_P0Ae3m2s;^4Jjs^Eivu|c|W>&D#NvTsUm$5^)^Chk1GjFhz*aQ}q zMK2ihP$X`*f7+@`8;mZl%68!;xk57-X;s89o$_(cG%XBXe9pGp5b}ul;B{GeaSt9CN$Ssah+=0$B)vMTE}2zM^H%^X4xp%#?5w(c*Bxh<^Kk5V zoQ`ntfToq{_5-Y91bRmV<{&TU$?z`H(3N3q-{}xb%|i^rGppG^Qt?uJ_Sj_35!E5A zfbb07fIAO;Y;YDYV&8{B+~g%nH2}IKtdBvUb()zAica5Tt-9niaJ%e761sHc2%J?O+!Q8d-!0?VRDG77%rj<)+5)9XB&h)Kmh2 z@(H9{#4E&TZsziyy$!#$SJ7qc0H?Grh`@{-tM22%r=W*qFo)YM5p6uzGK$I=(qI0p z2LqOP+z1KPN$qVNbfx;xQYTDZB^TscwbBg^?;541Zly3YP5TQk-hMpZ?QC(E zc4wx(7cfVuwQyEqqZy1<3|eM#8Wv!?bf#&+4YMjMH8S&*Y@LcGcUsA zbOj+vF?K@?VjSFM2Ku!-KOlH&t^YDQm`-*8ofcZIbub=4D>$@Pm`Nz?_bVWI*`||m z#l>~=KHdEPN+EOf5%iLCKQ-ps8iEOUBeV#=-ppJLEa^Pq77?7AHZoGnLTavepXi)j zt1mJ6bgIz_h(3T+%0VbTq7qVe2qQ#!ZQ8k|Ij4>J@D^KwLEc*}uOp;s>QBpk5R=c5 zRbS^!+E!UcinxZ6J9>eUmGDC=H1fZ=$vFy0AO1m5DvDPi~5j!Jy|Nn zG_4RGgoo1BYMG}cA)il`3dfr1*xwj`K-j*f5z-%QFP09t$qo3pzCY2VA-t#+>K(F8 zdwlSK%i)iELxr1iTyWvj&mJHZVR0ple4f~oT;2p5J?}d%PdU) zlO<43^DJnLz#1@)Xaa$wzcmPV!~Wb3jd&1|j3}1)rE-TYS&7aDM{pRUHulaTeCnPO;X*wi64&yCn>)2oYyM;p2N~LdK1R@oVRUpvdstM?6E9NHC=UEBb-1opq zP33*6Up5sHR1@stA4&FZ;Lkr)H($g%SSv1Kul~^WE3xtNl6$g!_n6k!h6cbgq3HZ; zr;qa$mKdYC%5`i%fUh9JU=B8e;9ikQ>U%OqNIkAjZFs2pSf5JfA*PhNk_+3SIG`O^ z&HRrGIM>LY-4>dzSl$ckvWZXD+A1j6+jQ3OzeyXWIr&c@eGz$pR)}fUHItfPzW{#H z{KOJdLJ?&R?Yy@G3Ex~!N@2hzpK2l`G72hpr5*C!8kpF+G-XbQ0%1wii8G})3E(cP z0;H4Nil#prw#Ith-IUb%hAAcOR86WkUuZSocy;2)V3{y!jr@uy{N$VUu-x5btKe5V zzXzgwuloEgj{7mNfigNuryj8joez_IF#SrBWk>pfS$%jZBSxsgfw7raju%r!E&jMb zjS9keIb|&YK9!6$CVj1So<)+Shdz>>i{vJrqYxg6nbX(D+X5}NqtCy}hTyUj8l6_+ zLTnzz3D4la!6INg_q;}(^IJsMtksLR%X?RN$qVEn^)7usE>}4EP((G_0VDlO`*PEI zL-U;}X}iot%uoUmr77c+v!2&w_Aqe17xZhe<#p^Gf4n-?3KXAG?C|q!#R#|7~#?TCp%j|3}d++0I zZryzgvnBNWgBJRvMY%p`($6r zZZNX%{O7mWB$|NrsbTWMouGRV8gQvJ*mNWXFg8 zrT{HoSkF~5vH&uq(luR=!G#g;f@CXC{)bOeIr&TN;_kdds|1%7W`=g(cSMWmsxKFe z#CPA|v3q{EB*-iKI437JC!5W)D5@LRD368JblxHnoZZk<$J3>(u;oqJ^uG|d^I`8A;7oYijj!B z$>ZsdyP_tizw#ZU!-6SRdmxXnmRXRO&zo$HXc;?1E` zcH!|s@uZ58x>}NGj{>d;BWV<--=l6Ky=E6(Cl1k)y(mP~aO}qHso*3zT6<(E)Sb8` zizmm_4>Bj;)RLz8_mA!x@^W-_)nqh=k#VoGTeY%uQkr8)z|#|V)sz}0a>zmm@JN1~ z9LAW=UvZ4{R%_?<)Wn_g)q@Fs(P7r2_k3{@YEC`!3^eL$wRcv&Vn%#WFo9bQqQ=Od z%}E1ygZbU<@8#=bzOz{~2lah_Llg>qsw;JBa(YDt>F?BapFPI3sy&F78PkUqRhUP3 z5_@U=FL3hfIX|2qn;Q!&RheH`cyD?b_5ua z5XXDB0K=(KOnyxDXMK2d3Mh7*}5UFZ7TNqN43vH6>@)-Ng$0-TcF@70a>rFuHw z8wrTQ49Q;PAo6)6^DPx3g6~`4%GD3>Zg4Nbx0pRW98(fAOT!aP`RfaCd(bV6u^KgJ zg^7HyBcDjj3lU}bi$fejI&Q&qMctPPT|b^X7A1TZ{-pU$Yrt~;lvE#KOz?#t(Rv#G z;BgN*I%z#YXD-jg-! zXzyJr>BGaTP@;rMQXe&43Gkz&DnidziG70QQ^ieAame=tr+xC%TDjjt3AJ|$BGG)? zmcS_J41ave9b0YBWQ0DY9>MI{;!3>)N;(@k1cawxPBCi2d6WA_rn!&H3?{tM6z%3_FnfQWLnU@$ zK^K-lr;IeY=kn~}q>VFIZBwB_;K6cgjlL^0v14nvAl=7qE3O*`yu3S z;uLfiUJJ9=9G+gdiXE#=99U0>Ktu}f+-!1v!JL3({~SEDUso{;+Ag8B zCtkeHk6BnKf!TQcg+vQ%r@cJ!;-ijw@+AIGdkCU~+aT5G=)37%jw;DNCW9W-HuEyU z3Am}5;f)QuC(gkFDh)C6ycNoEe|`NH!_k3efEgKc;ndY)=OgQ1SCvgxXmCJ!roQJC ze9Q(Lbp7kwW=EAT!;>fU%JMpnxspvQ*ECwD$@Uo3UZRbm^?H1QLC4Z7R_7GdXcLnb zXRPLgr+WPLV~M3i7A@4?c@hk);@*|N7-pVej1%ue%?j^0JY8@RZr4%^+c^gYY)SVB z=_lH)wVXD|#Qcv<^+cl0|JukD*s0F5y2+=C$xZ6Q>&L)>+eOKx>QShT65ReYUcxb| z?|^0$3-9)+EGDSGRw*K%*C2oXNG?hf=aIz>H)kL^xGMCT$PJxu<9ZUkU}<`o1w)tT zPRHHC4K(DS##C-(ZC=k2X{;AMRB)S*adW08nLsHtgPodho(zB+&;vILrT%rQ}4KEaX}0Uj4?O)>G5@B=*~b6 z0aVT(QqqR+n=>J6m{ifY14~OlY`<?31e+1`z2FA&%{N%**6sg4e}ktH0U)A$<$Z^S$zy#{@sOKN^QMh~UIkp?Csr zujp$S!wkw11G$sbH7CuY@97D*&%q4#ZeSYRxC3r)L}-}8s)ivt_zbc%kGv={Qcqqu z2b*({+D+5$46?7ybyuH3J2AD@(f8Th5!sVwFNO_P&Se2V>i5sB5MkPtM)tM8PAVKG zRp;0a#K`TRFnf{9>6xQL50O@CVe;oR$YQoa{%yL6nTh_;mq5n-$Q0OeJ4D&3jPWtC zKAQbaCFxHS2WG)!#oqTsy*+%D*1uL=p)vmd4Mq02B(F08eXk)-0YXuh@h|`SAqJa` z**8SRJ^7=*7~sPL*m$+J#D5zeU=nj^Kb6rjF@1{{vv--#EuS8=&u@Ej?3ByTXS5GC z76yz~a-Ds7#`dNqTnBBl_NNaw8dwhm<4pZLF9?_<4mnlv&G+W2XZ0*cJpZFf>JW#g z1~SFuuZRcxJL?9OZnl0auTm!GO%J`O<+gs@d@XoMF{R_>gYhrV-w0XUc+j5sW_xwU zdV6JRpujxP->v#9yh}zbvnf+ge^PWDEa6g*<;7LZBqyBq-)d;kzB3rRwy`nYsd&0A zQPS0=m9IR#u5OI=SiTUnGztkE6&kEhYHMqG?|l@!lI(H+@~wDLLSsf#%Ovhq`JU(q zmBeslTY|){#m_%eX7dW+pLe{gMk=X2HpMwX%>K>>n2(%L^@v#6&0$ydG}~E!2@{Kz zKT}$wfO)lkv9jZ9IHT);Ros;9lBXs+iCmFd647_hH9RF@^$&5UE;8A$=+5!C-XBcs z7HHbZdffVui;yrZX42W|NLjs6#@~S!3T=&v-9(M1 zOMG&2GT$Lff`s$NBad+S7SBdvJf%)A7Q4-L-%Jp{XfB;1w>fQAon0nk3FK!4gmP@l?@+Z# zIFHJ3q?@-qJ#n_kri+bLuhq}0aB@Jy2a=twi+Kac#I4(zrrw!rXliO+;Jy1}!Y-~u zdKo??w2{PKN1IHItXIVyaz=ADf4Sl~;mCk`-U?gZ#=RItL_#M|5Co#Owf&}DPZ z1(?%z|KP;kEAVxudl`30imGibkabVtlg&AQLt?yr-f~xILlA~mY9E%xhMb-i740~$ ze=qHxXv^H#oVNIi;_%V_Fk z0+!MKf?nj@bM9tq`P~6ZYU&+MMmcQ`fl}C5%wBN3c?T%7Qv529-c|;dkQY&O%)$yj zrt0Z{k7^l1ttfKOcl~>)VoXL>))io@tB=Ho6mTj1aLglkBZ!~4P8)ANQi*ya<5@JW z_3VwfqoKG%{||P@vSLU05TRp7j%HP9)q&|3@LLW$sd(PH_k)2PJ}ANfmoflHNP-j? zA4T^xKYbI=jJI0kzwN=kILVm@nzVX4)gmqDG^f*YTV|ubf+RRkh+SOrKiusZ8(Vtk zSXNg6pZ#X%NRHEuq-T{$kG|5MyiV29NNc(PNLc&fm`N}cQ>|v2=EQU7gQ})xgo{>S z5!l=_2fIs~%i=?aWtSkCX3>akYvX5?%v~7%WOgO+} zr!z<1ndQRI(*KodPl&%w<6Oe)Exg)3BnuX!#jg=pba zW*WP2-vXYXzmY4nJ10|NVcb1W-Qf*1n`bV1WZ{jD2n5;nt zsJGxz3{yseR?4SOpQ=}rmUIu68P1}%vvc8*vR}l}dz~O%CfMANwYGS>to&ppP>48Vtn;7!be z6#h*Y@|TXwxY*?~oWA29U-2^X@+=#EW}&#_&IU=Lp}Q+*j9|M8x`x43{=NQ2&bRU{ zNu@Dt8El%Afe4-Te+WhBMMDnOe4#E%Mfpa_uFKG10+^#G$-VwY8GL-0_5}2_dFkp1 z`-}b8kT3DqvRmI+Cu4trp~PD`55WS_;IdgeO;~xZ>2tjTj6<~5=fB?uc8;&lE-iJi zcrT<4le*5Vi^D4nAPD(x+3cp8&C&OG(zm&I%%ieDUxN|)1Qz_n&V0T;0gSV49c={f z>oP?Q;~F*L(Q+d#&zeX0^JzovqOdmDxP~}^6LNfgi|AhWzLUgv@nXWCp0_cjQpeY? z9&Am-cvgS4{3m`f88hMt#~u9?NO1xaenKZ@Ct4WH0_FA9{outvj4$F+Yp=;>-b%=9 z?wKMTW8eUyQY;=ZU6Emgowwuwgl4x`c56EF)j3auh;_RtW!t8h(SJX8iDavTEp{ft zVVl}-{kv^kT2H_`=bh?`<;ast;Lvaro1Ld--$jViwUvLIM3%uPhRhShgxe{C zu;+?pBlC6=uW9Y@L(wsB2RKslIESPF-yd~eJI=M(yfhiY{!);s&3&^|(_>Hy67%bC z%-Y-q{6sT*gzjLJ%D3(ebt=_W-{D@^EL9>cGfb|@)*h_q^DH#8lbkEDi*4m)lak`6 zAs#X}F-Ger3ClH0zMAGLEMmYZ6GF7PC$_=c?ewcj!=xu(-%{jF4ZwHS{aKZsIX6nR zVn^;bX1nl!6%iFTvr<{YXa(-{Mm2rwl(;_O+q41e5v=MGC3j7hSUJzH%xkOo9~$F8-PUqU^(Kv+vEu=0vk1JcK>6d};bn%(;O*(nmu3`U(_ zNVKg_e}#<^x_8K|swMSh^l&JnmH8(#ma<$DpJ{&qO6!g`L?)j&( zyw}ga(;ns6qD*US`7qwOVDh^-eApQC;C%KUd#!D5W@TlmNU9`11RhZbX+ndtw)sn= zAdO}Xks5u>*{yi2PK>K%g0T07LtqcJb6E`hT@5LhC7~6^{_^T|A(b+&vzKr7ujo7# z9c|;N8iYd_wKi^0TWU*L7$A?N^OJH?L)3mBt5RY_wds(HOZp3xw$zU z@E@%M;+?HrR-07+@QCe{5HOB;q9;efmHI)>isC`$6@)3fIuSq2OH?yON# zQqpBkS7l7%#NntqH*PW)P;HNH)@FsUODDe1t85W0ZD?}fhU6Fu;CN7f5rq8@d^nf} zev%9ncw*vOZSMZKRY%x~G33J)1F9mA<@+2=^s$uZ$8Day`uD5zygIAyILQmBk21&A z?h+HI7{%#wrWtuXOC6zOUEw`P#Wj`Gw_`6W5B-iY(U*NolJ3(gZQv;TqigIW+kSwT zn^e+5VH3;AtHQhk_W3ns=O%2Pl@Hv7^ewrAdF4h&NaeRq_RL%fr?dy5q;0|A zPk*&!Ygc&BNg++LXtm?$>0SHl znE+iLnvT~qeDTka5uVz(2Q>j+AMO@jpSy7bp&rLCX14ecp!|#w78`H}S#t=VbYXwC0Mv)Tg7X>n}jZ zaO!!?&AwyVtspdxb_5hwEzvStKLROonKgj(ev&rxg{qg-GN6Q zh1rYoKCB#m*g(}HCTu79BY?bnY|Q!Bpt%7~#{s_C8Lr??4e$0%C3_QZ=SAHn0Vk9u z-aai4U^b61FL*pVYy4$*c6QF$Tj~~%`R!UY1W^U$GY7S=(hfPnbJ*S~@Va6%zZGn{ z_xIS}#h((W?)*{O^hO+ZGs0g@9(6xJNv?G&o(GIX9*uwbU{L(^S80>!zg*NXhi+r0 zac@MdxqF+lXN<;nVt?94%&Vgdf5NN&0ulUiDZdrm2I;!&7MLnxWh+@(({abE5CH=_ zE@5Q7Z;J3f|4w$45H3oE#g=TyVs`ULihV1*r~XD>uAI+rU72b<16PbvC0`tDCK=`CbJ$$ zC#@R97`n+c4mejDfJSsC$vyd+L&UCHvh5H|Qi@RdIFa89!l?7MmN$!mS76x|FBViN zTkG&2n!`!II)3^6IZZ(H&2Yu;cK|-QBO`H7HVgej}&Zv3%sg z#i5BJ;84Rcg`V1qjQcLipu#2NXt-{a;%QmYB#kDmvL^Wf7>Us3!I2X;=7HmxGCFF) z!GLA!Gj>l(`>nCnJgjjBB5Y)_ZwmM=x~WmzD|zlU_UeT%d$;0qA(%oT29r2rQpaz) z-J*ZaCOw{H(LqJB6lx|`t1y!!L{n8?ek+LX-^;Lnw_KUT8PxgJd~%3*uZ}L;ht@q? z4dai>GL7TO`*_{+MotTuB&r9kex=VlPEv0jW&qillap zFpaa%tGHo)Bd5)CCdpcLXi78zax?>k;wD)~e)dgm3_0t^M%e*Nefq($v?aAnC2KO@ zQ4tdMRTraQ(U9Ltep)7#mtAjWYa&7-d(p)gmnY5!kyu>D5sgg8Q`vMfZ{CiL%5ep- zB^@5UEx}0hKZ*dMm`VQ4O_bz9LBlz#bi%jSLhK-F2r895$eKL%Up^efrFj?NLvgjJ zu2<}>v{Knu?Zt&d@n`*Oq)SoNZsoTG2~FgUoDRR;#kks9Ir1TX=d$zgsLvwhrblb} zNmhq>A<71zpS;J8aYO3pa(b8qg&Z9RBmnu0cmhZOQq)0;!W^r7K0Sbz$_&r3&F;Q| z8u<9=9iX{vdax1)2-f2E-Ymk}WUB$J`oZP~>WvgCheTAjHzfdw_C8o9Qb9g#Js`p- z`5M2J+p(FVv%N_Iib;OZFxoTaKa5<`c6WZC>@7mw*}QiP>VK5A5-=u=kVhME`_&{5 zaekh3B{tI8>H>Tfvp(O)IEvnW`L878$`SWYVl5(Md&$Z> ztR2*#1;23*^N3@9q^HknXKhYRsJj`Q8DGfCTfbuD%lKe%kC1sNP1871*mx3}|FVN&9FP_NhE_3+TkViHy>x>if%R~!Dd?l`sMUW6m=^uOdIHc{_=TwW ztIM}qNbZtL)dz0RJQ%614?(V&Y_6gz0Adtlp57(7J^6~tW!I+xhTP4*Ahy-rS5Y9E z(0Lm5)q0@FDyYI(iX*>R4Az%MQJ!Yfsa8%WOGEEz)QuT{N19PkP*A#74ePF)OMqa! z0GcSv(yHxBCf9F5p@Q98zt8n=i>tOq{}N29ZLXjsXA)hb&C-|O2wSPKc>Fj*KEj`% zc6l%nnnKDdL{?Q?ert@r3HC4c+-7j;QM#Rq$i^f&!bz_nJxs$0u5YSr$Vn$4>P|X< z3*AROv(lVW0{=_n|B%%*4p;+Ey{f%Szj<&*&m7$XdOHQPEY1lDYq*T#8ENXXuG`-L zoO&k#z$%1a6ltP>JVCR5#6Zm#5w4i+;TgHCJ+@q2!suG&+WI>E!iHxRAB3mW7a(2Y zsEnomV4I^?_hTg(M z4?`Sw$od$^@)>1rvE{bjR$;dKIAlFLqk33=3zkK#zGA-l3uRF5l++zoA}lfdFz|?T z3IOIFBtS=Qfg)xvS9)vbX0nXIoU&n@d(FHtDe44d9YdLrtc6H~fXkst3MqyIL~klw zXBd8M%n5jAgu{~1>cUR5wBLq5^;rS@^rS#{%gw~ALLj^ppImg+!@Y9QgLst<^|o4b zllI^dwqpMrYC4MOS}ZnByM~>KM(B z-ubP-fX^AHfBy~ZIu2U)4_W8s{!s_H@?evQnsbvHaP5$d0c50ep2}Ogrr`m+TnQX+ zeze!fkv7YD5+6bH>v!_*+4c|3fIF+$7_#X8%Sbdo@Y1}EHDuRym1%8#NvBZ5sD|}W z9yBC}Vno<*Mc>pF`R(VJFgIloBT12uX*ievhez#vZ4JM~sK>h}fM8?H|IlIhV^?Q+ zM-4|unK>lN<1>bd2*}>w$<=-sm4_qUHM2u=qKr_`6L7_0*4lr#w9m@S>>`MxwE$7` z*7AhwnC~Y29(qUG=no+R$695b-$BCK@1@(X%xU^d0UzT>dB+GxN0BWo?;aA(H87i3 z!#}q5RU+Cb{e98HpVtG&G_DMkKtq$cgmik?VG`%LI?Yw4sy}th*-MAyT>0-($`-DB zCBOokVkW(b1M@|exHF9x<|@A>%MSf2?^(fQ4VA&1G7%}LCX=}D@AY{~Rr@l^%OwE9 z{gAArXSs|IqKV+biEhrv>>p@ny#ipQQK51re=sw;KXxglm!8)%DIAKG>ffme{lBB|rR*#i=igP?C2mDdi?%ObCJyWnfm`=2{npoRNo1nLpeCp2pK zY41IJ%ogV6Tf3GaAW1nmFCs4ZFQY|b&patD#c?4DGoN2K`nXdAWd6$@LtM7P5%LdH zOyazkYV;o~r&}KGZ*~9&i0R~_n=$T{qdCN=Ox2~jYON)ib8e{v7+cI;CA9|~$%|Sx z`5gnFAsUCMNnc{uyokkD%40y-=;$aZy+{3Q_2OV3K5U;%?O^(kBlZB`^@yCmrb=TDXW;iQ~7G@RBq zm6_nAeUHXdbz{_f>4Q;u`_E1dat?oUM#w95t3Zso2b=u%H}gVdc&{WreA1BCIMN1k z3(b(~#=N-O#E$vyIk(^V>G`N&tJxS~!}+_6P}rFo#<8v9KC>>l(##%nM~NlYwkOjH zBt5A^&y+_Z?&(BfCgZ$jHw;#F3 zXgx}D}C`Ej+>bQhpBKj+hST{7_AX+sJ${lP}3GNlrzsmN{OwjD`2lMYDaB! zK5Am74G#~$@M663`&lS=l&ZvbKelS6niLL4hL+HdpobhUytuzxodpX*Dt(C|;#Ru{ z2N}pIC<$UM*8RZ3iPl9A6!_R9Hm4ognOAj&E3G;FiX z`OC+epeb7l4e}&6+rj9FhhOdC{u1NOD5-vc09h?_mMLQcWh-DBPPUy2+Kvto%$RX1 z6O=UNw$qQL_wz4L!V8=l(l1}yR^wqp!bUFw680M}LV|)Q!c-rXX1rWk`VEEb0OkCYwhWR;L)}4V4 zzXzAN%Jj9Dmd`;EGiOMMM_kpfJ(=BwVv5`8zS+>qgdq#tRM(dg|B^lINqNI(R7R&1 zwNWV2AtPdFWW>kWDBi0Bi@V5nKhyiy9+US%A&Jw6mG3Xk8S2;tT#0f)K6E#RHoqraf@ZlsYP%AW^ zwuMj-ttqzgcf`6?P|?9g&Z$ki4nTpsx}mwk8R(KLP>x68d|1f7&d~7VnT*=n(O=K; z%2afM7eW1mwK-SWd91rf4lJ=SWGj4kX^)aw3Qrb_S2hNyd+nXPEx(25u((FHaXa_1 z?TXpAVU#JV#{HlKg^#yU;;Rk>-lVE2f6*WIo|$E4whxbHvU65%zLT&gK<@F=W{$&TZ;VH zQ5_#zk4jkKv=EQaN$w_tgM;^f)ISc=NauH&?Mx#bJYhFK#dYGdWJe&|&AF*GywEN! z4}59~H#U^wt1Fsi_2<;NMq6NBc3Fr$NVgov1<7%BcEtv zImh}nO$g};;HIJJsG4tAx3{;aq!X+M+`?to@j4e0&iE7<6E6Ns_YaM{TSrogYrAAq zDj*_d{k!`6Z3?++!(`@Q%@ve`xA`PSo-Hz2j%goV_( zG$o|~eCu1}^GW-uS%&vIOB-Jx%Wl4_gs&WH@8HR=zF)6IcuaE8O?mXG-LrN);9?X@ zUbZ_Q$J*7sy}c>vg}+2T$CHovthQZ9a@mT%A_vXUSGI9}_n~dzRX;g$78`5`5On3N zt$6KV?>}s~*=nbpq~+a5P;o!cV1pSXT`V1j%Gy5b_;h60$!tS|5pvMO@_ z%in<x; zyei^4eN&M`TVM@jmhJ|${2cnjgZ_Dlzgt{Vigk)_uflWuDPZfoWex-PX}D|4@TUDx z%t2)H|W z2OpKQnTW_mYY9l_$j2eCCs?HANdS%c8EhPbl$(viX!XE#U25w=2!tTByvUaMv7x<# zlqq|yL};wt9a%CAX-VT)=cb&WeXC1a-_PVTH>Nay}{K>PJ2vwfrzVT!+Q z&n4`(XQGonqC+VRF{)L0Y_JF?*nt7Qsz!S3?i=; zglwfs&+nC#lql8t?Ndgoz7e(W7m|jiB7o%r&1PkBd&k;b4^@OJJqloKi(Ap6YCpH}Lkn=~*-K05-fXRu ze1zOi_9q&yVq*2GMwrg?2gt?$Q0ygD5%zu`Xd%%CrKP3I<6#1ZsVx(Tsz0*M&@7=e zlTtP|Ht2*cLr9#!1$eftt?dHV#YS!aIb3kBaQb;j3^8XFp#DmV?Ak#iUh}yZvR6DV z>se&Mvrf)7Em%?OjWGTt!NIM~Q6@WvD8>`(%{L4PW1y#vB>H zsKK#3Sgi!zX{+H|Gc#Q(tYVyOR-@&0`-?Wto91W^;n9DIl)lUnGgenyc=GAaMCGI& zXZ7iPqQ~Nh?HGjaS~9o5kgMG_ZhqV;L}7=1K}9z0X)30x51TqKWfWdsH>rY7zX1LV zG{KpM!|F3Lp*(ql2sXWIpb*Wgq~z`mbxRGxMQI4NB++SpeAV6oYQ|2HvuVe;fsBG- zNz0V>e>q8fjA-uwxf-*pN;w!iJG=4inUwN}F|$VUI!*o8phKbqn2VJalQ!gBH)0l|Yel*%$MyL829dD5sF2t5EK>3@<{=XFC!=z5J_R0E0W*K> z!@XLYE6}`m9%H+Yk)GWnh09tYy3fK{<>kQT%6osRkWZ}M36f^Us{BR1BCx$Dgod5+ znW|nth}rFr@Wf?c-TQAt;uZo!whDGP62TG-rM`N$f^}^TIs?2q2ZGwNw>o7 zmZQsIVv0fW1Ny(Ca!Lez=hVA~haE2Q#JMhTL)f#WI-22&L*+*J7Arl1EE)B_bqflL}sbJqMrLL1s`KNda&h#k06rj$1RO^Q-S`&LNnIW z-`)htr9aU#GGYW5PicKjM-p~_0rFGHMirD~e)>tu$6O1Rpx=o+**Dwu?p<2iCpLY# znW2B#g?t)S3ZrJYRo(ur%gJjarxPjXI8%9P6%K1JfH*0z{{v~|9#4jmt zROTS`<5EmI$O0R#wan3C$rqF$k)tIRA#-EH>@#!fraPD;r?G#1|Ngy^v{}8T+}U`GMICPMJ3_jXK$)|q*Q8J6~+U*8r?dO$*ocC{Q zYDUKO<-)P-3#$JU8PFXTB1Vi{E%w{@3S`#CRURJf^7&2aZp(c#l!mf4sd%>WE5wLZ zx4q>i#)U{V-LYEV31DVLTQNNg_=H6@m{n-VBjU?dw-HnyJs|6)1+^MBHZ}!hu|1pr zC6ae{PRt^O$6CRq|R@JmB!(7b1yq4A%ny{cKa^F5!^Rh7dDBCrVyuIOBgY#`T7V#kLNfh~gjs#S-BP=l zV};eV4sr0(+)&zTe|z)RYr#(!gLPLlq~_9XoSe!o#`bLBZ=<1;R)I_D%go5x8C%j$ zy^3gD?=yA2#+#4Ap6<_u)P6=wv-C(MF$>gx(Eo@mc?Te3gLAF+w+Xpu-v5y({8aw3 zN(@=;0nkby1(k69B`yj|x_>}YpiD5fj~VQEsNg5ydRR!p@aY*_P(wm-6|p!Qt)uaL zdiudB3s2vnmyqwwSrW2k?cU%CX35XWL$TW*)j%b2m#+1_tXNAPO!EPFdsRPWYCzJH zLISaW$94K!;ni4u3xW=sA5zL(`O8W7hHYDW`>;!jL3G2BYo;LY``20Mikoa`f4WOrtgOO{}w?Nus zaA=4RGqt{oKZ1tfScNpDFF%Qat0f?9NY02s4}cSf7c+&QAm$P;8TorUnq-wE^TN9tGu7NVkj{2ZJ zJ${Gr51k;}xPR5D_8w4RV0l-u+o|fulT&YVbKCA4m?Y?sFIYkYxE>PniTHT61e7BO zGGImvNJSs_4V(lrM;#^L__`+KDrae%?89VkQ~LGGfDEm3>((t9QlQ%E;(ZmB%?w>U zTI+1%eZ+uOxBc}#MttNNz>~#!LD9Y0C*JZotQ;B!-SomjoGT97da6BFDQ#5;EkKRd z1K^_H6>VLVk%pnW9OW<8Bm2{~;GGbKC}L5sCrh*3Cf3N?uEZD?SIRcd$Hn?H3fuKg zg|RcTL|=BJ-{L}>i~UXCmUakb$~L4~E~pxl@jcuflSsT|o6m6dp&99f|7_qiugzLg z3|#~{+DblsHO~J#v*AO}Pv=Q!n(hu#9;AZ{3$zQ_)`QUs|07Yj!!~|&v%)h6czqt1u=_%rfZ2;CC3 zgeJhsrE3r7ZUylpP>=ddymOUf^?e(hpo@MMMI+R|?^xR|Im1Lwi>b`mU8);nQ&;x3 zi)N=fVmm?c^e;QpcHE*2&_ua-Cr z2sd27ROY^mkdq<>^<}ya8vD=xklB;Ytg1F00EaPoPDTasAy7sDvbGbIkT80Pz5B*1 zB?;!p!!|xabX*k!Rqug-V<`#zz2Ex&LKbzgG<4N@-BVgf8Jryz*97-~kmV)p5O}p0 zdn`_07Q{@{5KJ=rh-O*Gz0A`Plsz2*Loji4bR@yQ7mQ8x256bgf*}uTEj#4uh_7R9 z?N*}zLs2Atkr~tl7dnkdh4JUd#}h2#V7k{KSBH%qYr*S;2ldyrBSg^){Wf-XMZZ>Z zmikF$Bnm9ulKYF;LxJy`V!op5g-O1%sKYU79p`1zzd~e}HFWrKvDQUlpPiy*$cw~V z+f2$^_e>{xm-GFR1cw5iy4N?Fs_ z&cN#wRrfvtX zl1Pr1+f6CWI>~hvtc8wsmJ?Do(lFVsZOd4pr~OEdw@%-kgLDjip%Y z#MTFrOdB^=qiH#51ky9JYLj=Arsh}n(gDG)*OnpiLrfOPA9iUyOJ{Kgl~RR{L*ikA z`8k@t_?KYe1B8**KL_#4Se&%{v+VCYPil57vQ4vUlNe&9@S0!-I=dSBsoL*&+BrIg zzk4awLgKRoFq+XqiccCm+Dpauz{XOuyDK&$@ur!V(^-(Ep3DUuhUkOx#DdkjTunRh zeZ%AGZgsJ4E$Pt!`FV_21}Q3M`(`hj>yS!hjd#mwA3(25!_W0&ca_yOgy{D;Ym3@<* z#P}#F$#oO?H)Le>_NSd9u8K_Af|rxGb#yFVU)Rpp)z_y5PdF1BU-!kwcomP3Xz2qljciGsQEOc)B$NPjuH-9CVLk^s z)7PyY1mY#MSD7c?tEunJ^zH8J5H|M^q!AS|wW39HX2jdmb;zLB1} zO8_ra2D>1#%bQ59!>%KLt5m8|zvdR!UMFR(2i)sZQp3#AgM^#WSyQcXjBg|H^TvML zQzU5b_H-$KSs0kti-DU%tZKJz=04ID_@Imx(O&v>7J$K1S7-OXNpfl~E-niBY&}#w zhw-YBUaIbS`)xkFnA9(ocGP+)Zl^UVr4mmBX{VTolPSpzlO%jA)OU6_epR#9>Elld z@^hG?Sy0+q$hm4%T!zi>M*@926_*OflBHzVtJyv0!1=+C3K#>v8|UcH{5lcMTJWw) zsNpQ8DBHBouMiw^r$qAgwv#_iEM@}cvtKv+mTnox4=&KP&-302zr{?D03K^7>YsbW z>Q`BgLuJa2j=4upA`L|Ee+lUa@0=Uo^bIBhUycj(uG~smKd!Bx$-rDQ5U8&`lQH^J z0$h%vk1kesNnSA}Win(gaV5Yf{nb@NDy-(vZIaH%mU86dcQ%t!4o)!_qGqztHLcFT zxOF!_{bEgYUJ(Oub|6ri0PZeQV)2w{eks>_7FrKTbz5Ox57sG9H)JlHdt#p1lI2k| z-Qy>6mWGu94bodDVD2svJ{OW!9s zZ%G)XFvNKkj{&zLJ6Um}v0Zq(k^~yxQf!o;# zCTp+$VsLQz?p;1grf?A4bg5l%o0P<%x~bYy6veLcHHc~yJhe*B-qXuv216pt_dM?F z(_*UFHN>L2j~xTiY4a|b!S<=wx$Od;b`B0NDl4VPfyN6YKqm8Y%0c_m)-3`b+5q&; z@ZTI35Ni;6^P(if2?^$xlZ zt>V~J7gH3c)!VtZ8N}?OFP%Ud=mQ|8LuU2Gu>@n_q>ecO{42F! zDK_F(uIpY#i)`FZ$(Rk8l!;W&S0ZY)+@{~xE-RkF2rp&7dl?Ffc@0YjV(fK%7d`?F zPp)fh*JTk=lNkzw+WP6#%Z%VstMUH9H06WI2T6R!$VlDu;ViOJr0mGg2l{zM6JTd@ ze%qaF$r8wQ$7iG_tNDI&23XMAXxeI$^kGW?rI>_-3JJVdRm}+nNKUnlt!<%4G0#}( zJm{KD*lc!IzlEyK_={Vhyj^{9NrDyptJMsd)K~?=l=PyNQbjc<9@G&?osy^$8OS{i-ym%?Zfybgn*Z z*GykV9z=i7#6Kdv1(+RZnEl5($|o08o@hNy&w&m4h_(Kpj%n#GP_FqPY1v!5n90Jt zspI13Dy2zCP%uN0|PuU;G=X*Eb`#S&^NeUmjA-lZ)*bA{F*nuD|@KNl1|H zaHwC(sh-{8c@GX6x5Fdr>g}xChGhdPZF#h6*_kyrIgaf}Pi{Dz)I*y&c_k?eAz16fV&ylIs+t_9B=9mw34oq_RHgq6qgWsDAJRhMy8Zzz%R06_s3c7A!ej` z$_HR0q<=6m_P3Gk_GC8&E^fqQ^5YCoBXz%nH^hBU+KHm+LH$ucF}GdsA9C1LZ8>53 z%CEinnGaykbe0D9?d!}ZNvxozV)PlFfL+HWMwX0pikYO- zjEpe^i^d~l0eObqkxrkfAWk&RKA#fFP%@MZZ^r4eKZq}&pP-*4Q}Yvh9%F# z>=mi5!ZTjq6|v<8QJ`%#cql?zf6@{7S`@5^^Em*=HyHM0pV#(xhyxQ>(6{8lLw?hq z`O2kJr?dRVTEKcHN&g_u2)M1Fo0#3{ynq~#Bf0UMwP zxtmm*TP(2dhG{^Q>+z9OuPb5zx;d58UXw<_QK`LnO< zF9I*;9I?Q=dR3{GR2=~B)*u$d`8o5xzIi1 zJG{U;`yX!>=!SuwPL*?)$$_K+0Ckcc`(E%GRh`P%Ba;>f^M2@+vU`AUeHo^8KKbT% z!wR6F#qqJ@NgTp*Q!?A>=EsrG7T0<-BffsU5hm-LE(h*c2heTv=R+;t+7UPJjA6 zxP3C8k0MH=mo*Y?I{qvvUD?Slk zy#U#>XuhWXvkFvu^KC7(T@m*EOa!aT*;O^PuPyJw^z^!ixSq8YIk=TsgYw<|n)`qq zyajbSk%8%-CBQq+Fgfp{E|L;jZ#T>IuTor3$Na5#&o{|)rqk;9=DL8v?~*SY>9n;|Z-#pdw|Qz?l_`|mk=L5zr)On~Wq z0hPhL2Mf4qyjc~%Qc}&9Y!5k08>3F2bbh003G91>^<~}9Z;|B!K0ixG5d1*o(cei#}D=@tq1)j^R zsH=wslX(~MiQ%0{QQx?GvHsP;Yqq%>zF*WxoqV-whYc>70$=tK3Hi2*)U5;$7K$vW zp2}wXIP{qgb&;fPnQX8!&!w*2$&_VuGdFNDTmZ++FZLhO~3I=^`kZ# z%oe17NYw3;9`M7qy>wM5y1cG(=LQ+sRtNd&0T$JMV%rO34k$%bxgG1k8*kaa`x$ew z{zb*$n9lj(yYLCy#5@tuch^1=L{A4}pFDF!uK(UqTfcq=(IaAtKy`oz2-ajM`-iS& z3Zc=!^O#<`@9g43j!u(X7kZB%BcpDoX_8`{Ts$tn_1K&OnUR~9#}ED}Xu-VRr0pP6 zqo@kV681gq{ltRt7ljFu*{Sp|vebp(nez1b#M3M5;Exs4k- zc%l~r-ScOzCLdug5fW=Yd6G=Q;B@yP-@)pH}u{|9HCY zK&rp@|CT;9@2wOKtFjXr$)+S-I}sAHLdf1b$trZoNLE%fxRO1JL@I>1WhXN$d;2}- z>ifI@pL5UqjORSh>v=t|gRit*4^KPX{GUkH#+Muz-VfY&-(S3uMUZ-^?z_uYkqO+E zi;x|n-R}8kQ;o@@114|oU0HigO-DVIzPaA*;O~bpzkH_GvEsXbzbGjYqrov+*qtXD zv_gHi6zfQEawd-S2j;HyFVi2Y?B#Gn*>igY*8{caA*5!?;}oO)ZPSuYxKGbE>ijiM zpoaQx_>yzZ$3}?GMlxMr4ltGZ-C;CcQ95-R!_35P;+<*gJJ*(H_wrtD;d=t`SkQJR z0nYhV7hm`ohAP8}*xL@jx0POz8+&u@28K1*)k~jw`~C>)Kr2B`Zf>Hp;~jj{YcT9? zzd|@AxkiHJvt{zAk?S$NKGwwe){j~JNX*((Ee04JV}b3P&8AMXSp8c!&l6p)prj2{ zz0IbioQz3d`ALPmiD`rR!wS49v}dz6+Q)WdvfuEXY2)j&A|Ufqvx``e5H9*FSO=V_ zp#PXig7f>!WWfNj^kg$XxjyFh-&{3oYp-q~tkaDD>f+VTiS^mH5ZWP1=1W$>78MrY zfBYVCV->&=&x4hTn$qNVc)88PKGO2uUz0NPq`ReynDDWw=hF4D9RW#yO(hjX6j?b8G4>Kg$&p&eMy0|4zYvpTh@ zK-O~~j4^RawW=>}yQY6bma^~noV}Rr72JS!=fLp9ds-IZXjTH#c#Pg16dB|9i;r;v zAPcQh=BAWSC0EZCoIIc|AE3;sR{|1YBcJ`YmDOJM%Nn$+-y(c|AHQI} zc0$V}7A$&(kNHYd_$ApxI6?2)T{ukkElWLK`Fm&Y@Wit)KEX&C5KAz0J zE+G#$@x*Ei17nyU50mLpD|T8ecqsXi0kBynjOTpPpBdae?UBK=KFqMi!AgX zp4wwqf`zPRg0PY|hV+kzVQ#l2RUd@Hm^wB@C|aCyVLc8exoq ze%tm4Cf?G5f4Pny4oWX1cMRJ=I_~~{w(KZG+JNe1Nody4F^MZQftyC7oRevE$M%Eu z=U$D&z4C|3yL8>FhuQu2{(v3C0z7i3L8L-TedK{ncG|>Yn78Sv%PbCSRJ(>Yb%2fe z{3G?s@WkM3JERHVrau?VN?27#XA-J3=G9Y$o?NZ#JPYx=QE!CLPZBNH^S{^J;VPPl zG`JccMT%|egvy9L$1k@?UpunH8@7^^=E#G>wvKT|_@~Gzg(;`sRJ+ElPf5YGGv<_y zm>C$%z4OK=K0)}^6G)fLTpl+ zeQepgj|!SzetDy$r6#cP$rJH<9Dpdh{u($vJBhoAF2ot}msL{Vt?|i42!)>ZXLG(% z6NHa|(AcB6S+`2L;yWL-$XQ7oNzI-QKQ|uM-ri0wb+)nwe^dd=eL}(0UhCMrV_`AP z67uwh@jO}v+=S40?`$C|$)P2-1u{Xc9Lc9*@w?Mcy6nZD@-R2wEAi{0CVM?iz|Z;% z*hKC6VlN9Mc06x5d}0>>-1#u12n;HGpF}Hotff8NmeG zN-^*i$_MazsR=id#s)&*hG-00gvf9B)eNcDR?v=>px^U}Gr4>qgWYK%(e-w5Hydos zub$1^;R1v0z*z$z)y`|Rv$yB3vu#ObF4*#uzYy{T$wv;jL)L1(eSa+ifhOvgv@q^& zWoa3LQpBQ>>32qu3l9u-{4wztXXni%6j5x?G;%!KLm|!q%Bo|3fu;B%z^G|6bs9L& z#l?SKml?ydY#bj|>_}gjbpqd^j(W}W>I8J00Hv-*)P%9jM)5x{nS3AaOw|0LkZ7(A z)1X^L%``Eh!S`70%=H3`D^DTT4|H?A0@y83J@v~Wuf1VE%F}Ta+*sBQxi!Ys`En#a zNVAtMJApPH*|!{gjca&IH-xO}h8<=qM~AXh-}Tn+EfxT-3akvDaQ$1tb}Fv?Bx zVdy3$FKEg4t#;EUe-I=X?=;I2OG!{jDg%TxDJL?6YdY>Na1#Aq_IPicADn+Op!ip6 zeXdoaQlyf1N`ONxi4n^9=kZOIr9CJVC}H}&`ZH^I3d${oOj!xtUH>uMxEUGZefFG| zRS<2!&2mLL54e5V!zF8Q{KJh;;$gKW$NZE{Bci-??8(@)mprnC!hT^1&r5CDX zT9xc8E>EB*t0~EIW!~&q^$`of{VhE2iD!D*fxS24iQTO&HP(S`DqRhDu=w2ghiG8gYV5 zBivvEY+1&t%xsgYpcv)H@f$>sr8IKIT-xp%Q~XDu4~1Um%5z?iZy13nlw`Qng3c7T zI2pX2KYs>CUM6Suj9a2En8)!&{7r^~14O2G?AhjJGYzNq3VwsC_}k;+sFNP&r12dZ zdv-JMJpho!L+0D3OAn780=qR6aM8TW3@o5uk93!etzl9T6bC-f&bG&5)0rnddsht# z-oAC;N6Mv7AER{D+3VOduykd8vSgTfimfyS$cJ^1D4L)RZ7h~>&db_`tr;#%);2Ya zNzZMbHxUjoIi|v4BgpwsIQ6uRrIJzu_u##K+=B(}M{$)FJn!#UpSo^KP`$W*+!)3Zp%q>pp{tukj4*e`2>i^RdpU5va*) zY_tQ!qBxAp81mbx;I_-~2~N;mM`x)Fx0Ea#G29F3&9T1Igzh$|z~mLYvPZ%gA`G}~ zi4u)X;tuIA?1qxW95W??4`{m8Y=YL-`pKGOunR8_`SqS$c|2I*0)n#t7PXjrhWptVz9 zel5EKK}OV0N#ooCqKcfLt98&H-*FXnFyYf0D@-@PKIPk+C>MVn_>sPLrX((xmz)3q z3`+jq3=xyuL_0I@G(pVmWK?oY+U3a^8weM<8oGz-82MY;nw$Gxr+zsNRrWHH`8w8* zU=KL3ENI8q%)WvYJ1QM9(j%6ZR9j7+7QDiyWc-%n3WkZk^!#ccPCx1nPDr#|YAA;6=KTE}ilJA62=t$grxroRJEbjXBkW7hvbNjz zT47>k1gPn7Vvq<@068E#a1c6a!`(WUozpFZZ}LETWFykSqQ9Uu)z!JWo6 zn7Zk@n}1cna~RHjC*y1OPsie)Tgw2SUL5}4wY=$R|5D_AxUxR3`^$6iG@10E8!H>X z5fNWD+hi5X&h4uY6%{@87X_r4R-cc;U-m5UIlfJk+W;6nsJ|wtOrqW$)m-?#H2rHj zzFiG&Nk!-B&Cqy>O=hp@^R!lk1|uXC08=kUSoK^u-HMAOi4 ziiMXRc5MCk{wlt9qoKwkDbIy_kSBrW`SlkEJ6TrEucDTt%#OhW7dBoQRQ%LGZ@gaT zyB6eIZ2Il+YDyN^@Qh;2t+_nW7s2$5Iqck7`cN5}`u6SjnowhIuQD%<@f}gn%i0*u zu{`ZU<)O+xA(wHT#qB#qJQv2Be~ikTJN;-N+j?H0!qmri`@Q-4bEnsqLhx zC|w(TsC-bbzhYzR?5l0qJAa8U5{&z2CII4hmAUySWb91?5>KzK#Fk#^l<7+J!c}qs z%CMN8vvb#}BuV}_7SC0fWz2Gxv<>US3B9zJtk13RT)a<3O;ddAayccNOQ-uX+?yP= z3-dEJ*w$s+*jNSBN^xZ+jmEOM7Nr`=tO_}10j>)UdVYfrL%MU^HnbWYVPV9e=jd^Xyg2PR5pa? zJQZbYhT+?n-$iG`PIelx~>l7nn5T0d{^)z9p zu+N%X7@CU2jVNP zCaYiC_;#`pGDd;mxD%+je_7KGG6#D%Uj(cnuvI>KRqGPM^7OXrFFQq5d}>!hZH+t5v9 zS;OZCOUsUssFCQ@b_bb|U0}^O4v*w$8~gqqh0oCDqv@gRG>d7h0=p-EMoFW3eyUeS za&v8#*&_OaxwXdlB)l7ugyPdjvv3S<4AJim}q=qrG!hVYn9p z4W<}&?!UVjs*n$3 zV$_t6cQ`vIY#sbl{lxzHYx*uf%+S(sFA&rqIPDoF_CUhvna{CEk6+PhtQ znZzZ$`{RhZbgL&@;V_F;C5&4+HO2n7n_l$IAEvUUUt#E=HR|}P$-v)FKI?liG_-bV zjdSsc`O|(%CwQM}>M-T#mL&2HI>>#BRVJ)GAW0eCsa(D_?CgG$E~E0rQZy$kydYG@ zwPg3QyX&d%Vz+B@4T(+bCP-YESXf!jrlgscHIx1rE5v(IVfFppzq2nbc!|L_N&N0y zuMdG|YDvit7M%Xub0YQd{DNPAKK*R93(tA}r>xB{&r}Uhl(`AU4o*?YN-swS4VeVpkkydj649Nn@ z%;nu6D3u)N%1|Ly39oO%BGWuSy?HpgOtR|W8+J6ynWjN@edXk{7YnsCo=3M~(|=0{Y{%F6H45GW4JDN?NGF(<97d80` zMOr=@WmCI|VLt2CHw$&eHh0OK6$Y;($e57RhpH#?JQwfar4((hk6T;?esH%Jr+dja zNf}gEFzmo|4J2<=$#2XfWH@*sPJnQZ#@AL=wFW|JreOB$YQ&`hKG{rjT3b@E_ZPN3 znC!V8f={PT5)0H)ICE%UseC$^HCUfAJv36aXu2Kii)Emh3bhg79PR~<2-AJ`>|LnT z67Yu?v@98gUyGQifT1Gs$?DLi3MeS9g9PMGE^n1f)Aj*`p`m4``r2595;?Pj(5OeYnC~&@Eu#oJjQjd~t zd@To}*g3Qa;6~ykT*jw^E@{85+xS68hozMA8}!**TPybDlwr1y<)}m~xiq?QNLm)ZlyFTfc<6U}|txM9mBYr=$X%yC%|s z%yi615x#l*Vq{DluRwN#_(VZ#HJI1+_m9jTjm{=L#jx-0?si_|XNBxHCVsv>)%N|n z*qWloV^df3d=XugGU9NVK3tgFjy-SOeUBwRsMQXN zEX0-+H4eFgRQ)}0s@+*N`0yX4tx@~Su9QK1Izi_ouQ0wxO&#+aE0bNSy45d?gway9 zi8L1f6>r)Cq09qJNw%yf7!gB zdFGX?)4e9|Nk?1-QFHJiqnKbhgsRLBqLnBYPZabMWKU}u^65ZSPWe?esqbJGrr0;W zMjeE?=i7fPE}(U~HF=}WUz>OknCbLT!utFDWihFJYvpjQ{Fq`nEud>m#PJF)8`B?Q zh;LjF{tviEO83;_{af=Kha1)P^!~g%Mc4&0tUH1JG;NpuwD5zpi3bhFTC<*pR;?ws zGVU#;5`BZ+PJ(AiTXAt@zn(dbYR%b>8v}W#2;%C%^L7I=ofISYVn%9mEV`Q)Bhac5 zs%}HgI$RANoc2jsJeaKW4K}Z@YYF$E4pn?ak=UayCl^4=HduIO$z2TMi1o>DXrqm) zgemh^%n@ZS=NH#U9l}y(_z#R3Pu%KV`!h1K1E4df=ErOmsgRCma=RpZ#OC4pE5cE@ z0*gH<^X+jJvSXzBi`N)DOJS33m{of@+8!PHnlK!Bir{fo+tAw?f$b^jPj}@yRPnh) zTSDWa5?4xN@sSg)K*JirNAdFgy$5qO{`p>0ynAaifNcPSGdZvmY{y!Z`1h_ZOw8t` zchT2M8$YAL`dAmkDPK%$^UjaT2r8R4L_ht~P}9Zy8Y+}UGxJzXhE!^x)YFFc2BAd{ zWGagDOzLoWr3M>4>$q$*fa0wIK%|kaJe>~z+_gI};Y*pN+fckY;~jPaEh=E`hnk#) zcj;Z?#@aM8{IuA+V^fTj749K{TOI`VXZ0j|SV&SKhCOyqosPZLEezyy6e3AMyMleec3=_~e&Lf%w|%(8E%DQRSdIY_4>u z8ogj{o)yH|ZR9-Or2G?LRnJ}vbROCUR~9CY!MPfah~a&`Fo)WQ1&ZD35?%vBy=%&2 zHYSI2-A-50-Hl~Pl+#P_x7QTx#nhc$A5zvTeyqF9)eSV1*87RIuHBHm(rm1)Hvd{= zX<=)NN3tT+uh>Q-6F^0aTx6RZ#MM1mNe)u(f+09}P=?^76Q&HcKMQqA^yhQ|EP4JQ zEYP*C@QH2f8L0FQ(j{ob9)-KjZT`Eq)WuOgJ!3hQZfNcJuQeH31L8!hOnEmlKX)`p~^CizqXw}kdUTfzX zzzMru3a@1O&G9pAe7KPi4$_Vv&tD_L49$(wK^4K|c|}(bQI}_<$FP)VQ%5K}CR77z zNj>+V3t98;e>G7u)XXtIVgAG65f!&GRcauq!gQ0J5Tw;VOwhZ2T~c#YmH&gZ*#TPY`SX8&OXL+i zD!~ne zl_6!P@{FEn1u$|nB7t|zM8REy8cTQnWM^s}r7N-*8LEI6Y}s6>EC`Yx?`s}UwlhjJ zY2vWRx%Fqrf@*wXh-da)v-j;Y{mX(7hL$pmIMZ;Ix{k_)v$Wa-jVov)T3B1p*|Fn& z4okc@g|@%D|FwOQoxKyhpm_yVdPfrlPf))}cl_3Ts@*bNMXvvQ3GNj!-MGEEd7rq% z!);Dwr%6Vcj+o!?NqWj6Hx$;-f&TrH9A}v4X*6-pKk`28Nw{BFSZD|IQHcUYV(3o@ zRPmA~DGAOWUWYT8T%ZNa&VaI9*>F=U#Vk$j5iF?#R6$lecCX3T+|f88^KfeT>NPhUh5ug_7>2u@KTz49|=Cg`^cz?&?zS_BOO zs(3;I%t5E!uPi0{MI^LSVGf>ITb98Ffp{#^x?Se*|E!w~xMbm?OcU@DaM{Fkq86kc zP*x9rW9FHdi^0pFZ1`hW*MEQf6EaRy5y`ytz#s>4ochHKI2-N4PA)F@;f@zeS0pN4 z_xAQ485x=GV^`~qUJFLewHHIS#@*B8vmnHRnUct8#wz)l8U^2Q20W9NTjylL$KfAH0NYs&bZoU={BQ{}szxi$c*G?7h8LA}8fXWwK(Tp@-qcPcHS z<_sjLSzM-iCi<0<+Umm3y{85?;J*&;tTb(|sj+M~{Tqpl!J2_&m$89L-9%CEq#gXX z65O17&_hPk>}nz(rA_YAVk7Nk7b#}s##u4+=Lcl7 zW#2%uI>^x_IqZgpZm>iaTLqmg#Xop zs{nb(%V|}s}v^tX>uRsG!jREvO9D9JpCz?s=*LE78#)woSdN6DgY2<&=rD4krots zAx9QR9NZefnSnuEX9$_$I3$(TLAa} zD8PM^ai7wv|5R^ON8>T|wpF=*x4Y)&6Rkl~AVE{Qc;MGM=@zs^D@19@SKN0Oyg^m` zt(oU%7ao$!RG>y&zC?zyNQ$ok{<|L@j$=9Mq}87_NIBC9{3q@R#b%noBWAc%V)_lI z2JWnTh@K%Dr5%{8vXO4dg7xK1;V2`Abb-n>T3cA+k@m1)|646i2XXpommWIoc+58V zOxkfx^eyoHulbcFkJhGF=e2Kb-Nz<`ygJJX*WHu z9R{s)0JFK@*rUTJmF^jRYF!!0eaA2)dSJgykjQJ zDs@oYH#*HtXwZjszJ=lm+OzJP9D@W^47_zOTZ#?R+^>=-eiodsRo2uO2Ep^f`yrCr zyzp!F);Fhv8v(^YI_$qnj4lH<(qYh*9yC%(I^?rDT}b|m1Wcyf%qhK?A^`OG+Usmc zW|uP@NEQsrL`vl@)6r~$`PI)Rpx6|7N3J!t4`eP(NA$&}rcZ z4gpKNuj*-3I`Bn|hJnBH~HZMrWHkV*Uyn|P zValdgmfTl*&#}X_4I3NBEDJFKZf6AS0!jzk$c6*7kGIvx;}?;3NpGdX`d)ASfBtHt zYo!VNzd^|QBPeu9nPZ?^|C(f30yIn}5q82SVJH%b4M_j>iJU9}3>_^W?X4yIt8ZU> zh_>>~o+I?}8{`5=ZmoO{F}u~|1V9Dn+}QWeMzCVaP|RpVE^*8X66NNy?otV58i)qZ zaa1ama@T7)fwWx^)T^=xJAH50VF6OOtR+8Z<;_WDP`~c_mBLL>%mIHq2-QT&J=J^} z=KT@I_`KTl0_C9En%*rcI=R4*NrU;d=&P1<7It^Vhoic$#~Ylm*ML-yZaO`ckIa6Tr_D9SMKwW^akZuNnjs8PC9Ui=f3uG%;t57RH3bo<*(H zn0o4B0Ogcwb;5IDi~uHjFEwjPn5?V7PO7a+U-Eo&>pDH(jS)MTuTtQxoU!dGZ~pOP z^u4MgBo=<|1ZVr*>UqlLl`{!!BZ!;mJxv0Xfg(^_kuG{-pN(l!AIVYJ~2QMTBz3*dw(&Z(+IB#$Y9GpAwKXx zs2Tv*@qX3Y1`i*G&D%jroTu*&WwQ}TP#~xWM#h`;o&z!_zw|Y|SclH;*l7td5W;d| zi0Prvr|-W<44rpT&z4DQqE`@@yq9vuM&~P``2RlO4a;Yqy;v)NY5g2J<^nrKR8x`2 zlLNVDl&?FkcKf;sWH}_DjA`;e(g(JTUdVVKTbS(rLml#($GR%fG#`$4qnW(Stl9Nl zG8F@|+=QG0B|%sO)IeXB%^UDY8zNV}UuJiNlVQ28@tA(=SX35Po2#mapPQ@vCEYB_5k7_rFef9-oR1x!BPOO$Y3@jC&x z8aKyY%&(@bAkO-=vXY5OT0lBm_OsP$hRS`wavV=pYZx-07lznq1`Sj`vx zDZ5tu9wHtADDXQV^!4qB-t8ZN{;>YbI6PkPG*oK41V^)J$-~P?yAVBZBmJeog0?CX zCL2DvjdHg@9=L_4T(ZwG6QFx*28Nn1QI_!A3BZLtr72Xv;Q?togGJ_tlOK?26Qwaf z#;*S;3kX3}hW6669!m~9lwla&mWBoW-_s|6SP`W&IeS79y+xLOMh+mM}H}# z#8oU1Za+7Mt&it(0g10b2y|APpS{>+YkJgd1(>WWgSFaUh?YOzn5&I+mlaXN6yDB( z$Ybx`y{TzwHLS8@F?BSQew^@>eh^;Z`e-y+1rEJ_S^3gevh*9%>*(>JAO(WPcW1DI zEILDhyUuWec|VEC#!pdEK0TVW|Kz26Kq6h9Mr&trbq6Nf!FT44fI?=5oeod=_y2U{p4+3obC)4o++m52A=@#oR;I1(Q~oGq=FbD~Z*1EzyAg)NzPIixH-VbR zR38^1rvXyw)j+?6fHceBPce^AfW65LY7;QR#q*jj`B!&h>h~pNDV7%Qx9+r)3%Qy5 z0XwStpksPp`7;s=J_?iA4Jvl)<&2Mio0ED}IWXCsQ=7a9NYlIrlG$x}AS1?N3eHfc z+vcqkRG4Ui(u1pCBSx1&K4-ESMzIoB0~FUIyPh9BO(Kv?5&Yt&}n=A zbrZaoNn99tskBFR>EjzkAgnB(mH!y~B|Jo>G%>ONi%^pjyr;+wa44G$ze0xl36W;P ze;8LwcQWM+g279c&zx1^1ed}0(G|K*OBdzOK-*xVXD7_eI%pP(ftA;Rb5*|j2BDZ5 zI}u^f4QOFrd5>!4ISvA3RrRH~{YzX71e4U8Mt}0S2*l*rv}bQW07x<1whc2aU!*i8 z%5%&NZwh5V5_C;);Db(CyufJ?<#Sb!W*hA&1-KK<^mDsY(tIxWT6bg3wVpDR1$vwZ zT$&(s_0clwdVNiY<(}UCkR_g>H6P@W5bJ?foL!&SMO^NFeq+1Jc7Zygl>*numy+yfI;M4yD3y z{f$k?ks+8_09n!qC~wjuc|b`}|Dg0R>r1HRk1|)=k&fJCxo2zy+ED}s!eZU0;klwT zUP`tV{RA`W*t<0Z!S7YRn|YuG#NuKq@CoK*dPwP^uK;Hz5&?FQg$b}ZD(PmYQ|VQb z>aX}#%Ee$@UsV`oX8e;k5t(Er3_ZP9$ zFo>yUNIG1wvU<@EeTa)xXVYLyZ&#(aCb6VCmlLQZX)lx^@nu_1jepaPcfhmc zpuD#xm5mUj4(dfUM0TY;`!w^zb-c%2pW0z5WB=dB{A9NT(jJgrtN%5ogOA#Sz2oOQ zck2nhRS2RUS~&u-v>A9}-M|R24o)FXgn>gf98C=sx{AP@yb;DsU-Ls9?t{U*UW7zBq%jL%zLAd#RVR!gR<3C>lN8^PpiPSKSM^?+KR?G4n1{I;bvFbP-yy~w0 z&DD!?+caE3ZXbf@{V&rOp-?$zoj4#VWaI%4F^L78ClGOO01XdpZ@(7s-}jVh{Q7-z z&{IDw<;2t?WhtX;&QV}H>4Tq)GvWJFp74v^Huky7ejcgQ)}+8P{)iJWsfKE(J@lGk z6=1Xmp56njaPnXKR{2aQ_F{QpiqN~OfUCV?VA4*YZG8i79WDHS=-iV2e)w=9+zB+WD6^Uw5=PgTG{wg@6fxsgFXvGpey5mI;e-L zj*}<@op=7N?!nbl@W%b+NrSC_58)L&4H7oA?7C|~Xx@(UOEL@4W};_8aDGI#$0^7W zQArRvBJ%vwtcmZ?z3teiu2IU-Prfsx(VDkx8YwNdf`@wzK zLn})lDyoBrfDAoUMcv2csF=T$Uf9XWj@7RxCQf#{0y+1P8j`#AJ)fLjFXE;&* zMqNIZ**t!;rM11C9=-k$Bm-kWYG2jp2s3NG@FsmC4J1ARKy1;SviTGXK(%9~k1fpo zJ(_-=k~vY1!rHaiB=jV5D*U}5VwL5&P8rnDe!r~-sKvR&B#iak|C$#g?aCld-7W^t z2uNl>zaJK{^H$Xy)NFbji((^~p%jr3zz8(^a(=uZg}}y3!BRS>X0|r28wC2(REqS0 z+U`tNkj3U%|241_*Rh-Jxm~k;Uld!m*Z)>;--WZC^v75{b0Ib6)TzHUdps#f;w6Yn zmlvWGOtWUNPSerQqx>O(m_FnB@re07xQq{9eD0!WXn0HfqvbBF!6#zN?Ccta=bYp5 z8u>bmF9hHbp~qg!_Qo&2cEu*abcl}=h?+x?52}IOH{H*l57aa(9+GB}gH9#;WAg8o zuW%kIRR(eEN?M>JKes#5L+IasPyPWtIt|3a_1}Jht31j22AKV8nEH%_B;~kh=|HHO zi`UF|6Lony3X|5hJJM&ULKsnta2`Z9=c`~4B&T0}g7YS~^WL6Q7rx`-Sfq=)n%pvRd zxnZ;)lp;4x+Lc-nHb28g7#l)31yY0v*tr%v9FQDO?PuKEyLCt1Era0DtC(0zM;cI3 z#AGw{@6H9EeKOzD+R}1BRc!EJkR*ZV&vi_U-J%V&V+1zNPT(gIIB7Ejf zvgA>?d#wjBbxVfh=5ezvzipI>KsQ8A08(UAe}@{aPHr{QQU~o0yl%c5&jJ-BqSXlu z#}#Ttp3Jr&X*RU8Y0;my0iop>1R6H#RG*bG^_OK5Tk}f*61w>aV0lJL+Gi2Xm1jcm z_lsNQ!tQ8KE?a@de^0}9+ldl#)yJNRgER=%+1eL8V~~D_=z(6XPTIl&8V(BnE+(rA z8EoyUH4%7wFweY+nR<7*Zof+2aBa^YNbF3x{ja$dfOvo^ArMbR4d&`bu-9j=SPokg zA{%!V_;hW0@qK*;;pVJH&hHhi#0ur(ulS|qdD zH(0!x0Mt34*Y5?sq(J?<&Qo1&O(FA+#?&dhrp72I4`LI>@V%9c+p%;XvHUjW*i88_ zda*CiP6s4G_X0yosQ#VApFLG>j^nafBEZ~B+S*heHL+rU>!VUCV1BV*I2H@(AOJf8&j3FZ62(@9^Hjq{_Bvg zU|r(Qr-Guw$S5}MZ%`mP{z|#|tW1Qrv`cgpBX-C`jj}{+5RlZ~FkLC$xf|Nu{hj>9 z!IH;|+T?frBb)<~jUACc54lWsS?2l66-h7Hk`_h3QmGrcI#EtA@toilW&V#I@%b>* ze3!!?yb}1FVL958fwPCU2FSuclMh2+VLuJ7yO5ktww3r!rGETh^Oo~vLr<*G{)!>9 zJSjkZ5H`Lu#%6|xho8CAB^o43Ao8RjDmg;^&i2W6l+%};URYIi!PtCcw#Hv!^N(F8 zo&G7meoi6tG{%~tL`*Y2_Ql>3G)J8Lz+PV%17QQ5V!M8Sd9xI&)pe2>iAvQCWApf5 zCnmic3q=S$1oVy+0#h;i?6;)QjVHTgq-KG*`H4!En7)gW>_ZQ}j>w8c)Jd~Qv=H!q z_a=uZ%bzYc22#g6PMg8VpPJk>zc0+{l_Jc1nuDP6p9myrr-2)E z#Dx{IZn?G6BW<*@;ZuWKL*SeLYU|Sq&8;KWvqzzMfBx^{j-oumU#p=%?PA4nf4oOG z7pQ<8^I$FOFfOXys2|1qG4_0>7*&G)Wd3KqHxw*S?a4dL?;xKtpHNwb6)0)q?ht{z z1ssFjXeZCT>-Xexad;VYl@${!iP{>ypfjSe0Lr~O%>hxi;gf32uiP;1>Ap@A7o}Fj znfl2_$hnIO2$4x%@~(sA5_gwSCVYZN?+fT%29;>af-TP?`mgVq13B{bnR z8RQRS+NTGpxcc?C=0mf95-fqE!!qLZy^?%0>IfFu@i|I&=&e&XJUNK7f-WqPVS+5Q z$iDOThkR~N7WQQgVO(FO{&mrYYBvGf);C>wFbcyM82rTYLHvuAC6J@FM_RKYYM#L7 zP%c#LiAZ&@$q(`oRYkH2`60W_M)vrg?eMFbxPFaS@-mODIbZOT$4}{$JY9#s+nYeb$Pg4Kc znyt|FQo#LKK-KV9BnO1}-yfdqL3ung^}8*%L-iRXzGWW(zK`$LW>@S1PM!SLtSZ10 zGLczf(Y3baTzFnqBw|U#YxL^JXysSboKbImOtb+3QP_agBY5rk&V!D{ushxK$id@(ddpG z@)CKcY9glPJ#~xHi>~R34EfAf6+6^e6E!}i{o3gaEXEWWfYlll;;E?{tk(RoHFucV z{=7lr9K|Kd*83mB&U-1!?2%iQf8!8?@*#e$n7Gd^^8k}DEvXSuH%?p#yMm`7 z*&wNYG(Ba_r7p8}ql<7b<=0f_*3P(NX!;Wo+A)at{eJUl!FSmAu1~r$HLwAvrWD?2 z!STvbcMrwdnv1{BJ_v#C{~FqYdV>+F_udZpT!O9nlM&2svRuc#Svlr)wUrV045R9> zrAjp+?m`uf7aSem`0pxhvLdaJ2_$CKEbNeD$JVC|-g*R;D)q(nPBGaq8Lz`0R|!O9 zyn?i`KRBjlw;>nhV~m^W|1lj_B;;MseTa3rOoTF-+}gt%v4%cBsQr1vl+6>yVF;x+ zbgh|{I(jNRYk;NBSP$PZ#8*CDoo7FADd3P()dG2q984~IdX0)$Zoai6A#KVXraT-s z3C)Xd95JR>>V$VMhR?w8ab+M?eP6%K<;ZJR7K31KsrJ_FL#)}J|Nh?ff8byMRhTj+ zE6Bi$PpEA{!Vy67@89YG@x@Tc4yE97^uLE&mi)=XCR2_c|JAQEZEff1PWep02R_yK z^P0EJs<>maCHy)Y9~ol`Gn8V*gW)_pa|UwSeW(dOn$K$Z#AKcnWi0j7l*+-q?%xa+ z9+$fh;M0pR6%W)}msv0%<3(E9z&l?NN(aU+@Rss@*z+~?znk8W!i-t$pZr(sKku8>{)y_h_QB_e8cg+6Pz=7MrGVY}je|a`_6FkxWC7JetlOvR z-=9}PQ40$2+|(lhu$0D9o-&*c`)X*JAZq_i4xCUP3ZWH=g!%8Du`(Yo>>D1!N@wqU zr9>r)&!Dn85Mq0GoygklS6MLi*J1SNG@#q_9V{QAY&`#SHKgnJ8br>forl1ePPG&> ztI*q8J)$LmhqN1NRDyA)Gt^jv^N(LP${|S1hLO@5@p?d0en*+hgrL{?4Jl>`{sk&d z13zN#i!CEf_#bwN--|d;B^B0UpSm6w0)O%B-1v`HD%gXM2lE{_)|L@xb|201;&p3P z>x<)DS%!YZuK#tCG?DDP;f}{43~wJ4mIZze7zrFFKc-%-!~m;s1LRau z*+)Pu1g9~(Yy+Rl`1*kFEfjbD$+hyzW~XO#AkN*JwKbKWI^asq0{{?zAio&KgQ+)! zpP(z zAi>XmoD8prE4nPtB;R^fU;{UbzY+wynWL>)K?uodVf9`$G_*LnAF`!Fep|Ooe3&xW z@;UY6VMi!X%z+z~b79L95g%Zaex)=YJ5T_RH6ov~Ek*F42whekO<6ik&KmR9md+_g z*%4Hn`u+lak?6^7P^{*+oGNz81_10-fLU=jAPUt+2@2lp1zbQLI6_Wwunt#w=q>J& zPIp$_%++Em*pTONOPdlqwhao+{FZBUf}jgv^4OD!Y=n~W2SSZIK!}${64#Q*x_>FGGlUmvVDL|$v57xq=6KyASPu)?EcY(DO zKCxhsWu0~a(8`VwvjEd{1BoVs6m>hb zOwex4m);O(G}VPW|Dxd;+4w>^;5ni4ndk|LfcuEm7k`urD%C!8nN}+50hw`WOuK3< z1&ziK*6RWgz7PfUIF3he)>qF$yz$eq%WISW`gy|7Dh0#_W)V~SSTq_P1_2hI^!GmFw@+3Pep|YTCr1yuN1a`-{C!>iR#8XH5(rcz^iB zSpWB5FTWou+l@?;DD5u{{Ta%cJ1Z^xIDm;h-5vjge9ckoC#3jmAQ{7$2dAW^+o@HBwnuQM<|}Q8d{h_q z8nDv3-r6!bT8qtccz29a`zrv%oghbUNB?*p??Bs2qB>~!e;`X)3=&^8ki*{Nrry0! zJM`gWtuZ-(lWyd1tjfZ$=HCI5%azGvS z22T#uj^77qhd|(a)G$vgHPyZjOFSsi5W>v$O@C`j5EhYCi`Qo|A94B4ii!Pas`rHE?F_MvRE z&7)DbRt~KBvC@;OvvL`^Z{7&qfW1g*p0fg!A36h{WwRRA=0g*?hUsdd>(1jl&QWi* zPj{V!RLS4S6JeajoN=O5ey?w|N#4A#*b8Rnf{Mz+nrPS$IlE@j<4x5-Dc^ffmOc<4 zu|h5;+m;=Nuh20jvN4sT!Wf=>H>mo9VT3)Q8p>*zo`UyGa2n_nV&jo4Wc*H1#=s)s z(+^c1%ttVde#CeMi~tIo`v~)mUlZSs(l?6kx+dP0+kiWJZV$60`8=9L8+d=p2;v8$ zx^SlZa(#IbI;3UNUy@A3yqzZ&6PE{I+zLxSXoVI)-1d-!eA>03ERWv!5VAC3%i~og-_}=P4>b1`A=PLZVX_KAZ_-dPuaWw=fx~6yK@==Mg9T$Vh zTQDtIb4aWMrw;$U`3erwef0P=t&a~wilzdITmU|;ZK>JT1g75}fmeo$VE8XgSVTg$ zVN*_)v(AoJ&5A*rj1iJhkjn)!pqmh#I&Okg2ZR^S+Hm`Ue;@z&C!&KYC}=hJkjs_vT;nMhYO1X%eB4Ii z6QZ(WSpwgkMnNI1```sj09eeXdu!WFNm~IcI3e-m)vimhb)betV+^T&L6H0M;kw#Y zZp*KS0v+pT)lZN6y_MqqUZ(95xJf5gh zK|Nugq^Uv99&iBP20%Qg!7v8TM=bT@eJ$d5)^}>O+K}u?GEP?Tr7&#bOqa^JZt$Ri z!(C-{;Xl94>p!zn;Z40NFBM+Tx+YhZ@Kto+MGYOVDJno2u#N8vzxRlgZI%i7 zE77)&4hc=gF>9NLw^;OUkL^#Kh}{FhFgph(9z`iekKz@CdAhq1JZsyiIBL;f9e5w| zxA#h2r?#0WO#7d3$^N=g*(-fD?#|BbHvU^}aiq{4967trZb@ z9NSW;yBt2BrjL(ydXyd13KrL65icg=qN=FCUp{@;A1LlvXlUrq*m$Jp63Lx?%K40& zUX&@s<8&C)O$v=PIz91Q>{A_fLW_iNJvYv_GRA=W`OBAI-T|$kuZpW1z^{PJ^w&Qn zdfVsTj@+oaSAQUiSAfb+JUTX3&s2lh6TI;yTZ_n6FGgY;15Ncr>=8%0Hy?$U4bT9zgh*IE*VAMT-z+;Uxz< z^V}A|%)ZZ#`L+K3X_dPdB*~mcqN6j%suPk^%g(O2w0-4g2i6MAC)-(@pTc3viY>37 zXSKe7Iru}HDA1@d%C%V94$kwD7?{Yk&wORP@cQ!!P|_9kQ&cpOaPU1zrxH$cDS75| z2(JK|5YAJJA_I_2#!C-&R*t+-%>(~vF`%*J(UeJgI!ea@o3hals)EzKJR3bA&=YU6>FD+t7)LgQvhjlNsCNETX7(=+Ge=_zodc5PC8K;#NPX=HQ+Y z^EFk3IadsvjOKioo#kWVOhb116)DFH)}DwW7MxoNje5yOXjspC)AfUk>3c^<5EvlJ z2vU$>5U)-iE2E@av%jXswa?z$er1oek93xN4jPfHD&ATk(^g;#)c|lKwf*tpS?xIn z)i*@8WuxKTr(rFv5M3Bu2GTPIl2bcSRSYbcGuPwveGa+VdWXJ-eq>&q=r{2Rd_>u> zrZpcz=xTr(Dz(Gx5tt+P75m{{=;n%&lG0%rpYr3d&jJoIFa$L;G@!CQ;PhANeI@m> zZfsgyo(mk|t@;9Ef|Ju?4l+d2?_aY`L~OKVUn8blZx+w8oM7QrCFm91*()zEf1eHW z!(F>}jUFE7U{YrvU6h*PR0^?ihoNKsV>a$indxW= zx@G?zpfFYj45k`jDQjZMG$qR|0%K00+)=pEq;s6;Sr zWt$?>w=;*O^mAR?3 zH*3F4C`Vw#4QM=X>cNkI?Uu{p-WX!w#H^@>9vki70jh;Oe0(_ALFn?uy(T)X+0AuXWzc{UP@k2ie%@25%qmR)m)-((A*rDApTPb-; z#fw4L31i~1JS9^BLp{Id21dp#EZk;=od1uh?+&E;|Nd8fs&`46W=TTG3Z-O~q>D-@ z*%YCH5Jg5QDwSL!E7_zdlugl)N>qg&ppn0oO2$>_Y3!0 zBK5I-QIsxdUxL;5{63iynuQ^bJ?RX6F`2C=PUYYdLci|by(@_<_tH=`H#cePe>iS* zYEWwTV1jAlj~x{WWmi;}#`YPBQ`J>|7BWD@T3`zGAS|8ia!r=k^ZZ=q>)X|smlcmi z45H{s$euI^l~LExpZ{tic>LPW=(q1WxMEvIH>SS*{j7?0LJq^IhWk7zyvua=V_y9pZ>cq|kur|0U})_RYu<7k`R^}#)!$g;sfC}(h31T`-Q1!>^e5gMs42wlx-O6{>Y z^CG*RGgxZN#KZ&J)VIkeKCzy?!c5{HNdl1lBwh;DJLeUmdv+lXmr&>D2Zyx8#KqTx zvN5TKD9LyBWl-lYOPFEvs${_G5YtdWrcgd=$IreCQHGZKc=mbs{7Qk>UbW{PD{Z{|Zp+aV->3?)tfoCgE0~sC+Ld zT$59C`HS#dnHNh}a$FhPVR>azZ0t65aa|8~^6oLU1|%ntq@7)iD}-E|pbMR|T&1Uv|7$%6;`(z>bNE=(xghms5kT9;AAMNlcmb9g{BoemR(oT!+xDm|P9;MDsu+TWVrb zY_pHvAQExg{k)=@SDu8)iZ?2c?klW`;xk{_a)!TQ{!~7m)awgj1AbVUloX_!*wn90 z51Z6XnOCjC=mvd~{C_jpY;@r;UO@sY;9xN8fiMkcLp^oMY%J5fNZIg)O^8EoqdARU zSMrqkq-%NSEv6d~=V7C4zVje88BH%37#O(k*j!li{{44nNg4!*88zZJ!oveTe>UOV z-(lMS;@WygoKx))p?W>LTW&+dXYCxAd;5taAq;v)EnR?Vkw)#zY_Q^iffA0(M&0d z^{9JClJu#AHsKmUMYRM@3->nWy^Wu4)1WxyCE6S=qdut?N%@*qZM;@VHn2Zc3uzB`-_bgsZu;%6jVvlCVZ8NG9EnwiniAB3Hu66G)+1p0?n@N+! zS!CzlxpPO)sPhLOv;^#Cr5(iU5Eoo^(q$|qlX>*%h!_+F_qDFeoSUa(tl5`XsW z8KqI->TjvWheV)yPB^I_VX&1+R2=H{MXmziJw6EPbW@Tq8- zbWZ_Qa^Mjfooq;XP*AHz7)$)29NdfvX4@nm7oJm@bbgmB`LHnjrYiqRH+)L+IQ>Sb$@M&WFpO@t(jjfJ z?aqLuATTP5j}s5b4#iTsaPrX*2482i+dD|EfXb|YBH$%#ImChN>}=>0cL=2txXsAy zY?AT>K0A5XN_?wg!7t1W9O718*{IZ-ltC_XPq_Q1k!2+CKW+pNs!?suC$YrVAcGfp zs$KWS(Hooetx$dI=EkHf*nD{L*(NEttrh}E?Iy18V1pyAiFNTuTAc1!&Ur|Laji>I zu?&4Z6yi{tv#U_atxJz*lk@F(1f$e{Cjq(`?L3%Vo!KI&E%!S&MyYU%6h!>6Ya%H! z+qGhj*S#Z1@)wNm3Xh_r8Muj!;UDL`i1k4Xy}!9A5TiIHwvLu(YJ=B&Wst6I^#(@I z3$@7yXVH*+3Z$GiXqudmW)~o6Xkj~bGT4H2mFnMIu67^C{C}`GIHt$E#!u>D?AlJH$~@JSof3LAx>cbWT!IHbw%8mn6QlLPs--I5Ri zlIQCvoo6FMZ83FK&=){2n43#y)_1K?#QSox559mg4s{<8Ip**Y5lI!G0a{0hMcR-_ z^H;%U>O((8Ifk2uFLMU5!tvzM5Xrs=M~>Y$YsXnBqOIX_*!1zvvyqtS0q6DC>>op z%`%s8nkAX6)mS)bTfEBF(D2$|?sdM+nt$|hck+eW(~kad)AbC}wY+2!V_WwDSOCXn zOg;@~n;q2Y^T5a8dY|AI>>+r8-1C>WYt1G`Gc8JNrF@O6&SKToaf^4CGhGGyBZEbD))XY{X zxm8-jegeJ7<~1=Qtj-ixIS8peDHFGeT8wp_v8LvQwmJBS0p(zPvj-fQv5ThG z*e2CN^){UmZtlqN&36ohcZ32nV6*FY5|+U`hxPc(pBRWJW9k{veU>jTSRO8%epGUO zEcbCYADZP{P`ppQa`OkVqOmJ+J;jAftoZy3Sf5^osr{qBInA?au|t*5!*?w zaCPosIQ4phwd7S|a3L?cHYl^+TjGwZJIzunSbzieXW0fM4BKLM=GQZ)vUuc2eDg(+ z+Jxq>3FmYBjik;5HMcET|C>ei=~fAm5T~aI z;{&yQ|6u!St&26S`$UqF-UjvdQrvW38rgTj?`Y0E>SpX}cNtlwe{R24oU;aL%)(|& zyFFrT+54uZ6+rq9k*`7xO-zo&Qx6PVp&u6E)R%R%w_0&-(_a+6i4=(?o*20I`0YWt zyN9r55LM+()CRJnoL5sri+%0SsmcSFCgtBmdrS(GTJNpk*^G~+OmZt_5x|;y+v7)z zlZ*n06!_$*>)>|isV`^eO3I1TdJ^{(h>)3-mgDfSpxNQpY-8m#04wxuJPYx~#mYpn zCkn)4R*NfpK{}WR&Exn*)xL1-;p(DF=EXs6rA7o1joSuUV>0KbrlpAy&LK{6MxBa( z1w7H9-Wo}{^d2cW@8?nwuwq>=G4>>`sb0r8M*M(z@y=Y`acu?f_v%=FL~yM@O!I=( z)Ddu=({alea{KM8)EX2A>3&ekNXlt?GVz?>Nda6%k9liS_r&S#-MbhuwadXBvOswH zLvq;?<}GXW(P0;+vEnn_UZo-_gV$8jZj>)vv1yUEjt++$8=LbSazz3iyMWA2fe_mK zFHtX5%nlL|s3|Ivt|W27l&q$y%~((6_(p@z$jz|;VVE^%cLWQpB&sNO)1Uj&)Uu>* zwY5z?twZzNFjm}nkVaQ(6{1i=RI;7!<$le8E@iNGzNF~)tTR#pEXR$miH z##;a!OcUm8#pf7lre@0GYB6z(HLb;)mn~n;OPUU)Fmrf?E+rJC#7Sp8HCNXkAJ1#% z!lbWQ6y^lqPk0TFazzTb?w~nws{Xz`1It?I2MPBAc_UzS02XodW(biz{gk1L5|_3u z!j;s~KXZxUTD#RQ%#CnWgXLa-)&ktw>k-m(g6urP)km-s4n@`?&BV4Qs%*z3JuT4m z5M~SV$EnWHWpTwvj%pBb5Zq!lnm5A2&XWa#NO&JN79{P%H6gf)Z-ub^6mTr);Bo>! zzp3h(O=#0 zhOF435Jq6ND5DRIJJz5C3g8A6?gMhqdi58qRR&}ppP5-LNG-Qujt?_&6#=!}$rYIH zN^aVF9vf*+{2PzS=A+XA3s$NA>D%+RWAgr1>iA^02de$C24#rbDLpuY-Es^@mw#)f zlwJEAv#YKV+!O*f=mQ^wj zb<&yPUMIUhJ~+f74LSCNh=_`@&}il2?spGoWpM30)@T^FhCQPTn6^;+y|!&O5kroWrWkf(XV6@Z-( z?6Te8c(U*J5ap1WTA$v59^|c5|mYl~zfKEOUN!g<{9z&~ZMB1eCns^NkDNJ(< z9L|Y0!6+eY6niv7W5Oi#Lo3m~p~4Z{%iFZSxu*#At)X4)swbuqwZpbk9TEby>coWR0d9bS@r=hN$E(* z58eZaajYkTuQjkg>z3lv)_|1TDi?=gETHf4v+yoxa*5i#)SlR{N zWM0_TGGl+7d4b*Buxz4)-xib8w8Wr4$3wgoEj?m<%{5p;9!?B? zCi)QYEZJq+L?SJ)C|EyA1|6dx!NBI;8gw@&q&n?d04gBE~jAhsX$WDw%8Sf|(;#>$1)#BnVNJ(7K?I z06#x-Q^m`jXp`feUBwSs^4S>4n~it&NRYH^jwG#)VR>-CxZsKcB)wUr1L8cYXHEgM z@EyOmtKd~IBGG205}CgS27Mf#4l6SJh$3_B5vGjX=v}ipRo)BRU`W|;8&kiGB>yN! zh+#QI#AQSvvGAQ3g63@V-wm=wl^$S?Vce-hAi7%-)x1q%ZNZueVu!#Y^Xs9K-HA<| z#aiH|2hO_~ga|xHin)^TgOLY21^V~YmU(QkPl?RR?^N98M|yOqSsD}SiF#|gp{PI&;YVoNne<8Hj#31~_FCO%Kn zMKC?d3Nn7K9x1FE?aCk*lK|62;pF=tiHPlQLu8Pv{a$+Mk8m=Eyh_9VyCGL04IPrj zjaKPLP#nBv!*A=~L@UZ5QHtEL&$)y(I&UK98+G`mq+@(1N3FqWzEE1bj6xWs{yjH)NG{$gwgY zwhThS{4+t=yeEb93p@H<+Dqd#6Md~^Y716us ze88J=pA1mF8}T!1i^sY%7RqYZaX3ba(3DgNNW%N63vh$O)GJfcEw)iUvb)!%vbgN9%TxeMHjE`5#MOam9-~CLq0KO z5GUQUJ7|TQm0n%V5vE-*J*c$B(%1Y%rZqWb;3R!zW#NTbpXi@e(6+?>#j38GqjdQe_S@qMEY+GI{54@GT>%mFTXhW$@SG zA_;nY214V`6Uc&KnAmy47t+A6k|(2yR9ZTHPXASw@E*a*j0ZP?_xf%K;lvyqo;aU5 z*Q&rb928JaQ+Cm&s*R=IUgK(mO{N9pT7`S@;&5s6&y!Pei0l15!po*VoKoE+Z>e3= zOcYLuCLx2Vv^S$d{2dFw1c0c9ZD(9ULV})&$!AAESA9DA1&TX5xRP5;!X1KrluOk#*x-!rE$#&h0g!rPYwLFkU?wOvrj_&@B};$6E*)1ssvk0a(@1% zyGVp^fnH2dhlOS~QQc-Cu^{%VoAkD;_>WbQ(>e)>`NYwhT?E`QkY973x;f@n6$ouX z!ll=OxYF=*j?qj3F>IlpKAmfOXTe!KstsI`p1_3HW!DqnbP)~?ewzSa;iBq+_-0~H z8a1%A8MCZj_6e!x#mO<9LskZo(>F;f=w13oSkj%YktTH=dKeVa-mVjNmwR*Z1k}KG z=s(@V6I_vmCsUtB^K2lhYbuBn*Vg)wlJM`-)7L-vxAkiz@nABY&OE?eomT@hy`@dz z$J0WlBu<=-HIkpIE+gV#y`UuC`aQ90v-bf7n8BLWFW&Ise2NOfyl#BZYTAZg9lOLh zRGU$~lp4XAk)qZOe$)uqpft3-ng|*kcT4~n|ERJ-@yLl=mAipkTEn?~4!E`O^BdW_ zZ(qkj^juEDWvLWRKU*{9W%ZIzBzJRISQw8wRf;^>Kcxm805#L4*2jAH^53h{3s#%V zZv!-h-H=t+OL zBPXL>w?D%5FyF}h(@6zD~e8O-FwTi`!=!%tm+B$6fA8n5?Dj)w?~!tS(mmFYa; zSZM+O9FFAVdCb~c*8|~VWdaDN zqB1rqnSdt&y&~K=!Nt_9Q>@| zo*siw9}nbv^Nr%I!Sbuin%u*i!aZkD&nLZUtA`dx~=$ka@J0|2uQlkqH_P;*Sj z)|wQm-&M{2sTU7k+rTRsMIij-*Ul*H$%Fw?xbJG|*KqW3#NwcmqDg=8^*3ZgUtg`U z;BWg;M08$tRp<2nRTCGYVf}3J3Sk5Xmz3)99wUz`@ZbPo^Y|fL&#UiY8yeF-|j;1Be=i&16#yTeJ0Yt z-bYtgUK}e-$2;H=akKjBE%*JEj>KAOPZeSlb_NX%@r~n4$SS%=N@0qed-?BHSrPae zIZHPFD~a5D=K=Ob?5@hwsGaSYAwnB#Mm*~GnCs1$=L$qt+t#pZ-D%a7kH-M6ehjDP z{n$uFLArTc*4mIXV6rf0{_7$UfM5x6V?g18h-Zb9n((fA-lu!e5(!)DZPt=oh0yFW zD{5N{9-xPLI5OOQCw5mlLM4k&N_sk7==x*e9R!EJTC1-3o-RBwEL5+Uu)p(s?=W&8 z@&cA7za@Mdju@t8WqB}?(B@Pe|513%Vr2rW|NGS67PxAo4Xd268!^hvn!7OHO&{Q( zQz2;@QGRw>K{1Q7P4Ua07;fYM&Q5;w2>BlYBcFv1+!N>PeUGitDk-;It1)J=T=Dnj zk35hytSVWBciOWYXD~ZInoTe}(ZC!x4OeZm&22imTLzK78muMs(-e*UWRl?Pd=z`v z2_pLDRW?OnYzqKB_HR6e$lO7k@6D9OTcZ-E`lp+2{&D7d9|8X1EPyEc(|czd3Gqj`kNYn&OWZ{Tq_Ad6f2~ia|FMzZ--7vN zS!2On_WA?gRX11kFgi%L^~&cM&g^E;sB!SH3gBY@{;K(%#rN-+5=HJv#}gYXf4@w- zC)ITFgZUgF+4%Vx$l6q1C;1#A_Gl06NcoYE_KXkCZ)@rjxAQ+n@VQLrc(YiYdn^t_ zg9CbxbX*vsEFua^P}pXETTbn66!yT2@ss2=^P7IIE(hrnTlpxp++D*a$R8$to;`sJ zW%Iy*2MtiHV+E)-1`I&?|73(i+v&w~A;d6IkP-~P4}P={#G z12kIU^S+0|;yuI=>l!p3sa_eQ2pw3%Cy7e)$!;ZpQLE--Yiov||6W4K(9|Z4<@Ntx)RedFo*_!H^RYSmiAXX9Vf43br`GrI*>%v&+?YrBy!FFx#dfMY-dMGn*YocQfk0 zu*@+>gk}u-h=aMU#_9#glDbG+Tl@c(0Z&_>hm8KY!^Fg3doskqzTvy%ZL_zk<9DC1 zq}JQ&LArn|J!XhFp@?{}W=c=&EarY_Tz&nrP+WTFa?XfE$NdJPL6kEwV5NkW#XVoNDBUBGW&kQt`oZDA9Ct@-_ z3)N4p?DJTtmq{MD@xDBMNmf}1u7|v8$W#QePU);LlEzyXL2p*9gQCYqJbmC&Asru< zw7IsxF&9%|Y9rw~r^XZte*la{ywjD`xgw#hGnQ!6qK=|u*h9^fgf2}xj04bI#l^*I7I3lp2dU$l)X28WgH1;;+}uj$ zsC|UIU&|5fAZwCzc6tZQlwxTk=pxZZrppecy+qqXFkhaptJDAg+9uiv+BWIBifO(p zB{#9>t#3&V#IZmeme#)m7bLlSbg&wG$(q?BL}nu?2BljH7|;v7>G=^X1Iwt{HgQ@| z0%yTHYqu1Hm`i4GRWO)vL_Z61f(ybW=DMnz~h4R`t(~@E;k*+{D2t5 zXm4U?S<5Ggz8b{l{L+dpv!*9vh6++&k^S_pc5Ra*I)1;BxhhfVtxri2;oX|9NKc(m9n7On z48t4vyY!La-Va-dMQUn5X6oQ=R?o$5Lz*qTh_Qi#f|}Ilr~7+K;FPj%9S5Lx@|%tO zQTyXqmw{s*cJBe3!U|W*ADIsyZg>q_$-m}cfwdZ66{a%}>(b|rIT#j6aZMDtHSXyF zaD}krk>C9P&ouunfRuu*?TW>4(+6Y$AmJ?k>QkFw?2(dtnc4x_8hUkSqN4K15HuCy zO%DVdKfjp-VA24);43k>FLo@8J6Rz`(;f#R&~>r1l!PXeUyKjSK2EL|#-<=$jWugU zCU%nq4aLPx)6GG9?EYNZ;7}G@xktIjkgi; zON3bW9hQhOp=l4o;{DdE1a1N_94z>|Hw-N-h|c1iJqh&Be(BVOV0#XB(fDB z`&Sj2B9<|VnTc(Y;5%6S;g=HdJxx)n|9&$`_&JFT!%{XPjw2cqVuI7OZ49iivaZV8%7O>Co#6E13-YjLwp4M*VCmhz0pK-j2!Z$|G|-^l!b>Ecsh9 zIjv>T;>Eg=g~=B{_+^fH|#Tx@m3KB8gigN*36>#AWaQjxlnfm%~71wgVIl zSdbS&^B3d2y>i;4?t)`cq-T8CO_#oVlKOCz)y6-){kIfu zEUlwXQO^9!BQy*e;nv{&XnH#kz7PLqkECcLev6BfA%%7p^@R&3BU?^r?GAJx4UiJA z7&Q{M`S$ZmCyBKyF zXDuBHviwv2uVv&Zdq8xj%ccF({VTi5r_ysW0m$s(+pJc_ZvVB8YKBq3-Ju}eip2e- zZzm$F{#3q-%7#y2r+(^vr3Z+!?Z}TvnMJVZleDFod*6 zA8i>+Xe9H<9hu^VvYxQ)Yy&#I07g;rn=R+kUa4nf)QPggp3KvE&Ge*Pz)~yU{EGST zGMD&ICu(tO{C$*2@^@9KRN;MEzU|L3=a0Z#o3K{7^Q0X3>&2P<&5i$FI^tVGLbZdi z!|!xeI2L1~fO^>HK6kZPTMws%3X;A%jnxgY>u|Ow+lXt&D(7!FeT_l}G)J{(C~5#> zBXJA;_dNYId7{Ve(bHq|-0r1$j(4 zbphSAf!Im@Z&?t{X+ZI7HAy@>y{3h-N0@g%yhJwQMM%{x@plepa8njXwC*N2MxSnf zvhCyZOtg477s0<#vFwVaB`dsNPp{Y^^fMcYI4+RO_TOXy>i|OjUNdYUT|()_ zbkR^!l(<48=X=G!q6qjUjMUiAXQH~N4_vfL=Z&{Q2EaD|%@W~+xT;%~`pEwJ-*a@i z|JU6Qw7AR2FHHPW{&kXFrdak^YiYA)*zQN(wQ>2=N2JL<-mYZ8frO>apXBr!nX))} zdM(nqyB{%?pHSj0+EupR(LKujqj^fNtWKo0y>URtL7sqMvolS1&e*&%oGbb6_+A;F zw1jP1NA}*`7w`7wWcr2Ao6a%vf3c@;(By6Oz&qTm~lNO zM)-$o^|#aJ!DW7{@_&pERgJT@2v?+n@`Qp)=LU4I87ChxxQv znN3gw;>)}KyuPKWLmkA551J_>J04DE8To?A#uR$r$p@?&E6+jE2q6BF+tOu{6Q-=E zORHV9U`~~c8GzS>gnI?CHa~O~j^lF^)f5 zsI64M$#Cd(sNcieQ*p%0u6aoFZoH#OS5hcKlhQbu}O1U8l>$Jx@- z>Az(8hp?qh*Xzqa^jpnxB0VExT@whh{;xD#EC^MuhFENRfhgXyGnO_{{Kfa{puJ|wuMqOiSwE%9g}a3L}3i?Yl#2c!K%s1 z3VKsHgls3ajr9CBx4!uX%oEZrlHjteO){BM;) zxP9);2y3~!DpgI-db+Q9T2sAKKDPQuc$@$0IluX|swyex@H5Ibo7Hk_ki-Nk?C$Sh zNb+I7V(p>FY{UQ^H}$7;j-KbCq6F7nk1$VoM>0RCYKqx5z^G<6UE3VQ!BYBBz#h*- zmK&feEQciiLu>c;s(ehSf$!=s=cXt0zGe!nH$1A0yrb7t?eCxiN!aq5KF5rBM-bF< z9-F7giZvo!vF_vHmmUeH*KkE%t}ha+W~<6YjMD|cp#{@r7C476Qq?BX+d_TJ?G(zl zo6-&Kq558PSDGtUe@#GzPrB@n3->hYGDBJpR8(mD!#(*o=;K!$j0E%Q8C9T_eMCYD z{}m*b;z0jMG5HEG97~sEV5x(9lgi2t_MbLg`LP z)=!71@#pdMGGd=)4{kuN3mYB!{F5Q@TRq%4gCmIkGoH(kw z4uMmLd1ugXP93tJmjjhGmu1b$oG-s#tWrERupxzA_W>59xKcqvsayB<*<3j4${u>Y z;NKt+DXefxqPJi63C21mR3B$zQ>T6uyN0B}dBUoV$B!I`FX_%b7poQjmeaadJ)5s4 z{Z8VVKlN%8q3qKz6dQaQUZSY!VNWUKHeXhLAV`>Ly5 zRr$y*^RFE9i$5oy((?VwMFEk+VoOkQ2d*s47-5D!A4RP{%!r642#0|Mq5?4GE zf+G(AxEup;`Lo`oYCrVTf8`26_aP;>e7DZ7X@vOF-Xhm?*|o%#5dOjD3aqJ?b8ht> zF}9Jo;;v;EO)%o`LAooe=U453hZOO@ljdWU<0WpFU44BU+^VKTqYPOEeUD=XyQjf< zk6KpA%Eu)mEj>ZHqpcGu4H(LhP(%`x5y*TX$5X=xXjc(3?Ssmq0tL_eJanc5I zX(}VP3*z3f8 z5fQhMkH+N_tGcdK1nsLZnM|Hd9hU66Dey{d#CFw^s$N*NA15wV)vG(3b$`^T5!ZpP z{{D^5RauX2Y9mTx1e|fTdpqaa=HNypcX#=8QBFjvWmkq-CMN_(PZyk8vC=(2Z(}1u zB6*Mqmwnp0qekpN7 zDVWe9rE9B$gxmVr<>k^VScN8>2j3`~+EfMCOjguR@t#O=&|VIsyA|%!iB|i;BZ~*XgANch#1EJ?L;i3%K51l;_fEdDYhCodc=ui z;v?~#DST!q#~;gsOOPyB@u$nOS=va1UE6LKO>D%YLiMAyGBM&|eK67!zJ0T4YulK8 zN7aq^qN2vz;vW3AGqF04@gk9eo}QlNB$-{^^ek#oq{rBf_Em4VqEvP03O_YdzS>8- zUYL_edI=qtd)nfvx^pTd-zEEn?kz+V0~Z)iu#1sW;2~fdLct17vBu2Y3hI;@2L10A zm(;hzk)T&nu0+vAsP4AgpWnZnk#47Gx?s#!8jVJBCZX`qW&=AKJsV*%{at%I**SJF zTAefR-gO&g)w#+4W$0RxKWSD<(~(P;;OFwm+{ROjd0jqWP6l4;3*=exW0j40j(OO& zXHRgOem^tKft0nh@ib+ccP`-AkANU{C<71J|Dy^&b|812mAJ=|U2lzdMPpd7lYOdP zSMQD6Ynkg6dRz+&~zazIj3}fcoS!G+!!$mE!)UJ?Jhb0%EXj{>_ zkYhg_GB*uH{7+hlRV>TM#DvenduZRR-+A$o>}?QkF?zh%YivWn|I+@v=j4uvCd zfL%zsg6A{i?f&LtinrG8xz!6MZB{vwn?6A6W#4UajHd#-q_&bq^KXI3Oc?6Tc2mXt z&OJIa>f)bhGvZ@Fs&fiqa3;oW3AVrA1IdR|`KKQ{3%t^+!R%T&hc!Kq62yK-z{rnF zx7nB(_O72dvd%oyWQkH@ zo8aQ8JjBkWZKD{y0_XCIW=fuB>xqrEdJUgG@sis)dwM7_0BiZVL~_P;uflobyvFMY77|SK5Lr znkHi#B}LDgQB4hF4-XHBsm}4!y?c(Jt_5f5AM$pc$FaW0T9ANRy*!v`5rH7g&9Z9? zb`mL=WT?1p^RPvMRB3kDq-#ZDd_Rt98?5851*{rfT40M=;7flOta}zU!cx30L7@|CDNzT=P zLPLq=K7YQgLbR_OH_P!v(C*A&bgM!aZGTqO7$UXRu(^Y8xs=vAgH?GM;*dJ)rkCYB zQWo(26wX*Gia6qq4^Uzger)+>zlo>`KvJbusqLWtm3V4Kmvu~*q~?7XVO#RPK$Mh1P<(#ZK05&pBXWHsKl#bO z#ga2JUJ0%>j>5ydVF*fra$_4$kKEc(tqNlhtx%fPb=L8)mUn62 zsS(|NGW-$<4K6&abldHgCx1O42Wvsh({PP9W8H;*tC2`iVOF%wyW@0puT5Isdvl4- zSLLKO60g+;uZI)H(``2pUjx0+yPtPCi_j!`HB*8T7TO7M^q6>KQ{TP20Fx%Yi)#Pz z^#czMURb>=`^fr|8^Z9DzuD#I8WK!FKqjkQz_qGpd7?^+r4LPHISFUum&|h){-r~s49je1Z z1ZAyACYm;#fx^b~`{B{;7~){VyeuC|*K=}mBEbiU5s^MX)u{fwbTIY@PqA>8Z3@VC z7`o6BFF#UJ6c;D>Rz_xFl?dxDtgIviJYVR=nF^5@v^QC3!?xa}B<~yPxw#FttWsSO zAS0>>Z{P6B5DgDOr@L#PK8UysV&=omVwTSuuqvyw>LoUhniDUjEd(tihc3PGOz3{}kcXJxA8k1*ehJaf>kzX2!j`2{ z%zrK8JF4SPZ{JuOhUz%p3)P>l)u=Yr9x#do`eOE(8uM*768c1h5xQ_*@Xh-e%M&vj zIB0WiUMvwp1`U3u#~rLH2b$#HDj$-iH<={n=o*1%OHWeXoF~?KQeVHUiiv<>N(kRX zRa~h-JeQ%41PHzCGhVt6T@3>pNP$5KJu+v174pR4B>5IOXRHDQC*r7c3rBEVq-E( zz^DH}RE}&@54yT5pFcZ4RXn~moni8|b>*}tJ;J0`5-vs}Gpitoc$n|BxJ!#N%?LyvUUP$d_f zh1)dG?skik+Eq8tV|Zq;zwBh*9gJ~FhIhN3vGM8d!H3eUw?lRlmyE@V!lEJ$QJ1Vv zU3DC6X&Jd#e(w*Fy9=nBg>Zlhv2JiGHB*F?a6$xL)I8)A59KQa(a6<;335!C05{@bGZrJW*suEy-gx zSdZmNFvpkG9z7RZ9KMRf&(&fX#CFJgiq~O`u?j9WF zhEbluiBmM`xtnU1QB<^rgeO7*iC~H0UH-uEYi1hwD7*~=iD$>4TzzZVFoPzZ>IoxR z1(XwWRccMXDAcK~wmU2CG*7jj^JdZ`W(#6&;OWAy;*+eoIlw{5b9TrbANhv)axMcLKkj_ z?X4H}s{^Xu4fi#2XO;|`L>N)~XW(;0DKnWYoB!EA$C6$q3)AYd!Xs05XvK2g$NbmRqw{cEq#itsN!6y-cg_5o5YXS%SG6v$del@!jI0T%PMh|yxNXY zrT-v8rsZzmn&-y)qk6D>AYANh5DOo@6zWs<=&_+}^YJC}db@d>k{PcJVG z2$94{qO+c=_|kpnwsMjvcX65XnEcY67~5;^$T~F{k2v|{fn;(=!lX#_(R0+3_V|7Q z$#x^VeE-`>WstAh+C?&ctXb>Ov5O=JhsV>&z0?EwcxGrof{yMAaQyWf$p>IVsP1yK+tmTuGIK({c7<<4)ocnH z^xI0&7+OiZc9gXZ6Q=PM+opWl8!ewYkdD4WY7@XaZI(ivoyt3)*D$t{s3}Xnrmf43 zn&%+zYG|#y-JT9pTm+j>M!F&4BYuMXa5WqwX?JIo%C1w~M=FlegnP)o>bR;GZ? z;m6|&nxxiS#1~NQq`*E^cOX5;Z#hPUimz17k9nI02J2wsZ@zMH?zq`Psui6>mMkdW~=1Gz!-l{HZJVqRe81-EuA}1w1KSk~v zHFI@!1^4`MNM0`1R4>E?2@v@>$ujSg4H$2UhFi9(xu^He87EM$P|#sNsg#ZDrs1iH z3+dpr)$f;-pHQpaYj>c-3-EB;QOoft9c5BR{Z?V$qee+tMqZ=+5;Ar#a>RXlB{R;* zV2dIAfC6SbNm)N-7hLM5R&`DvmU>q$BW=SWwfYj*4)f}VRU>uWpRl~L*5&_;@S=*Z z$Riw0_4VI=nU*zs=uQda&Ge0AwCaT-^Wc^skH%Aw&H4B zkuCh*t-MAT>Y(UVkic8$OFC+#V)bkJ0FbviIb~@%mOOZt;*IGY&3o`F5XFVT;L&_}e1RZc3QcUq8 z)s<8-hwV?d@3?&qQDf3X1QcM2)Jwh=wN7Nt7A@HqtviGf&Bv)N)7%n!cHhoqnF@F^ z9?M5!5M`G7xgZe)0@t;ZmCbtIDDmEi`VL0T<&ZPI5~jXM-rbgwnz|MqryGcc?htj( z9xoy=%52ft%;c0)=*I;}_a3#@b_bW6kn>wus00pxCl%9W^NFQEmf=>y6MNJXOumL6 zgLI$Os%_!VSaj6Mi4$R8*5F_BVSO4TbEByj4>40c^5gS@B)beI8Oi@1wEy?5_!>m!O}W9#IjK-SAA2@(+hK)cxV z=GxOKZs@NkAZOPE&Akz>IrATq0CI>cr);S9EA_^DM(TLAeG_^HQ(RG2sa~$W(mr}H zXMVx+=g)s$bvjewPc50cnxUcLDXaaKW8s%#FvVkV`l+^mcQpDZ-BvW1B|G|T+x;m` zS|w2KYABY}HzHCsuH~Eat#I3v=L9eJx=6KoYAHnoZ!?sf*(ERPj7F>AG_F!>Uj0u0 zKVl~VLxO+^Rn#H}IZ%RMbRV^pKTWFK7#?|8Q!6$r*-}d09A-=bF;WbeAG~ZipLZV( z*0hU80xe;2QzDCVZno1|our=*ZxU`U1Rg!0o-naZ#Q*MV`~mMib>`~OjVR9XT&{kK z`{5>6ovBB!6+l45NtyoCw?ge^Zn|6ge(A&w2GTFl=eUN5PwY$absrA**+Y~FY3fxrWM+f)#T07r>cyhQTCJUtj|aBs>T#KbPz~2xt7$ zQ#P3qcwi{6+CJL>RE(6o{0G`bsoVG6F`E|OL7X#~dQ~#1MK&ItNkt?6+Bb1;ZInY5 z-shxZNdfoN9bU2H$*O-&>)6>5`~rEwh6qClXuAH)P9e5<0ke0l`nBA<9+7GJ@J!>! zc;eKzKQcr2h&BQD66w<42ZN=_7wU0@@&;T)!FQ{YGIr(S14G$ovwkMo=Xv=xy!bIZ z%sfvd5*Q;q{iwC9&VLMqdn0E?RZ@>G2wv!h&d>aR7A17F8I@&7rpvVc+?7m{TKpy% z%hyxV!~Ms?>|{mtA6*Xo`kXf7Jdg|nDH%shk1_HDwVi{-El=zs@$n5kfVobnH z5_~q8ie%EWvb6Fk)(+2_l$0OO(thBKSn-$)lnAknEs{5yI z`#9xFbe}A{E|>M-!TKhoWFnC~8r0?3{&QwMk{GlC~JcP{MBw;PV5u|<> z+%SMt{|gHIIil%N;w~5wb^#1g+knautRhf|bn5=&q!r_Az6y>1BlYv8d_8;S3^SqV zQdkL58%V%B=oP-zQu=>D4S0qsU=;cqqK|`9__Sds`R4oACx7~C%e#`iE{8q)u`pGi z5Hb_X>VO~BEq`RzIbjXYdI3>eY7|vNUsq2AC$4QaO6v81w>^1J4dSwgZ&SrTP0g%_ zBc953iO|^q)}HD6pJih+@}+IxYIu>%*Lg0^UW3FP9^B&N5A*T@fq4-)!;8|L{UmS7 zT5ltniC$>gWhStO<yx}OyktfjRY2gcSAU`Uu+}OrYO3Fe07VPbMgmg+1RB5ixEKwdu?9{FQ81;hJWO8x(3dq^)u+>U%_V6KewY`W2sm2Uq}%R9^ox^gS9Z z8r4L0-E50uo-<;F>waI_>`=MI=g%qd4Jr+tJ|0ZP6Sd2+>sB$>4A*w#)ReCO^54%(o`U(=I6u$?n?_GU<2U@86u}p^DPBUWr+@{#1 zHt~s%2FAv`BoE*WB2xH0jo$2fn9y?ts$j|#p4d>|IDmg{WXG$--6LWSze}qPA>aJn zXcx(*!Lv51Z^|@E0c{&@KC|NOXCypddu#Kx)NyX*RAK7fl(W73f>Mx|v=MS)kRuMA zN}YVq=l%YFqy_yQ&)AU$;W=U8``pAsA zxHYNh@J-hFcI+oz-xJs0Ms6E>-PUvq8@GkZulx6+~nSSQ)@HX9(JOVr1x`@nQJW*kM~>X50q9bz#biZgmlQ} z9m4UXWW__Hq{t&r<70k(_ARDsRf17-MN)g1cJej?8RQ%$2BpDD@{B$9!vnDvv|Fc6 z8I(=+%Z(Y-FC$-S>@PllM$lyC$)Zr&%Wgd1ZEMv=Y57PxqnuABv&M;X*gk%Is3v97 zU6{}IoDe>9IB=PpKE-p-Lot+YjBo*xBm&U!FE*kLKISFNFe}u2nku5?AO+az?jrkx z!|RvJK!JUH$M#trl>&vf3}C9G|lN^0sQe0<=H zZDY6meNIaq-}s#;siMewtgBrWX-_T$iHl!ncMa~nS9Cip8utju*m%HCL(F8#^U2-w zduFI4wIB5zxn#E4X>so;YGO}rx(9$1D%~0q9%>EYL0}%)SplCuluZsf546)bjj((U z=NT8s@XtwETqeUeX8u?85ut6mR!d{oJpL57G@uQo#T`io^)cc@1B%l|D|2 zH@6xa5nV*a0ny90ySIyOUsjYH*2=yM*Z&9`!MAJX5-vZo9zm=f>)`h+=-ugBwH^2R zBlUgW*ViwFFH6M;Xzxh49w(jD?esOe_0M5AlMUZYn%vJl5$^!nZHQj!r(TY!=PDoZ z=nNakV``Xr#-}43X&bqU9v?+^xc%hn;!faVk2AN1{trcIeC1y?d-o&^^(X0DODPb`I?^9h@2Ms`<#Z3BN`u%c;NQ^d z<4DOj^neGa#QFL66~$>^7{8DLk_yi+M6?+w@5^gNkw|7v*DTRFWJbgMzRvC&%<`5n z(m#8{=i^a(`~P6vC!9qBM9A=q$%UPWT{rtN=`(FquQ)Asr8!TZo70W?9`O#H)v;}7 z=L-A>(wd)aL~Uw6Pnas1!^56Udwsp6J@W7V(;Vjc;$YHCjE3n`y)r@ zLn9`fg96*hFfgU5kGB6H>h=AP6!+f3mAWcPNtA|}nNc+C zlSq+KW-_v6p6V7Ul!%Cw%#!SET_P*9bj&i!UWx4A^L{>`w1~2aE|Q=<-M;!agNCFesuk&@wPVTYs@#$Y@0V?}LFsc|TO=U66hY$R*^Zk-4{B zx@kA!W`qZd7dprFO|(M$e~(9@OX&dg0#@K=&1{E074pY$2Lr`2%`@q>b)l$vGU@d`p^>8NUS@*`6D@S*k4UTgr5Tm}rzB7=f(! zAavMtALMG!?Wg(WHWroDK&ekqWgWcBS*bNA`tXIi+R7($^q4|cXK)>zia@N{H5>2^ z-k}t#64sb!)QfhZ;w@;zTVrHkG31)~DD*M}h+TxlRVeH6MUVk@xC5%~)H<>_QMN)H?@491^A=znM>_`r*L~t0a~UuZa=!s@6ocB{I>h<0nm6&2Js3EJ!k@mW z1=BY$J}ck%Yk;|P;t#~xz{!;??er)JcSUQ_{v5zr7kvEX^M_-dAsI+11i4o?AT3|x z^W!M_XBo0t@YRAR{gF$1A4-srV$q*$nrm!*^jN0j-5&D-a2@*>Orc1>50%$@o*@T- z+qB)mM|$2Jdz>XNQ+YQZf$DO@UCxH!!kpTcG5JH6g;nFVQEd%mK>%S+9ITt}M}XC# z?g}k_sJ3<5o7~DSA)^y_irlI<#7r+4RL3$C4_C})?Rk=Bo2G38A{$t67A z($^+z8Z_i9-Gj-2*C z_M95)*szl`?C#n-RK-62@G{TtA6F^Df{VpZYR0GBYmcmGiawMssh|DnIk^B99F>p_ z5d%kNw+aJVP##TP|8>*WG$A{t`})TmP)fT4FJ%gZP{ix^1d3t43)zOCOAw_-f%V23 zev8V2&A>jyzUnU(q3znZxTE8|R!lV@F zu;TH{*Y4LbnQ3{vX3lR5;+DNs6|$!hLbt*%INqs&%qf668j`>whp*ct(nW>$jT-QX zE$4@slUy%j|0R$e?C(V~vF#XHV}KTh<@snX6KbW@!;dxg3{((xAq_MG#81VOG~VGWjp_wSX<7 z-$4^ZjSOR}=*-xknLYLgRh8>7q$A%u21%K=NZ3T&b;KbQ-U_)u-G`DBk7S)Gck4V0 z%&Vf|aKxZD?Ko}Y>^j9gZAG4LCHV{8cA>PkqeXgb!BCvx$>e^D(8H5YtNzZOWy@L4ZbiJ{wdKT^P+ zywBEPY4$L~du$`s8s(Bbmtm%Y5;nr&8~A?jHir@lu)UAeJFi8m4~j#N(49O93gLlO zuK9Xc${oE1G;YXHkV9z}1fZ~e*@AFU(XyI(c#OtEdpWj+YVAC*e*gmYwkzG<;II#W z5=2d&7a5M{Y=z<4j>?<4)x7?AHqRbQiKY+NWl=g^D^~ArmEg~A7Xc&2M)xz$PSU8a z8ao*&`;ihAbYRC2Art|Fg4B57&kJACnQ61Q07NSw4B!XDW8R@oK?GIi8s-VH3>DfA zH+IE?%lgfbWAS-TgTtFMpiD$&sy?-b8+vg*HO{!)nTkq3qNRQ+q#L$ug zfq<2OesPd(?bl&v@D;cRnw`#DB?vmYSD~DUxXJURE1lcXbevVpKiSNc#3W_0OW8zIU+CPMmSXCwTSQ1zO^9&JvQGSg{(xMaSdy~1mM`qICtO2OJe60XG?~w zZ^56V60Aw+AXCc{Adl?4BUD9z+S6A{v%nRYEq&8gVZ%X`6&$6Z^#)O*AHE5sfs{H2IEW$0+I&85`3-1#kF=1A5 zz!)e+g23)P_xvbYYTGlTB9HeFST_FcA#{Ca=Yvl3Mt|AT6t%l5sA}Adw)Ebe1 zw9xG`HeesHFLF=&x$a-IUTzmi{C@|Ct;dHKAE<+(l0~pr%ATpCE19$;n}?okR8y2~ z26Ft~1Dihtwp#=5BZ@K`-~AI|riULxGt`SZqONUL>YUte2)&bz%{8nnk31jQ>b4Ub z9sfE!fG!w_Fb<%HUHA{@>KPs~aI9NiqDYhnB3*O~bs|NYsyPX{VzODIke4^gV0pn~ zFdjcn3j`!6#ws)X${ix*j%?9R@urzbzC}wllpxE z3pvFhb^{I1iZLX(>NqeaAj{W>H~`WWJ8OV3RZ_V;JcH+!UL8Z|EyDuW_Xv@o%!mkN z$OOLL8KqSX-;HC_YZ&!C@=arN3{C0ZF=gLTi}+3Z{k-yzS?U*?rKzGjBq7dQ5=sjo z{jkI5^Okcx%FtIkoFxLHi+@}U^&T7}3+c=B7|0 zV(_PxM%H>MP`i33BV9vsnf0~r?sNU&a`#WC$kB`ot|N7t>Obry;epi>d8Q0Wg~oRJ zB|hHbhY!C8;m!2FfB!rU8m`2rKKVk12y$D68#gm1{Oov(mR!llt69rr9-L>-kYodC z7*b2RvK;%XC5<#BA+7Be8RsM+GqMxAtEI6^4dVH;UiwSz<_foUTUkRfWL@@X2G$hl z!(^bbJ=7Wv7P5gJFSezD6+g9pJ;kJSdUI|HbW`-Z;~#9Mlxh6-E<=*tL6`{w+}#0( zdcgp8W$9M}s>BKAj2=*U`UyFsK?KK<+ejf8%XS3q6*ZaPFPV%6O7!>d&G4ZqIehJ$ z!CJnQ4t^aTL`jduEI)enaz6P8HeTc32*);eL3|e{Vjr0~RkJhujT%_?K_`kUZ_f)GtC{s~QrPy? zN3AU=@gK^53VA%8K?1G->i}o>(wJK>1byE{gpw1d&CD+E)^V02ZZU$A!i~SFipTx^ z#WEahS9sTBK~?YcKBb;Z?|EbFxJ}y8Y~F zJ-qVUn0=xL&(F$Y&Y?HcUK)Vc0;&{_iaUUAqk(kVRwAK&6yg!LNE zpi!*=!;BmsC1sS@h%R7*rJkR$<(k-9NSHkP#@HF^Kidtz9M-SUWcK}3^#y@5tOE+o zu|(|c$$pgeRA1`@;PGEO>(W`VXHaw z#7C`PPA=c;<6|X0nL!C z!XMNN6_AOp2htJU^PNxh4FD&)laR#R>rcQuor{J*<`LzWUVFx@w52_e50+lau3SDy zi>6t)sbURzMv&nAvu{-55VbD4N;}rNjadVF0I4 zc1XV!xc<=FosgVteEo66*9}0fEPL)Wr8^SlzI{vx^08~-4FG=N!^~ULHPq_Hsk@W{ z*U4FXw0DJ1CD$FI2TTdT)oE zj9va<0%#nAA(?G%&AgMQ#Z^k9V(_8_X4Sl~e2eTKSx4Z*qga(=CGGD+T za0xD=y*NBKpD%uTr_Xd2q)hjAB!%a)rnMEw0?)?1B4&^et~IO+<5G~*LUMT_chUOu zvy}z?6Q&1O3QC|<@!S+dEBrMEaXA5ibFzPEr?8wC%Do3`!$$Y=dRR!Bz3fzAz(T)w zuPk+YGeG3eEyw~UTms0DW@dc#C9=CU93>I$`_r9kuq`5Rs-GD7;gfd^%{*^akY;Is zkA3pn$n#es?c+XwVWs|X7}iz$`}Pj#(JtGuB2eU?QeJEYDqC0p>XF@W{{-^@ij{C< zxi0}N9~w+R_Qu!^%Hkrfq@?4&tlf3p<0HCSa68vr@ER$}`@c zURuLQx=l&JA>tDkb0`Ak4^O>x7A55{?MKH9TDQ)1|KFW9?l~ProR|reQxB0Tfa-pX z`~j>Hnhpg>e@wZ>+mmIZlhY-)h5Q1df(n4;=RIrr)Flf4q@TCv-;s`yF`K)dBE)Rj zZjxQ@rXx_t`{*t0qWeohT*$wRx~*BlN=6_mbg4~lD=}J7HnpTYBvT|}0-10-!36^%e4EU)`b9F*SA$a1_56IG3kcuDM1C*It)T(Vb zhJ~0c?nI!d$$v-$#Hg>?*`Eqqt-)tV8AXP(F9ogH*dBvO?`k47>8K#D{0<{&W&&}} zbV5!C^nzZPQIWJp!#gKQErvN2bk;Bs$88K`MFg%!V)R=!k*=zd#(dOZ?Q4+1v;AS*a?>uKr2rk$Kd^Skv%H=0B(#%&R+rRB# z!?%#U$OScdQ8CJIH?`#+NB5oB03T8_{$c0&z+~2&q1Q1?tOh`OIHp?uJDv!U8nBUF zz|7LZG$VU#j+iaK82lYiLN#M0=6H`L0wgJavnQHMnyGax5M#Lbz|951FhGSHf!3TP z&+ee=YCdx=r`vERv8_r8h?D`OazC>0ru_i=D8)#5QB&f8Ctv%p-QNJ-A+JWboCU6s zcApEjU!Q4bhuc7tq}d&`CH6*z+B)d{fkSZc3!(`dB7{xQ6HR@NP_Gv7v!integ-d^ znAI0%J@3lyS$IrfLE%k*se@cGa*yT&UJyvv6%PsEyKyM8<=w%@iTj(qB-$|auvvSD z&>H;GiJJ68)QJ$Y+~DoW%}BH0$TZHgUyEasbsqB$_foh8%VG=EDEzRj1iocE5gQJa zFt6SO8~&Y4EWtU}|F<%+4S_!iM7RP>2 z*LjzXXXGW1A;43<^Y(^xE5@rB)2DhuR{*P9`jyQuZG$yF7Tqqzb#uX;_ zc+{<%_|C-~^x#*mV*Po{$6eYH>S4M&d6(7jZMm)xAAJIpTHYZ}KuvHnLMXGc%nF+{ z+0(?5<07S<63W&bSFh^o<;Ul;R#skgbv-H}V$d73iMVM%?yf8e%f3rRN(ijwjla|$ zuE@jx>eVygC$kP^2Ik(lw`X}`y*m1$^jVLjv0QGup&-6(=NC{bte;9HVBa9Z+jEm9 zO-mZ7vME{6#g{SI0Ad=uA7j8?}k5K&5Y^?;fO+<%en)%6A^G@?3d)*vdX?IHpCE#@@=zps;PNJeOS z&&FLsZXvrspV;LH)H3`Bx$|y`^>-i+88O@(nF=+_S~EXKTxN5LQ#{X@0K$XxACz)# znuFa*v>a*%2m5%Sq;GPvNc*5BCytWUZl$P7iys#77S~|GRoucp86&m$%gLbgC%&){ z29C|6-5u^|2yFA{{nO21AZNet6vA=RWtlpN9OJ%evB!1V;os;c+O|x;A2IGJ6*^or zB)R*CjL=Uik>fQ;;h5h&CZr)dKN4+rr9d; zG?e|e^z-AV@pbR}sI*wFhjLqujxysoVZR{)9L`5>#_+y&>&2(Kx`DT+%;ER`0oQy_ zd?Fpo(zPdtjXROd4su=Q?>fDPq8|BeXiwUPVQdjG*S>G%nb_nI9fdD~s=1Lp(c)(2 zBrRm(FB$j>eYcq<0u}t^8QV0;A_e&>CSdWrmICLD_{41;$K6yvD%lR182n8+OzdqcUr%C;=wG|iNz z>DGy#4Z2v5^^H<};uF2mq}0DS*~hCiYYtUcWU)lK7BDm8!@cHUR)^G&vllfVFfSf;%d z!^a#v2a1Pq;4PTdR|ZtL(SX#mK;ma4X{j_{3$D(1M#MBZi$hTpS(F}>@rm|f%W!vI zeA8bIkC#``q#b_09Ej}9B))tj?>!HX+%#vzpvEjN#n(+F2MnAh)5b^ zXucH_fCw|T*MNQU*@#x=Gl#D(&TIgfUgmodUZ)SK2&N&e4meu`vRSKUOBR$i;|?#_ z=E3{MwlY$7*5Y<+5OXpViK^IuspjV{jR)XI;;DtSKS(1D%z<-nMrDR=F&BO)p!*zQ zQuiI+hhqXY5}stsABE-}S!J_KIG(?k1?@<0f4K3?H}&KhGv84aB3N`t-%kVZp^6E} ztqScSZMgUheL$s=kHtfGkS+jN_MN<4;Y+h4_8Go)V^_E&uN~yZ3D##&=iyu*llu^X z{HB}O1U6JLk|7=OW-jj;$qF3977dD|gHfSXSGMp)dHOjm112s*E05T7O z4UzkJxo2j*6wB97?U}!{3JB`AN%6hb~+OKy1dLg<-5Dl z(8-R>>X0~K@}e4C_@~$OiO;J~C_mZ4Y;=D12kq;~yv?PVha_x zS&RBtc(jh;i&uPqnM;P-%eIr6W9*#2iz{3sm@)13PnK=yYRe>pi|7~Xp9D_|<^&)T zA2h2zf-X%DPCd;a#P(+=JCbI&+o_iU&E-w@>DCO5Y8}bO2gkDR_>a*zGfHZg-Dc`W zW=8yIWi&C`yv@_`NF1Vd#mm3a5a0Lxk+JSCK4K4)1_PhY!3I5A;I$f|BSlX}XO}i1 zT(KTSdLxi`>X`Q*_qm>&D?q@Ms@WvrJ|8`DmlmG6i*}e+lFbrhVdj)+POErDbJIr~ z5qySHJm%Q`JZq%-+41|5k`~hN!O#2^<|Qd@JMjfI4Q!2{bV z!!2muk0Yc63?in058jOm98RS(W(ru91)aWy5uBDb0rBsxl))%gt!dEXefBsL0X#CKp{4 zky@Yg+vg*?c12L$`v6K&elt{iNl>=#4i~Wi&CQ7CJ0Kh1zy9UOy%7a(UrTiLI#8NK zz<8^z`LoW)h-WJHfO2_JaT!_+yd`IhKKgX4Y#~O;xL9t6y46B~_Z?8^d-~fQV}k9$ zVyCu>Y(=0;yYf1(0%w_5zOO~{1YCQX$R$x2PWLQb`V95%8pI8k`s0ZgPEvuUo=`_ntxf`WVql{`#h2edWi)dvqLGHn^< zG%-ZQOhG2Cv9>Ti!C_P$s~ZkO(kH5&;NQ6+sgI@#g#qs4rb;C$^P7dt1M`Z{{r{vRKjl7tW`lK5GHOe{sfzTzMW1B<{$$q?p^rG+!dVmiKeDfUk+`nK$1o3xlG`?_c zLl(9O-;^sk;9(gPkDfaMUK5mZD}hr)M=MJltU7u(8Ig7Ucf&LPaTz&s zYrtUwA$$SsgVeTe2S=QPf}(tva7@V7266?q;VM6t<6iB_MEn~jLu~rfF*%QEP@g27 z*1Shd)bI|6Q}SyjCiT0VLNmK=(lI!6KTae-8+aqvspugu@xAj#;@_7&49$@5p||W7 z?`tPjatWHNAiA35A)rk37%(HYVjJx-l$;JVW_ScQO==`6k*#ZpR*hdHG^A;I?IKDJ zc8J)Ii>|ndevZv!HV)Nng@Wp2q?3eSKDi;?D(YpZSuTGH^q%=mcj&DV^y4^Pz?iWA z2@`?$u^Wiv*wYFzH7K_W+uvXUIOMjGoKlpyGA^5s;DIpS?i91q>0r(4#FUg11gJI+ zg9-zjA)1((k29%;hs}LCgv7`Opqw!@hEY{lv^a;x}tZ(4;iWqHY_{MzFqn z*IgzD6$H);p06+`P|4p#`Ml(J0(j;<1>}fHlZgATqgTP00A{AStFgddk3X3rT4Qez zP>N>Y_++Xz)2fLJYp|A!#9BIJ=t99WMR=yJX_7n!<@)Mct8--+QXb;c8^|4dag-4Z zM}<$IzQycC)J^Zn5PdqF$ZNxNVRB%H6p$eoc@@WumQPT5?pivOMdVo%I`qqi+Kekw zVOR!y*r94B*6mh=H7>f398#6McATsc5_TN}!3w~;NB3?bfu~!J126yi(VI-boRq^; zMoxK*K*rW}j9}1^n2Xbbg@!-rB1ip;Sg55d7*^rcbS|C#p-Ct%FiJeJ_ssl>|JIv= zMPm8O8PXaDohki9tJpTkXAP8{S=~}Loy3bU{F#0cWCw|;)6HxC@$K99DJ@gMMIYCB zffCyUzt%u@LZ7Cd=MgweE)_Un;AmP-qkIkNF2iSiJCJz5ktj~K?;_gSy_bfK!OrOa z=;`SEa}IC^Lcf+R^t=7si%GpG`XljoEEBOqPglsR@E+3VEgntOiON)P6{RnRc)mtI zfk_?fDB{wJ-O7Ir7rG5D!#k8sPizYU>H+C*YQ$aFtAEhUpWlX$1B%x@V%ce z(|EveMoU1LX#Ofp9HupC@_0pmO|Y&Hl-v(iu!TdxI4cv`{9J z&R+UOYNuAo|0pLoh}Cv&$Sw{%6Sr`5PZrs3F3|bA{0L72L`Y1pAg5I_nhnq*D zUEyTK7f9!%@R9yPV%!7+(e?U&77NXD#Lg5|@Qn|qb~-m}z;x-n3t7#CV2)8l@gZfh zqU?*MQGsYS(Rh72KZ9+uz>$f$p#PBpVx7*rW}KmSBuHkqxOK~3Mt=GOMtx0?L^==2 zb5S*0d?B=%U}vzawfIUtx#o8J6u{<=gnKuskW!8n!5LWRLM2aNT9wbtv}>LwH&B3+ zN}Z@qhf1)$Z%W_0@Gl2BWW#G>NF%uQiTGXNal`H7(6ucZ9o&mHYw(asx9^tsy}IvH zGyPpx^uq^*Gdnq8qYF)?nO#A>@p{?D55kbLbM_Tg*Pwf}$2q$-I-GJ*IShel#N$B^meDV@E*qR9bS zBT$b1V8Qr#(qsTu!9B!)db8cWCB&v3Macp4|HZMDk>9#&JDpI)s^M27CFuXLkpjE~ zaOrJ};Ng1d|J~6%VhUHV1T4F2m;0KHyKN+=sJ=m;;-mWN6t4)l)gs2ySA5?keb?t4 zu&@~8Xbxej5!Tu|el0@SI!5w9BPd z2Nc91Jk*B!jxJ8d`Hx#xN>>qMV!H3}RkyO>j3XP*@eXrRmceugvH>z{sIQX;x#Sdl z$uB{*ZFow{LGxyXJmkg^Hi>mkT5u+P3}|Bqp^Gf-$$Oi9W>i zDA;XsC^|#Z1Bw_v7@V5x@~1yZ3YfGHC(<&6kLB;U6YQvG@)i8og_;Ttb|>w}%q#-iVh(%wm}`jM^=G zkys}dN?*&UjLEz~BEp=nE4gm7?_67NMOSj{$kK`1{2)ET&Q>Soa(wEq>jz!#8Cped zzW0FNrT3U<7%kzvR^?ji^*7s0L!sL0tXgo*J zU2;k*c0?O4Q<&Lsx5cl|a&y8oCs^q{ZxKCh;HiU)K4~-PK2FCC{aUnGa6wxu$1S|X zIZiUf*gVcqwWvVW_(Q0U+!u;@=`?2-$uVNn#Dw=5I0{2ku`w$R{);8w_gb3>vl#C%q|3z&3#1B7j-#WL_P)X`*S{0IC{Rs=S#k z)Tdp8DR`UD!V4&Sqa^DiT&VfZ4 z1&=Ur=pNY5{cVPcXtNT-PsY~`ysE*2==~C%@5F4Y(RCcEFNP9-7NC6D;p#D5+%(+T zMxp}Qo_45U1QfS)&Kh&a?^Ut_%2xx7!wxp-A{YC?tGVQLRgA))S0tcnDM*kyBWwVd z+_jBeKk4d0%lpyz*0=E_JY;Z2u|=;A;!3G^1Rt%kQqH)vmn<|7xkl^&Qn_Kb-$v6r z-9z-SWe64LM9_FZXKEDvaLUG%?OqC5rHt6bin3o!Tjz=rn<88FKV`QXT|qiW~PVUKX+GTg11cApYNx0(OzS_YE@8Dyo@cSLxk^4Fh;8;g~ zUxZ6*EMQ4E{QVKDYbLpihAa3k)}yFt<_Ch`Ls=bPl1-F5=rpHSQ2pwGT`vM&u40?i zP8@ypayuOFGT#?`O*qZKL|>_BC&`&yqGqR1LCJ4%0kl=r&cabj#du zI*(7YAtIK!c%XuOS!3%F;Z1g8Qb$6T-#x))nk~uSDLz$o%&z}|2Nf|%T3-X-)jII| zJYu5bkRC;fXjJ*|KGmmJpDe;?gV{fh9N?~Ym4PkNa^nFTZKg^A6@s8s}SCq?<4Wy$IP$vOYi?u z+O9hWit3M0pX=+<=K=Nk?BxC2BCN9f&T{rwI%xS!x9eI%Wau?;!;(|haR_QB#W5;F zSf9POk1-EW&suPpzUK)0_5ETXQ=>t0x206IDM|Utv~Y*siml(1^cWMMjDY9WBvBKY z=7Z!niU;|&_Gd17JQgv%?GWVAQqcA5^{aE~|0yYjF*KV=?j*OA{h+VjE5=v|JTBv| z2N~s<21)ZnWcqz(#5I(-fuA1!qwH7d`YyKQaUN8+4}y$bOZ&JYlB7)LpW4Zj16d1H zUGaKtECd!@v6e<3SxC?R6J$3}3R+cXD)~4l+U}u!|GBj7Aj`~H9n@@Lah<-xtR8%1 z%HMCT!Y=wp3o26)^}mPvQML6pAYrL*62%)e=&hrB^4fna{z3`-xW)$NAjbRck@ZcNr@{ zq_RZMB#ZjB5s{LaQ}GPVzHSBN-W&F+$oGq_%%2B&YL^zX+kbxw^r6gNJHK*~dIxM^ zgNo)%p6}8tP!vZb-egvXDy!3f1HUHTl}bK1io5q*%dKA?M(*Y()sWus}5xKylwpj zvZquXfl?MmFJNm$^%^8qQmj;)Ix2hPJIZ(h_H{ccoj87t$WTa>;_1+2U})U_%P5y5 z8`y?6$xAY?vdUs&r5_zQf9VKNji1cw;|`1@j+L(G%WF=EJrBO~rpn@_(GC?`q2%0M z&fP`X#nS?IbaCYOW|f5Y&Ehq$4GSD0sAdZX@O}rl)W%(h$(@y^J?Oicv#t)|q52c4 z#-yaDh-02vYF83UJ;>c#LC!~AIyDvWTH{{eQO1(b=Dij7xFkQmO?ny$=1_a!{SL>w z<=c`&el_QtD~>*@RMKTW+U7NL#?T@8<(qpxdh{m>NBR-%7Q^1e z;5wS!iugk#%JgRrVBYEPXzX)7o;M0sY~Z#~jq2@DvDxcwf9#FZ;3V+4+ zNWabc$okA1)$)@D3Ksa#;|oM|{RA$zX}zD|j{QaNHOQNS9lYPS&EVge42Z};SpiNB znuA@}1LBZ-)+ucc4)v*LS^YA^EL85;0u72JA}-K0-nbc3U1mb~CD4Y-^|u6f9Hui@ z)PK|*PhAc)Jm#qnf!Ux@wJ&Vxgqm@KC<~0ymQ@i?v6C;aL*iLcN!Vow0@*6#Y*iT) zt||5HUz7|jSI8k&Vb`n$>ClK_(+~J|k8rdZw@UtvtQp*gjbx@i>=tty>o@{pkP)`s z-%nMklkh=+6YvY!uH(_9`AiIj+&+c~(RQ{7uo#COzOtyz%RKU~>9ier&#?h!6^k}O z=SRkiJ)F`Y{Iring@f5Q8ad`Mu8MJ(#>2jWCZniZAAkPt4gLX+Hy@yYD3`2}$I3$Y zQ>f`H5+z|f#r&SmvSE=2s)9%Uk!gkK6GzBh`+d4u%f8kO2+FbZXX2-5*cPx3}GYD6!U`}^=53gl6c?_T^a=>&PGM;CJT4k*>A+Fzxs zdP*@h$6MTt3m{j-fKG=Wxi3Jv;oDxzKcChE#u$j6#X;=QQ(hZ+ct5z!R@eJ3J9XzM z`{tK8|7$?rGR%5s)kKq#CzFRMWUoJ8j+S+9Z<||hS|}km)!5o4G24;KRi>2Uq_UhF$k>oDwzufB3Mn{ahr`WIU4EF# z*kJMKkx_3b`Sw$9pAzltVzAns>%t-)Jx0#ouu~=IfNiEH)>az4`XI(W3%PJ{0Tb`o zxVk2*H+=T{Ml-Hs+pHZ1bv2#H?pAO4oJMw1newxztrMllKeMj$l^C>LWMdHjfJB=c zq-dkarQ&!?V=bOZ0RM7B1YgOSHajkcmX2A~l5Z{KYfqI3>)W{SM{LDEp+K%_D}?2B#EUid4P&AVv$l|v7m$Sj2Q&8pSY&STytt3EPV z!)_J%D_0n@zJL~o+?-raEox@qmFdw-p9#PJR)VCXB z%wGeVOcLq(D9ZWS`s&WhehfNS$*>$4qhX^;mv-BwV20`c!k@&@XHwfUCmXdP*3Uxv zF#Q2~G(4}8)TEKKwY28<4Gy{-HXx?LDkNte$1qZs?g?O*=eU2lhU7nJ2%*vP1g3qF4vEJarga{p+FG)j?xh+1Sygn;i5jk(A2k z7dG~0lA4p1>zweAlF~X}SS=GtoL^Z^d>ovm0$FK#X)= z!Z7aLRR^NjlL8IngQXwSCkg81dK@dkm@uiyNB$LSx+m|;?X^s`IZbyodFg-l?s=)Cf3bHl7eXxEQE`hI}5SW_Q)o zu+Ox|icf#fHu*X>(f=>J$7g>~&dh$zK^LdNY|Sm?|I{6-Q}a!>t^y4komBl~==uQ6 zV_%j1qvcP_YX#fS$W&gY-<7La$c952qdQD7xmoqg_s-CfA@+F4lXGo0;cMhFo=-Dt z($5nf<*9{u=Fu}>_js2~%LtIf15@Nt0W{;6-R%D0_0tQ5Z=Byeq|Xo=41BaqW>&M^ zx|#EO^ZOI&T2Ms=wW+SA-81{0-|mT*l%``b#&jxVx9a-Qa{~=egQJXO%2nt)rZB2# z9<%wRwrd$rRq8Mq$M4+S=}ziK@6&_3JTyl2NHLO%)>RdB2x zS@52@&Zbt?0-LKz1CN_(o9wSWrw^HQpsHOp(_4(A=uLunojaW@Qy-~1n$2q6u+3_` zsIX&S^!a%WEmC^JFmL{2r=*%V@0yU4S+HO)ljEGEM|$jF zSm6CW?s(rrsW}YRuY84;(wevmpVRvR$zTp!E_7A_{*f{&*S3^9@04al-yH~tdZC&J zyfd>JjglmG?5h(js(eYh1Yp#l2Yp}1?5!ftdo%4N^CZM;Z)rds#jPD79UZ>I6@<7?E;s0xGzO|{aGn|fPi zs-h`9zGQGYFWYzD!Mz9frydyHPQBig(_|Vit0oy*tRs^tod zrf!MKmOV?kvXg!Lp6UK@?;r5}{B|E6^DyVUmgj4q$2sS&g_+?VlsJlmgJX};8G~~i z9GuPU4{{gSxy=~41O9RPo-@?rC~lRQ;NXzVGcq`NK9F;IV8grbi!e7K=_}v;z5ORY zGjeYa@YPCcNXmh~N_fiahHJ2oEzjU7rJn{M=@{8FUq}2747EAp9k^Q(5U z6F+ylizi!m_)~Q0o*SC>JAvBUi{PW*)pus6WMySkC?jF0A$-SLj!Kr2HPsOLVD0x^U+?rCa4gyADSU34;mWV~0 zh#I;xYdqw2o}{zJQq|?M-P6aL3h7RD@7`5q7d^&{!}5CQeh^Y5P!@D~=d+xvf<}|h6OE)1cR5cn~ zd+f`N3`b7Si&Fb3_+*%7E4_V1IsC(3?UhqkY_YSB-y$F9v_Gq|&R!Ce! zpS3853mQw6{%59d?u6GJymDDDz&rv^hULxf+rE<5qkQBqsV+DAb4%ahD;&zYkFn3@ z8jEo%Z^ff#9&nI;!i}{SRfSUh<9NFqyZxTllf_Z*M29@=OC$P)Nd}0<6~1V_KR&(> zE%7!}h$6W4(P@j5g0b40)TaU7AC6!uWD@i78vA~3Zc2o`?E1(%`dMiwAluxu`u%al zh)YAU+~|mv_C#_)k^t?P#aisvVySu`>!NwL-|))n)44vk*38#BJI@1IA_WEQI=%R)n`gGNh61$lXl-j_WhnZB{HpOc-9qI_$>-!U z@-A=6B@~ibiJ!V%*4rQ@w7u<|@RevUz{5IrCHIu*F$^^7+H-1G$BJE@S){T@-c6Ft zbSMvte7H#ey)ho6xR)nkv$g>s@vJ>pm?mXlOzi|O(f z@2oNHR={Yn8fA-{jBN3kV%@ez6Zz$Ve9)K`9!wrTH@cG{AMbtLDb zACI;+lBwcqeIU`aeQay|X)QzcIT;lxgN_S=jl$tBL5uR6$!Xqgj@jJ{yV4HD8e?U9 zm6DUw`jRxoZzE$Yh{e5?l@~dK}El<}}4_cad490n$2SUR^Sb*6b%7i)bv^4;Mk8CRuw{Uk3Cti95H zi9WWdE>csx;Z47hC-0SBY|>+dRaA)_F#Qb%E2H6eS1o8hYOF3#Oi4-MKf)j6k=7+d zp1)YWVQU6bW;=TYE58`X{i9%Ricfh!($NFXptb*1(d7YzEAhK^3s=AO`abTzyq$mJ zRS^XyBMh_q0w zqMjBjt1;k~570JsNhmDI&F55r=SjV?RXrhUH)`mz5pZH*JkjFVUvcu?gDv;_F4w=I zo!@2C@+bmdBn364X+A#jK|#aVsf3`N#@v2%2W-niO*Q6=fjOq#eh1F-bG=#V3MAw1 z9xJ6pM{|=_yHZqJ@~`R5pQnYHm1Vcrku7DX6)?~wiV3avY^J-o#fv*W)nKid%Ar@{ zBZCe&Vd`g_ZC$O}RT6s6hXz_(D40`6Lp;tfXr{3uFD-z=@bVAYxmQnIwtBm5e7Y|3 zDEj5q_9@Y$(Bxy~VFbQirQvrgrf1)Y&gEy#^YyCvgqGY3FCFsnA(IuhSIn=6o6lQ4 zH-9*~9sUx>F zxDKT)g?nT%h}RCg{CIfuJSWL!wjceD+B7`p>@GPS7CK~o{%s0E0UhA=eo6!beYp2t z^Zvk!U|UV`Wc7g*?y<${SbJ@2xt75?V>C zc{~NAba3s4(mp*;`>wNUnOc$0N~2NsSl4z|n$mep>OOs6=}D`+(8Fsw`KXZm*9hW} z%!y?f>{Bf|RW$E?__T*iUqT7@h(o^cmRNxnVyitzB`)T&dlkIFLOsVqU{sl!d6xuQtZG1b}de z$nGtzjz7mnjF)!#$Hs)^e{53{r55W}35&Cfl z(XosQ_z9^En#ET}Y_yzAzEufI%@SYuo3Tv+9rAqe|SuOmapNW8K7c zzv|`9F`NDOeX5UP}|4p_QuAW){8TnDD^CnhY%wjxAxa3b@>gv@swAc zHw+F7+x|`X^U~z?6AYT86)&?o*oS4(x-)x7aUed=i7S9cav!%DZneZJ4&0qzISe6O z#x_ML`ksf;suxVGcvxBSy)!$O~zdNX#lIEYO z`1C=KmtF_asvag_O3Xh$3@zE1B=9ijb?B?Ah@9NGtG0~524P@+%!C3du%Y5&LlmK- z7WY9O9c^cY`B6a2*h^{BDPOaO=g7uibz!Xf7NQL5gxb%-=Eog-xArpf9}!b8Ve89_ z@g4d&okP%2kX%(b&uLT1_73tqqsByjlWPE1=krZ%d%ug1QD7N{A%`wenaNyHEYw6# zLrX1n+vwG5eC^xJ-*rJ=LZ009iXz4_o?@kDi zG}5*H3_pc+U#I1k90Z$#l!-kgTFBIZ(-T6+Chmii4;E#hBhW4gn-3fO-FFYe4awY1 z+I!m)^CObx2vK^N1FMm!(@hvx^g|&k%#xq^GXgJ>sodjWg%wBP^t0{|gedO1xyuL_ zf1G+KgZ$|RMT}3AI|qM$5vQsI<&B@ES3uM#gO7*<-~;a7|Kq zYQtyhH7^QL!`3&= z3^xjM_dOwC>a%Y&TM$Z{EfNF4GG%rA zfw$LHdUgvA;@Z4BOO@?cGtE|r(#h=f=RS(wlS6ZU^*h^Gv=u1in)Ljcd%##B<%h{^ zW0zgr%`q26t@;j>5>(P%qT18hScZm`eazK6)k5>|f2Vzb)e%4ML!gr{4a@SI^`<=X2AuxW);m4Q~; zxa2i>kf-&Jxl$Z>fdR=b?naoHoG~~&$5}+VrIj7*ESmUU%Ad_7#1f4B$s$(Fon2SG zcMBv*U(B5jJP-!ivKzax(LUYL$`oH!?K$b@3~xmMC^hd&9_GalCPiYTz!NvOv_d%< zZf{K`e8`sA_~)D?S{U4BSd|kLJt9Zkrg9g2q}+M(MF@b-s+_Zss7bp~x8R=v!)1Q* zdRhT?2|`qNg6ke6(@wvudqEJujFy+i7Vu%5P#nyvn=P=*3emoC}i2%yTmV5dOz@g-Fe)aWjwrjP@Lerb?`qtt? z%@8iz(t`p_B=R&cuk-aOfJ$@zq4o`I=+C>z#SfTPI^NPUBH6UM1swAI+qll|2z#Vr2ZrNs>|uv&8Xa2*4k)bBo0&^UBx@vU zQLs%O{XaN@H5r`D3%$3tJn&ttmOUr5f2z(6W` zajw=}Fz?vmzi>Z5E_?Pgm(}oe%X=L@0!>PG#)q8!8}2~~fcs|g(*`J7_?IH_Pw-_3 zqLM$wDge6Nt1LyNf2HU`|CiWGxR?a1uKOhY7PG>t%e2v zFk+?^DNr*p#0-P@8%`a-(HiGo?tBJX*2kRvWd#?6a zQQYhEoD7X%x!$#;ip6~!=_qCa*PA7tF$@M&s^sVxa8q-)y2l|%9)mvoFJ(mTxITfm zMt|q9Mim43io16i6N)1UwOapF)<{3+=rY^~I1gerpT}0lr|cnH`Y?j9dG(*ls_Y%x6RezBDaQ#AQ;9*0X`u`Lw_)7C!dNu@4KhFzdG&R7(4Z&V5qQ=0sX4BFe?BeBv6 zCIecVVRI6Y??)vQ50=u|WCU9}IHEEfCWB&=32f=;B%)Ml(l0WQ?svZtC;^k;pq0*FJWVW=2MW8)Qm5ohfW2Z*lC(4vo zu*p1Z>0o?d2uziYO=Dw=N8cmLCjRP39w2RU8EeB$N@XX`1jO6rgZ|qx!84}743;FA zM!9NGQ8WiBnj7>$02rBWs}Lp;L|BNr4-9LQ03jQ2c~tjn4MyM8zE(pR{4*#=vUf8W zr4tDp@`vzW*=@!W2D8~wEwzmYdTYpDBY^hr?dunfBVH%6<#~a;ggZ7x5R;h6UMmCs z@7)U*O(I_FuxnHrtOq@gIUUAhz>twc9|rs_6`jx1IY?#fzKRFdY0$Im6F5klY;S4> zs4(1)NB|s;Gyzpeo(BV)Sr9k24o5ze2A+;y0&5@JzIzacU04WWA039HlltR1NDH9n zI>FD@dylJz1`)6A!F;(4n5*JIAt4_E=0enIlFfB_t>0kqB}0x-q?nR7osC+r(9 zl9dfSOCD;BPvjsy1yko9(3EmrXvHuBuLI^wK8VZGt72&xJV5~{HUNst#hF`sF&4n> zmg67=p$d}}9>~THk97sVa^BOd8#{1h2Y`LahV?2u?gN9<0qi9J+yCsKHXnE)f)hUj zm~uJrl@4my2qdS!T0nb0SO;-3Xy*Y+JvQ_ZKH{|_44fo^4Z*4rZ)CvwX#}BP6^$6V zd~!VK-+u;T{GXLyjT3&7t& zc|6EW1l}F6Cjs^X;p!!DTT3X4AlRz_?Oz&wb=cxZF=$b?xI4*C6o}`dkgQ9<@H~<9 zNkI%AXwi0}4GD2ESy^p3)Vd)?760uO-;}@&)2x_oXtEjms{JglM8cc!`iv7H1sHgnIghR+Uo`(&yXs#Lb8>jh z6s@{=!!`&T)&A79J>=-uBfd!Xi(M(5eO}HS4D_ilJUTK2NPg8fr%^s2hmf2J25#6# zH-9=MKF!A~ZxO8@!9mi2$G;i%stPYDyP9e^q}87jq%8~VLJ7ZBk;qIxs_+UUDFW8# zAmlK*UMc0r)z0>-pADU9dgV4;VE?E9QgK=hkDL4o_uS^@ z=KKAew|dLMwnr0mx09d6`3ZnmMSL^NnOn^NnrC0wrG-7mhhKpU(dfC{M^K~x9bwT& z`s{EP!w%MFWM=LNg!L>>t{iMCc@T`!s(rcRl$txSvopES?zdmRGK%AsV9QcZ#dQGp kKfIp*|9S|eDa`5KVhX1S$#YeL_gfC5Q)ULmdIa+S0sWkz$N&HU literal 0 HcmV?d00001 diff --git a/debugger/debugger_gui/src/assets/next-page.png b/debugger/debugger_gui/src/assets/next-page.png new file mode 100644 index 0000000000000000000000000000000000000000..64e3502a1c8ee9e74c712ca96772c3e10f0c0c6a GIT binary patch literal 19700 zcmeHvc{rBo+dog5NQG3g3{OalqREmKOEjL<7NNB97iIKIC&jGEo5r+^D1BA zwr9;&s;0*^?oVUMtvVDTH$g7wht+Z~-p#vtY2dOPo27h4G$cZqz4(ukTW+V)F1EXD zZEf=?R!r1U-*DE=l~>x`JIZ3b5z#J&y{^~sWM8CV*2doJS<`=kxmOLz7(9@Nay4Ju-4pb;Hb`+%nhrcc+ZTyKqtC=8Mg2 zt_w}SS!-bAwf*6WQB{|)uRGhkXv;gF?%Z0}zdduce|6{I8F)czQn7jNMcc}(_0;CO zm#Xro`fAV0kr{h{=W)Vz_j3L;a}Jd_{c-T-PZeA(HU6GU>Lt(R9slC|*Y2*)xAi9X z9mnJNGMWA{|G92k@Qneb%9>4%^-C7-Qjx+>8<6p4DnEYQaQ%4LF6WvygD)q}6sqtS zz>ZkKR#x2Yq}{*z^zlu5OpLcF5IcXH==<%j8;cBUzqUO$n^FJGyzT^fv5D%(kxt1y z>7GWn=Svk^k$`WtIr*rkMZL)2^Ot>|>#lUgohwu((;2-GH+bk9c-Px>JohKsAd43l z4IX~2v>DfQ{c`b!ws8DtuBcygn%oDAc}a6$x%@yDS2%v{@z*_?fwucEiRbd+$iehJly4a!?ok#v{hhnF2R{Az zrLJ7xA%QGj_^2^hnz28<}uy5(~y17#YJBx@h3Wo_{fihvc55Ji^Q@VaCf9dQj zabcx#18cSIn?FuzcU0Im?`P~9)@)_3rUBiinx;R3B@P|YkIgX0&x%W0-s-%M4s9|k zEjG}1^6*bIbli5bLHzvbj-;M%D(KV3y~bRz~PoO_O!_}EIs;Ok9e7I;Fj@)qrr7~c!oEV zEOm7cmmUsVwLN)j9Ud`e(%SmZFDi_Se|=z|JgSV>fu|OEGjV#V!wmVp>{^HTnxc2{ ziR4IKxFNo4^m-1YMEguuI8uq4`LD_E4dkC2dMO5>YmDePvhNcrW;#(%|x*|+ds_&Ow!{S~pKyf1owsx&rA zd~5#b6*-e1#G|cmsLLm8;?31ljG^J#m6Dc=t7Hyr$obVTVWA^gl;q^;_nl;{b$d2# zusfc>tu4?d8%H~#HtwqO@M+nTPk0)Y!7b`qhv~=BeCs-3X1!C&-!kFg$e)A@@tcHM zDI#VwY^lSIvASBIfuC?4MU8If+^p49NR7Uwv3Qp>oy4c0B{`c%!O?h4GwwED=V%T0*EM4o* zhfDVfdl;l-dpq)fF3hSEZ!pPo)B{kf8`b&)#v0Mk@gX5)Uy3WfbS`NxkUw^~g}`jA z6I&UAOJXW7HLk%#r>}k22)rSck;*UEp#6mC9jPiMjxV}mwxwBj21Hj_<%4E9nw8zT z^|t3VMwhuZf7M-}R8O;JI%l7w33}HiJFl~2AHBenh#147A8N{N8(C$1p?1`R&-eu1 zOhn%2`M_R@=`ph^ecE&`1T>$^Gmr=`dyPkkR;gQ>T}7^uaub|A$W z&L&tyN*04=P)Q;SFgInXETj+pek64rXnM@rAaVR%TZfhlRaj(|}r2 zjl>k;m{dCM9cQ%oiRcQ|HX5t+A^KT4al0h!fL1C+&Y)X05 zqc>BA2K{sX9ccfJ1FibzdX zubLZ&anUz^{<<96pqUsK@BivR%kHfJGFE!J;$>GFJ9P|6E?EyhUo(`+*8f>BhdgPd zWwO>$PkZsAc_L2EDc3qT0+ww_Kf;Uj-o#&*Fe^$NkTD%)*?o6BJAA_|@PWD{0$(<3 zY?vjlDL7=IBn7fX0cYK^k)sQ}1GO4WQQcKFu4 zuX}o`!W)Z*A2FOtPFDSR?d4~yim%r<_5way&eFhj27)yEmOkfzs{!qq1CIKhXW|F^ z3P^UfVTf%3>HW3WZce{b z{*AGWv?D3yhO#?ikHZ)j!hM94KO|caeiOU)#b=!h3oUek@&Q^3M$sA!gs7bt8FABYE2>@|BWTe@Q zrhzW;{51J?x9);5W6SQ)GM9#=l*|EM&2Q~rvOjO_@~ftWNG!)F@fd6l3NY8Tb2L_v z;MpZCf4*laFFmNyMCY6EJRHC!dffW@bMN&V|Ah!7uVAA?9AUh#Se4lh>WJ(+{gj~Z z#G}E)G>WC@Rs!GVg`ZW&Pg;KlD?)LSZ_{X!7rf-XB95(6pq3SNVbwR=x38F)VMdlV zidb=+@-A@<6C$Nh+F@d8dS^8`gH{eL7=JWsorGr*4VA)Xl#L3#NCLQl%Q4a~9`I>< z`{6Z|C=EZ~_M&m9$#6aanv(<79e`lZKTg({H424dQ^22IO+PhT+=fzVpI-BOJkli= z=tAk0}C#yXqcrCBM6tLFpQpRF3=;ci~#u(z+P$gta(glP=0AeQSvl{-AitH zdlNs=63=x$hwKf`d@nJ*ksQz%NDJ$R!jCy-DDOc+tO|b8ijSLz>Wf+OZQ|p$o{R$(cu`uk8vQfboa%0 z7zS!8L8-}%ZUNK1S$l0Je;p-?B3shG1a`l^=3l(uaN7@1JvQ$z9L0Bh?s}*m{p~Z7 z4vysA#QrPdDg*Vw7j4+CgKJGap&KFxM;qN<+6=MSbnqbWC2as8aL!P5P&F)kmZ9(g z9qs8@LHM0@Kj0K1JSgXF&v&J{!YYt}P&B${#xlncwA51aB6KTM2B=GpXRhY_+@o81 zrF4Yx30wl{>eahas6yv^WC-v;(C|(oev~82V2&X2qz=jxuGJ5pl5HLoztpmqDgqz% z=0g zrwKl4n5>2ss935*%&xr=yz!-b7_APx1f1@hvy=Rmro^_I;;|ZnR3S4z;%?}M>)zupKqmkezz8@5 z{>W~_BW-I;Sl1%eTfcd)C$r=r$!lNOmj8;e1_GgLt?y=~q-4R$MgtzCAqlj3+5=KS z)s4>8%<7!^5JlS7tRHCMY>zD_d*Vn7EfuVR2g{NBh3J{fU;2|I#89N0Qo))2dCv}m z3>q`D2VQ;*VNG>v_X_z8fk8yqsqHQ>;6s2Ack{@{ZqkUW`p*7E*V=qv_E;P_b5J>0 zeY$;kT{ozM?lW<{_lV?nfIw_71_naF97a;0u61?5HNqw50GQ#trmY}DJC_`KUVGzN zjTgmnImaP+O|X2dLM6*kS;rUy*&|^oFV){Sz+F#+_A*3SA;g*(U@k`NHEXgAE#DS$ zhLRfawbt(VWRi#G&_awcrsP@%C2DR-ugQ7q5kNfr77AjJ z`Dm{pqm=>1j6v}tll$SA-DTM+I|OXf22KjMxas}c_I<_bnk zA;-vJLU=$kB$KYXt=P%9s2JdDC&SADiuAX*_+I4S1*nGtfLR+5>je+vHv9sBIc5;* z+irCVRt7nsVt?KYviH6lZ)oAZ;-o+Kgzb4$eKTvEq23KN;M@cWml)yy%rQjyN?PRH zNlNtF?x%=Idq_xO1y6^TeZ5(2GFuRud`F`+ zx}A=^u5DrtbIc&fL!=HPjNGo}d1>+qsk|qOb9YG)G(8BqNECV->QRW@S&BVawDo5` z14;iJAR$X=rZ8)X2-PKAQv!bMqv{yVw~LD=3(B-1HK)_bXO|M0sNb8$L3(+o3fKgq zuhTk$!$yVZq3#|4WI#WUD>w>b$xi!m@NK28$eeE^5qvxX0&C!&Y|so=4*0S)OmM=3 z1wx=9Pb+Ah>h=Zq&p9q3(7d)oap|K>+s`}%k%LX;>j@|6&HX@oxF124TTR*h7H^yP zlAZ2SAvIdT@KJoO-&eP%K#`omGf`?cPEhl~KN6ze8)FnWD4OehVbQaOSwA)%-2d`4 znW>8{DP=KK{^taT5|0z&PT|X1P|7Y@>}^G0U>^w9pfuVG=N#Q4G41IhoO8!W)B5hg z0)CB(TikbVl}!*}H>B@ADO8+5YOEuz@6Kd5R1#=g@>17&?7}#r6wbMh67MwmKGZPz zRQ7}rg3!VC+aN>5|S$)RSMAoIC>*$wM+E?B{j3GH$d8m2H+d1{)l_{qRrW0RT zB$^wx{O-Z*%fUIVMBN!$le}6dDjdXI*C!H>?;5x%g`l0{ufXySsI8C~$tEk`Z9O&C7p< z8slBCuW-Hzn>a_`%~* zCl{f%OV^*>Pv6Cb^WPPO!jHW*D}?2#AIgq*BujT9f#z72@_HKSYb|NOqRSy&ly`?oAQY^%^E7c%gv$ z!?@Tzcl>cifI|Qx*(ft+D&x#^B{=&4^c33uKY$*r_rp~k9Oxw?fU7MPAOnLHf79|b z;=3;Q3~TF?NCd^YR#O+{mf{eMU2@X@$o?TZS;a^-AT$l3oisWJ7xO%ildPOaiP1!u{gi z|A!GpA#2{Fvf<&h2T7GrnU?*(h$c$lgFBhvaf*%vT{i-$S%&}y0DCC^{2pe56*oNtO^$Q)3onJOl?V@MQz1u;9w4+Xt};{$f8unB9+KB{lP!=Wiz zu8z&b%o0-G6oar~CW%2XHh%KgF-DGXk%nG>F3VMVb;m6aeZB#~9+{a|j#OO%XeK8F5RRH^Zkon*xt5|Ja0y2{2nvkP1A+v=SGBY+Rwg*#` zYFPDJf<7H2MRiMS)2^cLN0kt|-~+yOQ_DjY@5K}f^fica=~|ilgooiPjuDn8AMMRV z8fE%t!Gtp>m}aXum8CWqX(UailM}l+f;P*1k;iAJTIl3gmNM8IcavQPMHp62jyp<> zUNuEhYBvRaOoHhC-c z;>%{dju1TH*&oZ40{v`J@;sKsh?5~+x$pWc?;XaNny@3*QM3};CRL2o77`Lwe-4Bp zMMotI|sCCy!jlOuhRu-pEL_tuiV~~n|s3ic%*)>E( zAr&`DWOd{7>KF~oYN++iO=N@#-&RwP)cDeTadht1<&lbdK3o8<4U0UZrWho2L4pI zLU2efMplYsfc2o2Kq3533@JbWXd1663Ao3|Qi!l19Q{}#hwCAiaR~a<0W)r?U6_CG zGO3`(6V4|ZRY12hVxy-I_g3g zqTt&Fy!;Tb{FMle(*zL#Dlv+PhUKTK3+9`(#7t@oph6eY4kPjdR8+9oLDN!rLA zb2wl{B9s~q_!6o4lQcd=$yg)mCIL!a4^`hb#A1XIgS)0*5WqmU=DW#Y+sM|pjC{kd zWW*#ck#qxP7q(M8Pay%z3+z+qdjcvCO$)6u!841zfxhxWs)S;)e}Z{pDq7>ow&z2h zrM@Kq(SkuQ88_JlhDd? zxG$LY#r9xtuciL`>^H6&Bmmx_YgQZmrpszpzw*`ZH&Hq%jH^4*jT0@Yq7wRAZq?Ne zWbf94Hz)v0rtb7Th@*xbVTbLs`pqp5UH&{km+~I%LvR5d5~fgs5<%%Y;T%va8fj{U z58qA|5}AYxc8tz7U+#2jP%v0jsD|e@(ZHOKnX~wuk4ZNP=VP!(B4I``(i}=oLxR?n zJ$@u@u_J7N69iQFYC1DreMqBWRF!-?OZw|Os4Dxn5Qg4#f4%L!y66t_O6=o63 ztBi=r)ubp6{(N+-`KqYI4I41yQ=RZXDL)N|I9)4$djM~ydSjIM+*!5*eSEW=k@}1N~$M4W$HGK>Zj72mMFok(5z_z_G7z0~XV0J%Nbt!2 z%``<_;QxO_`=D=+2q92&!EB4<44~#;I*twJ;Ax1Wo_YI-)Tq*;MK>1j{L+8rD>4jJ zor0zW5TqDhhpSJFV3cSMYEtuop(EXLQ(}pqkkFXp=i4gwnG?KdDGaB#|ttitaQG zu|UCCPUEvc!A^)YRMJ4!hihz^nU>G456r%itn^1P2-nP5i=r}AQQWZPHK>Apj|uW^ zB^aImOCtDREy$=1=5CWP{Ek>bsYJlq1vGn*P>l2uTwb14S*%0Gagum6F+-}h~6?*rcVoeZWw6FxXJUbp8-|I?|A5_wQvMgC1WtyDUk>YVFn|--`_=vmcZOQ z7(F;A+d`)yOpGjZ!wR7=YyLo1 z9eIy}{SL*2kVUDI4rh|8G2w%f<T#_cC_Y~*+KmIg=N+3Y|tevioG{HfH3R$JfQjfytKW*1$dMzfXL;kp6>+a01s z8N03zMb<0RyQ<`o+IT4c28&YZrJHHVH(j`dnPVyw%Oz)9rTRik{@G3Mq!~+cF#ne{nek$u?lqL;qthN* z;?>wd@4vAwtVw(sT-LcDITl|O+<=X+DtW8h5ADp%CszYp ztIAi9mz_n|3?4^?4QME|t$Ua@ruII0Hg|N9e^i0(d1b$1kqgl><=+9ZPJ#nF1~kF zHc!W|StRCHn0c3(2Sx7{6ISKyui!MD=3yR{VP>*c!1 z&#)|mn$gb9J7GcoEB$G#w&8NgbLX^;?!H6oUc3+&Yd!PpbUEjLRb9h3@41IW)HD=i)V-!H za5u)6_`k-pwl)3f9rt>>Lffqu1}W`2H5Ur8#bPZ_rr+6GeA~iOF9}-g(&Oc6AK%qa zbT7VLZ?6-Q~ZdG`o}v~u7B0F$ohlttBFZ;Y^~eT@^ukp?Cu=dd8jPxPrB zZnd$qHgMN0P=5JN$?v*ZMML`@9}nUI2BJm&A-&B5b#>usfPWH!fi7PpNF4ah=H~D1 zYCBXmL;2o7v(1sN^&dK)1lI=6ob24vTCk39J7LzqWsW+#6? literal 0 HcmV?d00001 diff --git a/debugger/debugger_gui/src/assets/prev-page.png b/debugger/debugger_gui/src/assets/prev-page.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f2f9b54ea43c26a193b2b9fa4913f96a48af54 GIT binary patch literal 19612 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 literal 0 HcmV?d00001 diff --git a/debugger/debugger_gui/src/assets/push.png b/debugger/debugger_gui/src/assets/push.png new file mode 100644 index 0000000000000000000000000000000000000000..146cd4aa4ebee0459ad7aa26118661bd346630e0 GIT binary patch literal 10666 zcmeHtXH-*L*KUY8NK*sSR1iYbfPeuM5rh~zC`gemAV}{bRjN`$=SVStpi-rYRB6GN z03NDJRXQ9&x}g^#cWpf1=X>to`|FP39~dipu4m3?w!POHGxC;(@-e#8bTAm~n5v3` zHVj790)xTjXsE$2)ZG8E2LGtswUu$Ol5UPU7>paHs&HM`n`&v4;xVi=5KewFaeRQk z=5h98$D^u8$Bw_@%tkb-!#6Y0@AzvFDOpV4&)#~$D+E_GnQH6Ii0dIISh+R5J<(Wm zf*Mhf8L)bk3W3DJ{(t&I;J?Umd?l=Ta{t2?S6K60O5l%c6w0K3c@T3f3{JxxAJ=5) z*LJWqIkYd8zDo=%p^uk3HT{qbevXyJQ%%X?GM-cdwY?_A0n z|Hqva`Mj@HA-X+}eyk6F-zgvDTZm2l%o_xQe?95_kUd-djlwX81%7hp4n29w2MQ#IA2t*J!$}?MhzZ3ZrBk7zshJX34;t%l0&D z`zN1BD3j|L^XicVi1%yB;JmFf2mR4V3hUQqZ=TnZfjx1M?{3iquXRa$7EL)2em5ve zTSuE0FF~M&cJKxZn9BL7N2Fvv%y4Vt^R)-?<~DE}RPtt|1l#qc%}Rt(Bu@NW~)AXx?3O7jKQFw@V3Nq3yywg_=TC>1IY9hco>A{!tkdY`V zoQZA(sphWdH5O=n9;_9?+E&ep0r+Dm2!<*VRInJ~Zhi&_Yl9FN%9%&O!i2B*GNir; zSSZQDgDFY1N`urd^I#+DXcE|0)QaB$QcZLS8aI7l4&Bo#RiK_*AqW|TKPCcOw%iKf3dA^_!A8V%Bd1;^K#_G$4t zgwBbeDH8P5V8<#H@#WO1*HcSJj9?98HtJak%xBc(;_YCfOO&9W+t?o z0UnYHlwaZ9JBtTYeqe);I&=x_fhuoZAn`LmnLQ9c))o{Fg~tXSG8BT0{78mMrXEc%6(SdG?FDug9BHQT24No}XcCa&y-YCJmAYHHK2K za4faTXAiE2>|g`#p8-hnKauDG<6%2aK}BvZND~V{+A#{nBj0NVA!*$dQB0NxtS@kg zRV1)%1Om>p%18V}k_3cjocIA!0Az$TuxY`CQxN+Ti4(+a#|V!{=BGe50q|B|KG~AyyvDz~KE(_Tc-pfV}{qn>=jM$q?)dIYR)%Y@pY- zlR0?xa0w_R588Lq1g{nkR=G?g9=z!hc00hvEQ39#lY2)8M45clG$kZ%-Mq=KAoE?S@mP zdi0IY2sXIrI!}Jh*d`5-z&kT52=iS;5WCmB`ZLzxJCNqud%M=u5pF5Vf2%SMrNU5+ zpBaj?a`kT&m!Vo?_WsP1H`jrv>qV4{W24hN(VAgRN}$p_#T}h)XOGRXh+&-j@??&| z)1a_b;OeE1kZM$`SNUj)ZUiA$oWt~P^$O(=3?Zl6_uFR}4U&MtFIc9gPI0&1u1k*L zea!^AK>ewzDnad)b-JhQ`t!z@qnZRE_ZB1ddtjK7PYsUD!J)LssrjxCboRb~^q)Rs zVNw(LnFAgLxvBy;A_G*~vXx^Hte_>NNj4AYDb8n@qE1fZ{5!1=`v|0R8K_jOeHz2< zdX5S=(s0V?`pwcTBTM;cuTAl0#+s-@!z|o@R9!9M9Ss7Muv^#b%G(LPdHU~3?28Uz zC?voSu?;owqmIDzjWXcO1wd12{DmaGmln=@@gF1)fMj^5`!Qop0t}@$$Y5;DQsCtq zdLvqLQ|g5LguqX)_S*!pyUcr@4QV<90<>#w`^Tk*NA@wtFpVEqey|4@{&YmIRS--$OR>@5vsi@ ziUG-ctwJ>jd8wK07sya9>z85zk~RTpH4(#rw5-G17T(A8F^t>(uQis&zP6=CI6ej3 zli;VoN1M7Im0CjbPjx%~qIFr~qec?Qx{&inysU%RhqaWJ)o8WE>&t)n`mIL-@#;^M zP>`8B{R!nbpoq=+7fSk<_r@$xeY7{V14Z?8f89QXvJVrIlo!gMW6^bRjKHMGuHKf9 z0Gh;JyMdr)s@>OBh#*Y1{$i9W&+GFFM&y3eRAij<|SdY*s~w5L61>076Jb?Gw6pvt*Dlk<=^ z7J}KCN4tjs7=iz?Myyh2xd@aPuqF{CV8`uShT^;mT^D`CD;^O{uUEE)v3GpZ^eIOj z^0vKjgk~8V4`S$ShhdycUpYNXK-zHrL=(Jqh&F6%UuOes|A{69 z+C#>h0e=Bp{Q}l?Q^tQY`q<@SP*H>Z{kz8J{t+{f0Ah``13uI^lXa}^QnW#XUa;83 z3@Qr~W#a{>BqZ&}c`Wrk^L|idzI4W(9U(RI!4r!X5n9GV|nF!$|wI}%A7=HQE%o{ zCXBSuI*N0!A6B71NGb=iaaf``(Ni{OMH@$to*HS<8`O1b2#0|O(+F^$Z;sH+k1nDt4Fn)11}5xM}4w+@_Q^YL#x|yemqnK&u=}eg(n$IH5Qm_v@OfA$w}<= zFI;B{sVFKR|q~1WA66B0qg7u-){;!S|z!n^?`ws?jzs%9E~6w4+MQRPRxnE ztaUVc0F!h~mvr;iiOBXo*%q_4;BjbV(Ko5DjnVVYy)T-p-PY>crvy-mQ@6vUmwKvm zRHFHps~^oi*>LWg9HK10x%=*2-TtM<%Cw~}$cD8CX@?B-7txaZZ_TBowh3H4AQLR?KI7HNZh^irTEzOqxi9)r zV=3NNv&rS!b;|Zz(GA9sj>hFfAWeEgZ&~5qp!(Z)xmg#J_$L()Bf1c9=&Z_AscX?Y z`I|ix)M*d(v<=%t1W4p2*PV(~>y0OaR@vJ%E_c*C&>Km9gTA!=IlcOx)`o?Z*Rt#K zp@>HdpHsBB;6`D+m}eyVy!L?+*1J9N`xHb&ysGHXmGyh+^YtO~CB37M%iGjk=cV)+ zdCsIFDf|iLXUW`X{HnvEDb!D$@RuGN2}sjUJr zB>{h}?@&!3iYkhncmYKx;>yKLf^*d=jZuA@73q*{3`+L0l2FT=*vcgk=$o6V#1+?- zTHk=SDcAY4?N@J|Ini_Z&B%jLZ$n`tbaL{N6QG;3L=m1X_a6}Pw;6!GUzH<_sb5CS zeo>5wJN8kntZ3RPQ|VHA{hgOZ9F8AS?B5>oxZ*9XWH~ubS?gf- z;rVO(X61U053dc0vWS#v6<^M~1FEEOX^?1EU7!NW#Nw=8h7Kq3K`OKUv3HzZ_GF(W z5e01%zf6(%(tSOAN@$RJ0so9el9YeL;@S&h;*_9tV6b)Nw|YF12Q5;o$<{t}pzYTg zs$MWBnlrFU9iV-oOiTD`o(0IAsO3Rj$nWK4-_upx?q-#n36X!yR)1Ny^1s?peeX$f zhnODzC3BmcNKSHcoZ{^Cs@-k}l~q)2KFgF&&zi9qzT<`=08r$w_|PBHGNb!f%w>N{ za6RkrTu#Vq72sHz6`czU-a?vqQfdj;om~rl?RD9fj^iDxl?JFpi^#5$8&K{VzV*^b zs@Ei={R~4s_;M=JCor!#2|7fJ>f=c@tp{UnX>H3rZkc*yn{T@=R(C#qc57qVBJ^}! zz_U$xU#$5!GqeBpBdzIYz%#nq;qPxf`)z_D+ss#q{4Y&U#dej`0bO=Dj#(WjOGqP# znZ7OJ0B=i)+}~GD(k|xLS{WokHQ+aZ0tteV7N6A}T+vySOPuQDGzq&=XoxcHM&6MX z7Pi??0kz)IUB6@Ei)AtMf7Ml=Vf>y}!2{>#Xg`*yr4sPWw7f_iM9r%7bh%#JFh-C!J1(pc;qCG^Y9 z=rkZz$y|Hut^Ff}>G@=E?eH|FrRvV$LS#>|e*n=~is^jT-3zSvhYqSJ(BA|!dsYpI zkX99a?VvtmEfEe$IbQ3UbM>Zty43Ht!esCE zPK_Uch?w>Jz33{w*|%bOLBw*y^lC#$_iPsH$yW~mZ;Lk@i}vczlBTxKdafE4w3v_= zYR5(Pa=w&4uDg|aDSDJ(pa%N7vrlc}oF53`DGV!jYdHDZ_x|?pV&pu@RXJwZdV8>m zg}b4nh8?JmD64z#EP3;QH9H=18}^PAemRQ-ob*ja@1M)QK~pK=PjVQ+3cur>)FfwlDPx zlIxgHgnNy35>+DzpwBrc=AE$u5@$fVcN~mOIJDlL^1{@f^ss*Xl(QxmIH-KB%=3Uy zcMBsT<+ieqoYJU0a&$P;>_&h9)*T-@{bP;X)HYG zgZRh%;vQ{PU%-2~B)+9H<)+z}5v#rycwYt3Q^qlhdY9sE3rc8PjDE{+yveFppR_$T zn!gp2>tG6AwE6+8%#&+A6~c-Ze$PTDh~nc;yV@b5M6THVl_<0DXa1I0*S4iS8Bj^N zBd~E!{d3pOSlX`5(FkPbAJNPi*{su9|hzW5A1adzYGm4Mxy(?W6&uV?LiM@~g4)E@|=16;(U zO~w3Wk81l}D+r{Njt%&q**$0;SNO4D4R0oIX9|o@jBkXKwO6~cP6u$KW!bc8DFQ9V z$J^FyuyN-a>q_Rm{_05SBW_G3X9TWTDh0{wOxk^)j#;LmMK6CEDk)M^B@bN5d^lX- zFgx=f%dOdBN10`6_%W0F+w+P4IdB##f;c0b}-Ptko7Z4dwb?wWWW^w_EAFTzf=O|PhG{2&@| zI&&1~i5JS}i0aaJ;(Snw+9v1KS{!FahIbF*1iyaMo;#3wbtCp(jq5#?1ZK8aT})cx zjaV~k7m}!e^lYR|d)a&S6DMX*@P5aw2?j&k`3*vy*8L1CJEd=Dd}B*a($5q3+g)FC zT|6#r7O*Xrz8hzHFTjIMcr!B_6me+5qhm2%`3p`gi}{Ip-mHI5&sqi;ZfvxbP&|)2 zY|TmXjEFD-!Qq_ZBAcu9_hrbk9+oZ-4a$fy`gO-2kLl^bk_laZ^2y2iH_oTree$_p zGl{)9v-`&qpxv!`vzu|8U#jt#1+!Ilbw=BIV8-6``FD*JeGQ{m zzJE5=to1xUE!xodL)!EWd*Jf^WtaOSyHr56u}w+U?3umfF}-0^aWljt1aQRTj~M9A z_q}ouvns~y)$I^)(TSi1YN%gYvV-f|_&69k(V|hekOoN6FmWqtGbpuPgsyeDs6YVy z3iP0xawH!XpUoZ}dl%fXVrAh#*N%2E4TqNH4Fvr zKzC?>!Ws2SJS4>p;hH~SkOx=GtBgQlXNo-wBy}CaefNz$44C*gFHo2&+Aj!Q{QoBM zJ0ibR>vxU(?pnXw@4wz7ozgAUFc_@?Gz;+io$~uF|NC?0_jlLt56J)LPkQq!8(iT! zb{4iivin@`?$|-+grKGdM3^N-8lB8{SG!)aw-uV@xC_rVNJO^1jkmbcNexYBY%#HG z4&oPp8cqX73Q8&Nh7odsH_I8PlRtBH> zpOEYtqen2TJgs1&f?$qDfD=i6Leqzhag{O}v}|80mpe3$qRq%&dw|6&s*u%RnWLcr zpZtU%$?t3^(%mbbfdjv!H1f=fnCX$0;}n9R0scDJYR?DFOsSN?&}WaYICREIK_upA z81k0sG0TFjrE|C(Zg8l{(u2#7Q?BEs)yPAf_Fb_)KgGQ7xGAGzi8-WmpR=WNnZZda z>E!o-mJE{jV&m^eAOD0% zUrfulPj;VpRSm)U>rv1d=gY}2#xql=YP1kQK;R;WG#65KjInmptdK-fPWS|lS;vAW zy?^+7po)ak1*^s>2?7#y5FxRXuZ>K6a;}uL`WG3`$g4O3z{sHfsdnvkBa7T-MPVB5 z4{$247bSd3rTkT{+xd)Ch&PO`=jPS4E7UqY^Yg*nn-S{b!IZJ&=!NsjTt7zJpTE=q zFA|lBA85(37iFEp;v*)1l95^`!9a{slT}}+9$qA^%JW-38$e?Ees|IfPafKTdg;tO zbW$VmO*r>uv5z`^`J4R07J*dJXj+J(Li=)JcC?<$Adt3%rfu{E*`*n4DcS8lLhcE+ z7BEXgj|gj|TuiS$>eBBmAFE6}R~9;bJqF4-P11H4a@21AJVf>j4>tOw1s|#EIHDg) zHa55o#@C(lwQK*xWA)q=+ihs#r$V)QqxYk_8PH!`(nBVC4eP}0!^tQu@h3k zd4s1;NQvfc1{!k8jt?I|lUv-bCxa(lx8r9{y0-S0)~UOESvd=xu(@4Bn_OiMOv^a9 z!gMI%{gX+Yi^_ly48BIIE1)cvPK=5?B(ps literal 0 HcmV?d00001 diff --git a/debugger/debugger_gui/src/components/color-reset/ColorReset.css b/debugger/debugger_gui/src/components/color-reset/ColorReset.css new file mode 100644 index 00000000..1ed9bf3e --- /dev/null +++ b/debugger/debugger_gui/src/components/color-reset/ColorReset.css @@ -0,0 +1,57 @@ +.color-button-container { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + padding: 0; + margin: 0; +} + +.color-button-img { + height: 100px; +} + +.color-button-content { + display: flex; + flex-direction: column; + justify-content: center; +} + +.color-button { + background-color: rgba(255, 255, 255, 0); + color: black; + border: none; + font-size: 1.45rem; + font-weight: bold; /* Changed from 900 to bold */ + font-family: 'Consolas', monospace; + cursor: pointer; + border-radius: 400px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 10px; +} + +.color-button:hover { + background-color: #9292926c; +} + +.color-button:active { + background-color: #929292ce; +} + +.color-button:focus { + outline: none; +} + +.color-button-container p { + color: #D9D9D9; + font-family: 'Consolas', monospace; + margin: 0; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} \ No newline at end of file diff --git a/debugger/debugger_gui/src/components/color-reset/ColorReset.js b/debugger/debugger_gui/src/components/color-reset/ColorReset.js new file mode 100644 index 00000000..854cd9dd --- /dev/null +++ b/debugger/debugger_gui/src/components/color-reset/ColorReset.js @@ -0,0 +1,30 @@ +import React from 'react'; +import axios from 'axios'; +import pushImg from '../../assets/color-reset.png'; // Adjust the path according to your project structure +import './ColorReset.css'; // Import the CSS file + +const ColorReset = ({ projectStructure, setProjectStructure }) => { + const pushStructure = async () => { + try { + console.log("Resetting colors"); + const response = await axios.post('http://127.0.0.1:6969/reset_color'); + console.log('Project structure:', response.data); + setProjectStructure(response.data); + } catch (error) { + console.error('Error pushing project structure:', error); + } + }; + + return ( +
    +
    + +

    Wipe colors

    +
    +
    + ); +}; + +export default ColorReset; diff --git a/debugger/debugger_gui/src/components/emoji-picker/EmojiPicker.css b/debugger/debugger_gui/src/components/emoji-picker/EmojiPicker.css new file mode 100644 index 00000000..cec43b2e --- /dev/null +++ b/debugger/debugger_gui/src/components/emoji-picker/EmojiPicker.css @@ -0,0 +1,129 @@ +/* EmojiPicker.css */ + +.picker-wrapper { + position: relative; + display: inline-block; + } + + .picker-button { + font-size: 1.5rem; + background: none; + border: none; + cursor: pointer; + font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif; + } + + .emoji-popup { + position: absolute; + top: 2.5rem; + left: 0; + width: fit-content; + padding: 10px; + border: 7px solid #cccccc46; + border-radius: 35px; + background-color: #181818ef; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + z-index: 1000; + } + + .folder-section { + display: flex; + flex-direction: row; + justify-content: space-around; + height: fit-content; + width: 100%; + } + + .folder-item { + cursor: pointer; + padding: 10px; + text-align: left; + background-color: #00000000; + margin: 5px 0; + border-radius: 5px; + color: #ffffff; + } + + .folder-item:hover { + background-color: #ffffff35; + } + + .folder-item.active { + background-color: #ffffff15; /* Active color for the selected folder */ + } + + .folder-item.active:hover { + background-color: #ffffff35; /* Active color for the selected folder */ + } + + + + + .emoji-grid { + display: grid; + grid-template-columns: repeat(6, 1fr); + gap: 10px; + height: 260px; + width: 330px; + font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif; + } + + .emoji-item { + cursor: pointer; + padding: 5px; + text-align: center; + height: fit-content; + border-radius: 5px; + font-size: 1.5rem; + font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif; + } + + .emoji-item:hover { + background-color: #ffffff35; + } + + .pagination { + margin-top: 10px; + text-align: center; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 5px; + } + + .pagination button { + background-color: #00000000; + border: 0; + gap: 0; + width: 18px; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + padding: 0 16px; + border-radius: 50px; + color: #ffffff; + height: fit-content; + } + + .pagination button img { + height: 100px; + width: 30px; + object-fit: cover; + + } + + .pagination button:disabled { + cursor: default; + } + + .pagination button:hover { + background-color: #ffffff15; + } + + .selected-emoji-display { + margin-top: 20px; + font-family: "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif; + } + \ No newline at end of file diff --git a/debugger/debugger_gui/src/components/emoji-picker/EmojiPicker.js b/debugger/debugger_gui/src/components/emoji-picker/EmojiPicker.js new file mode 100644 index 00000000..3d793747 --- /dev/null +++ b/debugger/debugger_gui/src/components/emoji-picker/EmojiPicker.js @@ -0,0 +1,141 @@ +import React, { useState, useEffect } from "react"; +import { emojiList } from '../../assets/emojis'; +import PrevPage from '../../assets/prev-page.png'; +import NextPage from '../../assets/next-page.png'; +import './EmojiPicker.css'; // Import CSS file + +const EMOJIS_PER_PAGE = 30; + +const EmojiPicker = ({ defaultEmoji, handleEmojiChange }) => { + const folderNames = Object.keys(emojiList); // Get all folder names + const firstFolder = folderNames[0]; // Get the first folder name + const [showPicker, setShowPicker] = useState(false); + const [selectedEmoji, setSelectedEmoji] = useState(defaultEmoji || "😀"); // Initialize with the default emoji from props or fallback to smiley + const [currentPage, setCurrentPage] = useState(0); + const [currentFolder, setCurrentFolder] = useState(firstFolder); // Initialize with first folder + + // When defaultEmoji changes (e.g., from backend data), update selectedEmoji + useEffect(() => { + if (defaultEmoji) { + setSelectedEmoji(defaultEmoji); + } + }, [defaultEmoji]); + + // Handle folder click + const handleFolderClick = (folderName) => { + setCurrentFolder(folderName); // Set the current folder + setCurrentPage(0); // Reset page to 0 when switching folders + }; + + // Get the emojis for the selected folder + const emojis = currentFolder ? emojiList[currentFolder] : []; + const totalPages = Math.ceil(emojis.length / EMOJIS_PER_PAGE); + const currentEmojis = emojis.slice( + currentPage * EMOJIS_PER_PAGE, + (currentPage + 1) * EMOJIS_PER_PAGE + ); + + const handleEmojiClick = (emoji) => { + setSelectedEmoji(emoji); + setShowPicker(false); // Close the picker when an emoji is selected + handleEmojiChange(emoji); // Call the parent handler with the selected emoji + }; + + const togglePicker = () => { + setShowPicker((prev) => !prev); // Toggle the picker visibility + }; + + const goToNextFolder = () => { + const currentIndex = folderNames.indexOf(currentFolder); + const nextFolderIndex = currentIndex + 1; + if (nextFolderIndex < folderNames.length) { + setCurrentFolder(folderNames[nextFolderIndex]); + setCurrentPage(0); // Reset to the first page of the next folder + } + }; + + const goToPreviousFolder = () => { + const currentIndex = folderNames.indexOf(currentFolder); + const previousFolderIndex = currentIndex - 1; + if (previousFolderIndex >= 0) { + const previousFolder = folderNames[previousFolderIndex]; + setCurrentFolder(previousFolder); + const lastPageOfPreviousFolder = Math.ceil(emojiList[previousFolder].length / EMOJIS_PER_PAGE) - 1; + setCurrentPage(lastPageOfPreviousFolder); // Set to the last page of the previous folder + } + }; + + const goToNextPage = () => { + if (currentPage < totalPages - 1) { + setCurrentPage(currentPage + 1); + } else { + goToNextFolder(); + } + }; + + const goToPreviousPage = () => { + if (currentPage > 0) { + setCurrentPage(currentPage - 1); + } else { + goToPreviousFolder(); + } + }; + + const isLastFolder = currentFolder === folderNames[folderNames.length - 1]; + const isLastPageOfLastFolder = isLastFolder && currentPage === totalPages - 1; + const isFirstFolder = currentFolder === folderNames[0]; + const isFirstPageOfFirstFolder = isFirstFolder && currentPage === 0; + + return ( +
    + {/* The emoji picker icon that changes when an emoji is selected */} + + + {/* Hoverable emoji picker */} + {showPicker && ( +
    +
    +
    + +
    + {currentEmojis.map((emoji, index) => ( + handleEmojiClick(emoji)} + > + {emoji} + + ))} +
    + +
    +
    + +
    + {folderNames.map((folderName, index) => ( +
    handleFolderClick(folderName)} + > + {emojiList[folderName][0]} +
    + ))} +
    +
    + )} +
    + ); +}; + +export default EmojiPicker; diff --git a/debugger/debugger_gui/src/components/pull-button/PullButton.css b/debugger/debugger_gui/src/components/pull-button/PullButton.css new file mode 100644 index 00000000..9cdbf300 --- /dev/null +++ b/debugger/debugger_gui/src/components/pull-button/PullButton.css @@ -0,0 +1,49 @@ +.pull-button-container { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + width: 40vw; +} + +.pull-button-img { + margin-right: 20px; + height: 100px; +} + +.pull-button-content { + display: flex; + flex-direction: column; + align-items: flex-start; +} + +.pull-button { + background-color: #A3FFA9; + color: black; + border: none; + padding: 10px 20px; + font-size: 1.45rem; + font-weight: bold; /* Changed from 900 to bold */ + font-family: 'Consolas', monospace; + cursor: pointer; + margin: 20px 0; + border-radius: 4px; +} + +.pull-button:hover { + background-color: #84d488; +} + +.pull-button:active { + background-color: #65a568; +} + +.pull-button:focus { + outline: none; +} + +.pull-button-container p { + color: #A3FFA9; + font-family: 'Consolas', monospace; + margin: 0; +} diff --git a/debugger/debugger_gui/src/components/pull-button/PullButton.js b/debugger/debugger_gui/src/components/pull-button/PullButton.js new file mode 100644 index 00000000..dcdf925a --- /dev/null +++ b/debugger/debugger_gui/src/components/pull-button/PullButton.js @@ -0,0 +1,32 @@ +import React from 'react'; +import { Button } from '@mui/material'; +import axios from 'axios'; +import pullImg from '../../assets/pull.png'; // Adjust the path according to your project structure +import './PullButton.css'; + + +const PullButton = ({ setProjectStructure }) => { + const pullStructure = async () => { + try { + const response = await axios.get('http://127.0.0.1:6969/pull_structure'); + console.log('Project structure:', response.data); + setProjectStructure(response.data); + } catch (error) { + console.error('Error fetching project structure:', error); + } + }; + + return ( +
    + Project Structure +
    + +

    Pull debugger config from backend

    +
    +
    + ); +}; + +export default PullButton; diff --git a/debugger/debugger_gui/src/components/push-button/PushButton.css b/debugger/debugger_gui/src/components/push-button/PushButton.css new file mode 100644 index 00000000..bc2a3eaa --- /dev/null +++ b/debugger/debugger_gui/src/components/push-button/PushButton.css @@ -0,0 +1,50 @@ +.push-button-container { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; + width: 40vw; + text-align: right; +} + +.push-button-img { + margin-left: 20px; + height: 100px; +} + +.push-button-content { + display: flex; + flex-direction: column; + align-items: flex-end; +} + +.push-button { + background-color: #FFA3A4; + color: black; + border: none; + padding: 10px 20px; + font-size: 1.45rem; + font-weight: bold; /* Changed from 900 to bold */ + font-family: 'Consolas', monospace; + cursor: pointer; + margin: 20px 0; + border-radius: 4px; +} + +.push-button:hover { + background-color: #cc8182; +} + +.push-button:active { + background-color: #a86768; +} + +.push-button:focus { + outline: none; +} + +.push-button-container p { + color: #FFA3A4; + font-family: 'Consolas', monospace; + margin: 0; +} \ No newline at end of file diff --git a/debugger/debugger_gui/src/components/push-button/PushButton.js b/debugger/debugger_gui/src/components/push-button/PushButton.js new file mode 100644 index 00000000..a55c65f2 --- /dev/null +++ b/debugger/debugger_gui/src/components/push-button/PushButton.js @@ -0,0 +1,33 @@ +import React from 'react'; +import axios from 'axios'; +import pushImg from '../../assets/push.png'; // Adjust the path according to your project structure +import './PushButton.css'; // Import the CSS file + +const PushButton = ({ projectStructure, setProjectStructure }) => { + const pushStructure = async () => { + try { + console.log("Pushing project structure to backend: ", projectStructure); + const response = await axios.post('http://127.0.0.1:6969/push_structure', { + projectStructure // Include the projectStructure in the POST request body + }); + console.log('Project structure pushed:', response.data); + setProjectStructure(response.data); + } catch (error) { + console.error('Error pushing project structure:', error); + } + }; + + return ( +
    +
    + +

    Push debugger config to backend

    +
    + Project Structure +
    + ); +}; + +export default PushButton; diff --git a/debugger/debugger_gui/src/components/sync-section/SyncSection.css b/debugger/debugger_gui/src/components/sync-section/SyncSection.css new file mode 100644 index 00000000..c64cc0fe --- /dev/null +++ b/debugger/debugger_gui/src/components/sync-section/SyncSection.css @@ -0,0 +1,16 @@ +.sync-section-container { + display: flex; + flex-direction: row; + justify-content: space-between; + width: 100vw; + align-items: center; + padding: 20px; + box-sizing: border-box; + gap: 0 +} + +.sync-section-container > div { + flex: 1; + display: flex; + justify-content: center; +} diff --git a/debugger/debugger_gui/src/components/sync-section/SyncSection.js b/debugger/debugger_gui/src/components/sync-section/SyncSection.js new file mode 100644 index 00000000..7e3588db --- /dev/null +++ b/debugger/debugger_gui/src/components/sync-section/SyncSection.js @@ -0,0 +1,17 @@ +import React from 'react'; +import PullButton from '../pull-button/PullButton'; +import PushButton from '../push-button/PushButton'; +import ColorReset from '../color-reset/ColorReset'; +import './SyncSection.css'; // Import the CSS file + +const SyncSection = ({ projectStructure, setProjectStructure }) => { + return ( +
    + + + +
    + ); +}; + +export default SyncSection; diff --git a/debugger/debugger_gui/src/components/tree/Tree.css b/debugger/debugger_gui/src/components/tree/Tree.css new file mode 100644 index 00000000..3e96dfc1 --- /dev/null +++ b/debugger/debugger_gui/src/components/tree/Tree.css @@ -0,0 +1,7 @@ +.tree-container { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + align-items: center; + } \ No newline at end of file diff --git a/debugger/debugger_gui/src/components/tree/Tree.js b/debugger/debugger_gui/src/components/tree/Tree.js new file mode 100644 index 00000000..ae87a83f --- /dev/null +++ b/debugger/debugger_gui/src/components/tree/Tree.js @@ -0,0 +1,33 @@ +import React from 'react'; +import TreeNode from '../tree_node/TreeNode'; +import './Tree.css'; + +const Tree = ({ projectStructure, expanded, handleExpandClick, handleCheckboxChange, handleColorChange, handleEmojiChange}) => { + const renderTree = (node, parentId = '') => { + const nodeId = parentId ? `${parentId}/${node.name}` : node.name; + + return ( + + ); + }; + + if (!Array.isArray(projectStructure)) return null; // Ensure projectStructure is an array + + return ( +
    + {projectStructure.map((node) => renderTree(node))} +
    + ); +}; + +export default Tree; diff --git a/debugger/debugger_gui/src/components/tree_node/TreeNode.css b/debugger/debugger_gui/src/components/tree_node/TreeNode.css new file mode 100644 index 00000000..ee333577 --- /dev/null +++ b/debugger/debugger_gui/src/components/tree_node/TreeNode.css @@ -0,0 +1,88 @@ +.tree-node { + border: 1px solid #ccc; + margin-top: 10px; + margin-bottom: 10px; + padding: 10px; + border-radius: 4px; + width: 100%; + background-color: #181818; +} + +.tree-node-content { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + width: 100%; +} + +.tree-node-content-main { + display: flex; + align-items: center; + width: fit-content; +} + +.expand-button { + background: none; + border: none; + cursor: pointer; + margin-right: 10px; + padding: 0; /* Ensure no padding around the button */ + display: flex; + align-items: center; + justify-content: center; +} + +.expand-button img { + width: 16px; /* Adjust the width as needed */ + height: 16px; /* Adjust the height as needed */ + max-width: 100%; /* Ensure it doesn't exceed button size */ + max-height: 100%; /* Ensure it doesn't exceed button size */ +} + +.tree-node-text { + margin-left: 10px; + font-size: 1.45rem; + font-weight: 600; + font-family: 'Consolas', monospace; /* Specify fallback font */ + color: #ffffff; /* Adjust text color to ensure it's visible on the dark background */ +} + +.tree-node-children { + margin-left: 20px; + margin-right: 20px; + margin-bottom: 10px; + padding-left: 20px; + padding-right: 20px; + gap: 10px; +} + +.tree-node-content-secondary { + display: flex; + align-items: center; +} + +.color-picker-wrapper { + position: relative; +} + +.color-picker-icon { + display: inline-block; + width: 24px; + height: 24px; + cursor: pointer; + border: 1px solid #000; + border-radius: 4px; + overflow: hidden; + background-size: 100% 100%; /* Ensure the background color scales to fit */ + background-clip: content-box; + background-color: transparent; /* Ensure the background is transparent */ + -webkit-mask: url('../../assets/color-picker.png') center no-repeat; + mask: url('../../assets/color-picker.png') center no-repeat; + -webkit-mask-size: 20px; /* Adjust this value to fit your icon */ + mask-size: 20px; /* Adjust this value to fit your icon */ +} + +.color-picker-icon img { + display: none; +} diff --git a/debugger/debugger_gui/src/components/tree_node/TreeNode.js b/debugger/debugger_gui/src/components/tree_node/TreeNode.js new file mode 100644 index 00000000..25127b6e --- /dev/null +++ b/debugger/debugger_gui/src/components/tree_node/TreeNode.js @@ -0,0 +1,52 @@ +import './TreeNode.css'; +import React from 'react'; +import plusIcon from '../../assets/collapsed.png'; +import minusIcon from '../../assets/expanded.png'; +import colorIcon from '../../assets/color-picker.png'; // Import your custom color icon +import EmojiPicker from '../emoji-picker/EmojiPicker'; + +const TreeNode = ({ node, nodeId, expanded, handleExpandClick, handleCheckboxChange, handleColorChange, handleEmojiChange, renderTree }) => ( +
    +
    +
    + {node.children && node.children.length > 0 && ( + + )} + handleCheckboxChange(nodeId, e.target.checked)} + /> + {/* Pass node.emoji along with handleEmojiChange */} + handleEmojiChange(nodeId, emoji)} + /> + {node.name} +
    +
    +
    + handleColorChange(nodeId, e.target.value)} + style={{ display: 'none' }} // Hide the default color input + id={`color-picker-${nodeId}`} + /> + +
    +
    +
    + {node.children && expanded[nodeId] && ( +
    + {node.children.map((childNode) => renderTree(childNode, nodeId))} +
    + )} +
    +); + +export default TreeNode; diff --git a/debugger/debugger_gui/src/index.css b/debugger/debugger_gui/src/index.css new file mode 100644 index 00000000..3a18e388 --- /dev/null +++ b/debugger/debugger_gui/src/index.css @@ -0,0 +1,14 @@ +body { + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + background-color: #242121; +} + +code { + font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', + monospace; +} diff --git a/debugger/debugger_gui/src/index.js b/debugger/debugger_gui/src/index.js new file mode 100644 index 00000000..54c5ef1a --- /dev/null +++ b/debugger/debugger_gui/src/index.js @@ -0,0 +1,9 @@ +import React from 'react'; +import ReactDOM from 'react-dom'; +import App from './App'; +import './index.css'; + +ReactDOM.render( + , + document.getElementById('root') +); diff --git a/debugger/run.sh b/debugger/run.sh new file mode 100755 index 00000000..b11d28b1 --- /dev/null +++ b/debugger/run.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# The comment above is functional DO NOT REMOVE + +DEBUGGER_ABSPATH="$(readlink -f "${BASH_SOURCE[0]}")" +DEBUGGER_DIR_ABSPATH="$(dirname "$DEBUGGER_ABSPATH")" + +if [[ "$OSTYPE" == "darwin"* ]]; then + sed -i '' 's/\r//g' "$DEBUGGER_ABSPATH" +else + sed -i 's/\r//g' "$DEBUGGER_ABSPATH" +fi +chmod +x "$DEBUGGER_ABSPATH" + +cleanup() { + printf "\033[36mCleaning up debugger...\033[0m\n" + wait $! +} + +# Set trap to call cleanup on script exit +trap cleanup EXIT + +cd "$DEBUGGER_DIR_ABSPATH/debugger_gui" +npm install +npm start & until curl -s http://localhost:6970 > /dev/null; do + sleep 1 +done +cd "$DEBUGGER_DIR_ABSPATH/debugger_backend" + +# colorize print to cyan +printf "\033[36mSetting up virtual environment...\033[0m\n" +python -m venv .venv +# Activate the Python virtual environment +if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then + # Windows + source .venv/Scripts/activate +else + # macOS/Linux + source .venv/bin/activate +fi + +# colorize print to cyan +printf "\033[36mInstalling Python dependencies...\033[0m\n" +pip install -r requirements.txt + +cd "$DEBUGGER_DIR_ABSPATH" +printf "\033[36mStarting debugger server...\033[0m\n" +python -m debugger_backend.debugger_server + +printf "\033[36mDeactivating Python virtual environment...\033[0m\n" +deactivate diff --git a/debugger/setup.py b/debugger/setup.py new file mode 100644 index 00000000..6be2ed70 --- /dev/null +++ b/debugger/setup.py @@ -0,0 +1,8 @@ +from setuptools import setup, find_packages + +setup( + name="debug", + version="0.1", + packages=find_packages(), + py_modules=["debug"] +) diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 00000000..5a1f03f9 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,104 @@ +# Dependencies +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +package-lock.json +yarn.lock + +# Build outputs +dist/ +build/ +*.tgz +*.tar.gz + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# IDE and Editor files +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Chrome Extension specific +*.crx +*.pem +*.zip + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Coverage directory used by tools like istanbul +coverage/ +*.lcov + +# nyc test coverage +.nyc_output + +# Dependency directories +jspm_packages/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt + +# Storybook build outputs +.out +.storybook-out + +# Temporary folders +tmp/ +temp/ + +# webpack generated files +*.hot-update.js +*.hot-update.json diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 00000000..52f0e3dc --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,62 @@ +{ + "name": "open-swarm", + "version": "1.0.0", + "description": "Open Swarm — Agent Orchestrator frontend built with React", + "scripts": { + "build": "webpack --mode=production", + "build:watch": "webpack --mode=development --watch", + "dev": "webpack serve --mode=development --open", + "clean": "rm -rf dist" + }, + "dependencies": { + "@codemirror/lang-html": "^6.4.11", + "@codemirror/lang-json": "^6.0.2", + "@codemirror/lang-python": "^6.2.1", + "@codemirror/state": "^6.5.4", + "@codemirror/theme-one-dark": "^6.1.3", + "@codemirror/view": "^6.39.16", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^7.3.9", + "@mui/material": "^7.3.9", + "@reduxjs/toolkit": "^2.8.2", + "@types/react-syntax-highlighter": "^15.5.13", + "codemirror": "^6.0.2", + "framer-motion": "^12.35.2", + "html-to-image": "^1.11.13", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-markdown": "^10.1.0", + "react-redux": "^9.2.0", + "react-router-dom": "^7.13.1", + "react-syntax-highlighter": "^16.1.1", + "remark-gfm": "^4.0.1" + }, + "devDependencies": { + "@babel/core": "^7.28.0", + "@babel/preset-env": "^7.28.0", + "@babel/preset-react": "^7.27.1", + "@babel/preset-typescript": "^7.27.1", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "@types/react-redux": "^7.1.34", + "babel-loader": "^9.2.1", + "css-loader": "^6.8.0", + "css-modules-types-loader": "^0.6.10", + "html-webpack-plugin": "^5.5.0", + "sass": "^1.89.2", + "sass-loader": "^16.0.5", + "style-loader": "^3.3.0", + "typescript": "^5.0.0", + "webpack": "^5.88.0", + "webpack-cli": "^5.1.0", + "webpack-dev-server": "^4.15.0" + }, + "babel": { + "presets": [ + "@babel/preset-env", + "@babel/preset-react", + "@babel/preset-typescript" + ] + } +} diff --git a/frontend/public/apple-touch-icon.png b/frontend/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8b9f86117d01dbf67e874f4deaaaa3686f26d9c6 GIT binary patch literal 327756 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
  1. S(bcTweX!!_){>Jc*aBWslZZLT6s1H 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 literal 0 HcmV?d00001 diff --git a/frontend/run/_utils.sh b/frontend/run/_utils.sh new file mode 100755 index 00000000..2d24af62 --- /dev/null +++ b/frontend/run/_utils.sh @@ -0,0 +1,202 @@ +#!/bin/bash +# Flag processing function with namespacing and global variable declaration +UTILS_FILE_ABSPATH="$(readlink -f "${BASH_SOURCE[0]}")" +if [[ "$OSTYPE" == "darwin"* ]]; then + # echo "In macOS utils sed START" + # echo "UTILS_ABSPATH: $UTILS_FILE_ABSPATH" + sed -i '' 's/\r//g' "$UTILS_FILE_ABSPATH" + # echo "In macOS utils sed END" +else + # echo "NOT in macOS utils START" + # echo "UTILS_ABSPATH: $UTILS_FILE_ABSPATH" + sed -i 's/\r//g' "$UTILS_FILE_ABSPATH" + # echo "NOT in macOS utils END" +fi +chmod +x "$UTILS_FILE_ABSPATH" + +RUN_DIR_ABSPATH="$(dirname "$UTILS_FILE_ABSPATH")" +FRONTEND_DIR_ABSPATH="$(dirname "$RUN_DIR_ABSPATH")" + +formatted_error() { + # Arguments: error message and array of conflicting flags + local initial_message="$1" + shift + local conflicting_flags=("$@") + + # Red color for the error message box + local COLOR_CODE='\033[0;31m' + local NC='\033[0m' # No Color + + # Start the error message with the initial message + local error_message="$initial_message" + + # Add each conflicting flag on a new line with indentation + for conflict in "${conflicting_flags[@]}"; do + error_message+="\n $conflict" # Replacing `\t` with four spaces + done + + # Prepare for printing by finding max length of each line in the message + local lines=() + local max_length=0 + + # Use printf to interpret new lines and calculate max length with spaces instead of tabs + while IFS= read -r line; do + # Substitute tabs with spaces for consistent width measurement + local line_with_spaces="${line//$'\t'/ }" + lines+=("$line_with_spaces") + if (( ${#line_with_spaces} > max_length )); then + max_length=${#line_with_spaces} + fi + done <<< "$(printf "$error_message")" + + # Create the top and bottom borders based on the maximum line length + local border=$(printf '%*s' "$((max_length + 4))" '' | tr ' ' '-') + + # Print the formatted error message with a red box + printf "\n${COLOR_CODE}%s${NC}\n" "$border" + for line in "${lines[@]}"; do + printf "${COLOR_CODE}| %-*s |${NC}\n" "$max_length" "$line" + done + printf "${COLOR_CODE}| %-*s |${NC}\n" "$max_length" "" + printf "${COLOR_CODE}%s${NC}\n" "$border" +} + + +function process_flags() { + local -n flags_to_commands="$1" # Reference to the dictionary of flags and commands + local -n exclusives="$2" # Reference to the list of exclusive flag groups + local namespace="$3" # Unique prefix for variables + local calling_script_name="$(basename "$(readlink -f "${BASH_SOURCE[1]}")")" + local caller_id="${FUNCNAME[1]}" + local should_exit=false + if [ "$caller_id" == "main" ]; then + caller_id="$calling_script_name" + fi + # echo "caller_id: $caller_id" + # echo "Initializing flags with namespace: $namespace" + + # Initialize flag variables with namespacing in the sourcing script context + for flag in "${!flags_to_commands[@]}"; do + # Convert flag to uppercase variable name and apply namespace, e.g., MYAPP_FLAG1 + local flag_var="${namespace}_${flag^^}" # Prefix and uppercase + flag_var="${flag_var//-}" # Remove dashes + eval "declare -g $flag_var=false" # Initialize as global false + + # Diagnostic output for each initialized variable + # echo "Initialized $flag_var as false" + done + + # echo "Parsing command line arguments: $@" + + # Parse command line arguments and set flags + local unsupported_flags=() + # local potential_typos=() + for arg in "$@"; do + # echo "Processing argument: $arg" + if [[ -n "${flags_to_commands[$arg]}" ]]; then + # echo "Flag found: $arg" + local flag_var="${namespace}_${arg^^}" # Prefix and uppercase + flag_var="${flag_var//-}" # Remove dashes + eval "declare -g $flag_var=true" # Set as global true + # echo "Set $flag_var to true" + # echo "Executing command for $arg: ${flags_to_commands[$arg]}" + eval "${flags_to_commands[$arg]}" + else + if [[ "$arg" == "-"* ]]; then + # echo "Flag not found: $arg" + unsupported_flags+=("$arg") + if [[ -n "${flags_to_commands[-$arg]}" ]]; then + # echo "Potential typo: $arg" + unsupported_flags+=("\t*Note: Potential typo detected.") + unsupported_flags+=("\tDid you mean: -$arg") + fi + fi + fi + done + # Check exclusive flag groups for conflicts + # echo "Checking exclusive flag groups" + for group in "${exclusives[@]}"; do + local count=0 + local conflicting_flags=() + for flag in $group; do + local flag_var="${namespace}_${flag^^}" + flag_var="${flag_var//-}" + if [[ "$(eval echo "\$$flag_var")" == "true" ]]; then + conflicting_flags+=("$flag") + # count=$((count + 1)) + # ec "$flag_var is true in exclusive group" + fi + done + if (( ${#conflicting_flags[@]} > 1 )); then + # echo "found conflicting flags" + formatted_error "Error: $caller_id\n-----------------------------------------\nIncompatible flags:\nThe flags below cannot be used together\n-----------------------------------------\n" "${conflicting_flags[@]}" + should_exit=true + fi + done + # echo "should_exit: $should_exit" + # echo "unsupported_flags: ${#unsupported_flags[@]}" + if (( ${#unsupported_flags[@]} > 0 )); then + # echo "found unsupported flags 2" + formatted_error "Error: $caller_id\n-------------------------------------------------\nUnsupported flags:\nThe flags below are not supported by this script\n-------------------------------------------------\n" "${unsupported_flags[@]}" + should_exit=true + fi + if [[ $should_exit == true ]]; then + exit 1 + fi +} + + + +formatted_echo() { + local COLOR_CODE='\033[0m' # No Color + local NC='\033[0m' # No Color variable + # local message="$2" + # If the second argument is empty, then theres no color specified, so we use the first argument as the message + if [[ -z "$2" ]]; then + message="$1" + else + message="$2" + fi + + declare -A format_flags + format_flags=( + [--red]="COLOR_CODE='\033[0;31m'" + [--green]="COLOR_CODE='\033[0;32m'" + [--yellow]="COLOR_CODE='\033[0;33m'" + [--blue]="COLOR_CODE='\033[0;34m'" + [--purple]="COLOR_CODE='\033[0;35m'" + [--cyan]="COLOR_CODE='\033[0;36m'" + ) + exclusive_format_flags=( + "--red --green --yellow --blue --purple --cyan" + ) + + # Pass the arguments with the namespace "FORMAT" + process_flags format_flags exclusive_format_flags "FORMAT" "$@" + + # Process the message + local text + text=$(printf "%b" "$message") + + # Expand any escaped characters in the input (e.g., \n) + local lines=() + local max_length=0 + + # Read the text line by line and find the maximum length + while IFS= read -r line; do + lines+=("$line") + if (( ${#line} > max_length )); then + max_length=${#line} + fi + done <<< "$text" + + # Create the top and bottom borders based on the maximum line length + local border=$(printf '%*s' "$((max_length + 4))" '' | tr ' ' '-') + + # Print the formatted box with selected color + printf "\n${COLOR_CODE}%s${NC}\n" "$border" + for line in "${lines[@]}"; do + printf "${COLOR_CODE}| %-*s |${NC}\n" "$max_length" "$line" + done + printf "${COLOR_CODE}%s${NC}\n" "$border" +} \ No newline at end of file diff --git a/frontend/run/dev.sh b/frontend/run/dev.sh new file mode 100755 index 00000000..b81fe212 --- /dev/null +++ b/frontend/run/dev.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# The comment above is shebang, DO NOT REMOVE +DEV_ABSPATH="$(readlink -f "${BASH_SOURCE[0]}")" +if [[ "$OSTYPE" == "darwin"* ]]; then + # echo "In macOS server sed START" + # echo "SERVER_ABSPATH: $SERVER_ABSPATH" + sed -i '' 's/\r//g' "$DEV_ABSPATH" + # echo "In macOS server sed END" +else + # echo "NOT in macOS server START" + # echo "SERVER_ABSPATH: $SERVER_ABSPATH" + sed -i 's/\r//g' "$DEV_ABSPATH" + # echo "NOT in macOS server START" +fi +chmod +x "$DEV_ABSPATH" +source "$(dirname "$DEV_ABSPATH")/_utils.sh" + + +formatted_echo --green "Installing dependencies..." +cd "$FRONTEND_DIR_ABSPATH" +npm install + +formatted_echo --green "Building with development mode..." +npm run dev + +# exit back to the dir that we were in before +cd - \ No newline at end of file diff --git a/frontend/src/app/Main.tsx b/frontend/src/app/Main.tsx new file mode 100644 index 00000000..b6161048 --- /dev/null +++ b/frontend/src/app/Main.tsx @@ -0,0 +1,173 @@ +import React, { useMemo, useEffect } from 'react'; +import { Provider } from 'react-redux'; +import { BrowserRouter, Routes, Route } from 'react-router-dom'; +import { ThemeProvider as MuiThemeProvider, createTheme, CssBaseline } from '@mui/material'; +import { store } from '../shared/state/store'; +import { useAppDispatch } from '@/shared/hooks'; +import { fetchSettings } from '@/shared/state/settingsSlice'; +import AppShell from './components/Layout/AppShell'; +import Dashboard from './pages/Dashboard/Dashboard'; +import DashboardSelection from './pages/DashboardSelection/DashboardSelection'; +import Templates from './pages/Templates/Templates'; +import Skills from './pages/Skills/Skills'; +import Tools from './pages/Tools/Tools'; +import Modes from './pages/Modes/Modes'; +import Commands from './pages/Commands/Commands'; +import Views from './pages/Views/Views'; +import { useKeyboardShortcuts } from '@/shared/hooks/useKeyboardShortcuts'; +import KeyboardShortcutsHelp from './components/KeyboardShortcutsHelp'; +import { ThemeProvider, useThemeMode, useClaudeTokens } from '@/shared/styles/ThemeContext'; +import { ClaudeTokens } from '@/shared/styles/claudeTokens'; + +function buildMuiTheme(c: ClaudeTokens, mode: 'light' | 'dark') { + return createTheme({ + palette: { + mode, + background: { + default: c.bg.page, + paper: c.bg.surface, + }, + primary: { + main: c.accent.primary, + dark: c.accent.pressed, + light: c.accent.hover, + }, + text: { + primary: c.text.primary, + secondary: c.text.muted, + disabled: c.text.tertiary, + }, + divider: c.border.medium, + error: { main: c.status.error }, + warning: { main: c.status.warning }, + success: { main: c.status.success }, + info: { main: c.status.info }, + }, + typography: { + fontFamily: c.font.sans, + h1: { fontWeight: 600 }, + h2: { fontWeight: 600 }, + h3: { fontWeight: 600 }, + h5: { fontWeight: 600 }, + h6: { fontWeight: 600 }, + button: { textTransform: 'none' as const, fontWeight: 500 }, + }, + shape: { + borderRadius: c.radius.xl, + }, + components: { + MuiCssBaseline: { + styleOverrides: { + body: { + backgroundColor: c.bg.page, + color: c.text.primary, + }, + }, + }, + MuiButton: { + styleOverrides: { + root: { + borderRadius: c.radius.lg, + transition: c.transition, + textTransform: 'none' as const, + '&:active': { transform: 'scale(0.98)' }, + }, + contained: { + boxShadow: 'none', + '&:hover': { boxShadow: 'none' }, + }, + }, + }, + MuiPaper: { + styleOverrides: { + root: { + boxShadow: c.shadow.md, + border: `1px solid ${c.border.subtle}`, + backgroundImage: 'none', + }, + }, + }, + MuiChip: { + styleOverrides: { + root: { + fontWeight: 500, + borderRadius: c.radius.md, + }, + }, + }, + MuiDialog: { + styleOverrides: { + paper: { + borderRadius: 16, + boxShadow: c.shadow.lg, + border: `1px solid ${c.border.subtle}`, + }, + }, + }, + MuiTooltip: { + styleOverrides: { + tooltip: { + backgroundColor: c.bg.inverse, + color: c.text.inverse, + fontSize: '0.75rem', + }, + }, + }, + }, + }); +} + +const ShortcutsProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + useKeyboardShortcuts(); + return <>{children}; +}; + +const SettingsLoader: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const dispatch = useAppDispatch(); + useEffect(() => { + dispatch(fetchSettings()); + }, [dispatch]); + return <>{children}; +}; + +const ThemedApp: React.FC = () => { + const c = useClaudeTokens(); + const { mode } = useThemeMode(); + const muiTheme = useMemo(() => buildMuiTheme(c, mode), [c, mode]); + + return ( + + + + + + + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + + + + + ); +}; + +const Main: React.FC = () => { + return ( + + + + + + ); +}; + +export default Main; diff --git a/frontend/src/app/components/CommandPicker.tsx b/frontend/src/app/components/CommandPicker.tsx new file mode 100644 index 00000000..32a38bbe --- /dev/null +++ b/frontend/src/app/components/CommandPicker.tsx @@ -0,0 +1,522 @@ +import React, { useState, useEffect, useMemo, useRef } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Paper from '@mui/material/Paper'; +import DescriptionIcon from '@mui/icons-material/Description'; +import PsychologyIcon from '@mui/icons-material/Psychology'; +import SmartToyOutlinedIcon from '@mui/icons-material/SmartToyOutlined'; +import QuestionAnswerOutlinedIcon from '@mui/icons-material/QuestionAnswerOutlined'; +import MapOutlinedIcon from '@mui/icons-material/MapOutlined'; +import CategoryOutlinedIcon from '@mui/icons-material/CategoryOutlined'; +import TuneOutlinedIcon from '@mui/icons-material/TuneOutlined'; +import InsertDriveFileOutlinedIcon from '@mui/icons-material/InsertDriveFileOutlined'; +import LanguageIcon from '@mui/icons-material/Language'; +import BuildOutlinedIcon from '@mui/icons-material/BuildOutlined'; +import SvgIcon from '@mui/material/SvgIcon'; +import ViewQuiltOutlinedIcon from '@mui/icons-material/ViewQuiltOutlined'; +import { useAppSelector, useAppDispatch } from '@/shared/hooks'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import { fetchBuiltinTools, fetchTools } from '@/shared/state/toolsSlice'; +import { fetchOutputs } from '@/shared/state/outputsSlice'; + +const XLogoIcon: React.FC<{ sx?: object }> = ({ sx }) => ( + + + +); + +const GoogleIcon: React.FC<{ sx?: object }> = ({ sx }) => ( + + + + + + +); + +const RedditIcon: React.FC<{ sx?: object }> = ({ sx }) => ( + + + +); + +const TOOL_GROUP_ICONS: Record> = { + Twitter: XLogoIcon, + Google: GoogleIcon, + Reddit: RedditIcon, + Web: LanguageIcon, + View: ViewQuiltOutlinedIcon, +}; + +export function getToolGroupIcon(groupName: string, size: number = 15): React.ReactNode { + const Icon = TOOL_GROUP_ICONS[groupName]; + if (Icon) return ; + return ; +} + +export interface CommandPickerItem { + id: string; + type: 'template' | 'skill' | 'mode' | 'context'; + category: string; + name: string; + description: string; + command: string; + icon: React.ReactNode; + toolNames?: string[]; + iconKey?: string; +} + +interface Props { + trigger: '/' | '@'; + filter: string; + onSelect: (item: CommandPickerItem) => void; + onClose: () => void; + visible: boolean; +} + +const MODE_ICON_MAP: Record> = { + smart_toy: SmartToyOutlinedIcon, + question_answer: QuestionAnswerOutlinedIcon, + map: MapOutlinedIcon, + category: CategoryOutlinedIcon, + tune: TuneOutlinedIcon, +}; + +function highlightMatch(text: string, query: string, color: string): React.ReactNode { + if (!query) return text; + const idx = text.toLowerCase().indexOf(query.toLowerCase()); + if (idx === -1) return text; + return ( + <> + {text.slice(0, idx)} + {text.slice(idx, idx + query.length)} + {text.slice(idx + query.length)} + + ); +} + +const CommandPicker: React.FC = ({ trigger, filter, onSelect, onClose, visible }) => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const templates = useAppSelector((s) => s.templates.items); + const skills = useAppSelector((s) => s.skills.items); + const modesMap = useAppSelector((s) => s.modes.items); + const builtinTools = useAppSelector((s) => s.tools.builtinTools); + const customTools = useAppSelector((s) => s.tools.items); + const outputItems = useAppSelector((s) => s.outputs.items); + const [selectedIndex, setSelectedIndex] = useState(0); + const containerRef = useRef(null); + + const toolsLoaded = useAppSelector((s) => s.tools.loaded); + const builtinLoaded = useAppSelector((s) => s.tools.builtinLoaded); + const outputsLoaded = useAppSelector((s) => s.outputs.loaded); + + useEffect(() => { + if (!builtinLoaded) dispatch(fetchBuiltinTools()); + if (!toolsLoaded) dispatch(fetchTools()); + if (!outputsLoaded) dispatch(fetchOutputs()); + }, [dispatch, builtinLoaded, toolsLoaded, outputsLoaded]); + + const items: CommandPickerItem[] = useMemo(() => { + let all: CommandPickerItem[] = []; + + if (trigger === '/') { + const templateItems: CommandPickerItem[] = Object.values(templates).map((t) => ({ + id: t.id, + type: 'template' as const, + category: 'Templates', + name: t.name, + description: t.description || `Template with ${t.fields.length} fields`, + command: t.name.toLowerCase().replace(/\s+/g, '-'), + icon: , + })); + + const skillItems: CommandPickerItem[] = Object.values(skills).map((s) => ({ + id: s.id, + type: 'skill' as const, + category: 'Skills', + name: s.name, + description: s.description || 'Skill', + command: s.command || s.id, + icon: , + })); + + const modeItems: CommandPickerItem[] = Object.values(modesMap).map((m) => { + const IconComp = MODE_ICON_MAP[m.icon] || SmartToyOutlinedIcon; + return { + id: m.id, + type: 'mode' as const, + category: 'Modes', + name: m.name, + description: m.description || 'Switch to this mode', + command: m.name.toLowerCase().replace(/\s+/g, '-'), + icon: , + }; + }); + + all = [...templateItems, ...skillItems, ...modeItems]; + } else { + const atItems: CommandPickerItem[] = [ + { + id: 'file', + type: 'context' as const, + category: 'Context', + name: 'File', + description: 'Attach a file or folder as context', + command: 'file', + icon: , + }, + ]; + + const hasWebSearch = builtinTools.some((t) => t.name === 'WebSearch' && t.deferred); + const hasWebFetch = builtinTools.some((t) => t.name === 'WebFetch' && t.deferred); + if (hasWebSearch || hasWebFetch) { + const webTools = [hasWebSearch && 'WebSearch', hasWebFetch && 'WebFetch'].filter(Boolean) as string[]; + atItems.push({ + id: 'web', + type: 'context' as const, + category: 'Tools', + name: 'Web', + description: 'Search the web and fetch URLs', + command: 'web', + icon: , + toolNames: webTools, + iconKey: 'Web', + }); + } + + for (const tool of Object.values(customTools)) { + if (!tool.mcp_config || Object.keys(tool.mcp_config).length === 0) continue; + const services = tool.tool_permissions?._services as Record | undefined; + if (!services) continue; + const perms = tool.tool_permissions as Record; + const serviceGroups = (tool.tool_permissions?._service_groups ?? {}) as Record; + + const enabledServices: { name: string; tools: string[] }[] = []; + for (const [serviceName, serviceTools] of Object.entries(services)) { + const allToolNames = [...(serviceTools.read || []), ...(serviceTools.write || [])]; + const enabled = allToolNames.filter((name) => perms[name] !== 'deny'); + if (enabled.length > 0) enabledServices.push({ name: serviceName, tools: enabled }); + } + + if (enabledServices.length === 0) continue; + + const groupEntries = Object.entries(serviceGroups); + const emittedServices = new Set(); + + for (const [groupName, groupServiceNames] of groupEntries) { + const groupCmd = groupName.toLowerCase().replace(/\s+/g, '-'); + const groupServices = enabledServices.filter((s) => groupServiceNames.includes(s.name)); + if (groupServices.length === 0) continue; + groupServices.forEach((s) => emittedServices.add(s.name)); + + const groupIcon = getToolGroupIcon(groupName); + if (groupServices.length >= 2) { + const allTools = groupServices.flatMap((s) => s.tools); + atItems.push({ + id: `mcp-${tool.id}-group-${groupName}`, + type: 'context' as const, + category: tool.name, + name: groupName, + description: `Use all ${groupName} tools`, + command: groupCmd, + icon: groupIcon, + toolNames: allTools, + iconKey: groupName, + }); + for (const svc of groupServices) { + atItems.push({ + id: `mcp-${tool.id}-${svc.name}`, + type: 'context' as const, + category: tool.name, + name: svc.name, + description: `Use ${svc.name} tools from ${tool.name}`, + command: `${groupCmd}/${svc.name.toLowerCase().replace(/\s+/g, '-')}`, + icon: groupIcon, + toolNames: svc.tools, + iconKey: groupName, + }); + } + } else { + const svc = groupServices[0]; + atItems.push({ + id: `mcp-${tool.id}-${svc.name}`, + type: 'context' as const, + category: tool.name, + name: svc.name, + description: `Use ${svc.name} tools from ${tool.name}`, + command: svc.name.toLowerCase().replace(/\s+/g, '-'), + icon: groupIcon, + toolNames: svc.tools, + iconKey: groupName, + }); + } + } + + for (const svc of enabledServices) { + if (emittedServices.has(svc.name)) continue; + atItems.push({ + id: `mcp-${tool.id}-${svc.name}`, + type: 'context' as const, + category: tool.name, + name: svc.name, + description: `Use ${svc.name} tools from ${tool.name}`, + command: svc.name.toLowerCase().replace(/\s+/g, '-'), + icon: , + toolNames: svc.tools, + }); + } + } + + for (const out of Object.values(outputItems)) { + if (out.permission === 'deny') continue; + const cmd = out.name.toLowerCase().replace(/\s+/g, '-'); + atItems.push({ + id: `view-${out.id}`, + type: 'context' as const, + category: 'Views', + name: out.name, + description: out.description || `Render ${out.name} view`, + command: cmd, + icon: , + toolNames: ['RenderOutput'], + iconKey: 'View', + }); + } + + all = atItems; + } + + if (!filter) return all; + const lower = filter.toLowerCase(); + return all.filter( + (item) => + item.name.toLowerCase().includes(lower) || + item.command.toLowerCase().includes(lower) || + item.description.toLowerCase().includes(lower), + ); + }, [trigger, templates, skills, modesMap, builtinTools, customTools, outputItems, filter]); + + const flatItems = useMemo(() => { + const result: { item: CommandPickerItem; isGroupStart: boolean; category: string }[] = []; + let lastCat = ''; + for (const item of items) { + result.push({ item, isGroupStart: item.category !== lastCat, category: item.category }); + lastCat = item.category; + } + return result; + }, [items]); + + const getIconColor = (item: CommandPickerItem): string => { + switch (item.type) { + case 'template': return c.accent.primary; + case 'skill': return c.status.success; + case 'mode': { + const mode = modesMap[item.id]; + return mode?.color || c.accent.primary; + } + case 'context': return c.text.tertiary; + default: return c.text.tertiary; + } + }; + + useEffect(() => { + setSelectedIndex(0); + }, [filter, trigger]); + + useEffect(() => { + if (!containerRef.current) return; + const el = containerRef.current.querySelector(`[data-picker-idx="${selectedIndex}"]`); + if (el) el.scrollIntoView({ block: 'nearest' }); + }, [selectedIndex]); + + useEffect(() => { + if (!visible) return; + const handler = (e: KeyboardEvent) => { + switch (e.key) { + case 'ArrowDown': + e.preventDefault(); + setSelectedIndex((p) => (p < items.length - 1 ? p + 1 : p)); + break; + case 'ArrowUp': + e.preventDefault(); + setSelectedIndex((p) => (p > 0 ? p - 1 : p)); + break; + case 'Enter': + case 'Tab': + if (items[selectedIndex]) { + e.preventDefault(); + onSelect(items[selectedIndex]); + } + break; + case 'Escape': + e.preventDefault(); + onClose(); + break; + } + }; + window.addEventListener('keydown', handler); + return () => window.removeEventListener('keydown', handler); + }, [visible, items, selectedIndex, onSelect, onClose]); + + if (!visible || items.length === 0) return null; + + return ( + + + {flatItems.map(({ item, isGroupStart, category }, idx) => ( + + {isGroupStart && ( + + + {category} + + + )} + onSelect(item)} + onMouseEnter={() => setSelectedIndex(idx)} + sx={{ + display: 'flex', + alignItems: 'center', + gap: 1, + px: 1.25, + py: 0.5, + mx: 0.5, + borderRadius: '8px', + cursor: 'pointer', + bgcolor: idx === selectedIndex ? `${c.accent.primary}0a` : 'transparent', + '&:hover': { bgcolor: `${c.accent.primary}0a` }, + transition: 'background-color 60ms ease', + }} + > + + {item.icon} + + + {trigger}{highlightMatch(item.command, filter, c.accent.primary)} + + + {item.description} + + + + ))} + + + + {[ + { keys: '↑↓', label: 'navigate' }, + { keys: '↵', label: 'select' }, + { keys: 'esc', label: 'dismiss' }, + ].map(({ keys, label }) => ( + + + {keys} + + + {label} + + + ))} + + + ); +}; + +export default CommandPicker; diff --git a/frontend/src/app/components/DirectoryBrowser.tsx b/frontend/src/app/components/DirectoryBrowser.tsx new file mode 100644 index 00000000..768832d0 --- /dev/null +++ b/frontend/src/app/components/DirectoryBrowser.tsx @@ -0,0 +1,334 @@ +import React, { useState, useEffect, useCallback } from 'react'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import DialogActions from '@mui/material/DialogActions'; +import Button from '@mui/material/Button'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import TextField from '@mui/material/TextField'; +import List from '@mui/material/List'; +import ListItemButton from '@mui/material/ListItemButton'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import CircularProgress from '@mui/material/CircularProgress'; +import IconButton from '@mui/material/IconButton'; +import Breadcrumbs from '@mui/material/Breadcrumbs'; +import Link from '@mui/material/Link'; +import FolderIcon from '@mui/icons-material/Folder'; +import InsertDriveFileOutlinedIcon from '@mui/icons-material/InsertDriveFileOutlined'; +import ArrowUpwardIcon from '@mui/icons-material/ArrowUpward'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import { BrowseResult } from '@/shared/state/settingsSlice'; + +const API_BASE = `http://${window.location.hostname}:8324/api/settings`; + +export interface ContextPath { + path: string; + type: 'file' | 'directory'; +} + +interface DirectoryBrowserProps { + open: boolean; + onClose: () => void; + onSelect: (item: ContextPath) => void; + initialPath?: string; +} + +const DirectoryBrowser: React.FC = ({ open, onClose, onSelect, initialPath }) => { + const c = useClaudeTokens(); + const [browseData, setBrowseData] = useState(null); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [manualPath, setManualPath] = useState(''); + const [selected, setSelected] = useState<{ name: string; type: 'file' | 'directory' } | null>(null); + + const browse = useCallback(async (path: string) => { + setLoading(true); + setError(null); + setSelected(null); + try { + const res = await fetch(`${API_BASE}/browse-directories?path=${encodeURIComponent(path)}`); + if (!res.ok) { + const data = await res.json(); + throw new Error(data.detail || 'Failed to browse'); + } + const data: BrowseResult = await res.json(); + setBrowseData(data); + setManualPath(data.current); + } catch (e: any) { + setError(e.message); + } finally { + setLoading(false); + } + }, []); + + useEffect(() => { + if (open) { + setSelected(null); + browse(initialPath || ''); + } + }, [open, initialPath, browse]); + + const handleNavigate = (dir: string) => { + if (browseData) browse(`${browseData.current}/${dir}`); + }; + + const handleGoUp = () => { + if (browseData?.parent) browse(browseData.parent); + }; + + const handleManualGo = () => { + if (manualPath.trim()) browse(manualPath.trim()); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter') handleManualGo(); + }; + + const handleConfirm = () => { + if (!browseData) return; + if (selected) { + const fullPath = `${browseData.current}/${selected.name}`; + onSelect({ path: fullPath, type: selected.type }); + } else { + onSelect({ path: browseData.current, type: 'directory' }); + } + onClose(); + }; + + const pathSegments = browseData?.current.split('/').filter(Boolean) ?? []; + const hasEntries = (browseData?.directories.length ?? 0) + (browseData?.files.length ?? 0) > 0; + + return ( + + + Browse Files & Folders + + + + setManualPath(e.target.value)} + onKeyDown={handleKeyDown} + size="small" + fullWidth + placeholder="Type a path..." + sx={{ + '& .MuiOutlinedInput-root': { + bgcolor: c.bg.page, + fontSize: '0.85rem', + fontFamily: c.font.mono, + }, + }} + /> + + + + {browseData && ( + + + + + + browse('/')} + sx={{ color: c.text.tertiary, fontSize: '0.78rem' }} + > + / + + {pathSegments.map((seg, i) => { + const fullPath = '/' + pathSegments.slice(0, i + 1).join('/'); + const isLast = i === pathSegments.length - 1; + return isLast ? ( + + {seg} + + ) : ( + browse(fullPath)} + sx={{ color: c.text.tertiary, fontSize: '0.78rem' }} + > + {seg} + + ); + })} + + + )} + + {error && ( + + {error} + + )} + + + {loading ? ( + + + + ) : !hasEntries ? ( + + + Empty directory + + + ) : ( + + {browseData?.directories.map((dir) => ( + handleNavigate(dir)} + onClick={() => + setSelected((prev) => + prev?.name === dir && prev.type === 'directory' ? null : { name: dir, type: 'directory' }, + ) + } + sx={{ + py: 0.75, + '&.Mui-selected': { bgcolor: `${c.accent.primary}0c` }, + '&:hover': { bgcolor: `${c.accent.primary}08` }, + }} + > + + + + + + ))} + {browseData?.files.map((file) => ( + + setSelected((prev) => + prev?.name === file && prev.type === 'file' ? null : { name: file, type: 'file' }, + ) + } + sx={{ + py: 0.75, + '&.Mui-selected': { bgcolor: `${c.accent.primary}0c` }, + '&:hover': { bgcolor: `${c.accent.primary}08` }, + }} + > + + + + + + ))} + + )} + + + + + {selected + ? `Selected: ${selected.name}` + : 'Click to select, double-click folders to open'} + + + + + + + + ); +}; + +export default DirectoryBrowser; diff --git a/frontend/src/app/components/ElementSelectionContext.tsx b/frontend/src/app/components/ElementSelectionContext.tsx new file mode 100644 index 00000000..cfe88433 --- /dev/null +++ b/frontend/src/app/components/ElementSelectionContext.tsx @@ -0,0 +1,80 @@ +import React, { createContext, useContext, useState, useRef, useCallback, RefObject } from 'react'; + +export interface SelectedElement { + id: string; + selectorPath: string; + tagName: string; + className: string; + outerHTML: string; + computedStyles: Record; + screenshot?: string; + boundingRect: { x: number; y: number; width: number; height: number }; + semanticType?: 'agent-card' | 'message' | 'tool-call' | 'tool-group' | 'view-card' | 'dom-element'; + semanticLabel?: string; + semanticData?: Record; +} + +interface ElementSelectionContextValue { + selectMode: boolean; + toggleSelectMode: () => void; + setSelectMode: (active: boolean) => void; + selectedElements: SelectedElement[]; + addSelectedElement: (el: SelectedElement) => void; + updateSelectedElement: (id: string, patch: Partial) => void; + removeSelectedElement: (id: string) => void; + clearSelectedElements: () => void; + iframeRef: RefObject; +} + +const ElementSelectionContext = createContext(null); + +export function useElementSelection() { + return useContext(ElementSelectionContext); +} + +export const ElementSelectionProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const [selectMode, setSelectMode] = useState(false); + const [selectedElements, setSelectedElements] = useState([]); + const iframeRef = useRef(null); + + const toggleSelectMode = useCallback(() => { + setSelectMode((prev) => !prev); + }, []); + + const addSelectedElement = useCallback((el: SelectedElement) => { + setSelectedElements((prev) => { + if (prev.some((e) => e.id === el.id)) return prev; + return [...prev, el]; + }); + }, []); + + const updateSelectedElement = useCallback((id: string, patch: Partial) => { + setSelectedElements((prev) => prev.map((e) => e.id === id ? { ...e, ...patch } : e)); + }, []); + + const removeSelectedElement = useCallback((id: string) => { + setSelectedElements((prev) => prev.filter((e) => e.id !== id)); + }, []); + + const clearSelectedElements = useCallback(() => { + setSelectedElements([]); + }, []); + + return ( + + {children} + + ); +}; diff --git a/frontend/src/app/components/GlobalApprovalOverlay.tsx b/frontend/src/app/components/GlobalApprovalOverlay.tsx new file mode 100644 index 00000000..4405e7bf --- /dev/null +++ b/frontend/src/app/components/GlobalApprovalOverlay.tsx @@ -0,0 +1,203 @@ +import React, { useMemo, useCallback, useState, useEffect } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Chip from '@mui/material/Chip'; +import IconButton from '@mui/material/IconButton'; +import ExpandLessIcon from '@mui/icons-material/ExpandLess'; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import NotificationsActiveIcon from '@mui/icons-material/NotificationsActive'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { handleApproval, ApprovalRequest } from '@/shared/state/agentsSlice'; +import ApprovalBar, { BatchApprovalBar } from '@/app/pages/AgentChat/ApprovalBar'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +interface SessionApprovalGroup { + sessionId: string; + sessionName: string; + approvals: ApprovalRequest[]; +} + +const GlobalApprovalOverlay: React.FC = () => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const sessions = useAppSelector((state) => state.agents.sessions); + const [collapsed, setCollapsed] = useState(false); + + const groups: SessionApprovalGroup[] = useMemo(() => { + const result: SessionApprovalGroup[] = []; + for (const [sessionId, session] of Object.entries(sessions)) { + if (session.pending_approvals.length > 0) { + result.push({ + sessionId, + sessionName: session.name || 'Agent', + approvals: session.pending_approvals, + }); + } + } + return result; + }, [sessions]); + + const totalApprovals = useMemo( + () => groups.reduce((sum, g) => sum + g.approvals.length, 0), + [groups], + ); + + useEffect(() => { + if (totalApprovals > 0) { + setCollapsed(false); + } + }, [totalApprovals]); + + const onApprove = useCallback( + (requestId: string, updatedInput?: Record) => { + dispatch(handleApproval({ requestId, behavior: 'allow', updatedInput })); + }, + [dispatch], + ); + + const onDeny = useCallback( + (requestId: string, message?: string) => { + dispatch(handleApproval({ requestId, behavior: 'deny', message })); + }, + [dispatch], + ); + + if (totalApprovals === 0) return null; + + return ( + + {/* Header */} + setCollapsed((v) => !v)} + sx={{ + display: 'flex', + alignItems: 'center', + gap: 1, + px: 2, + py: 1.25, + bgcolor: c.status.warningBg, + borderBottom: collapsed ? 'none' : `1px solid ${c.status.warning}20`, + cursor: 'pointer', + userSelect: 'none', + '&:hover': { bgcolor: `${c.status.warning}18` }, + transition: 'background-color 0.15s', + }} + > + + + Approval Required + + + + {collapsed ? : } + + + + {/* Content */} + {!collapsed && ( + + {groups.map((group) => ( + + {groups.length > 1 && ( + + {group.sessionName} + + )} + {group.approvals.length > 1 ? ( + + ) : ( + group.approvals.map((req) => ( + + )) + )} + + ))} + + )} + + ); +}; + +export default GlobalApprovalOverlay; diff --git a/frontend/src/app/components/KeyboardShortcutsHelp.tsx b/frontend/src/app/components/KeyboardShortcutsHelp.tsx new file mode 100644 index 00000000..117fc2ac --- /dev/null +++ b/frontend/src/app/components/KeyboardShortcutsHelp.tsx @@ -0,0 +1,93 @@ +import React, { useState, useEffect } from 'react'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +const shortcuts = [ + { key: 'd', description: 'Go to Dashboard' }, + { key: 't', description: 'Go to Templates' }, + { key: '1-9', description: 'Open agent by position' }, + { key: 'Shift+A', description: 'Approve all pending' }, + { key: 'Shift+D', description: 'Deny all pending' }, + { key: '?', description: 'Show this help' }, +]; + +const KeyboardShortcutsHelp: React.FC = () => { + const c = useClaudeTokens(); + const [open, setOpen] = useState(false); + + useEffect(() => { + const handler = (e: KeyboardEvent) => { + const target = e.target as HTMLElement; + if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) return; + if (e.key === '?') { + setOpen((prev) => !prev); + } + }; + window.addEventListener('keydown', handler); + return () => window.removeEventListener('keydown', handler); + }, []); + + return ( + setOpen(false)} + PaperProps={{ + sx: { + bgcolor: c.bg.surface, + color: c.text.primary, + borderRadius: 4, + border: `1px solid ${c.border.subtle}`, + minWidth: 360, + boxShadow: c.shadow.lg, + }, + }} + > + + Keyboard Shortcuts + + + {shortcuts.map((s) => ( + + {s.description} + + + {s.key} + + + + ))} + + + ); +}; + +export default KeyboardShortcutsHelp; diff --git a/frontend/src/app/components/Layout/AppShell.tsx b/frontend/src/app/components/Layout/AppShell.tsx new file mode 100644 index 00000000..dddc98ba --- /dev/null +++ b/frontend/src/app/components/Layout/AppShell.tsx @@ -0,0 +1,303 @@ +import React, { useState, useEffect } from 'react'; +import { NavLink, Outlet, useNavigate, useLocation } from 'react-router-dom'; +import { openSettingsModal } from '@/shared/state/settingsSlice'; +import Box from '@mui/material/Box'; +import List from '@mui/material/List'; +import ListItemButton from '@mui/material/ListItemButton'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import Collapse from '@mui/material/Collapse'; +import DashboardIcon from '@mui/icons-material/Dashboard'; +import DescriptionIcon from '@mui/icons-material/Description'; +import PsychologyIcon from '@mui/icons-material/Psychology'; +import BuildIcon from '@mui/icons-material/Build'; +import TuneIcon from '@mui/icons-material/Tune'; +import TerminalIcon from '@mui/icons-material/Terminal'; +import ViewQuiltIcon from '@mui/icons-material/ViewQuilt'; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import AddIcon from '@mui/icons-material/Add'; +import SettingsIcon from '@mui/icons-material/Settings'; +import Settings from '@/app/pages/Settings/Settings'; +import GlobalApprovalOverlay from '@/app/components/GlobalApprovalOverlay'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { fetchDashboards, createDashboard } from '@/shared/state/dashboardsSlice'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +const NAV_ITEMS = [ + { label: 'Templates', path: '/templates', icon: }, + { label: 'Skills', path: '/skills', icon: }, + { label: 'Tools', path: '/tools', icon: }, + { label: 'Modes', path: '/modes', icon: }, + { label: 'Commands', path: '/commands', icon: }, + { label: 'Views', path: '/views', icon: }, +]; + + +const AppShell: React.FC = () => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const navigate = useNavigate(); + const location = useLocation(); + const [dashboardsExpanded, setDashboardsExpanded] = useState(false); + + const dashboardItems = useAppSelector((state) => state.dashboards.items); + const dashboardList = Object.values(dashboardItems).sort( + (a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime(), + ); + + useEffect(() => { + dispatch(fetchDashboards()); + }, [dispatch]); + + const isDashboardRoute = location.pathname === '/' || location.pathname.startsWith('/dashboard/'); + const activeDashboardId = location.pathname.startsWith('/dashboard/') + ? location.pathname.split('/dashboard/')[1] + : null; + + const handleDashboardsClick = () => { + if (isDashboardRoute && location.pathname === '/') { + setDashboardsExpanded((prev) => !prev); + } else { + navigate('/'); + setDashboardsExpanded(true); + } + }; + + const handleDashboardItemClick = (dashboardId: string) => { + navigate(`/dashboard/${dashboardId}`); + }; + + const handleCreateDashboard = async (e: React.MouseEvent) => { + e.stopPropagation(); + const result = await dispatch(createDashboard('Untitled Dashboard')); + if (createDashboard.fulfilled.match(result)) { + navigate(`/dashboard/${result.payload.id}`); + } + }; + + return ( + + + + + + + Open Swarm + + + Agent Orchestrator + + + + + + + + + + + + + + + {dashboardList.length > 0 && ( + + )} + + + 0} timeout={200}> + + {dashboardList.map((entry) => { + const isActive = activeDashboardId === entry.id; + return ( + handleDashboardItemClick(entry.id)} + sx={{ + display: 'flex', + alignItems: 'center', + gap: 0.5, + px: 1.5, + py: 0.75, + borderRadius: 0, + cursor: 'pointer', + bgcolor: isActive ? `${c.accent.primary}08` : 'transparent', + borderLeft: isActive ? `1.5px solid ${c.accent.primary}90` : '1.5px solid transparent', + '&:hover': { bgcolor: `${c.accent.primary}0C` }, + transition: 'background-color 0.15s, border-color 0.15s', + }} + > + {isActive && ( + + )} + + + {entry.name} + + + + ); + })} + + + + + + {NAV_ITEMS.map((item) => ( + + {({ isActive }) => ( + + + {item.icon} + + + + )} + + ))} + + + {/* Settings */} + + + Settings + + + dispatch(openSettingsModal())} + size="small" + sx={{ + color: c.text.tertiary, + '&:hover': { color: c.accent.primary, bgcolor: `${c.accent.primary}0A` }, + transition: c.transition, + }} + > + + + + + + + + + + + + + + ); +}; + +export default AppShell; diff --git a/frontend/src/app/components/RichPromptEditor.tsx b/frontend/src/app/components/RichPromptEditor.tsx new file mode 100644 index 00000000..707579b2 --- /dev/null +++ b/frontend/src/app/components/RichPromptEditor.tsx @@ -0,0 +1,366 @@ +import React, { useState, useRef, useCallback, useEffect } from 'react'; +import { createPortal } from 'react-dom'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import CommandPicker, { CommandPickerItem } from '@/app/components/CommandPicker'; +import { + SKILL_PILL_ATTR, + AttachedSkill, + createSkillPillElement, + serializeEditorContent, + detectEditorTrigger, + TriggerState, + EMPTY_TRIGGER, +} from '@/app/components/richEditorUtils'; +import TemplateInvokeModal from '@/app/pages/AgentChat/TemplateInvokeModal'; +import { useAppSelector } from '@/shared/hooks'; +import { PromptTemplate } from '@/shared/state/templatesSlice'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +interface RichPromptEditorProps { + value: string; + onChange: (value: string) => void; + label?: string; + placeholder?: string; + minRows?: number; + maxRows?: number; +} + +const LINE_HEIGHT = 1.5; +const FONT_SIZE = 0.85; + +const RichPromptEditor: React.FC = ({ + value, + onChange, + label = '', + placeholder = '', + minRows = 3, + maxRows = 8, +}) => { + const c = useClaudeTokens(); + const editorRef = useRef(null); + const wrapperRef = useRef(null); + const [focused, setFocused] = useState(false); + const [hasContent, setHasContent] = useState(false); + + const [attachedSkills, setAttachedSkills] = useState>({}); + const attachedSkillsRef = useRef(attachedSkills); + attachedSkillsRef.current = attachedSkills; + + const [picker, setPicker] = useState(EMPTY_TRIGGER); + const [pickerRect, setPickerRect] = useState(null); + const [selectedTemplate, setSelectedTemplate] = useState(null); + + const templates = useAppSelector((state) => state.templates.items); + const skills = useAppSelector((state) => state.skills.items); + + useEffect(() => { + if (picker.visible && wrapperRef.current) { + setPickerRect(wrapperRef.current.getBoundingClientRect()); + } else { + setPickerRect(null); + } + }, [picker.visible]); + + const minHeight = minRows * FONT_SIZE * LINE_HEIGHT; + const maxHeight = maxRows * FONT_SIZE * LINE_HEIGHT; + + const isLabelFloating = focused || hasContent; + + // Sync external value → editor on mount / when value changes externally + const lastEmittedRef = useRef(value); + useEffect(() => { + const editor = editorRef.current; + if (!editor) return; + if (value === lastEmittedRef.current) return; + // External change — update editor content + lastEmittedRef.current = value; + editor.textContent = value; + setHasContent(!!value); + }, [value]); + + const emitChange = useCallback(() => { + const editor = editorRef.current; + if (!editor) return; + const serialized = serializeEditorContent(editor, attachedSkillsRef.current); + lastEmittedRef.current = serialized; + onChange(serialized); + }, [onChange]); + + const updateHasContent = useCallback(() => { + const editor = editorRef.current; + if (!editor) return; + const text = (editor.textContent || '').replace(/\u200B/g, ''); + const hasPills = editor.querySelector(`[${SKILL_PILL_ATTR}]`) !== null; + setHasContent(text.trim().length > 0 || hasPills); + }, []); + + const syncAttachedSkills = useCallback(() => { + const editor = editorRef.current; + if (!editor) return; + const pillIds = new Set( + Array.from(editor.querySelectorAll(`[${SKILL_PILL_ATTR}]`)) + .map((el) => el.getAttribute(SKILL_PILL_ATTR)) + .filter(Boolean) as string[], + ); + setAttachedSkills((prev) => { + const prevKeys = Object.keys(prev); + if (prevKeys.length === pillIds.size && prevKeys.every((k) => pillIds.has(k))) return prev; + const next: Record = {}; + for (const [id, skill] of Object.entries(prev)) { + if (pillIds.has(id)) next[id] = skill; + } + return next; + }); + }, []); + + const removeSkillPill = useCallback((skillId: string) => { + const editor = editorRef.current; + if (!editor) return; + const pill = editor.querySelector(`[${SKILL_PILL_ATTR}="${skillId}"]`); + if (pill) pill.remove(); + setAttachedSkills((prev) => { + const { [skillId]: _, ...rest } = prev; + return rest; + }); + updateHasContent(); + emitChange(); + editor.focus(); + }, [updateHasContent, emitChange]); + + const detectTrigger = useCallback(() => { + const result = detectEditorTrigger(); + if (result) { + setPicker(result); + } else { + setPicker((p) => ({ ...p, visible: false })); + } + }, []); + + const handleInput = useCallback(() => { + updateHasContent(); + detectTrigger(); + syncAttachedSkills(); + emitChange(); + }, [updateHasContent, detectTrigger, syncAttachedSkills, emitChange]); + + const handleEditorClick = useCallback(() => { + detectTrigger(); + }, [detectTrigger]); + + const handlePickerSelect = (item: CommandPickerItem) => { + setPicker((p) => ({ ...p, visible: false })); + const editor = editorRef.current; + if (!editor) return; + editor.focus(); + + const { triggerNode, triggerOffset, filter } = picker; + if (triggerNode && triggerNode.parentNode && editor.contains(triggerNode)) { + const endOffset = Math.min(triggerOffset + 1 + filter.length, triggerNode.length); + const range = document.createRange(); + range.setStart(triggerNode, triggerOffset); + range.setEnd(triggerNode, endOffset); + range.deleteContents(); + const sel = window.getSelection(); + if (sel) { sel.removeAllRanges(); sel.addRange(range); } + } + + if (item.type === 'template') { + const tmpl = templates[item.id]; + if (!tmpl) return; + if (tmpl.fields.length === 0) { + document.execCommand('insertText', false, tmpl.template); + } else { + setSelectedTemplate(tmpl); + } + } else if (item.type === 'skill') { + const skill = skills[item.id]; + if (!skill) return; + if (editor.querySelector(`[${SKILL_PILL_ATTR}="${skill.id}"]`)) return; + + const pill = createSkillPillElement( + { id: skill.id, name: skill.name, content: skill.content }, + removeSkillPill, + c.font.mono, + c.status.error, + ); + + const sel = window.getSelection(); + if (sel && sel.rangeCount > 0) { + const range = sel.getRangeAt(0); + range.collapse(false); + range.insertNode(pill); + const spacer = document.createTextNode('\u200B'); + pill.after(spacer); + const newRange = document.createRange(); + newRange.setStartAfter(spacer); + newRange.collapse(true); + sel.removeAllRanges(); + sel.addRange(newRange); + } + + setAttachedSkills((prev) => ({ + ...prev, + [skill.id]: { id: skill.id, name: skill.name, content: skill.content }, + })); + } else if (item.type === 'mode') { + document.execCommand('insertText', false, item.name); + } else if (item.type === 'context') { + document.execCommand('insertText', false, `@${item.command} `); + } + + updateHasContent(); + emitChange(); + setTimeout(() => editor.focus(), 0); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (picker.visible && ['ArrowDown', 'ArrowUp', 'Escape', 'Tab', 'Enter'].includes(e.key)) { + e.preventDefault(); + return; + } + if ((e.ctrlKey || e.metaKey) && ['b', 'i', 'u'].includes(e.key.toLowerCase())) { + e.preventDefault(); + return; + } + }; + + const handlePaste = useCallback((e: React.ClipboardEvent) => { + e.preventDefault(); + const plain = e.clipboardData.getData('text/plain'); + if (plain) document.execCommand('insertText', false, plain); + }, []); + + return ( + + {picker.visible && pickerRect && createPortal( +
    +
    + setPicker((p) => ({ ...p, visible: false }))} + visible={picker.visible} + /> +
    +
    , + document.body, + )} + + editorRef.current?.focus()} + sx={{ + position: 'relative', + border: `1px solid ${focused ? c.accent.primary : c.border.medium}`, + borderRadius: '4px', + bgcolor: c.bg.page, + transition: 'border-color 0.15s', + '&:hover': { + borderColor: focused ? c.accent.primary : c.text.primary, + }, + cursor: 'text', + }} + > + {label && ( + + {label} + + )} + + +
    setFocused(true)} + onBlur={() => setFocused(false)} + style={{ + width: '100%', + minHeight: `${minHeight}rem`, + maxHeight: `${maxHeight}rem`, + overflowY: 'auto', + background: 'transparent', + border: 'none', + outline: 'none', + color: c.text.primary, + fontSize: `${FONT_SIZE}rem`, + lineHeight: `${LINE_HEIGHT}`, + fontFamily: 'inherit', + wordBreak: 'break-word', + whiteSpace: 'pre-wrap', + }} + /> + {!hasContent && ( +
    + {placeholder} +
    + )} + + + + {selectedTemplate && ( + setSelectedTemplate(null)} + onApply={(rendered) => { + const editor = editorRef.current; + if (editor) { + document.execCommand('insertText', false, rendered); + } + setSelectedTemplate(null); + updateHasContent(); + emitChange(); + }} + /> + )} + + ); +}; + +export default RichPromptEditor; diff --git a/frontend/src/app/components/SelectionOverlay.tsx b/frontend/src/app/components/SelectionOverlay.tsx new file mode 100644 index 00000000..51e534e4 --- /dev/null +++ b/frontend/src/app/components/SelectionOverlay.tsx @@ -0,0 +1,240 @@ +import React, { useEffect, useState, useRef } from 'react'; +import ReactDOM from 'react-dom'; +import { OverlayState, DragRect, DragPreviewElement } from './useDomElementSelector'; +import { useElementSelection } from './ElementSelectionContext'; + +const HIGHLIGHT_COLOR = '#3b82f6'; +const HIGHLIGHT_BG = 'rgba(59, 130, 246, 0.08)'; +const SELECTED_BG = 'rgba(59, 130, 246, 0.06)'; +const DRAG_BG = 'rgba(59, 130, 246, 0.1)'; +const DRAG_BORDER = 'rgba(59, 130, 246, 0.5)'; +const PREVIEW_ADD_BORDER = 'rgba(59, 130, 246, 0.6)'; +const PREVIEW_ADD_BG = 'rgba(59, 130, 246, 0.1)'; +const PREVIEW_REMOVE_BORDER = 'rgba(239, 68, 68, 0.6)'; +const PREVIEW_REMOVE_BG = 'rgba(239, 68, 68, 0.1)'; + +interface PersistentRect { + id: string; + top: number; + left: number; + width: number; + height: number; + label: string; +} + +interface Props { + overlay: OverlayState; + dragRect: DragRect; + dragPreview?: DragPreviewElement[]; +} + +const SelectionOverlay: React.FC = ({ overlay, dragRect, dragPreview = [] }) => { + const ctx = useElementSelection(); + const [persistentRects, setPersistentRects] = useState([]); + const rafRef = useRef(null); + + useEffect(() => { + if (!ctx || ctx.selectedElements.length === 0) { + setPersistentRects([]); + return; + } + + const semanticEls = ctx.selectedElements.filter((e) => e.semanticType); + if (semanticEls.length === 0) { + setPersistentRects([]); + return; + } + + const updateRects = () => { + const rects: PersistentRect[] = []; + for (const sel of semanticEls) { + try { + const domEl = document.querySelector(sel.selectorPath); + if (domEl) { + const rect = domEl.getBoundingClientRect(); + rects.push({ + id: sel.id, + top: rect.top, + left: rect.left, + width: rect.width, + height: rect.height, + label: sel.semanticLabel || sel.tagName, + }); + } + } catch { + // selector might be invalid + } + } + setPersistentRects(rects); + rafRef.current = requestAnimationFrame(updateRects); + }; + + rafRef.current = requestAnimationFrame(updateRects); + return () => { + if (rafRef.current) cancelAnimationFrame(rafRef.current); + }; + }, [ctx?.selectedElements]); + + const hasHover = overlay.visible; + const hasPersistent = persistentRects.length > 0; + const hasDrag = dragRect.visible; + const hasPreview = dragPreview.length > 0; + + if (!hasHover && !hasPersistent && !hasDrag && !hasPreview) return null; + + return ReactDOM.createPortal( + <> + {/* Persistent highlights for already-selected elements */} + {persistentRects.map((r) => ( + +
    +
    + ✓ {r.label} +
    + + ))} + + {/* Drag-select rectangle */} + {hasDrag && ( +
    + )} + + {/* Drag preview highlights */} + {dragPreview.map((p) => { + const isRemove = p.action === 'remove'; + const borderColor = isRemove ? PREVIEW_REMOVE_BORDER : PREVIEW_ADD_BORDER; + const bgColor = isRemove ? PREVIEW_REMOVE_BG : PREVIEW_ADD_BG; + const labelBg = isRemove ? '#ef4444' : HIGHLIGHT_COLOR; + const labelText = isRemove ? `− ${p.label}` : `+ ${p.label}`; + return ( + +
    +
    + {labelText} +
    + + ); + })} + + {/* Hover highlight */} + {hasHover && ( + <> +
    +
    + {overlay.label} +
    + + )} + , + document.body, + ); +}; + +export default SelectionOverlay; diff --git a/frontend/src/app/components/SlashCommandPicker.tsx b/frontend/src/app/components/SlashCommandPicker.tsx new file mode 100644 index 00000000..3982c054 --- /dev/null +++ b/frontend/src/app/components/SlashCommandPicker.tsx @@ -0,0 +1,165 @@ +import React, { useState, useEffect, useMemo } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Paper from '@mui/material/Paper'; +import List from '@mui/material/List'; +import ListItemButton from '@mui/material/ListItemButton'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import DescriptionIcon from '@mui/icons-material/Description'; +import PsychologyIcon from '@mui/icons-material/Psychology'; +import { useAppSelector } from '@/shared/hooks'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +export interface SlashItem { + id: string; + type: 'template' | 'skill'; + name: string; + description: string; + command: string; +} + +interface Props { + filter: string; + onSelect: (item: SlashItem) => void; + onClose: () => void; + visible: boolean; +} + +const SlashCommandPicker: React.FC = ({ filter, onSelect, onClose, visible }) => { + const c = useClaudeTokens(); + const templates = useAppSelector((state) => state.templates.items); + const skills = useAppSelector((state) => state.skills.items); + const [selectedIndex, setSelectedIndex] = useState(0); + + const items: SlashItem[] = useMemo(() => { + const all: SlashItem[] = [ + ...Object.values(templates).map((t) => ({ + id: t.id, + type: 'template' as const, + name: t.name, + description: t.description || `Template with ${t.fields.length} fields`, + command: t.name.toLowerCase().replace(/\s+/g, '-'), + })), + ...Object.values(skills).map((s) => ({ + id: s.id, + type: 'skill' as const, + name: s.name, + description: s.description || 'Skill', + command: s.command || s.id, + })), + ]; + + if (!filter) return all; + const lower = filter.toLowerCase(); + return all.filter( + (item) => + item.name.toLowerCase().includes(lower) || + item.command.toLowerCase().includes(lower) || + item.description.toLowerCase().includes(lower) + ); + }, [templates, skills, filter]); + + useEffect(() => { + setSelectedIndex(0); + }, [filter]); + + useEffect(() => { + if (!visible) return; + const handler = (e: KeyboardEvent) => { + if (e.key === 'ArrowDown') { + e.preventDefault(); + setSelectedIndex((prev) => Math.min(prev + 1, items.length - 1)); + } else if (e.key === 'ArrowUp') { + e.preventDefault(); + setSelectedIndex((prev) => Math.max(prev - 1, 0)); + } else if (e.key === 'Enter' && items[selectedIndex]) { + e.preventDefault(); + onSelect(items[selectedIndex]); + } else if (e.key === 'Escape') { + e.preventDefault(); + onClose(); + } + }; + window.addEventListener('keydown', handler); + return () => window.removeEventListener('keydown', handler); + }, [visible, items, selectedIndex, onSelect, onClose]); + + if (!visible || items.length === 0) return null; + + return ( + + + + Commands + + + + {items.map((item, i) => ( + onSelect(item)} + sx={{ + py: 0.75, + px: 1.5, + '&.Mui-selected': { bgcolor: 'rgba(174,86,48,0.06)' }, + '&:hover': { bgcolor: 'rgba(0,0,0,0.04)' }, + }} + > + + {item.type === 'template' ? ( + + ) : ( + + )} + + + + /{item.command} + + + {item.type} + + + } + secondary={ + + {item.description} + + } + /> + + ))} + + + ); +}; + +export default SlashCommandPicker; diff --git a/frontend/src/app/components/richEditorUtils.ts b/frontend/src/app/components/richEditorUtils.ts new file mode 100644 index 00000000..12cf528e --- /dev/null +++ b/frontend/src/app/components/richEditorUtils.ts @@ -0,0 +1,158 @@ +export const SKILL_PILL_ATTR = 'data-skill-id'; +export const SKILL_COLOR = '#7B61BD'; + +export interface AttachedSkill { + id: string; + name: string; + content: string; +} + +export function createSkillPillElement( + skill: AttachedSkill, + onRemove: (id: string) => void, + monoFont: string, + errorColor: string, +): HTMLSpanElement { + const pill = document.createElement('span'); + pill.setAttribute(SKILL_PILL_ATTR, skill.id); + pill.contentEditable = 'false'; + Object.assign(pill.style, { + display: 'inline-flex', + alignItems: 'center', + gap: '3px', + padding: '1px 4px 1px 6px', + margin: '0 1px', + borderRadius: '999px', + background: `${SKILL_COLOR}18`, + color: SKILL_COLOR, + fontSize: '0.72rem', + fontFamily: monoFont, + lineHeight: '1.8', + verticalAlign: 'baseline', + userSelect: 'none', + whiteSpace: 'nowrap' as const, + cursor: 'default', + }); + + const label = document.createElement('span'); + label.textContent = skill.name; + Object.assign(label.style, { maxWidth: '180px', overflow: 'hidden', textOverflow: 'ellipsis' }); + + const closeBtn = document.createElement('span'); + closeBtn.textContent = '\u00d7'; + Object.assign(closeBtn.style, { + cursor: 'pointer', + fontSize: '13px', + lineHeight: '1', + opacity: '0.6', + marginLeft: '1px', + fontWeight: '700', + borderRadius: '50%', + width: '14px', + height: '14px', + display: 'inline-flex', + alignItems: 'center', + justifyContent: 'center', + }); + closeBtn.addEventListener('mouseover', () => { closeBtn.style.opacity = '1'; closeBtn.style.color = errorColor; }); + closeBtn.addEventListener('mouseout', () => { closeBtn.style.opacity = '0.6'; closeBtn.style.color = 'inherit'; }); + closeBtn.addEventListener('mousedown', (e) => { e.preventDefault(); e.stopPropagation(); onRemove(skill.id); }); + + pill.appendChild(label); + pill.appendChild(closeBtn); + return pill; +} + +export function serializeEditorContent(editor: HTMLElement, skills: Record): string { + const parts: string[] = []; + let hasOutput = false; + + const walk = (parent: Node) => { + parent.childNodes.forEach((node) => { + if (node.nodeType === Node.TEXT_NODE) { + const t = (node.textContent || '').replace(/\u200B/g, ''); + if (t) hasOutput = true; + parts.push(t); + } else if (node.nodeType === Node.ELEMENT_NODE) { + const el = node as HTMLElement; + const sid = el.getAttribute(SKILL_PILL_ATTR); + if (sid && skills[sid]) { + hasOutput = true; + parts.push(`{{skill:${skills[sid].name}}}`); + return; + } + if (el.tagName === 'BR') { parts.push('\n'); return; } + if (el.tagName === 'DIV' || el.tagName === 'P') { + if (hasOutput) parts.push('\n'); + walk(el); + return; + } + walk(el); + } + }); + }; + + walk(editor); + return parts.join(''); +} + +export interface TriggerState { + visible: boolean; + trigger: '/' | '@'; + filter: string; + triggerNode: Text | null; + triggerOffset: number; +} + +export const EMPTY_TRIGGER: TriggerState = { + visible: false, + trigger: '/', + filter: '', + triggerNode: null, + triggerOffset: 0, +}; + +export function detectEditorTrigger(): TriggerState | null { + const sel = window.getSelection(); + if (!sel || sel.rangeCount === 0 || !sel.isCollapsed) return null; + + const { startContainer: node, startOffset: offset } = sel.getRangeAt(0); + if (node.nodeType !== Node.TEXT_NODE) return null; + + const textNode = node as Text; + const text = textNode.textContent || ''; + const before = text.slice(0, offset); + + let triggerIdx = -1; + let triggerChar: '/' | '@' | null = null; + for (let i = before.length - 1; i >= 0; i--) { + const ch = before[i]; + if (ch === ' ' || ch === '\n') break; + if (ch === '@') { + if (i === 0 || before[i - 1] === ' ' || before[i - 1] === '\n') { + triggerIdx = i; + triggerChar = '@'; + } + break; + } + if (ch === '/') { + if (i === 0 || before[i - 1] === ' ' || before[i - 1] === '\n') { + triggerIdx = i; + triggerChar = '/'; + break; + } + continue; + } + } + + if (triggerChar && triggerIdx >= 0) { + return { + visible: true, + trigger: triggerChar, + filter: before.slice(triggerIdx + 1), + triggerNode: textNode, + triggerOffset: triggerIdx, + }; + } + return null; +} diff --git a/frontend/src/app/components/useDomElementSelector.ts b/frontend/src/app/components/useDomElementSelector.ts new file mode 100644 index 00000000..fb2f4068 --- /dev/null +++ b/frontend/src/app/components/useDomElementSelector.ts @@ -0,0 +1,339 @@ +import { useEffect, useRef, useState, useCallback } from 'react'; +import { SelectedElement, useElementSelection } from './ElementSelectionContext'; + +const SELECT_ATTR = 'data-select-type'; +const SELECT_ID_ATTR = 'data-select-id'; +const SELECT_META_ATTR = 'data-select-meta'; + +export interface OverlayState { + visible: boolean; + top: number; + left: number; + width: number; + height: number; + label: string; +} + +export interface DragRect { + visible: boolean; + top: number; + left: number; + width: number; + height: number; +} + +const EMPTY_OVERLAY: OverlayState = { visible: false, top: 0, left: 0, width: 0, height: 0, label: '' }; +const EMPTY_DRAG: DragRect = { visible: false, top: 0, left: 0, width: 0, height: 0 }; + +const SEMANTIC_LABELS: Record = { + 'agent-card': 'Agent', + 'message': 'Message', + 'tool-call': 'Tool Call', + 'tool-group': 'Tool Group', + 'view-card': 'View', +}; + +function findSelectableAncestor(target: Element): Element | null { + let current: Element | null = target; + while (current) { + if (current.hasAttribute(SELECT_ATTR)) return current; + current = current.parentElement; + } + return null; +} + +function buildSemanticLabel(type: string, meta: Record): string { + const prefix = SEMANTIC_LABELS[type] || type; + if (meta.name) return `${prefix}: ${meta.name}`; + if (meta.role && meta.content) { + const truncated = String(meta.content).slice(0, 40); + return `${prefix} (${meta.role}): ${truncated}${String(meta.content).length > 40 ? '…' : ''}`; + } + if (meta.label) return `${prefix}: ${meta.label}`; + if (meta.tool) return `${prefix}: ${meta.tool}`; + return prefix; +} + +function rectsIntersect( + a: { top: number; left: number; bottom: number; right: number }, + b: { top: number; left: number; bottom: number; right: number }, +): boolean { + return a.left < b.right && a.right > b.left && a.top < b.bottom && a.bottom > b.top; +} + +function buildSelectedElement(el: Element): SelectedElement { + const type = el.getAttribute(SELECT_ATTR) || ''; + const selectId = el.getAttribute(SELECT_ID_ATTR) || ''; + let meta: Record = {}; + try { meta = JSON.parse(el.getAttribute(SELECT_META_ATTR) || '{}'); } catch {} + const rect = el.getBoundingClientRect(); + const semanticLabel = buildSemanticLabel(type, meta); + + return { + id: `sel-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`, + selectorPath: `[${SELECT_ATTR}="${type}"][${SELECT_ID_ATTR}="${selectId}"]`, + tagName: el.tagName, + className: '', + outerHTML: '', + computedStyles: {}, + boundingRect: { x: rect.x, y: rect.y, width: rect.width, height: rect.height }, + semanticType: type as SelectedElement['semanticType'], + semanticLabel, + semanticData: { ...meta, selectId }, + }; +} + +export interface DragPreviewElement { + selectId: string; + top: number; + left: number; + width: number; + height: number; + label: string; + action: 'add' | 'remove'; +} + +const DRAG_THRESHOLD = 5; + +export interface DomSelectorState { + overlay: OverlayState; + dragRect: DragRect; + dragPreview: DragPreviewElement[]; +} + +export function useDomElementSelector(): DomSelectorState { + const ctx = useElementSelection(); + const [overlay, setOverlay] = useState(EMPTY_OVERLAY); + const [dragRect, setDragRect] = useState(EMPTY_DRAG); + const [dragPreview, setDragPreview] = useState([]); + const hoveredRef = useRef(null); + const rafRef = useRef(null); + const dragPreviewRafRef = useRef(null); + + const dragOriginRef = useRef<{ x: number; y: number } | null>(null); + const isDraggingRef = useRef(false); + const dragBoundsRef = useRef<{ left: number; top: number; right: number; bottom: number } | null>(null); + + const selectedIdsRef = useRef(new Map()); + useEffect(() => { + const map = new Map(); + for (const el of (ctx?.selectedElements ?? [])) { + if (el.semanticData?.selectId) { + map.set(el.semanticData.selectId as string, el.id); + } + } + selectedIdsRef.current = map; + }, [ctx?.selectedElements]); + + const handleMouseMove = useCallback((e: MouseEvent) => { + // If we're drawing a drag rectangle, update it instead of hover overlay + if (dragOriginRef.current) { + const origin = dragOriginRef.current; + const dx = e.clientX - origin.x; + const dy = e.clientY - origin.y; + + if (!isDraggingRef.current && (Math.abs(dx) > DRAG_THRESHOLD || Math.abs(dy) > DRAG_THRESHOLD)) { + isDraggingRef.current = true; + } + + if (isDraggingRef.current) { + const bounds = { + left: Math.min(origin.x, e.clientX), + top: Math.min(origin.y, e.clientY), + right: Math.max(origin.x, e.clientX), + bottom: Math.max(origin.y, e.clientY), + }; + dragBoundsRef.current = bounds; + + setOverlay(EMPTY_OVERLAY); + setDragRect({ + visible: true, + left: bounds.left, + top: bounds.top, + width: bounds.right - bounds.left, + height: bounds.bottom - bounds.top, + }); + + if (dragPreviewRafRef.current) cancelAnimationFrame(dragPreviewRafRef.current); + dragPreviewRafRef.current = requestAnimationFrame(() => { + const b = dragBoundsRef.current; + if (!b) return; + const allSelectables = document.querySelectorAll(`[${SELECT_ATTR}]`); + const preview: DragPreviewElement[] = []; + const seen = new Set(); + allSelectables.forEach((el) => { + const rect = el.getBoundingClientRect(); + if (rectsIntersect(b, { left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom })) { + const selectId = el.getAttribute(SELECT_ID_ATTR) || ''; + if (seen.has(selectId)) return; + seen.add(selectId); + const type = el.getAttribute(SELECT_ATTR) || ''; + let meta: Record = {}; + try { meta = JSON.parse(el.getAttribute(SELECT_META_ATTR) || '{}'); } catch {} + preview.push({ + selectId, + top: rect.top, + left: rect.left, + width: rect.width, + height: rect.height, + label: buildSemanticLabel(type, meta), + action: selectedIdsRef.current.has(selectId) ? 'remove' : 'add', + }); + } + }); + setDragPreview(preview); + }); + } + return; + } + + const target = e.target as Element; + if (!target) { + setOverlay(EMPTY_OVERLAY); + hoveredRef.current = null; + return; + } + + if (target.tagName === 'IFRAME') { + setOverlay(EMPTY_OVERLAY); + hoveredRef.current = null; + return; + } + + const selectable = findSelectableAncestor(target); + if (!selectable) { + setOverlay(EMPTY_OVERLAY); + hoveredRef.current = null; + return; + } + + hoveredRef.current = selectable; + + if (rafRef.current) cancelAnimationFrame(rafRef.current); + rafRef.current = requestAnimationFrame(() => { + const rect = selectable.getBoundingClientRect(); + const type = selectable.getAttribute(SELECT_ATTR) || ''; + let meta: Record = {}; + try { meta = JSON.parse(selectable.getAttribute(SELECT_META_ATTR) || '{}'); } catch {} + const label = buildSemanticLabel(type, meta); + setOverlay({ + visible: true, + top: rect.top, + left: rect.left, + width: rect.width, + height: rect.height, + label, + }); + }); + }, []); + + const handleMouseDown = useCallback((e: MouseEvent) => { + if (e.button !== 0) return; + const target = e.target as Element; + // Only start drag on "empty" canvas areas (not on selectable elements) + if (target && findSelectableAncestor(target)) return; + dragOriginRef.current = { x: e.clientX, y: e.clientY }; + isDraggingRef.current = false; + }, []); + + const handleMouseUp = useCallback((e: MouseEvent) => { + if (!dragOriginRef.current) return; + + if (isDraggingRef.current && ctx) { + const dr = { + left: Math.min(dragOriginRef.current.x, e.clientX), + top: Math.min(dragOriginRef.current.y, e.clientY), + right: Math.max(dragOriginRef.current.x, e.clientX), + bottom: Math.max(dragOriginRef.current.y, e.clientY), + }; + + const allSelectables = document.querySelectorAll(`[${SELECT_ATTR}]`); + const processed = new Set(); + + allSelectables.forEach((el) => { + const rect = el.getBoundingClientRect(); + const elRect = { + left: rect.left, + top: rect.top, + right: rect.right, + bottom: rect.bottom, + }; + + if (rectsIntersect(dr, elRect)) { + const selectId = el.getAttribute(SELECT_ID_ATTR) || ''; + if (processed.has(selectId)) return; + processed.add(selectId); + + const existingId = selectedIdsRef.current.get(selectId); + if (existingId) { + ctx.removeSelectedElement(existingId); + } else { + ctx.addSelectedElement(buildSelectedElement(el)); + } + } + }); + } + + dragOriginRef.current = null; + isDraggingRef.current = false; + dragBoundsRef.current = null; + setDragRect(EMPTY_DRAG); + setDragPreview([]); + if (dragPreviewRafRef.current) cancelAnimationFrame(dragPreviewRafRef.current); + }, [ctx]); + + const handleClick = useCallback((e: MouseEvent) => { + if (!ctx) return; + const target = hoveredRef.current; + if (!target) return; + + e.preventDefault(); + e.stopPropagation(); + + const selectId = target.getAttribute(SELECT_ID_ATTR) || ''; + const existing = ctx.selectedElements.find( + (el) => el.semanticData?.selectId === selectId, + ); + if (existing) { + ctx.removeSelectedElement(existing.id); + } else { + ctx.addSelectedElement(buildSelectedElement(target)); + } + }, [ctx]); + + useEffect(() => { + if (!ctx?.selectMode) { + setOverlay(EMPTY_OVERLAY); + setDragRect(EMPTY_DRAG); + setDragPreview([]); + hoveredRef.current = null; + dragOriginRef.current = null; + dragBoundsRef.current = null; + isDraggingRef.current = false; + return; + } + + document.addEventListener('mousemove', handleMouseMove, true); + document.addEventListener('mousedown', handleMouseDown, true); + document.addEventListener('mouseup', handleMouseUp, true); + document.addEventListener('click', handleClick, true); + + return () => { + document.removeEventListener('mousemove', handleMouseMove, true); + document.removeEventListener('mousedown', handleMouseDown, true); + document.removeEventListener('mouseup', handleMouseUp, true); + document.removeEventListener('click', handleClick, true); + if (rafRef.current) cancelAnimationFrame(rafRef.current); + if (dragPreviewRafRef.current) cancelAnimationFrame(dragPreviewRafRef.current); + setOverlay(EMPTY_OVERLAY); + setDragRect(EMPTY_DRAG); + setDragPreview([]); + hoveredRef.current = null; + dragOriginRef.current = null; + dragBoundsRef.current = null; + isDraggingRef.current = false; + }; + }, [ctx?.selectMode, handleMouseMove, handleMouseDown, handleMouseUp, handleClick]); + + return { overlay, dragRect, dragPreview }; +} diff --git a/frontend/src/app/pages/AgentChat/AgentChat.tsx b/frontend/src/app/pages/AgentChat/AgentChat.tsx new file mode 100644 index 00000000..a341c848 --- /dev/null +++ b/frontend/src/app/pages/AgentChat/AgentChat.tsx @@ -0,0 +1,638 @@ +import React, { useEffect, useLayoutEffect, useRef, useMemo, useState, useCallback } from 'react'; +import { useParams } from 'react-router-dom'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Chip from '@mui/material/Chip'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import CloseIcon from '@mui/icons-material/Close'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { + sendMessage as sendMessageThunk, + launchAndSendFirstMessage, + generateTitle, + generateGroupMeta, + stopAgent, + handleApproval, + editMessage, + switchBranch, + updateSessionModel, + updateSessionMode, + fetchSession, + AgentMessage, +} from '@/shared/state/agentsSlice'; +import { fetchModes } from '@/shared/state/modesSlice'; +import { createSessionWs } from '@/shared/ws/WebSocketManager'; +import MessageBubble from './MessageBubble'; +import ToolCallBubble, { ToolPair } from './ToolCallBubble'; +import ToolGroupBubble, { RenderItem, ToolGroup, isToolGroup, isToolPair } from './ToolGroupBubble'; +import ApprovalBar, { BatchApprovalBar } from './ApprovalBar'; +import ChatInput, { ChatInputHandle } from './ChatInput'; +import { ContextPath } from '@/app/components/DirectoryBrowser'; +import BranchNavigator from './BranchNavigator'; +import DiffViewer from './DiffViewer'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +const CONTEXT_WINDOWS: Record = { + sonnet: 200_000, + opus: 200_000, + haiku: 200_000, +}; + +function stringifyContent(content: any): string { + if (content == null) return ''; + if (typeof content === 'string') return content; + return JSON.stringify(content); +} + +const thinkingDotsKeyframes = ` +@keyframes thinking-bounce { + 0%, 80%, 100% { transform: scale(0); opacity: 0.4; } + 40% { transform: scale(1); opacity: 1; } +} +`; + +const ThinkingBubble: React.FC = () => { + const c = useClaudeTokens(); + return ( + + + + {[0, 1, 2].map((i) => ( + + ))} + + + ); +}; + +interface AgentChatProps { + sessionId?: string; + onClose?: () => void; + embedded?: boolean; + initialContextPaths?: ContextPath[]; +} + +const AgentChat: React.FC = ({ sessionId: sessionIdProp, onClose, embedded, initialContextPaths }) => { + const c = useClaudeTokens(); + const STATUS_STYLES: Record = { + running: { color: c.status.success, bg: c.status.successBg }, + waiting_approval: { color: c.status.warning, bg: c.status.warningBg }, + completed: { color: c.text.tertiary, bg: c.bg.secondary }, + error: { color: c.status.error, bg: c.status.errorBg }, + stopped: { color: c.text.tertiary, bg: c.bg.secondary }, + }; + const { id: routeId } = useParams<{ id: string }>(); + const id = sessionIdProp || routeId; + const dispatch = useAppDispatch(); + const session = useAppSelector((state) => (id ? state.agents.sessions[id] : undefined)); + const modesMap = useAppSelector((state) => state.modes.items); + const scrollContainerRef = useRef(null); + const chatInputRef = useRef(null); + const isAtBottomRef = useRef(true); + const [showScrollButton, setShowScrollButton] = useState(false); + const [mode, setMode] = useState('agent'); + const [model, setModel] = useState('sonnet'); + + const wsRef = useRef | null>(null); + const initialContextApplied = useRef(false); + + const isDraft = session?.status === 'draft'; + + useEffect(() => { + if (!id || isDraft) return; + const ws = createSessionWs(id); + ws.connect(); + wsRef.current = ws; + dispatch(fetchSession(id)); + return () => { + ws.disconnect(); + wsRef.current = null; + }; + }, [id, isDraft, dispatch]); + + useEffect(() => { + if (initialContextApplied.current || !initialContextPaths?.length) return; + const timer = setTimeout(() => { + chatInputRef.current?.setContent('', initialContextPaths); + initialContextApplied.current = true; + }, 50); + return () => clearTimeout(timer); + }, [initialContextPaths]); + + useEffect(() => { + if (session) setMode(session.mode); + }, [session?.mode]); + + useEffect(() => { + if (session) setModel(session.model); + }, [session?.model]); + + useEffect(() => { + if (Object.keys(modesMap).length === 0) dispatch(fetchModes()); + }, [dispatch, modesMap]); + + const prevStatusRef = useRef(session?.status); + useEffect(() => { + const prev = prevStatusRef.current; + const curr = session?.status; + prevStatusRef.current = curr; + if (prev === 'running' && (curr === 'completed' || curr === 'stopped' || curr === 'error')) { + const currentMode = modesMap[mode]; + if (currentMode?.default_next_mode && modesMap[currentMode.default_next_mode]) { + setMode(currentMode.default_next_mode); + if (id && !isDraft) { + dispatch(updateSessionMode({ sessionId: id, mode: currentMode.default_next_mode as any })); + } + } + } + }, [session?.status, mode, modesMap, id, isDraft, dispatch]); + + const SCROLL_THRESHOLD = 50; + + const handleScroll = useCallback(() => { + const el = scrollContainerRef.current; + if (!el) return; + const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < SCROLL_THRESHOLD; + isAtBottomRef.current = atBottom; + setShowScrollButton(!atBottom); + }, []); + + const scrollToBottom = useCallback(() => { + const el = scrollContainerRef.current; + if (!el) return; + el.scrollTop = el.scrollHeight; + isAtBottomRef.current = true; + setShowScrollButton(false); + }, []); + + useLayoutEffect(() => { + if (isAtBottomRef.current) { + const el = scrollContainerRef.current; + if (el) el.scrollTop = el.scrollHeight; + } + }, [session?.messages.length, session?.streamingMessage?.content]); + + const handleSend = (prompt: string, images?: Array<{ data: string; media_type: string }>, contextPaths?: Array<{ path: string; type: 'file' | 'directory' }>, forcedTools?: string[], attachedSkills?: Array<{ id: string; name: string; content: string }>) => { + if (!id) return; + if (isDraft) { + const config: Record = { model, mode }; + if (session?.system_prompt) config.system_prompt = session.system_prompt; + if (session?.target_directory) config.target_directory = session.target_directory; + dispatch( + launchAndSendFirstMessage({ draftId: id, config, prompt, mode, model, images, contextPaths, forcedTools, attachedSkills }) + ).then((action) => { + if (launchAndSendFirstMessage.fulfilled.match(action)) { + dispatch(generateTitle({ sessionId: action.payload.session.id, prompt })); + } + }); + } else { + dispatch(sendMessageThunk({ sessionId: id, prompt, mode, model, images, contextPaths, forcedTools, attachedSkills })); + } + }; + + const handleModeChange = useCallback((newMode: string) => { + setMode(newMode); + if (id && !isDraft) dispatch(updateSessionMode({ sessionId: id, mode: newMode })); + }, [id, isDraft, dispatch]); + + const handleModelChange = useCallback((newModel: string) => { + setModel(newModel); + if (id && !isDraft) dispatch(updateSessionModel({ sessionId: id, model: newModel })); + }, [id, isDraft, dispatch]); + + const handleApprove = (requestId: string, updatedInput?: Record) => { + dispatch(handleApproval({ requestId, behavior: 'allow', updatedInput })); + }; + + const handleDeny = (requestId: string, message?: string) => { + dispatch(handleApproval({ requestId, behavior: 'deny', message })); + }; + + const handleStop = () => { + if (!id) return; + dispatch(stopAgent({ sessionId: id })); + }; + + const handleEdit = useCallback( + (messageId: string, newContent: string) => { + if (!id) return; + dispatch(editMessage({ sessionId: id, messageId, content: newContent })); + }, + [id, dispatch] + ); + + const activeBranchMessages = useMemo(() => { + if (!session) return []; + const branchId = session.active_branch_id || 'main'; + const branch = session.branches?.[branchId]; + + if (!branch || !branch.fork_point_message_id) { + return session.messages.filter((m) => m.branch_id === 'main' || m.branch_id === branchId); + } + + const forkIdx = session.messages.findIndex((m) => m.id === branch.fork_point_message_id); + const preMessages = session.messages + .slice(0, forkIdx) + .filter((m) => m.branch_id === (branch.parent_branch_id || 'main')); + const branchMessages = session.messages.filter((m) => m.branch_id === branchId); + return [...preMessages, ...branchMessages]; + }, [session?.messages, session?.active_branch_id, session?.branches]); + + const contextEstimate = useMemo(() => { + const limit = CONTEXT_WINDOWS[model] || 200_000; + let totalChars = 0; + if (session?.system_prompt) totalChars += session.system_prompt.length; + for (const msg of activeBranchMessages) { + totalChars += stringifyContent(msg.content).length; + } + if (session?.streamingMessage) { + totalChars += (session.streamingMessage.content || '').length; + } + const used = Math.round(totalChars / 4); + return { used, limit }; + }, [activeBranchMessages, session?.system_prompt, session?.streamingMessage?.content, model]); + + const sessionRunning = session?.status === 'running' || session?.status === 'waiting_approval'; + + const renderItems: RenderItem[] = useMemo(() => { + const isOutputCall = (m: AgentMessage) => + m.role === 'tool_call' && typeof m.content === 'object' && m.content.tool === 'RenderOutput'; + const isOutputResult = (m: AgentMessage) => { + if (m.role !== 'tool_result') return false; + try { + const parsed = typeof m.content === 'string' ? JSON.parse(m.content) : m.content; + return !!(parsed?.output_id && parsed?.frontend_code); + } catch { return false; } + }; + + const items: RenderItem[] = []; + let i = 0; + while (i < activeBranchMessages.length) { + const msg = activeBranchMessages[i]; + if (msg.role === 'tool_call' || msg.role === 'tool_result') { + const group: typeof activeBranchMessages = []; + while ( + i < activeBranchMessages.length && + (activeBranchMessages[i].role === 'tool_call' || + activeBranchMessages[i].role === 'tool_result') + ) { + group.push(activeBranchMessages[i]); + i++; + } + + const regular: typeof activeBranchMessages = []; + const outputItems: typeof activeBranchMessages = []; + for (const m of group) { + if (isOutputCall(m) || isOutputResult(m)) { outputItems.push(m); continue; } + regular.push(m); + } + + const calls = regular.filter((m) => m.role === 'tool_call'); + const results = regular.filter((m) => m.role === 'tool_result'); + const pairs: ToolPair[] = calls.map((call, idx) => ({ + type: 'tool_pair' as const, + id: `pair-${call.id}`, + call, + result: results[idx] || null, + })); + + const mcpServers = new Set( + calls.map((m) => { + const tool = typeof m.content === 'object' ? m.content.tool || '' : ''; + const match = tool.match(/^mcp__([^_]+(?:-[^_]+)*)__/); + return match ? match[1] : ''; + }).filter(Boolean) + ); + const allSameMcp = mcpServers.size === 1 && pairs.length > 0; + + if (allSameMcp) { + const mcpServer = [...mcpServers][0]; + const toolNames = new Set( + calls.map((m) => (typeof m.content === 'object' ? m.content.tool : '')) + ); + const label = + toolNames.size === 1 ? calls[0].content?.tool || 'Tool calls' : `${calls.length} tool calls`; + items.push({ + type: 'tool_group', + id: `group-${group[0].id}`, + pairs, + label, + callCount: calls.length, + mcpServer, + } satisfies ToolGroup); + } else if (pairs.length <= 2) { + items.push(...pairs); + } else if (pairs.length > 0) { + const toolNames = new Set( + calls.map((m) => (typeof m.content === 'object' ? m.content.tool : '')) + ); + const label = + toolNames.size === 1 ? calls[0].content?.tool || 'Tool calls' : `${calls.length} tool calls`; + items.push({ + type: 'tool_group', + id: `group-${group[0].id}`, + pairs, + label, + callCount: calls.length, + } satisfies ToolGroup); + } + + items.push(...outputItems); + } else { + items.push(msg); + i++; + } + } + return items; + }, [activeBranchMessages]); + + const groupMetaRequestedRef = useRef>(new Set()); + const groupMetaRefinedRef = useRef>(new Set()); + + useEffect(() => { + if (!id || isDraft) return; + const toolGroups = renderItems.filter(isToolGroup) as ToolGroup[]; + const meta = session?.tool_group_meta ?? {}; + + for (const group of toolGroups) { + const allDone = group.pairs.every((p) => p.result !== null); + + if (!groupMetaRequestedRef.current.has(group.id) && !meta[group.id]) { + groupMetaRequestedRef.current.add(group.id); + const toolCalls = group.pairs.map((p) => { + const c = p.call.content; + const tool = typeof c === 'object' ? c.tool || '' : ''; + const input = typeof c === 'object' ? c.input : ''; + const summary = typeof input === 'string' ? input.slice(0, 120) : JSON.stringify(input).slice(0, 120); + return { tool, input_summary: summary }; + }); + dispatch(generateGroupMeta({ sessionId: id, groupId: group.id, toolCalls })); + } + + if (allDone && meta[group.id] && !meta[group.id].is_refined && !groupMetaRefinedRef.current.has(group.id)) { + groupMetaRefinedRef.current.add(group.id); + const toolCalls = group.pairs.map((p) => { + const c = p.call.content; + const tool = typeof c === 'object' ? c.tool || '' : ''; + const input = typeof c === 'object' ? c.input : ''; + const summary = typeof input === 'string' ? input.slice(0, 120) : JSON.stringify(input).slice(0, 120); + return { tool, input_summary: summary }; + }); + const resultsSummary = group.pairs + .filter((p) => p.result) + .map((p) => { + const rc = p.result!.content; + const text = typeof rc === 'string' ? rc : typeof rc === 'object' && rc?.text ? rc.text : JSON.stringify(rc); + return text.slice(0, 150); + }); + dispatch(generateGroupMeta({ sessionId: id, groupId: group.id, toolCalls, resultsSummary, isRefinement: true })); + } + } + }, [renderItems, id, isDraft, session?.tool_group_meta, dispatch]); + + const getSiblingBranches = useCallback( + (messageId: string): string[] => { + if (!session?.branches) return []; + return Object.values(session.branches) + .filter((b) => b.fork_point_message_id === messageId) + .map((b) => b.id); + }, + [session?.branches] + ); + + if (!session) { + return ( + + + Session not found + + + ); + } + + const isActive = session.status === 'running' || session.status === 'waiting_approval' || session.status === 'draft'; + const statusStyle = STATUS_STYLES[session.status] || { color: c.text.tertiary, bg: c.bg.secondary }; + + return ( + + + {!embedded && ( + + + + {session.name} + {!isDraft && statusStyle && ( + + )} + + {!isDraft && ( + + + {session.model} + + + {session.branch_name} + + {session.cost_usd > 0 && ( + + ${session.cost_usd.toFixed(4)} + + )} + + )} + + {!isDraft && id && } + {onClose && ( + + + + )} + + )} + + + + {renderItems.map((item) => { + if (isToolGroup(item)) { + const groupMeta = session.tool_group_meta?.[item.id]; + return ; + } + if (isToolPair(item)) { + const isPending = item.result === null && sessionRunning; + return ; + } + const msg = item; + const siblings = getSiblingBranches(msg.id); + const hasBranches = siblings.length > 0; + const currentBranchIdx = hasBranches + ? siblings.indexOf(session.active_branch_id || 'main') + : 0; + + return ( + + + {hasBranches && ( + { + const prevBranch = siblings[Math.max(0, currentBranchIdx - 1)]; + if (prevBranch && id) dispatch(switchBranch({ sessionId: id, branchId: prevBranch })); + }} + onNext={() => { + const nextBranch = siblings[Math.min(siblings.length - 1, currentBranchIdx + 1)]; + if (nextBranch && id) dispatch(switchBranch({ sessionId: id, branchId: nextBranch })); + }} + /> + )} + + ); + })} + {session.streamingMessage && ( + session.streamingMessage.role === 'tool_call' ? ( + + ) : ( + + ) + )} + {session.status === 'running' && !session.streamingMessage && ( + + )} + + {showScrollButton && ( + + + + + + )} + + + {session.pending_approvals.length > 1 ? ( + + ) : ( + session.pending_approvals.map((req) => ( + + )) + )} + + + + + ); +}; + +export default AgentChat; diff --git a/frontend/src/app/pages/AgentChat/ApprovalBar.tsx b/frontend/src/app/pages/AgentChat/ApprovalBar.tsx new file mode 100644 index 00000000..5cb1ba71 --- /dev/null +++ b/frontend/src/app/pages/AgentChat/ApprovalBar.tsx @@ -0,0 +1,1160 @@ +import React, { useCallback, useState, useMemo } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Button from '@mui/material/Button'; +import TextField from '@mui/material/TextField'; +import Chip from '@mui/material/Chip'; +import Collapse from '@mui/material/Collapse'; +import IconButton from '@mui/material/IconButton'; +import SendIcon from '@mui/icons-material/Send'; +import CheckIcon from '@mui/icons-material/Check'; +import CloseIcon from '@mui/icons-material/Close'; +import TerminalIcon from '@mui/icons-material/Terminal'; +import DescriptionIcon from '@mui/icons-material/Description'; +import EditIcon from '@mui/icons-material/Edit'; +import SearchIcon from '@mui/icons-material/Search'; +import QuestionAnswerIcon from '@mui/icons-material/QuestionAnswer'; +import BuildIcon from '@mui/icons-material/Build'; +import ExtensionIcon from '@mui/icons-material/Extension'; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import ExpandLessIcon from '@mui/icons-material/ExpandLess'; +import { ApprovalRequest } from '@/shared/state/agentsSlice'; +import { useAppSelector } from '@/shared/hooks'; +import { ToolDefinition } from '@/shared/state/toolsSlice'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +// --------------------------------------------------------------------------- +// Integration metadata (icons, colors) for known MCP servers +// --------------------------------------------------------------------------- + +interface IntegrationMeta { + label: string; + color: string; + icon: React.ReactNode; +} + +const GoogleIcon = ( + + + + + + +); + +const RedditIcon = ( + + + + +); + +const INTEGRATION_META: Record = { + 'Google Workspace': { label: 'Google Workspace', color: '#4285F4', icon: GoogleIcon }, + 'xbird': { label: 'X / Twitter', color: '#1DA1F2', icon: 𝕏 }, + 'Reddit': { label: 'Reddit', color: '#FF4500', icon: RedditIcon }, +}; + +// --------------------------------------------------------------------------- +// MCP tool name parser +// --------------------------------------------------------------------------- + +interface ParsedTool { + isMcp: boolean; + serverSlug: string; + actionName: string; + displayName: string; +} + +function parseMcpToolName(rawName: string): ParsedTool { + const m = rawName.match(/^mcp__([^_]+(?:-[^_]+)*)__(.+)$/); + if (!m) { + return { isMcp: false, serverSlug: '', actionName: rawName, displayName: rawName }; + } + const serverSlug = m[1]; + const actionName = m[2]; + const displayName = actionName + .replace(/_/g, ' ') + .replace(/\b\w/g, (ch) => ch.toUpperCase()); + return { isMcp: true, serverSlug, actionName, displayName }; +} + +function sanitizeServerName(name: string): string { + return name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, ''); +} + +// --------------------------------------------------------------------------- +// Look up MCP tool metadata from the Redux tools store +// --------------------------------------------------------------------------- + +interface McpToolMeta { + integration: IntegrationMeta | null; + description: string; + serverLabel: string; +} + +function useMcpToolMeta(parsed: ParsedTool): McpToolMeta { + const toolItems = useAppSelector((s) => s.tools.items); + + return useMemo(() => { + if (!parsed.isMcp) { + return { integration: null, description: '', serverLabel: '' }; + } + + const toolDef: ToolDefinition | undefined = Object.values(toolItems).find( + (t) => t.mcp_config && Object.keys(t.mcp_config).length > 0 && sanitizeServerName(t.name) === parsed.serverSlug + ); + + if (!toolDef) { + return { integration: null, description: '', serverLabel: parsed.serverSlug }; + } + + const description = toolDef.tool_permissions?._tool_descriptions?.[parsed.actionName] || ''; + const integration = INTEGRATION_META[toolDef.name] || null; + const serverLabel = toolDef.name; + + return { integration, description, serverLabel }; + }, [parsed, toolItems]); +} + +// --------------------------------------------------------------------------- +// Smart input summary for MCP tools +// --------------------------------------------------------------------------- + +function getMcpInputSummary(actionName: string, toolInput: Record): string { + const lower = actionName.toLowerCase(); + + if (lower.includes('gmail') || lower.includes('email') || lower.includes('mail')) { + const query = toolInput.query || toolInput.search_query || toolInput.q || ''; + const to = toolInput.to || toolInput.recipient || ''; + const subject = toolInput.subject || ''; + if (query) return `Search: "${query}"`; + if (to && subject) return `To ${to} — ${subject}`; + if (to) return `To ${to}`; + if (subject) return `Subject: ${subject}`; + } + + if (lower.includes('calendar') || lower.includes('event') || lower.includes('freebusy')) { + const summary = toolInput.summary || toolInput.title || toolInput.event_name || ''; + const start = toolInput.start || toolInput.start_time || toolInput.date || ''; + if (summary && start) return `${summary} — ${start}`; + if (summary) return summary; + if (start) return `Date: ${start}`; + } + + if (lower.includes('drive') || lower.includes('doc') || lower.includes('sheet') || lower.includes('slide')) { + const name = toolInput.name || toolInput.title || toolInput.filename || toolInput.file_name || ''; + const query = toolInput.query || toolInput.q || ''; + if (name) return name; + if (query) return `Search: "${query}"`; + } + + if (lower.includes('tweet') || lower.includes('post') || lower.includes('send') || lower.includes('reply')) { + const text = toolInput.text || toolInput.content || toolInput.body || toolInput.message || ''; + if (text) return text.length > 80 ? text.slice(0, 77) + '...' : text; + } + + if (lower.includes('search') || lower.includes('find') || lower.includes('query') || lower.includes('list')) { + const query = toolInput.query || toolInput.q || toolInput.search_query || toolInput.keyword || toolInput.term || ''; + if (query) return `"${query}"`; + } + + const stringVals: string[] = []; + for (const [key, val] of Object.entries(toolInput)) { + if (key.startsWith('_')) continue; + if (typeof val === 'string' && val.trim()) { + stringVals.push(val.trim()); + } + if (stringVals.length >= 2) break; + } + if (stringVals.length > 0) { + const joined = stringVals.join(' -- '); + return joined.length > 100 ? joined.slice(0, 97) + '...' : joined; + } + + return ''; +} + +// --------------------------------------------------------------------------- +// Shared components +// --------------------------------------------------------------------------- + +interface Props { + request: ApprovalRequest; + onApprove: (requestId: string, updatedInput?: Record) => void; + onDeny: (requestId: string, message?: string) => void; +} + +function getToolIcon(toolName: string) { + switch (toolName) { + case 'Bash': return ; + case 'Read': return ; + case 'Write': case 'Edit': return ; + case 'Grep': case 'Glob': return ; + case 'AskUserQuestion': return ; + default: return ; + } +} + +interface ToolPreviewProps { + request: ApprovalRequest; + tokens: ReturnType; +} + +const CodeBlock: React.FC<{ tokens: ReturnType; children: React.ReactNode }> = ({ tokens: c, children }) => ( + + {children} + +); + +const ToolPreview: React.FC = ({ request, tokens: c }) => { + const { tool_name, tool_input } = request; + + switch (tool_name) { + case 'Bash': { + return ( + + {tool_input.description && ( + + {tool_input.description} + + )} + {tool_input.command || '(empty command)'} + + ); + } + + case 'Read': + return ( + + + + {tool_input.file_path || tool_input.path || JSON.stringify(tool_input)} + + + ); + + case 'Write': + case 'Edit': { + const path = tool_input.file_path || tool_input.path || ''; + const content = tool_input.content || tool_input.new_content || tool_input.old_string; + return ( + + + + + {path} + + + {content && {typeof content === 'string' ? content : JSON.stringify(content, null, 2)}} + + ); + } + + case 'Grep': + case 'Glob': { + const pattern = tool_input.pattern || tool_input.glob_pattern || tool_input.query || ''; + const path = tool_input.path || tool_input.directory || ''; + return ( + + + + {path && ( + + in {path} + + )} + + + ); + } + + case 'AskUserQuestion': + return null; + + default: { + const preview = tool_input.command || tool_input.file_path || tool_input.path || tool_input.query || null; + if (preview) { + return {preview}; + } + return {JSON.stringify(tool_input, null, 2)}; + } + } +}; + +// --------------------------------------------------------------------------- +// QuestionForm (AskUserQuestion — unchanged) +// --------------------------------------------------------------------------- + +function getOptionKey(opt: any): string { + return opt.id || opt.value || opt.label || opt.text || String(opt); +} + +function getOptionLabel(opt: any): string { + return opt.label || opt.value || opt.text || String(opt); +} + +type Answers = Record; + +export interface QuestionFormProps { + request: ApprovalRequest; + onApprove: (requestId: string, updatedInput?: Record) => void; + onDeny: (requestId: string, message?: string) => void; + compact?: boolean; +} + +const OTHER_KEY = '__other__'; + +export const QuestionForm: React.FC = ({ request, onApprove, onDeny, compact }) => { + const c = useClaudeTokens(); + const questions: any[] = request.tool_input.questions || []; + const [answers, setAnswers] = useState(() => { + const init: Answers = {}; + questions.forEach((q: any, i: number) => { + init[i] = q.multiSelect ? [] : ''; + }); + return init; + }); + const [otherActive, setOtherActive] = useState>({}); + const [otherText, setOtherText] = useState>({}); + + const toggleOption = useCallback((qIdx: number, key: string, multi: boolean) => { + setAnswers((prev) => { + const copy = { ...prev }; + if (multi) { + const arr = Array.isArray(copy[qIdx]) ? [...(copy[qIdx] as string[])] : []; + const idx = arr.indexOf(key); + if (idx >= 0) arr.splice(idx, 1); + else arr.push(key); + copy[qIdx] = arr; + } else { + copy[qIdx] = copy[qIdx] === key ? '' : key; + } + return copy; + }); + if (key !== OTHER_KEY) { + if (!multi) { + setOtherActive((prev) => ({ ...prev, [qIdx]: false })); + setOtherText((prev) => ({ ...prev, [qIdx]: '' })); + } + } + }, []); + + const toggleOther = useCallback((qIdx: number, multi: boolean) => { + setOtherActive((prev) => { + const wasActive = !!prev[qIdx]; + if (wasActive) { + setOtherText((p) => ({ ...p, [qIdx]: '' })); + } + if (!multi && !wasActive) { + setAnswers((p) => ({ ...p, [qIdx]: '' })); + } + return { ...prev, [qIdx]: !wasActive }; + }); + }, []); + + const setTextAnswer = useCallback((qIdx: number, text: string) => { + setAnswers((prev) => ({ ...prev, [qIdx]: text })); + }, []); + + const handleSubmit = () => { + const answersDict: Record = {}; + questions.forEach((q: any, i: number) => { + const questionText = q.question || q.prompt || q.text || ''; + const hasOptions = Array.isArray(q.options) && q.options.length > 0; + let answer = answers[i]; + if (hasOptions && otherActive[i] && otherText[i]) { + if (q.multiSelect) { + const arr = Array.isArray(answer) ? [...answer] : []; + arr.push(otherText[i]); + answer = arr; + } else { + answer = otherText[i]; + } + } + if (Array.isArray(answer)) { + answersDict[questionText] = answer.join(', '); + } else { + answersDict[questionText] = answer || ''; + } + }); + onApprove(request.id, { ...request.tool_input, questions, answers: answersDict }); + }; + + const isSelected = (qIdx: number, key: string): boolean => { + const val = answers[qIdx]; + if (Array.isArray(val)) return val.includes(key); + return val === key; + }; + + return ( + + + + + + + Agent has a question + + + + + {questions.map((q: any, i: number) => { + const hasOptions = Array.isArray(q.options) && q.options.length > 0; + const multi = !!q.multiSelect; + const isOtherActive = !!otherActive[i]; + return ( + + {q.header && ( + + {q.header} + + )} + + {q.question || q.prompt || q.text || '(question)'} + + {hasOptions ? ( + + + {q.options.map((opt: any) => { + const key = getOptionKey(opt); + const selected = isSelected(i, key); + return ( + toggleOption(i, key, multi)} + sx={{ + fontSize: '0.78rem', + fontWeight: selected ? 600 : 400, + cursor: 'pointer', + color: selected ? c.accent.primary : c.text.secondary, + bgcolor: selected ? `${c.accent.primary}18` : 'transparent', + borderColor: selected ? c.accent.primary : c.border.medium, + borderWidth: 1, + borderStyle: 'solid', + transition: 'all 0.15s ease', + '&:hover': { + bgcolor: selected ? `${c.accent.primary}24` : `${c.text.secondary}0a`, + borderColor: selected ? c.accent.primary : c.text.secondary, + }, + }} + /> + ); + })} + toggleOther(i, multi)} + sx={{ + fontSize: '0.78rem', + fontWeight: isOtherActive ? 600 : 400, + fontStyle: 'italic', + cursor: 'pointer', + color: isOtherActive ? c.accent.primary : c.text.muted, + bgcolor: isOtherActive ? `${c.accent.primary}18` : 'transparent', + borderColor: isOtherActive ? c.accent.primary : c.border.subtle, + borderWidth: 1, + borderStyle: 'dashed', + transition: 'all 0.15s ease', + '&:hover': { + bgcolor: isOtherActive ? `${c.accent.primary}24` : `${c.text.secondary}0a`, + borderColor: isOtherActive ? c.accent.primary : c.border.medium, + }, + }} + /> + + {isOtherActive && ( + setOtherText((prev) => ({ ...prev, [i]: e.target.value }))} + fullWidth + size="small" + autoFocus + sx={{ + mt: 0.25, + '& .MuiOutlinedInput-root': { + color: c.text.primary, + fontSize: '0.82rem', + '& fieldset': { borderColor: c.border.medium }, + '&:hover fieldset': { borderColor: c.border.strong }, + '&.Mui-focused fieldset': { borderColor: c.accent.primary }, + }, + }} + /> + )} + + ) : ( + setTextAnswer(i, e.target.value)} + fullWidth + size="small" + multiline + maxRows={4} + sx={{ + '& .MuiOutlinedInput-root': { + color: c.text.primary, + fontSize: '0.82rem', + '& fieldset': { borderColor: c.border.medium }, + '&:hover fieldset': { borderColor: c.border.strong }, + '&.Mui-focused fieldset': { borderColor: c.accent.primary }, + }, + }} + /> + )} + + ); + })} + + + + + + + + ); +}; + +// --------------------------------------------------------------------------- +// GenericApprovalBar — redesigned for MCP tools +// --------------------------------------------------------------------------- + +const GenericApprovalBar: React.FC = ({ request, onApprove, onDeny }) => { + const c = useClaudeTokens(); + const [denyMessage, setDenyMessage] = useState(''); + const [showDenyInput, setShowDenyInput] = useState(false); + const [detailsExpanded, setDetailsExpanded] = useState(false); + + const parsed = useMemo(() => parseMcpToolName(request.tool_name), [request.tool_name]); + const meta = useMcpToolMeta(parsed); + + const accentColor = meta.integration?.color || c.status.warning; + const summary = parsed.isMcp ? getMcpInputSummary(parsed.actionName, request.tool_input) : ''; + + if (!parsed.isMcp) { + return ( + + + + {getToolIcon(request.tool_name)} + + + Permission Required + + + + + + + + + {showDenyInput && ( + setDenyMessage(e.target.value)} + fullWidth + size="small" + sx={{ + mb: 1.5, + '& .MuiOutlinedInput-root': { + color: c.text.primary, + fontSize: '0.8rem', + '& fieldset': { borderColor: c.border.strong }, + '&.Mui-focused fieldset': { borderColor: c.status.error }, + }, + }} + /> + )} + + + + {showDenyInput ? ( + + ) : ( + + )} + + + ); + } + + return ( + + {/* Header row */} + + + {meta.integration?.icon || } + + + + + + {parsed.displayName} + + + + {meta.description && ( + + {meta.description} + + )} + + + + {/* Input summary / details */} + + {summary && ( + setDetailsExpanded((v) => !v)} + > + + {summary} + + + {detailsExpanded ? : } + + + )} + + + + {JSON.stringify(request.tool_input, null, 2)} + + + + + + {/* Deny reason input */} + {showDenyInput && ( + + setDenyMessage(e.target.value)} + fullWidth + size="small" + autoFocus + sx={{ + '& .MuiOutlinedInput-root': { + color: c.text.primary, + fontSize: '0.8rem', + '& fieldset': { borderColor: c.border.strong }, + '&.Mui-focused fieldset': { borderColor: c.status.error }, + }, + }} + /> + + )} + + {/* Action buttons */} + + + {showDenyInput ? ( + + ) : ( + + )} + + + ); +}; + +// --------------------------------------------------------------------------- +// Entry point +// --------------------------------------------------------------------------- + +const ApprovalBar: React.FC = (props) => { + if (props.request.tool_name === 'AskUserQuestion') { + return ; + } + return ; +}; + +// --------------------------------------------------------------------------- +// BatchApprovalBar — grouped mass approve/deny when many approvals pending +// --------------------------------------------------------------------------- + +interface ToolGroup { + toolName: string; + parsed: ParsedTool; + requests: ApprovalRequest[]; +} + +interface BatchApprovalBarProps { + requests: ApprovalRequest[]; + onApprove: (requestId: string, updatedInput?: Record) => void; + onDeny: (requestId: string, message?: string) => void; +} + +export const BatchApprovalBar: React.FC = ({ requests, onApprove, onDeny }) => { + const c = useClaudeTokens(); + const [expandedGroup, setExpandedGroup] = useState(null); + + const questions = requests.filter((r) => r.tool_name === 'AskUserQuestion'); + const nonQuestions = requests.filter((r) => r.tool_name !== 'AskUserQuestion'); + + const groups = useMemo(() => { + const map = new Map(); + for (const req of nonQuestions) { + const existing = map.get(req.tool_name); + if (existing) { + existing.requests.push(req); + } else { + map.set(req.tool_name, { + toolName: req.tool_name, + parsed: parseMcpToolName(req.tool_name), + requests: [req], + }); + } + } + return Array.from(map.values()); + }, [nonQuestions]); + + const handleApproveAll = () => { + for (const req of nonQuestions) onApprove(req.id); + }; + + const handleDenyAll = () => { + for (const req of nonQuestions) onDeny(req.id); + }; + + const handleApproveGroup = (group: ToolGroup) => { + for (const req of group.requests) onApprove(req.id); + }; + + const handleDenyGroup = (group: ToolGroup) => { + for (const req of group.requests) onDeny(req.id); + }; + + return ( + + {questions.map((req) => ( + + ))} + + {nonQuestions.length > 1 && ( + + {/* Global actions bar */} + + + {nonQuestions.length} pending approvals + + + + + + {/* Per-group rows */} + {groups.map((group) => ( + setExpandedGroup((prev) => prev === group.toolName ? null : group.toolName)} + onApprove={onApprove} + onDeny={onDeny} + onApproveGroup={() => handleApproveGroup(group)} + onDenyGroup={() => handleDenyGroup(group)} + /> + ))} + + )} + + {nonQuestions.length === 1 && ( + + )} + + ); +}; + +// --------------------------------------------------------------------------- +// GroupRow — a single tool-name group within the batch bar +// --------------------------------------------------------------------------- + +interface GroupRowProps { + group: ToolGroup; + expanded: boolean; + onToggle: () => void; + onApprove: (requestId: string, updatedInput?: Record) => void; + onDeny: (requestId: string, message?: string) => void; + onApproveGroup: () => void; + onDenyGroup: () => void; +} + +const GroupRow: React.FC = ({ group, expanded, onToggle, onApprove, onDeny, onApproveGroup, onDenyGroup }) => { + const c = useClaudeTokens(); + const meta = useMcpToolMeta(group.parsed); + const accentColor = meta.integration?.color || c.status.warning; + + return ( + + + + {group.parsed.isMcp + ? (meta.integration?.icon || ) + : getToolIcon(group.toolName)} + + + + {group.parsed.isMcp ? group.parsed.displayName : group.toolName} + + + + + {group.requests.length > 1 && ( + <> + + + + )} + + + {expanded ? : } + + + + + + {group.requests.map((req) => ( + + ))} + + + + ); +}; + +export default ApprovalBar; diff --git a/frontend/src/app/pages/AgentChat/BranchNavigator.tsx b/frontend/src/app/pages/AgentChat/BranchNavigator.tsx new file mode 100644 index 00000000..4dbabb95 --- /dev/null +++ b/frontend/src/app/pages/AgentChat/BranchNavigator.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import ChevronLeftIcon from '@mui/icons-material/ChevronLeft'; +import ChevronRightIcon from '@mui/icons-material/ChevronRight'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +interface Props { + currentIndex: number; + totalBranches: number; + onPrevious: () => void; + onNext: () => void; +} + +const BranchNavigator: React.FC = ({ currentIndex, totalBranches, onPrevious, onNext }) => { + const c = useClaudeTokens(); + if (totalBranches <= 1) return null; + + return ( + + + + + + {currentIndex + 1}/{totalBranches} + + + + + + ); +}; + +export default BranchNavigator; diff --git a/frontend/src/app/pages/AgentChat/ChatInput.tsx b/frontend/src/app/pages/AgentChat/ChatInput.tsx new file mode 100644 index 00000000..451bc4b6 --- /dev/null +++ b/frontend/src/app/pages/AgentChat/ChatInput.tsx @@ -0,0 +1,1148 @@ +import React, { useState, useRef, useCallback, useEffect, useMemo, forwardRef, useImperativeHandle } from 'react'; +import Box from '@mui/material/Box'; +import Menu from '@mui/material/Menu'; +import MenuItem from '@mui/material/MenuItem'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import Chip from '@mui/material/Chip'; +import MicNoneOutlinedIcon from '@mui/icons-material/MicNoneOutlined'; +import ArrowUpwardIcon from '@mui/icons-material/ArrowUpward'; +import StopIcon from '@mui/icons-material/Stop'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import SmartToyOutlinedIcon from '@mui/icons-material/SmartToyOutlined'; +import QuestionAnswerOutlinedIcon from '@mui/icons-material/QuestionAnswerOutlined'; +import MapOutlinedIcon from '@mui/icons-material/MapOutlined'; +import CategoryOutlinedIcon from '@mui/icons-material/CategoryOutlined'; +import TuneOutlinedIcon from '@mui/icons-material/TuneOutlined'; +import CloseIcon from '@mui/icons-material/Close'; +import FolderOpenIcon from '@mui/icons-material/FolderOpen'; +import InsertDriveFileOutlinedIcon from '@mui/icons-material/InsertDriveFileOutlined'; +import Modal from '@mui/material/Modal'; +import CircularProgress from '@mui/material/CircularProgress'; +import AttachFileIcon from '@mui/icons-material/AttachFile'; +import AdsClickIcon from '@mui/icons-material/AdsClick'; +import CommandPicker, { CommandPickerItem, getToolGroupIcon } from '@/app/components/CommandPicker'; +import { useElementSelection, SelectedElement } from '@/app/components/ElementSelectionContext'; +import { ContextPath } from '@/app/components/DirectoryBrowser'; +import { + SKILL_PILL_ATTR, + AttachedSkill, + createSkillPillElement, + serializeEditorContent, + detectEditorTrigger, + TriggerState, + EMPTY_TRIGGER, +} from '@/app/components/richEditorUtils'; +import TemplateInvokeModal from './TemplateInvokeModal'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { fetchModes } from '@/shared/state/modesSlice'; +import { PromptTemplate } from '@/shared/state/templatesSlice'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +export interface AttachedImage { + data: string; + media_type: string; + preview: string; +} + +export interface ForcedToolGroup { + label: string; + tools: string[]; + icon?: React.ReactNode; + iconKey?: string; +} + +export type { AttachedSkill } from '@/app/components/richEditorUtils'; + +interface Props { + onSend: (message: string, images?: Array<{ data: string; media_type: string }>, contextPaths?: ContextPath[], forcedTools?: string[], attachedSkills?: Array<{ id: string; name: string; content: string }>) => void; + disabled?: boolean; + mode: string; + onModeChange: (mode: string) => void; + model: string; + onModelChange: (model: string) => void; + isRunning?: boolean; + onStop?: () => void; + autoRunMode?: boolean; + contextEstimate?: { used: number; limit: number }; + embedded?: boolean; + autoFocus?: boolean; +} + +export interface ChatInputHandle { + getConfig: () => { prompt: string; contextPaths: ContextPath[]; forcedTools: ForcedToolGroup[] }; + setContent: (prompt: string, contextPaths?: ContextPath[], forcedTools?: ForcedToolGroup[]) => void; +} + +const ICON_MAP: Record = { + smart_toy: , + question_answer: , + map: , + category: , + tune: , +}; + +const FALLBACK_MODE_BASE = { label: 'Agent', icon: ICON_MAP.smart_toy }; + +const MODEL_OPTIONS = [ + { value: 'sonnet', label: 'Sonnet', version: '4.6' }, + { value: 'opus', label: 'Opus', version: '4.6' }, + { value: 'haiku', label: 'Haiku', version: '3.5' }, +]; + +function formatTokenCount(n: number): string { + if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`; + if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`; + return String(n); +} + +const ContextRing: React.FC<{ used: number; limit: number; accentColor: string; trackColor: string }> = ({ used, limit, accentColor, trackColor }) => { + if (used === 0) return null; + const pct = Math.min((used / limit) * 100, 100); + const size = 20; + const strokeWidth = 2; + const radius = (size - strokeWidth) / 2; + const circumference = 2 * Math.PI * radius; + const dashOffset = circumference * (1 - pct / 100); + const tooltip = `${pct.toFixed(1)}% \u00B7 ${formatTokenCount(used)} / ${formatTokenCount(limit)} context used`; + + return ( + + + + + + + + + ); +}; + +const ChatInput = forwardRef(({ onSend, disabled, mode, onModeChange, model, onModelChange, isRunning, onStop, autoRunMode, contextEstimate, embedded, autoFocus }, ref) => { + const c = useClaudeTokens(); + const editorRef = useRef(null); + const containerRef = useRef(null); + const generalFileInputRef = useRef(null); + const dispatch = useAppDispatch(); + const elementSelection = useElementSelection(); + + useEffect(() => { + if (autoFocus) editorRef.current?.focus(); + }, [autoFocus]); + + const [hasContent, setHasContent] = useState(false); + const [attachedSkills, setAttachedSkills] = useState>({}); + const attachedSkillsRef = useRef(attachedSkills); + attachedSkillsRef.current = attachedSkills; + + const [picker, setPicker] = useState(EMPTY_TRIGGER); + const [selectedTemplate, setSelectedTemplate] = useState(null); + const templates = useAppSelector((state) => state.templates.items); + const skills = useAppSelector((state) => state.skills.items); + const modesMap = useAppSelector((state) => state.modes.items); + const modesArr = useMemo(() => Object.values(modesMap), [modesMap]); + + useEffect(() => { + if (modesArr.length === 0) dispatch(fetchModes()); + }, [dispatch, modesArr.length]); + + const [images, setImages] = useState([]); + const [lightboxSrc, setLightboxSrc] = useState(null); + const [isDragOver, setIsDragOver] = useState(false); + const [isUploading, setIsUploading] = useState(false); + const [contextPaths, setContextPaths] = useState([]); + const [forcedTools, setForcedTools] = useState([]); + const [copiedPathIdx, setCopiedPathIdx] = useState(null); + + useImperativeHandle(ref, () => ({ + getConfig: () => { + const editor = editorRef.current; + const prompt = editor ? serializeEditorContent(editor, attachedSkillsRef.current).trim() : ''; + return { prompt, contextPaths, forcedTools }; + }, + setContent: (prompt: string, newContextPaths?: ContextPath[], newForcedTools?: ForcedToolGroup[]) => { + const editor = editorRef.current; + if (editor) { + editor.textContent = prompt; + setHasContent(!!prompt); + } + if (newContextPaths) setContextPaths(newContextPaths); + if (newForcedTools) setForcedTools(newForcedTools); + }, + }), [contextPaths, forcedTools]); + + const [modeAnchor, setModeAnchor] = useState(null); + const [modelAnchor, setModelAnchor] = useState(null); + + const currentMode = modesMap[mode]; + const FALLBACK_MODE = { ...FALLBACK_MODE_BASE, color: c.accent.primary }; + const modeConf = currentMode + ? { label: currentMode.name, icon: ICON_MAP[currentMode.icon] || ICON_MAP.smart_toy, color: currentMode.color } + : FALLBACK_MODE; + + const updateHasContent = useCallback(() => { + const editor = editorRef.current; + if (!editor) return; + const text = (editor.textContent || '').replace(/\u200B/g, ''); + const hasPills = editor.querySelector(`[${SKILL_PILL_ATTR}]`) !== null; + setHasContent(text.trim().length > 0 || hasPills); + }, []); + + const syncAttachedSkills = useCallback(() => { + const editor = editorRef.current; + if (!editor) return; + const pillIds = new Set( + Array.from(editor.querySelectorAll(`[${SKILL_PILL_ATTR}]`)) + .map((el) => el.getAttribute(SKILL_PILL_ATTR)) + .filter(Boolean) as string[], + ); + setAttachedSkills((prev) => { + const prevKeys = Object.keys(prev); + if (prevKeys.length === pillIds.size && prevKeys.every((k) => pillIds.has(k))) return prev; + const next: Record = {}; + for (const [id, skill] of Object.entries(prev)) { + if (pillIds.has(id)) next[id] = skill; + } + return next; + }); + }, []); + + const removeSkillPill = useCallback((skillId: string) => { + const editor = editorRef.current; + if (!editor) return; + const pill = editor.querySelector(`[${SKILL_PILL_ATTR}="${skillId}"]`); + if (pill) pill.remove(); + setAttachedSkills((prev) => { + const { [skillId]: _, ...rest } = prev; + return rest; + }); + const text = (editor.textContent || '').replace(/\u200B/g, ''); + const hasPills = editor.querySelector(`[${SKILL_PILL_ATTR}]`) !== null; + setHasContent(text.trim().length > 0 || hasPills); + editor.focus(); + }, []); + + const addImageFiles = useCallback((files: FileList | File[]) => { + Array.from(files).forEach((file) => { + if (!file.type.startsWith('image/')) return; + const reader = new FileReader(); + reader.onload = () => { + const result = reader.result as string; + const base64 = result.split(',')[1]; + setImages((prev) => [ + ...prev, + { data: base64, media_type: file.type, preview: result }, + ]); + }; + reader.readAsDataURL(file); + }); + }, []); + + const uploadAndAttachFiles = useCallback(async (files: File[]) => { + if (files.length === 0) return; + setIsUploading(true); + try { + const formData = new FormData(); + files.forEach((f) => formData.append('files', f)); + const resp = await fetch(`http://${window.location.hostname}:8324/api/settings/upload-files`, { + method: 'POST', + body: formData, + }); + if (!resp.ok) throw new Error('Upload failed'); + const data = await resp.json(); + const newPaths: ContextPath[] = (data.files || []).map((f: { path: string }) => ({ + path: f.path, + type: 'file' as const, + })); + setContextPaths((prev) => [...prev, ...newPaths]); + } catch (err) { + console.error('File upload failed:', err); + } finally { + setIsUploading(false); + } + }, []); + + const handleSend = useCallback(() => { + const editor = editorRef.current; + if (!editor || disabled) return; + const serialized = serializeEditorContent(editor, attachedSkillsRef.current); + let trimmed = serialized.trim(); + if (!trimmed) return; + + const selectedEls = elementSelection?.selectedElements ?? []; + let allImages = images.length > 0 + ? images.map(({ data, media_type }) => ({ data, media_type })) + : []; + + if (selectedEls.length > 0) { + const lines: string[] = ['\n\n---\nSelected UI Elements:\n']; + selectedEls.forEach((el, i) => { + if (el.semanticType && el.semanticData) { + const typeLabel = { + 'agent-card': 'Agent Card', + 'message': 'Message', + 'tool-call': 'Tool Call', + 'tool-group': 'Tool Group', + 'view-card': 'View Card', + 'dom-element': 'Element', + }[el.semanticType] || el.semanticType; + lines.push(`${i + 1}. [${typeLabel}] ${el.semanticLabel || ''}`); + const { selectId, ...rest } = el.semanticData; + if (selectId) lines.push(` ID: ${selectId}`); + const metaStr = Object.entries(rest) + .filter(([, v]) => v != null) + .map(([k, v]) => `${k}: ${typeof v === 'string' ? v : JSON.stringify(v)}`) + .join(', '); + if (metaStr) lines.push(` ${metaStr}`); + } else { + const styleStr = Object.entries(el.computedStyles) + .map(([k, v]) => `${k}: ${v}`) + .join('; '); + lines.push(`${i + 1}. \`${el.selectorPath}\` (${el.tagName.toLowerCase()})`); + lines.push(` Selector: ${el.selectorPath}`); + lines.push(` HTML: ${el.outerHTML.length > 500 ? el.outerHTML.slice(0, 500) + '...' : el.outerHTML}`); + if (styleStr) lines.push(` Key styles: ${styleStr}`); + } + lines.push(''); + + if (el.screenshot) { + const base64 = el.screenshot.replace(/^data:image\/\w+;base64,/, ''); + allImages.push({ data: base64, media_type: 'image/png' }); + } + }); + trimmed += lines.join('\n'); + } + + const sendImages = allImages.length > 0 ? allImages : undefined; + const allForcedToolNames = forcedTools.flatMap((ft) => ft.tools); + const currentSkills = Object.values(attachedSkillsRef.current); + const sendSkills = currentSkills.length > 0 + ? currentSkills.map((s) => ({ id: s.id, name: s.name, content: s.content })) + : undefined; + onSend( + trimmed, + sendImages, + contextPaths.length > 0 ? contextPaths : undefined, + allForcedToolNames.length > 0 ? allForcedToolNames : undefined, + sendSkills, + ); + editor.innerHTML = ''; + setImages([]); + setContextPaths([]); + setForcedTools([]); + setAttachedSkills({}); + setHasContent(false); + elementSelection?.clearSelectedElements(); + }, [disabled, images, contextPaths, forcedTools, onSend, elementSelection]); + + const detectTrigger = useCallback(() => { + const result = detectEditorTrigger(); + if (result) { + setPicker(result); + } else { + setPicker((p) => ({ ...p, visible: false })); + } + }, []); + + const handleInput = useCallback(() => { + updateHasContent(); + detectTrigger(); + syncAttachedSkills(); + }, [updateHasContent, detectTrigger, syncAttachedSkills]); + + const handleEditorClick = useCallback(() => { + detectTrigger(); + }, [detectTrigger]); + + const handlePickerSelect = (item: CommandPickerItem) => { + setPicker((p) => ({ ...p, visible: false })); + const editor = editorRef.current; + if (!editor) return; + + editor.focus(); + + const { triggerNode, triggerOffset, filter } = picker; + if (triggerNode && triggerNode.parentNode && editor.contains(triggerNode)) { + const endOffset = Math.min(triggerOffset + 1 + filter.length, triggerNode.length); + const range = document.createRange(); + range.setStart(triggerNode, triggerOffset); + range.setEnd(triggerNode, endOffset); + range.deleteContents(); + const sel = window.getSelection(); + if (sel) { sel.removeAllRanges(); sel.addRange(range); } + } + + if (item.type === 'template') { + const tmpl = templates[item.id]; + if (!tmpl) return; + if (tmpl.fields.length === 0) { + document.execCommand('insertText', false, tmpl.template); + } else { + setSelectedTemplate(tmpl); + } + } else if (item.type === 'skill') { + const skill = skills[item.id]; + if (!skill) return; + if (editor.querySelector(`[${SKILL_PILL_ATTR}="${skill.id}"]`)) return; + + const pill = createSkillPillElement( + { id: skill.id, name: skill.name, content: skill.content }, + removeSkillPill, + c.font.mono, + c.status.error, + ); + + const sel = window.getSelection(); + if (sel && sel.rangeCount > 0) { + const range = sel.getRangeAt(0); + range.collapse(false); + range.insertNode(pill); + const spacer = document.createTextNode('\u200B'); + pill.after(spacer); + const newRange = document.createRange(); + newRange.setStartAfter(spacer); + newRange.collapse(true); + sel.removeAllRanges(); + sel.addRange(newRange); + } + + setAttachedSkills((prev) => ({ + ...prev, + [skill.id]: { id: skill.id, name: skill.name, content: skill.content }, + })); + } else if (item.type === 'mode') { + onModeChange(item.id); + } else if (item.type === 'context') { + if (item.command === 'file') { + generalFileInputRef.current?.click(); + } else if (item.toolNames && item.toolNames.length > 0) { + setForcedTools((prev) => [...prev, { label: item.name, tools: item.toolNames!, icon: item.icon, iconKey: item.iconKey }]); + } else { + document.execCommand('insertText', false, `@${item.command} `); + } + } + + updateHasContent(); + setTimeout(() => editor.focus(), 0); + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (picker.visible && ['ArrowDown', 'ArrowUp', 'Escape', 'Tab', 'Enter'].includes(e.key)) { + e.preventDefault(); + return; + } + if ((e.ctrlKey || e.metaKey) && ['b', 'i', 'u'].includes(e.key.toLowerCase())) { + e.preventDefault(); + return; + } + if (e.key === 'Enter' && !e.shiftKey && !autoRunMode) { + e.preventDefault(); + handleSend(); + } + }; + + const handlePaste = useCallback((e: React.ClipboardEvent) => { + const items = e.clipboardData?.items; + if (!items) return; + const imageFiles: File[] = []; + for (let i = 0; i < items.length; i++) { + if (items[i].type.startsWith('image/')) { + const file = items[i].getAsFile(); + if (file) imageFiles.push(file); + } + } + if (imageFiles.length > 0) { + e.preventDefault(); + addImageFiles(imageFiles); + return; + } + e.preventDefault(); + const plain = e.clipboardData.getData('text/plain'); + if (plain) document.execCommand('insertText', false, plain); + }, [addImageFiles]); + + const handleDragOver = useCallback((e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + if (e.dataTransfer.types.includes('Files')) { + setIsDragOver(true); + } + }, []); + + const handleDragLeave = useCallback((e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + setIsDragOver(false); + }, []); + + const handleDrop = useCallback((e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + setIsDragOver(false); + if (e.dataTransfer.files.length === 0) return; + const allFiles = Array.from(e.dataTransfer.files); + const imageFiles = allFiles.filter((f) => f.type.startsWith('image/')); + const otherFiles = allFiles.filter((f) => !f.type.startsWith('image/')); + if (imageFiles.length > 0) addImageFiles(imageFiles); + if (otherFiles.length > 0) uploadAndAttachFiles(otherFiles); + }, [addImageFiles, uploadAndAttachFiles]); + + const removeImage = useCallback((idx: number) => { + setImages((prev) => prev.filter((_, i) => i !== idx)); + }, []); + + const menuPaperProps = { + sx: { + bgcolor: c.bg.surface, + border: `1px solid ${c.border.subtle}`, + borderRadius: '10px', + minWidth: 140, + boxShadow: c.shadow.lg, + '& .MuiMenuItem-root': { + fontSize: '0.8rem', + color: c.text.secondary, + py: 0.75, + px: 1.5, + '&:hover': { bgcolor: c.bg.secondary }, + }, + }, + }; + + const selectedElements = elementSelection?.selectedElements ?? []; + const hasAttachments = images.length > 0 || contextPaths.length > 0 || forcedTools.length > 0 || selectedElements.length > 0; + + return ( + + {isDragOver && ( + + + + Drop files here + + + )} + + {isUploading && ( + + + + Attaching files… + + + )} + + setPicker((p) => ({ ...p, visible: false }))} + visible={picker.visible} + /> + + {images.length > 0 && ( + + {images.map((img, idx) => ( + setLightboxSrc(img.preview)} + > + + { e.stopPropagation(); removeImage(idx); }} + sx={{ + position: 'absolute', + top: -2, + right: -2, + width: 18, + height: 18, + bgcolor: c.bg.surface, + border: `1px solid ${c.border.medium}`, + color: c.text.tertiary, + '&:hover': { bgcolor: c.bg.secondary, color: c.text.primary }, + }} + > + + + + ))} + + )} + + {contextPaths.length > 0 && ( + 0 ? 0.25 : 1, pb: 0 }}> + {contextPaths.map((cp, idx) => { + const label = cp.path.split('/').filter(Boolean).slice(-2).join('/'); + return ( + + + : + } + label={label} + size="small" + onClick={() => { + navigator.clipboard.writeText(cp.path); + setCopiedPathIdx(idx); + setTimeout(() => setCopiedPathIdx((cur) => cur === idx ? null : cur), 1200); + }} + onDelete={() => setContextPaths((prev) => prev.filter((_, i) => i !== idx))} + sx={{ + bgcolor: `${c.accent.primary}12`, + color: c.accent.primary, + fontSize: '0.72rem', + fontFamily: c.font.mono, + height: 26, + maxWidth: 220, + cursor: 'pointer', + '& .MuiChip-label': { overflow: 'hidden', textOverflow: 'ellipsis' }, + '& .MuiChip-deleteIcon': { + color: c.accent.primary, + fontSize: 16, + '&:hover': { color: c.status.error }, + }, + }} + /> + + ); + })} + + )} + + {forcedTools.length > 0 && ( + 0 || contextPaths.length > 0) ? 0.25 : 1, pb: 0 }}> + {forcedTools.map((ft, idx) => ( + {ft.icon || getToolGroupIcon(ft.iconKey || ft.label, 14)}} + label={`@${ft.label.toLowerCase()}`} + size="small" + onDelete={() => setForcedTools((prev) => prev.filter((_, i) => i !== idx))} + sx={{ + bgcolor: `${c.status.info}15`, + color: c.status.info, + fontSize: '0.72rem', + fontFamily: c.font.mono, + height: 26, + maxWidth: 220, + '& .MuiChip-label': { overflow: 'hidden', textOverflow: 'ellipsis' }, + '& .MuiChip-deleteIcon': { + color: c.status.info, + fontSize: 16, + '&:hover': { color: c.status.error }, + }, + }} + /> + ))} + + )} + + {selectedElements.length > 0 && ( + 0 || contextPaths.length > 0 || forcedTools.length > 0) ? 0.25 : 1, pb: 0 }}> + {selectedElements.map((el) => { + const chipLabel = el.semanticLabel + ? el.semanticLabel + : el.className + ? `${el.tagName.toLowerCase()}.${el.className.split(' ')[0]}` + : el.tagName.toLowerCase(); + const tooltipText = el.semanticType + ? `${el.semanticType}: ${el.semanticLabel || el.selectorPath}` + : el.selectorPath; + return ( + + } + label={chipLabel} + size="small" + onDelete={() => elementSelection?.removeSelectedElement(el.id)} + sx={{ + bgcolor: 'rgba(59, 130, 246, 0.1)', + color: '#3b82f6', + fontSize: '0.72rem', + fontFamily: c.font.mono, + height: 26, + maxWidth: 220, + '& .MuiChip-label': { overflow: 'hidden', textOverflow: 'ellipsis' }, + '& .MuiChip-deleteIcon': { + color: '#3b82f6', + fontSize: 16, + '&:hover': { color: c.status.error }, + }, + '& .MuiChip-icon': { + color: '#3b82f6', + }, + }} + /> + + ); + })} + + )} + + +
    + {!hasContent && ( +
    + {disabled ? 'Agent is working...' : autoRunMode ? 'Describe what data to generate…' : `${modeConf.label}, @ for context, / for commands`} +
    + )} + + + + setModeAnchor(e.currentTarget)} + sx={{ + display: 'inline-flex', + alignItems: 'center', + gap: 0.5, + px: 1, + py: 0.375, + borderRadius: '999px', + cursor: 'pointer', + userSelect: 'none', + color: modeConf.color, + bgcolor: `${modeConf.color}14`, + '&:hover': { bgcolor: `${modeConf.color}22` }, + transition: 'background 0.15s', + }} + > + {modeConf.icon} + + {modeConf.label} + + + + + setModeAnchor(null)} + anchorOrigin={{ vertical: 'top', horizontal: 'left' }} + transformOrigin={{ vertical: 'bottom', horizontal: 'left' }} + slotProps={{ paper: menuPaperProps }} + > + {modesArr.map((m) => { + const icon = ICON_MAP[m.icon] || ICON_MAP.smart_toy; + return ( + { + onModeChange(m.id); + setModeAnchor(null); + }} + > + + {icon} + + + + ); + })} + + + setModelAnchor(e.currentTarget)} + sx={{ + display: 'inline-flex', + alignItems: 'center', + gap: 0.25, + px: 0.75, + py: 0.25, + borderRadius: '6px', + cursor: 'pointer', + userSelect: 'none', + color: c.text.muted, + '&:hover': { bgcolor: 'rgba(0,0,0,0.04)' }, + transition: 'background 0.15s', + }} + > + + {(() => { const m = MODEL_OPTIONS.find((m) => m.value === model); return m ? `${m.label} ${m.version}` : model; })()} + + + + + setModelAnchor(null)} + anchorOrigin={{ vertical: 'top', horizontal: 'left' }} + transformOrigin={{ vertical: 'bottom', horizontal: 'left' }} + slotProps={{ paper: menuPaperProps }} + > + {MODEL_OPTIONS.map((opt) => ( + { + onModelChange(opt.value); + setModelAnchor(null); + }} + > + + + ))} + + + + + {contextEstimate && ( + + )} + + {elementSelection && !autoRunMode && ( + + + + + + )} + + { + if (!e.target.files) return; + const all = Array.from(e.target.files); + const imgs = all.filter((f) => f.type.startsWith('image/')); + const rest = all.filter((f) => !f.type.startsWith('image/')); + if (imgs.length > 0) addImageFiles(imgs); + if (rest.length > 0) uploadAndAttachFiles(rest); + e.target.value = ''; + }} + /> + + generalFileInputRef.current?.click()} + sx={{ + color: c.text.tertiary, + p: 0.5, + '&:hover': { color: c.text.secondary, bgcolor: 'rgba(0,0,0,0.04)' }, + }} + > + + + + {!autoRunMode && (isRunning ? ( + + + + + + ) : hasContent ? ( + + + + + + ) : ( + + + + + + + + ))} + + + {selectedTemplate && ( + setSelectedTemplate(null)} + onApply={(rendered) => { + const editor = editorRef.current; + if (editor) { + editor.innerHTML = ''; + editor.textContent = rendered; + const range = document.createRange(); + range.selectNodeContents(editor); + range.collapse(false); + const sel = window.getSelection(); + if (sel) { sel.removeAllRanges(); sel.addRange(range); } + } + setSelectedTemplate(null); + setAttachedSkills({}); + setHasContent(!!rendered); + }} + /> + )} + + setLightboxSrc(null)} + sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }} + > + setLightboxSrc(null)} + sx={{ position: 'relative', outline: 'none', maxWidth: '90vw', maxHeight: '90vh' }} + > + setLightboxSrc(null)} + sx={{ + position: 'absolute', + top: -16, + right: -16, + bgcolor: c.bg.surface, + border: `1px solid ${c.border.medium}`, + color: c.text.secondary, + width: 32, + height: 32, + zIndex: 1, + '&:hover': { bgcolor: c.bg.secondary }, + boxShadow: c.shadow.md, + }} + > + + + e.stopPropagation()} + style={{ + maxWidth: '90vw', + maxHeight: '90vh', + borderRadius: 8, + boxShadow: '0 8px 32px rgba(0,0,0,0.4)', + display: 'block', + }} + /> + + + + + ); +}); + +ChatInput.displayName = 'ChatInput'; + +export default ChatInput; diff --git a/frontend/src/app/pages/AgentChat/DiffViewer.tsx b/frontend/src/app/pages/AgentChat/DiffViewer.tsx new file mode 100644 index 00000000..5957f23f --- /dev/null +++ b/frontend/src/app/pages/AgentChat/DiffViewer.tsx @@ -0,0 +1,139 @@ +import React, { useState, useEffect } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import DifferenceIcon from '@mui/icons-material/Difference'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +const API_BASE = `http://${window.location.hostname}:8324/api/agents`; + +interface Props { + sessionId: string; +} + +const DiffViewer: React.FC = ({ sessionId }) => { + const c = useClaudeTokens(); + const [diff, setDiff] = useState(''); + const [loading, setLoading] = useState(false); + const [open, setOpen] = useState(false); + + const fetchDiff = async () => { + setLoading(true); + try { + const res = await fetch(`${API_BASE}/sessions/${sessionId}/diff`); + const data = await res.json(); + setDiff(data.diff || ''); + } catch { + setDiff('Failed to fetch diff'); + } + setLoading(false); + }; + + useEffect(() => { + if (open) fetchDiff(); + }, [open, sessionId]); + + if (!open) { + return ( + + setOpen(true)} sx={{ color: c.text.tertiary }}> + + + + ); + } + + return ( + + + + Worktree Changes + + + + + + + + setOpen(false)} sx={{ color: c.text.tertiary }}> + × + + + + + {loading ? ( + Loading... + ) : diff ? ( +
    +            {diff.split('\n').map((line, i) => {
    +              let color = c.text.muted;
    +              if (line.startsWith('+') && !line.startsWith('+++')) color = c.status.success;
    +              else if (line.startsWith('-') && !line.startsWith('---')) color = c.status.error;
    +              else if (line.startsWith('@@')) color = c.accent.primary;
    +              else if (line.startsWith('diff ') || line.startsWith('index ')) color = c.text.tertiary;
    +
    +              return (
    +                
    +                  {line}
    +                  {'\n'}
    +                
    +              );
    +            })}
    +          
    + ) : ( + + No changes detected in the worktree. + + )} +
    +
    + ); +}; + +export default DiffViewer; diff --git a/frontend/src/app/pages/AgentChat/MessageBubble.tsx b/frontend/src/app/pages/AgentChat/MessageBubble.tsx new file mode 100644 index 00000000..be7c43ba --- /dev/null +++ b/frontend/src/app/pages/AgentChat/MessageBubble.tsx @@ -0,0 +1,653 @@ +import React, { useState, useMemo } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import TextField from '@mui/material/TextField'; +import Button from '@mui/material/Button'; +import Chip from '@mui/material/Chip'; +import Tooltip from '@mui/material/Tooltip'; +import Collapse from '@mui/material/Collapse'; +import Modal from '@mui/material/Modal'; +import EditIcon from '@mui/icons-material/Edit'; +import CloseIcon from '@mui/icons-material/Close'; +import AdsClickIcon from '@mui/icons-material/AdsClick'; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import FolderOutlinedIcon from '@mui/icons-material/FolderOutlined'; +import InsertDriveFileOutlinedIcon from '@mui/icons-material/InsertDriveFileOutlined'; +import PsychologyOutlinedIcon from '@mui/icons-material/PsychologyOutlined'; +import BuildOutlinedIcon from '@mui/icons-material/BuildOutlined'; +import ReactMarkdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; +import { AgentMessage } from '@/shared/state/agentsSlice'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import { SKILL_COLOR } from '@/app/components/richEditorUtils'; +import ViewBubble from './ViewBubble'; + +const streamingCursorKeyframes = ` +@keyframes blink-cursor { + 0%, 100% { opacity: 1; } + 50% { opacity: 0; } +} +`; + +const StreamingCursor: React.FC = () => { + const c = useClaudeTokens(); + return ( + <> + + + + ); +}; + +const ELEMENT_SEPARATOR = '\n\n---\nSelected UI Elements:\n'; + +interface ParsedElement { + label: string; + selector: string; + isSemantic?: boolean; +} + +function parseElementContext(text: string): { userMessage: string; elements: ParsedElement[] } { + const sepIdx = text.indexOf(ELEMENT_SEPARATOR); + if (sepIdx === -1) return { userMessage: text, elements: [] }; + + const userMessage = text.slice(0, sepIdx); + const elementSection = text.slice(sepIdx + ELEMENT_SEPARATOR.length); + + const elements: ParsedElement[] = []; + const blocks = elementSection.split(/\n(?=\d+\.\s)/).filter(Boolean); + for (const block of blocks) { + const semanticMatch = block.match(/\d+\.\s+\[([^\]]+)\]\s*(.*)/); + if (semanticMatch) { + const typeLabel = semanticMatch[1]; + const rest = semanticMatch[2].trim(); + elements.push({ + label: `${typeLabel}: ${rest.split('\n')[0]}`, + selector: typeLabel, + isSemantic: true, + }); + continue; + } + + const labelMatch = block.match(/`([^`]+)`\s+\((\w+)\)/); + const selectorMatch = block.match(/Selector:\s*(.+)/); + if (labelMatch) { + elements.push({ + label: labelMatch[1], + selector: selectorMatch?.[1]?.trim() ?? labelMatch[1], + }); + } + } + + return { userMessage, elements }; +} + +const SKILL_PILL_RE = /\{\{skill:([^}]+)\}\}/g; + +function renderUserTextWithPills(text: string, c: ReturnType): React.ReactNode[] { + const parts: React.ReactNode[] = []; + let lastIndex = 0; + let match: RegExpExecArray | null; + const re = new RegExp(SKILL_PILL_RE.source, 'g'); + while ((match = re.exec(text)) !== null) { + if (match.index > lastIndex) { + parts.push(text.slice(lastIndex, match.index)); + } + const skillName = match[1]; + parts.push( + } + label={skillName} + size="small" + sx={{ + bgcolor: `${SKILL_COLOR}18`, + color: SKILL_COLOR, + fontSize: '0.72rem', + fontFamily: c.font.mono, + height: 20, + mx: 0.25, + verticalAlign: 'baseline', + '& .MuiChip-icon': { color: SKILL_COLOR }, + }} + />, + ); + lastIndex = re.lastIndex; + } + if (lastIndex < text.length) { + parts.push(text.slice(lastIndex)); + } + return parts; +} + +interface ContextGroup { + key: string; + icon: React.ReactNode; + color: string; + label: string; + chips: Array<{ label: string; tooltip?: string; icon: React.ReactNode }>; +} + +function buildContextGroups( + elements: ParsedElement[], + message: AgentMessage, +): ContextGroup[] { + const groups: ContextGroup[] = []; + + if (elements.length > 0) { + groups.push({ + key: 'elements', + icon: , + color: '#3b82f6', + label: `${elements.length} element${elements.length > 1 ? 's' : ''} selected`, + chips: elements.map((el) => ({ + label: el.label, + tooltip: el.selector, + icon: , + })), + }); + } + + const contextPaths = message.context_paths; + if (contextPaths && contextPaths.length > 0) { + const files = contextPaths.filter((cp) => cp.type === 'file'); + const dirs = contextPaths.filter((cp) => cp.type === 'directory'); + const allPaths = [...dirs, ...files]; + const label = [ + dirs.length > 0 ? `${dirs.length} folder${dirs.length > 1 ? 's' : ''}` : '', + files.length > 0 ? `${files.length} file${files.length > 1 ? 's' : ''}` : '', + ].filter(Boolean).join(', ') + ' attached'; + groups.push({ + key: 'paths', + icon: , + color: '#10b981', + label, + chips: allPaths.map((cp) => { + const name = cp.path.split('/').filter(Boolean).pop() || cp.path; + return { + label: name, + tooltip: cp.path, + icon: cp.type === 'directory' + ? + : , + }; + }), + }); + } + + const skills = message.attached_skills; + if (skills && skills.length > 0) { + groups.push({ + key: 'skills', + icon: , + color: SKILL_COLOR, + label: `${skills.length} skill${skills.length > 1 ? 's' : ''}`, + chips: skills.map((s) => ({ + label: s.name, + icon: , + })), + }); + } + + const forcedTools = message.forced_tools; + if (forcedTools && forcedTools.length > 0) { + groups.push({ + key: 'tools', + icon: , + color: '#f59e0b', + label: `${forcedTools.length} tool${forcedTools.length > 1 ? 's' : ''} requested`, + chips: forcedTools.map((t) => ({ + label: t, + icon: , + })), + }); + } + + return groups; +} + +const AttachedContextSection: React.FC<{ + elements: ParsedElement[]; + message: AgentMessage; + c: ReturnType; +}> = ({ elements, message, c }) => { + const [expanded, setExpanded] = useState(false); + const groups = useMemo(() => buildContextGroups(elements, message), [elements, message]); + + if (groups.length === 0) return null; + + return ( + + setExpanded(!expanded)} + sx={{ + display: 'inline-flex', + alignItems: 'center', + gap: 0.5, + cursor: 'pointer', + mb: 0.5, + '&:hover': { opacity: 0.8 }, + }} + > + {groups.map((g) => ( + + {g.icon} + + ))} + + {groups.map((g) => g.label).join(' · ')} + + + + + {groups.map((g) => ( + + + {g.label} + + + {g.chips.map((chip, i) => ( + + + + ))} + + + ))} + + + ); +}; + +const ImageLightbox: React.FC<{ + open: boolean; + src: string; + onClose: () => void; + c: ReturnType; +}> = ({ open, src, onClose, c }) => ( + + + + + + e.stopPropagation()} + style={{ + maxWidth: '90vw', + maxHeight: '90vh', + borderRadius: 8, + boxShadow: '0 8px 32px rgba(0,0,0,0.4)', + display: 'block', + }} + /> + + +); + +const MessageImageThumbnails: React.FC<{ + images: Array<{ data: string; media_type: string }>; + c: ReturnType; +}> = ({ images, c }) => { + const [lightboxSrc, setLightboxSrc] = useState(null); + + if (images.length === 0) return null; + + return ( + <> + + {images.map((img, idx) => { + const src = `data:${img.media_type};base64,${img.data}`; + return ( + setLightboxSrc(src)} + sx={{ + width: 64, + height: 64, + flexShrink: 0, + borderRadius: '8px', + overflow: 'hidden', + border: `1px solid ${c.border.subtle}`, + cursor: 'pointer', + transition: 'opacity 0.15s, transform 0.15s', + '&:hover': { opacity: 0.85, transform: 'scale(1.04)' }, + }} + > + + + ); + })} + + setLightboxSrc(null)} + c={c} + /> + + ); +}; + +interface Props { + message: AgentMessage; + onEdit?: (messageId: string, newContent: string) => void; + isStreaming?: boolean; +} + +const MessageBubble: React.FC = React.memo(({ message, onEdit, isStreaming }) => { + const c = useClaudeTokens(); + const [editing, setEditing] = useState(false); + const [editText, setEditText] = useState(''); + const { role, content } = message; + + if (role === 'system') { + return ( + + + {typeof content === 'string' ? content : JSON.stringify(content)} + + + ); + } + + if (role === 'tool_call') { + const toolData = typeof content === 'object' ? content : {}; + const toolInput = toolData.input || {}; + if (toolData.tool === 'RenderOutput') { + return ; + } + return null; + } + + if (role === 'tool_result') { + let parsedContent: any = null; + try { parsedContent = typeof content === 'string' ? JSON.parse(content) : content; } catch {} + if (parsedContent?.output_id && parsedContent?.frontend_code) { + return ( + + ); + } + return null; + } + + const isUser = role === 'user'; + const rawText = typeof content === 'string' ? content : JSON.stringify(content); + const { userMessage: displayText, elements: selectedElements } = isUser + ? parseElementContext(rawText) + : { userMessage: rawText, elements: [] }; + + const handleStartEdit = () => { + setEditText(rawText); + setEditing(true); + }; + + const handleCancelEdit = () => { + setEditing(false); + setEditText(''); + }; + + const handleSaveEdit = () => { + const trimmed = editText.trim(); + if (trimmed && trimmed !== rawText && onEdit) { + onEdit(message.id, trimmed); + } + setEditing(false); + setEditText(''); + }; + + const truncatedContent = typeof content === 'string' + ? content.slice(0, 200) + : JSON.stringify(content).slice(0, 200); + + return ( + + {isUser && onEdit && !editing && ( + + + + )} + + {isUser ? ( + editing ? ( + + setEditText(e.target.value)} + variant="outlined" + size="small" + autoFocus + onKeyDown={(e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + handleSaveEdit(); + } + if (e.key === 'Escape') handleCancelEdit(); + }} + sx={{ + '& .MuiOutlinedInput-root': { + color: c.text.primary, + fontSize: '0.875rem', + '& fieldset': { borderColor: c.border.strong }, + '&:hover fieldset': { borderColor: c.text.tertiary }, + '&.Mui-focused fieldset': { borderColor: c.accent.primary }, + }, + }} + /> + + + + + + ) : ( + + {message.images && message.images.length > 0 && ( + + )} + + {renderUserTextWithPills(displayText, c)} + + + + ) + ) : ( + + {rawText} + {isStreaming && } + + )} + + + ); +}); + +export default MessageBubble; diff --git a/frontend/src/app/pages/AgentChat/TemplateInvokeModal.tsx b/frontend/src/app/pages/AgentChat/TemplateInvokeModal.tsx new file mode 100644 index 00000000..704109fa --- /dev/null +++ b/frontend/src/app/pages/AgentChat/TemplateInvokeModal.tsx @@ -0,0 +1,183 @@ +import React, { useState } from 'react'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import DialogActions from '@mui/material/DialogActions'; +import Button from '@mui/material/Button'; +import TextField from '@mui/material/TextField'; +import MenuItem from '@mui/material/MenuItem'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import Select from '@mui/material/Select'; +import Checkbox from '@mui/material/Checkbox'; +import ListItemText from '@mui/material/ListItemText'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import Typography from '@mui/material/Typography'; +import Box from '@mui/material/Box'; +import { PromptTemplate, TemplateField } from '@/shared/state/templatesSlice'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +interface Props { + template: PromptTemplate; + open: boolean; + onClose: () => void; + onApply: (rendered: string) => void; +} + +const TemplateInvokeModal: React.FC = ({ template, open, onClose, onApply }) => { + const c = useClaudeTokens(); + const inputSx = { + '& .MuiOutlinedInput-root': { + color: c.text.primary, + '& fieldset': { borderColor: c.border.strong }, + '&:hover fieldset': { borderColor: c.text.tertiary }, + '&.Mui-focused fieldset': { borderColor: c.accent.primary }, + }, + '& .MuiInputLabel-root': { color: c.text.tertiary }, + '& .MuiInputLabel-root.Mui-focused': { color: c.accent.primary }, + }; + const [values, setValues] = useState>(() => { + const init: Record = {}; + for (const f of template.fields) { + init[f.name] = f.default ?? (f.type === 'multi-select' ? [] : ''); + } + return init; + }); + + const handleApply = () => { + let rendered = template.template; + for (const f of template.fields) { + const val = values[f.name]; + const str = Array.isArray(val) ? val.join(', ') : String(val ?? ''); + rendered = rendered.replace(new RegExp(`\\{\\{${f.name}\\}\\}`, 'g'), str); + } + onApply(rendered); + onClose(); + }; + + const renderField = (field: TemplateField) => { + const val = values[field.name]; + const update = (v: any) => setValues((prev) => ({ ...prev, [field.name]: v })); + + switch (field.type) { + case 'literal': + return ( + + {field.name} + + {field.default || ''} + + + ); + case 'select': + return ( + update(e.target.value)} + fullWidth + size="small" + sx={{ ...inputSx, mb: 2 }} + SelectProps={{ MenuProps: { PaperProps: { sx: { bgcolor: c.bg.surface, color: c.text.primary } } } }} + > + {(field.options || []).map((opt) => ( + {opt} + ))} + + ); + case 'multi-select': + return ( + + {field.name} + + + ); + case 'int': + case 'float': + return ( + update(field.type === 'int' ? parseInt(e.target.value) || '' : parseFloat(e.target.value) || '')} + fullWidth + size="small" + sx={{ ...inputSx, mb: 2 }} + /> + ); + default: + return ( + update(e.target.value)} + fullWidth + size="small" + multiline={field.name.toLowerCase().includes('description') || field.name.toLowerCase().includes('prompt')} + rows={field.name.toLowerCase().includes('description') || field.name.toLowerCase().includes('prompt') ? 3 : 1} + sx={{ ...inputSx, mb: 2 }} + /> + ); + } + }; + + return ( + + {template.name} + + {template.description && ( + {template.description} + )} + {template.fields.length === 0 ? ( + + This template has no input fields. It will be inserted as-is. + + ) : ( + template.fields.map(renderField) + )} + + + + + + + ); +}; + +export default TemplateInvokeModal; diff --git a/frontend/src/app/pages/AgentChat/ToolCallBubble.tsx b/frontend/src/app/pages/AgentChat/ToolCallBubble.tsx new file mode 100644 index 00000000..f058b69e --- /dev/null +++ b/frontend/src/app/pages/AgentChat/ToolCallBubble.tsx @@ -0,0 +1,1591 @@ +import React, { useState, useEffect, useCallback, useMemo } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Collapse from '@mui/material/Collapse'; +import IconButton from '@mui/material/IconButton'; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import ExpandLessIcon from '@mui/icons-material/ExpandLess'; +import TerminalIcon from '@mui/icons-material/Terminal'; +import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; +import ErrorOutlineIcon from '@mui/icons-material/ErrorOutline'; +import BlockIcon from '@mui/icons-material/Block'; +import EmailIcon from '@mui/icons-material/Email'; +import EventIcon from '@mui/icons-material/Event'; +import FolderIcon from '@mui/icons-material/Folder'; +import AttachFileIcon from '@mui/icons-material/AttachFile'; +import SearchIcon from '@mui/icons-material/Search'; +import SendIcon from '@mui/icons-material/Send'; +import ReactMarkdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; +import { AgentMessage } from '@/shared/state/agentsSlice'; +import { useClaudeTokens, useThemeMode } from '@/shared/styles/ThemeContext'; + +const GoogleServiceIcon: React.FC<{ service: string; size?: number }> = ({ service, size = 14 }) => { + if (service === 'gmail') { + return ( + + {/* Left blue bar */} + + {/* Right green bar */} + + {/* Red M chevron */} + + {/* Top-left blue triangle */} + + {/* Top-right yellow triangle */} + + {/* Top red V */} + + + ); + } + if (service === 'calendar') { + return ( + + + + 31 + + ); + } + if (service === 'drive' || service === 'sheets') { + return ( + + + + + + + ); + } + return null; +}; + +export interface ToolPair { + type: 'tool_pair'; + id: string; + call: AgentMessage; + result: AgentMessage | null; +} + +const pulsingKeyframes = ` +@keyframes tool-pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.4; } +} +@keyframes border-glow { + 0%, 100% { box-shadow: 0 0 0 0 rgba(var(--glow-rgb), 0); } + 50% { box-shadow: 0 0 10px 2px rgba(var(--glow-rgb), 0.12); } +} +`; + +const streamingCursorKeyframes = ` +@keyframes blink-cursor { + 0%, 100% { opacity: 1; } + 50% { opacity: 0; } +} +`; + +const ElapsedTimer: React.FC<{ startTime: string }> = ({ startTime }) => { + const c = useClaudeTokens(); + const [elapsed, setElapsed] = useState(0); + + useEffect(() => { + const start = new Date(startTime).getTime(); + const tick = () => setElapsed(Math.floor((Date.now() - start) / 1000)); + tick(); + const interval = setInterval(tick, 1000); + return () => clearInterval(interval); + }, [startTime]); + + const mins = Math.floor(elapsed / 60); + const secs = elapsed % 60; + const display = mins > 0 ? `${mins}m ${secs}s` : `${secs}s`; + + return ( + + + + {display} + + + ); +}; + +function formatElapsed(ms: number): string { + if (ms >= 60000) return `${Math.floor(ms / 60000)}m ${Math.round((ms % 60000) / 1000)}s`; + if (ms >= 1000) return `${(ms / 1000).toFixed(1)}s`; + return `${ms}ms`; +} + +function getToolData(call: AgentMessage) { + const content = typeof call.content === 'object' ? call.content : {}; + return { + toolName: content.tool || 'Unknown', + input: content.input || {}, + isDenied: content.approved === false, + toolId: content.id, + }; +} + +function isBashTool(name: string) { + return name === 'Bash' || name === 'bash'; +} + +export interface McpToolInfo { + isMcp: boolean; + serverSlug: string; + action: string; + service: string; + displayName: string; +} + +export function parseMcpToolName(rawName: string): McpToolInfo { + const m = rawName.match(/^mcp__([^_]+(?:-[^_]+)*)__(.+)$/); + if (!m) return { isMcp: false, serverSlug: '', action: '', service: '', displayName: rawName }; + const serverSlug = m[1]; + const action = m[2]; + const display = action.replace(/_/g, ' ').replace(/\b\w/g, (ch) => ch.toUpperCase()); + + const lower = action.toLowerCase(); + let service = ''; + if (lower.includes('gmail') || lower.includes('email') || lower.includes('mail')) service = 'gmail'; + else if (lower.includes('calendar') || lower.includes('event') || lower.includes('freebusy')) service = 'calendar'; + else if (lower.includes('drive') || lower.includes('file')) service = 'drive'; + else if (lower.includes('sheet') || lower.includes('spreadsheet')) service = 'sheets'; + else if (lower.includes('doc') || lower.includes('paragraph')) service = 'docs'; + else if (lower.includes('contact')) service = 'contacts'; + + return { isMcp: true, serverSlug, action, service, displayName: display }; +} + +function getMcpInputSummary(input: any): string { + if (!input || typeof input !== 'object') return ''; + const keys = Object.keys(input); + if (keys.length === 0) return ''; + if (keys.length === 1) { + const v = input[keys[0]]; + const s = typeof v === 'string' ? v : JSON.stringify(v); + return s.length > 60 ? s.slice(0, 60) + '…' : s; + } + return keys.slice(0, 3).map((k) => { + const v = input[k]; + const s = typeof v === 'string' ? v : JSON.stringify(v); + return `${k}: ${s.length > 30 ? s.slice(0, 30) + '…' : s}`; + }).join(' '); +} + +function getInputSummary(toolName: string, input: any): string { + try { + const mcp = parseMcpToolName(toolName); + if (mcp.isMcp) return getMcpInputSummary(input); + + const n = toolName.toLowerCase(); + if (isBashTool(toolName)) { + const cmd = input.command || ''; + return `$ ${cmd.slice(0, 80)}${cmd.length > 80 ? '…' : ''}`; + } + if (n === 'read') return input.file_path || input.path || ''; + if (n === 'write') return input.file_path || input.path || ''; + if (n === 'edit' || n === 'multiedit' || n === 'strreplace') + return input.file_path || input.path || ''; + if (n === 'glob') return input.pattern || input.glob || input.glob_pattern || ''; + if (n === 'grep' || n === 'ripgrep') { + const pat = input.pattern || input.regex || ''; + const path = input.path || input.directory || ''; + return path ? `/${pat}/ in ${path}` : `/${pat}/`; + } + if (n === 'websearch') return input.query || input.search_term || ''; + if (n === 'webfetch') return input.url || ''; + if (n === 'todoread' || n === 'todowrite') return 'todos'; + if (n === 'ls') return input.path || '.'; + return ''; + } catch { + return ''; + } +} + +function formatMcpInputDisplay(input: any): string { + if (!input || typeof input !== 'object') return String(input ?? ''); + return Object.entries(input) + .map(([k, v]) => { + const s = typeof v === 'string' ? v : JSON.stringify(v, null, 2); + return `${k}: ${s}`; + }) + .join('\n'); +} + +function formatInputDisplay(toolName: string, input: any): string { + try { + const mcp = parseMcpToolName(toolName); + if (mcp.isMcp) return formatMcpInputDisplay(input); + + const n = toolName.toLowerCase(); + if (isBashTool(toolName)) return input.command || ''; + if (n === 'read') { + const p = input.file_path || input.path || ''; + const parts = [p]; + if (input.offset) parts.push(`offset: ${input.offset}`); + if (input.limit) parts.push(`limit: ${input.limit}`); + return parts.join(' '); + } + if (n === 'write') { + const p = input.file_path || input.path || ''; + const content = input.content || ''; + const preview = content.length > 300 ? content.slice(0, 300) + '\n…' : content; + return `${p}\n\n${preview}`; + } + if (n === 'edit' || n === 'strreplace') { + const p = input.file_path || input.path || ''; + const old = input.old_string || input.old_text || ''; + const nw = input.new_string || input.new_text || ''; + const lines = [p, '']; + if (old) { + const oldPreview = old.length > 200 ? old.slice(0, 200) + '…' : old; + lines.push(`- ${oldPreview.split('\n').join('\n- ')}`); + } + if (nw) { + const nwPreview = nw.length > 200 ? nw.slice(0, 200) + '…' : nw; + lines.push(`+ ${nwPreview.split('\n').join('\n+ ')}`); + } + return lines.join('\n'); + } + if (n === 'multiedit') { + const p = input.file_path || input.path || ''; + const edits = input.edits || []; + const lines = [p]; + for (const e of edits.slice(0, 3)) { + const old = e.old_string || e.old_text || ''; + lines.push(` - ${old.split('\n')[0].slice(0, 60)}…`); + } + if (edits.length > 3) lines.push(` … +${edits.length - 3} more edits`); + return lines.join('\n'); + } + if (n === 'glob') return input.pattern || input.glob || input.glob_pattern || ''; + if (n === 'grep' || n === 'ripgrep') { + const pat = input.pattern || input.regex || ''; + const path = input.path || input.directory || ''; + const parts = [`pattern: ${pat}`]; + if (path) parts.push(`path: ${path}`); + if (input.include) parts.push(`include: ${input.include}`); + return parts.join('\n'); + } + if (n === 'websearch') return input.query || input.search_term || ''; + if (n === 'webfetch') return input.url || ''; + } catch {} + if (typeof input === 'string') return input; + return JSON.stringify(input, null, 2); +} + +interface ParsedBashResult { + type: 'bash'; + stdout: string; + stderr: string; + exitCode: number | null; +} + +interface ParsedTextResult { + type: 'text'; + content: string; + isError?: boolean; +} + +interface ParsedMcpResult { + type: 'mcp'; + service: string; + action: string; + data: Record; + rawText: string; +} + +type ParsedResult = ParsedBashResult | ParsedTextResult | ParsedMcpResult; + +function parseToolResult(toolName: string, rawText: string): ParsedResult { + if (isBashTool(toolName)) { + try { + const parsed = JSON.parse(rawText); + if (typeof parsed === 'object' && parsed !== null && 'stdout' in parsed) { + const exitMatch = (parsed.stdout || '').match(/[Ee]xit code:\s*(\d+)/); + return { + type: 'bash', + stdout: parsed.stdout || '', + stderr: parsed.stderr || '', + exitCode: exitMatch ? parseInt(exitMatch[1], 10) : null, + }; + } + } catch {} + } + + const mcp = parseMcpToolName(toolName); + if (mcp.isMcp) { + try { + let parsed = JSON.parse(rawText); + + if (Array.isArray(parsed) && parsed.some((b: any) => b?.type === 'text' && typeof b?.text === 'string')) { + const textContent = parsed + .filter((b: any) => b?.type === 'text') + .map((b: any) => b.text) + .join('\n'); + try { + parsed = JSON.parse(textContent); + } catch { + return { type: 'mcp', service: mcp.service, action: mcp.action, data: {}, rawText: textContent }; + } + } + + if (typeof parsed === 'object' && parsed !== null) { + return { type: 'mcp', service: mcp.service, action: mcp.action, data: parsed, rawText }; + } + } catch {} + return { type: 'mcp', service: mcp.service, action: mcp.action, data: {}, rawText }; + } + + try { + const parsed = JSON.parse(rawText); + if (typeof parsed === 'object' && parsed !== null) { + if ('stdout' in parsed) { + return { type: 'text', content: parsed.stdout || '' }; + } + if ('content' in parsed && typeof parsed.content === 'string') { + return { type: 'text', content: parsed.content, isError: !!parsed.is_error }; + } + if ('result' in parsed && typeof parsed.result === 'string') { + return { type: 'text', content: parsed.result }; + } + if ('output' in parsed && typeof parsed.output === 'string') { + return { type: 'text', content: parsed.output }; + } + const n = toolName.toLowerCase(); + if (n === 'glob' && Array.isArray(parsed)) { + return { type: 'text', content: parsed.join('\n') }; + } + } + } catch {} + + return { type: 'text', content: rawText }; +} + +export function getMcpShortAction(mcpInfo: McpToolInfo): string { + const { action, service } = mcpInfo; + let short = action; + if (service && action.toLowerCase().startsWith(service.toLowerCase() + '_')) { + short = action.slice(service.length + 1); + } + return short.replace(/_/g, ' ').replace(/\b\w/g, (ch) => ch.toUpperCase()); +} + +export function getResultSummary(toolName: string, rawText: string): string { + const parsed = parseToolResult(toolName, rawText); + + if (parsed.type === 'bash') { + const lines = parsed.stdout.split('\n').filter((l) => l.trim()).length; + if (parsed.exitCode !== null && parsed.exitCode !== 0) return `✗ exit ${parsed.exitCode}`; + if (parsed.stderr && !parsed.stdout) return '✗ stderr'; + return `✓ ${lines} line${lines !== 1 ? 's' : ''}`; + } + + if (parsed.type === 'mcp') { + const d = parsed.data; + if (parsed.service === 'gmail') { + const subj = d.subject || getGmailHeader(d, 'Subject'); + if (subj) return subj; + if (Array.isArray(d.messages)) return `${d.messages.length} email${d.messages.length !== 1 ? 's' : ''}`; + if (d.id || d.messageId) return '✓ done'; + } + if (parsed.service === 'calendar') { + if (d.summary) return d.summary.slice(0, 40); + if (Array.isArray(d.items)) return `${d.items.length} event${d.items.length !== 1 ? 's' : ''}`; + } + if (parsed.service === 'drive') { + if (d.name) return d.name; + if (Array.isArray(d.files)) return `${d.files.length} file${d.files.length !== 1 ? 's' : ''}`; + } + if (d.error || d.is_error) return '✗ error'; + return '✓ done'; + } + + const text = parsed.content; + const lines = text.split('\n'); + const lineCount = lines.length; + const n = toolName.toLowerCase(); + + try { + if (n === 'glob') { + const fileCount = lines.filter((l) => l.trim()).length; + return `${fileCount} file${fileCount !== 1 ? 's' : ''}`; + } + if (n === 'grep' || n === 'ripgrep') { + const matchCount = lines.filter((l) => l.trim()).length; + return `${matchCount} match${matchCount !== 1 ? 'es' : ''}`; + } + if (n === 'read') return `${lineCount} lines`; + if (n === 'write') { + if (text.toLowerCase().includes('success') || text.toLowerCase().includes('written')) + return '✓ written'; + return '✓ done'; + } + if (n === 'edit' || n === 'multiedit' || n === 'strreplace') { + if (text.toLowerCase().includes('success') || text.toLowerCase().includes('applied')) + return '✓ applied'; + return '✓ done'; + } + if (n === 'websearch') return 'results'; + if (n === 'webfetch') return `${lineCount} lines`; + if (parsed.isError) return '✗ error'; + } catch {} + + return `${lineCount} line${lineCount !== 1 ? 's' : ''}`; +} + +function getPromptPrefix(toolName: string): string { + if (isBashTool(toolName)) return '$ '; + const mcp = parseMcpToolName(toolName); + if (mcp.isMcp) return `❯ ${mcp.displayName} `; + return `❯ ${toolName} `; +} + +interface ToolCallBubbleProps { + call: AgentMessage; + result?: AgentMessage | null; + isPending?: boolean; + isStreaming?: boolean; + mcpCompact?: boolean; +} + +interface TermColors { + TERM_BG: string; + TERM_BORDER: string; + PROMPT_COLOR: string; + CMD_COLOR: string; + OUTPUT_COLOR: string; + PATH_COLOR: string; + ADD_COLOR: string; + DEL_COLOR: string; + STDERR_COLOR: string; + WARN_COLOR: string; + NUM_COLOR: string; + DIM_COLOR: string; + DIFF_HEADER_COLOR: string; + SCROLLBAR_THUMB: string; +} + +const darkTermColors: TermColors = { + TERM_BG: '#131520', + TERM_BORDER: '#1e2030', + PROMPT_COLOR: '#7ec699', + CMD_COLOR: '#e8ecf4', + OUTPUT_COLOR: '#a0aab8', + PATH_COLOR: '#82aaff', + ADD_COLOR: '#7ec699', + DEL_COLOR: '#ff8787', + STDERR_COLOR: '#ff8787', + WARN_COLOR: '#ffcb6b', + NUM_COLOR: '#f78c6c', + DIM_COLOR: '#555b6e', + DIFF_HEADER_COLOR: '#c792ea', + SCROLLBAR_THUMB: '#2a2d3e', +}; + +const lightTermColors: TermColors = { + TERM_BG: '#f4f3ee', + TERM_BORDER: '#e2e0d8', + PROMPT_COLOR: '#2d7a3e', + CMD_COLOR: '#2a2a28', + OUTPUT_COLOR: '#555550', + PATH_COLOR: '#3060a8', + ADD_COLOR: '#2d7a3e', + DEL_COLOR: '#c03030', + STDERR_COLOR: '#c03030', + WARN_COLOR: '#8a6518', + NUM_COLOR: '#c05020', + DIM_COLOR: '#9e9c95', + DIFF_HEADER_COLOR: '#7c4daa', + SCROLLBAR_THUMB: '#ccc9c0', +}; + +function useTermColors(): TermColors { + const { mode } = useThemeMode(); + return mode === 'dark' ? darkTermColors : lightTermColors; +} + +function colorizeInput(toolName: string, text: string, tc: TermColors): React.ReactNode { + const n = toolName.toLowerCase(); + const mcp = parseMcpToolName(toolName); + + if (mcp.isMcp) { + const lines = text.split('\n'); + return ( + <> + {lines.map((line, i) => { + const nl = i < lines.length - 1 ? '\n' : ''; + const colonIdx = line.indexOf(':'); + if (colonIdx > 0 && colonIdx < 30) { + return ( + + {line.slice(0, colonIdx + 1)} + {line.slice(colonIdx + 1)} + {nl} + + ); + } + return {line}{nl}; + })} + + ); + } + + if (isBashTool(toolName)) return {text}; + + if (n === 'edit' || n === 'strreplace' || n === 'multiedit') { + const lines = text.split('\n'); + return ( + <> + {lines.map((line, i) => { + const nl = i < lines.length - 1 ? '\n' : ''; + if (i === 0 && (line.startsWith('/') || line.includes('.'))) + return {line}{nl}; + if (line.startsWith('+ ')) + return {line}{nl}; + if (line.startsWith('- ')) + return {line}{nl}; + return {line}{nl}; + })} + + ); + } + + if (n === 'write') { + const lines = text.split('\n'); + return ( + <> + {lines.map((line, i) => { + const nl = i < lines.length - 1 ? '\n' : ''; + if (i === 0 && (line.startsWith('/') || line.includes('.'))) + return {line}{nl}; + return {line}{nl}; + })} + + ); + } + + if (n === 'read' || n === 'glob' || n === 'webfetch') { + if (/^\//.test(text) || text.includes('/')) + return {text}; + } + + if (n === 'grep' || n === 'ripgrep') { + const lines = text.split('\n'); + return ( + <> + {lines.map((line, i) => { + const nl = i < lines.length - 1 ? '\n' : ''; + if (line.startsWith('pattern:')) + return ( + + pattern: + {line.slice(9)} + {nl} + + ); + if (line.startsWith('path:')) + return ( + + path: + {line.slice(6)} + {nl} + + ); + return {line}{nl}; + })} + + ); + } + + return {text}; +} + +function colorizeOutput(toolName: string, text: string, tc: TermColors): React.ReactNode { + if (!text) return (empty); + + const lines = text.split('\n'); + const n = toolName.toLowerCase(); + + return ( + <> + {lines.map((line, i) => { + const nl = i < lines.length - 1 ? '\n' : ''; + const trimmed = line.trimStart(); + + if (/^\/\S+/.test(trimmed)) + return {line}{nl}; + + if (n === 'grep' || n === 'ripgrep') { + const grepMatch = line.match(/^(\S+?:\d+[:-])/); + if (grepMatch) { + return ( + + {grepMatch[1]} + {line.slice(grepMatch[1].length)} + {nl} + + ); + } + const fileHeader = line.match(/^(\S+\.\w+)$/); + if (fileHeader) + return {line}{nl}; + } + + if (line.startsWith('@@') && line.includes('@@')) + return {line}{nl}; + if (line.startsWith('+')) + return {line}{nl}; + if (line.startsWith('-')) + return {line}{nl}; + + if (/\b[Ee]rror\b/.test(line)) + return {line}{nl}; + if (/\b[Ww]arning\b/.test(line)) + return {line}{nl}; + + if (n === 'read') { + const lineNumMatch = line.match(/^(\s*\d+\s*[|:])/); + if (lineNumMatch) { + return ( + + {lineNumMatch[1]} + {line.slice(lineNumMatch[1].length)} + {nl} + + ); + } + } + + return {line}{nl}; + })} + + ); +} + + +function formatTimestamp(ts: string | number | undefined): string { + if (!ts) return ''; + try { + const d = typeof ts === 'number' ? new Date(ts) : new Date(ts); + if (isNaN(d.getTime())) return String(ts); + return d.toLocaleDateString('en-US', { + weekday: 'short', month: 'short', day: 'numeric', year: 'numeric', + hour: 'numeric', minute: '2-digit', + }); + } catch { return String(ts); } +} + +function stripHtml(html: string): string { + const tmp = document.createElement('div'); + tmp.innerHTML = html; + return tmp.textContent || tmp.innerText || ''; +} + +interface CardColors { + TC_BG: string; + TC_BORDER: string; + TC_HOVER: string; + TC_HEADING: string; + TC_BODY: string; + TC_MUTED: string; + TC_DIM: string; + TC_ACCENT: string; + TC_SUCCESS: string; + TC_WARNING: string; +} + +const darkCardColors: CardColors = { + TC_BG: 'rgba(255,255,255,0.03)', + TC_BORDER: 'rgba(255,255,255,0.06)', + TC_HOVER: 'rgba(255,255,255,0.05)', + TC_HEADING: '#C2C0B6', + TC_BODY: '#9C9A92', + TC_MUTED: '#85837C', + TC_DIM: 'rgba(156,154,146,0.5)', + TC_ACCENT: '#c4633a', + TC_SUCCESS: '#7AB948', + TC_WARNING: '#D1A041', +}; + +const lightCardColors: CardColors = { + TC_BG: 'rgba(0,0,0,0.03)', + TC_BORDER: 'rgba(0,0,0,0.08)', + TC_HOVER: 'rgba(0,0,0,0.05)', + TC_HEADING: '#3D3D3A', + TC_BODY: '#555550', + TC_MUTED: '#73726C', + TC_DIM: 'rgba(115,114,108,0.5)', + TC_ACCENT: '#ae5630', + TC_SUCCESS: '#265B19', + TC_WARNING: '#805C1F', +}; + +function useCardColors(): CardColors { + const { mode } = useThemeMode(); + return mode === 'dark' ? darkCardColors : lightCardColors; +} + +function getGmailHeader(msg: any, name: string): string { + if (msg.payload?.headers && Array.isArray(msg.payload.headers)) { + const h = msg.payload.headers.find( + (hdr: any) => (hdr.name || '').toLowerCase() === name.toLowerCase() + ); + if (h) return h.value || ''; + } + if (msg.headers && typeof msg.headers === 'object' && !Array.isArray(msg.headers)) { + return msg.headers[name] || msg.headers[name.toLowerCase()] || ''; + } + return ''; +} + +function extractEmailFields(msg: any) { + const subject = msg.subject || getGmailHeader(msg, 'Subject') || '(no subject)'; + const from = msg.from || msg.sender || getGmailHeader(msg, 'From') || ''; + const to = msg.to || msg.recipient || getGmailHeader(msg, 'To') || ''; + const rawDate = msg.date || msg.internalDate || msg.receivedAt || getGmailHeader(msg, 'Date') || ''; + const date = formatTimestamp(rawDate); + const snippet = msg.snippet || ''; + const body = msg.body || msg.text || msg.textBody || ''; + const htmlBody = msg.htmlBody || msg.html || ''; + const bodyPreview = body || (htmlBody ? stripHtml(htmlBody) : ''); + return { subject, from, to, date, snippet, bodyPreview }; +} + +const GmailCard: React.FC<{ data: Record; action: string; hideSubjectHeader?: boolean }> = ({ data, action, hideSubjectHeader }) => { + const c = useClaudeTokens(); + const { TC_BG, TC_BORDER, TC_HOVER, TC_HEADING, TC_BODY, TC_MUTED, TC_DIM, TC_ACCENT, TC_SUCCESS, TC_WARNING } = useCardColors(); + const email = extractEmailFields(data); + const labels = data.labelIds || data.labels || []; + const attachments = data.attachments || []; + + const isSend = action.includes('send'); + const isSearch = action.includes('search') || action.includes('list'); + const messages: any[] = data.messages || (isSearch && data.results ? data.results : []); + + if (messages.length > 0) { + return ( + + {messages.slice(0, 5).map((msg: any, i: number) => { + const m = extractEmailFields(msg); + return ( + + + + {m.subject} + + {m.date && ( + + {m.date} + + )} + + {m.from && ( + + {m.from} + + )} + {(m.snippet || m.bodyPreview) && ( + + {(m.snippet || m.bodyPreview).slice(0, 120)} + {(m.snippet || m.bodyPreview).length > 120 ? '…' : ''} + + )} + + ); + })} + {messages.length > 5 && ( + + +{messages.length - 5} more + + )} + + ); + } + + return ( + + {!hideSubjectHeader && ( + + {isSend ? ( + + ) : ( + + )} + + {email.subject} + + + )} + + + {(email.from || email.to || email.date) && ( + + {email.from && ( + + From + {email.from} + + )} + {email.to && ( + + To + {email.to} + + )} + {email.date && ( + + Date + {email.date} + + )} + + )} + + {labels.length > 0 && ( + + {labels.map((l: string, i: number) => ( + + {l} + + ))} + + )} + + {(email.snippet || email.bodyPreview) && ( + +
    {children} }} + > + {email.bodyPreview || email.snippet} + + + )} + + {attachments.length > 0 && ( + + {attachments.map((a: any, i: number) => ( + + + + {a.filename || a.name || 'attachment'} + + + ))} + + )} + + + ); +}; + +const CalendarCard: React.FC<{ data: Record; hideHeader?: boolean }> = ({ data, hideHeader }) => { + const c = useClaudeTokens(); + const { TC_BG, TC_BORDER, TC_HOVER, TC_HEADING, TC_BODY, TC_DIM, TC_SUCCESS } = useCardColors(); + const items: any[] = data.items || (Array.isArray(data) ? data : []); + const single = !items.length ? data : null; + + if (single && (single.summary || single.start)) { + const start = single.start?.dateTime || single.start?.date || single.start || ''; + const end = single.end?.dateTime || single.end?.date || single.end || ''; + return ( + + {!hideHeader && ( + + + + {single.summary || '(no title)'} + + + )} + + {start && ( + + Start + {formatTimestamp(start)} + + )} + {end && ( + + End + {formatTimestamp(end)} + + )} + {single.location && ( + + Where + {single.location} + + )} + {single.description && ( + +
    +                {single.description.slice(0, 300)}
    +                {single.description.length > 300 ? '…' : ''}
    +              
    +
    + )} +
    +
    + ); + } + + if (items.length > 0) { + return ( + + {items.slice(0, 6).map((item: any, i: number) => ( + + + {item.summary || '(no title)'} + + + {formatTimestamp(item.start?.dateTime || item.start?.date || item.start)} + + + ))} + {items.length > 6 && ( + + +{items.length - 6} more + + )} + + ); + } + + return null; +}; + +const DriveCard: React.FC<{ data: Record }> = ({ data }) => { + const c = useClaudeTokens(); + const { TC_BG, TC_BORDER, TC_HOVER, TC_HEADING, TC_DIM, TC_WARNING } = useCardColors(); + const files: any[] = data.files || (Array.isArray(data) ? data : []); + const single = !files.length && data.name ? data : null; + + if (single) { + return ( + + + + + {single.name} + + {single.mimeType && ( + {single.mimeType} + )} + + + ); + } + + if (files.length > 0) { + return ( + + {files.slice(0, 8).map((f: any, i: number) => ( + + + {f.name || f.id} + {f.mimeType && ( + + {f.mimeType.split('/').pop()} + + )} + + ))} + + ); + } + + return null; +}; + +const GenericMcpCard: React.FC<{ data: Record }> = ({ data }) => { + const c = useClaudeTokens(); + const { TC_DIM, TC_BODY } = useCardColors(); + const entries = Object.entries(data).filter(([, v]) => v != null); + + if (entries.length === 0) + return (empty response); + + return ( + + {entries.slice(0, 20).map(([key, val], i) => { + const isLong = typeof val === 'string' && val.length > 100; + const isObj = typeof val === 'object'; + return ( + + + {key} + + {isObj ? ( +
    +                {JSON.stringify(val, null, 2).slice(0, 500)}
    +              
    + ) : isLong ? ( +
    +                {String(val).slice(0, 500)}{String(val).length > 500 ? '…' : ''}
    +              
    + ) : ( + {String(val)} + )} +
    + ); + })} + {entries.length > 20 && ( + + +{entries.length - 20} more fields + + )} +
    + ); +}; + +const McpResultCard: React.FC<{ parsed: ParsedMcpResult; compact?: boolean }> = ({ parsed, compact }) => { + const tc = useTermColors(); + const { service, action, data } = parsed; + + if (data.error || data.is_error) { + return ( + + + {data.error || data.message || JSON.stringify(data, null, 2)} + + + ); + } + + if (service === 'gmail') return ; + if (service === 'calendar') return ; + if (service === 'drive' || service === 'sheets') return ; + + return ; +}; + +const ToolCallBubble: React.FC = React.memo( + ({ call, result = null, isPending = false, isStreaming = false, mcpCompact = false }) => { + const c = useClaudeTokens(); + const tc = useTermColors(); + const [expanded, setExpanded] = useState(false); + + const { toolName, input, isDenied } = getToolData(call); + const mcpInfo = useMemo(() => parseMcpToolName(toolName), [toolName]); + const inputSummary = getInputSummary(toolName, input); + const formattedInput = useMemo(() => formatInputDisplay(toolName, input), [toolName, input]); + const showTimer = isPending && !isDenied && !isStreaming; + const showBody = expanded || isStreaming; + + const resultContent = result?.content; + const hasStructuredResult = + resultContent && typeof resultContent === 'object' && 'text' in resultContent; + const resultRawText: string = hasStructuredResult + ? resultContent.text + : typeof resultContent === 'string' + ? resultContent + : resultContent + ? JSON.stringify(resultContent, null, 2) + : ''; + const resultElapsedMs: number | null = hasStructuredResult + ? resultContent.elapsed_ms ?? null + : null; + + const parsedResult = useMemo( + () => (result ? parseToolResult(toolName, resultRawText) : null), + [result, toolName, resultRawText], + ); + const resultSummary = result ? getResultSummary(toolName, resultRawText) : null; + const isError = + resultSummary?.startsWith('✗') || + (parsedResult?.type === 'bash' && parsedResult.exitCode !== null && parsedResult.exitCode !== 0) || + (parsedResult?.type === 'text' && parsedResult.isError); + + const toggle = useCallback(() => { + if (!isStreaming) setExpanded((v) => !v); + }, [isStreaming]); + + const accentRgb = c.accent.primary + .replace('#', '') + .match(/.{2}/g) + ?.map((h) => parseInt(h, 16)) + .join(', ') || '189, 100, 57'; + + const promptPrefix = getPromptPrefix(toolName); + const shortAction = mcpInfo.isMcp ? getMcpShortAction(mcpInfo) : toolName; + + const serviceLabel = mcpInfo.isMcp && mcpInfo.service + ? mcpInfo.service.charAt(0).toUpperCase() + mcpInfo.service.slice(1) + : shortAction; + + const ServiceIcon = mcpInfo.isMcp && mcpInfo.service + ? + : null; + + const selectAttrs = { + 'data-select-type': 'tool-call' as const, + 'data-select-id': call.id, + 'data-select-meta': JSON.stringify({ tool: toolName, inputSummary }), + }; + + if (mcpCompact && mcpInfo.isMcp) { + return ( + + + + {ServiceIcon} + + {serviceLabel} + + {resultSummary && !isError && ( + + {resultSummary} + + )} + {!resultSummary && !showTimer && } + {showTimer && ( + <> + + + + )} + {isDenied && ( + + + denied + + )} + {result && !isDenied && ( + + {isError ? ( + + ) : ( + + )} + {resultElapsedMs != null && ( + + {formatElapsed(resultElapsedMs)} + + )} + + )} + + {showBody ? : } + + + + + + {parsedResult && parsedResult.type === 'mcp' ? ( + + ) : parsedResult ? ( +
    +                  {parsedResult.type === 'text' ? parsedResult.content : ''}
    +                
    + ) : null} + {!parsedResult && isPending && !isStreaming && ( + + + + )} + +
    +
    + ); + } + + return ( + + + {isStreaming && } + + {/* Header */} + + {mcpInfo.isMcp && mcpInfo.service + ? + : (() => { + const n = toolName.toLowerCase(); + if (n.includes('search') || n === 'grep' || n === 'glob') + return ; + return ; + })() + } + + {mcpInfo.isMcp ? mcpInfo.displayName : toolName} + + {mcpInfo.isMcp && ( + + {mcpInfo.serverSlug} + + )} + {inputSummary && !isStreaming && ( + + {inputSummary} + + )} + {!inputSummary && } + {isStreaming && } + + {isDenied && ( + + + + denied + + + )} + {result && !isDenied && ( + + {isError ? ( + + ) : ( + + )} + + {resultSummary} + + {resultElapsedMs != null && ( + + {formatElapsed(resultElapsedMs)} + + )} + + )} + {showTimer && } + + {!isStreaming && ( + + {showBody ? ( + + ) : ( + + )} + + )} + + + {/* Unified terminal body */} + + + {/* Prompt + command */} +
    +                
    +                  {promptPrefix}
    +                
    +                {isStreaming ? (
    +                  {call.content?.input ?? ''}
    +                ) : (
    +                  colorizeInput(toolName, formattedInput, tc)
    +                )}
    +                {isStreaming && (
    +                  
    +                )}
    +              
    + + {/* Output */} + {parsedResult && parsedResult.type === 'mcp' ? ( + + ) : parsedResult ? ( +
    +                  {parsedResult.type === 'bash' ? (
    +                    <>
    +                      {parsedResult.stdout.trim() &&
    +                        colorizeOutput(toolName, parsedResult.stdout, tc)}
    +                      {parsedResult.stderr.trim() && (
    +                        <>
    +                          {parsedResult.stdout.trim() && '\n'}
    +                          {parsedResult.stderr}
    +                        
    +                      )}
    +                      {!parsedResult.stdout.trim() && !parsedResult.stderr.trim() && (
    +                        (no output)
    +                      )}
    +                    
    +                  ) : (
    +                    <>
    +                      {parsedResult.isError ? (
    +                        {parsedResult.content || '(empty)'}
    +                      ) : (
    +                        colorizeOutput(toolName, parsedResult.content, tc)
    +                      )}
    +                    
    +                  )}
    +                
    + ) : null} + + {/* Pending indicator when waiting for result */} + {!parsedResult && isPending && !isStreaming && ( + + + + )} + +
    +
    +
    + ); + } +); + +export default ToolCallBubble; diff --git a/frontend/src/app/pages/AgentChat/ToolGroupBubble.tsx b/frontend/src/app/pages/AgentChat/ToolGroupBubble.tsx new file mode 100644 index 00000000..1a11dc02 --- /dev/null +++ b/frontend/src/app/pages/AgentChat/ToolGroupBubble.tsx @@ -0,0 +1,198 @@ +import React, { useMemo, useState } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Collapse from '@mui/material/Collapse'; +import IconButton from '@mui/material/IconButton'; +import Chip from '@mui/material/Chip'; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import ExpandLessIcon from '@mui/icons-material/ExpandLess'; +import TerminalIcon from '@mui/icons-material/Terminal'; +import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; +import { AgentMessage, ToolGroupMeta } from '@/shared/state/agentsSlice'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import { sanitizeSvgString } from '@/shared/sanitizeSvg'; +import ToolCallBubble, { ToolPair } from './ToolCallBubble'; + +export interface ToolGroup { + type: 'tool_group'; + id: string; + pairs: ToolPair[]; + label: string; + callCount: number; + mcpServer?: string; +} + +export type RenderItem = AgentMessage | ToolGroup | ToolPair; + +export function isToolGroup(item: RenderItem): item is ToolGroup { + return (item as ToolGroup).type === 'tool_group'; +} + +export function isToolPair(item: RenderItem): item is ToolPair { + return (item as ToolPair).type === 'tool_pair'; +} + +const GeneratedSvgIcon: React.FC<{ svg: string; size?: number; color: string }> = ({ svg, size = 16, color }) => { + const sanitized = useMemo(() => sanitizeSvgString(svg), [svg]); + if (!sanitized) return null; + return ( + + ); +}; + +const SkeletonPulse: React.FC<{ width: number; height: number; borderRadius?: number }> = ({ width, height, borderRadius = 4 }) => ( + +); + +interface Props { + group: ToolGroup; + isSessionRunning?: boolean; + meta?: ToolGroupMeta; +} + +const ToolGroupBubble: React.FC = React.memo(({ group, isSessionRunning = false, meta }) => { + const c = useClaudeTokens(); + const isMcp = !!group.mcpServer; + const [expanded, setExpanded] = useState(isMcp); + + const completedCount = group.pairs.filter((p) => p.result !== null).length; + const pendingCount = group.pairs.filter((p) => p.result === null).length; + const deniedCount = group.pairs.filter( + (p) => typeof p.call.content === 'object' && p.call.content.approved === false + ).length; + const allDone = pendingCount === 0 || !isSessionRunning; + + const displayName = meta?.name || group.label; + const hasSvg = !!meta?.svg; + + const toolNames = group.pairs.map((p) => { + const c2 = typeof p.call.content === 'object' ? p.call.content : {}; + return c2.tool || 'unknown'; + }); + + return ( + + + setExpanded(!expanded)} + sx={{ + display: 'flex', + alignItems: 'center', + gap: 0.75, + px: 1.5, + py: 0.7, + cursor: 'pointer', + '&:hover': { bgcolor: 'rgba(0,0,0,0.02)' }, + }} + > + {!meta ? ( + + ) : hasSvg ? ( + + ) : ( + + )} + + {!meta ? ( + + + + ) : ( + + {displayName} + + )} + + {deniedCount > 0 && ( + + {deniedCount} denied + + )} + {allDone && completedCount > 0 && ( + + + + {completedCount}/{group.callCount} + + + )} + {!allDone && pendingCount > 0 && ( + + {completedCount}/{group.callCount} + + )} + + + {expanded ? : } + + + + + + {group.pairs.map((pair) => ( + + ))} + + + + + ); +}); + +export default ToolGroupBubble; diff --git a/frontend/src/app/pages/AgentChat/ViewBubble.tsx b/frontend/src/app/pages/AgentChat/ViewBubble.tsx new file mode 100644 index 00000000..9ae3af4b --- /dev/null +++ b/frontend/src/app/pages/AgentChat/ViewBubble.tsx @@ -0,0 +1,277 @@ +import React, { useState, useMemo } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import Collapse from '@mui/material/Collapse'; +import Dialog from '@mui/material/Dialog'; +import DialogContent from '@mui/material/DialogContent'; +import Icon from '@mui/material/Icon'; +import OpenInFullIcon from '@mui/icons-material/OpenInFull'; +import CloseIcon from '@mui/icons-material/Close'; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import { useAppSelector } from '@/shared/hooks'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import ViewPreview from '../Views/ViewPreview'; + +interface Props { + toolInput: Record; + toolResult?: string | Record; + isStreaming?: boolean; +} + +const ViewBubble: React.FC = ({ toolInput, toolResult, isStreaming }) => { + const c = useClaudeTokens(); + const [expanded, setExpanded] = useState(false); + const [showInputs, setShowInputs] = useState(false); + + const outputId = toolInput?.output_id; + const inputData = toolInput?.input_data || {}; + const outputsMap = useAppSelector((state) => state.outputs.items); + const output = outputId ? outputsMap[outputId] : null; + + const parsedResult = useMemo(() => { + if (!toolResult) return null; + if (typeof toolResult === 'object') return toolResult; + try { return JSON.parse(toolResult as string); } catch { return null; } + }, [toolResult]); + + const frontendCode = parsedResult?.frontend_code || (output?.files?.['index.html'] ?? '') || ''; + const backendResult = parsedResult?.backend_result || null; + const outputName = parsedResult?.output_name || output?.name || 'View'; + const outputColor = c.accent.primary; + const outputIcon = output?.icon || 'view_quilt'; + const hasPreview = !!frontendCode.trim(); + const serveUrl = outputId ? `/api/outputs/${outputId}/serve/index.html` : undefined; + const inputEntries = Object.entries(inputData); + + if (isStreaming && !hasPreview) { + return ( + + + {outputIcon} + + {outputName} + + + + Rendering… + + + + ); + } + + return ( + <> + + + {/* Header */} + + {outputIcon} + + {outputName} + + {inputEntries.length > 0 && ( + setShowInputs(!showInputs)} + sx={{ + color: c.text.tertiary, + p: 0.5, + transform: showInputs ? 'rotate(180deg)' : 'rotate(0deg)', + transition: 'transform 0.2s ease', + }} + > + + + )} + {hasPreview && ( + setExpanded(true)} + sx={{ color: c.text.tertiary, p: 0.5, '&:hover': { color: outputColor } }} + > + + + )} + + + {/* Collapsible input params */} + + + {inputEntries.map(([key, val]) => { + const display = typeof val === 'string' ? val : JSON.stringify(val); + return ( + + + {key} + + + {display.length > 120 ? display.slice(0, 120) + '…' : display} + + + ); + })} + + + + {/* Preview */} + {hasPreview && ( + + + + )} + + {parsedResult?.error && ( + + + {parsedResult.error} + + + )} + + + + {/* Fullscreen dialog */} + setExpanded(false)} + maxWidth="lg" + fullWidth + PaperProps={{ + sx: { + height: '85vh', + display: 'flex', + flexDirection: 'column', + borderRadius: '12px', + overflow: 'hidden', + }, + }} + > + + {outputIcon} + {outputName} + setExpanded(false)} size="small" sx={{ color: c.text.tertiary }}> + + + + + + + + + ); +}; + +export default ViewBubble; diff --git a/frontend/src/app/pages/Commands/Commands.tsx b/frontend/src/app/pages/Commands/Commands.tsx new file mode 100644 index 00000000..a1bf45dd --- /dev/null +++ b/frontend/src/app/pages/Commands/Commands.tsx @@ -0,0 +1,588 @@ +import React, { useEffect, useMemo } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Paper from '@mui/material/Paper'; +import Chip from '@mui/material/Chip'; +import DescriptionIcon from '@mui/icons-material/Description'; +import PsychologyIcon from '@mui/icons-material/Psychology'; +import SmartToyOutlinedIcon from '@mui/icons-material/SmartToyOutlined'; +import AlternateEmailIcon from '@mui/icons-material/AlternateEmail'; +import KeyboardIcon from '@mui/icons-material/Keyboard'; +import TerminalIcon from '@mui/icons-material/Terminal'; +import InsertDriveFileOutlinedIcon from '@mui/icons-material/InsertDriveFileOutlined'; +import LanguageIcon from '@mui/icons-material/Language'; +import BuildOutlinedIcon from '@mui/icons-material/BuildOutlined'; +import ViewQuiltOutlinedIcon from '@mui/icons-material/ViewQuiltOutlined'; +import { useAppSelector, useAppDispatch } from '@/shared/hooks'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import { fetchBuiltinTools, fetchTools } from '@/shared/state/toolsSlice'; +import { getToolGroupIcon } from '@/app/components/CommandPicker'; +import { fetchOutputs } from '@/shared/state/outputsSlice'; +import { fetchTemplates } from '@/shared/state/templatesSlice'; +import { fetchSkills } from '@/shared/state/skillsSlice'; +import { fetchModes } from '@/shared/state/modesSlice'; + +interface SlashCommand { + id: string; + type: 'template' | 'skill' | 'mode'; + name: string; + description: string; + command: string; +} + +interface AtCommand { + prefix: string; + label: string; + description: string; + icon: React.ReactNode; + source: string; + isChild?: boolean; +} + +interface Shortcut { + key: string; + description: string; + category: 'navigation' | 'action'; +} + +const SHORTCUTS: Shortcut[] = [ + { key: 'd', description: 'Go to Dashboard', category: 'navigation' }, + { key: 't', description: 'Go to Templates', category: 'navigation' }, + { key: '1-9', description: 'Open agent by position', category: 'navigation' }, + { key: 'Shift+A', description: 'Approve all pending', category: 'action' }, + { key: 'Shift+D', description: 'Deny all pending', category: 'action' }, + { key: '?', description: 'Show shortcuts dialog', category: 'navigation' }, +]; + +const KeyBadge: React.FC<{ keys: string; c: any }> = ({ keys, c }) => ( + + + {keys} + + +); + +const SectionHeader: React.FC<{ + icon: React.ReactNode; + title: string; + subtitle: string; + count?: number; + c: any; +}> = ({ icon, title, subtitle, count, c }) => ( + + {icon} + + + + {title} + + {count !== undefined && ( + + )} + + {subtitle} + + +); + +const Commands: React.FC = () => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const templates = useAppSelector((state) => state.templates.items); + const skills = useAppSelector((state) => state.skills.items); + const modesMap = useAppSelector((state) => state.modes.items); + const builtinTools = useAppSelector((state) => state.tools.builtinTools); + const customTools = useAppSelector((state) => state.tools.items); + const outputItems = useAppSelector((state) => state.outputs.items); + + const templatesLoaded = useAppSelector((state) => state.templates.loaded); + const skillsLoaded = useAppSelector((state) => state.skills.loaded); + const modesLoaded = useAppSelector((state) => state.modes.loaded); + const builtinLoaded = useAppSelector((state) => state.tools.builtinLoaded); + const toolsLoaded = useAppSelector((state) => state.tools.loaded); + const outputsLoaded = useAppSelector((state) => state.outputs.loaded); + + useEffect(() => { + if (!templatesLoaded) dispatch(fetchTemplates()); + if (!skillsLoaded) dispatch(fetchSkills()); + if (!modesLoaded) dispatch(fetchModes()); + if (!builtinLoaded) dispatch(fetchBuiltinTools()); + if (!toolsLoaded) dispatch(fetchTools()); + if (!outputsLoaded) dispatch(fetchOutputs()); + }, [dispatch, templatesLoaded, skillsLoaded, modesLoaded, builtinLoaded, toolsLoaded, outputsLoaded]); + + const slashCommands: SlashCommand[] = useMemo(() => [ + ...Object.values(templates).map((t) => ({ + id: t.id, + type: 'template' as const, + name: t.name, + description: t.description || `Template with ${t.fields.length} fields`, + command: t.name.toLowerCase().replace(/\s+/g, '-'), + })), + ...Object.values(skills).map((s) => ({ + id: s.id, + type: 'skill' as const, + name: s.name, + description: s.description || 'Skill', + command: s.command || s.id, + })), + ...Object.values(modesMap).map((m) => ({ + id: m.id, + type: 'mode' as const, + name: m.name, + description: m.description || 'Switch to this mode', + command: m.name.toLowerCase().replace(/\s+/g, '-'), + })), + ], [templates, skills, modesMap]); + + const atCommands: AtCommand[] = useMemo(() => { + const items: AtCommand[] = [ + { prefix: '@file', label: 'File', description: 'Attach a file or folder as context', icon: , source: 'builtin' }, + ]; + + const hasWebSearch = builtinTools.some((t) => t.name === 'WebSearch' && t.deferred); + const hasWebFetch = builtinTools.some((t) => t.name === 'WebFetch' && t.deferred); + if (hasWebSearch || hasWebFetch) { + items.push({ + prefix: '@web', + label: 'Web', + description: 'Search the web and fetch URLs', + icon: , + source: 'builtin', + }); + } + + for (const tool of Object.values(customTools)) { + if (!tool.mcp_config || Object.keys(tool.mcp_config).length === 0) continue; + const services = tool.tool_permissions?._services as Record | undefined; + if (!services) continue; + const perms = tool.tool_permissions as Record; + const serviceGroups = (tool.tool_permissions?._service_groups ?? {}) as Record; + + const enabledServices: { name: string }[] = []; + for (const [serviceName, serviceTools] of Object.entries(services)) { + const allToolNames = [...(serviceTools.read || []), ...(serviceTools.write || [])]; + const enabled = allToolNames.filter((name) => perms[name] !== 'deny'); + if (enabled.length > 0) enabledServices.push({ name: serviceName }); + } + + if (enabledServices.length === 0) continue; + + const groupEntries = Object.entries(serviceGroups); + const emittedServices = new Set(); + + for (const [groupName, groupServiceNames] of groupEntries) { + const groupCmd = groupName.toLowerCase().replace(/\s+/g, '-'); + const groupServices = enabledServices.filter((s) => groupServiceNames.includes(s.name)); + if (groupServices.length === 0) continue; + groupServices.forEach((s) => emittedServices.add(s.name)); + + const groupIcon = getToolGroupIcon(groupName, 18); + if (groupServices.length >= 2) { + items.push({ + prefix: `@${groupCmd}`, + label: groupName, + description: `Use all ${groupName} tools`, + icon: groupIcon, + source: tool.name, + }); + for (const svc of groupServices) { + items.push({ + prefix: `@${groupCmd}/${svc.name.toLowerCase().replace(/\s+/g, '-')}`, + label: svc.name, + description: `Use ${svc.name} tools from ${tool.name}`, + icon: groupIcon, + source: tool.name, + isChild: true, + }); + } + } else { + const svc = groupServices[0]; + items.push({ + prefix: `@${svc.name.toLowerCase().replace(/\s+/g, '-')}`, + label: svc.name, + description: `Use ${svc.name} tools from ${tool.name}`, + icon: groupIcon, + source: tool.name, + }); + } + } + + for (const svc of enabledServices) { + if (emittedServices.has(svc.name)) continue; + items.push({ + prefix: `@${svc.name.toLowerCase().replace(/\s+/g, '-')}`, + label: svc.name, + description: `Use ${svc.name} tools from ${tool.name}`, + icon: , + source: tool.name, + }); + } + } + + for (const out of Object.values(outputItems)) { + if (out.permission === 'deny') continue; + const cmd = out.name.toLowerCase().replace(/\s+/g, '-'); + items.push({ + prefix: `@${cmd}`, + label: out.name, + description: out.description || `Render ${out.name} view`, + icon: , + source: 'view', + }); + } + + return items; + }, [builtinTools, customTools, outputItems]); + + const navShortcuts = SHORTCUTS.filter((s) => s.category === 'navigation'); + const actionShortcuts = SHORTCUTS.filter((s) => s.category === 'action'); + + return ( + + + + Commands + + + Manage slash commands, context references, and keyboard shortcuts in one place. + + + + + {/* Slash Commands */} + + } + title="Slash Commands" + subtitle="Type / in chat to invoke templates, skills, and modes" + count={slashCommands.length} + c={c} + /> + + {slashCommands.length === 0 ? ( + + + + No slash commands yet. Create templates, skills, or modes to see them here. + + + ) : ( + + {slashCommands.map((cmd) => ( + + + {cmd.type === 'template' ? ( + + ) : cmd.type === 'mode' ? ( + + ) : ( + + )} + + + /{cmd.command} + + + + {cmd.description} + + + ))} + + )} + + + {/* @ Commands */} + + } + title="@ Context Commands" + subtitle="Type @ in chat to attach context and activate tools" + count={atCommands.length} + c={c} + /> + + {atCommands.length === 0 ? ( + + + + No @ commands yet. Install MCP tools to see them here. + + + ) : ( + + {atCommands.map((cmd) => ( + + + {cmd.icon} + + + {cmd.prefix} + + + + {cmd.description} + + + ))} + + )} + + + {/* Keyboard Shortcuts */} + + } + title="Keyboard Shortcuts" + subtitle="Press ? anywhere to see the quick-reference dialog" + count={SHORTCUTS.length} + c={c} + /> + + + {/* Navigation */} + + + Navigation + + + {navShortcuts.map((s) => ( + + + {s.description} + + + + ))} + + + + {/* Actions */} + + + Actions + + + {actionShortcuts.map((s) => ( + + + {s.description} + + + + ))} + + + + + + + ); +}; + +export default Commands; diff --git a/frontend/src/app/pages/Dashboard/AgentCard.tsx b/frontend/src/app/pages/Dashboard/AgentCard.tsx new file mode 100644 index 00000000..b1e6ddce --- /dev/null +++ b/frontend/src/app/pages/Dashboard/AgentCard.tsx @@ -0,0 +1,754 @@ +import React, { useState, useEffect, useRef, useCallback } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Chip from '@mui/material/Chip'; +import IconButton from '@mui/material/IconButton'; +import Button from '@mui/material/Button'; +import Tooltip from '@mui/material/Tooltip'; +import CheckIcon from '@mui/icons-material/Check'; +import CheckCircleIcon from '@mui/icons-material/CheckCircle'; +import CancelIcon from '@mui/icons-material/Cancel'; +import CloseIcon from '@mui/icons-material/Close'; +import DragIndicatorIcon from '@mui/icons-material/DragIndicator'; +import TerminalIcon from '@mui/icons-material/Terminal'; +import { motion } from 'framer-motion'; +import { + AgentSession, + handleApproval, + toggleExpandSession, + collapseSession, + closeSession, +} from '@/shared/state/agentsSlice'; +import { + setCardPosition, + setCardSize, +} from '@/shared/state/dashboardLayoutSlice'; +import { useAppDispatch } from '@/shared/hooks'; +import { QuestionForm } from '@/app/pages/AgentChat/ApprovalBar'; +import AgentChat from '@/app/pages/AgentChat/AgentChat'; +import { parseMcpToolName, getMcpShortAction } from '@/app/pages/AgentChat/ToolCallBubble'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +// --------------------------------------------------------------------------- +// Helper components & functions (unchanged) +// --------------------------------------------------------------------------- + +const GoogleServiceIcon: React.FC<{ service: string; size?: number }> = ({ service, size = 16 }) => { + if (service === 'gmail') { + return ( + + + + + + + + + ); + } + if (service === 'calendar') { + return ( + + + + 31 + + ); + } + if (service === 'drive' || service === 'sheets') { + return ( + + + + + + + ); + } + return null; +}; + +function formatDuration(createdAt: string): string { + const seconds = Math.floor((Date.now() - new Date(createdAt).getTime()) / 1000); + if (seconds < 60) return `${seconds}s`; + const minutes = Math.floor(seconds / 60); + if (minutes < 60) return `${minutes}m ${seconds % 60}s`; + const hours = Math.floor(minutes / 60); + return `${hours}h ${minutes % 60}m`; +} + +function summarizeToolInput(toolName: string, toolInput: Record): string { + const mcp = parseMcpToolName(toolName); + if (mcp.isMcp) { + const keys = Object.keys(toolInput || {}); + if (keys.length === 0) return ''; + if (keys.length === 1) { + const v = toolInput[keys[0]]; + const s = typeof v === 'string' ? v : JSON.stringify(v); + return s.length > 60 ? s.slice(0, 60) + '…' : s; + } + return keys.slice(0, 3).map((k) => { + const v = toolInput[k]; + const s = typeof v === 'string' ? v : JSON.stringify(v); + return `${k}: ${s.length > 30 ? s.slice(0, 30) + '…' : s}`; + }).join(' '); + } + switch (toolName) { + case 'Bash': + return toolInput.command || '(command)'; + case 'Read': + return toolInput.file_path || toolInput.path || '(file)'; + case 'Write': + case 'Edit': + return toolInput.file_path || toolInput.path || '(file)'; + case 'Grep': + return `/${toolInput.pattern || ''}/${toolInput.path ? ` in ${toolInput.path}` : ''}`; + case 'Glob': + return toolInput.glob_pattern || toolInput.pattern || '(pattern)'; + case 'AskUserQuestion': { + const questions = toolInput.questions; + if (Array.isArray(questions) && questions.length > 0) { + return questions[0].question || questions[0].prompt || questions[0].text || 'Question pending'; + } + return 'Question pending'; + } + default: { + return toolInput.command || toolInput.file_path || toolInput.path || toolInput.query + || JSON.stringify(toolInput).slice(0, 60); + } + } +} + +function getToolDisplayName(toolName: string): string { + const mcp = parseMcpToolName(toolName); + if (mcp.isMcp) return mcp.displayName; + return toolName; +} + +// --------------------------------------------------------------------------- +// Resize handle definitions +// --------------------------------------------------------------------------- + +type ResizeDir = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw'; + +const EDGE_THICKNESS = 6; +const CORNER_SIZE = 14; + +const CURSOR_MAP: Record = { + n: 'ns-resize', + s: 'ns-resize', + e: 'ew-resize', + w: 'ew-resize', + nw: 'nwse-resize', + se: 'nwse-resize', + ne: 'nesw-resize', + sw: 'nesw-resize', +}; + +const HANDLE_DEFS: { dir: ResizeDir; sx: Record }[] = [ + { dir: 'n', sx: { top: -EDGE_THICKNESS / 2, left: CORNER_SIZE, right: CORNER_SIZE, height: EDGE_THICKNESS } }, + { dir: 's', sx: { bottom: -EDGE_THICKNESS / 2, left: CORNER_SIZE, right: CORNER_SIZE, height: EDGE_THICKNESS } }, + { dir: 'w', sx: { left: -EDGE_THICKNESS / 2, top: CORNER_SIZE, bottom: CORNER_SIZE, width: EDGE_THICKNESS } }, + { dir: 'e', sx: { right: -EDGE_THICKNESS / 2, top: CORNER_SIZE, bottom: CORNER_SIZE, width: EDGE_THICKNESS } }, + { dir: 'nw', sx: { top: -EDGE_THICKNESS / 2, left: -EDGE_THICKNESS / 2, width: CORNER_SIZE, height: CORNER_SIZE } }, + { dir: 'ne', sx: { top: -EDGE_THICKNESS / 2, right: -EDGE_THICKNESS / 2, width: CORNER_SIZE, height: CORNER_SIZE } }, + { dir: 'sw', sx: { bottom: -EDGE_THICKNESS / 2, left: -EDGE_THICKNESS / 2, width: CORNER_SIZE, height: CORNER_SIZE } }, + { dir: 'se', sx: { bottom: -EDGE_THICKNESS / 2, right: -EDGE_THICKNESS / 2, width: CORNER_SIZE, height: CORNER_SIZE } }, +]; + +// --------------------------------------------------------------------------- +// AgentCard +// --------------------------------------------------------------------------- + +interface Props { + session: AgentSession; + expanded: boolean; + cardX: number; + cardY: number; + cardWidth: number; + cardHeight: number; + zoom?: number; + spawnFrom?: { x: number; y: number }; +} + +const MIN_W = 480; +const MIN_H = 120; +const EXPANDED_OVERLAY_H = 620; + +const SPAWN_SPRING = { type: 'spring' as const, stiffness: 400, damping: 28, mass: 0.6 }; + +const AgentCard: React.FC = ({ session, expanded, cardX, cardY, cardWidth, cardHeight, zoom = 1, spawnFrom }) => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + + const STATUS_COLORS: Record = { + running: { color: c.status.success, bg: c.status.successBg }, + waiting_approval: { color: c.status.warning, bg: c.status.warningBg }, + completed: { color: c.text.tertiary, bg: c.bg.secondary }, + error: { color: c.status.error, bg: c.status.errorBg }, + stopped: { color: c.text.tertiary, bg: c.bg.secondary }, + draft: { color: c.accent.primary, bg: c.bg.secondary }, + }; + + const [, setTick] = useState(0); + const isDraft = session.status === 'draft'; + + // ---- Drag via header (pointer events) ---- + const DRAG_THRESHOLD = 3; + const dragState = useRef<{ startX: number; startY: number; origX: number; origY: number } | null>(null); + const [isDragging, setIsDragging] = useState(false); + const [localDragPos, setLocalDragPos] = useState<{ x: number; y: number } | null>(null); + const didDrag = useRef(false); + + const handleDragPointerDown = useCallback((e: React.PointerEvent) => { + e.preventDefault(); + e.stopPropagation(); + dragState.current = { startX: e.clientX, startY: e.clientY, origX: cardX, origY: cardY }; + didDrag.current = false; + setIsDragging(true); + (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId); + }, [cardX, cardY]); + + const handleDragPointerMove = useCallback((e: React.PointerEvent) => { + if (!dragState.current) return; + const rawDx = e.clientX - dragState.current.startX; + const rawDy = e.clientY - dragState.current.startY; + if (!didDrag.current && Math.sqrt(rawDx * rawDx + rawDy * rawDy) < DRAG_THRESHOLD) return; + didDrag.current = true; + setLocalDragPos({ + x: dragState.current.origX + rawDx / zoom, + y: dragState.current.origY + rawDy / zoom, + }); + }, [zoom]); + + const handleDragPointerUp = useCallback((e: React.PointerEvent) => { + if (!dragState.current) return; + if (didDrag.current) { + const dx = (e.clientX - dragState.current.startX) / zoom; + const dy = (e.clientY - dragState.current.startY) / zoom; + dispatch(setCardPosition({ + sessionId: session.id, + x: dragState.current.origX + dx, + y: dragState.current.origY + dy, + })); + } else if (expanded) { + dispatch(toggleExpandSession(session.id)); + } + dragState.current = null; + didDrag.current = false; + setLocalDragPos(null); + setIsDragging(false); + (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId); + }, [zoom, dispatch, session.id, expanded]); + + // ---- Unified edge / corner resize ---- + const resizeRef = useRef<{ + dir: ResizeDir; + startX: number; + startY: number; + origX: number; + origY: number; + origW: number; + origH: number; + } | null>(null); + const [isResizing, setIsResizing] = useState(false); + const [localResize, setLocalResize] = useState<{ x: number; y: number; w: number; h: number } | null>(null); + + const handleResizeDown = useCallback( + (dir: ResizeDir) => (e: React.PointerEvent) => { + e.preventDefault(); + e.stopPropagation(); + const effectiveW = Math.max(cardWidth, MIN_W); + const effectiveH = expanded ? Math.max(EXPANDED_OVERLAY_H, cardHeight) : cardHeight; + resizeRef.current = { + dir, + startX: e.clientX, + startY: e.clientY, + origX: cardX, + origY: cardY, + origW: effectiveW, + origH: effectiveH, + }; + setIsResizing(true); + (e.target as HTMLElement).setPointerCapture(e.pointerId); + }, + [cardX, cardY, cardWidth, cardHeight, expanded], + ); + + const computeResize = useCallback( + (e: React.PointerEvent) => { + if (!resizeRef.current) return null; + const { dir, startX, startY, origX, origY, origW, origH } = resizeRef.current; + const dx = (e.clientX - startX) / zoom; + const dy = (e.clientY - startY) / zoom; + + let newX = origX, newY = origY, newW = origW, newH = origH; + + if (dir.includes('e')) newW = origW + dx; + if (dir.includes('w')) { newW = origW - dx; newX = origX + dx; } + if (dir.includes('s')) newH = origH + dy; + if (dir.includes('n')) { newH = origH - dy; newY = origY + dy; } + + if (newW < MIN_W) { if (dir.includes('w')) newX = origX + origW - MIN_W; newW = MIN_W; } + if (newH < MIN_H) { if (dir.includes('n')) newY = origY + origH - MIN_H; newH = MIN_H; } + + return { x: newX, y: newY, w: newW, h: newH }; + }, + [zoom], + ); + + const handleResizeMove = useCallback( + (e: React.PointerEvent) => { + const result = computeResize(e); + if (result) setLocalResize(result); + }, + [computeResize], + ); + + const handleResizeUp = useCallback((e: React.PointerEvent) => { + if (!resizeRef.current) return; + const result = computeResize(e); + if (result) { + dispatch(setCardPosition({ sessionId: session.id, x: result.x, y: result.y })); + dispatch(setCardSize({ sessionId: session.id, width: result.w, height: result.h })); + } + resizeRef.current = null; + setLocalResize(null); + setIsResizing(false); + (e.target as HTMLElement).releasePointerCapture(e.pointerId); + }, [computeResize, dispatch, session.id]); + + const handleRemove = (e: React.MouseEvent) => { + e.stopPropagation(); + e.preventDefault(); + dispatch(closeSession({ sessionId: session.id })); + }; + + const handleCollapse = (e: React.MouseEvent) => { + e.stopPropagation(); + e.preventDefault(); + dispatch(collapseSession(session.id)); + }; + + useEffect(() => { + if (session.status === 'running' || session.status === 'waiting_approval') { + const interval = setInterval(() => setTick((t) => t + 1), 1000); + return () => clearInterval(interval); + } + }, [session.status]); + + const lastMessage = session.messages[session.messages.length - 1]; + const isStreaming = !!session.streamingMessage; + const previewContent = isStreaming + ? (session.streamingMessage!.role === 'tool_call' + ? `[${getToolDisplayName(session.streamingMessage!.tool_name || '')}] ${session.streamingMessage!.content}` + : session.streamingMessage!.content + ).slice(0, 120) + : lastMessage && typeof lastMessage.content === 'string' + ? lastMessage.content.slice(0, 120) + : ''; + const hasPending = session.pending_approvals.length > 0; + const pendingReq = session.pending_approvals[0]; + const statusStyle = STATUS_COLORS[session.status] || { color: c.text.tertiary, bg: c.bg.secondary }; + + const noTransition = isDragging || isResizing; + + const activeX = localResize?.x ?? localDragPos?.x ?? cardX; + const activeY = localResize?.y ?? localDragPos?.y ?? cardY; + const activeW = localResize?.w ?? cardWidth; + const activeH = localResize?.h ?? cardHeight; + + return ( + + dispatch(toggleExpandSession(session.id))} + sx={{ + position: 'relative', + width: localResize ? activeW : Math.max(cardWidth, MIN_W), + height: localResize ? activeH : (expanded ? Math.max(EXPANDED_OVERLAY_H, cardHeight) : 'auto'), + bgcolor: c.bg.surface, + border: hasPending && !expanded + ? `1px solid ${c.status.warning}` + : expanded + ? `1px solid ${c.border.strong}` + : `1px solid ${c.border.subtle}`, + borderRadius: 3, + p: 2, + cursor: expanded ? 'default' : 'pointer', + transition: noTransition ? 'none' : c.transition, + boxShadow: isDragging ? c.shadow.lg : expanded ? c.shadow.md : c.shadow.sm, + display: 'flex', + flexDirection: 'column', + overflow: 'hidden', + ...(!expanded && !isDragging && { + '&:hover': { + boxShadow: c.shadow.md, + borderColor: hasPending ? c.status.warning : c.border.strong, + }, + }), + }} + > + {/* Resize handles: 4 edges + 4 corners */} + {HANDLE_DEFS.map(({ dir, sx }) => ( + e.stopPropagation()} + sx={{ + position: 'absolute', + ...sx, + cursor: CURSOR_MAP[dir], + zIndex: 20, + userSelect: 'none', + touchAction: 'none', + }} + /> + ))} + + {/* Header: always visible – entire bar is draggable */} + + + + + + + {session.name} + + + + e.stopPropagation()} + sx={{ display: 'flex', alignItems: 'center', gap: 0.5, flexShrink: 0, ml: 0.5 }} + > + {expanded ? ( + + e.stopPropagation()} + sx={{ + color: c.text.ghost, + p: 0.5, + '&:hover': { color: c.text.secondary, bgcolor: c.bg.secondary }, + }} + > + + + + ) : ( + + e.stopPropagation()} + sx={{ + color: c.text.ghost, + p: 0.5, + '&:hover': { color: c.status.error, bgcolor: `${c.status.errorBg}` }, + }} + > + + + + )} + + + + {/* Metadata row */} + + + {session.model} + + + {session.mode} + + + {formatDuration(session.created_at)} + + {session.cost_usd > 0 && ( + + ${session.cost_usd.toFixed(4)} + + )} + + + {/* Expanded: inline chat fills remaining space */} + {expanded && ( + e.stopPropagation()} + sx={{ + mx: -2, + mb: -2, + flex: 1, + minHeight: 0, + borderTop: `1px solid ${c.border.subtle}`, + display: 'flex', + flexDirection: 'column', + overflow: 'hidden', + }} + > + dispatch(collapseSession(session.id))} + embedded + /> + + )} + + {/* Collapsed: preview + approval */} + {!expanded && ( + <> + {previewContent && ( + + {isStreaming && ( + + )} + + {previewContent} + + + )} + + {hasPending && pendingReq && pendingReq.tool_name === 'AskUserQuestion' ? ( + e.stopPropagation()}> + + dispatch(handleApproval({ requestId, behavior: 'allow', updatedInput })) + } + onDeny={(requestId) => + dispatch(handleApproval({ requestId, behavior: 'deny' })) + } + /> + + ) : hasPending ? ( + e.stopPropagation()} sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}> + {pendingReq && ( + + + {(() => { + const mcp = parseMcpToolName(pendingReq.tool_name); + if (mcp.isMcp && mcp.service) return ; + return ; + })()} + + + {getToolDisplayName(pendingReq.tool_name)} + + + {summarizeToolInput(pendingReq.tool_name, pendingReq.tool_input)} + + + + {session.pending_approvals.length === 1 && ( + + + dispatch(handleApproval({ requestId: pendingReq.id, behavior: 'allow' }))} + sx={{ color: c.status.success }} + > + + + + + dispatch(handleApproval({ requestId: pendingReq.id, behavior: 'deny' }))} + sx={{ color: c.status.error }} + > + + + + + )} + + )} + {session.pending_approvals.length > 1 && ( + + + {session.pending_approvals.length} pending approvals + + + + + )} + + ) : null} + + )} + + + ); +}; + +export default AgentCard; diff --git a/frontend/src/app/pages/Dashboard/CanvasControls.tsx b/frontend/src/app/pages/Dashboard/CanvasControls.tsx new file mode 100644 index 00000000..1e667a1e --- /dev/null +++ b/frontend/src/app/pages/Dashboard/CanvasControls.tsx @@ -0,0 +1,87 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import RemoveIcon from '@mui/icons-material/Remove'; +import AddIcon from '@mui/icons-material/Add'; +import FitScreenIcon from '@mui/icons-material/FitScreen'; +import AutoAwesomeIcon from '@mui/icons-material/AutoAwesome'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import type { CanvasActions } from './useCanvasControls'; + +interface Props { + zoom: number; + actions: CanvasActions; + onTidy: () => void; +} + +const CanvasControls: React.FC = ({ zoom, actions, onTidy }) => { + const c = useClaudeTokens(); + const pct = Math.round(zoom * 100); + + return ( + + + + + + + + + + {pct}% + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default CanvasControls; diff --git a/frontend/src/app/pages/Dashboard/CloseAgentDialog.tsx b/frontend/src/app/pages/Dashboard/CloseAgentDialog.tsx new file mode 100644 index 00000000..541dbf83 --- /dev/null +++ b/frontend/src/app/pages/Dashboard/CloseAgentDialog.tsx @@ -0,0 +1,60 @@ +import React from 'react'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import DialogContentText from '@mui/material/DialogContentText'; +import DialogActions from '@mui/material/DialogActions'; +import Button from '@mui/material/Button'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +interface Props { + open: boolean; + onCancel: () => void; + onConfirm: () => void; +} + +const CloseAgentDialog: React.FC = ({ open, onCancel, onConfirm }) => { + const c = useClaudeTokens(); + return ( + + + Agent still running + + + + This agent is still running. Closing it will pause the agent. + You can resume it later from the chat history. + + + + + + + + ); +}; + +export default CloseAgentDialog; diff --git a/frontend/src/app/pages/Dashboard/Dashboard.tsx b/frontend/src/app/pages/Dashboard/Dashboard.tsx new file mode 100644 index 00000000..f724b338 --- /dev/null +++ b/frontend/src/app/pages/Dashboard/Dashboard.tsx @@ -0,0 +1,400 @@ +import React, { useEffect, useCallback, useRef, useState } from 'react'; +import { useParams } from 'react-router-dom'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import DashboardIcon from '@mui/icons-material/Dashboard'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { store } from '@/shared/state/store'; +import { + fetchSessions, + fetchHistory, + collapseAllSessions, + collapseSession, + launchAndSendFirstMessage, + generateTitle, + resumeSession, +} from '@/shared/state/agentsSlice'; +import type { AgentConfig } from '@/shared/state/agentsSlice'; +import { + fetchLayout, + saveLayout, + reconcileSessions, + tidyLayout, + addViewCard, + resetLayout, +} from '@/shared/state/dashboardLayoutSlice'; +import { fetchOutputs } from '@/shared/state/outputsSlice'; +import { dashboardWs } from '@/shared/ws/WebSocketManager'; +import AgentCard from './AgentCard'; +import DashboardViewCard from './DashboardViewCard'; +import CanvasControls from './CanvasControls'; +import DashboardToolbar from './DashboardToolbar'; +import { useCanvasControls } from './useCanvasControls'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import type { ContextPath } from '@/app/components/DirectoryBrowser'; +import { ElementSelectionProvider, useElementSelection } from '@/app/components/ElementSelectionContext'; +import { useDomElementSelector } from '@/app/components/useDomElementSelector'; +import SelectionOverlay from '@/app/components/SelectionOverlay'; + +const DashboardSelectionOverlay: React.FC = () => { + const { overlay, dragRect, dragPreview } = useDomElementSelector(); + return ; +}; + +const DashboardInner: React.FC = () => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const elementSelection = useElementSelection(); + const { id: dashboardId } = useParams<{ id: string }>(); + const dashboardName = useAppSelector((state) => + dashboardId ? state.dashboards.items[dashboardId]?.name : undefined, + ); + const sessions = useAppSelector((state) => state.agents.sessions); + const expandedSessionIds = useAppSelector((state) => state.agents.expandedSessionIds); + const cards = useAppSelector((state) => state.dashboardLayout.cards); + const viewCards = useAppSelector((state) => state.dashboardLayout.viewCards); + const layoutInitialized = useAppSelector((state) => state.dashboardLayout.initialized); + const zoomSensitivity = useAppSelector((state) => state.settings.data.zoom_sensitivity); + const newAgentShortcut = useAppSelector((state) => state.settings.data.new_agent_shortcut); + const outputs = useAppSelector((state) => state.outputs.items); + const sessionList = Object.values(sessions); + + const selectModeActive = elementSelection?.selectMode ?? false; + const canvas = useCanvasControls(zoomSensitivity, selectModeActive); + const toolbarRef = useRef(null); + + const [toolbarOpen, setToolbarOpen] = useState(false); + const spawnOriginsRef = useRef>({}); + const hasFittedRef = useRef(false); + + useEffect(() => { + if (!dashboardId) return; + hasFittedRef.current = false; + dispatch(resetLayout()); + dispatch(fetchSessions({ dashboardId })); + dispatch(fetchHistory({ dashboardId })); + dispatch(fetchLayout(dashboardId)); + dispatch(fetchOutputs()); + dashboardWs.connect(); + return () => dashboardWs.disconnect(); + }, [dispatch, dashboardId]); + + useEffect(() => { + if (!layoutInitialized || hasFittedRef.current) return; + hasFittedRef.current = true; + const timer = setTimeout(() => canvas.actions.fitToView(), 150); + return () => clearTimeout(timer); + }, [layoutInitialized, canvas.actions]); + + const prevSessionIdsRef = useRef(''); + + useEffect(() => { + if (!layoutInitialized) return; + const dashboardSessionIds = Object.values(sessions) + .filter((s) => s.dashboard_id === dashboardId) + .map((s) => s.id); + const liveIds = dashboardSessionIds.sort().join(','); + if (liveIds === prevSessionIdsRef.current) return; + prevSessionIdsRef.current = liveIds; + dispatch(reconcileSessions(dashboardSessionIds)); + }, [sessions, layoutInitialized, dispatch, dashboardId]); + + const cardsJson = JSON.stringify(cards); + const viewCardsJson = JSON.stringify(viewCards); + const skipInitialSave = useRef(true); + useEffect(() => { + if (!layoutInitialized || !dashboardId) return; + if (skipInitialSave.current) { + skipInitialSave.current = false; + return; + } + dispatch(saveLayout({ dashboardId, cards, viewCards })); + }, [cardsJson, viewCardsJson, layoutInitialized, dashboardId]); + + useEffect(() => { + const parts = newAgentShortcut.toLowerCase().split('+'); + const key = parts[parts.length - 1]; + const needsMeta = parts.includes('meta'); + const needsCtrl = parts.includes('ctrl'); + const needsShift = parts.includes('shift'); + const needsAlt = parts.includes('alt'); + + const handleShortcut = (e: KeyboardEvent) => { + if (e.key.toLowerCase() !== key) return; + if (needsMeta !== e.metaKey) return; + if (needsCtrl !== e.ctrlKey) return; + if (needsShift !== e.shiftKey) return; + if (needsAlt !== e.altKey) return; + e.preventDefault(); + setToolbarOpen(true); + }; + window.addEventListener('keydown', handleShortcut); + return () => window.removeEventListener('keydown', handleShortcut); + }, [newAgentShortcut]); + + const handleNewAgent = useCallback(() => { + setToolbarOpen(true); + }, []); + + const handleToolbarCancel = useCallback(() => { + setToolbarOpen(false); + }, []); + + const handleToolbarSend = useCallback( + ( + prompt: string, + mode: string, + model: string, + images?: Array<{ data: string; media_type: string }>, + contextPaths?: ContextPath[], + forcedTools?: string[], + attachedSkills?: Array<{ id: string; name: string; content: string }>, + ) => { + setToolbarOpen(false); + + const draftId = `draft-${Date.now().toString(36)}`; + + const toolbarEl = toolbarRef.current; + const vpEl = canvas.viewportRef.current; + if (toolbarEl && vpEl) { + const tr = toolbarEl.getBoundingClientRect(); + const vr = vpEl.getBoundingClientRect(); + const toolbarCenterX = tr.left + tr.width / 2; + const toolbarTopY = tr.top; + spawnOriginsRef.current[draftId] = { + x: (toolbarCenterX - vr.left - canvas.panX) / canvas.zoom, + y: (toolbarTopY - vr.top - canvas.panY) / canvas.zoom, + }; + } + + const config: AgentConfig = { name: 'New chat', model, mode, dashboard_id: dashboardId }; + + dispatch( + launchAndSendFirstMessage({ + draftId, + config, + prompt, + mode, + model, + images, + contextPaths: contextPaths?.map((cp) => ({ path: cp.path, type: cp.type })), + forcedTools, + attachedSkills, + expand: false, + }), + ).then((action) => { + if (launchAndSendFirstMessage.fulfilled.match(action)) { + const realId = action.payload.session.id; + dispatch(generateTitle({ sessionId: realId, prompt })); + spawnOriginsRef.current[realId] = spawnOriginsRef.current[draftId]; + delete spawnOriginsRef.current[draftId]; + } else { + delete spawnOriginsRef.current[draftId]; + } + }); + }, + [canvas.zoom, canvas.panX, canvas.panY, canvas.viewportRef, dispatch, dashboardId], + ); + + const handleAddView = useCallback((outputId: string) => { + dispatch(addViewCard({ outputId })); + }, [dispatch]); + + const handleHistoryResume = useCallback((sessionId: string) => { + dispatch(resumeSession({ sessionId })).then((action) => { + if (resumeSession.fulfilled.match(action)) { + dispatch(collapseSession(sessionId)); + } + }); + }, [dispatch]); + + const handleTidy = useCallback(() => { + dispatch(collapseAllSessions()); + dispatch(tidyLayout()); + + const { cards: tidied, viewCards: tidiedViews } = store.getState().dashboardLayout; + const allRects = [ + ...Object.values(tidied).map((c) => ({ x: c.x, y: c.y, width: c.width, height: c.height })), + ...Object.values(tidiedViews).map((c) => ({ x: c.x, y: c.y, width: c.width, height: c.height })), + ]; + canvas.actions.fitToCards(allRects); + }, [dispatch, canvas.actions]); + + const nonDraftCount = sessionList.filter((s) => s.status !== 'draft' && s.dashboard_id === dashboardId).length; + + const dotSize = Math.max(1, 1.5 * canvas.zoom); + const dotSpacing = 24 * canvas.zoom; + + return ( + <> + + + {/* Floating header overlay */} + + + + + + {dashboardName || 'Dashboard'} + · + + {nonDraftCount} agent{nonDraftCount !== 1 ? 's' : ''} running + + + + + + + {/* Canvas viewport */} + + {/* Dot grid background */} + + + {sessionList.length === 0 && Object.keys(viewCards).length === 0 ? ( + + + No agents running + + + Click "New Agent" to launch your first Claude Code instance + + + ) : ( +
    + {Object.values(cards).map((card) => { + const session = sessions[card.session_id]; + if (!session) return null; + const origin = spawnOriginsRef.current[session.id]; + if (origin) delete spawnOriginsRef.current[session.id]; + return ( + + ); + })} + {Object.values(viewCards).map((vc) => { + const output = outputs[vc.output_id]; + if (!output) return null; + return ( + + ); + })} +
    + )} +
    + + {/* Floating bottom toolbar */} + + + + + {/* Floating zoom controls */} + + + +
    + + ); +}; + +const Dashboard: React.FC = () => ( + + + +); + +export default Dashboard; diff --git a/frontend/src/app/pages/Dashboard/DashboardToolbar.tsx b/frontend/src/app/pages/Dashboard/DashboardToolbar.tsx new file mode 100644 index 00000000..9d45a827 --- /dev/null +++ b/frontend/src/app/pages/Dashboard/DashboardToolbar.tsx @@ -0,0 +1,639 @@ +import React, { useState, useRef, useEffect, useCallback, useMemo } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import InputBase from '@mui/material/InputBase'; +import CircularProgress from '@mui/material/CircularProgress'; +import Tooltip, { tooltipClasses } from '@mui/material/Tooltip'; +import Icon from '@mui/material/Icon'; +import { styled } from '@mui/material/styles'; +import AddIcon from '@mui/icons-material/Add'; +import GridViewRoundedIcon from '@mui/icons-material/GridViewRounded'; +import StickyNote2OutlinedIcon from '@mui/icons-material/StickyNote2Outlined'; +import HistoryRoundedIcon from '@mui/icons-material/HistoryRounded'; +import SearchIcon from '@mui/icons-material/Search'; +import { motion } from 'framer-motion'; +import ChatInput from '@/app/pages/AgentChat/ChatInput'; +import type { ContextPath } from '@/app/components/DirectoryBrowser'; +import { useElementSelection } from '@/app/components/ElementSelectionContext'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { searchHistory, clearHistorySearch } from '@/shared/state/agentsSlice'; +import type { ClaudeTokens } from '@/shared/styles/claudeTokens'; +import type { Output } from '@/shared/state/outputsSlice'; + +interface Props { + inputOpen: boolean; + onNewAgent: () => void; + onCancel: () => void; + onSend: ( + prompt: string, + mode: string, + model: string, + images?: Array<{ data: string; media_type: string }>, + contextPaths?: ContextPath[], + forcedTools?: string[], + attachedSkills?: Array<{ id: string; name: string; content: string }>, + ) => void; + onAddView: (outputId: string) => void; + onHistoryResume: (sessionId: string) => void; + dashboardId?: string; +} + +const BTN = 40; + +const WarmTooltip = styled( + ({ className, ...props }: React.ComponentProps & { className?: string }) => ( + + ) +)<{ tokens: ClaudeTokens }>(({ tokens: c }) => ({ + [`& .${tooltipClasses.tooltip}`]: { + backgroundColor: c.bg.inverse, + color: c.text.inverse, + fontFamily: c.font.sans, + fontSize: '0.78rem', + fontWeight: 500, + padding: '6px 12px', + borderRadius: c.radius.md, + boxShadow: c.shadow.md, + letterSpacing: '0.01em', + }, + [`& .${tooltipClasses.arrow}`]: { + color: c.bg.inverse, + }, +})); + +const MotionBox = motion.div; + +const HISTORY_PAGE_SIZE = 20; + +function formatRelativeTime(dateStr: string | null): string { + if (!dateStr) return ''; + const seconds = Math.floor((Date.now() - new Date(dateStr).getTime()) / 1000); + if (seconds < 60) return 'just now'; + const minutes = Math.floor(seconds / 60); + if (minutes < 60) return `${minutes}m ago`; + const hours = Math.floor(minutes / 60); + if (hours < 24) return `${hours}h ago`; + const days = Math.floor(hours / 24); + return `${days}d ago`; +} + +const DashboardToolbar = React.forwardRef( + ({ inputOpen, onNewAgent, onCancel, onSend, onAddView, onHistoryResume, dashboardId }, ref) => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const elementSelection = useElementSelection(); + const containerRef = useRef(null); + const searchInputRef = useRef(null); + const historyInputRef = useRef(null); + const historyListRef = useRef(null); + const [mode, setMode] = useState('agent'); + const [model, setModel] = useState('sonnet'); + const [viewPickerOpen, setViewPickerOpen] = useState(false); + const [viewSearch, setViewSearch] = useState(''); + const [historyOpen, setHistoryOpen] = useState(false); + const [historyQuery, setHistoryQuery] = useState(''); + const shortcut = useAppSelector((s) => s.settings.data.new_agent_shortcut); + const outputs = useAppSelector((s) => s.outputs.items); + const historySearch = useAppSelector((s) => s.agents.historySearch); + + const outputList = useMemo(() => Object.values(outputs), [outputs]); + const filteredOutputs = useMemo(() => { + if (!viewSearch.trim()) return outputList; + const q = viewSearch.toLowerCase(); + return outputList.filter( + (o) => o.name.toLowerCase().includes(q) || o.description.toLowerCase().includes(q), + ); + }, [outputList, viewSearch]); + + const shortcutLabel = shortcut + .split('+') + .map((p) => { + if (p === 'Meta') return '⌘'; + if (p === 'Ctrl') return 'Ctrl'; + if (p === 'Alt') return '⌥'; + if (p === 'Shift') return '⇧'; + return p.toUpperCase(); + }) + .join(''); + + React.useImperativeHandle(ref, () => containerRef.current!, []); + + const handleSend = useCallback( + ( + message: string, + images?: Array<{ data: string; media_type: string }>, + contextPaths?: ContextPath[], + forcedTools?: string[], + attachedSkills?: Array<{ id: string; name: string; content: string }>, + ) => { + onSend(message, mode, model, images, contextPaths, forcedTools, attachedSkills); + }, + [onSend, mode, model], + ); + + const handleCloseHistory = useCallback(() => { + setHistoryOpen(false); + setHistoryQuery(''); + dispatch(clearHistorySearch()); + }, [dispatch]); + + const handleDismiss = useCallback(() => { + if (historyOpen) { + handleCloseHistory(); + } else if (viewPickerOpen) { + setViewPickerOpen(false); + setViewSearch(''); + } else { + onCancel(); + } + }, [historyOpen, viewPickerOpen, onCancel, handleCloseHistory]); + + const handleSelectView = useCallback((output: Output) => { + onAddView(output.id); + setViewPickerOpen(false); + setViewSearch(''); + }, [onAddView]); + + const handleOpenViewPicker = useCallback(() => { + setViewPickerOpen(true); + setViewSearch(''); + }, []); + + const handleOpenHistory = useCallback(() => { + setHistoryOpen(true); + setHistoryQuery(''); + dispatch(clearHistorySearch()); + dispatch(searchHistory({ q: '', limit: HISTORY_PAGE_SIZE, offset: 0, dashboardId })); + }, [dispatch, dashboardId]); + + const handleHistorySelect = useCallback((sessionId: string) => { + onHistoryResume(sessionId); + handleCloseHistory(); + }, [onHistoryResume, handleCloseHistory]); + + const handleHistoryLoadMore = useCallback(() => { + if (historySearch.loading || !historySearch.hasMore) return; + dispatch(searchHistory({ + q: historyQuery, + limit: HISTORY_PAGE_SIZE, + offset: historySearch.results.length, + dashboardId, + })); + }, [dispatch, historyQuery, historySearch.loading, historySearch.hasMore, historySearch.results.length, dashboardId]); + + const isExpanded = inputOpen || viewPickerOpen || historyOpen; + + useEffect(() => { + if (!inputOpen && elementSelection?.selectMode) { + elementSelection.setSelectMode(false); + } + }, [inputOpen, elementSelection]); + + useEffect(() => { + if (!isExpanded) return; + const handleKey = (e: KeyboardEvent) => { + if (e.key === 'Escape') { + e.preventDefault(); + handleDismiss(); + } + }; + window.addEventListener('keydown', handleKey); + return () => window.removeEventListener('keydown', handleKey); + }, [isExpanded, handleDismiss]); + + useEffect(() => { + if (!isExpanded) return; + const handleClick = (e: MouseEvent) => { + if (elementSelection?.selectMode) return; + const target = e.target as Node; + if (containerRef.current && !containerRef.current.contains(target)) { + const el = target instanceof Element ? target : target.parentElement; + if (el?.closest('[role="dialog"], [role="presentation"], .MuiModal-root, .MuiPopover-root')) { + return; + } + handleDismiss(); + } + }; + const t = setTimeout(() => document.addEventListener('mousedown', handleClick), 50); + return () => { + clearTimeout(t); + document.removeEventListener('mousedown', handleClick); + }; + }, [isExpanded, handleDismiss, elementSelection?.selectMode]); + + useEffect(() => { + if (viewPickerOpen) { + setTimeout(() => searchInputRef.current?.focus(), 60); + } + }, [viewPickerOpen]); + + useEffect(() => { + if (historyOpen) { + setTimeout(() => historyInputRef.current?.focus(), 60); + } + }, [historyOpen]); + + useEffect(() => { + if (!historyOpen) return; + const timer = setTimeout(() => { + dispatch(searchHistory({ q: historyQuery, limit: HISTORY_PAGE_SIZE, offset: 0, dashboardId })); + }, 300); + return () => clearTimeout(timer); + }, [historyQuery, historyOpen, dispatch, dashboardId]); + + const handleHistoryScroll = useCallback(() => { + const el = historyListRef.current; + if (!el) return; + if (el.scrollTop + el.clientHeight >= el.scrollHeight - 40) { + handleHistoryLoadMore(); + } + }, [handleHistoryLoadMore]); + + const placeholderItems = [ + { icon: StickyNote2OutlinedIcon, label: 'Add Notes', sub: 'Coming soon' }, + ]; + + return ( + + {inputOpen ? ( +
    + +
    + ) : historyOpen ? ( +
    + + + setHistoryQuery(e.target.value)} + placeholder="Search past chats..." + sx={{ + flex: 1, + fontSize: '0.85rem', + color: c.text.primary, + fontFamily: c.font.sans, + '& input::placeholder': { color: c.text.ghost, opacity: 1 }, + }} + /> + {historySearch.loading && historySearch.results.length === 0 && ( + + )} + + + {historySearch.results.length === 0 && !historySearch.loading ? ( + + + {historyQuery ? 'No matching chats' : 'No chat history yet'} + + + ) : ( + <> + {historySearch.results.map((entry) => ( + handleHistorySelect(entry.id)} + sx={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + gap: 1.5, + px: 1.5, + py: 0.9, + cursor: 'pointer', + transition: 'background-color 0.1s', + '&:hover': { bgcolor: c.bg.elevated }, + }} + > + + {entry.name} + + + {formatRelativeTime(entry.closed_at)} + + + ))} + {historySearch.loading && historySearch.results.length > 0 && ( + + + + )} + + )} + +
    + ) : viewPickerOpen ? ( +
    + + + setViewSearch(e.target.value)} + placeholder="Search views..." + sx={{ + flex: 1, + fontSize: '0.85rem', + color: c.text.primary, + fontFamily: c.font.sans, + '& input::placeholder': { color: c.text.ghost, opacity: 1 }, + }} + /> + + + {filteredOutputs.length === 0 ? ( + + + {outputList.length === 0 ? 'No views created yet' : 'No matching views'} + + + ) : ( + filteredOutputs.map((output) => ( + handleSelectView(output)} + sx={{ + display: 'flex', + alignItems: 'center', + gap: 1.5, + px: 1.5, + py: 1, + cursor: 'pointer', + transition: 'background-color 0.1s', + '&:hover': { bgcolor: c.bg.elevated }, + }} + > + {output.thumbnail ? ( + + ) : ( + + + {output.icon || 'view_quilt'} + + + )} + + + {output.name} + + {output.description && ( + + {output.description} + + )} + + + )) + )} + +
    + ) : ( +
    + + + + + + + + + + Add View + + } + > + + + + + + + History + + } + > + + + + + + {placeholderItems.map(({ icon: PlaceholderIcon, label, sub }) => ( + + {label} + {sub} + + } + > + + + + + ))} +
    + )} +
    + ); + }, +); + +DashboardToolbar.displayName = 'DashboardToolbar'; + +export default DashboardToolbar; diff --git a/frontend/src/app/pages/Dashboard/DashboardViewCard.tsx b/frontend/src/app/pages/Dashboard/DashboardViewCard.tsx new file mode 100644 index 00000000..5ce8df47 --- /dev/null +++ b/frontend/src/app/pages/Dashboard/DashboardViewCard.tsx @@ -0,0 +1,360 @@ +import React, { useState, useRef, useCallback, useEffect } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import CircularProgress from '@mui/material/CircularProgress'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import BoltIcon from '@mui/icons-material/Bolt'; +import CloseIcon from '@mui/icons-material/Close'; +import GridViewRoundedIcon from '@mui/icons-material/GridViewRounded'; +import { Output, autoRunOutput, autoRunAgentOutput, executeOutput, OutputExecuteResult, getBackendCode } from '@/shared/state/outputsSlice'; +import { setViewCardPosition, setViewCardSize, removeViewCard } from '@/shared/state/dashboardLayoutSlice'; +import { useAppDispatch } from '@/shared/hooks'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import ViewPreview, { ViewPreviewHandle } from '@/app/pages/Views/ViewPreview'; +import { getDefault } from '@/app/pages/Views/InputSchemaForm'; + +type ResizeDir = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw'; + +const EDGE_THICKNESS = 6; +const CORNER_SIZE = 14; +const MIN_W = 320; +const MIN_H = 200; + +const CURSOR_MAP: Record = { + n: 'ns-resize', s: 'ns-resize', e: 'ew-resize', w: 'ew-resize', + nw: 'nwse-resize', se: 'nwse-resize', ne: 'nesw-resize', sw: 'nesw-resize', +}; + +const HANDLE_DEFS: { dir: ResizeDir; sx: Record }[] = [ + { dir: 'n', sx: { top: -EDGE_THICKNESS / 2, left: CORNER_SIZE, right: CORNER_SIZE, height: EDGE_THICKNESS } }, + { dir: 's', sx: { bottom: -EDGE_THICKNESS / 2, left: CORNER_SIZE, right: CORNER_SIZE, height: EDGE_THICKNESS } }, + { dir: 'w', sx: { left: -EDGE_THICKNESS / 2, top: CORNER_SIZE, bottom: CORNER_SIZE, width: EDGE_THICKNESS } }, + { dir: 'e', sx: { right: -EDGE_THICKNESS / 2, top: CORNER_SIZE, bottom: CORNER_SIZE, width: EDGE_THICKNESS } }, + { dir: 'nw', sx: { top: -EDGE_THICKNESS / 2, left: -EDGE_THICKNESS / 2, width: CORNER_SIZE, height: CORNER_SIZE } }, + { dir: 'ne', sx: { top: -EDGE_THICKNESS / 2, right: -EDGE_THICKNESS / 2, width: CORNER_SIZE, height: CORNER_SIZE } }, + { dir: 'sw', sx: { bottom: -EDGE_THICKNESS / 2, left: -EDGE_THICKNESS / 2, width: CORNER_SIZE, height: CORNER_SIZE } }, + { dir: 'se', sx: { bottom: -EDGE_THICKNESS / 2, right: -EDGE_THICKNESS / 2, width: CORNER_SIZE, height: CORNER_SIZE } }, +]; + +interface Props { + output: Output; + cardX: number; + cardY: number; + cardWidth: number; + cardHeight: number; + zoom?: number; +} + +const DashboardViewCard: React.FC = ({ output, cardX, cardY, cardWidth, cardHeight, zoom = 1 }) => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const previewRef = useRef(null); + + const [inputData, setInputData] = useState>(() => getDefault(output.input_schema)); + const [backendResult, setBackendResult] = useState | null>(null); + const [autoRunning, setAutoRunning] = useState(false); + + const hasAutoRun = !!(output.auto_run_config?.enabled && output.auto_run_config?.prompt); + + // ---- Drag via header ---- + const DRAG_THRESHOLD = 3; + const dragState = useRef<{ startX: number; startY: number; origX: number; origY: number } | null>(null); + const [isDragging, setIsDragging] = useState(false); + const [localDragPos, setLocalDragPos] = useState<{ x: number; y: number } | null>(null); + const didDrag = useRef(false); + + const handleDragPointerDown = useCallback((e: React.PointerEvent) => { + e.preventDefault(); + e.stopPropagation(); + dragState.current = { startX: e.clientX, startY: e.clientY, origX: cardX, origY: cardY }; + didDrag.current = false; + setIsDragging(true); + (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId); + }, [cardX, cardY]); + + const handleDragPointerMove = useCallback((e: React.PointerEvent) => { + if (!dragState.current) return; + const rawDx = e.clientX - dragState.current.startX; + const rawDy = e.clientY - dragState.current.startY; + if (!didDrag.current && Math.sqrt(rawDx * rawDx + rawDy * rawDy) < DRAG_THRESHOLD) return; + didDrag.current = true; + setLocalDragPos({ + x: dragState.current.origX + rawDx / zoom, + y: dragState.current.origY + rawDy / zoom, + }); + }, [zoom]); + + const handleDragPointerUp = useCallback((e: React.PointerEvent) => { + if (!dragState.current) return; + if (didDrag.current) { + const dx = (e.clientX - dragState.current.startX) / zoom; + const dy = (e.clientY - dragState.current.startY) / zoom; + dispatch(setViewCardPosition({ + outputId: output.id, + x: dragState.current.origX + dx, + y: dragState.current.origY + dy, + })); + } + dragState.current = null; + didDrag.current = false; + setLocalDragPos(null); + setIsDragging(false); + (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId); + }, [zoom, dispatch, output.id]); + + // ---- Resize ---- + const resizeRef = useRef<{ + dir: ResizeDir; startX: number; startY: number; + origX: number; origY: number; origW: number; origH: number; + } | null>(null); + const [isResizing, setIsResizing] = useState(false); + const [localResize, setLocalResize] = useState<{ x: number; y: number; w: number; h: number } | null>(null); + + const handleResizeDown = useCallback( + (dir: ResizeDir) => (e: React.PointerEvent) => { + e.preventDefault(); + e.stopPropagation(); + resizeRef.current = { + dir, startX: e.clientX, startY: e.clientY, + origX: cardX, origY: cardY, origW: cardWidth, origH: cardHeight, + }; + setIsResizing(true); + (e.target as HTMLElement).setPointerCapture(e.pointerId); + }, + [cardX, cardY, cardWidth, cardHeight], + ); + + const computeResize = useCallback( + (e: React.PointerEvent) => { + if (!resizeRef.current) return null; + const { dir, startX, startY, origX, origY, origW, origH } = resizeRef.current; + const dx = (e.clientX - startX) / zoom; + const dy = (e.clientY - startY) / zoom; + let newX = origX, newY = origY, newW = origW, newH = origH; + if (dir.includes('e')) newW = origW + dx; + if (dir.includes('w')) { newW = origW - dx; newX = origX + dx; } + if (dir.includes('s')) newH = origH + dy; + if (dir.includes('n')) { newH = origH - dy; newY = origY + dy; } + if (newW < MIN_W) { if (dir.includes('w')) newX = origX + origW - MIN_W; newW = MIN_W; } + if (newH < MIN_H) { if (dir.includes('n')) newY = origY + origH - MIN_H; newH = MIN_H; } + return { x: newX, y: newY, w: newW, h: newH }; + }, + [zoom], + ); + + const handleResizeMove = useCallback( + (e: React.PointerEvent) => { + const result = computeResize(e); + if (result) setLocalResize(result); + }, + [computeResize], + ); + + const handleResizeUp = useCallback((e: React.PointerEvent) => { + if (!resizeRef.current) return; + const result = computeResize(e); + if (result) { + dispatch(setViewCardPosition({ outputId: output.id, x: result.x, y: result.y })); + dispatch(setViewCardSize({ outputId: output.id, width: result.w, height: result.h })); + } + resizeRef.current = null; + setLocalResize(null); + setIsResizing(false); + (e.target as HTMLElement).releasePointerCapture(e.pointerId); + }, [computeResize, dispatch, output.id]); + + const handleRemove = (e: React.MouseEvent) => { + e.stopPropagation(); + dispatch(removeViewCard(output.id)); + }; + + const handleRefresh = (e: React.MouseEvent) => { + e.stopPropagation(); + previewRef.current?.reload(); + }; + + const handleAutoRun = async (e: React.MouseEvent) => { + e.stopPropagation(); + if (!output.auto_run_config?.prompt) return; + setAutoRunning(true); + + const config = output.auto_run_config; + const forcedToolNames = config.forced_tools?.flatMap((ft) => ft.tools) ?? []; + + try { + if (forcedToolNames.length > 0) { + const res = await dispatch(autoRunAgentOutput({ + prompt: config.prompt, + input_schema: output.input_schema, + output_id: output.id, + model: config.model, + forced_tools: forcedToolNames, + context_paths: config.context_paths, + })).unwrap(); + + // For agent-based auto-run, we execute with default input for now + // since the agent session result flow is complex for dashboard cards + const execRes = await dispatch(executeOutput({ + output_id: output.id, + input_data: inputData, + })).unwrap(); + setInputData(execRes.input_data); + setBackendResult(execRes.backend_result); + } else { + const res = await dispatch(autoRunOutput({ + prompt: config.prompt, + input_schema: output.input_schema, + backend_code: getBackendCode(output) ?? undefined, + context_paths: config.context_paths, + forced_tools: forcedToolNames.length > 0 ? forcedToolNames : undefined, + model: config.model, + })).unwrap(); + if (res.input_data) { + setInputData(res.input_data); + setBackendResult(res.backend_result); + } + } + } catch { + // Silently handle errors on dashboard + } finally { + setAutoRunning(false); + } + }; + + // Compute display position (prefer local drag/resize during interaction) + const displayX = localResize?.x ?? localDragPos?.x ?? cardX; + const displayY = localResize?.y ?? localDragPos?.y ?? cardY; + const displayW = localResize?.w ?? cardWidth; + const displayH = localResize?.h ?? cardHeight; + + return ( + + {/* Header */} + + + + {output.name} + + + + e.stopPropagation()} + sx={{ color: c.text.muted, p: 0.5, '&:hover': { color: c.text.primary } }} + > + + + + + {hasAutoRun && ( + + + e.stopPropagation()} + disabled={autoRunning} + sx={{ color: '#f59e0b', p: 0.5, '&:hover': { color: '#d97706' } }} + > + {autoRunning ? : } + + + + )} + + + e.stopPropagation()} + sx={{ color: c.text.ghost, p: 0.5, '&:hover': { color: c.status.error } }} + > + + + + + + {/* Preview body */} + + + + + {/* Resize handles */} + {HANDLE_DEFS.map(({ dir, sx }) => ( + + ))} + + ); +}; + +export default DashboardViewCard; diff --git a/frontend/src/app/pages/Dashboard/useCanvasControls.ts b/frontend/src/app/pages/Dashboard/useCanvasControls.ts new file mode 100644 index 00000000..68a333a2 --- /dev/null +++ b/frontend/src/app/pages/Dashboard/useCanvasControls.ts @@ -0,0 +1,323 @@ +import { useState, useCallback, useRef, useEffect, RefObject } from 'react'; + +const MIN_ZOOM = 0.15; +const MAX_ZOOM = 3.0; +const ZOOM_IN_FACTOR = 1.1; +const ZOOM_OUT_FACTOR = 1 / ZOOM_IN_FACTOR; +const FIT_PADDING = 200; + +// Maps the 1–100 user setting to an internal multiplier. +// 50 (default) → 0.004, 1 → 0.0004, 100 → 0.008 +function sensitivityToMultiplier(setting: number): number { + return 0.00008 * setting; +} + +interface CanvasState { + panX: number; + panY: number; + zoom: number; +} + +function clamp(val: number, min: number, max: number) { + return Math.min(max, Math.max(min, val)); +} + +export function useCanvasControls(zoomSensitivity: number = 50, panDisabled: boolean = false) { + const viewportRef = useRef(null); + const contentRef = useRef(null); + + const [state, setState] = useState({ panX: 0, panY: 0, zoom: 1 }); + const [isPanning, setIsPanning] = useState(false); + const [spaceHeld, setSpaceHeld] = useState(false); + + const panStartRef = useRef<{ x: number; y: number; panX: number; panY: number } | null>(null); + const spaceRef = useRef(false); + const sensitivityRef = useRef(zoomSensitivity); + sensitivityRef.current = zoomSensitivity; + + // Wheel zoom centered on cursor + useEffect(() => { + const el = viewportRef.current; + if (!el) return; + + const onWheel = (e: WheelEvent) => { + // Pinch-to-zoom on trackpads sets ctrlKey; plain scroll does not + const isPinchZoom = e.ctrlKey || e.metaKey; + + // Let scrollable children handle the event when appropriate + let target = e.target as HTMLElement | null; + while (target && target !== el) { + const style = getComputedStyle(target); + const overflowY = style.overflowY; + const overflowX = style.overflowX; + + const canScrollY = + target.scrollHeight > target.clientHeight && + (overflowY === 'auto' || overflowY === 'scroll'); + const canScrollX = + target.scrollWidth > target.clientWidth && + (overflowX === 'auto' || overflowX === 'scroll'); + + if ((canScrollY || canScrollX) && !isPinchZoom) { + return; + } + target = target.parentElement; + } + + e.preventDefault(); + + if (isPinchZoom) { + // Pinch gesture → zoom centered on cursor + const rect = el.getBoundingClientRect(); + const cx = e.clientX - rect.left; + const cy = e.clientY - rect.top; + + setState((prev) => { + const delta = e.deltaMode === 1 ? e.deltaY * 40 : e.deltaY; + const factor = Math.pow(2, -delta * sensitivityToMultiplier(sensitivityRef.current)); + const newZoom = clamp(prev.zoom * factor, MIN_ZOOM, MAX_ZOOM); + const ratio = newZoom / prev.zoom; + return { + panX: cx - (cx - prev.panX) * ratio, + panY: cy - (cy - prev.panY) * ratio, + zoom: newZoom, + }; + }); + } else { + // Two-finger scroll → pan + const dx = e.deltaMode === 1 ? e.deltaX * 40 : e.deltaX; + const dy = e.deltaMode === 1 ? e.deltaY * 40 : e.deltaY; + + setState((prev) => ({ + ...prev, + panX: prev.panX - dx, + panY: prev.panY - dy, + })); + } + }; + + el.addEventListener('wheel', onWheel, { passive: false }); + return () => el.removeEventListener('wheel', onWheel); + }, []); + + // Space key tracking + useEffect(() => { + const onKeyDown = (e: KeyboardEvent) => { + const t = e.target as HTMLElement; + if (e.code === 'Space' && !e.repeat && !(t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement || t.isContentEditable)) { + e.preventDefault(); + spaceRef.current = true; + setSpaceHeld(true); + } + if (e.ctrlKey || e.metaKey) { + if (e.key === '0') { + e.preventDefault(); + setState({ panX: 0, panY: 0, zoom: 1 }); + } else if (e.key === '=' || e.key === '+') { + e.preventDefault(); + setState((prev) => { + const newZoom = clamp(prev.zoom * ZOOM_IN_FACTOR, MIN_ZOOM, MAX_ZOOM); + const el = viewportRef.current; + if (!el) return { ...prev, zoom: newZoom }; + const rect = el.getBoundingClientRect(); + const cx = rect.width / 2; + const cy = rect.height / 2; + const ratio = newZoom / prev.zoom; + return { panX: cx - (cx - prev.panX) * ratio, panY: cy - (cy - prev.panY) * ratio, zoom: newZoom }; + }); + } else if (e.key === '-') { + e.preventDefault(); + setState((prev) => { + const newZoom = clamp(prev.zoom * ZOOM_OUT_FACTOR, MIN_ZOOM, MAX_ZOOM); + const el = viewportRef.current; + if (!el) return { ...prev, zoom: newZoom }; + const rect = el.getBoundingClientRect(); + const cx = rect.width / 2; + const cy = rect.height / 2; + const ratio = newZoom / prev.zoom; + return { panX: cx - (cx - prev.panX) * ratio, panY: cy - (cy - prev.panY) * ratio, zoom: newZoom }; + }); + } + } + }; + const onKeyUp = (e: KeyboardEvent) => { + if (e.code === 'Space') { + spaceRef.current = false; + setSpaceHeld(false); + } + }; + + window.addEventListener('keydown', onKeyDown); + window.addEventListener('keyup', onKeyUp); + return () => { + window.removeEventListener('keydown', onKeyDown); + window.removeEventListener('keyup', onKeyUp); + }; + }, []); + + const handleMouseDown = useCallback((e: React.MouseEvent) => { + const isMiddle = e.button === 1; + const isBackgroundLeft = e.button === 0 && e.target === viewportRef.current; + const isSpaceDrag = e.button === 0 && spaceRef.current; + + if (panDisabled && !isMiddle && !isSpaceDrag) return; + + if (isMiddle || isBackgroundLeft || isSpaceDrag) { + e.preventDefault(); + setIsPanning(true); + panStartRef.current = { + x: e.clientX, + y: e.clientY, + panX: state.panX, + panY: state.panY, + }; + } + }, [state.panX, state.panY, panDisabled]); + + const handleMouseMove = useCallback((e: React.MouseEvent) => { + const start = panStartRef.current; + if (!start) return; + const dx = e.clientX - start.x; + const dy = e.clientY - start.y; + setState((prev) => ({ + ...prev, + panX: start.panX + dx, + panY: start.panY + dy, + })); + }, []); + + const handleMouseUp = useCallback(() => { + panStartRef.current = null; + setIsPanning(false); + }, []); + + // Clean up panning if mouse leaves the window + useEffect(() => { + const onUp = () => { + if (panStartRef.current) { + panStartRef.current = null; + setIsPanning(false); + } + }; + window.addEventListener('mouseup', onUp); + return () => window.removeEventListener('mouseup', onUp); + }, []); + + const zoomIn = useCallback(() => { + setState((prev) => { + const newZoom = clamp(prev.zoom * ZOOM_IN_FACTOR, MIN_ZOOM, MAX_ZOOM); + const el = viewportRef.current; + if (!el) return { ...prev, zoom: newZoom }; + const rect = el.getBoundingClientRect(); + const cx = rect.width / 2; + const cy = rect.height / 2; + const ratio = newZoom / prev.zoom; + return { panX: cx - (cx - prev.panX) * ratio, panY: cy - (cy - prev.panY) * ratio, zoom: newZoom }; + }); + }, []); + + const zoomOut = useCallback(() => { + setState((prev) => { + const newZoom = clamp(prev.zoom * ZOOM_OUT_FACTOR, MIN_ZOOM, MAX_ZOOM); + const el = viewportRef.current; + if (!el) return { ...prev, zoom: newZoom }; + const rect = el.getBoundingClientRect(); + const cx = rect.width / 2; + const cy = rect.height / 2; + const ratio = newZoom / prev.zoom; + return { panX: cx - (cx - prev.panX) * ratio, panY: cy - (cy - prev.panY) * ratio, zoom: newZoom }; + }); + }, []); + + const resetZoom = useCallback(() => { + setState({ panX: 0, panY: 0, zoom: 1 }); + }, []); + + const fitToView = useCallback(() => { + const viewport = viewportRef.current; + const content = contentRef.current; + if (!viewport || !content) return; + + const vRect = viewport.getBoundingClientRect(); + const children = content.children; + if (children.length === 0) { + setState({ panX: 0, panY: 0, zoom: 1 }); + return; + } + + setState((prev) => { + let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; + for (let i = 0; i < children.length; i++) { + const r = children[i].getBoundingClientRect(); + if (r.width === 0 && r.height === 0) continue; + const sx = (r.left - vRect.left - prev.panX) / prev.zoom; + const sy = (r.top - vRect.top - prev.panY) / prev.zoom; + minX = Math.min(minX, sx); + minY = Math.min(minY, sy); + maxX = Math.max(maxX, sx + r.width / prev.zoom); + maxY = Math.max(maxY, sy + r.height / prev.zoom); + } + + if (!isFinite(minX)) return { panX: 0, panY: 0, zoom: 1 }; + + const contentWidth = maxX - minX; + const contentHeight = maxY - minY; + const availW = vRect.width - FIT_PADDING * 2; + const availH = vRect.height - FIT_PADDING * 2; + const newZoom = clamp(Math.min(availW / contentWidth, availH / contentHeight), MIN_ZOOM, MAX_ZOOM); + const newPanX = (vRect.width - contentWidth * newZoom) / 2 - minX * newZoom; + const newPanY = (vRect.height - contentHeight * newZoom) / 2 - minY * newZoom; + + return { panX: newPanX, panY: newPanY, zoom: newZoom }; + }); + }, []); + + const fitToCards = useCallback((cardRects: Array<{ x: number; y: number; width: number; height: number }>) => { + const viewport = viewportRef.current; + if (!viewport || cardRects.length === 0) { + setState({ panX: 0, panY: 0, zoom: 1 }); + return; + } + + const vRect = viewport.getBoundingClientRect(); + + let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity; + for (const card of cardRects) { + minX = Math.min(minX, card.x); + minY = Math.min(minY, card.y); + maxX = Math.max(maxX, card.x + card.width); + maxY = Math.max(maxY, card.y + card.height); + } + + if (!isFinite(minX)) { + setState({ panX: 0, panY: 0, zoom: 1 }); + return; + } + + const contentWidth = maxX - minX; + const contentHeight = maxY - minY; + const availW = vRect.width - FIT_PADDING * 2; + const availH = vRect.height - FIT_PADDING * 2; + const newZoom = clamp(Math.min(availW / contentWidth, availH / contentHeight), MIN_ZOOM, MAX_ZOOM); + const newPanX = (vRect.width - contentWidth * newZoom) / 2 - minX * newZoom; + const newPanY = (vRect.height - contentHeight * newZoom) / 2 - minY * newZoom; + + setState({ panX: newPanX, panY: newPanY, zoom: newZoom }); + }, []); + + return { + ...state, + isPanning, + spaceHeld, + viewportRef, + contentRef, + handlers: { + onMouseDown: handleMouseDown, + onMouseMove: handleMouseMove, + onMouseUp: handleMouseUp, + }, + actions: { zoomIn, zoomOut, resetZoom, fitToView, fitToCards }, + } as const; +} + +export type CanvasActions = ReturnType['actions']; diff --git a/frontend/src/app/pages/DashboardSelection/DashboardSelection.tsx b/frontend/src/app/pages/DashboardSelection/DashboardSelection.tsx new file mode 100644 index 00000000..3de1cc57 --- /dev/null +++ b/frontend/src/app/pages/DashboardSelection/DashboardSelection.tsx @@ -0,0 +1,334 @@ +import React, { useEffect, useState, useMemo } from 'react'; +import { useNavigate } from 'react-router-dom'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Button from '@mui/material/Button'; +import TextField from '@mui/material/TextField'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import Menu from '@mui/material/Menu'; +import MenuItem from '@mui/material/MenuItem'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import AddIcon from '@mui/icons-material/Add'; +import DashboardIcon from '@mui/icons-material/Dashboard'; +import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'; +import ContentCopyIcon from '@mui/icons-material/ContentCopy'; +import EditIcon from '@mui/icons-material/Edit'; +import MoreVertIcon from '@mui/icons-material/MoreVert'; +import SearchIcon from '@mui/icons-material/Search'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { + fetchDashboards, + createDashboard, + deleteDashboard, + duplicateDashboard, + renameDashboard, + Dashboard, +} from '@/shared/state/dashboardsSlice'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +function formatRelativeTime(dateStr: string | null): string { + if (!dateStr) return ''; + const seconds = Math.floor((Date.now() - new Date(dateStr).getTime()) / 1000); + if (seconds < 60) return 'just now'; + const minutes = Math.floor(seconds / 60); + if (minutes < 60) return `${minutes}m ago`; + const hours = Math.floor(minutes / 60); + if (hours < 24) return `${hours}h ago`; + const days = Math.floor(hours / 24); + return `${days}d ago`; +} + +const DashboardSelection: React.FC = () => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const navigate = useNavigate(); + const items = useAppSelector((state) => state.dashboards.items); + const loading = useAppSelector((state) => state.dashboards.loading); + + const [search, setSearch] = useState(''); + const [menuAnchor, setMenuAnchor] = useState(null); + const [menuDashboard, setMenuDashboard] = useState(null); + const [renamingId, setRenamingId] = useState(null); + const [renameValue, setRenameValue] = useState(''); + + useEffect(() => { + dispatch(fetchDashboards()); + }, [dispatch]); + + const dashboards = useMemo(() => { + const all = Object.values(items).sort( + (a, b) => new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime(), + ); + if (!search.trim()) return all; + const q = search.toLowerCase(); + return all.filter((d) => d.name.toLowerCase().includes(q)); + }, [items, search]); + + const handleCreate = async () => { + const result = await dispatch(createDashboard('Untitled Dashboard')); + if (createDashboard.fulfilled.match(result)) { + navigate(`/dashboard/${result.payload.id}`); + } + }; + + const handleOpenMenu = (e: React.MouseEvent, d: Dashboard) => { + e.stopPropagation(); + setMenuAnchor(e.currentTarget); + setMenuDashboard(d); + }; + + const handleCloseMenu = () => { + setMenuAnchor(null); + setMenuDashboard(null); + }; + + const handleDelete = () => { + if (menuDashboard) dispatch(deleteDashboard(menuDashboard.id)); + handleCloseMenu(); + }; + + const handleDuplicate = () => { + if (menuDashboard) dispatch(duplicateDashboard(menuDashboard.id)); + handleCloseMenu(); + }; + + const handleStartRename = () => { + const target = menuDashboard; + handleCloseMenu(); + if (target) { + setTimeout(() => { + setRenamingId(target.id); + setRenameValue(target.name); + }, 150); + } + }; + + const handleRenameSubmit = (id: string) => { + const trimmed = renameValue.trim(); + if (trimmed && trimmed !== items[id]?.name) { + dispatch(renameDashboard({ id, name: trimmed })); + } + setRenamingId(null); + }; + + return ( + + + + + Dashboards + + + + + + setSearch(e.target.value)} + InputProps={{ + startAdornment: ( + + ), + }} + sx={{ + width: 320, + '& .MuiOutlinedInput-root': { + bgcolor: c.bg.surface, + borderRadius: 2, + fontSize: '0.875rem', + '& fieldset': { borderColor: c.border.subtle }, + '&:hover fieldset': { borderColor: c.border.medium }, + }, + }} + /> + + + {loading ? ( + + Loading... + + ) : dashboards.length === 0 ? ( + + + {search ? 'No dashboards match your search' : 'No dashboards yet'} + + + {search ? 'Try a different search term' : 'Create your first dashboard to get started'} + + + ) : ( + + {dashboards.map((d) => ( + { + if (renamingId === d.id) return; + navigate(`/dashboard/${d.id}`); + }} + sx={{ + cursor: renamingId === d.id ? 'default' : 'pointer', + borderRadius: 3, + border: `1px solid ${c.border.subtle}`, + bgcolor: c.bg.surface, + overflow: 'hidden', + transition: 'all 0.2s ease', + '&:hover': { + borderColor: c.border.strong, + boxShadow: c.shadow.md, + transform: 'translateY(-2px)', + }, + '&:hover .card-actions': { opacity: 1 }, + display: 'flex', + flexDirection: 'column', + }} + > + + + + + handleOpenMenu(e, d)} + sx={{ + bgcolor: c.bg.surface, + color: c.text.muted, + boxShadow: c.shadow.sm, + '&:hover': { bgcolor: c.bg.elevated }, + }} + > + + + + + + + + {renamingId === d.id ? ( + setRenameValue(e.target.value)} + onBlur={() => handleRenameSubmit(d.id)} + onKeyDown={(e) => { + if (e.key === 'Enter') handleRenameSubmit(d.id); + if (e.key === 'Escape') setRenamingId(null); + }} + onClick={(e) => e.stopPropagation()} + sx={{ + '& .MuiOutlinedInput-root': { + fontSize: '0.95rem', + fontWeight: 600, + }, + }} + /> + ) : ( + + {d.name} + + )} + + Updated {formatRelativeTime(d.updated_at)} + + + + ))} + + )} + + + + + + Rename + + + + Duplicate + + + + Delete + + + + ); +}; + +export default DashboardSelection; diff --git a/frontend/src/app/pages/Modes/Modes.tsx b/frontend/src/app/pages/Modes/Modes.tsx new file mode 100644 index 00000000..3719b84d --- /dev/null +++ b/frontend/src/app/pages/Modes/Modes.tsx @@ -0,0 +1,538 @@ +import React, { useEffect, useState, useMemo } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import CardActions from '@mui/material/CardActions'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import DialogActions from '@mui/material/DialogActions'; +import TextField from '@mui/material/TextField'; +import IconButton from '@mui/material/IconButton'; +import Chip from '@mui/material/Chip'; +import CircularProgress from '@mui/material/CircularProgress'; +import Tooltip from '@mui/material/Tooltip'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import Select from '@mui/material/Select'; +import MenuItem from '@mui/material/MenuItem'; +import Checkbox from '@mui/material/Checkbox'; +import ListItemText from '@mui/material/ListItemText'; +import OutlinedInput from '@mui/material/OutlinedInput'; +import AddIcon from '@mui/icons-material/Add'; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/Delete'; +import TuneIcon from '@mui/icons-material/Tune'; +import LockIcon from '@mui/icons-material/Lock'; +import ArrowForwardIcon from '@mui/icons-material/ArrowForward'; +import SmartToyOutlinedIcon from '@mui/icons-material/SmartToyOutlined'; +import QuestionAnswerOutlinedIcon from '@mui/icons-material/QuestionAnswerOutlined'; +import MapOutlinedIcon from '@mui/icons-material/MapOutlined'; +import CategoryOutlinedIcon from '@mui/icons-material/CategoryOutlined'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { + fetchModes, + createMode, + updateMode, + deleteMode, + Mode, +} from '@/shared/state/modesSlice'; +import { fetchBuiltinTools, fetchTools } from '@/shared/state/toolsSlice'; +import { fetchTemplates } from '@/shared/state/templatesSlice'; +import { fetchSkills } from '@/shared/state/skillsSlice'; +import FolderOpenIcon from '@mui/icons-material/FolderOpen'; +import ExtensionIcon from '@mui/icons-material/Extension'; +import ListSubheader from '@mui/material/ListSubheader'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import DirectoryBrowser from '@/app/components/DirectoryBrowser'; +import RichPromptEditor from '@/app/components/RichPromptEditor'; + +const ICON_MAP: Record = { + smart_toy: , + question_answer: , + map: , + category: , + tune: , +}; + +const ICON_OPTIONS = [ + { value: 'smart_toy', label: 'Robot' }, + { value: 'question_answer', label: 'Q&A' }, + { value: 'map', label: 'Map' }, + { value: 'category', label: 'Category' }, + { value: 'tune', label: 'Tune' }, +]; + +const COLOR_OPTIONS = [ + { value: '#ae5630', label: 'Terra Cotta' }, + { value: '#4ade80', label: 'Green' }, + { value: '#fbbf24', label: 'Amber' }, + { value: '#f87171', label: 'Red' }, + { value: '#38bdf8', label: 'Sky' }, + { value: '#c084fc', label: 'Purple' }, + { value: '#fb923c', label: 'Orange' }, + { value: '#2dd4bf', label: 'Teal' }, +]; + +interface ModeForm { + name: string; + description: string; + system_prompt: string; + tools: string[]; + toolsEnabled: boolean; + default_next_mode: string; + icon: string; + color: string; + default_folder: string; +} + +const emptyForm: ModeForm = { + name: '', + description: '', + system_prompt: '', + tools: [], + toolsEnabled: false, + default_next_mode: '', + icon: 'smart_toy', + color: '#ae5630', + default_folder: '', +}; + +const ALL_BUILTIN_TOOL_NAMES = ['Read', 'Edit', 'Write', 'Bash', 'Glob', 'Grep', 'AskUserQuestion']; + +const Modes: React.FC = () => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const { items, loading } = useAppSelector((s) => s.modes); + const toolItems = useAppSelector((s) => s.tools.items); + const modes = useMemo(() => Object.values(items), [items]); + + const mcpToolNames = useMemo(() => { + return Object.values(toolItems) + .filter((t) => t.mcp_config && Object.keys(t.mcp_config).length > 0 && t.auth_status !== 'none') + .map((t) => `mcp:${t.name}`); + }, [toolItems]); + + const [dialogOpen, setDialogOpen] = useState(false); + const [editingId, setEditingId] = useState(null); + const [form, setForm] = useState(emptyForm); + const [browseOpen, setBrowseOpen] = useState(false); + + useEffect(() => { + dispatch(fetchModes()); + dispatch(fetchBuiltinTools()); + dispatch(fetchTools()); + dispatch(fetchTemplates()); + dispatch(fetchSkills()); + }, [dispatch]); + + const openCreate = () => { + setEditingId(null); + setForm(emptyForm); + setDialogOpen(true); + }; + + const openEdit = (mode: Mode) => { + setEditingId(mode.id); + setForm({ + name: mode.name, + description: mode.description, + system_prompt: mode.system_prompt ?? '', + tools: mode.tools ?? [], + toolsEnabled: mode.tools !== null, + default_next_mode: mode.default_next_mode ?? '', + icon: mode.icon, + color: mode.color, + default_folder: mode.default_folder ?? '', + }); + setDialogOpen(true); + }; + + const handleSave = async () => { + const payload = { + name: form.name, + description: form.description, + system_prompt: form.system_prompt || null, + tools: form.toolsEnabled ? form.tools : null, + default_next_mode: form.default_next_mode || null, + icon: form.icon, + color: form.color, + default_folder: form.default_folder || null, + }; + + if (editingId) { + await dispatch(updateMode({ id: editingId, ...payload })); + } else { + await dispatch(createMode(payload as any)); + } + setDialogOpen(false); + }; + + const handleDelete = async (id: string) => { + await dispatch(deleteMode(id)); + }; + + const otherModes = modes.filter((m) => m.id !== editingId); + + return ( + + + + + Modes + + + Configure agent interaction modes with custom system prompts, tools, and auto-switching. + + + + + + {loading ? ( + + + + ) : modes.length === 0 ? ( + + + No modes defined yet. Create one to get started. + + ) : ( + + {modes.map((mode) => ( + + + + + {ICON_MAP[mode.icon] || ICON_MAP.smart_toy} + + + {mode.name} + + {mode.is_builtin && ( + } + label="Built-in" + size="small" + sx={{ bgcolor: c.bg.secondary, color: c.text.muted, fontSize: '0.7rem', height: 22 }} + /> + )} + + {mode.description && ( + + {mode.description} + + )} + + {mode.tools !== null ? ( + + ) : ( + + )} + {mode.system_prompt && ( + + )} + {mode.default_next_mode && ( + } + label={items[mode.default_next_mode]?.name || mode.default_next_mode} + size="small" + sx={{ bgcolor: 'rgba(251,191,36,0.15)', color: '#fbbf24', fontSize: '0.75rem', height: 24 }} + /> + )} + {mode.default_folder && ( + } + label={mode.default_folder.split('/').pop() || mode.default_folder} + size="small" + sx={{ bgcolor: 'rgba(56,189,248,0.15)', color: '#38bdf8', fontSize: '0.75rem', height: 24 }} + /> + )} + + + + + openEdit(mode)} sx={{ color: c.text.tertiary, '&:hover': { color: c.accent.primary } }}> + + + + {!mode.is_builtin && ( + + handleDelete(mode.id)} sx={{ color: c.text.tertiary, '&:hover': { color: c.status.error } }}> + + + + )} + + + ))} + + )} + + setDialogOpen(false)} + maxWidth="md" + fullWidth + PaperProps={{ + sx: { bgcolor: c.bg.surface, backgroundImage: 'none', borderRadius: 4, border: `1px solid ${c.border.subtle}` }, + }} + > + + {editingId ? 'Edit Mode' : 'New Mode'} + + + setForm({ ...form, name: e.target.value })} + fullWidth + size="small" + sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.page } }} + /> + setForm({ ...form, description: e.target.value })} + fullWidth + size="small" + sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.page } }} + /> + setForm({ ...form, system_prompt: v })} + placeholder="Instructions for the agent when using this mode... (@ for context, / for commands)" + minRows={3} + maxRows={8} + /> + + {/* Tools toggle + multi-select */} + + + setForm({ ...form, toolsEnabled: e.target.checked, tools: e.target.checked ? form.tools : [] })} + size="small" + sx={{ color: c.text.tertiary, '&.Mui-checked': { color: c.accent.primary }, p: 0 }} + /> + + Restrict tools {!form.toolsEnabled && (all tools allowed)} + + + {form.toolsEnabled && ( + + Allowed Tools + + + )} + + + + Default Next Mode + + + + {/* Default Folder */} + + + Default Folder + + + setForm({ ...form, default_folder: e.target.value })} + fullWidth + size="small" + placeholder="Not set (uses global default)" + sx={{ + '& .MuiOutlinedInput-root': { + bgcolor: c.bg.page, + fontFamily: 'monospace', + fontSize: '0.85rem', + }, + }} + /> + + + + + + + Icon + + + + Color + + + + + + + + + + + setBrowseOpen(false)} + onSelect={(item) => setForm({ ...form, default_folder: item.path })} + initialPath={form.default_folder || ''} + /> + + ); +}; + +export default Modes; diff --git a/frontend/src/app/pages/Settings/Settings.tsx b/frontend/src/app/pages/Settings/Settings.tsx new file mode 100644 index 00000000..b5310fff --- /dev/null +++ b/frontend/src/app/pages/Settings/Settings.tsx @@ -0,0 +1,561 @@ +import React, { useState, useEffect, useMemo, useCallback } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Paper from '@mui/material/Paper'; +import TextField from '@mui/material/TextField'; +import Button from '@mui/material/Button'; +import FormControl from '@mui/material/FormControl'; +import Select from '@mui/material/Select'; +import MenuItem from '@mui/material/MenuItem'; +import IconButton from '@mui/material/IconButton'; +import InputAdornment from '@mui/material/InputAdornment'; +import ToggleButton from '@mui/material/ToggleButton'; +import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; +import Slider from '@mui/material/Slider'; +import Snackbar from '@mui/material/Snackbar'; +import Alert from '@mui/material/Alert'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import DialogActions from '@mui/material/DialogActions'; +import FolderOpenIcon from '@mui/icons-material/FolderOpen'; +import VisibilityIcon from '@mui/icons-material/Visibility'; +import VisibilityOffIcon from '@mui/icons-material/VisibilityOff'; +import LightModeIcon from '@mui/icons-material/LightMode'; +import DarkModeIcon from '@mui/icons-material/DarkMode'; +import SaveIcon from '@mui/icons-material/Save'; +import CloseIcon from '@mui/icons-material/Close'; +import KeyboardIcon from '@mui/icons-material/Keyboard'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { updateSettings, closeSettingsModal, AppSettings } from '@/shared/state/settingsSlice'; +import { fetchModes } from '@/shared/state/modesSlice'; +import { useClaudeTokens, useThemeMode } from '@/shared/styles/ThemeContext'; +import DirectoryBrowser from '@/app/components/DirectoryBrowser'; + +const Settings: React.FC = () => { + const open = useAppSelector((s) => s.settings.modalOpen); + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const settings = useAppSelector((s) => s.settings.data); + const loaded = useAppSelector((s) => s.settings.loaded); + const modes = useAppSelector((s) => s.modes.items); + const { setMode: setThemeMode } = useThemeMode(); + + const modesList = useMemo(() => Object.values(modes), [modes]); + + const [form, setForm] = useState({ ...settings }); + const [showApiKey, setShowApiKey] = useState(false); + const [browseOpen, setBrowseOpen] = useState(false); + const [saved, setSaved] = useState(false); + const [recordingShortcut, setRecordingShortcut] = useState(false); + const [confirmDiscard, setConfirmDiscard] = useState(false); + + useEffect(() => { + dispatch(fetchModes()); + }, [dispatch]); + + useEffect(() => { + if (loaded) { + setForm({ ...settings }); + } + }, [loaded, settings]); + + const hasChanges = JSON.stringify(form) !== JSON.stringify(settings); + + const handleSave = async () => { + await dispatch(updateSettings(form)); + if (form.theme !== settings.theme) { + setThemeMode(form.theme); + } + setSaved(true); + }; + + const handleRequestClose = useCallback(() => { + if (hasChanges) { + setConfirmDiscard(true); + } else { + dispatch(closeSettingsModal()); + } + }, [hasChanges, dispatch]); + + const handleConfirmDiscard = useCallback(() => { + setConfirmDiscard(false); + setForm({ ...settings }); + dispatch(closeSettingsModal()); + }, [settings, dispatch]); + + const handleSaveAndClose = useCallback(async () => { + await dispatch(updateSettings(form)); + if (form.theme !== settings.theme) { + setThemeMode(form.theme); + } + setSaved(true); + setConfirmDiscard(false); + dispatch(closeSettingsModal()); + }, [dispatch, form, settings, setThemeMode]); + + const fieldSx = { + '& .MuiOutlinedInput-root': { + bgcolor: c.bg.page, + fontSize: '0.85rem', + }, + }; + + return ( + <> + + + + + Settings + + + Global defaults and application configuration. + + + + + + + + + + {/* Default System Prompt */} + + + Default System Prompt + + + A global system prompt prepended to every agent session, before any mode-specific instructions. + + setForm({ ...form, default_system_prompt: e.target.value || null })} + size="small" + fullWidth + multiline + minRows={3} + maxRows={10} + placeholder="Enter a default system prompt..." + sx={{ + ...fieldSx, + '& .MuiOutlinedInput-root': { + ...fieldSx['& .MuiOutlinedInput-root'], + fontFamily: c.font.mono, + fontSize: '0.8rem', + }, + '& textarea': { + '&::-webkit-scrollbar': { width: 5 }, + '&::-webkit-scrollbar-track': { background: 'transparent' }, + '&::-webkit-scrollbar-thumb': { background: c.border.medium, borderRadius: 3, '&:hover': { background: c.border.strong } }, + scrollbarWidth: 'thin', + scrollbarColor: `${c.border.medium} transparent`, + }, + }} + /> + + + {/* Default Folder */} + + + Default Folder + + + The working directory agents start in by default. Modes can override this per-mode. + + + setForm({ ...form, default_folder: e.target.value || null })} + size="small" + fullWidth + placeholder="Not set (uses project root)" + sx={{ + ...fieldSx, + '& .MuiOutlinedInput-root': { + ...fieldSx['& .MuiOutlinedInput-root'], + fontFamily: c.font.mono, + }, + }} + /> + + + + + {/* Default Model */} + + + Default Model + + + The default model for new agent sessions. + + + + + + + {/* Default Mode */} + + + Default Mode + + + The default interaction mode for new agent sessions. + + + + + + + {/* Default Max Turns */} + + + Default Max Turns + + + Maximum number of agent turns before auto-stopping. Leave empty for unlimited. + + setForm({ ...form, default_max_turns: e.target.value ? parseInt(e.target.value) : null })} + size="small" + fullWidth + placeholder="Unlimited" + inputProps={{ min: 1 }} + sx={fieldSx} + /> + + + {/* Zoom Sensitivity */} + + + Zoom Sensitivity + + + Controls how responsive scroll-to-zoom is on the dashboard canvas. Lower values suit trackpads; higher values suit mouse wheels. + + + setForm({ ...form, zoom_sensitivity: v as number })} + min={1} + max={100} + step={1} + valueLabelDisplay="auto" + marks={[ + { value: 1, label: 'Low' }, + { value: 50, label: 'Default' }, + { value: 100, label: 'High' }, + ]} + sx={{ + color: c.accent.primary, + '& .MuiSlider-markLabel': { color: c.text.tertiary, fontSize: '0.75rem' }, + '& .MuiSlider-valueLabel': { bgcolor: c.accent.primary }, + }} + /> + + + + {/* New Agent Shortcut */} + + + New Agent Shortcut + + + Keyboard shortcut to open the new agent input on the Dashboard. + + { + if (!recordingShortcut) return; + if (['Meta', 'Control', 'Shift', 'Alt'].includes(e.key)) return; + e.preventDefault(); + const parts: string[] = []; + if (e.metaKey) parts.push('Meta'); + if (e.ctrlKey) parts.push('Ctrl'); + if (e.altKey) parts.push('Alt'); + if (e.shiftKey) parts.push('Shift'); + parts.push(e.key.length === 1 ? e.key.toLowerCase() : e.key); + setForm({ ...form, new_agent_shortcut: parts.join('+') }); + setRecordingShortcut(false); + }} + onBlur={() => setRecordingShortcut(false)} + onClick={() => setRecordingShortcut(true)} + sx={{ + display: 'inline-flex', + alignItems: 'center', + gap: 1, + px: 2, + py: 1, + borderRadius: `${c.radius.md}px`, + border: `1px solid ${recordingShortcut ? c.accent.primary : c.border.medium}`, + bgcolor: c.bg.page, + cursor: 'pointer', + outline: 'none', + transition: 'border-color 0.15s', + '&:hover': { borderColor: c.accent.primary }, + }} + > + + {recordingShortcut ? ( + + Press shortcut… + + ) : ( + + {form.new_agent_shortcut + .split('+') + .map((p) => { + if (p === 'Meta') return '⌘'; + if (p === 'Ctrl') return 'Ctrl'; + if (p === 'Alt') return '⌥'; + if (p === 'Shift') return '⇧'; + return p.toUpperCase(); + }) + .join(' + ')} + + )} + + + + {/* Theme */} + + + Theme + + + Application color scheme. + + { if (v) setForm({ ...form, theme: v }); }} + size="small" + sx={{ + '& .MuiToggleButton-root': { + color: c.text.muted, + borderColor: c.border.medium, + textTransform: 'none', + px: 2.5, + gap: 0.75, + '&.Mui-selected': { + bgcolor: `${c.accent.primary}15`, + color: c.accent.primary, + borderColor: c.accent.primary, + '&:hover': { bgcolor: `${c.accent.primary}20` }, + }, + }, + }} + > + + Light + + + Dark + + + + + {/* Anthropic API Key */} + + + Anthropic API Key + + + Your API key for the Anthropic Claude API. Stored securely in the database. + + setForm({ ...form, anthropic_api_key: e.target.value || null })} + size="small" + fullWidth + placeholder="sk-ant-..." + sx={{ + ...fieldSx, + '& .MuiOutlinedInput-root': { + ...fieldSx['& .MuiOutlinedInput-root'], + fontFamily: c.font.mono, + }, + }} + InputProps={{ + endAdornment: ( + + setShowApiKey(!showApiKey)} + edge="end" + size="small" + sx={{ color: c.text.tertiary }} + > + {showApiKey ? : } + + + ), + }} + /> + + + + + + + + + + + setBrowseOpen(false)} + onSelect={(item) => setForm({ ...form, default_folder: item.path })} + initialPath={form.default_folder ?? ''} + /> + + setSaved(false)} + anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} + > + setSaved(false)} severity="success" sx={{ bgcolor: c.bg.surface, color: c.text.primary, border: `1px solid ${c.status.success}` }}> + Settings saved successfully + + + + + {/* Discard changes confirmation */} + setConfirmDiscard(false)} + PaperProps={{ + sx: { + bgcolor: c.bg.surface, + borderRadius: 3, + border: `1px solid ${c.border.subtle}`, + boxShadow: c.shadow.lg, + maxWidth: 400, + }, + }} + > + + Unsaved Changes + + + + You have unsaved changes. Would you like to save them before closing? + + + + + + + + + + ); +}; + +export default Settings; diff --git a/frontend/src/app/pages/Skills/SkillBuilderChat.tsx b/frontend/src/app/pages/Skills/SkillBuilderChat.tsx new file mode 100644 index 00000000..b4d962ab --- /dev/null +++ b/frontend/src/app/pages/Skills/SkillBuilderChat.tsx @@ -0,0 +1,401 @@ +import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import Button from '@mui/material/Button'; +import Tooltip from '@mui/material/Tooltip'; +import Fab from '@mui/material/Fab'; +import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh'; +import CloseIcon from '@mui/icons-material/Close'; +import MinimizeIcon from '@mui/icons-material/Remove'; +import SaveIcon from '@mui/icons-material/Save'; +import RestartAltIcon from '@mui/icons-material/RestartAlt'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { createDraftSession, removeDraftSession } from '@/shared/state/agentsSlice'; +import { createSkill } from '@/shared/state/skillsSlice'; +import AgentChat from '../AgentChat/AgentChat'; +import { ContextPath } from '@/app/components/DirectoryBrowser'; + +const SKILLS_WORKSPACE_API = `http://${window.location.hostname}:8324/api/skills`; +const POLL_INTERVAL_MS = 2000; + +export interface SkillPreviewData { + name: string; + description: string; + command: string; + content: string; +} + +interface SkillBuilderChatProps { + onSkillPreview: (data: SkillPreviewData | null) => void; + onSkillSaved: (message: string) => void; + expanded: boolean; + onExpandedChange: (expanded: boolean) => void; +} + +const MIN_W = 320; +const MAX_W = 700; +const MIN_H = 300; +const MAX_H = 900; + +const SkillBuilderChat: React.FC = ({ onSkillPreview, onSkillSaved, expanded, onExpandedChange }) => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + + const setExpanded = onExpandedChange; + const [panelWidth, setPanelWidth] = useState(420); + const [panelHeight, setPanelHeight] = useState(560); + const dragging = useRef<'left' | 'top' | 'corner' | null>(null); + const dragStartPos = useRef({ x: 0, y: 0 }); + const dragStartSize = useRef({ w: 0, h: 0 }); + + const onResizeStart = useCallback((edge: 'left' | 'top' | 'corner', e: React.PointerEvent) => { + dragging.current = edge; + dragStartPos.current = { x: e.clientX, y: e.clientY }; + dragStartSize.current = { w: panelWidth, h: panelHeight }; + (e.target as HTMLElement).setPointerCapture(e.pointerId); + document.body.style.cursor = edge === 'left' ? 'col-resize' : edge === 'top' ? 'row-resize' : 'nwse-resize'; + document.body.style.userSelect = 'none'; + }, [panelWidth, panelHeight]); + + const onResizeMove = useCallback((e: React.PointerEvent) => { + if (!dragging.current) return; + const dx = dragStartPos.current.x - e.clientX; + const dy = dragStartPos.current.y - e.clientY; + if (dragging.current === 'left' || dragging.current === 'corner') { + setPanelWidth(Math.min(MAX_W, Math.max(MIN_W, dragStartSize.current.w + dx))); + } + if (dragging.current === 'top' || dragging.current === 'corner') { + setPanelHeight(Math.min(MAX_H, Math.max(MIN_H, dragStartSize.current.h + dy))); + } + }, []); + + const onResizeEnd = useCallback(() => { + dragging.current = null; + document.body.style.cursor = ''; + document.body.style.userSelect = ''; + }, []); + + const [initialDraftId, setInitialDraftId] = useState(null); + const [workspacePath, setWorkspacePath] = useState(null); + const [stableWorkspaceId, setStableWorkspaceId] = useState(() => `skill-ws-${Date.now().toString(36)}`); + const draftCreated = useRef(false); + const [saving, setSaving] = useState(false); + const [currentPreview, setCurrentPreview] = useState(null); + + const effectiveSessionId = useAppSelector((state) => { + if (!initialDraftId) return null; + if (state.agents.sessions[initialDraftId]) return initialDraftId; + return state.agents.activeSessionId; + }); + + const agentStatus = useAppSelector((state) => { + if (!effectiveSessionId) return null; + return state.agents.sessions[effectiveSessionId]?.status ?? null; + }); + + const isAgentActive = agentStatus === 'running' || agentStatus === 'waiting_approval'; + + const initialContextPaths = useMemo( + () => workspacePath ? [{ path: workspacePath, type: 'directory' as const }] : undefined, + [workspacePath], + ); + + const initSession = useCallback(async () => { + const wsId = `skill-ws-${Date.now().toString(36)}`; + setStableWorkspaceId(wsId); + + try { + const res = await fetch(`${SKILLS_WORKSPACE_API}/workspace/seed`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ workspace_id: wsId }), + }); + const data = await res.json(); + setWorkspacePath(data.path); + const action = dispatch(createDraftSession({ + mode: 'skill-builder', + setActive: false, + targetDirectory: data.path, + })); + setInitialDraftId(action.payload.draftId); + } catch { + const action = dispatch(createDraftSession({ mode: 'skill-builder', setActive: false })); + setInitialDraftId(action.payload.draftId); + } + }, [dispatch]); + + useEffect(() => { + if (draftCreated.current) return; + draftCreated.current = true; + initSession(); + }, [initSession]); + + // Poll workspace for updates + const pollRef = useRef | null>(null); + const lastPollRef = useRef(''); + + const pollWorkspace = useCallback(async () => { + if (!stableWorkspaceId) return; + try { + const res = await fetch(`${SKILLS_WORKSPACE_API}/workspace/${stableWorkspaceId}`); + if (!res.ok) return; + const data = await res.json(); + const fingerprint = JSON.stringify(data); + if (fingerprint === lastPollRef.current) return; + lastPollRef.current = fingerprint; + + if (data.skill_content || data.meta) { + const meta = data.meta || {}; + const fm = data.frontmatter || {}; + const preview: SkillPreviewData = { + name: meta.name || fm.name || '', + description: meta.description || fm.description || '', + command: meta.command || (meta.name || fm.name || '').toLowerCase().replace(/\s+/g, '-'), + content: data.skill_content || '', + }; + setCurrentPreview(preview); + onSkillPreview(preview); + } + } catch { /* ignore polling errors */ } + }, [stableWorkspaceId, onSkillPreview]); + + useEffect(() => { + if (!expanded) return; + pollWorkspace(); + pollRef.current = setInterval(pollWorkspace, POLL_INTERVAL_MS); + return () => { + if (pollRef.current) clearInterval(pollRef.current); + }; + }, [expanded, pollWorkspace]); + + // Final poll when agent finishes + const prevAgentActive = useRef(false); + useEffect(() => { + if (prevAgentActive.current && !isAgentActive) { + setTimeout(pollWorkspace, 500); + } + prevAgentActive.current = isAgentActive; + }, [isAgentActive, pollWorkspace]); + + useEffect(() => { + return () => { + if (initialDraftId) { + dispatch(removeDraftSession(initialDraftId)); + } + }; + }, [initialDraftId, dispatch]); + + const handleSave = async () => { + if (!currentPreview || !currentPreview.name || !currentPreview.content) return; + setSaving(true); + try { + await dispatch(createSkill({ + name: currentPreview.name, + description: currentPreview.description, + content: currentPreview.content, + command: currentPreview.command, + })).unwrap(); + onSkillSaved(`Skill "${currentPreview.name}" saved successfully`); + } catch (err) { + console.error('Failed to save skill:', err); + } finally { + setSaving(false); + } + }; + + const handleReset = async () => { + if (initialDraftId) { + dispatch(removeDraftSession(initialDraftId)); + } + setCurrentPreview(null); + onSkillPreview(null); + lastPollRef.current = ''; + draftCreated.current = false; + + await initSession(); + draftCreated.current = true; + }; + + if (!expanded) { + return ( + + setExpanded(true)} + sx={{ + position: 'absolute', + bottom: 24, + right: 24, + bgcolor: c.accent.primary, + color: '#fff', + '&:hover': { bgcolor: c.accent.pressed }, + zIndex: 10, + width: 52, + height: 52, + boxShadow: c.shadow.lg, + }} + > + + + + ); + } + + return ( + + {/* Left resize handle */} + onResizeStart('left', e)} + onPointerMove={onResizeMove} + onPointerUp={onResizeEnd} + onPointerCancel={onResizeEnd} + sx={{ + position: 'absolute', left: 0, top: 12, bottom: 0, width: 6, + cursor: 'col-resize', zIndex: 2, + '&::after': { + content: '""', position: 'absolute', + top: 0, bottom: 0, left: 0, width: 2, + borderRadius: `${c.radius.lg}px 0 0 ${c.radius.lg}px`, + bgcolor: 'transparent', transition: 'background-color 0.15s', + }, + '&:hover::after, &:active::after': { bgcolor: c.accent.primary }, + }} + /> + {/* Top resize handle */} + onResizeStart('top', e)} + onPointerMove={onResizeMove} + onPointerUp={onResizeEnd} + onPointerCancel={onResizeEnd} + sx={{ + position: 'absolute', top: 0, left: 12, right: 0, height: 6, + cursor: 'row-resize', zIndex: 2, + '&::after': { + content: '""', position: 'absolute', + left: 0, right: 0, top: 0, height: 2, + borderRadius: `${c.radius.lg}px ${c.radius.lg}px 0 0`, + bgcolor: 'transparent', transition: 'background-color 0.15s', + }, + '&:hover::after, &:active::after': { bgcolor: c.accent.primary }, + }} + /> + {/* Top-left corner resize handle */} + onResizeStart('corner', e)} + onPointerMove={onResizeMove} + onPointerUp={onResizeEnd} + onPointerCancel={onResizeEnd} + sx={{ + position: 'absolute', top: 0, left: 0, width: 14, height: 14, + cursor: 'nwse-resize', zIndex: 3, + }} + /> + + {/* Header */} + + + + Skill Builder + + + {currentPreview && currentPreview.name && ( + + )} + + + + + + + + + setExpanded(false)} sx={{ color: c.text.tertiary, '&:hover': { color: c.text.primary } }}> + + + + + + { + setExpanded(false); + onSkillPreview(null); + }} + sx={{ color: c.text.tertiary, '&:hover': { color: c.status.error } }} + > + + + + + + {/* Chat area */} + + {effectiveSessionId ? ( + + ) : ( + + + Initializing skill builder... + + + )} + + + ); +}; + +export default SkillBuilderChat; diff --git a/frontend/src/app/pages/Skills/Skills.tsx b/frontend/src/app/pages/Skills/Skills.tsx new file mode 100644 index 00000000..7424cac5 --- /dev/null +++ b/frontend/src/app/pages/Skills/Skills.tsx @@ -0,0 +1,759 @@ +import React, { useEffect, useState, useMemo, useCallback } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Button from '@mui/material/Button'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import DialogActions from '@mui/material/DialogActions'; +import TextField from '@mui/material/TextField'; +import IconButton from '@mui/material/IconButton'; +import Chip from '@mui/material/Chip'; +import CircularProgress from '@mui/material/CircularProgress'; +import Tooltip from '@mui/material/Tooltip'; +import Collapse from '@mui/material/Collapse'; +import Snackbar from '@mui/material/Snackbar'; +import Alert from '@mui/material/Alert'; +import InputAdornment from '@mui/material/InputAdornment'; +import ToggleButton from '@mui/material/ToggleButton'; +import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; +import AddIcon from '@mui/icons-material/Add'; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/Delete'; +import TerminalIcon from '@mui/icons-material/Terminal'; +import DescriptionIcon from '@mui/icons-material/Description'; +import SearchIcon from '@mui/icons-material/Search'; +import DownloadIcon from '@mui/icons-material/Download'; +import OpenInNewIcon from '@mui/icons-material/OpenInNew'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import FolderIcon from '@mui/icons-material/Folder'; +import MoreHorizIcon from '@mui/icons-material/MoreHoriz'; +import CodeIcon from '@mui/icons-material/Code'; +import VisibilityIcon from '@mui/icons-material/Visibility'; +import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh'; +import ReactMarkdown from 'react-markdown'; +import remarkGfm from 'remark-gfm'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { + fetchSkills, + createSkill, + updateSkill, + deleteSkill, + Skill, +} from '@/shared/state/skillsSlice'; +import { + fetchAllRegistrySkills, + fetchSkillRegistryStats, + fetchSkillDetail, + RegistrySkill, + RegistrySkillDetail, +} from '@/shared/state/skillRegistrySlice'; +import SkillBuilderChat, { SkillPreviewData } from './SkillBuilderChat'; + +interface SkillForm { + name: string; + description: string; + content: string; + command: string; +} + +type Selection = + | { type: 'registry'; name: string } + | { type: 'local'; id: string } + | { type: 'builder-preview' } + | null; + +const emptyForm: SkillForm = { name: '', description: '', content: '', command: '' }; + +const SIDEBAR_W = 260; + +const Skills: React.FC = () => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const { items, loading } = useAppSelector((s) => s.skills); + const { + skills: regSkills, + loading: regLoading, + stats: regStats, + detail: regDetail, + detailLoading: regDetailLoading, + } = useAppSelector((s) => s.skillRegistry); + const localSkills = Object.values(items); + + const [selection, setSelection] = useState(null); + const [searchFilter, setSearchFilter] = useState(''); + const [collapsedCats, setCollapsedCats] = useState>({}); + + const [contentView, setContentView] = useState<'preview' | 'raw'>('preview'); + const [dialogOpen, setDialogOpen] = useState(false); + const [editingId, setEditingId] = useState(null); + const [form, setForm] = useState(emptyForm); + const [snackbar, setSnackbar] = useState<{ open: boolean; message: string }>({ open: false, message: '' }); + const [builderPreview, setBuilderPreview] = useState(null); + const [builderOpen, setBuilderOpen] = useState(false); + + const handleBuilderPreview = useCallback((data: SkillPreviewData | null) => { + setBuilderPreview(data); + if (data) { + setSelection({ type: 'builder-preview' }); + } else if (selection?.type === 'builder-preview') { + setSelection(null); + } + }, [selection]); + + const handleBuilderSaved = useCallback((message: string) => { + setSnackbar({ open: true, message }); + dispatch(fetchSkills()); + }, [dispatch]); + + useEffect(() => { + dispatch(fetchSkills()); + dispatch(fetchSkillRegistryStats()); + dispatch(fetchAllRegistrySkills()); + }, [dispatch]); + + // Group registry skills by category + const regGrouped = useMemo(() => { + const groups: Record = {}; + const q = searchFilter.toLowerCase(); + for (const sk of regSkills) { + if (q && !sk.name.toLowerCase().includes(q) && !sk.description.toLowerCase().includes(q)) continue; + const cat = sk.category || 'General'; + if (!groups[cat]) groups[cat] = []; + groups[cat].push(sk); + } + return groups; + }, [regSkills, searchFilter]); + + const filteredLocal = useMemo(() => { + const q = searchFilter.toLowerCase(); + if (!q) return localSkills; + return localSkills.filter((s) => s.name.toLowerCase().includes(q) || s.description.toLowerCase().includes(q)); + }, [localSkills, searchFilter]); + + const categoryOrder = useMemo(() => Object.keys(regGrouped).sort(), [regGrouped]); + + const toggleCategory = (cat: string) => + setCollapsedCats((p) => ({ ...p, [cat]: !p[cat] })); + + // Selection handlers + const selectRegistry = (name: string) => { + setSelection({ type: 'registry', name }); + dispatch(fetchSkillDetail(name)); + }; + + const selectLocal = (id: string) => { + setSelection({ type: 'local', id }); + }; + + // Get active detail content + const selectedLocal: Skill | null = + selection?.type === 'local' ? items[selection.id] ?? null : null; + const selectedReg: RegistrySkillDetail | null = + selection?.type === 'registry' && regDetail?.name === selection.name ? regDetail : null; + + // CRUD + const openCreate = () => { + setEditingId(null); + setForm(emptyForm); + setDialogOpen(true); + }; + + const openEdit = (skill: Skill) => { + setEditingId(skill.id); + setForm({ name: skill.name, description: skill.description, content: skill.content, command: skill.command }); + setDialogOpen(true); + }; + + const handleSave = async () => { + if (editingId) { + await dispatch(updateSkill({ id: editingId, ...form })); + } else { + await dispatch(createSkill(form)); + } + setDialogOpen(false); + }; + + const handleDelete = async (id: string) => { + await dispatch(deleteSkill(id)); + if (selection?.type === 'local' && selection.id === id) setSelection(null); + }; + + const handleInstall = async () => { + if (!selectedReg) return; + await dispatch(createSkill({ + name: selectedReg.name, + description: selectedReg.description, + content: selectedReg.content, + command: selectedReg.name.toLowerCase().replace(/\s+/g, '-'), + })); + setSnackbar({ open: true, message: `Installed "${selectedReg.name}" as a local skill` }); + }; + + const handleEditInstall = () => { + if (!selectedReg) return; + setEditingId(null); + setForm({ + name: selectedReg.name, + description: selectedReg.description, + content: selectedReg.content, + command: selectedReg.name.toLowerCase().replace(/\s+/g, '-'), + }); + setDialogOpen(true); + }; + + const isSelected = (type: 'registry' | 'local', key: string) => { + if (!selection) return false; + if (type === 'registry') return selection.type === 'registry' && selection.name === key; + return selection.type === 'local' && selection.id === key; + }; + + // ─── Content preview with raw/preview toggle ─── + const ContentPreview: React.FC<{ content: string }> = ({ content }) => ( + + + { if (v) setContentView(v); }} + size="small" + sx={{ + '& .MuiToggleButton-root': { + color: c.text.tertiary, border: `1px solid ${c.border.medium}`, + textTransform: 'none', fontSize: '0.74rem', py: 0.25, px: 1.2, lineHeight: 1.4, + '&.Mui-selected': { bgcolor: c.bg.secondary, color: c.text.primary, borderColor: c.border.strong }, + '&:hover': { bgcolor: 'rgba(0,0,0,0.03)' }, + }, + }} + > + Preview + Raw + + + + {contentView === 'raw' ? ( + + + {content} + + + ) : ( + + {content} + + )} + + ); + + // ─── Sidebar row component ─── + const SidebarRow: React.FC<{ + label: string; + selected: boolean; + onClick: () => void; + icon?: React.ReactNode; + }> = ({ label, selected, onClick, icon }) => ( + + {icon ?? } + + {label} + + + ); + + return ( + + {/* ─── Left Sidebar ─── */} + + {/* Sidebar header */} + + Skills + + + setSearchFilter((p) => (p === '' ? ' ' : ''))} + sx={{ color: c.text.tertiary, '&:hover': { color: c.text.primary } }} + > + + + + + + + + + + + + + + + {/* Search input (toggled) */} + + + setSearchFilter(e.target.value)} + fullWidth + size="small" + autoFocus + InputProps={{ + startAdornment: ( + + + + ), + }} + sx={{ + '& .MuiOutlinedInput-root': { + bgcolor: c.bg.surface, borderRadius: `${c.radius.sm}px`, fontSize: '0.82rem', + '& fieldset': { borderColor: c.border.medium }, + }, + }} + /> + + + + {/* Scrollable tree */} + + {/* My Skills (local) */} + {filteredLocal.length > 0 && ( + + toggleCategory('__local')} + sx={{ + display: 'flex', alignItems: 'center', gap: 0.5, px: 1, py: 0.5, + cursor: 'pointer', userSelect: 'none', + '&:hover': { bgcolor: 'rgba(0,0,0,0.02)' }, borderRadius: `${c.radius.sm}px`, + }} + > + {collapsedCats['__local'] + ? + : } + + My Skills + + ({filteredLocal.length}) + + + + {filteredLocal.map((sk) => ( + selectLocal(sk.id)} + icon={} + /> + ))} + + + + )} + + {/* Registry categories */} + {(loading || regLoading) && regSkills.length === 0 && localSkills.length === 0 ? ( + + + + ) : ( + categoryOrder.map((cat) => { + const group = regGrouped[cat]; + if (!group || group.length === 0) return null; + const isCollapsed = !!collapsedCats[cat]; + return ( + + toggleCategory(cat)} + sx={{ + display: 'flex', alignItems: 'center', gap: 0.5, px: 1, py: 0.5, + cursor: 'pointer', userSelect: 'none', + '&:hover': { bgcolor: 'rgba(0,0,0,0.02)' }, borderRadius: `${c.radius.sm}px`, + }} + > + {isCollapsed + ? + : } + + {cat} + + ({group.length}) + + + + {group.map((sk) => ( + selectRegistry(sk.name)} + /> + ))} + + + + ); + }) + )} + + + + {/* ─── Right Detail Panel ─── */} + + {selection?.type === 'builder-preview' && builderPreview ? ( + + + + + {builderPreview.name || 'Untitled Skill'} + + + + + + {builderPreview.command && ( + + } + label={`/${builderPreview.command}`} + size="small" + sx={{ + bgcolor: 'rgba(174,86,48,0.08)', color: c.accent.primary, + fontWeight: 500, fontSize: '0.78rem', height: 26, + }} + /> + + )} + + + + Generated by Skill Builder + + + + {builderPreview.description && ( + + Description + + {builderPreview.description} + + + )} + + + + ) : !selection ? ( + + + Select a skill to view its details + + ) : selection.type === 'registry' ? ( + regDetailLoading && !selectedReg ? ( + + + + ) : selectedReg ? ( + + {/* Header row: name + actions */} + + + {selectedReg.name} + + + + + {selectedReg.repositoryUrl && ( + + + + + + )} + + + + + Added by Anthropic + + + + Description + + {selectedReg.description} + + + + + + ) : null + ) : selectedLocal ? ( + + {/* Header row: name + actions */} + + + {selectedLocal.name} + + + + openEdit(selectedLocal)} sx={{ color: c.text.tertiary, '&:hover': { color: c.accent.primary } }}> + + + + + handleDelete(selectedLocal.id)} sx={{ color: c.text.tertiary, '&:hover': { color: c.status.error } }}> + + + + + + + {selectedLocal.command && ( + + } + label={`/${selectedLocal.command}`} + size="small" + sx={{ + bgcolor: 'rgba(174,86,48,0.08)', color: c.accent.primary, + fontWeight: 500, fontSize: '0.78rem', height: 26, + }} + /> + + )} + + + Added by You + + + {selectedLocal.description && ( + + Description + + {selectedLocal.description} + + + )} + + + + ) : null} + + + {/* ─── Create/Edit Dialog ─── */} + setDialogOpen(false)} + maxWidth="md" + fullWidth + PaperProps={{ + sx: { bgcolor: c.bg.surface, backgroundImage: 'none', borderRadius: `${c.radius.lg}px`, border: `${c.border.width} solid ${c.border.subtle}`, boxShadow: c.shadow.lg }, + }} + > + + {editingId ? 'Edit Skill' : 'New Skill'} + + + setForm({ ...form, name: e.target.value })} + fullWidth + size="small" + sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.secondary } }} + /> + setForm({ ...form, description: e.target.value })} + fullWidth + size="small" + sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.secondary } }} + /> + setForm({ ...form, command: e.target.value })} + fullWidth + size="small" + placeholder="e.g. my-skill" + sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.secondary } }} + /> + setForm({ ...form, content: e.target.value })} + fullWidth + multiline + minRows={12} + maxRows={24} + sx={{ + '& .MuiOutlinedInput-root': { + bgcolor: c.bg.secondary, fontFamily: c.font.mono, fontSize: '0.85rem', + }, + }} + /> + + + + + + + + {/* ─── Skill Builder Chat ─── */} + + + {/* ─── Snackbar ─── */} + setSnackbar({ open: false, message: '' })} + anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} + > + setSnackbar({ open: false, message: '' })} + severity="success" + sx={{ bgcolor: c.status.successBg, color: c.status.success, border: `1px solid rgba(38,91,25,0.25)` }} + > + {snackbar.message} + + + + ); +}; + +export default Skills; diff --git a/frontend/src/app/pages/Templates/Templates.tsx b/frontend/src/app/pages/Templates/Templates.tsx new file mode 100644 index 00000000..15e60e0a --- /dev/null +++ b/frontend/src/app/pages/Templates/Templates.tsx @@ -0,0 +1,474 @@ +import React, { useEffect, useState } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Button from '@mui/material/Button'; +import IconButton from '@mui/material/IconButton'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import DialogActions from '@mui/material/DialogActions'; +import TextField from '@mui/material/TextField'; +import MenuItem from '@mui/material/MenuItem'; +import Chip from '@mui/material/Chip'; +import CircularProgress from '@mui/material/CircularProgress'; +import AddIcon from '@mui/icons-material/Add'; +import DeleteIcon from '@mui/icons-material/Delete'; +import EditIcon from '@mui/icons-material/Edit'; +import RemoveCircleOutlineIcon from '@mui/icons-material/RemoveCircleOutline'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { + fetchTemplates, + createTemplate, + updateTemplate, + deleteTemplate, + PromptTemplate, + TemplateField, +} from '@/shared/state/templatesSlice'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +const FIELD_TYPES = ['str', 'int', 'float', 'select', 'multi-select', 'literal'] as const; + +interface EditorState { + name: string; + description: string; + template: string; + fields: TemplateField[]; + tags: string[]; +} + +const emptyEditor: EditorState = { + name: '', + description: '', + template: '', + fields: [], + tags: [], +}; + +const Templates: React.FC = () => { + const c = useClaudeTokens(); + + const inputSx = { + '& .MuiOutlinedInput-root': { + color: c.text.primary, + '& fieldset': { borderColor: c.border.strong }, + '&:hover fieldset': { borderColor: c.text.tertiary }, + '&.Mui-focused fieldset': { borderColor: c.accent.primary }, + }, + '& .MuiInputLabel-root': { color: c.text.tertiary }, + '& .MuiInputLabel-root.Mui-focused': { color: c.accent.primary }, + }; + + const claudePaperProps = { + sx: { + bgcolor: c.bg.surface, + color: c.text.primary, + borderRadius: 4, + border: `1px solid ${c.border.subtle}`, + maxHeight: '90vh', + }, + }; + + const dispatch = useAppDispatch(); + const { items, loading } = useAppSelector((s) => s.templates); + const templates = Object.values(items); + + const [editorOpen, setEditorOpen] = useState(false); + const [editingId, setEditingId] = useState(null); + const [editor, setEditor] = useState(emptyEditor); + const [tagInput, setTagInput] = useState(''); + + useEffect(() => { + dispatch(fetchTemplates()); + }, [dispatch]); + + const openNew = () => { + setEditingId(null); + setEditor(emptyEditor); + setTagInput(''); + setEditorOpen(true); + }; + + const openEdit = (t: PromptTemplate) => { + setEditingId(t.id); + setEditor({ + name: t.name, + description: t.description, + template: t.template, + fields: t.fields.map((f) => ({ ...f })), + tags: [...t.tags], + }); + setTagInput(''); + setEditorOpen(true); + }; + + const handleSave = async () => { + if (!editor.name.trim() || !editor.template.trim()) return; + if (editingId) { + await dispatch(updateTemplate({ id: editingId, ...editor })); + } else { + await dispatch(createTemplate(editor)); + } + setEditorOpen(false); + }; + + const handleDelete = async (id: string) => { + await dispatch(deleteTemplate(id)); + }; + + const addField = () => { + setEditor((prev) => ({ + ...prev, + fields: [...prev.fields, { name: '', type: 'str', required: true }], + })); + }; + + const updateField = (idx: number, patch: Partial) => { + setEditor((prev) => ({ + ...prev, + fields: prev.fields.map((f, i) => (i === idx ? { ...f, ...patch } : f)), + })); + }; + + const removeField = (idx: number) => { + setEditor((prev) => ({ + ...prev, + fields: prev.fields.filter((_, i) => i !== idx), + })); + }; + + const addTag = () => { + const tag = tagInput.trim(); + if (tag && !editor.tags.includes(tag)) { + setEditor((prev) => ({ ...prev, tags: [...prev.tags, tag] })); + setTagInput(''); + } + }; + + const removeTag = (tag: string) => { + setEditor((prev) => ({ ...prev, tags: prev.tags.filter((t) => t !== tag) })); + }; + + return ( + + + + + Prompt Templates + + + Create and manage reusable prompt templates with structured input fields. + + + + + + {loading ? ( + + + + ) : templates.length === 0 ? ( + + No templates yet + Click "New Template" to get started. + + ) : ( + + {templates.map((t) => ( + openEdit(t)} + > + + + {t.name} + + + { e.stopPropagation(); openEdit(t); }} + sx={{ color: c.text.tertiary, '&:hover': { color: c.accent.primary } }} + > + + + { e.stopPropagation(); handleDelete(t.id); }} + sx={{ color: c.text.tertiary, '&:hover': { color: c.status.error } }} + > + + + + + {t.description && ( + + {t.description} + + )} + + + {t.tags.map((tag) => ( + + ))} + + + ))} + + )} + + {/* Editor Dialog */} + setEditorOpen(false)} + maxWidth="md" + fullWidth + PaperProps={claudePaperProps} + > + + {editingId ? 'Edit Template' : 'New Template'} + + + setEditor((p) => ({ ...p, name: e.target.value }))} + fullWidth + size="small" + sx={inputSx} + /> + setEditor((p) => ({ ...p, description: e.target.value }))} + fullWidth + size="small" + multiline + rows={2} + sx={inputSx} + /> + setEditor((p) => ({ ...p, template: e.target.value }))} + fullWidth + size="small" + multiline + rows={5} + sx={{ + ...inputSx, + '& .MuiOutlinedInput-root': { + ...inputSx['& .MuiOutlinedInput-root'], + fontFamily: c.font.mono, + fontSize: '0.85rem', + }, + }} + /> + + {/* Fields */} + + + + Fields + + + + {editor.fields.map((field, idx) => ( + + updateField(idx, { name: e.target.value })} + size="small" + sx={{ ...inputSx, flex: 1 }} + /> + updateField(idx, { type: e.target.value as TemplateField['type'] })} + size="small" + sx={{ ...inputSx, minWidth: 130 }} + SelectProps={{ MenuProps: { PaperProps: { sx: { bgcolor: c.bg.surface, color: c.text.primary } } } }} + > + {FIELD_TYPES.map((ft) => ( + {ft} + ))} + + {(field.type === 'select' || field.type === 'multi-select') && ( + + updateField(idx, { + options: e.target.value.split(',').map((s) => s.trim()).filter(Boolean), + }) + } + size="small" + sx={{ ...inputSx, flex: 1 }} + /> + )} + updateField(idx, { default: e.target.value || undefined })} + size="small" + sx={{ ...inputSx, flex: 0.7 }} + /> + removeField(idx)} + sx={{ color: c.text.tertiary, mt: 0.5, '&:hover': { color: c.status.error } }} + > + + + + ))} + + + {/* Tags */} + + + Tags + + + {editor.tags.map((tag) => ( + removeTag(tag)} + sx={{ + bgcolor: c.bg.secondary, + color: c.text.muted, + '& .MuiChip-deleteIcon': { color: c.text.tertiary, '&:hover': { color: c.status.error } }, + }} + /> + ))} + setTagInput(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter') { + e.preventDefault(); + addTag(); + } + }} + size="small" + sx={{ ...inputSx, width: 140 }} + /> + + + + + + + + + + ); +}; + +export default Templates; diff --git a/frontend/src/app/pages/Tools/Tools.tsx b/frontend/src/app/pages/Tools/Tools.tsx new file mode 100644 index 00000000..b7834bfb --- /dev/null +++ b/frontend/src/app/pages/Tools/Tools.tsx @@ -0,0 +1,1761 @@ +import React, { useEffect, useState, useMemo, useCallback, useRef } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Button from '@mui/material/Button'; +import Card from '@mui/material/Card'; +import CardContent from '@mui/material/CardContent'; +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import DialogActions from '@mui/material/DialogActions'; +import TextField from '@mui/material/TextField'; +import MenuItem from '@mui/material/MenuItem'; +import Select from '@mui/material/Select'; +import FormControl from '@mui/material/FormControl'; +import InputLabel from '@mui/material/InputLabel'; +import IconButton from '@mui/material/IconButton'; +import Chip from '@mui/material/Chip'; +import CircularProgress from '@mui/material/CircularProgress'; +import Tooltip from '@mui/material/Tooltip'; +import Collapse from '@mui/material/Collapse'; +import Menu from '@mui/material/Menu'; +import Snackbar from '@mui/material/Snackbar'; +import Alert from '@mui/material/Alert'; +import InputAdornment from '@mui/material/InputAdornment'; +import Avatar from '@mui/material/Avatar'; +import Switch from '@mui/material/Switch'; +import AddIcon from '@mui/icons-material/Add'; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/Delete'; +import TerminalIcon from '@mui/icons-material/Terminal'; +import BuildIcon from '@mui/icons-material/Build'; +import ExtensionIcon from '@mui/icons-material/Extension'; +import DescriptionIcon from '@mui/icons-material/Description'; +import SearchIcon from '@mui/icons-material/Search'; +import QuestionAnswerIcon from '@mui/icons-material/QuestionAnswer'; +import LockIcon from '@mui/icons-material/Lock'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +import ScheduleIcon from '@mui/icons-material/Schedule'; +import MapIcon from '@mui/icons-material/Map'; +import HourglassEmptyIcon from '@mui/icons-material/HourglassEmpty'; +import StorefrontIcon from '@mui/icons-material/Storefront'; +import OpenInNewIcon from '@mui/icons-material/OpenInNew'; +import DownloadIcon from '@mui/icons-material/Download'; +import StarIcon from '@mui/icons-material/Star'; +import SortIcon from '@mui/icons-material/Sort'; +import CloudIcon from '@mui/icons-material/Cloud'; +import PublicIcon from '@mui/icons-material/Public'; +import ToggleButton from '@mui/material/ToggleButton'; +import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import LinkIcon from '@mui/icons-material/Link'; +import CheckCircleIcon from '@mui/icons-material/CheckCircle'; +import SettingsIcon from '@mui/icons-material/Settings'; +import BlockIcon from '@mui/icons-material/Block'; +import VisibilityIcon from '@mui/icons-material/Visibility'; +import SecurityIcon from '@mui/icons-material/Security'; +import PanToolIcon from '@mui/icons-material/PanTool'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import { + fetchTools, + fetchBuiltinTools, + fetchBuiltinPermissions, + updateBuiltinPermissions, + createTool, + updateTool, + deleteTool, + startOAuth, + fetchToolStatus, + discoverTools, + ToolDefinition, + BuiltinTool, +} from '@/shared/state/toolsSlice'; +import { + searchRegistry, + fetchRegistryStats, + McpServer, +} from '@/shared/state/mcpRegistrySlice'; +import { + fetchOutputs, + updateOutput, + Output, +} from '@/shared/state/outputsSlice'; + +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import ViewQuiltIcon from '@mui/icons-material/ViewQuilt'; + +interface CredentialField { + key: string; + label: string; + placeholder: string; + helpText?: string; +} + +interface Integration { + id: string; + name: string; + description: string; + mcp_config: Record; + color: string; + website: string; + icon: React.ReactNode; + credentialFields?: CredentialField[]; + connectLabel?: string; + connectInstructions?: string; + authType?: 'none' | 'oauth2' | 'env_vars'; +} + +const INTEGRATIONS: Integration[] = [ + { + id: 'xbird', + name: 'xbird', + description: 'Twitter/X research — search tweets, read profiles, threads, timelines.', + mcp_config: { type: 'stdio', command: 'bunx', args: ['@checkra1n/xbird'] }, + color: '#1DA1F2', + website: 'https://xbird.dev', + icon: '𝕏', + connectLabel: 'Connect 𝕏', + connectInstructions: 'Open x.com in your browser, press F12 → Application → Cookies → x.com, and copy the values for auth_token and ct0.', + credentialFields: [ + { key: 'TWITTER_AUTH_TOKEN', label: 'auth_token', placeholder: 'Paste auth_token cookie value' }, + { key: 'TWITTER_CT0', label: 'ct0', placeholder: 'Paste ct0 cookie value' }, + ], + }, + { + id: 'reddit', + name: 'Reddit', + description: 'Browse subreddits, search posts, get post details, analyze users. No API keys required.', + mcp_config: { type: 'stdio', command: 'npx', args: ['-y', 'reddit-mcp-buddy'] }, + color: '#FF4500', + website: 'https://github.com/karanb192/reddit-mcp-buddy', + icon: ( + + + + + ), + }, + { + id: 'google-workspace', + name: 'Google Workspace', + description: 'Including Google Docs, Sheets, Slides, Calendar, and Gmail. (Gemini CLI extension)', + mcp_config: { type: 'stdio', command: 'uvx', args: ['--from', 'google-workspace-mcp', 'google-workspace-worker'] }, + color: '#4285F4', + website: 'https://developers.google.com/gemini-api/docs/mcp', + icon: ( + + + + + + + ), + authType: 'oauth2', + }, +]; + +const CATEGORY_ORDER = ['filesystem', 'system', 'search', 'interaction', 'planning', 'scheduling']; + +interface ToolForm { + name: string; + description: string; + command: string; +} + +const emptyForm: ToolForm = { + name: '', + description: '', + command: '', +}; + +function cleanServerName(name: string): string { + const parts = name.split('/'); + return parts[parts.length - 1]; +} + +function serverToToolForm(srv: McpServer): ToolForm { + return { + name: srv.title || cleanServerName(srv.name), + description: srv.description, + command: '', + }; +} + +function serverToMcpConfig(srv: McpServer): Record { + if (srv.remoteUrl) { + return { type: srv.remoteType === 'sse' ? 'sse' : 'http', url: srv.remoteUrl }; + } + if (srv.repositoryUrl && srv.repositoryUrl.includes('github.com')) { + const match = srv.repositoryUrl.match(/github\.com\/([^/]+\/[^/]+?)(?:\.git)?(?:\/|$)/); + if (match) { + return { type: 'stdio', command: 'npx', args: ['-y', `github:${match[1]}`] }; + } + } + return {}; +} + +// --------------------------------------------------------------------------- +// ToolSection (reusable for Core / Extended built-in tool groups) +// --------------------------------------------------------------------------- + +interface ToolSectionProps { + label: string; + icon: React.ReactElement; + count: number; + open: boolean; + onToggle: () => void; + grouped: Record; + collapsedCategories: Record; + toggleCategory: (cat: string) => void; + expandedBuiltin: string | null; + toggleBuiltinExpand: (name: string) => void; + deferred?: boolean; + builtinPermissions: Record; + onPermissionChange: (toolName: string, policy: string) => void; + onCategoryPermissionChange: (toolNames: string[], policy: string) => void; + enabled: boolean; + onEnabledChange: (enabled: boolean) => void; +} + +const ToolSection: React.FC = ({ + label, icon, count, open, onToggle, + grouped, collapsedCategories, toggleCategory, + expandedBuiltin, toggleBuiltinExpand, deferred, + builtinPermissions, onPermissionChange, onCategoryPermissionChange, + enabled, onEnabledChange, +}) => { + const c = useClaudeTokens(); + + const CATEGORY_META: Record = { + filesystem: { label: 'Filesystem', color: c.status.success, icon: }, + system: { label: 'System', color: c.status.warning, icon: }, + search: { label: 'Search', color: '#3b82f6', icon: }, + interaction: { label: 'Interaction', color: '#a855f7', icon: }, + planning: { label: 'Planning', color: '#ec4899', icon: }, + scheduling: { label: 'Scheduling', color: '#14b8a6', icon: }, + }; + + const PermToggle = ({ value, onChange, size = 16 }: { value: string; onChange: (v: string) => void; size?: number }) => ( + e.stopPropagation()}> + onChange('always_allow')} sx={{ p: 0.4, borderRadius: 1, bgcolor: value === 'always_allow' ? `${c.status.success}20` : 'transparent', color: value === 'always_allow' ? c.status.success : c.text.ghost, '&:hover': { bgcolor: `${c.status.success}15`, color: c.status.success } }}> + onChange('ask')} sx={{ p: 0.4, borderRadius: 1, bgcolor: value === 'ask' ? `${c.status.warning}20` : 'transparent', color: value === 'ask' ? c.status.warning : c.text.ghost, '&:hover': { bgcolor: `${c.status.warning}15`, color: c.status.warning } }}> + onChange('deny')} sx={{ p: 0.4, borderRadius: 1, bgcolor: value === 'deny' ? `${c.status.error}20` : 'transparent', color: value === 'deny' ? c.status.error : c.text.ghost, '&:hover': { bgcolor: `${c.status.error}15`, color: c.status.error } }}> + + ); + + const getCatGroupPolicy = (tools: BuiltinTool[]) => { + const policies = tools.map((t) => builtinPermissions[t.name] || 'always_allow'); + if (policies.every((p) => p === 'always_allow')) return 'always_allow'; + if (policies.every((p) => p === 'deny')) return 'deny'; + if (policies.every((p) => p === 'ask')) return 'ask'; + return 'mixed'; + }; + + const allSectionTools = CATEGORY_ORDER.filter((cat) => grouped[cat]).flatMap((cat) => grouped[cat]); + const overallPolicy = getCatGroupPolicy(allSectionTools); + const categoryCount = CATEGORY_ORDER.filter((cat) => grouped[cat]).length; + const sectionDescription = deferred + ? 'On-demand tools loaded via ToolSearch for planning, scheduling, and extended operations' + : 'Built-in Claude Agent SDK tools for file operations, shell commands, and search'; + + const firstSentence = (desc: string) => { + if (!desc) return ''; + const match = desc.match(/^(.+?(?:\.|$))/); + return match ? match[1].trim() : desc.substring(0, 100); + }; + + return ( + + + enabled && onToggle()} + sx={{ display: 'flex', alignItems: 'center', gap: 2, cursor: enabled ? 'pointer' : 'default' }} + > + + {icon} + + + + {label} + + {deferred && ( + + )} + + {sectionDescription} + + e.stopPropagation()}> + onEnabledChange(checked)} + sx={{ + '& .MuiSwitch-switchBase.Mui-checked': { color: c.accent.primary }, + '& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track': { bgcolor: c.accent.primary }, + }} + /> + + {enabled && ( + + + + )} + + + + + + + + Tool Permissions + + + + + {CATEGORY_ORDER.filter((cat) => grouped[cat]).map((cat) => { + const meta = CATEGORY_META[cat] || CATEGORY_META.filesystem; + const catTools = grouped[cat]; + const colKey = `${deferred ? 'd_' : ''}${cat}`; + const isOpen = !collapsedCategories[colKey]; + const catPolicy = getCatGroupPolicy(catTools); + return ( + + toggleCategory(colKey)} + > + + + {meta.label} + + + onCategoryPermissionChange(catTools.map((t) => t.name), v)} /> + + + + {catTools.map((bt) => { + const toolPolicy = builtinPermissions[bt.name] || 'always_allow'; + return ( + + + {bt.name} + {bt.description && {firstSentence(bt.description)}} + + onPermissionChange(bt.name, v)} size={14} /> + + ); + })} + + + + ); + })} + + + + + ); +}; + +// --------------------------------------------------------------------------- +// Main Tools Page +// --------------------------------------------------------------------------- + +const Tools: React.FC = () => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const { items, builtinTools, builtinPermissions, loading } = useAppSelector((s) => s.tools); + const { servers: regServers, total: regTotal, loading: regLoading, stats: regStats } = useAppSelector((s) => s.mcpRegistry); + const outputItems = useAppSelector((s) => s.outputs.items); + const outputs = useMemo(() => Object.values(outputItems), [outputItems]); + const allTools = Object.values(items); + const tools = allTools; + const uninstalledIntegrations = useMemo(() => INTEGRATIONS.filter((ig) => !allTools.find((t) => t.name === ig.name)), [allTools]); + const getIntegrationForTool = useCallback((tool: ToolDefinition) => INTEGRATIONS.find((ig) => ig.name === tool.name), []); + + const [dialogOpen, setDialogOpen] = useState(false); + const [editingId, setEditingId] = useState(null); + const [form, setForm] = useState(emptyForm); + + const [collapsedCategories, setCollapsedCategories] = useState>( + Object.fromEntries([ + ...CATEGORY_ORDER.map((cat) => [cat, true]), + ...CATEGORY_ORDER.map((cat) => [`d_${cat}`, true]), + ]), + ); + const [expandedBuiltin, setExpandedBuiltin] = useState(null); + const [coreSectionOpen, setCoreSectionOpen] = useState(false); + const [deferredSectionOpen, setDeferredSectionOpen] = useState(false); + const [customSectionOpen, setCustomSectionOpen] = useState(true); + + // Dropdown menu + const [menuAnchor, setMenuAnchor] = useState(null); + + // Registry browser + const [registryOpen, setRegistryOpen] = useState(false); + const [regQuery, setRegQuery] = useState(''); + const [regSort, setRegSort] = useState<'name' | 'stars'>('name'); + const [regSource, setRegSource] = useState<'' | 'community' | 'google'>(''); + const [expandedServer, setExpandedServer] = useState(null); + const [snackbar, setSnackbar] = useState<{ open: boolean; message: string; severity?: 'success' | 'error' }>({ open: false, message: '' }); + const debounceRef = useRef | null>(null); + + // MCP config dialog state + const [mcpConfigOpen, setMcpConfigOpen] = useState(false); + const [mcpConfigServer, setMcpConfigServer] = useState(null); + const [mcpAuthType, setMcpAuthType] = useState<'none' | 'env_vars'>('none'); + const [mcpCredentials, setMcpCredentials] = useState>({}); + const [mcpConfigJson, setMcpConfigJson] = useState(''); + const [mcpConfigError, setMcpConfigError] = useState(''); + + // Expanded MCP tool permissions state + const [expandedToolId, setExpandedToolId] = useState(null); + const [discovering, setDiscovering] = useState(false); + + // Integration toggle state + const [integrationLoading, setIntegrationLoading] = useState>({}); + + // Integration credentials dialog state + const [credDialogOpen, setCredDialogOpen] = useState(false); + const [credDialogToolId, setCredDialogToolId] = useState(null); + const [credDialogIntegration, setCredDialogIntegration] = useState(null); + const [credDialogValues, setCredDialogValues] = useState>({}); + const [credDialogSaving, setCredDialogSaving] = useState(false); + + const getInstalledIntegration = useCallback((integration: Integration): ToolDefinition | undefined => { + return allTools.find((t) => t.name === integration.name); + }, [allTools]); + + const handleIntegrationToggle = async (integration: Integration) => { + const existing = getInstalledIntegration(integration); + setIntegrationLoading((p) => ({ ...p, [integration.id]: true })); + try { + if (existing && existing.enabled !== false) { + await dispatch(updateTool({ id: existing.id, enabled: false })); + setSnackbar({ open: true, message: `Disabled ${integration.name}` }); + } else if (existing && existing.enabled === false) { + await dispatch(updateTool({ id: existing.id, enabled: true })); + if (integration.authType === 'oauth2' && existing.auth_status !== 'connected') { + setSnackbar({ open: true, message: `Enabled ${integration.name} — connect your account to discover tools` }); + } else { + setSnackbar({ open: true, message: `Enabled ${integration.name} — re-discovering tools…` }); + const discoverResult = await dispatch(discoverTools(existing.id)); + if (discoverTools.fulfilled.match(discoverResult)) { + setSnackbar({ open: true, message: `${integration.name} ready — tools discovered` }); + } else { + setSnackbar({ open: true, message: `${integration.name} enabled but discovery failed`, severity: 'error' }); + } + } + } else { + const result = await dispatch(createTool({ + name: integration.name, + description: integration.description, + command: '', + mcp_config: integration.mcp_config, + credentials: {}, + auth_type: integration.authType || 'none', + auth_status: 'configured', + })); + if (createTool.fulfilled.match(result)) { + const newTool = result.payload; + if (integration.authType === 'oauth2') { + setSnackbar({ open: true, message: `Enabled ${integration.name} — connect your account to discover tools` }); + } else { + setSnackbar({ open: true, message: `Enabled ${integration.name} — discovering tools…` }); + const discoverResult = await dispatch(discoverTools(newTool.id)); + if (discoverTools.fulfilled.match(discoverResult)) { + setSnackbar({ open: true, message: `${integration.name} ready — tools discovered` }); + } else { + setSnackbar({ open: true, message: `${integration.name} enabled but discovery failed — is ${integration.mcp_config.command || 'the server'} installed?`, severity: 'error' }); + } + } + } + } + } finally { + setIntegrationLoading((p) => ({ ...p, [integration.id]: false })); + } + }; + + const handleDiscover = async (toolId: string) => { + setDiscovering(true); + try { + const result = await dispatch(discoverTools(toolId)); + if (discoverTools.fulfilled.match(result)) { + setSnackbar({ open: true, message: 'Tools discovered successfully' }); + } else { + setSnackbar({ open: true, message: 'Discovery failed — is the MCP server running?', severity: 'error' }); + } + } finally { + setDiscovering(false); + } + }; + + const handlePermissionChange = async (toolId: string, toolName: string, policy: string) => { + const tool = items[toolId]; + if (!tool) return; + const updated = { ...tool.tool_permissions, [toolName]: policy }; + await dispatch(updateTool({ id: toolId, tool_permissions: updated })); + }; + + const handleGroupPermissionChange = async (toolId: string, names: string[], policy: string) => { + const tool = items[toolId]; + if (!tool) return; + const updated = { ...tool.tool_permissions }; + for (const name of names) updated[name] = policy; + await dispatch(updateTool({ id: toolId, tool_permissions: updated })); + }; + + const handleBulkReadOnly = async (toolId: string) => { + const tool = items[toolId]; + if (!tool?.tool_permissions?._categories) return; + const readNames: string[] = tool.tool_permissions._categories.read || []; + const updated = { ...tool.tool_permissions }; + for (const name of readNames) updated[name] = 'always_allow'; + await dispatch(updateTool({ id: toolId, tool_permissions: updated })); + }; + + const handleResetPermissions = async (toolId: string) => { + const tool = items[toolId]; + if (!tool?.tool_permissions) return; + const updated = { ...tool.tool_permissions }; + for (const key of Object.keys(updated)) { + if (!key.startsWith('_')) updated[key] = 'ask'; + } + await dispatch(updateTool({ id: toolId, tool_permissions: updated })); + }; + + const [expandedServices, setExpandedServices] = useState>({}); + + const [viewsSectionOpen, setViewsSectionOpen] = useState(false); + const [builtinSectionOpen, setBuiltinSectionOpen] = useState(true); + + useEffect(() => { + dispatch(fetchTools()); + dispatch(fetchBuiltinTools()); + dispatch(fetchBuiltinPermissions()); + dispatch(fetchOutputs()); + }, [dispatch]); + + const handleViewPermissionChange = async (viewId: string, permission: string) => { + await dispatch(updateOutput({ id: viewId, permission })); + }; + + const handleBuiltinPermissionChange = async (toolName: string, policy: string) => { + await dispatch(updateBuiltinPermissions({ [toolName]: policy })); + }; + + const handleBuiltinCategoryPermissionChange = async (toolNames: string[], policy: string) => { + const perms: Record = {}; + for (const name of toolNames) perms[name] = policy; + await dispatch(updateBuiltinPermissions(perms)); + }; + + // Built-in tool grouping + const coreTools = useMemo(() => builtinTools.filter((bt) => !bt.deferred), [builtinTools]); + const deferredTools = useMemo(() => builtinTools.filter((bt) => bt.deferred), [builtinTools]); + const groupTools = (list: BuiltinTool[]) => { + const g: Record = {}; + for (const bt of list) { if (!g[bt.category]) g[bt.category] = []; g[bt.category].push(bt); } + return g; + }; + const groupedCore = useMemo(() => groupTools(coreTools), [coreTools]); + const groupedDeferred = useMemo(() => groupTools(deferredTools), [deferredTools]); + + const coreSectionEnabled = useMemo( + () => !coreTools.every((t) => builtinPermissions[t.name] === 'deny'), + [coreTools, builtinPermissions], + ); + const deferredSectionEnabled = useMemo( + () => !deferredTools.every((t) => builtinPermissions[t.name] === 'deny'), + [deferredTools, builtinPermissions], + ); + const viewsSectionEnabled = useMemo( + () => !outputs.every((o) => o.permission === 'deny'), + [outputs], + ); + + const handleSectionEnabledChange = async (tools: BuiltinTool[], enabled: boolean) => { + const perms: Record = {}; + for (const t of tools) perms[t.name] = enabled ? 'ask' : 'deny'; + await dispatch(updateBuiltinPermissions(perms)); + }; + + const handleViewsSectionEnabledChange = async (enabled: boolean) => { + for (const out of outputs) { + await dispatch(updateOutput({ id: out.id, permission: enabled ? 'ask' : 'deny' })); + } + }; + + const toggleCategory = (cat: string) => setCollapsedCategories((p) => ({ ...p, [cat]: !p[cat] })); + const toggleBuiltinExpand = (name: string) => setExpandedBuiltin((p) => (p === name ? null : name)); + + // --------------- Dropdown handlers --------------- + + const handleMenuOpen = (e: React.MouseEvent) => setMenuAnchor(e.currentTarget); + const handleMenuClose = () => setMenuAnchor(null); + + const openCreate = () => { + handleMenuClose(); + setEditingId(null); + setForm(emptyForm); + setDialogOpen(true); + }; + + const openRegistryBrowser = () => { + handleMenuClose(); + setRegistryOpen(true); + setRegQuery(''); + setRegSort('name'); + setRegSource(''); + setExpandedServer(null); + dispatch(fetchRegistryStats()); + dispatch(searchRegistry({ q: '', limit: 20, offset: 0, sort: 'name', source: '' })); + }; + + // --------------- Tool CRUD --------------- + + const openEdit = (tool: ToolDefinition) => { + setEditingId(tool.id); + setForm({ name: tool.name, description: tool.description, command: tool.command }); + setDialogOpen(true); + }; + + const handleSave = async () => { + const payload = { name: form.name, description: form.description, command: form.command }; + if (editingId) { await dispatch(updateTool({ id: editingId, ...payload })); } else { await dispatch(createTool(payload)); } + setDialogOpen(false); + }; + + const handleDelete = async (id: string) => { await dispatch(deleteTool(id)); }; + + // --------------- Registry browser --------------- + + const handleRegSearch = useCallback((q: string, sort?: 'name' | 'stars', source?: '' | 'community' | 'google') => { + setRegQuery(q); + setExpandedServer(null); + const sortVal = sort ?? regSort; + const sourceVal = source ?? regSource; + if (debounceRef.current) clearTimeout(debounceRef.current); + debounceRef.current = setTimeout(() => { + dispatch(searchRegistry({ q, limit: 20, offset: 0, sort: sortVal, source: sourceVal })); + }, 300); + }, [dispatch, regSort, regSource]); + + const handleLoadMore = () => { + dispatch(searchRegistry({ q: regQuery, limit: 20, offset: regServers.length, sort: regSort, source: regSource })); + }; + + const handleRegSort = (sort: 'name' | 'stars') => { + setRegSort(sort); + setExpandedServer(null); + dispatch(searchRegistry({ q: regQuery, limit: 20, offset: 0, sort, source: regSource })); + }; + + const handleRegSourceFilter = (_: React.MouseEvent, val: '' | 'community' | 'google') => { + if (val === null) return; + setRegSource(val); + setExpandedServer(null); + dispatch(searchRegistry({ q: regQuery, limit: 20, offset: 0, sort: regSort, source: val })); + }; + + const openMcpConfigDialog = (srv: McpServer) => { + setMcpConfigServer(srv); + setMcpAuthType('none'); + setMcpCredentials({}); + const derivedConfig = serverToMcpConfig(srv); + setMcpConfigJson(JSON.stringify( + Object.keys(derivedConfig).length > 0 ? derivedConfig : {}, + null, 2, + )); + setMcpConfigError(''); + setMcpConfigOpen(true); + }; + + const handleMcpConfigSave = async () => { + if (!mcpConfigServer) return; + let parsedConfig: Record = {}; + try { parsedConfig = JSON.parse(mcpConfigJson); } catch { setMcpConfigError('Invalid JSON'); return; } + + const f = serverToToolForm(mcpConfigServer); + const isStdioConfig = parsedConfig.type === 'stdio' || !!parsedConfig.command; + const authStatus = (mcpAuthType !== 'none' || isStdioConfig) ? 'configured' : 'none'; + + await dispatch(createTool({ + name: f.name, + description: f.description, + command: '', + mcp_config: parsedConfig, + credentials: mcpCredentials, + auth_type: mcpAuthType, + auth_status: authStatus, + })); + + setMcpConfigOpen(false); + setSnackbar({ open: true, message: `Installed "${f.name}" as MCP tool` }); + }; + + const handleInstall = async (srv: McpServer) => { + const f = serverToToolForm(srv); + const mcpConfig = serverToMcpConfig(srv); + const hasConfig = Object.keys(mcpConfig).length > 0; + + if (srv.source === 'google' && srv.remoteUrl && hasConfig) { + await dispatch(createTool({ + name: f.name, + description: f.description, + command: '', + mcp_config: mcpConfig, + credentials: {}, + auth_type: 'oauth2', + auth_status: 'configured', + })); + setSnackbar({ open: true, message: `Installed "${f.name}" — click "Connect Google" to authorize` }); + } else if (hasConfig && mcpConfig.type === 'stdio') { + const result = await dispatch(createTool({ + name: f.name, + description: f.description, + command: '', + mcp_config: mcpConfig, + credentials: {}, + auth_type: 'none', + auth_status: 'configured', + })); + if (createTool.fulfilled.match(result)) { + const newTool = result.payload; + setSnackbar({ open: true, message: `Installed "${f.name}" — discovering tools…` }); + const discoverResult = await dispatch(discoverTools(newTool.id)); + if (discoverTools.fulfilled.match(discoverResult)) { + setSnackbar({ open: true, message: `${f.name} ready — tools discovered` }); + } else { + setSnackbar({ open: true, message: `${f.name} installed but discovery failed — the MCP server may need setup first`, severity: 'error' }); + } + } + } else { + openMcpConfigDialog(srv); + } + }; + + const handleEditInstall = (srv: McpServer) => { + setRegistryOpen(false); + const f = serverToToolForm(srv); + setEditingId(null); + setForm(f); + setDialogOpen(true); + }; + + const handleOAuthConnect = async (toolId: string) => { + const result = await dispatch(startOAuth(toolId)); + if (startOAuth.fulfilled.match(result)) { + const { auth_url } = result.payload; + const popup = window.open(auth_url, 'oauth', 'width=500,height=700,left=200,top=100'); + + const afterConnect = async () => { + const statusResult = await dispatch(fetchToolStatus(toolId)); + if (fetchToolStatus.fulfilled.match(statusResult) && statusResult.payload.auth_status === 'connected') { + setSnackbar({ open: true, message: 'Google account connected! Discovering tools…' }); + setExpandedToolId(toolId); + dispatch(discoverTools(toolId)); + } else { + setSnackbar({ open: true, message: 'Google account connected!' }); + } + }; + + const onMessage = (event: MessageEvent) => { + if (event.data?.type === 'oauth_complete' && event.data?.tool_id === toolId) { + afterConnect(); + window.removeEventListener('message', onMessage); + } + }; + window.addEventListener('message', onMessage); + + const pollInterval = setInterval(() => { + if (popup?.closed) { + clearInterval(pollInterval); + afterConnect(); + window.removeEventListener('message', onMessage); + } + }, 1000); + } else { + setSnackbar({ open: true, message: 'OAuth failed — make sure GOOGLE_OAUTH_CLIENT_ID is set in backend .env', severity: 'error' }); + } + }; + + const openCredentialsDialog = (toolId: string, integration: Integration) => { + const tool = items[toolId]; + const existing = tool?.credentials || {}; + const initial: Record = {}; + for (const field of integration.credentialFields || []) { + initial[field.key] = existing[field.key] || ''; + } + setCredDialogToolId(toolId); + setCredDialogIntegration(integration); + setCredDialogValues(initial); + setCredDialogOpen(true); + }; + + const handleCredentialsSave = async () => { + if (!credDialogToolId || !credDialogIntegration) return; + const hasEmpty = (credDialogIntegration.credentialFields || []).some((f) => !credDialogValues[f.key]?.trim()); + if (hasEmpty) return; + + setCredDialogSaving(true); + try { + const result = await dispatch(updateTool({ + id: credDialogToolId, + credentials: credDialogValues, + auth_type: 'env_vars', + auth_status: 'connected', + })); + if (updateTool.fulfilled.match(result)) { + setCredDialogOpen(false); + setSnackbar({ open: true, message: `${credDialogIntegration.name} connected! Re-discovering tools…` }); + dispatch(discoverTools(credDialogToolId)); + } else { + setSnackbar({ open: true, message: 'Failed to save credentials', severity: 'error' }); + } + } finally { + setCredDialogSaving(false); + } + }; + + const handleDisconnectIntegration = async (toolId: string, integration: Integration) => { + await dispatch(updateTool({ + id: toolId, + credentials: {}, + auth_type: 'none', + auth_status: 'configured', + })); + setSnackbar({ open: true, message: `${integration.name} disconnected` }); + }; + + return ( + + {/* Header */} + + + Tool Library + Define and manage custom tools for your Claude Code agents. + + + + + + + Create Custom + + + + Browse MCP Registry + + + + + + {/* Built-in Tool Sets */} + + setBuiltinSectionOpen((v) => !v)} + sx={{ display: 'flex', alignItems: 'center', gap: 0.5, mb: 1, cursor: 'pointer', userSelect: 'none', '&:hover .section-arrow': { color: c.text.secondary } }} + > + {builtinSectionOpen ? : } + + Built-in Tool Sets + + + + + + {/* Core Tools */} + {coreTools.length > 0 && ( + } count={coreTools.length} open={coreSectionOpen} onToggle={() => setCoreSectionOpen((v) => !v)} grouped={groupedCore} collapsedCategories={collapsedCategories} toggleCategory={toggleCategory} expandedBuiltin={expandedBuiltin} toggleBuiltinExpand={toggleBuiltinExpand} builtinPermissions={builtinPermissions} onPermissionChange={handleBuiltinPermissionChange} onCategoryPermissionChange={handleBuiltinCategoryPermissionChange} enabled={coreSectionEnabled} onEnabledChange={(v) => handleSectionEnabledChange(coreTools, v)} /> + )} + + {/* Extended Tools */} + {deferredTools.length > 0 && ( + } count={deferredTools.length} open={deferredSectionOpen} onToggle={() => setDeferredSectionOpen((v) => !v)} grouped={groupedDeferred} collapsedCategories={collapsedCategories} toggleCategory={toggleCategory} expandedBuiltin={expandedBuiltin} toggleBuiltinExpand={toggleBuiltinExpand} deferred builtinPermissions={builtinPermissions} onPermissionChange={handleBuiltinPermissionChange} onCategoryPermissionChange={handleBuiltinCategoryPermissionChange} enabled={deferredSectionEnabled} onEnabledChange={(v) => handleSectionEnabledChange(deferredTools, v)} /> + )} + + {/* Views */} + {outputs.length > 0 && ( + + + viewsSectionEnabled && setViewsSectionOpen((v) => !v)} + sx={{ display: 'flex', alignItems: 'center', gap: 2, cursor: viewsSectionEnabled ? 'pointer' : 'default' }} + > + + + + + + Views + + + Dashboard views and data displays for your agent + + e.stopPropagation()}> + handleViewsSectionEnabledChange(checked)} + sx={{ + '& .MuiSwitch-switchBase.Mui-checked': { color: c.accent.primary }, + '& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track': { bgcolor: c.accent.primary }, + }} + /> + + {viewsSectionEnabled && ( + + + + )} + + + + + + {outputs.map((out) => { + const perm = out.permission || 'ask'; + return ( + + + + + + + + {out.name} + + + {out.description && ( + + {out.description} + + )} + + + e.stopPropagation()}> + handleViewPermissionChange(out.id, 'always_allow')} sx={{ p: 0.4, borderRadius: 1, bgcolor: perm === 'always_allow' ? `${c.status.success}20` : 'transparent', color: perm === 'always_allow' ? c.status.success : c.text.ghost, '&:hover': { bgcolor: `${c.status.success}15`, color: c.status.success } }}> + handleViewPermissionChange(out.id, 'ask')} sx={{ p: 0.4, borderRadius: 1, bgcolor: perm === 'ask' ? `${c.status.warning}20` : 'transparent', color: perm === 'ask' ? c.status.warning : c.text.ghost, '&:hover': { bgcolor: `${c.status.warning}15`, color: c.status.warning } }}> + handleViewPermissionChange(out.id, 'deny')} sx={{ p: 0.4, borderRadius: 1, bgcolor: perm === 'deny' ? `${c.status.error}20` : 'transparent', color: perm === 'deny' ? c.status.error : c.text.ghost, '&:hover': { bgcolor: `${c.status.error}15`, color: c.status.error } }}> + + + ); + })} + + + + + )} + + + + + + {/* Custom Tool Sets */} + + setCustomSectionOpen((v) => !v)} sx={{ display: 'flex', alignItems: 'center', gap: 0.5, mb: 1, cursor: 'pointer', userSelect: 'none', '&:hover .section-arrow': { color: c.text.secondary } }}> + {customSectionOpen ? : } + + Custom Tool Sets + + + + {loading ? ( + + ) : (tools.length === 0 && uninstalledIntegrations.length === 0) ? ( + + + No custom tools defined yet. Create one to get started. + + ) : ( + + {uninstalledIntegrations.map((ig) => { + const isLoading = !!integrationLoading[ig.id]; + return ( + + + + + {ig.icon} + + + + {ig.name} + } label="docs" size="small" sx={{ bgcolor: c.bg.secondary, color: c.text.ghost, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, fontSize: 10 } }} /> + + {ig.description} + + + {isLoading && } + handleIntegrationToggle(ig)} + disabled={isLoading} + sx={{ + '& .MuiSwitch-switchBase.Mui-checked': { color: ig.color }, + '& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track': { bgcolor: ig.color }, + }} + /> + + + + + ); + })} + {tools.map((tool) => { + const ig = getIntegrationForTool(tool); + const isExpanded = expandedToolId === tool.id; + const isMcp = tool.mcp_config && Object.keys(tool.mcp_config).length > 0; + const isStdio = isMcp && (tool.mcp_config.type === 'stdio' || !!tool.mcp_config.command); + const canDiscover = isMcp && (isStdio || tool.auth_status !== 'none'); + const perms = tool.tool_permissions || {}; + const services = perms._services as Record | undefined; + const descriptions = (perms._tool_descriptions || {}) as Record; + const serviceNames = services ? Object.keys(services) : []; + const hasPerms = serviceNames.length > 0; + const totalToolCount = serviceNames.reduce((acc, s) => acc + (services![s].read?.length || 0) + (services![s].write?.length || 0), 0); + + const toDisplayName = (name: string, serviceName?: string) => { + let display = name.replace(/_/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase()); + if (serviceName) { + const svcLower = serviceName.toLowerCase(); + const variants = [svcLower, svcLower.replace(/s$/, '')]; + for (const v of variants) { + display = display.replace(new RegExp(`\\b${v}\\b`, 'gi'), '').trim(); + } + display = display.replace(/\s{2,}/g, ' ').trim(); + } + return display; + }; + + const firstSentence = (desc: string) => { + if (!desc) return ''; + const match = desc.match(/^(.+?(?:\.|$))/); + return match ? match[1].trim() : desc.substring(0, 100); + }; + + const getGroupPolicy = (names: string[]) => { + if (names.length === 0) return 'ask'; + const policies = names.map((n) => perms[n] || 'ask'); + if (policies.every((p) => p === 'always_allow')) return 'always_allow'; + if (policies.every((p) => p === 'deny')) return 'deny'; + if (policies.every((p) => p === 'ask')) return 'ask'; + return 'mixed'; + }; + + const PermToggle = ({ value, onChange, size = 16 }: { value: string; onChange: (v: string) => void; size?: number }) => ( + e.stopPropagation()}> + onChange('always_allow')} sx={{ p: 0.4, borderRadius: 1, bgcolor: value === 'always_allow' ? `${c.status.success}20` : 'transparent', color: value === 'always_allow' ? c.status.success : c.text.ghost, '&:hover': { bgcolor: `${c.status.success}15`, color: c.status.success } }}> + onChange('ask')} sx={{ p: 0.4, borderRadius: 1, bgcolor: value === 'ask' ? `${c.status.warning}20` : 'transparent', color: value === 'ask' ? c.status.warning : c.text.ghost, '&:hover': { bgcolor: `${c.status.warning}15`, color: c.status.warning } }}> + onChange('deny')} sx={{ p: 0.4, borderRadius: 1, bgcolor: value === 'deny' ? `${c.status.error}20` : 'transparent', color: value === 'deny' ? c.status.error : c.text.ghost, '&:hover': { bgcolor: `${c.status.error}15`, color: c.status.error } }}> + + ); + + const ServiceGroup = ({ serviceName, data }: { serviceName: string; data: { read?: string[]; write?: string[] } }) => { + const svcKey = `${tool.id}:${serviceName}`; + const isOpen = expandedServices[svcKey] ?? false; + const allNames = [...(data.read || []), ...(data.write || [])]; + const svcPolicy = getGroupPolicy(allNames); + const count = allNames.length; + + return ( + + setExpandedServices((p) => ({ ...p, [svcKey]: !isOpen }))} + > + + + {serviceName} + + + handleGroupPermissionChange(tool.id, allNames, v)} /> + + + + {(data.read?.length || 0) > 0 && ( + + + + + Read-only + + + handleGroupPermissionChange(tool.id, data.read!, v)} size={14} /> + + {data.read!.map((name) => ( + + + {toDisplayName(name, serviceName)} + {descriptions[name] && {firstSentence(descriptions[name])}} + + handlePermissionChange(tool.id, name, v)} size={14} /> + + ))} + + )} + {(data.write?.length || 0) > 0 && ( + + + + + Write / delete + + + handleGroupPermissionChange(tool.id, data.write!, v)} size={14} /> + + {data.write!.map((name) => ( + + + {toDisplayName(name, serviceName)} + {descriptions[name] && {firstSentence(descriptions[name])}} + + handlePermissionChange(tool.id, name, v)} size={14} /> + + ))} + + )} + + + + ); + }; + + const isDisabled = tool.enabled === false; + + return ( + + + !isDisabled && setExpandedToolId(isExpanded ? null : tool.id)} + > + {ig && ( + + {ig.icon} + + )} + + + {tool.name} + {isMcp && } label={isStdio ? 'MCP · stdio' : 'MCP'} size="small" sx={{ bgcolor: `${c.status.warning}20`, color: c.status.warning, fontSize: '0.75rem', height: 24 }} />} + {tool.command && } label={`/${tool.command}`} size="small" sx={{ bgcolor: 'rgba(174,86,48,0.12)', color: c.accent.hover, fontSize: '0.72rem', height: 22 }} />} + {tool.auth_status === 'connected' && !ig && ( + } label={tool.connected_account_email ? `Connected · ${tool.connected_account_email}` : 'Connected'} size="small" sx={{ bgcolor: c.status.successBg, color: c.status.success, fontSize: '0.7rem', height: 20, '& .MuiChip-icon': { color: c.status.success } }} /> + )} + {tool.auth_status === 'configured' && !ig?.credentialFields && ( + } label="Configured" size="small" sx={{ bgcolor: c.status.warningBg, color: c.status.warning, fontSize: '0.7rem', height: 20, '& .MuiChip-icon': { color: c.status.warning } }} /> + )} + {ig && totalToolCount > 0 && ( + + )} + {ig && ( + } label="docs" size="small" sx={{ bgcolor: c.bg.secondary, color: c.text.ghost, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, fontSize: 10 } }} /> + )} + + {tool.description && {tool.description}} + + {!isDisabled && tool.auth_type === 'oauth2' && tool.auth_status !== 'connected' && ( + + )} + {!isDisabled && ig?.credentialFields && tool.auth_status !== 'connected' && ( + + )} + {!isDisabled && ig && tool.auth_status === 'connected' && ( + + } + label={tool.connected_account_email ? `Connected · ${tool.connected_account_email}` : 'Connected'} + size="small" + onDelete={ig.credentialFields ? (e: React.SyntheticEvent) => { e.stopPropagation(); handleDisconnectIntegration(tool.id, ig); } : undefined} + onClick={(e) => e.stopPropagation()} + sx={{ bgcolor: c.status.successBg, color: c.status.success, fontSize: '0.7rem', height: 22, '& .MuiChip-icon': { color: c.status.success }, '& .MuiChip-deleteIcon': { color: c.status.success, '&:hover': { color: c.status.error } }, flexShrink: 0 }} + /> + + )} + {ig && ( + e.stopPropagation()}> + {!!integrationLoading[ig.id] && } + handleIntegrationToggle(ig)} + disabled={!!integrationLoading[ig.id]} + sx={{ + '& .MuiSwitch-switchBase.Mui-checked': { color: ig.color }, + '& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track': { bgcolor: ig.color }, + }} + /> + + )} + {!isDisabled && ( + + + {!ig && ( + <> + { e.stopPropagation(); openEdit(tool); }} sx={{ color: c.text.ghost, '&:hover': { color: c.accent.primary } }}> + { e.stopPropagation(); handleDelete(tool.id); }} sx={{ color: c.text.ghost, '&:hover': { color: c.status.error } }}> + + )} + + )} + + + + + + + + + Tool Permissions + {hasPerms && } + + + {hasPerms && ( + <> + + + + + + + + )} + + handleDiscover(tool.id)} + disabled={discovering || !canDiscover} + sx={{ color: c.text.ghost, '&:hover': { color: c.accent.primary } }} + > + {discovering ? : } + + + + + + {!hasPerms ? ( + + + No tools discovered yet + + {!canDiscover && ( + Connect the tool first to discover available permissions + )} + + ) : ( + + {serviceNames.map((svc) => ( + + ))} + + )} + + + + ); + })} + + )} + + + + {/* Create/Edit Tool Dialog */} + setDialogOpen(false)} maxWidth="md" fullWidth PaperProps={{ sx: { bgcolor: c.bg.surface, backgroundImage: 'none', borderRadius: 4, border: `1px solid ${c.border.subtle}` } }}> + {editingId ? 'Edit Tool' : 'New Tool'} + + setForm({ ...form, name: e.target.value })} fullWidth size="small" sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.page } }} /> + setForm({ ...form, description: e.target.value })} fullWidth size="small" sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.page } }} /> + setForm({ ...form, command: e.target.value })} fullWidth size="small" placeholder="e.g. my-tool" sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.page } }} /> + + + + + + + + {/* Registry Browser Dialog */} + setRegistryOpen(false)} + maxWidth="md" + fullWidth + PaperProps={{ sx: { bgcolor: c.bg.page, backgroundImage: 'none', borderRadius: 4, border: `1px solid ${c.border.subtle}`, height: '80vh' } }} + > + + + MCP Registry + {regStats && ( + + )} + + + + handleRegSearch(e.target.value)} + fullWidth + size="small" + autoFocus + InputProps={{ + startAdornment: ( + + + + ), + }} + sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.surface, borderRadius: 2 } }} + /> + + All + Community + Google + + + handleRegSort(regSort === 'name' ? 'stars' : 'name')} + sx={{ + color: regSort === 'stars' ? '#c89c00' : c.text.ghost, + border: '1px solid', + borderColor: regSort === 'stars' ? '#c89c0040' : c.border.medium, + borderRadius: 1.5, + px: 1, + flexShrink: 0, + transition: 'all 0.15s', + '&:hover': { borderColor: '#c89c00', color: '#c89c00' }, + }} + > + + + + + + + {regLoading && regServers.length === 0 ? ( + + + + ) : regServers.length === 0 ? ( + + + No servers found matching "{regQuery}" + + ) : ( + + + Showing {regServers.length} of {regTotal.toLocaleString()} results + + {regServers.map((srv) => { + const isExpanded = expandedServer === srv.name; + return ( + + setExpandedServer(isExpanded ? null : srv.name)} + sx={{ + display: 'flex', alignItems: 'center', gap: 1.5, + px: 1.5, py: 1, borderRadius: 1.5, cursor: 'pointer', + transition: 'background 0.15s', + '&:hover': { bgcolor: c.bg.secondary }, + ...(isExpanded && { bgcolor: c.bg.secondary }), + }} + > + + {srv.iconUrl ? null : (srv.title || cleanServerName(srv.name)).charAt(0).toUpperCase()} + + + + + {srv.title || cleanServerName(srv.name)} + + {srv.version && } + {srv.remoteType && } + {srv.source === 'google' ? ( + } label="Google" size="small" sx={{ bgcolor: `${c.status.info}15`, color: c.status.info, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, color: c.status.info } }} /> + ) : ( + } label="Community" size="small" sx={{ bgcolor: 'rgba(174,86,48,0.08)', color: c.accent.primary, fontSize: '0.65rem', height: 18, '& .MuiChip-label': { px: 0.4 }, '& .MuiChip-icon': { ml: 0.4, color: c.accent.primary } }} /> + )} + {srv.stars != null && ( + + + + {srv.stars >= 1000 ? `${(srv.stars / 1000).toFixed(1)}k` : srv.stars.toLocaleString()} + + + )} + + + {srv.description} + + + + + + + + + {srv.description} + + + + + {srv.name} + + {srv.remoteUrl && ( + + Endpoint + {srv.remoteUrl} + + )} + + {srv.websiteUrl && ( + } + label="Website" + size="small" + sx={{ bgcolor: c.bg.secondary, color: c.text.muted, fontSize: '0.7rem', height: 22 }} + /> + )} + {srv.repositoryUrl && ( + } + label="Repository" + size="small" + sx={{ bgcolor: c.bg.secondary, color: c.text.muted, fontSize: '0.7rem', height: 22 }} + /> + )} + + + + + + + + + + + ); + })} + + {regServers.length < regTotal && ( + + + + )} + + )} + + + + + + + {/* MCP Config Dialog */} + setMcpConfigOpen(false)} + maxWidth="sm" + fullWidth + PaperProps={{ sx: { bgcolor: c.bg.surface, backgroundImage: 'none', borderRadius: 4, border: `1px solid ${c.border.subtle}` } }} + > + + + Configure MCP Tool + + + {mcpConfigServer && ( + + + {mcpConfigServer.iconUrl ? null : (mcpConfigServer.title || cleanServerName(mcpConfigServer.name)).charAt(0).toUpperCase()} + + + + {mcpConfigServer.title || cleanServerName(mcpConfigServer.name)} + + {mcpConfigServer.description} + + + )} + + { setMcpConfigJson(e.target.value); try { JSON.parse(e.target.value); setMcpConfigError(''); } catch { setMcpConfigError('Invalid JSON'); } }} + fullWidth + multiline + minRows={3} + maxRows={8} + error={!!mcpConfigError} + helperText={mcpConfigError || 'Transport config passed to claude_agent_sdk (type, url, command, args, etc.)'} + sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.page, fontFamily: c.font.mono, fontSize: '0.85rem' } }} + /> + + + Authentication Type + + + + {mcpAuthType !== 'none' && ( + + + Environment Variables + + {Object.entries(mcpCredentials).map(([key, val]) => ( + setMcpCredentials({ ...mcpCredentials, [key]: e.target.value })} + fullWidth + size="small" + type={key.toLowerCase().includes('secret') ? 'password' : 'text'} + sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.elevated, fontFamily: c.font.mono, fontSize: '0.85rem' } }} + /> + ))} + {mcpAuthType === 'env_vars' && ( + + )} + + )} + + + + + + + + {/* Integration Credentials Dialog */} + setCredDialogOpen(false)} + maxWidth="sm" + fullWidth + PaperProps={{ sx: { bgcolor: c.bg.surface, backgroundImage: 'none', borderRadius: 4, border: `1px solid ${c.border.subtle}` } }} + > + + {credDialogIntegration && ( + + {credDialogIntegration.icon} + + )} + {credDialogIntegration?.connectLabel || 'Connect'} + + + {credDialogIntegration?.connectInstructions && ( + + {credDialogIntegration.connectInstructions} + + )} + {(credDialogIntegration?.credentialFields || []).map((field) => ( + setCredDialogValues((prev) => ({ ...prev, [field.key]: e.target.value }))} + fullWidth + size="small" + helperText={field.helpText} + sx={{ '& .MuiOutlinedInput-root': { bgcolor: c.bg.page, fontFamily: c.font.mono, fontSize: '0.85rem' } }} + /> + ))} + + + + + + + + {/* Install success snackbar */} + setSnackbar({ open: false, message: '' })} + anchorOrigin={{ vertical: 'bottom', horizontal: 'center' }} + > + setSnackbar({ open: false, message: '' })} severity={snackbar.severity || 'success'} sx={{ bgcolor: snackbar.severity === 'error' ? '#2e1a1a' : c.status.successBg, color: snackbar.severity === 'error' ? '#f87171' : c.status.success, border: `1px solid ${snackbar.severity === 'error' ? '#ef444440' : `${c.status.success}40`}` }}> + {snackbar.message} + + + + ); +}; + +export default Tools; diff --git a/frontend/src/app/pages/Views/CodeEditor.tsx b/frontend/src/app/pages/Views/CodeEditor.tsx new file mode 100644 index 00000000..9de45c50 --- /dev/null +++ b/frontend/src/app/pages/Views/CodeEditor.tsx @@ -0,0 +1,87 @@ +import React, { useRef, useEffect, useMemo } from 'react'; +import { EditorState } from '@codemirror/state'; +import { EditorView, keymap, placeholder as cmPlaceholder } from '@codemirror/view'; +import { defaultKeymap, indentWithTab } from '@codemirror/commands'; +import { basicSetup } from 'codemirror'; +import { oneDark } from '@codemirror/theme-one-dark'; +import { html } from '@codemirror/lang-html'; +import { python } from '@codemirror/lang-python'; +import { json } from '@codemirror/lang-json'; +import { useThemeMode } from '@/shared/styles/ThemeContext'; + +type Language = 'html' | 'python' | 'json'; + +interface Props { + value: string; + onChange: (value: string) => void; + language: Language; + placeholder?: string; +} + +const langExtension = (lang: Language) => { + switch (lang) { + case 'html': return html(); + case 'python': return python(); + case 'json': return json(); + } +}; + +const CodeEditor: React.FC = ({ value, onChange, language, placeholder }) => { + const containerRef = useRef(null); + const viewRef = useRef(null); + const onChangeRef = useRef(onChange); + const { mode } = useThemeMode(); + + onChangeRef.current = onChange; + + const extensions = useMemo(() => { + const exts = [ + basicSetup, + langExtension(language), + keymap.of([...defaultKeymap, indentWithTab]), + EditorView.updateListener.of((update) => { + if (update.docChanged) { + onChangeRef.current(update.state.doc.toString()); + } + }), + EditorView.theme({ + '&': { height: '100%', fontSize: '13px' }, + '.cm-scroller': { overflow: 'auto', fontFamily: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace' }, + '.cm-gutters': { border: 'none' }, + }), + ]; + if (mode === 'dark') exts.push(oneDark); + if (placeholder) exts.push(cmPlaceholder(placeholder)); + return exts; + }, [language, mode, placeholder]); + + useEffect(() => { + if (!containerRef.current) return; + + const state = EditorState.create({ doc: value, extensions }); + const view = new EditorView({ state, parent: containerRef.current }); + viewRef.current = view; + + return () => { + view.destroy(); + viewRef.current = null; + }; + // Recreate the editor when extensions change (language/theme switch) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [extensions]); + + useEffect(() => { + const view = viewRef.current; + if (!view) return; + const current = view.state.doc.toString(); + if (current !== value) { + view.dispatch({ + changes: { from: 0, to: current.length, insert: value }, + }); + } + }, [value]); + + return
    ; +}; + +export default CodeEditor; diff --git a/frontend/src/app/pages/Views/InputSchemaForm.tsx b/frontend/src/app/pages/Views/InputSchemaForm.tsx new file mode 100644 index 00000000..a8c5b8da --- /dev/null +++ b/frontend/src/app/pages/Views/InputSchemaForm.tsx @@ -0,0 +1,313 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import TextField from '@mui/material/TextField'; +import Switch from '@mui/material/Switch'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Select from '@mui/material/Select'; +import MenuItem from '@mui/material/MenuItem'; +import InputLabel from '@mui/material/InputLabel'; +import FormControl from '@mui/material/FormControl'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import Button from '@mui/material/Button'; +import AddIcon from '@mui/icons-material/Add'; +import RemoveCircleOutlineIcon from '@mui/icons-material/RemoveCircleOutline'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +interface SchemaNode { + type?: string; + properties?: Record; + items?: SchemaNode; + required?: string[]; + enum?: string[]; + description?: string; + default?: any; +} + +interface Props { + schema: SchemaNode; + value: any; + onChange: (value: any) => void; + label?: string; + depth?: number; +} + +function getDefault(schema: SchemaNode): any { + if (schema.default !== undefined) return schema.default; + switch (schema.type) { + case 'string': return ''; + case 'number': return 0; + case 'boolean': return false; + case 'array': return []; + case 'object': { + const obj: Record = {}; + if (schema.properties) { + for (const [k, v] of Object.entries(schema.properties)) { + obj[k] = getDefault(v); + } + } + return obj; + } + default: return ''; + } +} + +const STRING_STUBS: Record = { + name: 'Jane Smith', first_name: 'Jane', last_name: 'Smith', firstName: 'Jane', lastName: 'Smith', + email: 'jane@example.com', url: 'https://example.com', website: 'https://example.com', + phone: '+1 (555) 123-4567', address: '123 Main St, Springfield', + city: 'Springfield', state: 'CA', country: 'US', zip: '90210', + title: 'Sample Title', subject: 'Hello World', message: 'This is a sample message.', + description: 'A brief description of the item.', content: 'Lorem ipsum dolor sit amet.', + username: 'janesmith', password: 'P@ssw0rd!', token: 'tok_sample_abc123', + id: 'item_001', uuid: '550e8400-e29b-41d4-a716-446655440000', + date: '2025-03-15', time: '14:30', datetime: '2025-03-15T14:30:00Z', + color: '#4a90d9', label: 'Important', tag: 'sample', category: 'general', + query: 'search term', search: 'example query', text: 'Sample text content', + path: '/home/user/file.txt', file: 'document.pdf', filename: 'report.pdf', + company: 'Acme Corp', organization: 'Acme Corp', +}; + +function stubString(key: string): string { + const lower = key.toLowerCase().replace(/[-_]/g, ''); + for (const [pattern, val] of Object.entries(STRING_STUBS)) { + if (lower === pattern.toLowerCase().replace(/[-_]/g, '') || lower.endsWith(pattern.toLowerCase().replace(/[-_]/g, ''))) { + return val; + } + } + return `sample_${key}`; +} + +function getStubbed(schema: SchemaNode, key?: string): any { + if (schema.default !== undefined) return schema.default; + if (schema.enum && schema.enum.length > 0) return schema.enum[0]; + switch (schema.type) { + case 'string': return stubString(key || 'value'); + case 'number': return 42; + case 'integer': return 7; + case 'boolean': return true; + case 'array': { + if (!schema.items) return []; + return [getStubbed(schema.items, key ? `${key}_item` : 'item')]; + } + case 'object': { + const obj: Record = {}; + if (schema.properties) { + for (const [k, v] of Object.entries(schema.properties)) { + obj[k] = getStubbed(v, k); + } + } + return obj; + } + default: return stubString(key || 'value'); + } +} + +const InputSchemaForm: React.FC = ({ schema, value, onChange, label, depth = 0 }) => { + const c = useClaudeTokens(); + + if (schema.enum && schema.enum.length > 0) { + return ( + + {label && {label}} + + {schema.description && ( + + {schema.description} + + )} + + ); + } + + if (schema.type === 'boolean') { + return ( + + onChange(e.target.checked)} + size="small" + /> + } + label={ + + {label || 'Toggle'} + + } + /> + {schema.description && ( + + {schema.description} + + )} + + ); + } + + if (schema.type === 'number' || schema.type === 'integer') { + return ( + onChange(Number(e.target.value))} + sx={{ + mb: 1.5, + '& .MuiOutlinedInput-root': { fontSize: '0.85rem' }, + '& .MuiFormHelperText-root': { fontSize: '0.7rem' }, + }} + /> + ); + } + + if (schema.type === 'string') { + return ( + onChange(e.target.value)} + multiline={(value?.length ?? 0) > 80} + sx={{ + mb: 1.5, + '& .MuiOutlinedInput-root': { fontSize: '0.85rem' }, + '& .MuiFormHelperText-root': { fontSize: '0.7rem' }, + }} + /> + ); + } + + if (schema.type === 'array' && schema.items) { + const items = Array.isArray(value) ? value : []; + return ( + 0 ? 1.5 : 0, + borderLeft: depth > 0 ? `2px solid ${c.border.subtle}` : 'none', + }} + > + {label && ( + + {label} + + )} + {schema.description && ( + + {schema.description} + + )} + {items.map((item: any, i: number) => ( + + + { + const updated = [...items]; + updated[i] = newVal; + onChange(updated); + }} + label={`Item ${i + 1}`} + depth={depth + 1} + /> + + { + const updated = items.filter((_: any, idx: number) => idx !== i); + onChange(updated); + }} + sx={{ color: c.status.error, mt: 0.5 }} + > + + + + ))} + + + ); + } + + if (schema.type === 'object' && schema.properties) { + const obj = typeof value === 'object' && value !== null ? value : {}; + return ( + 0 ? 1.5 : 0, + borderLeft: depth > 0 ? `2px solid ${c.border.subtle}` : 'none', + }} + > + {label && ( + + {label} + + )} + {schema.description && ( + + {schema.description} + + )} + {Object.entries(schema.properties).map(([key, propSchema]) => ( + onChange({ ...obj, [key]: newVal })} + label={key + (schema.required?.includes(key) ? ' *' : '')} + depth={depth + 1} + /> + ))} + + ); + } + + return ( + onChange(e.target.value)} + sx={{ mb: 1.5, '& .MuiOutlinedInput-root': { fontSize: '0.85rem' } }} + /> + ); +}; + +export { getDefault, getStubbed }; +export default InputSchemaForm; diff --git a/frontend/src/app/pages/Views/ViewCard.tsx b/frontend/src/app/pages/Views/ViewCard.tsx new file mode 100644 index 00000000..7f03b71e --- /dev/null +++ b/frontend/src/app/pages/Views/ViewCard.tsx @@ -0,0 +1,152 @@ +import React from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import IconButton from '@mui/material/IconButton'; +import Tooltip from '@mui/material/Tooltip'; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'; +import PlayArrowIcon from '@mui/icons-material/PlayArrow'; +import Icon from '@mui/material/Icon'; +import { Output } from '@/shared/state/outputsSlice'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; + +interface Props { + output: Output; + onClick: () => void; + onDelete: () => void; + onRun: () => void; +} + +const ViewCard: React.FC = ({ output, onClick, onDelete, onRun }) => { + const c = useClaudeTokens(); + + return ( + + + {output.thumbnail ? ( + + ) : ( + + {output.icon} + + )} + + + { e.stopPropagation(); onRun(); }} + sx={{ + bgcolor: c.bg.surface, + color: c.accent.primary, + boxShadow: c.shadow.sm, + '&:hover': { bgcolor: c.bg.elevated }, + }} + > + + + + + { e.stopPropagation(); onDelete(); }} + sx={{ + bgcolor: c.bg.surface, + color: c.status.error, + boxShadow: c.shadow.sm, + '&:hover': { bgcolor: c.bg.elevated }, + }} + > + + + + + + + + + {output.name} + + + {output.description || 'No description'} + + + + ); +}; + +export default ViewCard; diff --git a/frontend/src/app/pages/Views/ViewEditor.tsx b/frontend/src/app/pages/Views/ViewEditor.tsx new file mode 100644 index 00000000..aa051d99 --- /dev/null +++ b/frontend/src/app/pages/Views/ViewEditor.tsx @@ -0,0 +1,1516 @@ +import React, { useState, useMemo, useEffect, useRef, useCallback, PointerEvent as ReactPointerEvent } from 'react'; +import Box from '@mui/material/Box'; +import Typography from '@mui/material/Typography'; +import Button from '@mui/material/Button'; +import IconButton from '@mui/material/IconButton'; +import TextField from '@mui/material/TextField'; +import Tabs from '@mui/material/Tabs'; +import Tab from '@mui/material/Tab'; +import Tooltip from '@mui/material/Tooltip'; +import Switch from '@mui/material/Switch'; +import CircularProgress from '@mui/material/CircularProgress'; +import ArrowBackIcon from '@mui/icons-material/ArrowBack'; +import SaveIcon from '@mui/icons-material/Save'; +import PlayArrowIcon from '@mui/icons-material/PlayArrow'; +import HtmlIcon from '@mui/icons-material/Code'; +import PythonIcon from '@mui/icons-material/Terminal'; +import SchemaIcon from '@mui/icons-material/DataObject'; +import JsIcon from '@mui/icons-material/Javascript'; +import CssIcon from '@mui/icons-material/Style'; +import InsertDriveFileIcon from '@mui/icons-material/InsertDriveFile'; +import FolderIcon from '@mui/icons-material/Folder'; +import AddIcon from '@mui/icons-material/Add'; +import DeleteOutlineIcon from '@mui/icons-material/DeleteOutline'; +import BoltIcon from '@mui/icons-material/Bolt'; +import Collapse from '@mui/material/Collapse'; +import Chip from '@mui/material/Chip'; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import CheckCircleOutlineIcon from '@mui/icons-material/CheckCircleOutline'; +import ErrorOutlineIcon from '@mui/icons-material/ErrorOutline'; +import { useAppDispatch, useAppSelector } from '@/shared/hooks'; +import { createDraftSession, removeDraftSession, AgentMessage } from '@/shared/state/agentsSlice'; +import { createOutput, updateOutput, Output, executeOutput, OutputExecuteResult, autoRunOutput, autoRunAgentOutput, cleanupAutoRunAgent, AutoRunConfig, SERVE_BASE } from '@/shared/state/outputsSlice'; +import { createSessionWs } from '@/shared/ws/WebSocketManager'; +import { useClaudeTokens } from '@/shared/styles/ThemeContext'; +import AgentChat from '../AgentChat/AgentChat'; +import ChatInput, { ChatInputHandle } from '../AgentChat/ChatInput'; +import RefreshIcon from '@mui/icons-material/Refresh'; +import ViewPreview, { ViewPreviewHandle } from './ViewPreview'; +import InputSchemaForm, { getDefault, getStubbed } from './InputSchemaForm'; +import AutoFixHighIcon from '@mui/icons-material/AutoFixHigh'; +import CodeEditor from './CodeEditor'; +import { ElementSelectionProvider } from '@/app/components/ElementSelectionContext'; +import { captureViewThumbnail } from './captureViewThumbnail'; + +const WORKSPACE_API = `http://${window.location.hostname}:8324/api/outputs/workspace`; +const POLL_INTERVAL_MS = 2000; + +function getFileIcon(filename: string): React.ReactNode { + const ext = filename.split('.').pop()?.toLowerCase(); + const size = 15; + switch (ext) { + case 'html': case 'htm': return ; + case 'py': return ; + case 'json': return ; + case 'js': case 'jsx': case 'ts': case 'tsx': return ; + case 'css': case 'scss': case 'less': return ; + default: return ; + } +} + +function getEditorLanguage(filename: string): string { + const ext = filename.split('.').pop()?.toLowerCase(); + switch (ext) { + case 'html': case 'htm': return 'html'; + case 'py': return 'python'; + case 'json': return 'json'; + case 'js': case 'jsx': return 'javascript'; + case 'ts': case 'tsx': return 'typescript'; + case 'css': case 'scss': return 'css'; + case 'md': return 'markdown'; + default: return 'plaintext'; + } +} + +interface FileTreeNode { + name: string; + path: string; + isDir: boolean; + children?: FileTreeNode[]; +} + +function buildFileTree(filePaths: string[]): FileTreeNode[] { + const root: FileTreeNode[] = []; + const sorted = [...filePaths].sort(); + + for (const fp of sorted) { + const parts = fp.split('/'); + let current = root; + let pathSoFar = ''; + + for (let i = 0; i < parts.length; i++) { + const part = parts[i]; + pathSoFar = pathSoFar ? `${pathSoFar}/${part}` : part; + const isLast = i === parts.length - 1; + + let existing = current.find(n => n.name === part && n.isDir === !isLast); + if (!existing) { + if (isLast) { + existing = { name: part, path: fp, isDir: false }; + } else { + existing = { name: part, path: pathSoFar, isDir: true, children: [] }; + } + current.push(existing); + } + if (!isLast) { + current = existing.children!; + } + } + } + + return root; +} + +interface LogEntryProps { + msg: AgentMessage; + c: ReturnType; +} + +const LogEntry: React.FC = ({ msg, c }) => { + const [open, setOpen] = useState(false); + + if (msg.role === 'user') return null; + + if (msg.role === 'assistant') { + const text = typeof msg.content === 'string' + ? msg.content + : Array.isArray(msg.content) + ? msg.content.filter((b: any) => b.type === 'text').map((b: any) => b.text).join('') + : JSON.stringify(msg.content); + if (!text.trim()) return null; + return ( + + setOpen(!open)} + sx={{ display: 'flex', alignItems: 'center', gap: 0.5, cursor: 'pointer', '&:hover': { opacity: 0.8 } }} + > + + + {text.slice(0, 120)}{text.length > 120 ? '…' : ''} + + + + + {text} + + + + ); + } + + if (msg.role === 'tool_call') { + const tc = typeof msg.content === 'object' ? msg.content as Record : {}; + return ( + + setOpen(!open)} + sx={{ display: 'flex', alignItems: 'center', gap: 0.5, cursor: 'pointer', '&:hover': { opacity: 0.8 } }} + > + + + {tc.input && ( + + {JSON.stringify(tc.input).slice(0, 80)}… + + )} + + + + + {JSON.stringify(tc.input, null, 2)} + + + + + ); + } + + if (msg.role === 'tool_result') { + const content = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content); + return ( + + setOpen(!open)} + sx={{ display: 'flex', alignItems: 'center', gap: 0.5, cursor: 'pointer', '&:hover': { opacity: 0.8 } }} + > + + + result ({content.length > 60 ? `${content.length} chars` : content.slice(0, 60)}) + + + + + {content} + + + + ); + } + + if (msg.role === 'system') { + const text = typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content); + return ( + + {text} + + ); + } + + return null; +}; + +interface AutoRunLogProps { + messages: AgentMessage[]; + status: string | null; + logEndRef: React.RefObject; + c: ReturnType; +} + +const AutoRunLog: React.FC = ({ messages, status, logEndRef, c }) => { + const isRunning = status === 'running' || status === 'waiting_approval'; + const isDone = status === 'completed' || status === 'stopped'; + const isError = status === 'error'; + + return ( + + + {isRunning && } + {isDone && } + {isError && } + + {isRunning ? 'Agent running…' : isDone ? 'Agent completed' : isError ? 'Agent error' : 'Execution log'} + + + {messages.length} messages + + + + {messages.map((msg) => ( + + ))} +
    + + + ); +}; + +interface ConsoleEntry { + timestamp: number; + inputData: Record; + stdout: string | null; + stderr: string | null; + backendResult: Record | null; + error: string | null; + source: string; + running?: boolean; +} + +interface ConsolePanelProps { + entry: ConsoleEntry | null; + c: ReturnType; +} + +const ConsolePanel: React.FC = ({ entry, c }) => { + const sectionSx = { mb: 2 }; + const labelBase = { fontSize: '0.7rem' as const, fontWeight: 600, fontFamily: c.font.mono, mb: 0.5 }; + const codeBoxSx = { bgcolor: '#161b22', borderRadius: 1, p: 1.5, border: '1px solid #21262d' }; + const preStyle = { fontSize: '0.72rem', fontFamily: c.font.mono, color: '#c9d1d9', whiteSpace: 'pre-wrap' as const, wordBreak: 'break-all' as const, m: 0 }; + + if (!entry) { + return ( + + {'>_'} + No execution output yet + Run the backend to see results here + + ); + } + + if (entry.running) { + return ( + + + Executing backend… + + ); + } + + return ( + + + + + {new Date(entry.timestamp).toLocaleTimeString()} + + + {entry.error && ( + + )} + + + + ▸ Input Data + + {JSON.stringify(entry.inputData, null, 2)} + + + + {entry.stdout && ( + + ▸ stdout + + {entry.stdout} + + + )} + + {entry.stderr && ( + + ▸ stderr + + {entry.stderr} + + + )} + + {entry.backendResult && ( + + ▸ Result + + {JSON.stringify(entry.backendResult, null, 2)} + + + )} + + {entry.error && ( + + ✗ Error + + {entry.error} + + + )} + + {!entry.stdout && !entry.stderr && !entry.backendResult && !entry.error && ( + + No backend code to execute. Only input data was sent to the view. + + )} + + + ); +}; + +interface FileTreeItemProps { + node: FileTreeNode; + depth: number; + activeFile: string; + onSelect: (path: string) => void; + onDelete?: (path: string) => void; + c: ReturnType; +} + +const PROTECTED_FILES = new Set(['index.html', 'schema.json', 'meta.json']); + +const FileTreeItem: React.FC = ({ node, depth, activeFile, onSelect, onDelete, c }) => { + const [open, setOpen] = useState(true); + + if (node.isDir) { + return ( + <> + setOpen(!open)} + sx={{ + display: 'flex', + alignItems: 'center', + gap: 0.5, + pl: 1.5 + depth * 1, + pr: 1, + py: 0.5, + cursor: 'pointer', + '&:hover': { bgcolor: c.bg.surface }, + }} + > + + + + {node.name} + + + + {node.children?.map((child) => ( + + ))} + + + ); + } + + const isActive = activeFile === node.path; + const canDelete = onDelete && !PROTECTED_FILES.has(node.path); + + return ( + onSelect(node.path)} + sx={{ + display: 'flex', + alignItems: 'center', + gap: 0.75, + pl: 1.5 + depth * 1 + 1.25, + pr: 0.5, + py: 0.5, + cursor: 'pointer', + bgcolor: isActive ? c.bg.elevated : 'transparent', + borderLeft: isActive ? `2px solid ${c.accent.primary}` : '2px solid transparent', + '&:hover': { bgcolor: isActive ? c.bg.elevated : c.bg.surface }, + '&:hover .delete-btn': { opacity: 1 }, + transition: 'background-color 0.1s', + }} + > + + {getFileIcon(node.name)} + + + {node.name} + + {canDelete && ( + { e.stopPropagation(); onDelete(node.path); }} + sx={{ opacity: 0, p: 0.25, color: c.text.ghost, '&:hover': { color: '#ef4444' }, transition: 'opacity 0.15s, color 0.15s' }} + > + + + )} + + ); +}; + +interface Props { + output: Output | null; + onClose: () => void; +} + +const ViewEditor: React.FC = ({ output, onClose }) => { + const c = useClaudeTokens(); + const dispatch = useAppDispatch(); + const isNew = !output; + + const [name, setName] = useState(output?.name ?? ''); + const [description, setDescription] = useState(output?.description ?? ''); + + const initialFiles = useMemo>(() => { + if (!output) return {}; + const f = { ...output.files }; + if (!f['schema.json'] && output.input_schema) { + f['schema.json'] = JSON.stringify(output.input_schema, null, 2); + } + return f; + }, [output]); + + const [files, setFiles] = useState>(initialFiles); + + const TAB_PREVIEW = 0; + const TAB_CODE = 1; + const TAB_TEST_INPUT = 2; + const TAB_AUTO_RUN = 3; + const TAB_CONSOLE = 4; + + const [activeTab, setActiveTab] = useState(TAB_PREVIEW); + const [activeFile, setActiveFile] = useState('index.html'); + const [saving, setSaving] = useState(false); + const [executeResult, setExecuteResult] = useState(null); + const [showConsole, setShowConsole] = useState(false); + const [consoleEntry, setConsoleEntry] = useState(null); + const [hasNewConsoleOutput, setHasNewConsoleOutput] = useState(false); + + const savedAutoRun = output?.auto_run_config; + const [autoRunEnabled, setAutoRunEnabled] = useState(savedAutoRun?.enabled ?? false); + const [autoRunMode, setAutoRunMode] = useState(savedAutoRun?.mode ?? 'agent'); + const [autoRunModel, setAutoRunModel] = useState(savedAutoRun?.model ?? 'sonnet'); + const [autoRunning, setAutoRunning] = useState(false); + const autoRunInputRef = useRef(null); + const autoRunInitialized = useRef(false); + const previewRef = useRef(null); + + const [autoRunSessionId, setAutoRunSessionId] = useState(null); + const autoRunWsRef = useRef | null>(null); + const autoRunLogEndRef = useRef(null); + + const autoRunSession = useAppSelector((state) => + autoRunSessionId ? state.agents.sessions[autoRunSessionId] : null + ); + const autoRunMessages = autoRunSession?.messages ?? []; + const autoRunSessionStatus = autoRunSession?.status ?? null; + + const SIDEBAR_MIN = 280; + const SIDEBAR_MAX = 800; + const [sidebarWidth, setSidebarWidth] = useState(420); + const dragging = useRef(false); + const dragStartX = useRef(0); + const dragStartWidth = useRef(0); + + const onDragStart = useCallback((e: ReactPointerEvent) => { + dragging.current = true; + dragStartX.current = e.clientX; + dragStartWidth.current = sidebarWidth; + (e.target as HTMLElement).setPointerCapture(e.pointerId); + document.body.style.cursor = 'col-resize'; + document.body.style.userSelect = 'none'; + }, [sidebarWidth]); + + const onDragMove = useCallback((e: ReactPointerEvent) => { + if (!dragging.current) return; + const delta = e.clientX - dragStartX.current; + setSidebarWidth(Math.min(SIDEBAR_MAX, Math.max(SIDEBAR_MIN, dragStartWidth.current + delta))); + }, []); + + const onDragEnd = useCallback(() => { + dragging.current = false; + document.body.style.cursor = ''; + document.body.style.userSelect = ''; + }, []); + + const [initialDraftId, setInitialDraftId] = useState(null); + const [workspacePath, setWorkspacePath] = useState(null); + const [stableWorkspaceId] = useState(() => `ws-${Date.now().toString(36)}`); + const draftCreated = useRef(false); + + useEffect(() => { + if (draftCreated.current) return; + draftCreated.current = true; + + (async () => { + const seedBody: Record = { workspace_id: stableWorkspaceId }; + if (output) { + const seedFiles: Record = { ...output.files }; + if (output.input_schema && !seedFiles['schema.json']) { + seedFiles['schema.json'] = JSON.stringify(output.input_schema, null, 2); + } + seedBody.files = seedFiles; + seedBody.meta = { name: output.name, description: output.description }; + } + try { + const res = await fetch(`${WORKSPACE_API}/seed`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(seedBody), + }); + const data = await res.json(); + setWorkspacePath(data.path); + const action = dispatch(createDraftSession({ + mode: 'view-builder', + setActive: false, + targetDirectory: data.path, + })); + setInitialDraftId(action.payload.draftId); + } catch { + const action = dispatch(createDraftSession({ mode: 'view-builder', setActive: false })); + setInitialDraftId(action.payload.draftId); + } + })(); + }, [dispatch, output, stableWorkspaceId]); + + const effectiveSessionId = useAppSelector((state) => { + if (!initialDraftId) return null; + if (state.agents.sessions[initialDraftId]) return initialDraftId; + return state.agents.activeSessionId; + }); + + const agentStatus = useAppSelector((state) => { + if (!effectiveSessionId) return null; + return state.agents.sessions[effectiveSessionId]?.status ?? null; + }); + + const isLaunched = !!effectiveSessionId && effectiveSessionId !== initialDraftId; + const isAgentActive = agentStatus === 'running' || agentStatus === 'waiting_approval'; + + const workspaceId = workspacePath ? stableWorkspaceId : null; + + const initialContextPaths = useMemo( + () => workspacePath ? [{ path: workspacePath, type: 'directory' as const }] : undefined, + [workspacePath], + ); + + const pollRef = useRef | null>(null); + const lastPollRef = useRef(''); + + const nameSetByMeta = useRef(false); + const [fileVersion, setFileVersion] = useState(0); + + const pollWorkspace = useCallback(async () => { + if (!workspaceId) return; + try { + const res = await fetch(`${WORKSPACE_API}/${workspaceId}`); + if (!res.ok) return; + const data = await res.json(); + const fingerprint = JSON.stringify(data); + if (fingerprint === lastPollRef.current) return; + lastPollRef.current = fingerprint; + + if (data.files) { + setFiles(data.files); + setFileVersion(v => v + 1); + } + + if (data.meta) { + if (data.meta.name && !nameSetByMeta.current) { + nameSetByMeta.current = true; + setName((prev) => prev || data.meta.name); + } + if (data.meta.description) { + setDescription((prev) => prev || data.meta.description); + } + } + } catch {} + }, [workspaceId]); + + useEffect(() => { + if (!workspaceId) return; + pollWorkspace(); + pollRef.current = setInterval(pollWorkspace, POLL_INTERVAL_MS); + return () => { + if (pollRef.current) clearInterval(pollRef.current); + }; + }, [workspaceId, pollWorkspace]); + + const prevAgentActive = useRef(false); + useEffect(() => { + if (prevAgentActive.current && !isAgentActive && workspaceId) { + setTimeout(pollWorkspace, 500); + } + prevAgentActive.current = isAgentActive; + }, [isAgentActive, workspaceId, pollWorkspace]); + + useEffect(() => { + return () => { + if (initialDraftId) { + dispatch(removeDraftSession(initialDraftId)); + } + }; + }, [initialDraftId, dispatch]); + + const schemaText = files['schema.json'] ?? '{"type":"object","properties":{},"required":[]}'; + + const parsedSchema = useMemo(() => { + try { return JSON.parse(schemaText); } catch { return { type: 'object', properties: {} }; } + }, [schemaText]); + + const testInputDefault = useMemo(() => getDefault(parsedSchema), [parsedSchema]); + const [testInput, setTestInput] = useState>(testInputDefault); + + useEffect(() => { + setTestInput(getDefault(parsedSchema)); + }, [schemaText]); + + useEffect(() => { + if (autoRunInitialized.current || !savedAutoRun) return; + if (!autoRunEnabled) return; + autoRunInitialized.current = true; + const timer = setTimeout(() => { + autoRunInputRef.current?.setContent( + savedAutoRun.prompt || '', + savedAutoRun.context_paths?.map((cp) => ({ path: cp.path, type: (cp.type as 'file' | 'directory') || 'file' })), + savedAutoRun.forced_tools, + ); + }, 100); + return () => clearTimeout(timer); + }, [savedAutoRun, autoRunEnabled]); + + const savedRef = useRef(!!output); + + const getAutoRunConfig = (): AutoRunConfig => { + const config = autoRunInputRef.current?.getConfig(); + return { + enabled: autoRunEnabled, + prompt: config?.prompt ?? '', + context_paths: config?.contextPaths?.map((cp) => ({ path: cp.path, type: cp.type })) ?? [], + forced_tools: (config?.forcedTools ?? []).map(({ label, tools, iconKey }) => ({ label, tools, iconKey })), + mode: autoRunMode, + model: autoRunModel, + }; + }; + + const buildBody = () => { + let schema: Record; + try { schema = JSON.parse(schemaText); } catch { schema = { type: 'object', properties: {} }; } + + const outputFiles = { ...files }; + delete outputFiles['meta.json']; + delete outputFiles['schema.json']; + + return { + name: name || 'Untitled View', + description, + icon: 'view_quilt', + input_schema: schema, + files: outputFiles, + auto_run_config: getAutoRunConfig(), + }; + }; + + const captureThumbnailAsync = (outputId: string) => { + captureViewThumbnail(files['index.html'] ?? '', testInput, files) + .then((thumbnail) => { + if (thumbnail) { + dispatch(updateOutput({ id: outputId, thumbnail })); + } + }) + .catch(() => {}); + }; + + const handleSave = async (close = true) => { + setSaving(true); + try { + const body = buildBody(); + let savedId: string; + if (output) { + await dispatch(updateOutput({ id: output.id, ...body })).unwrap(); + savedId = output.id; + } else { + const created = await dispatch(createOutput(body)).unwrap(); + savedId = created.id; + } + savedRef.current = true; + if (close) onClose(); + captureThumbnailAsync(savedId); + } catch (err: any) { + console.error('Failed to save output:', err); + } finally { + setSaving(false); + } + }; + + const handleClose = async () => { + if (!savedRef.current && (files['index.html'] ?? '').trim()) { + try { + const body = buildBody(); + let savedId: string; + if (output) { + await dispatch(updateOutput({ id: output.id, ...body })).unwrap(); + savedId = output.id; + } else { + const created = await dispatch(createOutput(body)).unwrap(); + savedId = created.id; + } + captureThumbnailAsync(savedId); + } catch {} + } + onClose(); + }; + + const handleRunPreview = async () => { + if (!output) { + setExecuteResult(null); + return; + } + setConsoleEntry({ timestamp: Date.now(), inputData: testInput, stdout: null, stderr: null, backendResult: null, error: null, source: 'execute', running: true }); + setHasNewConsoleOutput(true); + try { + const res = await dispatch( + executeOutput({ output_id: output.id, input_data: testInput }) + ).unwrap(); + setExecuteResult(res); + setConsoleEntry({ timestamp: Date.now(), inputData: res.input_data, stdout: res.stdout ?? null, stderr: res.stderr ?? null, backendResult: res.backend_result, error: res.error, source: 'execute' }); + } catch (e: any) { + setConsoleEntry({ timestamp: Date.now(), inputData: testInput, stdout: null, stderr: null, backendResult: null, error: e?.message || 'Execution failed', source: 'execute' }); + } + }; + + const handleAutoRun = async () => { + const config = autoRunInputRef.current?.getConfig(); + if (!config?.prompt?.trim()) return; + setAutoRunning(true); + + let schema: Record; + try { schema = JSON.parse(schemaText); } catch { schema = { type: 'object', properties: {} }; } + const forcedToolNames = config.forcedTools.flatMap((ft) => ft.tools); + + if (forcedToolNames.length > 0 && output?.id) { + try { + const res = await dispatch(autoRunAgentOutput({ + prompt: config.prompt, + input_schema: schema, + output_id: output.id, + model: autoRunModel, + forced_tools: forcedToolNames, + context_paths: config.contextPaths.map((cp) => ({ path: cp.path, type: cp.type })), + })).unwrap(); + setAutoRunSessionId(res.session_id); + const ws = createSessionWs(res.session_id); + ws.connect(); + autoRunWsRef.current = ws; + } catch { + setAutoRunning(false); + } + } else { + try { + const backendCode = files['backend.py'] ?? null; + const res = await dispatch(autoRunOutput({ + prompt: config.prompt, + input_schema: schema, + backend_code: backendCode || undefined, + context_paths: config.contextPaths.map((cp) => ({ path: cp.path, type: cp.type })), + forced_tools: forcedToolNames.length > 0 ? forcedToolNames : undefined, + model: autoRunModel, + })).unwrap(); + if (res.input_data) { + setTestInput(res.input_data); + setExecuteResult({ + output_id: output?.id ?? '', + output_name: name, + frontend_code: files['index.html'] ?? '', + input_data: res.input_data, + backend_result: res.backend_result, + stdout: res.stdout ?? null, + stderr: res.stderr ?? null, + error: res.error, + }); + setConsoleEntry({ timestamp: Date.now(), inputData: res.input_data, stdout: res.stdout ?? null, stderr: res.stderr ?? null, backendResult: res.backend_result, error: res.error, source: 'auto-run' }); + setHasNewConsoleOutput(true); + setActiveTab(TAB_PREVIEW); + } + } catch {} + setAutoRunning(false); + } + }; + + useEffect(() => { + if (!autoRunSessionId || !autoRunSessionStatus) return; + if (autoRunSessionStatus !== 'completed' && autoRunSessionStatus !== 'error' && autoRunSessionStatus !== 'stopped') return; + + let extracted = false; + for (const msg of autoRunMessages) { + if (msg.role !== 'tool_call' || typeof msg.content !== 'object') continue; + const tc = msg.content as { tool?: string; input?: Record }; + if (tc.tool !== 'RenderOutput' || !tc.input?.input_data) continue; + setTestInput(tc.input.input_data); + setExecuteResult({ + output_id: output?.id ?? '', + output_name: name, + frontend_code: files['index.html'] ?? '', + input_data: tc.input.input_data, + backend_result: null, + stdout: null, + stderr: null, + error: null, + }); + setConsoleEntry({ timestamp: Date.now(), inputData: tc.input.input_data, stdout: null, stderr: null, backendResult: null, error: null, source: 'agent' }); + setHasNewConsoleOutput(true); + setActiveTab(TAB_PREVIEW); + extracted = true; + break; + } + + if (!extracted && autoRunSessionStatus === 'error') { + const lastSys = [...autoRunMessages].reverse().find((m) => m.role === 'system'); + if (lastSys) { + const errMsg = typeof lastSys.content === 'string' ? lastSys.content : JSON.stringify(lastSys.content); + setExecuteResult({ + output_id: output?.id ?? '', + output_name: name, + frontend_code: files['index.html'] ?? '', + input_data: {}, + backend_result: null, + stdout: null, + stderr: null, + error: errMsg, + }); + setConsoleEntry({ timestamp: Date.now(), inputData: {}, stdout: null, stderr: null, backendResult: null, error: errMsg, source: 'agent' }); + setHasNewConsoleOutput(true); + } + } + + setAutoRunning(false); + + if (autoRunWsRef.current) { + autoRunWsRef.current.disconnect(); + autoRunWsRef.current = null; + } + cleanupAutoRunAgent(autoRunSessionId).catch(() => {}); + setTimeout(() => setAutoRunSessionId(null), 300); + }, [autoRunSessionId, autoRunSessionStatus]); + + useEffect(() => { + autoRunLogEndRef.current?.scrollIntoView({ behavior: 'smooth' }); + }, [autoRunMessages.length]); + + useEffect(() => { + return () => { + if (autoRunWsRef.current) { + autoRunWsRef.current.disconnect(); + autoRunWsRef.current = null; + } + if (autoRunSessionId) { + cleanupAutoRunAgent(autoRunSessionId).catch(() => {}); + } + }; + }, [autoRunSessionId]); + + const workspaceServeUrl = workspaceId + ? `${SERVE_BASE}/workspace/${workspaceId}/serve/index.html` + : undefined; + + const filePaths = useMemo(() => Object.keys(files).filter(p => p !== 'meta.json').sort(), [files]); + const fileTree = useMemo(() => buildFileTree(filePaths), [filePaths]); + + const updateFile = useCallback((path: string, content: string) => { + setFiles(prev => ({ ...prev, [path]: content })); + }, []); + + const [newFileName, setNewFileName] = useState(''); + const [showNewFileInput, setShowNewFileInput] = useState(false); + const newFileInputRef = useRef(null); + + useEffect(() => { + if (showNewFileInput) { + setTimeout(() => newFileInputRef.current?.focus(), 50); + } + }, [showNewFileInput]); + + const addFile = useCallback((fileName: string) => { + const trimmed = fileName.trim(); + if (!trimmed || files[trimmed] != null) return; + setFiles(prev => ({ ...prev, [trimmed]: '' })); + setActiveFile(trimmed); + setShowNewFileInput(false); + setNewFileName(''); + if (workspaceId) { + fetch(`${WORKSPACE_API}/${workspaceId}/file/${encodeURIComponent(trimmed)}`, { + method: 'PUT', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ content: '' }), + }).catch(() => {}); + } + }, [files, workspaceId]); + + const deleteFile = useCallback((filePath: string) => { + setFiles(prev => { + const next = { ...prev }; + delete next[filePath]; + return next; + }); + if (activeFile === filePath) { + const remaining = filePaths.filter(p => p !== filePath); + setActiveFile(remaining[0] ?? 'index.html'); + } + if (workspaceId) { + fetch(`${WORKSPACE_API}/${workspaceId}/file/${encodeURIComponent(filePath)}`, { + method: 'DELETE', + }).catch(() => {}); + } + }, [activeFile, filePaths, workspaceId]); + + const activeFileContent = files[activeFile] ?? ''; + + return ( + + + {/* Left panel — AgentChat */} + + {effectiveSessionId ? ( + + ) : ( + + + Initializing agent... + + + )} + + + {/* Resize handle */} + + + {/* Right panel */} + + {/* Header bar */} + + + + + + setName(e.target.value)} + placeholder="View name" + variant="standard" + sx={{ + flex: 1, + maxWidth: 220, + '& .MuiInput-input': { fontSize: '0.9rem', fontWeight: 600, color: c.text.primary }, + '& .MuiInput-underline:before': { borderColor: 'transparent' }, + '& .MuiInput-underline:hover:before': { borderColor: c.border.medium }, + }} + /> + + setDescription(e.target.value)} + placeholder="Description" + variant="standard" + size="small" + sx={{ + flex: 2, + '& .MuiInput-input': { fontSize: '0.78rem', color: c.text.muted }, + '& .MuiInput-underline:before': { borderColor: 'transparent' }, + }} + /> + + {autoRunEnabled && ( + + )} + + + + {/* Tab bar */} + + setActiveTab(v)} + sx={{ + flex: 1, + minHeight: 36, + '& .MuiTab-root': { + minHeight: 36, + fontSize: '0.78rem', + textTransform: 'none', + fontWeight: 500, + py: 0, + }, + '& .MuiTabs-indicator': { + bgcolor: c.accent.primary, + }, + }} + > + + + + + {showConsole && } + + {activeTab === TAB_PREVIEW && ( + <> + + previewRef.current?.reload()} + sx={{ color: c.text.muted }} + > + + + + {output && ( + + + + + + )} + + )} + + { + if (showConsole && activeTab === TAB_CONSOLE) { + setShowConsole(false); + setActiveTab(TAB_PREVIEW); + } else if (showConsole) { + setShowConsole(false); + if (activeTab === TAB_CONSOLE) setActiveTab(TAB_PREVIEW); + } else { + setShowConsole(true); + setHasNewConsoleOutput(false); + setActiveTab(TAB_CONSOLE); + } + }} + sx={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + cursor: 'pointer', + px: 0.75, + py: 0.5, + mr: 1, + borderRadius: 1, + position: 'relative', + bgcolor: showConsole ? c.accent.primary + '15' : 'transparent', + '&:hover': { bgcolor: showConsole ? c.accent.primary + '25' : c.bg.elevated }, + transition: 'background-color 0.15s', + }} + > + + {'>_'} + + {hasNewConsoleOutput && !showConsole && ( + + )} + + + + + {/* Tab content */} + + {activeTab === TAB_PREVIEW && ( + + )} + {activeTab === TAB_CODE && ( + + {/* File tree sidebar */} + + + + Files + + + setShowNewFileInput(true)} + sx={{ p: 0.25, color: c.text.ghost, '&:hover': { color: c.accent.primary } }} + > + + + + + + + {fileTree.map((node) => ( + + ))} + {filePaths.length === 0 && ( + + No files yet + + )} + + + {showNewFileInput && ( + + setNewFileName(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter') { addFile(newFileName); } + if (e.key === 'Escape') { setShowNewFileInput(false); setNewFileName(''); } + }} + onBlur={() => { + if (newFileName.trim()) { addFile(newFileName); } + else { setShowNewFileInput(false); setNewFileName(''); } + }} + placeholder="path/to/file.js" + variant="standard" + fullWidth + autoFocus + sx={{ + '& .MuiInput-input': { + fontSize: '0.74rem', + fontFamily: c.font.mono, + color: c.text.primary, + py: 0.25, + }, + '& .MuiInput-underline:before': { borderColor: c.border.subtle }, + '& .MuiInput-underline:after': { borderColor: c.accent.primary }, + }} + /> + + )} + + {/* Editor area */} + + {activeFile && files[activeFile] != null ? ( + updateFile(activeFile, val)} + language={getEditorLanguage(activeFile)} + placeholder={`// ${activeFile}`} + /> + ) : ( + + + Select a file to edit + + + )} + + + )} + {activeTab === TAB_TEST_INPUT && ( + + + + + + + + + + )} + {activeTab === TAB_CONSOLE && ( + + )} + + + setAutoRunEnabled(v)} + size="small" + sx={{ + '& .MuiSwitch-switchBase.Mui-checked': { color: '#f59e0b' }, + '& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track': { bgcolor: '#f59e0b' }, + }} + /> + + {autoRunEnabled ? 'Auto Run enabled' : 'Auto Run disabled'} + + + {autoRunEnabled && ( + + )} + + + {autoRunEnabled ? ( + + + Describe what data to generate for this view. When triggered, an LLM will produce input data matching your schema and populate the preview. + + {}} + mode={autoRunMode} + onModeChange={setAutoRunMode} + model={autoRunModel} + onModelChange={setAutoRunModel} + /> + + {(autoRunSessionId || autoRunMessages.length > 0) && ( + + )} + + ) : ( + + + + Enable Auto Run to generate live data for this view + + + Configure a prompt that describes what data to generate. An LLM will produce input matching your schema and populate the preview automatically. + + + )} + + + + + + + ); +}; + +export default ViewEditor; diff --git a/frontend/src/app/pages/Views/ViewPreview.tsx b/frontend/src/app/pages/Views/ViewPreview.tsx new file mode 100644 index 00000000..bf9c7410 --- /dev/null +++ b/frontend/src/app/pages/Views/ViewPreview.tsx @@ -0,0 +1,163 @@ +import React, { useRef, useEffect, useMemo, forwardRef, useImperativeHandle, useState } from 'react'; +import Box from '@mui/material/Box'; +import { useElementSelection } from '@/app/components/ElementSelectionContext'; +import { useIframeElementSelector } from './useIframeElementSelector'; + +export interface ViewPreviewHandle { + reload: () => void; +} + +interface Props { + /** URL-based serving (multi-file support). Takes priority over frontendCode. */ + serveUrl?: string; + /** Legacy: raw HTML string rendered via srcdoc. */ + frontendCode?: string; + inputData: Record; + backendResult?: Record | null; + style?: React.CSSProperties; +} + +function buildSrcdoc( + frontendCode: string, + inputData: Record, + backendResult: Record | null, +): string { + const inputJson = JSON.stringify(inputData); + const resultJson = JSON.stringify(backendResult); + + const injection = ``; + + if (frontendCode.includes('')) { + return frontendCode.replace('', `${injection}\n`); + } + if (frontendCode.includes(', backendResult: Record | null): string { + const payload = JSON.stringify({ i: inputData, r: backendResult }); + return btoa(unescape(encodeURIComponent(payload))); +} + +const ViewPreview = forwardRef(({ + serveUrl, + frontendCode, + inputData, + backendResult = null, + style, +}, ref) => { + const iframeRef = useRef(null); + const ctx = useElementSelection(); + const [reloadKey, setReloadKey] = useState(0); + + useEffect(() => { + if (ctx && iframeRef.current) { + ctx.iframeRef.current = iframeRef.current; + } + }, [ctx, frontendCode, serveUrl]); + + useIframeElementSelector(iframeRef); + + const iframeSrc = useMemo(() => { + if (!serveUrl) return undefined; + const dataParam = encodeDataParam(inputData, backendResult); + const sep = serveUrl.includes('?') ? '&' : '?'; + return `${serveUrl}${sep}_d=${encodeURIComponent(dataParam)}&_v=${reloadKey}`; + }, [serveUrl, inputData, backendResult, reloadKey]); + + const srcdoc = useMemo(() => { + if (serveUrl || !frontendCode) return undefined; + return buildSrcdoc(frontendCode, inputData, backendResult); + }, [serveUrl, frontendCode, inputData, backendResult]); + + useImperativeHandle(ref, () => ({ + reload: () => { + if (serveUrl) { + setReloadKey(k => k + 1); + } else if (iframeRef.current && srcdoc) { + iframeRef.current.srcdoc = ''; + requestAnimationFrame(() => { + if (iframeRef.current) iframeRef.current.srcdoc = srcdoc; + }); + } + }, + }), [serveUrl, srcdoc]); + + useEffect(() => { + if (iframeRef.current && srcdoc != null) { + iframeRef.current.srcdoc = srcdoc; + } + }, [srcdoc]); + + const hasContent = !!(serveUrl || frontendCode?.trim()); + + if (!hasContent) { + return ( + + No preview available + + ); + } + + const selectActive = ctx?.selectMode ?? false; + + return ( + +
  2. S(bcTweX!!_){>Jc*aBWslZZLT6s1H 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 literal 0 HcmV?d00001 diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c9a1b708cf51be889177787cb85714d6b96b8401 GIT binary patch literal 6010 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 + + + + + Open Swarm + + + + + +
    + + \ No newline at end of file diff --git a/frontend/public/logo.png b/frontend/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8b9f86117d01dbf67e874f4deaaaa3686f26d9c6 GIT binary patch literal 327756 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