From a5f4fa62312be9125398399e08bd3ddc27a354c1 Mon Sep 17 00:00:00 2001 From: CommonHuman-Lab Date: Thu, 13 Aug 2026 20:01:05 +0200 Subject: [PATCH 01/28] Payload workbench --- CHANGELOG.md | 5 + backend/server_api/__init__.py | 5 +- backend/server_api/ai_payload/__init__.py | 1 - .../server_api/payload_workbench/__init__.py | 1 + .../server_api/payload_workbench/routes.py | 148 ++++ backend/server_core/__init__.py | 2 +- backend/server_core/db.py | 82 ++ backend/server_core/generators/__init__.py | 0 .../{ => generators}/ai_exploit_generator.py | 2 +- .../generators/payload_generator.py} | 75 +- .../server_core/payload_workbench/__init__.py | 0 .../payload_workbench/operations/__init__.py | 0 .../operations/evasion/__init__.py | 0 .../operations/evasion/apply_evasion.py | 26 + .../operations/generate/__init__.py | 0 .../operations/generate/_common.py | 56 ++ .../operations/generate/cmd_injection.py | 8 + .../operations/generate/lfi.py | 8 + .../operations/generate/sqli.py | 43 + .../operations/generate/ssti.py | 8 + .../operations/generate/waf_bypass.py | 39 + .../operations/generate/xss.py | 11 + .../operations/generate/xxe.py | 8 + .../server_core/payload_workbench/registry.py | 93 +++ backend/server_core/singletons.py | 2 +- backend/server_core/tool_specs/ai_payload.py | 2 +- backend/server_core/tool_specs/vuln_intel.py | 2 +- config.py | 2 +- ...n-CxNWgwlw.js => ActionButton-Bp2o-UmG.js} | 2 +- .../assets/ActionButton-DbNYq1OK.css | 1 - .../assets/ActionButton-iD1NIpoY.css | 1 + ...ge-B37UOYE2.js => BrowserPage-DMUPGaN0.js} | 2 +- ...wyVz.js => CollapsibleSection-BIM2TLZx.js} | 2 +- .../dashboard/assets/EmptyState-BDf3GANM.css | 1 + .../dashboard/assets/EmptyState-JIUPQFFE.js | 1 + ...pPage-DuOWcYNS.js => HelpPage-C08EEWSd.js} | 4 +- ...Strip-Cnf9m6Sg.js => KpiStrip-bw0w7OHE.js} | 2 +- .../dashboard/assets/LoadingState-BrtCNXLG.js | 1 + .../assets/LoadingState-CRmz-Pzq.css | 1 + ...sPage-BNN_sb3K.js => LogsPage-C0Xz4ivo.js} | 2 +- ...tPage-CQxk_46b.js => LootPage-DIqMD9yz.js} | 2 +- ...odal-eFcesyiR.js => NoteModal-CeEbfFg8.js} | 4 +- .../assets/PayloadWorkbenchPage-BFWPg-PG.js | 2 + .../assets/PayloadWorkbenchPage-BYxEjfeY.css | 1 + ...ge-HbqISXPY.js => PluginsPage-B6W3yshe.js} | 2 +- ...ge--Iq3jyce.js => ReportsPage-D9KFC5nO.js} | 2 +- .../assets/ResourceSection-BDk7SrS4.js | 1 - .../assets/ResourceSection-D4m980BP.js | 1 + ...unPage-Cs7A2qDb.js => RunPage-4_p_zYCF.js} | 4 +- ...Cw0lz4Ij.js => RunResultModal-B2Nwii1l.js} | 2 +- .../assets/SessionDetailPage-C26J1d9a.css | 1 + .../assets/SessionDetailPage-D_Q_1SMX.js | 12 + .../assets/SessionDetailPage-G5ld7-y8.js | 12 - .../assets/SessionDetailPage-uRk5Wvzd.css | 1 - .../dashboard/assets/SessionsPage-CkAlaXnC.js | 1 - .../dashboard/assets/SessionsPage-Dy97JECH.js | 1 + ...e-C110GkpJ.js => SettingsPage-DPYsKTx8.js} | 2 +- .../{Sheet-CPyVkJ3G.js => Sheet-BUKUD1WD.js} | 2 +- .../dashboard/assets/TasksPage-5KkYMMeP.js | 1 + .../dashboard/assets/TasksPage-DX3euw-I.js | 1 - .../dashboard/assets/TasksPage-DihLoG0t.css | 1 - .../dashboard/assets/TasksPage-mM7xLKrh.css | 1 + ...Page-Dlctbi3O.js => ToolsPage-B__pn-Q5.js} | 2 +- ...age-DHf9c-Jk.js => VerifyPage-hJmXDeNV.js} | 2 +- .../assets/WorkbenchPage-BbiAncyR.css | 1 - .../assets/WorkbenchPage-BsVlFHOn.css | 1 + .../assets/WorkbenchPage-Do8xGDQl.js | 1 + .../assets/WorkbenchPage-Dv9fFEMg.js | 1 + .../assets/WorkbenchPage-M_xobbfg.js | 1 - .../{demo-D7-kgQFW.js => demo-DeQ6NPWw.js} | 2 +- frontend/dashboard/assets/index-DoDmaCqd.js | 9 - frontend/dashboard/assets/index-i1OI5Xdf.js | 9 + ...{shared-CjcIAkCZ.js => shared-D_CYHSf8.js} | 2 +- .../assets/vendor-lucide-CiSEz5Po.js | 1 + .../assets/vendor-lucide-tZ8AzO6l.js | 1 - ...ZSHC-G5.js => vendor-markdown-C0J_Dsog.js} | 2 +- ...t-DL0_5iWL.js => vendor-react-3wbGPIgR.js} | 2 +- ...vkoFyWX.js => vendor-recharts-CGVxUEMf.js} | 2 +- frontend/dashboard/index.html | 14 +- frontend/ui/src/App.tsx | 4 + frontend/ui/src/api/endpoints.ts | 37 + frontend/ui/src/api/types/index.ts | 16 + .../ui/src/api/types/payload-workbench.ts | 100 +++ frontend/ui/src/app/MainContent.tsx | 13 +- frontend/ui/src/app/navRegistry.ts | 3 +- frontend/ui/src/app/routing.ts | 26 +- frontend/ui/src/app/useAppRouting.ts | 16 +- .../src/components/modals/SendToLootModal.tsx | 5 +- .../ui/src/components/ui/ActionButton.css | 5 + frontend/ui/src/components/ui/SearchInput.tsx | 5 +- .../payload-workbench/OperationPanel.tsx | 190 +++++ .../PayloadWorkbenchPage.css | 71 ++ .../PayloadWorkbenchPage.tsx | 226 ++++++ .../pages/payload-workbench/RecipePanel.tsx | 764 ++++++++++++++++++ .../TestAgainstTargetPanel.tsx | 121 +++ .../src/pages/payload-workbench/recipeIO.ts | 47 ++ .../ui/src/pages/workbench/WorkbenchPage.css | 1 + pyproject.toml | 3 +- tests/test_payload_workbench_operations.py | 145 ++++ tests/test_payload_workbench_registry.py | 92 +++ tests/test_payload_workbench_routes.py | 199 +++++ uv.lock | 2 + 102 files changed, 2736 insertions(+), 114 deletions(-) delete mode 100644 backend/server_api/ai_payload/__init__.py create mode 100644 backend/server_api/payload_workbench/__init__.py create mode 100644 backend/server_api/payload_workbench/routes.py create mode 100644 backend/server_core/generators/__init__.py rename backend/server_core/{ => generators}/ai_exploit_generator.py (99%) rename backend/{server_api/ai_payload/generate_payload.py => server_core/generators/payload_generator.py} (77%) create mode 100644 backend/server_core/payload_workbench/__init__.py create mode 100644 backend/server_core/payload_workbench/operations/__init__.py create mode 100644 backend/server_core/payload_workbench/operations/evasion/__init__.py create mode 100644 backend/server_core/payload_workbench/operations/evasion/apply_evasion.py create mode 100644 backend/server_core/payload_workbench/operations/generate/__init__.py create mode 100644 backend/server_core/payload_workbench/operations/generate/_common.py create mode 100644 backend/server_core/payload_workbench/operations/generate/cmd_injection.py create mode 100644 backend/server_core/payload_workbench/operations/generate/lfi.py create mode 100644 backend/server_core/payload_workbench/operations/generate/sqli.py create mode 100644 backend/server_core/payload_workbench/operations/generate/ssti.py create mode 100644 backend/server_core/payload_workbench/operations/generate/waf_bypass.py create mode 100644 backend/server_core/payload_workbench/operations/generate/xss.py create mode 100644 backend/server_core/payload_workbench/operations/generate/xxe.py create mode 100644 backend/server_core/payload_workbench/registry.py rename frontend/dashboard/assets/{ActionButton-CxNWgwlw.js => ActionButton-Bp2o-UmG.js} (75%) delete mode 100644 frontend/dashboard/assets/ActionButton-DbNYq1OK.css create mode 100644 frontend/dashboard/assets/ActionButton-iD1NIpoY.css rename frontend/dashboard/assets/{BrowserPage-B37UOYE2.js => BrowserPage-DMUPGaN0.js} (74%) rename frontend/dashboard/assets/{CollapsibleSection-BMB1wyVz.js => CollapsibleSection-BIM2TLZx.js} (75%) create mode 100644 frontend/dashboard/assets/EmptyState-BDf3GANM.css create mode 100644 frontend/dashboard/assets/EmptyState-JIUPQFFE.js rename frontend/dashboard/assets/{HelpPage-DuOWcYNS.js => HelpPage-C08EEWSd.js} (85%) rename frontend/dashboard/assets/{KpiStrip-Cnf9m6Sg.js => KpiStrip-bw0w7OHE.js} (73%) create mode 100644 frontend/dashboard/assets/LoadingState-BrtCNXLG.js create mode 100644 frontend/dashboard/assets/LoadingState-CRmz-Pzq.css rename frontend/dashboard/assets/{LogsPage-BNN_sb3K.js => LogsPage-C0Xz4ivo.js} (80%) rename frontend/dashboard/assets/{LootPage-CQxk_46b.js => LootPage-DIqMD9yz.js} (81%) rename frontend/dashboard/assets/{NoteModal-eFcesyiR.js => NoteModal-CeEbfFg8.js} (96%) create mode 100644 frontend/dashboard/assets/PayloadWorkbenchPage-BFWPg-PG.js create mode 100644 frontend/dashboard/assets/PayloadWorkbenchPage-BYxEjfeY.css rename frontend/dashboard/assets/{PluginsPage-HbqISXPY.js => PluginsPage-B6W3yshe.js} (78%) rename frontend/dashboard/assets/{ReportsPage--Iq3jyce.js => ReportsPage-D9KFC5nO.js} (77%) delete mode 100644 frontend/dashboard/assets/ResourceSection-BDk7SrS4.js create mode 100644 frontend/dashboard/assets/ResourceSection-D4m980BP.js rename frontend/dashboard/assets/{RunPage-Cs7A2qDb.js => RunPage-4_p_zYCF.js} (76%) rename frontend/dashboard/assets/{RunResultModal-Cw0lz4Ij.js => RunResultModal-B2Nwii1l.js} (74%) create mode 100644 frontend/dashboard/assets/SessionDetailPage-C26J1d9a.css create mode 100644 frontend/dashboard/assets/SessionDetailPage-D_Q_1SMX.js delete mode 100644 frontend/dashboard/assets/SessionDetailPage-G5ld7-y8.js delete mode 100644 frontend/dashboard/assets/SessionDetailPage-uRk5Wvzd.css delete mode 100644 frontend/dashboard/assets/SessionsPage-CkAlaXnC.js create mode 100644 frontend/dashboard/assets/SessionsPage-Dy97JECH.js rename frontend/dashboard/assets/{SettingsPage-C110GkpJ.js => SettingsPage-DPYsKTx8.js} (81%) rename frontend/dashboard/assets/{Sheet-CPyVkJ3G.js => Sheet-BUKUD1WD.js} (78%) create mode 100644 frontend/dashboard/assets/TasksPage-5KkYMMeP.js delete mode 100644 frontend/dashboard/assets/TasksPage-DX3euw-I.js delete mode 100644 frontend/dashboard/assets/TasksPage-DihLoG0t.css create mode 100644 frontend/dashboard/assets/TasksPage-mM7xLKrh.css rename frontend/dashboard/assets/{ToolsPage-Dlctbi3O.js => ToolsPage-B__pn-Q5.js} (68%) rename frontend/dashboard/assets/{VerifyPage-DHf9c-Jk.js => VerifyPage-hJmXDeNV.js} (74%) delete mode 100644 frontend/dashboard/assets/WorkbenchPage-BbiAncyR.css create mode 100644 frontend/dashboard/assets/WorkbenchPage-BsVlFHOn.css create mode 100644 frontend/dashboard/assets/WorkbenchPage-Do8xGDQl.js create mode 100644 frontend/dashboard/assets/WorkbenchPage-Dv9fFEMg.js delete mode 100644 frontend/dashboard/assets/WorkbenchPage-M_xobbfg.js rename frontend/dashboard/assets/{demo-D7-kgQFW.js => demo-DeQ6NPWw.js} (99%) delete mode 100644 frontend/dashboard/assets/index-DoDmaCqd.js create mode 100644 frontend/dashboard/assets/index-i1OI5Xdf.js rename frontend/dashboard/assets/{shared-CjcIAkCZ.js => shared-D_CYHSf8.js} (95%) create mode 100644 frontend/dashboard/assets/vendor-lucide-CiSEz5Po.js delete mode 100644 frontend/dashboard/assets/vendor-lucide-tZ8AzO6l.js rename frontend/dashboard/assets/{vendor-markdown-CZSHC-G5.js => vendor-markdown-C0J_Dsog.js} (99%) rename frontend/dashboard/assets/{vendor-react-DL0_5iWL.js => vendor-react-3wbGPIgR.js} (99%) rename frontend/dashboard/assets/{vendor-recharts-BvkoFyWX.js => vendor-recharts-CGVxUEMf.js} (99%) create mode 100644 frontend/ui/src/api/types/payload-workbench.ts create mode 100644 frontend/ui/src/pages/payload-workbench/OperationPanel.tsx create mode 100644 frontend/ui/src/pages/payload-workbench/PayloadWorkbenchPage.css create mode 100644 frontend/ui/src/pages/payload-workbench/PayloadWorkbenchPage.tsx create mode 100644 frontend/ui/src/pages/payload-workbench/RecipePanel.tsx create mode 100644 frontend/ui/src/pages/payload-workbench/TestAgainstTargetPanel.tsx create mode 100644 frontend/ui/src/pages/payload-workbench/recipeIO.ts create mode 100644 tests/test_payload_workbench_operations.py create mode 100644 tests/test_payload_workbench_registry.py create mode 100644 tests/test_payload_workbench_routes.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 94e83a424..182493f1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 1.9.0 (NEXT) + +### Payload workbench +- New "Payload Workbench" — generate and test payloads (SQLi, XSS, etc.) without leaving the UI. + ## 1.8.0 - exploitotter (2026-08-13) ### Workbench diff --git a/backend/server_api/__init__.py b/backend/server_api/__init__.py index 3c8a31ccd..644c52e32 100644 --- a/backend/server_api/__init__.py +++ b/backend/server_api/__init__.py @@ -1,6 +1,5 @@ from backend.server_api._generic.autoload import register_all_toolspec_blueprints from .ai_assist import * -from .ai_payload import * from .tools_catalog import * from .ui_blueprint import * from .settings import * @@ -13,6 +12,7 @@ from .web_framework import * from .burp_agent import * from .workbench import * +from .payload_workbench import * def register_blueprints(app): """Register all API blueprints with the Flask app.""" @@ -96,3 +96,6 @@ def register_blueprints(app): # Workbench app.register_blueprint(api_workbench_bp) + + # Payload Workbench + app.register_blueprint(api_payload_workbench_bp) diff --git a/backend/server_api/ai_payload/__init__.py b/backend/server_api/ai_payload/__init__.py deleted file mode 100644 index 4e9aba4d4..000000000 --- a/backend/server_api/ai_payload/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .generate_payload import * diff --git a/backend/server_api/payload_workbench/__init__.py b/backend/server_api/payload_workbench/__init__.py new file mode 100644 index 000000000..eb4251bbb --- /dev/null +++ b/backend/server_api/payload_workbench/__init__.py @@ -0,0 +1 @@ +from .routes import * diff --git a/backend/server_api/payload_workbench/routes.py b/backend/server_api/payload_workbench/routes.py new file mode 100644 index 000000000..521b89e37 --- /dev/null +++ b/backend/server_api/payload_workbench/routes.py @@ -0,0 +1,148 @@ +from flask import Blueprint, jsonify, request + +from backend.server_core.singletons import db +from backend.server_core.payload_workbench.registry import CATEGORIES, get_operation, list_operations + +api_payload_workbench_bp = Blueprint("api_payload_workbench", __name__) + + +@api_payload_workbench_bp.route("/api/payload-workbench/operations", methods=["GET"]) +def payload_workbench_operations(): + return jsonify( + { + "success": True, + "categories": CATEGORIES, + "operations": [op.to_dict() for op in list_operations()], + } + ) + + +@api_payload_workbench_bp.route("/api/payload-workbench/run/", methods=["POST"]) +def payload_workbench_run(operation_id: str): + op = get_operation(operation_id) + if op is None: + return jsonify({"success": False, "error": f"Unknown operation: {operation_id}"}) + + params = request.get_json(silent=True) or {} + try: + result = op.run(params) + except ValueError as e: + return jsonify({"success": False, "error": str(e)}) + except Exception as e: + return jsonify({"success": False, "error": f"Operation failed: {e}"}) + + return jsonify({"success": True, **result}) + + +@api_payload_workbench_bp.route("/api/payload-workbench/run-recipe", methods=["POST"]) +def payload_workbench_run_recipe(): + body = request.get_json(silent=True) or {} + current = body.get("input", "") + current_mime = None + continue_on_error = bool(body.get("continue_on_error", False)) + stop_after = body.get("stop_after_step_index") + overrides = body.get("step_input_overrides") or {} + step_results = [] + has_errors = False + + steps = body.get("steps") or [] + if stop_after is not None: + steps = steps[: int(stop_after) + 1] + + def record_failure(operation_id, name, step_input, error): + entry = {"operation_id": operation_id, "input": step_input, "error": error} + if name is not None: + entry["name"] = name + step_results.append(entry) + + for i, step in enumerate(steps): + operation_id = step.get("operation_id") + op = get_operation(operation_id) + step_input = overrides.get(str(i), current) + + if op is None: + error = f"Unknown operation: {operation_id}" + record_failure(operation_id, None, step_input, error) + if not continue_on_error: + return jsonify({"success": False, "error": error, "steps": step_results}) + has_errors = True + continue + + params = dict(step.get("params") or {}) + params["input"] = step_input + try: + result = op.run(params) + except ValueError as e: + record_failure(operation_id, op.name, step_input, str(e)) + if not continue_on_error: + return jsonify({"success": False, "error": str(e), "steps": step_results}) + has_errors = True + continue + except Exception as e: + error = f"Operation failed: {e}" + record_failure(operation_id, op.name, step_input, error) + if not continue_on_error: + return jsonify({"success": False, "error": error, "steps": step_results}) + has_errors = True + continue + + current = result.get("output", "") + current_mime = result.get("output_mime") + entry = {"operation_id": operation_id, "name": op.name, "input": step_input, "output": current} + if current_mime: + entry["output_mime"] = current_mime + step_results.append(entry) + + response = {"success": True, "output": current, "steps": step_results, "has_errors": has_errors} + if current_mime: + response["output_mime"] = current_mime + return jsonify(response) + + +@api_payload_workbench_bp.route("/api/payload-workbench/recipes", methods=["GET"]) +def payload_workbench_list_recipes(): + return jsonify({"success": True, "recipes": db.list_payload_workbench_recipes()}) + + +@api_payload_workbench_bp.route("/api/payload-workbench/recipes", methods=["POST"]) +def payload_workbench_create_recipe(): + body = request.get_json(silent=True) or {} + name = (body.get("name") or "").strip() + if not name: + return jsonify({"success": False, "error": "Recipe name must not be empty"}) + steps = body.get("steps") or [] + recipe_id = db.add_payload_workbench_recipe(name, steps) + return jsonify({"success": True, "recipe": db.get_payload_workbench_recipe(recipe_id)}) + + +@api_payload_workbench_bp.route("/api/payload-workbench/recipes/", methods=["GET"]) +def payload_workbench_get_recipe(recipe_id: str): + recipe = db.get_payload_workbench_recipe(recipe_id) + if recipe is None: + return jsonify({"success": False, "error": f"Unknown recipe: {recipe_id}"}) + return jsonify({"success": True, "recipe": recipe}) + + +@api_payload_workbench_bp.route("/api/payload-workbench/recipes/", methods=["PATCH"]) +def payload_workbench_update_recipe(recipe_id: str): + if db.get_payload_workbench_recipe(recipe_id) is None: + return jsonify({"success": False, "error": f"Unknown recipe: {recipe_id}"}) + body = request.get_json(silent=True) or {} + fields = {} + if "name" in body: + name = (body.get("name") or "").strip() + if not name: + return jsonify({"success": False, "error": "Recipe name must not be empty"}) + fields["name"] = name + if "steps" in body: + fields["steps"] = body.get("steps") or [] + db.update_payload_workbench_recipe(recipe_id, **fields) + return jsonify({"success": True, "recipe": db.get_payload_workbench_recipe(recipe_id)}) + + +@api_payload_workbench_bp.route("/api/payload-workbench/recipes/", methods=["DELETE"]) +def payload_workbench_delete_recipe(recipe_id: str): + if db.get_payload_workbench_recipe(recipe_id) is None: + return jsonify({"success": False, "error": f"Unknown recipe: {recipe_id}"}) + db.delete_payload_workbench_recipe(recipe_id) + return jsonify({"success": True}) diff --git a/backend/server_core/__init__.py b/backend/server_core/__init__.py index 3ddff48c7..5a5c07e70 100644 --- a/backend/server_core/__init__.py +++ b/backend/server_core/__init__.py @@ -20,7 +20,7 @@ from .rate_limit_detector import RateLimitDetector from .failure_recovery_system import FailureRecoverySystem from .performance_monitor import PerformanceMonitor -from .ai_exploit_generator import AIExploitGenerator +from .generators.ai_exploit_generator import AIExploitGenerator from .intelligence.cve_intelligence_manager import CVEIntelligenceManager from .intelligence.intelligent_decision_engine import IntelligentDecisionEngine diff --git a/backend/server_core/db.py b/backend/server_core/db.py index d7793c406..546afba66 100644 --- a/backend/server_core/db.py +++ b/backend/server_core/db.py @@ -120,6 +120,7 @@ def _ensure_tables(self) -> None: self._migrate_chat_messages_stats() self._migrate_credentials_loot() self._migrate_workbench_recipes() + self._migrate_payload_workbench_recipes() logger.debug("db: tables verified") @@ -204,6 +205,24 @@ def _migrate_workbench_recipes(self) -> None: self._conn.commit() logger.debug("db: workbench_recipes table verified") + def _migrate_payload_workbench_recipes(self) -> None: + """Create the payload_workbench_recipes table if missing (existing DBs).""" + with self._lock: + self._conn.executescript(""" + CREATE TABLE IF NOT EXISTS payload_workbench_recipes ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + recipe_id TEXT UNIQUE NOT NULL, + name TEXT NOT NULL, + steps TEXT NOT NULL DEFAULT '[]', + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) + ); + + CREATE INDEX IF NOT EXISTS idx_payload_workbench_recipes_name ON payload_workbench_recipes(name); + """) + self._conn.commit() + logger.debug("db: payload_workbench_recipes table verified") + # ── Internal helpers ───────────────────────────────────────────────────────── def _row_to_dict(self, row: Optional[sqlite3.Row]) -> Optional[Dict[str, Any]]: @@ -712,6 +731,69 @@ def delete_workbench_recipe(self, recipe_id: str) -> None: self._conn.execute("DELETE FROM workbench_recipes WHERE recipe_id = ?", (recipe_id,)) self._conn.commit() + # ── Payload Workbench recipes ──────────────────────────────────────────────── + + def add_payload_workbench_recipe(self, name: str, steps: List[Dict[str, Any]]) -> str: + """Insert a saved Payload Workbench recipe and return its recipe_id.""" + import uuid + recipe_id = f"recipe_{uuid.uuid4().hex[:8]}" + with self._lock: + self._conn.execute( + "INSERT INTO payload_workbench_recipes (recipe_id, name, steps) VALUES (?, ?, ?)", + (recipe_id, name, json.dumps(steps)), + ) + self._conn.commit() + return recipe_id + + def get_payload_workbench_recipe(self, recipe_id: str) -> Optional[Dict[str, Any]]: + """Return a single saved recipe or None.""" + with self._lock: + cur = self._conn.execute("SELECT * FROM payload_workbench_recipes WHERE recipe_id = ?", (recipe_id,)) + row = self._row_to_dict(cur.fetchone()) + if row and isinstance(row.get("steps"), str): + try: + row["steps"] = json.loads(row["steps"]) + except Exception: + row["steps"] = [] + return row + + def list_payload_workbench_recipes(self) -> List[Dict[str, Any]]: + """Return all saved recipes, most recently updated first.""" + with self._lock: + cur = self._conn.execute("SELECT * FROM payload_workbench_recipes ORDER BY updated_at DESC") + rows = self._rows_to_list(cur.fetchall()) + for row in rows: + if isinstance(row.get("steps"), str): + try: + row["steps"] = json.loads(row["steps"]) + except Exception: + row["steps"] = [] + return rows + + def update_payload_workbench_recipe(self, recipe_id: str, **fields: Any) -> None: + """Update allowed fields on a saved recipe.""" + allowed = {"name", "steps"} + updates = {k: v for k, v in fields.items() if k in allowed} + if not updates: + return + if "steps" in updates and isinstance(updates["steps"], list): + updates["steps"] = json.dumps(updates["steps"]) + updates["updated_at"] = datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S") + set_clause = ", ".join(f"{k} = ?" for k in updates) + values = list(updates.values()) + [recipe_id] + with self._lock: + self._conn.execute( + f"UPDATE payload_workbench_recipes SET {set_clause} WHERE recipe_id = ?", + values, + ) + self._conn.commit() + + def delete_payload_workbench_recipe(self, recipe_id: str) -> None: + """Delete a saved recipe.""" + with self._lock: + self._conn.execute("DELETE FROM payload_workbench_recipes WHERE recipe_id = ?", (recipe_id,)) + self._conn.commit() + # ── Lifecycle ───────────────────────────────────────────────────────────────── def close(self) -> None: diff --git a/backend/server_core/generators/__init__.py b/backend/server_core/generators/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/backend/server_core/ai_exploit_generator.py b/backend/server_core/generators/ai_exploit_generator.py similarity index 99% rename from backend/server_core/ai_exploit_generator.py rename to backend/server_core/generators/ai_exploit_generator.py index 334d17d00..c9aa2ebe3 100644 --- a/backend/server_core/ai_exploit_generator.py +++ b/backend/server_core/generators/ai_exploit_generator.py @@ -1,5 +1,5 @@ # ============================================================================ -# AI-POWERED EXPLOIT GENERATION SYSTEM (v6.0 ENHANCEMENT) +# AI-POWERED EXPLOIT GENERATION SYSTEM # ============================================================================ # # This section contains advanced AI-powered exploit generation capabilities diff --git a/backend/server_api/ai_payload/generate_payload.py b/backend/server_core/generators/payload_generator.py similarity index 77% rename from backend/server_api/ai_payload/generate_payload.py rename to backend/server_core/generators/payload_generator.py index f8f34d36f..641691697 100644 --- a/backend/server_api/ai_payload/generate_payload.py +++ b/backend/server_core/generators/payload_generator.py @@ -1,53 +1,54 @@ import logging -from typing import Dict, Any +from typing import Dict, Any, List, Tuple + +from commonhuman_payloads.xss import get_basic_payloads as _xss_basic_payloads +from commonhuman_payloads.xss.advanced import ( + POLYGLOT, + DOM_CLOBBERING, + ANGULAR_TEMPLATE, + VUE_TEMPLATE, + WAF_BYPASS_DOUBLE_ENCODE, + WAF_BYPASS_GLOBAL, + SANITIZER_BYPASS, + UNICODE_CASE_BYPASS, +) +from commonhuman_payloads.sqli import ( + get_boolean_pairs, + get_error_payloads, + get_concat_payloads, + get_dios_payloads, + get_time_payloads, +) logger = logging.getLogger(__name__) +XSS_MARKER = "XSS" + + +def _with_marker(payloads: List[str], marker: str = XSS_MARKER) -> List[str]: + return [p.replace("{marker}", marker) for p in payloads] + + +def _flatten_pairs(pairs: List[Tuple[str, str]]) -> List[str]: + return [p for pair in pairs for p in pair] -# ============================================================================ -# AI-POWERED PAYLOAD GENERATION (v5.0 ENHANCEMENT) UNDER DEVELOPMENT -# ============================================================================ class AIPayloadGenerator: - """AI-powered payload generation system with contextual intelligence""" + """Payload generation system backed by the commonhuman-payloads library""" def __init__(self): self.payload_templates = { "xss": { - "basic": ["", "javascript:alert('XSS')", "'>"], - "advanced": [ - "", - "", - "';alert(String.fromCharCode(88,83,83))//';alert(String.fromCharCode(88,83,83))//", - "\">r;){let r=n[i];t.containerState=r[1],r[0].exit.call(t,e)}n.length=r}function v(){i.write([null]),a=void 0,i=void 0,t.containerState._closeFlow=void 0}}function Et(e,t,n){return K(e,e.attempt(this.parser.constructs.document,t,n),`linePrefix`,this.parser.constructs.disable.null.includes(`codeIndented`)?void 0:4)}function Dt(e){if(e===null||H(e)||W(e))return 1;if(yt(e))return 2}function Ot(e,t,n){let r=[],i=-1;for(;++i1&&e[n][1].end.offset-e[n][1].start.offset>1?2:1;let d={...e[r][1].end},f={...e[n][1].start};Mt(d,-c),Mt(f,c),o={type:c>1?`strongSequence`:`emphasisSequence`,start:d,end:{...e[r][1].end}},s={type:c>1?`strongSequence`:`emphasisSequence`,start:{...e[n][1].start},end:f},a={type:c>1?`strongText`:`emphasisText`,start:{...e[r][1].end},end:{...e[n][1].start}},i={type:c>1?`strong`:`emphasis`,start:{...o.start},end:{...s.end}},e[r][1].end={...o.start},e[n][1].start={...s.end},l=[],e[r][1].end.offset-e[r][1].start.offset&&(l=L(l,[[`enter`,e[r][1],t],[`exit`,e[r][1],t]])),l=L(l,[[`enter`,i,t],[`enter`,o,t],[`exit`,o,t],[`enter`,a,t]]),l=L(l,Ot(t.parser.constructs.insideSpan.null,e.slice(r+1,n),t)),l=L(l,[[`exit`,a,t],[`enter`,s,t],[`exit`,s,t],[`exit`,i,t]]),e[n][1].end.offset-e[n][1].start.offset?(u=2,l=L(l,[[`enter`,e[n][1],t],[`exit`,e[n][1],t]])):u=0,I(e,r-1,n-r+3,l),n=r+l.length-u-2;break}}for(n=-1;++n0&&U(t)?K(e,v,`linePrefix`,a+1)(t):v(t)}function v(t){return t===null||V(t)?e.check(Gt,h,b)(t):(e.enter(`codeFlowValue`),y(t))}function y(t){return t===null||V(t)?(e.exit(`codeFlowValue`),v(t)):(e.consume(t),y)}function b(n){return e.exit(`codeFenced`),t(n)}function x(e,t,n){let i=0;return a;function a(t){return e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),c}function c(t){return e.enter(`codeFencedFence`),U(t)?K(e,l,`linePrefix`,r.parser.constructs.disable.null.includes(`codeIndented`)?void 0:4)(t):l(t)}function l(t){return t===s?(e.enter(`codeFencedFenceSequence`),u(t)):n(t)}function u(t){return t===s?(i++,e.consume(t),u):i>=o?(e.exit(`codeFencedFenceSequence`),U(t)?K(e,d,`whitespace`)(t):d(t)):n(t)}function d(r){return r===null||V(r)?(e.exit(`codeFencedFence`),t(r)):n(r)}}}function Jt(e,t,n){let r=this;return i;function i(t){return t===null?n(t):(e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),a)}function a(e){return r.parser.lazy[r.now().line]?n(e):t(e)}}var Yt={name:`codeIndented`,tokenize:Zt},Xt={partial:!0,tokenize:Qt};function Zt(e,t,n){let r=this;return i;function i(t){return e.enter(`codeIndented`),K(e,a,`linePrefix`,5)(t)}function a(e){let t=r.events[r.events.length-1];return t&&t[1].type===`linePrefix`&&t[2].sliceSerialize(t[1],!0).length>=4?o(e):n(e)}function o(t){return t===null?c(t):V(t)?e.attempt(Xt,o,c)(t):(e.enter(`codeFlowValue`),s(t))}function s(t){return t===null||V(t)?(e.exit(`codeFlowValue`),o(t)):(e.consume(t),s)}function c(n){return e.exit(`codeIndented`),t(n)}}function Qt(e,t,n){let r=this;return i;function i(t){return r.parser.lazy[r.now().line]?n(t):V(t)?(e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),i):K(e,a,`linePrefix`,5)(t)}function a(e){let a=r.events[r.events.length-1];return a&&a[1].type===`linePrefix`&&a[2].sliceSerialize(a[1],!0).length>=4?t(e):V(e)?i(e):n(e)}}var $t={name:`codeText`,previous:tn,resolve:en,tokenize:nn};function en(e){let t=e.length-4,n=3,r,i;if((e[n][1].type===`lineEnding`||e[n][1].type===`space`)&&(e[t][1].type===`lineEnding`||e[t][1].type===`space`)){for(r=n;++r=this.left.length+this.right.length)throw RangeError("Cannot access index `"+e+"` in a splice buffer of size `"+(this.left.length+this.right.length)+"`");return ethis.left.length?this.right.slice(this.right.length-n+this.left.length,this.right.length-e+this.left.length).reverse():this.left.slice(e).concat(this.right.slice(this.right.length-n+this.left.length).reverse())}splice(e,t,n){let r=t||0;this.setCursor(Math.trunc(e));let i=this.right.splice(this.right.length-r,1/0);return n&&an(this.left,n),i.reverse()}pop(){return this.setCursor(1/0),this.left.pop()}push(e){this.setCursor(1/0),this.left.push(e)}pushMany(e){this.setCursor(1/0),an(this.left,e)}unshift(e){this.setCursor(0),this.right.push(e)}unshiftMany(e){this.setCursor(0),an(this.right,e.reverse())}setCursor(e){if(!(e===this.left.length||e>this.left.length&&this.right.length===0||e<0&&this.left.length===0))if(e=4?t(i):e.interrupt(r.parser.constructs.flow,n,t)(i)}}function pn(e,t,n,r,i,a,o,s,c){let l=c||1/0,u=0;return d;function d(t){return t===60?(e.enter(r),e.enter(i),e.enter(a),e.consume(t),e.exit(a),f):t===null||t===32||t===41||ht(t)?n(t):(e.enter(r),e.enter(o),e.enter(s),e.enter(`chunkString`,{contentType:`string`}),h(t))}function f(n){return n===62?(e.enter(a),e.consume(n),e.exit(a),e.exit(i),e.exit(r),t):(e.enter(s),e.enter(`chunkString`,{contentType:`string`}),p(n))}function p(t){return t===62?(e.exit(`chunkString`),e.exit(s),f(t)):t===null||t===60||V(t)?n(t):(e.consume(t),t===92?m:p)}function m(t){return t===60||t===62||t===92?(e.consume(t),p):p(t)}function h(i){return!u&&(i===null||i===41||H(i))?(e.exit(`chunkString`),e.exit(s),e.exit(o),e.exit(r),t(i)):u999||l===null||l===91||l===93&&!c||l===94&&!s&&`_hiddenFootnoteSupport`in o.parser.constructs?n(l):l===93?(e.exit(a),e.enter(i),e.consume(l),e.exit(i),e.exit(r),t):V(l)?(e.enter(`lineEnding`),e.consume(l),e.exit(`lineEnding`),u):(e.enter(`chunkString`,{contentType:`string`}),d(l))}function d(t){return t===null||t===91||t===93||V(t)||s++>999?(e.exit(`chunkString`),u(t)):(e.consume(t),c||=!U(t),t===92?f:d)}function f(t){return t===91||t===92||t===93?(e.consume(t),s++,d):d(t)}}function hn(e,t,n,r,i,a){let o;return s;function s(t){return t===34||t===39||t===40?(e.enter(r),e.enter(i),e.consume(t),e.exit(i),o=t===40?41:t,c):n(t)}function c(n){return n===o?(e.enter(i),e.consume(n),e.exit(i),e.exit(r),t):(e.enter(a),l(n))}function l(t){return t===o?(e.exit(a),c(o)):t===null?n(t):V(t)?(e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),K(e,l,`linePrefix`)):(e.enter(`chunkString`,{contentType:`string`}),u(t))}function u(t){return t===o||t===null||V(t)?(e.exit(`chunkString`),l(t)):(e.consume(t),t===92?d:u)}function d(t){return t===o||t===92?(e.consume(t),u):u(t)}}function gn(e,t){let n;return r;function r(i){return V(i)?(e.enter(`lineEnding`),e.consume(i),e.exit(`lineEnding`),n=!0,r):U(i)?K(e,r,n?`linePrefix`:`lineSuffix`)(i):t(i)}}var _n={name:`definition`,tokenize:yn},vn={partial:!0,tokenize:bn};function yn(e,t,n){let r=this,i;return a;function a(t){return e.enter(`definition`),o(t)}function o(t){return mn.call(r,e,s,n,`definitionLabel`,`definitionLabelMarker`,`definitionLabelString`)(t)}function s(t){return i=R(r.sliceSerialize(r.events[r.events.length-1][1]).slice(1,-1)),t===58?(e.enter(`definitionMarker`),e.consume(t),e.exit(`definitionMarker`),c):n(t)}function c(t){return H(t)?gn(e,l)(t):l(t)}function l(t){return pn(e,u,n,`definitionDestination`,`definitionDestinationLiteral`,`definitionDestinationLiteralMarker`,`definitionDestinationRaw`,`definitionDestinationString`)(t)}function u(t){return e.attempt(vn,d,d)(t)}function d(t){return U(t)?K(e,f,`whitespace`)(t):f(t)}function f(a){return a===null||V(a)?(e.exit(`definition`),r.parser.defined.push(i),t(a)):n(a)}}function bn(e,t,n){return r;function r(t){return H(t)?gn(e,i)(t):n(t)}function i(t){return hn(e,a,n,`definitionTitle`,`definitionTitleMarker`,`definitionTitleString`)(t)}function a(t){return U(t)?K(e,o,`whitespace`)(t):o(t)}function o(e){return e===null||V(e)?t(e):n(e)}}var xn={name:`hardBreakEscape`,tokenize:Sn};function Sn(e,t,n){return r;function r(t){return e.enter(`hardBreakEscape`),e.consume(t),i}function i(r){return V(r)?(e.exit(`hardBreakEscape`),t(r)):n(r)}}var Cn={name:`headingAtx`,resolve:wn,tokenize:Tn};function wn(e,t){let n=e.length-2,r=3,i,a;return e[r][1].type===`whitespace`&&(r+=2),n-2>r&&e[n][1].type===`whitespace`&&(n-=2),e[n][1].type===`atxHeadingSequence`&&(r===n-1||n-4>r&&e[n-2][1].type===`whitespace`)&&(n-=r+1===n?2:4),n>r&&(i={type:`atxHeadingText`,start:e[r][1].start,end:e[n][1].end},a={type:`chunkText`,start:e[r][1].start,end:e[n][1].end,contentType:`text`},I(e,r,n-r+1,[[`enter`,i,t],[`enter`,a,t],[`exit`,a,t],[`exit`,i,t]])),e}function Tn(e,t,n){let r=0;return i;function i(t){return e.enter(`atxHeading`),a(t)}function a(t){return e.enter(`atxHeadingSequence`),o(t)}function o(t){return t===35&&r++<6?(e.consume(t),o):t===null||H(t)?(e.exit(`atxHeadingSequence`),s(t)):n(t)}function s(n){return n===35?(e.enter(`atxHeadingSequence`),c(n)):n===null||V(n)?(e.exit(`atxHeading`),t(n)):U(n)?K(e,s,`whitespace`)(n):(e.enter(`atxHeadingText`),l(n))}function c(t){return t===35?(e.consume(t),c):(e.exit(`atxHeadingSequence`),s(t))}function l(t){return t===null||t===35||H(t)?(e.exit(`atxHeadingText`),s(t)):(e.consume(t),l)}}var En=`address.article.aside.base.basefont.blockquote.body.caption.center.col.colgroup.dd.details.dialog.dir.div.dl.dt.fieldset.figcaption.figure.footer.form.frame.frameset.h1.h2.h3.h4.h5.h6.head.header.hr.html.iframe.legend.li.link.main.menu.menuitem.nav.noframes.ol.optgroup.option.p.param.search.section.summary.table.tbody.td.tfoot.th.thead.title.tr.track.ul`.split(`.`),Dn=[`pre`,`script`,`style`,`textarea`],On={concrete:!0,name:`htmlFlow`,resolveTo:jn,tokenize:Mn},kn={partial:!0,tokenize:Pn},An={partial:!0,tokenize:Nn};function jn(e){let t=e.length;for(;t--&&!(e[t][0]===`enter`&&e[t][1].type===`htmlFlow`););return t>1&&e[t-2][1].type===`linePrefix`&&(e[t][1].start=e[t-2][1].start,e[t+1][1].start=e[t-2][1].start,e.splice(t-2,2)),e}function Mn(e,t,n){let r=this,i,a,o,s,c;return l;function l(e){return u(e)}function u(t){return e.enter(`htmlFlow`),e.enter(`htmlFlowData`),e.consume(t),d}function d(s){return s===33?(e.consume(s),f):s===47?(e.consume(s),a=!0,h):s===63?(e.consume(s),i=3,r.interrupt?t:N):z(s)?(e.consume(s),o=String.fromCharCode(s),g):n(s)}function f(a){return a===45?(e.consume(a),i=2,p):a===91?(e.consume(a),i=5,s=0,m):z(a)?(e.consume(a),i=4,r.interrupt?t:N):n(a)}function p(i){return i===45?(e.consume(i),r.interrupt?t:N):n(i)}function m(i){return i===`CDATA[`.charCodeAt(s++)?(e.consume(i),s===6?r.interrupt?t:O:m):n(i)}function h(t){return z(t)?(e.consume(t),o=String.fromCharCode(t),g):n(t)}function g(s){if(s===null||s===47||s===62||H(s)){let c=s===47,l=o.toLowerCase();return!c&&!a&&Dn.includes(l)?(i=1,r.interrupt?t(s):O(s)):En.includes(o.toLowerCase())?(i=6,c?(e.consume(s),_):r.interrupt?t(s):O(s)):(i=7,r.interrupt&&!r.parser.lazy[r.now().line]?n(s):a?v(s):y(s))}return s===45||B(s)?(e.consume(s),o+=String.fromCharCode(s),g):n(s)}function _(i){return i===62?(e.consume(i),r.interrupt?t:O):n(i)}function v(t){return U(t)?(e.consume(t),v):E(t)}function y(t){return t===47?(e.consume(t),E):t===58||t===95||z(t)?(e.consume(t),b):U(t)?(e.consume(t),y):E(t)}function b(t){return t===45||t===46||t===58||t===95||B(t)?(e.consume(t),b):x(t)}function x(t){return t===61?(e.consume(t),S):U(t)?(e.consume(t),x):y(t)}function S(t){return t===null||t===60||t===61||t===62||t===96?n(t):t===34||t===39?(e.consume(t),c=t,C):U(t)?(e.consume(t),S):w(t)}function C(t){return t===c?(e.consume(t),c=null,T):t===null||V(t)?n(t):(e.consume(t),C)}function w(t){return t===null||t===34||t===39||t===47||t===60||t===61||t===62||t===96||H(t)?x(t):(e.consume(t),w)}function T(e){return e===47||e===62||U(e)?y(e):n(e)}function E(t){return t===62?(e.consume(t),D):n(t)}function D(t){return t===null||V(t)?O(t):U(t)?(e.consume(t),D):n(t)}function O(t){return t===45&&i===2?(e.consume(t),j):t===60&&i===1?(e.consume(t),M):t===62&&i===4?(e.consume(t),P):t===63&&i===3?(e.consume(t),N):t===93&&i===5?(e.consume(t),ne):V(t)&&(i===6||i===7)?(e.exit(`htmlFlowData`),e.check(kn,re,k)(t)):t===null||V(t)?(e.exit(`htmlFlowData`),k(t)):(e.consume(t),O)}function k(t){return e.check(An,ee,re)(t)}function ee(t){return e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),A}function A(t){return t===null||V(t)?k(t):(e.enter(`htmlFlowData`),O(t))}function j(t){return t===45?(e.consume(t),N):O(t)}function M(t){return t===47?(e.consume(t),o=``,te):O(t)}function te(t){if(t===62){let n=o.toLowerCase();return Dn.includes(n)?(e.consume(t),P):O(t)}return z(t)&&o.length<8?(e.consume(t),o+=String.fromCharCode(t),te):O(t)}function ne(t){return t===93?(e.consume(t),N):O(t)}function N(t){return t===62?(e.consume(t),P):t===45&&i===2?(e.consume(t),N):O(t)}function P(t){return t===null||V(t)?(e.exit(`htmlFlowData`),re(t)):(e.consume(t),P)}function re(n){return e.exit(`htmlFlow`),t(n)}}function Nn(e,t,n){let r=this;return i;function i(t){return V(t)?(e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),a):n(t)}function a(e){return r.parser.lazy[r.now().line]?n(e):t(e)}}function Pn(e,t,n){return r;function r(r){return e.enter(`lineEnding`),e.consume(r),e.exit(`lineEnding`),e.attempt(Ft,t,n)}}var Fn={name:`htmlText`,tokenize:In};function In(e,t,n){let r=this,i,a,o;return s;function s(t){return e.enter(`htmlText`),e.enter(`htmlTextData`),e.consume(t),c}function c(t){return t===33?(e.consume(t),l):t===47?(e.consume(t),x):t===63?(e.consume(t),y):z(t)?(e.consume(t),w):n(t)}function l(t){return t===45?(e.consume(t),u):t===91?(e.consume(t),a=0,m):z(t)?(e.consume(t),v):n(t)}function u(t){return t===45?(e.consume(t),p):n(t)}function d(t){return t===null?n(t):t===45?(e.consume(t),f):V(t)?(o=d,M(t)):(e.consume(t),d)}function f(t){return t===45?(e.consume(t),p):d(t)}function p(e){return e===62?j(e):e===45?f(e):d(e)}function m(t){return t===`CDATA[`.charCodeAt(a++)?(e.consume(t),a===6?h:m):n(t)}function h(t){return t===null?n(t):t===93?(e.consume(t),g):V(t)?(o=h,M(t)):(e.consume(t),h)}function g(t){return t===93?(e.consume(t),_):h(t)}function _(t){return t===62?j(t):t===93?(e.consume(t),_):h(t)}function v(t){return t===null||t===62?j(t):V(t)?(o=v,M(t)):(e.consume(t),v)}function y(t){return t===null?n(t):t===63?(e.consume(t),b):V(t)?(o=y,M(t)):(e.consume(t),y)}function b(e){return e===62?j(e):y(e)}function x(t){return z(t)?(e.consume(t),S):n(t)}function S(t){return t===45||B(t)?(e.consume(t),S):C(t)}function C(t){return V(t)?(o=C,M(t)):U(t)?(e.consume(t),C):j(t)}function w(t){return t===45||B(t)?(e.consume(t),w):t===47||t===62||H(t)?T(t):n(t)}function T(t){return t===47?(e.consume(t),j):t===58||t===95||z(t)?(e.consume(t),E):V(t)?(o=T,M(t)):U(t)?(e.consume(t),T):j(t)}function E(t){return t===45||t===46||t===58||t===95||B(t)?(e.consume(t),E):D(t)}function D(t){return t===61?(e.consume(t),O):V(t)?(o=D,M(t)):U(t)?(e.consume(t),D):T(t)}function O(t){return t===null||t===60||t===61||t===62||t===96?n(t):t===34||t===39?(e.consume(t),i=t,k):V(t)?(o=O,M(t)):U(t)?(e.consume(t),O):(e.consume(t),ee)}function k(t){return t===i?(e.consume(t),i=void 0,A):t===null?n(t):V(t)?(o=k,M(t)):(e.consume(t),k)}function ee(t){return t===null||t===34||t===39||t===60||t===61||t===96?n(t):t===47||t===62||H(t)?T(t):(e.consume(t),ee)}function A(e){return e===47||e===62||H(e)?T(e):n(e)}function j(r){return r===62?(e.consume(r),e.exit(`htmlTextData`),e.exit(`htmlText`),t):n(r)}function M(t){return e.exit(`htmlTextData`),e.enter(`lineEnding`),e.consume(t),e.exit(`lineEnding`),te}function te(t){return U(t)?K(e,ne,`linePrefix`,r.parser.constructs.disable.null.includes(`codeIndented`)?void 0:4)(t):ne(t)}function ne(t){return e.enter(`htmlTextData`),o(t)}}var Ln={name:`labelEnd`,resolveAll:Vn,resolveTo:Hn,tokenize:Un},Rn={tokenize:Wn},zn={tokenize:Gn},Bn={tokenize:Kn};function Vn(e){let t=-1,n=[];for(;++t=3&&(a===null||V(a))?(e.exit(`thematicBreak`),t(a)):n(a)}function c(t){return t===i?(e.consume(t),r++,c):(e.exit(`thematicBreakSequence`),U(t)?K(e,s,`whitespace`)(t):s(t))}}var q={continuation:{tokenize:ir},exit:or,name:`list`,tokenize:rr},tr={partial:!0,tokenize:sr},nr={partial:!0,tokenize:ar};function rr(e,t,n){let r=this,i=r.events[r.events.length-1],a=i&&i[1].type===`linePrefix`?i[2].sliceSerialize(i[1],!0).length:0,o=0;return s;function s(t){let i=r.containerState.type||(t===42||t===43||t===45?`listUnordered`:`listOrdered`);if(i===`listUnordered`?!r.containerState.marker||t===r.containerState.marker:gt(t)){if(r.containerState.type||(r.containerState.type=i,e.enter(i,{_container:!0})),i===`listUnordered`)return e.enter(`listItemPrefix`),t===42||t===45?e.check($n,n,l)(t):l(t);if(!r.interrupt||t===49)return e.enter(`listItemPrefix`),e.enter(`listItemValue`),c(t)}return n(t)}function c(t){return gt(t)&&++o<10?(e.consume(t),c):(!r.interrupt||o<2)&&(r.containerState.marker?t===r.containerState.marker:t===41||t===46)?(e.exit(`listItemValue`),l(t)):n(t)}function l(t){return e.enter(`listItemMarker`),e.consume(t),e.exit(`listItemMarker`),r.containerState.marker=r.containerState.marker||t,e.check(Ft,r.interrupt?n:u,e.attempt(tr,f,d))}function u(e){return r.containerState.initialBlankLine=!0,a++,f(e)}function d(t){return U(t)?(e.enter(`listItemPrefixWhitespace`),e.consume(t),e.exit(`listItemPrefixWhitespace`),f):n(t)}function f(n){return r.containerState.size=a+r.sliceSerialize(e.exit(`listItemPrefix`),!0).length,t(n)}}function ir(e,t,n){let r=this;return r.containerState._closeFlow=void 0,e.check(Ft,i,a);function i(n){return r.containerState.furtherBlankLines=r.containerState.furtherBlankLines||r.containerState.initialBlankLine,K(e,t,`listItemIndent`,r.containerState.size+1)(n)}function a(n){return r.containerState.furtherBlankLines||!U(n)?(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,o(n)):(r.containerState.furtherBlankLines=void 0,r.containerState.initialBlankLine=void 0,e.attempt(nr,t,o)(n))}function o(i){return r.containerState._closeFlow=!0,r.interrupt=void 0,K(e,e.attempt(q,t,n),`linePrefix`,r.parser.constructs.disable.null.includes(`codeIndented`)?void 0:4)(i)}}function ar(e,t,n){let r=this;return K(e,i,`listItemIndent`,r.containerState.size+1);function i(e){let i=r.events[r.events.length-1];return i&&i[1].type===`listItemIndent`&&i[2].sliceSerialize(i[1],!0).length===r.containerState.size?t(e):n(e)}}function or(e){e.exit(this.containerState.type)}function sr(e,t,n){let r=this;return K(e,i,`listItemPrefixWhitespace`,r.parser.constructs.disable.null.includes(`codeIndented`)?void 0:5);function i(e){let i=r.events[r.events.length-1];return!U(e)&&i&&i[1].type===`listItemPrefixWhitespace`?t(e):n(e)}}var cr={name:`setextUnderline`,resolveTo:lr,tokenize:ur};function lr(e,t){let n=e.length,r,i,a;for(;n--;)if(e[n][0]===`enter`){if(e[n][1].type===`content`){r=n;break}e[n][1].type===`paragraph`&&(i=n)}else e[n][1].type===`content`&&e.splice(n,1),!a&&e[n][1].type===`definition`&&(a=n);let o={type:`setextHeading`,start:{...e[r][1].start},end:{...e[e.length-1][1].end}};return e[i][1].type=`setextHeadingText`,a?(e.splice(i,0,[`enter`,o,t]),e.splice(a+1,0,[`exit`,e[r][1],t]),e[r][1].end={...e[a][1].end}):e[r][1]=o,e.push([`exit`,o,t]),e}function ur(e,t,n){let r=this,i;return a;function a(t){let a=r.events.length,s;for(;a--;)if(r.events[a][1].type!==`lineEnding`&&r.events[a][1].type!==`linePrefix`&&r.events[a][1].type!==`content`){s=r.events[a][1].type===`paragraph`;break}return!r.parser.lazy[r.now().line]&&(r.interrupt||s)?(e.enter(`setextHeadingLine`),i=t,o(t)):n(t)}function o(t){return e.enter(`setextHeadingLineSequence`),s(t)}function s(t){return t===i?(e.consume(t),s):(e.exit(`setextHeadingLineSequence`),U(t)?K(e,c,`lineSuffix`)(t):c(t))}function c(r){return r===null||V(r)?(e.exit(`setextHeadingLine`),t(r)):n(r)}}var dr={tokenize:fr};function fr(e){let t=this,n=e.attempt(Ft,r,e.attempt(this.parser.constructs.flowInitial,i,K(e,e.attempt(this.parser.constructs.flow,i,e.attempt(cn,i)),`linePrefix`)));return n;function r(r){if(r===null){e.consume(r);return}return e.enter(`lineEndingBlank`),e.consume(r),e.exit(`lineEndingBlank`),t.currentConstruct=void 0,n}function i(r){if(r===null){e.consume(r);return}return e.enter(`lineEnding`),e.consume(r),e.exit(`lineEnding`),t.currentConstruct=void 0,n}}var pr={resolveAll:_r()},mr=gr(`string`),hr=gr(`text`);function gr(e){return{resolveAll:_r(e===`text`?vr:void 0),tokenize:t};function t(t){let n=this,r=this.parser.constructs[e],i=t.attempt(r,a,o);return a;function a(e){return c(e)?i(e):o(e)}function o(e){if(e===null){t.consume(e);return}return t.enter(`data`),t.consume(e),s}function s(e){return c(e)?(t.exit(`data`),i(e)):(t.consume(e),s)}function c(e){if(e===null)return!0;let t=r[e],i=-1;if(t)for(;++iDr,contentInitial:()=>xr,disable:()=>Or,document:()=>br,flow:()=>Cr,flowInitial:()=>Sr,insideSpan:()=>Er,string:()=>wr,text:()=>Tr}),br={42:q,43:q,45:q,48:q,49:q,50:q,51:q,52:q,53:q,54:q,55:q,56:q,57:q,62:Lt},xr={91:_n},Sr={[-2]:Yt,[-1]:Yt,32:Yt},Cr={35:Cn,42:$n,45:[cr,$n],60:On,61:cr,95:$n,96:Kt,126:Kt},wr={38:Ut,92:Vt},Tr={[-5]:Zn,[-4]:Zn,[-3]:Zn,33:qn,38:Ut,42:kt,60:[Nt,Fn],91:Yn,92:[xn,Vt],93:Ln,95:kt,96:$t},Er={null:[kt,pr]},Dr={null:[42,95]},Or={null:[]};function kr(e,t,n){let r={_bufferIndex:-1,_index:0,line:n&&n.line||1,column:n&&n.column||1,offset:n&&n.offset||0},i={},a=[],o=[],s=[],c={attempt:C(x),check:C(S),consume:v,enter:y,exit:b,interrupt:C(S,{interrupt:!0})},l={code:null,containerState:{},defineSkip:h,events:[],now:m,parser:e,previous:null,sliceSerialize:f,sliceStream:p,write:d},u=t.tokenize.call(l,c);return t.resolveAll&&a.push(t),l;function d(e){return o=L(o,e),g(),o[o.length-1]===null?(w(t,0),l.events=Ot(a,l.events,l),l.events):[]}function f(e,t){return jr(p(e),t)}function p(e){return Ar(o,e)}function m(){let{_bufferIndex:e,_index:t,line:n,column:i,offset:a}=r;return{_bufferIndex:e,_index:t,line:n,column:i,offset:a}}function h(e){i[e.line]=e.column,E()}function g(){let e;for(;r._index-1){let e=o[0];typeof e==`string`?o[0]=e.slice(r):o.shift()}a>0&&o.push(e[i].slice(0,a))}return o}function jr(e,t){let n=-1,r=[],i;for(;++n0){let e=a.tokenStack[a.tokenStack.length-1];(e[1]||Wr).call(a,void 0,e[0])}for(r.position={start:J(e.length>0?e[0][1].start:{line:1,column:1,offset:0}),end:J(e.length>0?e[e.length-2][1].end:{line:1,column:1,offset:0})},d=-1;++d{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,ee||(ee=!0,oe());else{var t=n(l);t!==null&&le(x,t.startTime-e)}}var ee=!1,te=-1,ne=5,re=-1;function ie(){return g?!0:!(e.unstable_now()-ret&&ie());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&le(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?oe():ee=!1}}}var oe;if(typeof y==`function`)oe=function(){y(ae)};else if(typeof MessageChannel<`u`){var se=new MessageChannel,ce=se.port2;se.port1.onmessage=ae,oe=function(){ce.postMessage(null)}}else oe=function(){_(ae,0)};function le(t,n){te=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(te),te=-1):h=!0,le(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,ee||(ee=!0,oe()))),r},e.unstable_shouldYield=ie,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),r=e(((e,t)=>{t.exports=n()})),i=e((e=>{var n=t();function r(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=i()})),o=e((e=>{var n=r(),i=t(),o=a();function s(e){var t=`https://react.dev/errors/`+e;if(1ge||(e.current=he[ge],he[ge]=null,ge--)}function T(e,t){ge++,he[ge]=e.current,e.current=t}var ve=_e(null),ye=_e(null),be=_e(null),xe=_e(null);function Se(e,t){switch(T(be,t),T(ye,e),T(ve,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}w(ve),T(ve,e)}function Ce(){w(ve),w(ye),w(be)}function we(e){e.memoizedState!==null&&T(xe,e);var t=ve.current,n=Hd(t,e.type);t!==n&&(T(ye,e),T(ve,n))}function Te(e){ye.current===e&&(w(ve),w(ye)),xe.current===e&&(w(xe),Qf._currentValue=me)}var Ee,De;function Oe(e){if(Ee===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Ee=t&&t[1]||``,De=-1{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,ee||(ee=!0,oe());else{var t=n(l);t!==null&&le(x,t.startTime-e)}}var ee=!1,te=-1,ne=5,re=-1;function ie(){return g?!0:!(e.unstable_now()-ret&&ie());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&le(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?oe():ee=!1}}}var oe;if(typeof y==`function`)oe=function(){y(ae)};else if(typeof MessageChannel<`u`){var se=new MessageChannel,ce=se.port2;se.port1.onmessage=ae,oe=function(){ce.postMessage(null)}}else oe=function(){_(ae,0)};function le(t,n){te=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(te),te=-1):h=!0,le(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,ee||(ee=!0,oe()))),r},e.unstable_shouldYield=ie,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),r=e(((e,t)=>{t.exports=n()})),i=e((e=>{var n=t();function r(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=i()})),o=e((e=>{var n=r(),i=t(),o=a();function s(e){var t=`https://react.dev/errors/`+e;if(1ge||(e.current=he[ge],he[ge]=null,ge--)}function T(e,t){ge++,he[ge]=e.current,e.current=t}var ve=_e(null),ye=_e(null),be=_e(null),xe=_e(null);function Se(e,t){switch(T(be,t),T(ye,e),T(ve,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}w(ve),T(ve,e)}function Ce(){w(ve),w(ye),w(be)}function we(e){e.memoizedState!==null&&T(xe,e);var t=ve.current,n=Hd(t,e.type);t!==n&&(T(ye,e),T(ve,n))}function Te(e){ye.current===e&&(w(ve),w(ye)),xe.current===e&&(w(xe),Qf._currentValue=me)}var Ee,De;function Oe(e){if(Ee===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Ee=t&&t[1]||``,De=-1)`:-1{var n=e.children,r=e.width,i=e.height,o=e.viewBox,s=e.className,l=e.style,u=e.title,d=e.desc,f=b(e,v),p=o||{width:r,height:i,x:0,y:0},m=c(`recharts-surface`,s);return a.createElement(`svg`,y({},g(f),{className:m,width:r,height:i,style:l,viewBox:`${p.x} ${p.y} ${p.width} ${p.height}`,ref:t}),a.createElement(`title`,null,u),a.createElement(`desc`,null,d),n)}),C=[`children`,`className`];function w(){return w=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var n=e.children,r=e.className,i=T(e,C),o=c(`recharts-layer`,r);return a.createElement(`g`,w({className:o},g(i),{ref:t}),n)});function O(e){return e===`__proto__`}var k=/\.|(\[(?:[^[\]]*|(["'])(?:(?!\2)[^\\]|\\.)*?\2)\])/;function A(e){switch(typeof e){case`number`:case`symbol`:return!1;case`string`:return e===``||e.startsWith(`.`)||e.endsWith(`.`)?!1:k.test(e);default:return!1}}function j(e){return typeof e==`string`||typeof e==`symbol`?e:Object.is(e?.valueOf?.(),-0)?`-0`:String(e)}function M(e){if(e==null)return``;if(typeof e==`string`)return e;if(Array.isArray(e))return e.map(M).join(`,`);let t=String(e);return t===`0`&&Object.is(Number(e),-0)?`-0`:t}function N(e){if(Array.isArray(e))return e.map(j);if(typeof e==`symbol`)return[e];e=M(e);let t=[],n=e.length;if(n===0)return t;let r=0,i=``,a=``,o=!1;for(e.charCodeAt(0)===46&&t.push(``);r1&&arguments[1]!==void 0?arguments[1]:ne),n=Math.round(e*t)/t;return Object.is(n,-0)?0:n}function P(e){var t=[...arguments].slice(1);return e.reduce((e,n,r)=>{var i=t[r-1];return typeof i==`string`?e+i+n:i===void 0?e+n:e+re(i)+n},``)}var ie=e=>e===0?0:e>0?1:-1,ae=e=>typeof e==`number`&&e!=+e,oe=e=>typeof e==`string`&&e.length>1&&e.indexOf(`%`)===e.length-1,F=e=>(typeof e==`number`||e instanceof Number)&&!ae(e),se=e=>F(e)||typeof e==`string`,ce=0,le=e=>{var t=++ce;return`${e||``}${t}`},ue=function(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,r=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(!F(e)&&typeof e!=`string`)return n;var i;if(oe(e)){if(t==null)return n;var a=e.indexOf(`%`);i=t*parseFloat(e.slice(0,a))/100}else i=+e;return ae(i)&&(i=n),r&&t!=null&&i>t&&(i=t),i},de=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,n={},r=0;re&&(typeof t==`function`?t(e):ee(e,t))===n)}var me=e=>e==null,he=e=>me(e)?e:`${e.charAt(0).toUpperCase()}${e.slice(1)}`;function ge(e){return e!=null}function _e(){}function ve(e){if(e)return{x:e.x,y:e.y,upperWidth:`upperWidth`in e?e.upperWidth:e.width,lowerWidth:`lowerWidth`in e?e.lowerWidth:e.width,width:e.width,height:e.height}}function ye(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function be(e){for(var t=1;t{var t=e.viewBox,n=e.position,r=e.offset,i=r===void 0?0:r,a=e.parentViewBox,o=e.clamp,s=ve(t),c=s.x,l=s.y,u=s.height,d=s.upperWidth,f=s.lowerWidth,p=c,m=c+(d-f)/2,h=(p+m)/2,g=(d+f)/2,_=p+d/2,v=u>=0?1:-1,y=v*i,b=v>0?`end`:`start`,x=v>0?`start`:`end`,S=d>=0?1:-1,C=S*i,w=S>0?`end`:`start`,T=S>0?`start`:`end`,E=a;if(n===`top`){var D={x:p+d/2,y:l-y,horizontalAnchor:`middle`,verticalAnchor:b};return o&&E&&(D.height=Math.max(l-E.y,0),D.width=d),D}if(n===`bottom`){var O={x:m+f/2,y:l+u+y,horizontalAnchor:`middle`,verticalAnchor:x};return o&&E&&(O.height=Math.max(E.y+E.height-(l+u),0),O.width=f),O}if(n===`left`){var k={x:h-C,y:l+u/2,horizontalAnchor:w,verticalAnchor:`middle`};return o&&E&&(k.width=Math.max(k.x-E.x,0),k.height=u),k}if(n===`right`){var A={x:h+g+C,y:l+u/2,horizontalAnchor:T,verticalAnchor:`middle`};return o&&E&&(A.width=Math.max(E.x+E.width-A.x,0),A.height=u),A}var j=o&&E?{width:g,height:u}:{};return n===`insideLeft`?be({x:h+C,y:l+u/2,horizontalAnchor:T,verticalAnchor:`middle`},j):n===`insideRight`?be({x:h+g-C,y:l+u/2,horizontalAnchor:w,verticalAnchor:`middle`},j):n===`insideTop`?be({x:p+d/2,y:l+y,horizontalAnchor:`middle`,verticalAnchor:x},j):n===`insideBottom`?be({x:m+f/2,y:l+u-y,horizontalAnchor:`middle`,verticalAnchor:b},j):n===`insideTopLeft`?be({x:p+C,y:l+y,horizontalAnchor:T,verticalAnchor:x},j):n===`insideTopRight`?be({x:p+d-C,y:l+y,horizontalAnchor:w,verticalAnchor:x},j):n===`insideBottomLeft`?be({x:m+C,y:l+u-y,horizontalAnchor:T,verticalAnchor:b},j):n===`insideBottomRight`?be({x:m+f-C,y:l+u-y,horizontalAnchor:w,verticalAnchor:b},j):n&&typeof n==`object`&&(F(n.x)||oe(n.x))&&(F(n.y)||oe(n.y))?be({x:c+ue(n.x,g),y:l+ue(n.y,u),horizontalAnchor:`end`,verticalAnchor:`end`},j):be({x:_,y:l+u/2,horizontalAnchor:`middle`,verticalAnchor:`middle`},j)},Te=[`top`,`left`,`right`,`bottom`];function Ee(e){return e==null?!1:typeof e==`object`||Te.includes(e)}var De=(0,a.createContext)(null);function I(e){return function(){return e}}var Oe=Math.PI,ke=2*Oe,Ae=1e-6,je=ke-Ae;function Me(e){this._+=e[0];for(let t=1,n=e.length;t=0))throw Error(`invalid digits: ${e}`);if(t>15)return Me;let n=10**t;return function(e){this._+=e[0];for(let t=1,r=e.length;tAe)if(!(Math.abs(u*s-c*l)>Ae)||!i)this._append`L${this._x1=e},${this._y1=t}`;else{let f=n-a,p=r-o,m=s*s+c*c,h=f*f+p*p,g=Math.sqrt(m),_=Math.sqrt(d),v=i*Math.tan((Oe-Math.acos((m+d-h)/(2*g*_)))/2),y=v/_,b=v/g;Math.abs(y-1)>Ae&&this._append`L${e+y*l},${t+y*u}`,this._append`A${i},${i},0,0,${+(u*f>l*p)},${this._x1=e+b*s},${this._y1=t+b*c}`}}arc(e,t,n,r,i,a){if(e=+e,t=+t,n=+n,a=!!a,n<0)throw Error(`negative radius: ${n}`);let o=n*Math.cos(r),s=n*Math.sin(r),c=e+o,l=t+s,u=1^a,d=a?r-i:i-r;this._x1===null?this._append`M${c},${l}`:(Math.abs(this._x1-c)>Ae||Math.abs(this._y1-l)>Ae)&&this._append`L${c},${l}`,n&&(d<0&&(d=d%ke+ke),d>je?this._append`A${n},${n},0,1,${u},${e-o},${t-s}A${n},${n},0,1,${u},${this._x1=c},${this._y1=l}`:d>Ae&&this._append`A${n},${n},0,${+(d>=Oe)},${u},${this._x1=e+n*Math.cos(i)},${this._y1=t+n*Math.sin(i)}`)}rect(e,t,n,r){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+t}h${n=+n}v${+r}h${-n}Z`}toString(){return this._}};function Fe(){return new Pe}Fe.prototype=Pe.prototype;function Ie(e){let t=3;return e.digits=function(n){if(!arguments.length)return t;if(n==null)t=null;else{let e=Math.floor(n);if(!(e>=0))throw RangeError(`invalid digits: ${n}`);t=e}return e},()=>new Pe(t)}Array.prototype.slice;function Le(e){return typeof e==`object`&&`length`in e?e:Array.from(e)}function Re(e){this._context=e}Re.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function ze(e){return new Re(e)}function Be(e){return e[0]}function Ve(e){return e[1]}function He(e,t){var n=I(!0),r=null,i=ze,a=null,o=Ie(s);e=typeof e==`function`?e:e===void 0?Be:I(e),t=typeof t==`function`?t:t===void 0?Ve:I(t);function s(s){var c,l=(s=Le(s)).length,u,d=!1,f;for(r??(a=i(f=o())),c=0;c<=l;++c)!(c=d;--f)s.point(_[f],v[f]);s.lineEnd(),s.areaEnd()}h&&(_[u]=+e(m,u,l),v[u]=+t(m,u,l),s.point(r?+r(m,u,l):_[u],n?+n(m,u,l):v[u]))}if(g)return s=null,g+``||null}function u(){return He().defined(i).curve(o).context(a)}return l.x=function(t){return arguments.length?(e=typeof t==`function`?t:I(+t),r=null,l):e},l.x0=function(t){return arguments.length?(e=typeof t==`function`?t:I(+t),l):e},l.x1=function(e){return arguments.length?(r=e==null?null:typeof e==`function`?e:I(+e),l):r},l.y=function(e){return arguments.length?(t=typeof e==`function`?e:I(+e),n=null,l):t},l.y0=function(e){return arguments.length?(t=typeof e==`function`?e:I(+e),l):t},l.y1=function(e){return arguments.length?(n=e==null?null:typeof e==`function`?e:I(+e),l):n},l.lineX0=l.lineY0=function(){return u().x(e).y(t)},l.lineY1=function(){return u().x(e).y(n)},l.lineX1=function(){return u().x(r).y(t)},l.defined=function(e){return arguments.length?(i=typeof e==`function`?e:I(!!e),l):i},l.curve=function(e){return arguments.length?(o=e,a!=null&&(s=o(a)),l):o},l.context=function(e){return arguments.length?(e==null?a=s=null:s=o(a=e),l):a},l}var We=class{constructor(e,t){this._context=e,this._x=t}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,t,e,t):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+t)/2,e,this._y0,e,t);break}this._x0=e,this._y0=t}};function Ge(e){return new We(e,!0)}function Ke(e){return new We(e,!1)}function qe(){}function Je(e,t,n){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+n)/6)}function Ye(e){this._context=e}Ye.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Je(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Je(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function Xe(e){return new Ye(e)}function Ze(e){this._context=e}Ze.prototype={areaStart:qe,areaEnd:qe,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:Je(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function Qe(e){return new Ze(e)}function $e(e){this._context=e}$e.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+e)/6,r=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(n,r):this._context.moveTo(n,r);break;case 3:this._point=4;default:Je(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function et(e){return new $e(e)}function tt(e){this._context=e}tt.prototype={areaStart:qe,areaEnd:qe,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function nt(e){return new tt(e)}function rt(e){return e<0?-1:1}function it(e,t,n){var r=e._x1-e._x0,i=t-e._x1,a=(e._y1-e._y0)/(r||i<0&&-0),o=(n-e._y1)/(i||r<0&&-0),s=(a*i+o*r)/(r+i);return(rt(a)+rt(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(s))||0}function at(e,t){var n=e._x1-e._x0;return n?(3*(e._y1-e._y0)/n-t)/2:t}function ot(e,t,n){var r=e._x0,i=e._y0,a=e._x1,o=e._y1,s=(a-r)/3;e._context.bezierCurveTo(r+s,i+s*t,a-s,o-s*n,a,o)}function st(e){this._context=e}st.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:ot(this,this._t0,at(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var n=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,ot(this,at(this,n=it(this,e,t)),n);break;default:ot(this,this._t0,n=it(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=n}}};function ct(e){this._context=new lt(e)}(ct.prototype=Object.create(st.prototype)).point=function(e,t){st.prototype.point.call(this,t,e)};function lt(e){this._context=e}lt.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,n,r,i,a){this._context.bezierCurveTo(t,e,r,n,a,i)}};function ut(e){return new st(e)}function dt(e){return new ct(e)}function ft(e){this._context=e}ft.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,n=e.length;if(n)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),n===2)this._context.lineTo(e[1],t[1]);else for(var r=pt(e),i=pt(t),a=0,o=1;o=0;--t)i[t]=(o[t]-i[t+1])/a[t];for(a[n-1]=(e[n]+i[n-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var n=this._x*(1-this._t)+e*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,t)}break}this._x=e,this._y=t}};function gt(e){return new ht(e,.5)}function _t(e){return new ht(e,0)}function vt(e){return new ht(e,1)}function yt(e,t){if((o=e.length)>1)for(var n=1,r,i,a=e[t[0]],o,s=a.length;n=0;)n[t]=t;return n}function xt(e,t){return e[t]}function St(e){let t=[];return t.key=e,t}function Ct(){var e=I([]),t=bt,n=yt,r=xt;function i(i){var a=Array.from(e.apply(this,arguments),St),o,s=a.length,c=-1,l;for(let e of i)for(o=0,++c;o0){for(var n,r,i=0,a=e[0].length,o;i0){for(var n=0,r=e[t[0]],i,a=r.length;n0)||!((a=(i=e[t[0]]).length)>0))){for(var n=0,r=1,i,a,o;r`radius`in e&&`startAngle`in e&&`endAngle`in e,Ot=(e,t)=>{if(!e||typeof e==`function`||typeof e==`boolean`)return null;var n=e;if((0,a.isValidElement)(e)&&(n=e.props),typeof n!=`object`&&typeof n!=`function`)return null;var r={};return Object.keys(n).forEach(e=>{u(e)&&typeof n[e]==`function`&&(r[e]=t||(t=>n[e](n,t)))}),r},kt=(e,t,n)=>r=>(e(t,n,r),null),At=(e,t,n)=>{if(e===null||typeof e!=`object`&&typeof e!=`function`)return null;var r=null;return Object.keys(e).forEach(i=>{var a=e[i];u(i)&&typeof a==`function`&&(r||={},r[i]=kt(a,t,n))}),r};function jt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Mt(e){for(var t=1;t(e[t]===void 0&&r[t]!==void 0&&(e[t]=r[t]),e),n)}function Lt(e,t){let n=new Map;for(let r=0;rObject.prototype.propertyIsEnumerable.call(e,t))}function Wt(e){return e==null?e===void 0?`[object Undefined]`:`[object Null]`:Object.prototype.toString.call(e)}var Gt=`[object RegExp]`,Kt=`[object String]`,qt=`[object Number]`,Jt=`[object Boolean]`,Yt=`[object Arguments]`,Xt=`[object Symbol]`,Zt=`[object Date]`,Qt=`[object Map]`,$t=`[object Set]`,en=`[object Array]`,tn=`[object Function]`,nn=`[object ArrayBuffer]`,rn=`[object Object]`,an=`[object Error]`,on=`[object DataView]`,sn=`[object Uint8Array]`,cn=`[object Uint8ClampedArray]`,ln=`[object Uint16Array]`,un=`[object Uint32Array]`,dn=`[object BigUint64Array]`,fn=`[object Int8Array]`,pn=`[object Int16Array]`,mn=`[object Int32Array]`,hn=`[object BigInt64Array]`,gn=`[object Float32Array]`,_n=`[object Float64Array]`,vn=typeof globalThis==`object`&&globalThis||typeof window==`object`&&window||typeof self==`object`&&self||typeof global==`object`&&global||(function(){return this})();function yn(e){return vn.Buffer!==void 0&&vn.Buffer.isBuffer(e)}function bn(e,t){return xn(e,void 0,e,new Map,t)}function xn(e,t,n,r=new Map,i=void 0){let a=i?.(e,t,n,r);if(a!==void 0)return a;if(Vt(e))return e;if(r.has(e))return r.get(e);if(Array.isArray(e)){let t=Array(e.length);r.set(e,t);for(let a=0;avoid 0)}function On(e,t,n,r,i=!1){if(t===e)return!0;switch(typeof t){case`object`:return kn(e,t,n,r);case`function`:return Object.keys(t).length>0?On(e,{...t},n,r,i):Tn(e,t);default:return En(e)&&i?typeof t!=`string`||t===``:Tn(e,t)}}function kn(e,t,n,r){if(t==null)return!0;if(Array.isArray(t))return jn(e,t,n,r);if(t instanceof Map)return An(e,t,n,r);if(t instanceof Set)return Mn(e,t,n,r);let i=Object.keys(t);if(e==null||Vt(e))return i.length===0;if(i.length===0)return!0;if(r?.has(t))return r.get(t)===e;r?.set(t,e);try{for(let a=0;avoid 0)}function Pn(e){return e=wn(e),t=>Nn(t,e)}function Fn(e,t){return bn(e,(n,r,i,a)=>{let o=t?.(n,r,i,a);if(o!==void 0)return o;if(typeof e==`object`){if(Wt(e)===`[object Object]`&&typeof e.constructor!=`function`){let t={};return a.set(e,t),Sn(t,e,i,a),t}switch(Object.prototype.toString.call(e)){case qt:case Kt:case Jt:{let t=new e.constructor(e?.valueOf());return Sn(t,e),t}case Yt:{let t={};return Sn(t,e),t.length=e.length,t[Symbol.iterator]=e[Symbol.iterator],t}default:return}}})}function In(e){return Fn(e)}var Ln=/^(?:0|[1-9]\d*)$/;function Rn(e,t=2**53-1){switch(typeof e){case`number`:return Number.isInteger(e)&&e>=0&&e=0}function Wn(e){return e!=null&&typeof e!=`function`&&Un(e.length)}function Gn(e){return typeof e==`object`&&!!e}function Kn(e){return Gn(e)&&Wn(e)}function qn(e,t=zt){return Kn(e)?Lt(Array.from(e),Rt(Hn(t),1)):[]}function Jn(e,t,n){return t===!0?qn(e,n):typeof t==`function`?qn(e,t):e}var Yn=n((e=>{var t=r();function n(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var i=typeof Object.is==`function`?Object.is:n,a=t.useState,o=t.useEffect,s=t.useLayoutEffect,c=t.useDebugValue;function l(e,t){var n=t(),r=a({inst:{value:n,getSnapshot:t}}),i=r[0].inst,l=r[1];return s(function(){i.value=n,i.getSnapshot=t,u(i)&&l({inst:i})},[e,n,t]),o(function(){return u(i)&&l({inst:i}),e(function(){u(i)&&l({inst:i})})},[e]),c(n),n}function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!i(e,n)}catch{return!0}}function d(e,t){return t()}var f=typeof window>`u`||window.document===void 0||window.document.createElement===void 0?d:l;e.useSyncExternalStore=t.useSyncExternalStore===void 0?f:t.useSyncExternalStore})),Xn=n(((e,t)=>{t.exports=Yn()})),Zn=n((e=>{var t=r(),n=Xn();function i(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var a=typeof Object.is==`function`?Object.is:i,o=n.useSyncExternalStore,s=t.useRef,c=t.useEffect,l=t.useMemo,u=t.useDebugValue;e.useSyncExternalStoreWithSelector=function(e,t,n,r,i){var d=s(null);if(d.current===null){var f={hasValue:!1,value:null};d.current=f}else f=d.current;d=l(function(){function e(e){if(!o){if(o=!0,s=e,e=r(e),i!==void 0&&f.hasValue){var t=f.value;if(i(t,e))return c=t}return c=e}if(t=c,a(s,e))return t;var n=r(e);return i!==void 0&&i(t,n)?(s=e,t):(s=e,c=n)}var o=!1,s,c,l=n===void 0?null:n;return[function(){return e(t())},l===null?void 0:function(){return e(l())}]},[t,n,r,i]);var p=o(e,d[0],d[1]);return c(function(){f.hasValue=!0,f.value=p},[p]),u(p),p}})),Qn=n(((e,t)=>{t.exports=Zn()})),$n=e(Qn()),er=(0,a.createContext)(null),tr=e=>e,L=()=>{var e=(0,a.useContext)(er);return e?e.store.dispatch:tr},nr=()=>{},rr=()=>nr,ir=(e,t)=>e===t;function R(e){var t=(0,a.useContext)(er),n=(0,a.useMemo)(()=>t?t=>{if(t!=null)return e(t)}:nr,[t,e]);return(0,$n.useSyncExternalStoreWithSelector)(t?t.subscription.addNestedSub:rr,t?t.store.getState:nr,t?t.store.getState:nr,n,ir)}function ar(e,t=`expected a function, instead received ${typeof e}`){if(typeof e!=`function`)throw TypeError(t)}function or(e,t=`expected all items to be functions, instead received the following types: `){if(!e.every(e=>typeof e==`function`)){let n=e.map(e=>typeof e==`function`?`function ${e.name||`unnamed`}()`:typeof e).join(`, `);throw TypeError(`${t}[${n}]`)}}var sr=e=>Array.isArray(e)?e:[e];function cr(e){let t=Array.isArray(e[0])?e[0]:e;return or(t,`createSelector expects all input-selectors to be functions, but received the following types: `),t}function lr(e,t){let n=[],{length:r}=e;for(let i=0;i`u`?ur:WeakRef,fr=0,pr=1;function mr(){return{s:fr,v:void 0,o:null,p:null}}function hr(e){return e instanceof dr?e.deref():e}function gr(e,t={}){let n=mr(),{resultEqualityCheck:r}=t,i,a=0;function o(){let t=n,{length:o}=arguments;for(let e=0,n=o;e{n=mr(),o.resetResultsCount()},o.resultsCount=()=>a,o.resetResultsCount=()=>{a=0},o}function _r(e,...t){let n=typeof e==`function`?{memoize:e,memoizeOptions:t}:e,r=(...e)=>{let t=0,r=0,i,a={},o=e.pop();typeof o==`object`&&(a=o,o=e.pop()),ar(o,`createSelector expects an output function after the inputs, but received: [${typeof o}]`);let{memoize:s,memoizeOptions:c=[],argsMemoize:l=gr,argsMemoizeOptions:u=[]}={...n,...a},d=sr(c),f=sr(u),p=cr(e),m=s(function(){return t++,o.apply(null,arguments)},...d),h=l(function(){r++;let e=lr(p,arguments);return i=m.apply(null,e),i},...f);return Object.assign(h,{resultFunc:o,memoizedResultFunc:m,dependencies:p,dependencyRecomputations:()=>r,resetDependencyRecomputations:()=>{r=0},lastResult:()=>i,recomputations:()=>t,resetRecomputations:()=>{t=0},memoize:s,argsMemoize:l})};return Object.assign(r,{withTypes:()=>r}),r}var z=_r(gr);function vr(e,t=1){let n=[],r=Math.floor(t),i=(e,t)=>{for(let a=0;a{if(e!==t){let r=br(e),i=br(t);if(r===i&&r===0){if(et)return n===`desc`?-1:1}return n===`desc`?i-r:r-i}return 0};function Sr(e){return typeof e==`symbol`||e instanceof Symbol}var Cr=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,wr=/^\w*$/;function Tr(e,t){return Array.isArray(e)?!1:typeof e==`number`||typeof e==`boolean`||e==null||Sr(e)?!0:typeof e==`string`&&(wr.test(e)||!Cr.test(e))||t!=null&&Object.hasOwn(t,e)}function Er(e,t,n,r){if(e==null)return[];n=r?void 0:n,Array.isArray(e)||(e=Object.values(e)),Array.isArray(t)||(t=t==null?[null]:[t]),t.length===0&&(t=[null]),Array.isArray(n)||(n=n==null?[]:[n]),n=n.map(e=>String(e));let i=(e,t)=>{let n=e;for(let e=0;et==null||e==null?t:typeof e==`object`&&`key`in e?Object.hasOwn(t,e.key)?t[e.key]:i(t,e.path):typeof e==`function`?e(t):Array.isArray(e)?i(t,e):typeof t==`object`?t[e]:t,o=t.map(e=>(Array.isArray(e)&&e.length===1&&(e=e[0]),e==null||typeof e==`function`||Array.isArray(e)||Tr(e)?e:{key:e,path:N(e)}));return e.map(e=>({original:e,criteria:o.map(t=>a(t,e))})).slice().sort((e,t)=>{for(let r=0;re.original)}function Dr(e,...t){let n=t.length;return n>1&&yr(e,t[0],t[1])?t=[]:n>2&&yr(t[0],t[1],t[2])&&(t=[t[0]]),Er(e,vr(t),[`asc`])}var Or=e=>e.legend.settings,kr=e=>e.legend.size;z([e=>e.legend.payload,Or],(e,t)=>{var n=t.itemSorter,r=e.flat(1);return n?Dr(r,n):r});function Ar(e,t){return Fr(e)||Pr(e,t)||Mr(e,t)||jr()}function jr(){throw TypeError(`Invalid attempt to destructure non-iterable instance. +import{i as e,n as t,t as n}from"./rolldown-runtime-aKtaBQYM.js";import{tn as r}from"./vendor-lucide-CiSEz5Po.js";import{n as i}from"./vendor-react-3wbGPIgR.js";var a=e(r()),o=i();function s(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`)if(Array.isArray(e)){var i=e.length;for(t=0;t{var n=e.children,r=e.width,i=e.height,o=e.viewBox,s=e.className,l=e.style,u=e.title,d=e.desc,f=b(e,v),p=o||{width:r,height:i,x:0,y:0},m=c(`recharts-surface`,s);return a.createElement(`svg`,y({},g(f),{className:m,width:r,height:i,style:l,viewBox:`${p.x} ${p.y} ${p.width} ${p.height}`,ref:t}),a.createElement(`title`,null,u),a.createElement(`desc`,null,d),n)}),C=[`children`,`className`];function w(){return w=Object.assign?Object.assign.bind():function(e){for(var t=1;t{var n=e.children,r=e.className,i=T(e,C),o=c(`recharts-layer`,r);return a.createElement(`g`,w({className:o},g(i),{ref:t}),n)});function O(e){return e===`__proto__`}var k=/\.|(\[(?:[^[\]]*|(["'])(?:(?!\2)[^\\]|\\.)*?\2)\])/;function A(e){switch(typeof e){case`number`:case`symbol`:return!1;case`string`:return e===``||e.startsWith(`.`)||e.endsWith(`.`)?!1:k.test(e);default:return!1}}function j(e){return typeof e==`string`||typeof e==`symbol`?e:Object.is(e?.valueOf?.(),-0)?`-0`:String(e)}function M(e){if(e==null)return``;if(typeof e==`string`)return e;if(Array.isArray(e))return e.map(M).join(`,`);let t=String(e);return t===`0`&&Object.is(Number(e),-0)?`-0`:t}function N(e){if(Array.isArray(e))return e.map(j);if(typeof e==`symbol`)return[e];e=M(e);let t=[],n=e.length;if(n===0)return t;let r=0,i=``,a=``,o=!1;for(e.charCodeAt(0)===46&&t.push(``);r1&&arguments[1]!==void 0?arguments[1]:ne),n=Math.round(e*t)/t;return Object.is(n,-0)?0:n}function P(e){var t=[...arguments].slice(1);return e.reduce((e,n,r)=>{var i=t[r-1];return typeof i==`string`?e+i+n:i===void 0?e+n:e+re(i)+n},``)}var ie=e=>e===0?0:e>0?1:-1,ae=e=>typeof e==`number`&&e!=+e,oe=e=>typeof e==`string`&&e.length>1&&e.indexOf(`%`)===e.length-1,F=e=>(typeof e==`number`||e instanceof Number)&&!ae(e),se=e=>F(e)||typeof e==`string`,ce=0,le=e=>{var t=++ce;return`${e||``}${t}`},ue=function(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:0,r=arguments.length>3&&arguments[3]!==void 0&&arguments[3];if(!F(e)&&typeof e!=`string`)return n;var i;if(oe(e)){if(t==null)return n;var a=e.indexOf(`%`);i=t*parseFloat(e.slice(0,a))/100}else i=+e;return ae(i)&&(i=n),r&&t!=null&&i>t&&(i=t),i},de=e=>{if(!Array.isArray(e))return!1;for(var t=e.length,n={},r=0;re&&(typeof t==`function`?t(e):ee(e,t))===n)}var me=e=>e==null,he=e=>me(e)?e:`${e.charAt(0).toUpperCase()}${e.slice(1)}`;function ge(e){return e!=null}function _e(){}function ve(e){if(e)return{x:e.x,y:e.y,upperWidth:`upperWidth`in e?e.upperWidth:e.width,lowerWidth:`lowerWidth`in e?e.lowerWidth:e.width,width:e.width,height:e.height}}function ye(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function be(e){for(var t=1;t{var t=e.viewBox,n=e.position,r=e.offset,i=r===void 0?0:r,a=e.parentViewBox,o=e.clamp,s=ve(t),c=s.x,l=s.y,u=s.height,d=s.upperWidth,f=s.lowerWidth,p=c,m=c+(d-f)/2,h=(p+m)/2,g=(d+f)/2,_=p+d/2,v=u>=0?1:-1,y=v*i,b=v>0?`end`:`start`,x=v>0?`start`:`end`,S=d>=0?1:-1,C=S*i,w=S>0?`end`:`start`,T=S>0?`start`:`end`,E=a;if(n===`top`){var D={x:p+d/2,y:l-y,horizontalAnchor:`middle`,verticalAnchor:b};return o&&E&&(D.height=Math.max(l-E.y,0),D.width=d),D}if(n===`bottom`){var O={x:m+f/2,y:l+u+y,horizontalAnchor:`middle`,verticalAnchor:x};return o&&E&&(O.height=Math.max(E.y+E.height-(l+u),0),O.width=f),O}if(n===`left`){var k={x:h-C,y:l+u/2,horizontalAnchor:w,verticalAnchor:`middle`};return o&&E&&(k.width=Math.max(k.x-E.x,0),k.height=u),k}if(n===`right`){var A={x:h+g+C,y:l+u/2,horizontalAnchor:T,verticalAnchor:`middle`};return o&&E&&(A.width=Math.max(E.x+E.width-A.x,0),A.height=u),A}var j=o&&E?{width:g,height:u}:{};return n===`insideLeft`?be({x:h+C,y:l+u/2,horizontalAnchor:T,verticalAnchor:`middle`},j):n===`insideRight`?be({x:h+g-C,y:l+u/2,horizontalAnchor:w,verticalAnchor:`middle`},j):n===`insideTop`?be({x:p+d/2,y:l+y,horizontalAnchor:`middle`,verticalAnchor:x},j):n===`insideBottom`?be({x:m+f/2,y:l+u-y,horizontalAnchor:`middle`,verticalAnchor:b},j):n===`insideTopLeft`?be({x:p+C,y:l+y,horizontalAnchor:T,verticalAnchor:x},j):n===`insideTopRight`?be({x:p+d-C,y:l+y,horizontalAnchor:w,verticalAnchor:x},j):n===`insideBottomLeft`?be({x:m+C,y:l+u-y,horizontalAnchor:T,verticalAnchor:b},j):n===`insideBottomRight`?be({x:m+f-C,y:l+u-y,horizontalAnchor:w,verticalAnchor:b},j):n&&typeof n==`object`&&(F(n.x)||oe(n.x))&&(F(n.y)||oe(n.y))?be({x:c+ue(n.x,g),y:l+ue(n.y,u),horizontalAnchor:`end`,verticalAnchor:`end`},j):be({x:_,y:l+u/2,horizontalAnchor:`middle`,verticalAnchor:`middle`},j)},Te=[`top`,`left`,`right`,`bottom`];function Ee(e){return e==null?!1:typeof e==`object`||Te.includes(e)}var De=(0,a.createContext)(null);function I(e){return function(){return e}}var Oe=Math.PI,ke=2*Oe,Ae=1e-6,je=ke-Ae;function Me(e){this._+=e[0];for(let t=1,n=e.length;t=0))throw Error(`invalid digits: ${e}`);if(t>15)return Me;let n=10**t;return function(e){this._+=e[0];for(let t=1,r=e.length;tAe)if(!(Math.abs(u*s-c*l)>Ae)||!i)this._append`L${this._x1=e},${this._y1=t}`;else{let f=n-a,p=r-o,m=s*s+c*c,h=f*f+p*p,g=Math.sqrt(m),_=Math.sqrt(d),v=i*Math.tan((Oe-Math.acos((m+d-h)/(2*g*_)))/2),y=v/_,b=v/g;Math.abs(y-1)>Ae&&this._append`L${e+y*l},${t+y*u}`,this._append`A${i},${i},0,0,${+(u*f>l*p)},${this._x1=e+b*s},${this._y1=t+b*c}`}}arc(e,t,n,r,i,a){if(e=+e,t=+t,n=+n,a=!!a,n<0)throw Error(`negative radius: ${n}`);let o=n*Math.cos(r),s=n*Math.sin(r),c=e+o,l=t+s,u=1^a,d=a?r-i:i-r;this._x1===null?this._append`M${c},${l}`:(Math.abs(this._x1-c)>Ae||Math.abs(this._y1-l)>Ae)&&this._append`L${c},${l}`,n&&(d<0&&(d=d%ke+ke),d>je?this._append`A${n},${n},0,1,${u},${e-o},${t-s}A${n},${n},0,1,${u},${this._x1=c},${this._y1=l}`:d>Ae&&this._append`A${n},${n},0,${+(d>=Oe)},${u},${this._x1=e+n*Math.cos(i)},${this._y1=t+n*Math.sin(i)}`)}rect(e,t,n,r){this._append`M${this._x0=this._x1=+e},${this._y0=this._y1=+t}h${n=+n}v${+r}h${-n}Z`}toString(){return this._}};function Fe(){return new Pe}Fe.prototype=Pe.prototype;function Ie(e){let t=3;return e.digits=function(n){if(!arguments.length)return t;if(n==null)t=null;else{let e=Math.floor(n);if(!(e>=0))throw RangeError(`invalid digits: ${n}`);t=e}return e},()=>new Pe(t)}Array.prototype.slice;function Le(e){return typeof e==`object`&&`length`in e?e:Array.from(e)}function Re(e){this._context=e}Re.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._context.lineTo(e,t);break}}};function ze(e){return new Re(e)}function Be(e){return e[0]}function Ve(e){return e[1]}function He(e,t){var n=I(!0),r=null,i=ze,a=null,o=Ie(s);e=typeof e==`function`?e:e===void 0?Be:I(e),t=typeof t==`function`?t:t===void 0?Ve:I(t);function s(s){var c,l=(s=Le(s)).length,u,d=!1,f;for(r??(a=i(f=o())),c=0;c<=l;++c)!(c=d;--f)s.point(_[f],v[f]);s.lineEnd(),s.areaEnd()}h&&(_[u]=+e(m,u,l),v[u]=+t(m,u,l),s.point(r?+r(m,u,l):_[u],n?+n(m,u,l):v[u]))}if(g)return s=null,g+``||null}function u(){return He().defined(i).curve(o).context(a)}return l.x=function(t){return arguments.length?(e=typeof t==`function`?t:I(+t),r=null,l):e},l.x0=function(t){return arguments.length?(e=typeof t==`function`?t:I(+t),l):e},l.x1=function(e){return arguments.length?(r=e==null?null:typeof e==`function`?e:I(+e),l):r},l.y=function(e){return arguments.length?(t=typeof e==`function`?e:I(+e),n=null,l):t},l.y0=function(e){return arguments.length?(t=typeof e==`function`?e:I(+e),l):t},l.y1=function(e){return arguments.length?(n=e==null?null:typeof e==`function`?e:I(+e),l):n},l.lineX0=l.lineY0=function(){return u().x(e).y(t)},l.lineY1=function(){return u().x(e).y(n)},l.lineX1=function(){return u().x(r).y(t)},l.defined=function(e){return arguments.length?(i=typeof e==`function`?e:I(!!e),l):i},l.curve=function(e){return arguments.length?(o=e,a!=null&&(s=o(a)),l):o},l.context=function(e){return arguments.length?(e==null?a=s=null:s=o(a=e),l):a},l}var We=class{constructor(e,t){this._context=e,this._x=t}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line}point(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+e)/2,this._y0,this._x0,t,e,t):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+t)/2,e,this._y0,e,t);break}this._x0=e,this._y0=t}};function Ge(e){return new We(e,!0)}function Ke(e){return new We(e,!1)}function qe(){}function Je(e,t,n){e._context.bezierCurveTo((2*e._x0+e._x1)/3,(2*e._y0+e._y1)/3,(e._x0+2*e._x1)/3,(e._y0+2*e._y1)/3,(e._x0+4*e._x1+t)/6,(e._y0+4*e._y1+n)/6)}function Ye(e){this._context=e}Ye.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:Je(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1);break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:Je(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function Xe(e){return new Ye(e)}function Ze(e){this._context=e}Ze.prototype={areaStart:qe,areaEnd:qe,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4);break}},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._x2=e,this._y2=t;break;case 1:this._point=2,this._x3=e,this._y3=t;break;case 2:this._point=3,this._x4=e,this._y4=t,this._context.moveTo((this._x0+4*this._x1+e)/6,(this._y0+4*this._y1+t)/6);break;default:Je(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function Qe(e){return new Ze(e)}function $e(e){this._context=e}$e.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||this._line!==0&&this._point===3)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var n=(this._x0+4*this._x1+e)/6,r=(this._y0+4*this._y1+t)/6;this._line?this._context.lineTo(n,r):this._context.moveTo(n,r);break;case 3:this._point=4;default:Je(this,e,t);break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t}};function et(e){return new $e(e)}function tt(e){this._context=e}tt.prototype={areaStart:qe,areaEnd:qe,lineStart:function(){this._point=0},lineEnd:function(){this._point&&this._context.closePath()},point:function(e,t){e=+e,t=+t,this._point?this._context.lineTo(e,t):(this._point=1,this._context.moveTo(e,t))}};function nt(e){return new tt(e)}function rt(e){return e<0?-1:1}function it(e,t,n){var r=e._x1-e._x0,i=t-e._x1,a=(e._y1-e._y0)/(r||i<0&&-0),o=(n-e._y1)/(i||r<0&&-0),s=(a*i+o*r)/(r+i);return(rt(a)+rt(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(s))||0}function at(e,t){var n=e._x1-e._x0;return n?(3*(e._y1-e._y0)/n-t)/2:t}function ot(e,t,n){var r=e._x0,i=e._y0,a=e._x1,o=e._y1,s=(a-r)/3;e._context.bezierCurveTo(r+s,i+s*t,a-s,o-s*n,a,o)}function st(e){this._context=e}st.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=this._t0=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x1,this._y1);break;case 3:ot(this,this._t0,at(this,this._t0));break}(this._line||this._line!==0&&this._point===1)&&this._context.closePath(),this._line=1-this._line},point:function(e,t){var n=NaN;if(e=+e,t=+t,!(e===this._x1&&t===this._y1)){switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;break;case 2:this._point=3,ot(this,at(this,n=it(this,e,t)),n);break;default:ot(this,this._t0,n=it(this,e,t));break}this._x0=this._x1,this._x1=e,this._y0=this._y1,this._y1=t,this._t0=n}}};function ct(e){this._context=new lt(e)}(ct.prototype=Object.create(st.prototype)).point=function(e,t){st.prototype.point.call(this,t,e)};function lt(e){this._context=e}lt.prototype={moveTo:function(e,t){this._context.moveTo(t,e)},closePath:function(){this._context.closePath()},lineTo:function(e,t){this._context.lineTo(t,e)},bezierCurveTo:function(e,t,n,r,i,a){this._context.bezierCurveTo(t,e,r,n,a,i)}};function ut(e){return new st(e)}function dt(e){return new ct(e)}function ft(e){this._context=e}ft.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x=[],this._y=[]},lineEnd:function(){var e=this._x,t=this._y,n=e.length;if(n)if(this._line?this._context.lineTo(e[0],t[0]):this._context.moveTo(e[0],t[0]),n===2)this._context.lineTo(e[1],t[1]);else for(var r=pt(e),i=pt(t),a=0,o=1;o=0;--t)i[t]=(o[t]-i[t+1])/a[t];for(a[n-1]=(e[n]+i[n-1])/2,t=0;t=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(e,t){switch(e=+e,t=+t,this._point){case 0:this._point=1,this._line?this._context.lineTo(e,t):this._context.moveTo(e,t);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,t),this._context.lineTo(e,t);else{var n=this._x*(1-this._t)+e*this._t;this._context.lineTo(n,this._y),this._context.lineTo(n,t)}break}this._x=e,this._y=t}};function gt(e){return new ht(e,.5)}function _t(e){return new ht(e,0)}function vt(e){return new ht(e,1)}function yt(e,t){if((o=e.length)>1)for(var n=1,r,i,a=e[t[0]],o,s=a.length;n=0;)n[t]=t;return n}function xt(e,t){return e[t]}function St(e){let t=[];return t.key=e,t}function Ct(){var e=I([]),t=bt,n=yt,r=xt;function i(i){var a=Array.from(e.apply(this,arguments),St),o,s=a.length,c=-1,l;for(let e of i)for(o=0,++c;o0){for(var n,r,i=0,a=e[0].length,o;i0){for(var n=0,r=e[t[0]],i,a=r.length;n0)||!((a=(i=e[t[0]]).length)>0))){for(var n=0,r=1,i,a,o;r`radius`in e&&`startAngle`in e&&`endAngle`in e,Ot=(e,t)=>{if(!e||typeof e==`function`||typeof e==`boolean`)return null;var n=e;if((0,a.isValidElement)(e)&&(n=e.props),typeof n!=`object`&&typeof n!=`function`)return null;var r={};return Object.keys(n).forEach(e=>{u(e)&&typeof n[e]==`function`&&(r[e]=t||(t=>n[e](n,t)))}),r},kt=(e,t,n)=>r=>(e(t,n,r),null),At=(e,t,n)=>{if(e===null||typeof e!=`object`&&typeof e!=`function`)return null;var r=null;return Object.keys(e).forEach(i=>{var a=e[i];u(i)&&typeof a==`function`&&(r||={},r[i]=kt(a,t,n))}),r};function jt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Mt(e){for(var t=1;t(e[t]===void 0&&r[t]!==void 0&&(e[t]=r[t]),e),n)}function Lt(e,t){let n=new Map;for(let r=0;rObject.prototype.propertyIsEnumerable.call(e,t))}function Wt(e){return e==null?e===void 0?`[object Undefined]`:`[object Null]`:Object.prototype.toString.call(e)}var Gt=`[object RegExp]`,Kt=`[object String]`,qt=`[object Number]`,Jt=`[object Boolean]`,Yt=`[object Arguments]`,Xt=`[object Symbol]`,Zt=`[object Date]`,Qt=`[object Map]`,$t=`[object Set]`,en=`[object Array]`,tn=`[object Function]`,nn=`[object ArrayBuffer]`,rn=`[object Object]`,an=`[object Error]`,on=`[object DataView]`,sn=`[object Uint8Array]`,cn=`[object Uint8ClampedArray]`,ln=`[object Uint16Array]`,un=`[object Uint32Array]`,dn=`[object BigUint64Array]`,fn=`[object Int8Array]`,pn=`[object Int16Array]`,mn=`[object Int32Array]`,hn=`[object BigInt64Array]`,gn=`[object Float32Array]`,_n=`[object Float64Array]`,vn=typeof globalThis==`object`&&globalThis||typeof window==`object`&&window||typeof self==`object`&&self||typeof global==`object`&&global||(function(){return this})();function yn(e){return vn.Buffer!==void 0&&vn.Buffer.isBuffer(e)}function bn(e,t){return xn(e,void 0,e,new Map,t)}function xn(e,t,n,r=new Map,i=void 0){let a=i?.(e,t,n,r);if(a!==void 0)return a;if(Vt(e))return e;if(r.has(e))return r.get(e);if(Array.isArray(e)){let t=Array(e.length);r.set(e,t);for(let a=0;avoid 0)}function On(e,t,n,r,i=!1){if(t===e)return!0;switch(typeof t){case`object`:return kn(e,t,n,r);case`function`:return Object.keys(t).length>0?On(e,{...t},n,r,i):Tn(e,t);default:return En(e)&&i?typeof t!=`string`||t===``:Tn(e,t)}}function kn(e,t,n,r){if(t==null)return!0;if(Array.isArray(t))return jn(e,t,n,r);if(t instanceof Map)return An(e,t,n,r);if(t instanceof Set)return Mn(e,t,n,r);let i=Object.keys(t);if(e==null||Vt(e))return i.length===0;if(i.length===0)return!0;if(r?.has(t))return r.get(t)===e;r?.set(t,e);try{for(let a=0;avoid 0)}function Pn(e){return e=wn(e),t=>Nn(t,e)}function Fn(e,t){return bn(e,(n,r,i,a)=>{let o=t?.(n,r,i,a);if(o!==void 0)return o;if(typeof e==`object`){if(Wt(e)===`[object Object]`&&typeof e.constructor!=`function`){let t={};return a.set(e,t),Sn(t,e,i,a),t}switch(Object.prototype.toString.call(e)){case qt:case Kt:case Jt:{let t=new e.constructor(e?.valueOf());return Sn(t,e),t}case Yt:{let t={};return Sn(t,e),t.length=e.length,t[Symbol.iterator]=e[Symbol.iterator],t}default:return}}})}function In(e){return Fn(e)}var Ln=/^(?:0|[1-9]\d*)$/;function Rn(e,t=2**53-1){switch(typeof e){case`number`:return Number.isInteger(e)&&e>=0&&e=0}function Wn(e){return e!=null&&typeof e!=`function`&&Un(e.length)}function Gn(e){return typeof e==`object`&&!!e}function Kn(e){return Gn(e)&&Wn(e)}function qn(e,t=zt){return Kn(e)?Lt(Array.from(e),Rt(Hn(t),1)):[]}function Jn(e,t,n){return t===!0?qn(e,n):typeof t==`function`?qn(e,t):e}var Yn=n((e=>{var t=r();function n(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var i=typeof Object.is==`function`?Object.is:n,a=t.useState,o=t.useEffect,s=t.useLayoutEffect,c=t.useDebugValue;function l(e,t){var n=t(),r=a({inst:{value:n,getSnapshot:t}}),i=r[0].inst,l=r[1];return s(function(){i.value=n,i.getSnapshot=t,u(i)&&l({inst:i})},[e,n,t]),o(function(){return u(i)&&l({inst:i}),e(function(){u(i)&&l({inst:i})})},[e]),c(n),n}function u(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!i(e,n)}catch{return!0}}function d(e,t){return t()}var f=typeof window>`u`||window.document===void 0||window.document.createElement===void 0?d:l;e.useSyncExternalStore=t.useSyncExternalStore===void 0?f:t.useSyncExternalStore})),Xn=n(((e,t)=>{t.exports=Yn()})),Zn=n((e=>{var t=r(),n=Xn();function i(e,t){return e===t&&(e!==0||1/e==1/t)||e!==e&&t!==t}var a=typeof Object.is==`function`?Object.is:i,o=n.useSyncExternalStore,s=t.useRef,c=t.useEffect,l=t.useMemo,u=t.useDebugValue;e.useSyncExternalStoreWithSelector=function(e,t,n,r,i){var d=s(null);if(d.current===null){var f={hasValue:!1,value:null};d.current=f}else f=d.current;d=l(function(){function e(e){if(!o){if(o=!0,s=e,e=r(e),i!==void 0&&f.hasValue){var t=f.value;if(i(t,e))return c=t}return c=e}if(t=c,a(s,e))return t;var n=r(e);return i!==void 0&&i(t,n)?(s=e,t):(s=e,c=n)}var o=!1,s,c,l=n===void 0?null:n;return[function(){return e(t())},l===null?void 0:function(){return e(l())}]},[t,n,r,i]);var p=o(e,d[0],d[1]);return c(function(){f.hasValue=!0,f.value=p},[p]),u(p),p}})),Qn=n(((e,t)=>{t.exports=Zn()})),$n=e(Qn()),er=(0,a.createContext)(null),tr=e=>e,L=()=>{var e=(0,a.useContext)(er);return e?e.store.dispatch:tr},nr=()=>{},rr=()=>nr,ir=(e,t)=>e===t;function R(e){var t=(0,a.useContext)(er),n=(0,a.useMemo)(()=>t?t=>{if(t!=null)return e(t)}:nr,[t,e]);return(0,$n.useSyncExternalStoreWithSelector)(t?t.subscription.addNestedSub:rr,t?t.store.getState:nr,t?t.store.getState:nr,n,ir)}function ar(e,t=`expected a function, instead received ${typeof e}`){if(typeof e!=`function`)throw TypeError(t)}function or(e,t=`expected all items to be functions, instead received the following types: `){if(!e.every(e=>typeof e==`function`)){let n=e.map(e=>typeof e==`function`?`function ${e.name||`unnamed`}()`:typeof e).join(`, `);throw TypeError(`${t}[${n}]`)}}var sr=e=>Array.isArray(e)?e:[e];function cr(e){let t=Array.isArray(e[0])?e[0]:e;return or(t,`createSelector expects all input-selectors to be functions, but received the following types: `),t}function lr(e,t){let n=[],{length:r}=e;for(let i=0;i`u`?ur:WeakRef,fr=0,pr=1;function mr(){return{s:fr,v:void 0,o:null,p:null}}function hr(e){return e instanceof dr?e.deref():e}function gr(e,t={}){let n=mr(),{resultEqualityCheck:r}=t,i,a=0;function o(){let t=n,{length:o}=arguments;for(let e=0,n=o;e{n=mr(),o.resetResultsCount()},o.resultsCount=()=>a,o.resetResultsCount=()=>{a=0},o}function _r(e,...t){let n=typeof e==`function`?{memoize:e,memoizeOptions:t}:e,r=(...e)=>{let t=0,r=0,i,a={},o=e.pop();typeof o==`object`&&(a=o,o=e.pop()),ar(o,`createSelector expects an output function after the inputs, but received: [${typeof o}]`);let{memoize:s,memoizeOptions:c=[],argsMemoize:l=gr,argsMemoizeOptions:u=[]}={...n,...a},d=sr(c),f=sr(u),p=cr(e),m=s(function(){return t++,o.apply(null,arguments)},...d),h=l(function(){r++;let e=lr(p,arguments);return i=m.apply(null,e),i},...f);return Object.assign(h,{resultFunc:o,memoizedResultFunc:m,dependencies:p,dependencyRecomputations:()=>r,resetDependencyRecomputations:()=>{r=0},lastResult:()=>i,recomputations:()=>t,resetRecomputations:()=>{t=0},memoize:s,argsMemoize:l})};return Object.assign(r,{withTypes:()=>r}),r}var z=_r(gr);function vr(e,t=1){let n=[],r=Math.floor(t),i=(e,t)=>{for(let a=0;a{if(e!==t){let r=br(e),i=br(t);if(r===i&&r===0){if(et)return n===`desc`?-1:1}return n===`desc`?i-r:r-i}return 0};function Sr(e){return typeof e==`symbol`||e instanceof Symbol}var Cr=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,wr=/^\w*$/;function Tr(e,t){return Array.isArray(e)?!1:typeof e==`number`||typeof e==`boolean`||e==null||Sr(e)?!0:typeof e==`string`&&(wr.test(e)||!Cr.test(e))||t!=null&&Object.hasOwn(t,e)}function Er(e,t,n,r){if(e==null)return[];n=r?void 0:n,Array.isArray(e)||(e=Object.values(e)),Array.isArray(t)||(t=t==null?[null]:[t]),t.length===0&&(t=[null]),Array.isArray(n)||(n=n==null?[]:[n]),n=n.map(e=>String(e));let i=(e,t)=>{let n=e;for(let e=0;et==null||e==null?t:typeof e==`object`&&`key`in e?Object.hasOwn(t,e.key)?t[e.key]:i(t,e.path):typeof e==`function`?e(t):Array.isArray(e)?i(t,e):typeof t==`object`?t[e]:t,o=t.map(e=>(Array.isArray(e)&&e.length===1&&(e=e[0]),e==null||typeof e==`function`||Array.isArray(e)||Tr(e)?e:{key:e,path:N(e)}));return e.map(e=>({original:e,criteria:o.map(t=>a(t,e))})).slice().sort((e,t)=>{for(let r=0;re.original)}function Dr(e,...t){let n=t.length;return n>1&&yr(e,t[0],t[1])?t=[]:n>2&&yr(t[0],t[1],t[2])&&(t=[t[0]]),Er(e,vr(t),[`asc`])}var Or=e=>e.legend.settings,kr=e=>e.legend.size;z([e=>e.legend.payload,Or],(e,t)=>{var n=t.itemSorter,r=e.flat(1);return n?Dr(r,n):r});function Ar(e,t){return Fr(e)||Pr(e,t)||Mr(e,t)||jr()}function jr(){throw TypeError(`Invalid attempt to destructure non-iterable instance. In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function Mr(e,t){if(e){if(typeof e==`string`)return Nr(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Nr(e,t):void 0}}function Nr(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);nIr||Math.abs(e.left-t.left)>Ir||Math.abs(e.top-t.top)>Ir||Math.abs(e.width-t.width)>Ir}function Rr(e){var t=e.getBoundingClientRect();return{height:t.height,left:t.left,top:t.top,width:t.width}}function zr(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:[],t=Ar((0,a.useState)({height:0,left:0,top:0,width:0}),2),n=t[0],r=t[1],i=(0,a.useRef)(null),o=(0,a.useRef)(n);o.current=n;var s=(0,a.useCallback)(e=>{if(i.current!=null&&(i.current.disconnect(),i.current=null),e!=null){var t=Rr(e);if(Lr(t,o.current)&&r(t),typeof ResizeObserver<`u`){var n=new ResizeObserver(()=>{var t=Rr(e);Lr(t,o.current)&&r(t)});n.observe(e),i.current=n}}},[...e]);return(0,a.useEffect)(()=>()=>{var e;(e=i.current)==null||e.disconnect()},[]),[n,s]}function Br(e){return`Minified Redux error #${e}; visit https://redux.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var Vr=typeof Symbol==`function`&&Symbol.observable||`@@observable`,Hr=()=>Math.random().toString(36).substring(7).split(``).join(`.`),Ur={INIT:`@@redux/INIT${Hr()}`,REPLACE:`@@redux/REPLACE${Hr()}`,PROBE_UNKNOWN_ACTION:()=>`@@redux/PROBE_UNKNOWN_ACTION${Hr()}`};function Wr(e){if(typeof e!=`object`||!e)return!1;let t=e;for(;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t||Object.getPrototypeOf(e)===null}function Gr(e,t,n){if(typeof e!=`function`)throw Error(Br(2));if(typeof t==`function`&&typeof n==`function`||typeof n==`function`&&typeof arguments[3]==`function`)throw Error(Br(0));if(typeof t==`function`&&n===void 0&&(n=t,t=void 0),n!==void 0){if(typeof n!=`function`)throw Error(Br(1));return n(Gr)(e,t)}let r=e,i=t,a=new Map,o=a,s=0,c=!1;function l(){o===a&&(o=new Map,a.forEach((e,t)=>{o.set(t,e)}))}function u(){if(c)throw Error(Br(3));return i}function d(e){if(typeof e!=`function`)throw Error(Br(4));if(c)throw Error(Br(5));let t=!0;l();let n=s++;return o.set(n,e),function(){if(t){if(c)throw Error(Br(6));t=!1,l(),o.delete(n),a=null}}}function f(e){if(!Wr(e))throw Error(Br(7));if(e.type===void 0)throw Error(Br(8));if(typeof e.type!=`string`)throw Error(Br(17));if(c)throw Error(Br(9));try{c=!0,i=r(i,e)}finally{c=!1}return(a=o).forEach(e=>{e()}),e}function p(e){if(typeof e!=`function`)throw Error(Br(10));r=e,f({type:Ur.REPLACE})}function m(){let e=d;return{subscribe(t){if(typeof t!=`object`||!t)throw Error(Br(11));function n(){let e=t;e.next&&e.next(u())}return n(),{unsubscribe:e(n)}},[Vr](){return this}}}return f({type:Ur.INIT}),{dispatch:f,subscribe:d,getState:u,replaceReducer:p,[Vr]:m}}function Kr(e){Object.keys(e).forEach(t=>{let n=e[t];if(n(void 0,{type:Ur.INIT})===void 0)throw Error(Br(12));if(n(void 0,{type:Ur.PROBE_UNKNOWN_ACTION()})===void 0)throw Error(Br(13))})}function qr(e){let t=Object.keys(e),n={};for(let r=0;re:e.length===1?e[0]:e.reduce((e,t)=>(...n)=>e(t(...n)))}function Yr(...e){return t=>(n,r)=>{let i=t(n,r),a=()=>{throw Error(Br(15))},o={getState:i.getState,dispatch:(e,...t)=>a(e,...t)};return a=Jr(...e.map(e=>e(o)))(i.dispatch),{...i,dispatch:a}}}function Xr(e){return Wr(e)&&`type`in e&&typeof e.type==`string`}var Zr=Symbol.for(`immer-nothing`),Qr=Symbol.for(`immer-draftable`),$r=Symbol.for(`immer-state`);function ei(e,...t){throw Error(`[Immer] minified error nr: ${e}. Full error at: https://bit.ly/3cXEKWf`)}var ti=Object,ni=ti.getPrototypeOf,ri=`constructor`,ii=`prototype`,ai=`configurable`,oi=`enumerable`,si=`writable`,ci=`value`,li=e=>!!e&&!!e[$r];function ui(e){return e?pi(e)||bi(e)||!!e[Qr]||!!e[ri]?.[Qr]||xi(e)||Si(e):!1}var di=ti[ii][ri].toString(),fi=new WeakMap;function pi(e){if(!e||!Ci(e))return!1;let t=ni(e);if(t===null||t===ti[ii])return!0;let n=ti.hasOwnProperty.call(t,ri)&&t[ri];if(n===Object)return!0;if(!wi(n))return!1;let r=fi.get(n);return r===void 0&&(r=Function.toString.call(n),fi.set(n,r)),r===di}function mi(e,t,n=!0){hi(e)===0?(n?Reflect.ownKeys(e):ti.keys(e)).forEach(n=>{t(n,e[n],e)}):e.forEach((n,r)=>t(r,n,e))}function hi(e){let t=e[$r];return t?t.type_:bi(e)?1:xi(e)?2:Si(e)?3:0}var gi=(e,t,n=hi(e))=>n===2?e.has(t):ti[ii].hasOwnProperty.call(e,t),_i=(e,t,n=hi(e))=>n===2?e.get(t):e[t],vi=(e,t,n,r=hi(e))=>{r===2?e.set(t,n):r===3?e.add(n):e[t]=n};function yi(e,t){return e===t?e!==0||1/e==1/t:e!==e&&t!==t}var bi=Array.isArray,xi=e=>e instanceof Map,Si=e=>e instanceof Set,Ci=e=>typeof e==`object`,wi=e=>typeof e==`function`,Ti=e=>typeof e==`boolean`;function Ei(e){let t=+e;return Number.isInteger(t)&&String(t)===e}var Di=e=>e.copy_||e.base_,Oi=e=>e.modified_?e.copy_:e.base_;function ki(e,t){if(xi(e))return new Map(e);if(Si(e))return new Set(e);if(bi(e))return Array[ii].slice.call(e);let n=pi(e);if(t===!0||t===`class_only`&&!n){let t=ti.getOwnPropertyDescriptors(e);delete t[$r];let n=Reflect.ownKeys(t);for(let r=0;r1&&ti.defineProperties(e,{set:Mi,add:Mi,clear:Mi,delete:Mi}),ti.freeze(e),t&&mi(e,(e,t)=>{Ai(t,!0)},!1),e)}function ji(){ei(2)}var Mi={[ci]:ji};function Ni(e){return e===null||!Ci(e)||ti.isFrozen(e)}var Pi=`MapSet`,Fi=`Patches`,Ii=`ArrayMethods`,Li={};function Ri(e){let t=Li[e];return t||ei(0,e),t}var zi=e=>!!Li[e],Bi,Vi=()=>Bi,Hi=(e,t)=>({drafts_:[],parent_:e,immer_:t,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:zi(Pi)?Ri(Pi):void 0,arrayMethodsPlugin_:zi(Ii)?Ri(Ii):void 0});function Ui(e,t){t&&(e.patchPlugin_=Ri(Fi),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function Wi(e){Gi(e),e.drafts_.forEach(qi),e.drafts_=null}function Gi(e){e===Bi&&(Bi=e.parent_)}var Ki=e=>Bi=Hi(Bi,e);function qi(e){let t=e[$r];t.type_===0||t.type_===1?t.revoke_():t.revoked_=!0}function Ji(e,t){t.unfinalizedDrafts_=t.drafts_.length;let n=t.drafts_[0];if(e!==void 0&&e!==n){n[$r].modified_&&(Wi(t),ei(4)),ui(e)&&(e=Yi(t,e));let{patchPlugin_:r}=t;r&&r.generateReplacementPatches_(n[$r].base_,e,t)}else e=Yi(t,n);return Xi(t,e,!0),Wi(t),t.patches_&&t.patchListener_(t.patches_,t.inversePatches_),e===Zr?void 0:e}function Yi(e,t){if(Ni(t))return t;let n=t[$r];if(!n)return ia(t,e.handledSet_,e);if(!Qi(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){let{callbacks_:t}=n;if(t)for(;t.length>0;)t.pop()(e);na(n,e)}return n.copy_}function Xi(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&Ai(t,n)}function Zi(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var Qi=(e,t)=>e.scope_===t,$i=[];function ea(e,t,n,r){let i=Di(e),a=e.type_;if(r!==void 0&&_i(i,r,a)===t){vi(i,r,n,a);return}if(!e.draftLocations_){let t=e.draftLocations_=new Map;mi(i,(e,n)=>{if(li(n)){let r=t.get(n)||[];r.push(e),t.set(n,r)}})}let o=e.draftLocations_.get(t)??$i;for(let e of o)vi(i,e,n,a)}function ta(e,t,n){e.callbacks_.push(function(r){let i=t;if(!i||!Qi(i,r))return;r.mapSetPlugin_?.fixSetContents(i);let a=Oi(i);ea(e,i.draft_??i,a,n),na(i,r)})}function na(e,t){if(e.modified_&&!e.finalized_&&(e.type_===3||e.type_===1&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){let{patchPlugin_:n}=t;if(n){let r=n.getPath(e);r&&n.generatePatches_(e,r,t)}Zi(e)}}function ra(e,t,n){let{scope_:r}=e;if(li(n)){let i=n[$r];Qi(i,r)&&i.callbacks_.push(function(){pa(e),ea(e,n,Oi(i),t)})}else ui(n)&&e.callbacks_.push(function(){let i=Di(e);e.type_===3?i.has(n)&&ia(n,r.handledSet_,r):_i(i,t,e.type_)===n&&r.drafts_.length>1&&(e.assigned_.get(t)??!1)===!0&&e.copy_&&ia(_i(e.copy_,t,e.type_),r.handledSet_,r)})}function ia(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||li(e)||t.has(e)||!ui(e)||Ni(e)?e:(t.add(e),mi(e,(r,i)=>{if(li(i)){let t=i[$r];Qi(t,n)&&(vi(e,r,Oi(t),e.type_),Zi(t))}else ui(i)&&ia(i,t,n)}),e)}function aa(e,t){let n=bi(e),r={type_:+!!n,scope_:t?t.scope_:Vi(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0},i=r,a=oa;n&&(i=[r],a=sa);let{revoke:o,proxy:s}=Proxy.revocable(i,a);return r.draft_=s,r.revoke_=o,[s,r]}var oa={get(e,t){if(t===$r)return e;let n=e.scope_.arrayMethodsPlugin_,r=e.type_===1&&typeof t==`string`;if(r&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);let i=Di(e);if(!gi(i,t,e.type_))return ua(e,i,t);let a=i[t];if(e.finalized_||!ui(a)||r&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&Ei(t))return a;if(a===ca(e.base_,t)||la(e,t,a)){pa(e);let n=e.type_===1?+t:t,r=ha(e.scope_,a,e,n);return e.copy_[n]=r}return a},has(e,t){return t in Di(e)},ownKeys(e){return Reflect.ownKeys(Di(e))},set(e,t,n){let r=da(Di(e),t);if(r?.set)return r.set.call(e.draft_,n),!0;if(!e.modified_){let r=ca(Di(e),t),i=r?.[$r];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.set(t,!1),!0;if(yi(n,r)&&(n!==void 0||gi(e.base_,t,e.type_)))return!0;pa(e),fa(e)}return e.copy_[t]===n&&(n!==void 0||gi(e.copy_,t,e.type_))||Number.isNaN(n)&&Number.isNaN(e.copy_[t])?!0:(e.copy_[t]=n,e.assigned_.set(t,!0),ra(e,t,n),!0)},deleteProperty(e,t){return pa(e),ca(e.base_,t)!==void 0||t in e.base_?(e.assigned_.set(t,!1),fa(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0},getOwnPropertyDescriptor(e,t){let n=Di(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r&&{[si]:!0,[ai]:e.type_!==1||t!==`length`,[oi]:r[oi],[ci]:n[t]}},defineProperty(){ei(11)},getPrototypeOf(e){return ni(e.base_)},setPrototypeOf(){ei(12)}},sa={};for(let e in oa){let t=oa[e];sa[e]=function(){let e=arguments;return e[0]=e[0][0],t.apply(this,e)}}sa.deleteProperty=function(e,t){return sa.set.call(this,e,t,void 0)},sa.set=function(e,t,n){return oa.set.call(this,e[0],t,n,e[0])};function ca(e,t){let n=e[$r];return(n?Di(n):e)[t]}function la(e,t,n){return e.type_!==1||!e.allIndicesReassigned_||e.assigned_?.get(t)||!ui(n)||n[$r]?!1:e.baseRefs_.has(n)}function ua(e,t,n){let r=da(t,n);return r?ci in r?r[ci]:r.get?.call(e.draft_):void 0}function da(e,t){if(!(t in e))return;let n=ni(e);for(;n;){let e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=ni(n)}}function fa(e){e.modified_||(e.modified_=!0,e.parent_&&fa(e.parent_))}function pa(e){e.copy_||=(e.assigned_=new Map,ki(e.base_,e.scope_.immer_.useStrictShallowCopy_))}var ma=class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,t,n)=>{if(wi(e)&&!wi(t)){let n=t;t=e;let r=this;return function(e=n,...i){return r.produce(e,e=>t.call(this,e,...i))}}wi(t)||ei(6),n!==void 0&&!wi(n)&&ei(7);let r;if(ui(e)){let i=Ki(this),a=ha(i,e,void 0),o=!0;try{r=t(a),o=!1}finally{o?Wi(i):Gi(i)}return Ui(i,n),Ji(r,i)}else if(!e||!Ci(e)){if(r=t(e),r===void 0&&(r=e),r===Zr&&(r=void 0),this.autoFreeze_&&Ai(r,!0),n){let t=[],i=[];Ri(Fi).generateReplacementPatches_(e,r,{patches_:t,inversePatches_:i}),n(t,i)}return r}else ei(1,e)},this.produceWithPatches=(e,t)=>{if(wi(e))return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},Ti(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),Ti(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),Ti(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){ui(e)||ei(8),li(e)&&(e=ga(e));let t=Ki(this),n=ha(t,e,void 0);return n[$r].isManual_=!0,Gi(t),n}finishDraft(e,t){let n=e&&e[$r];(!n||!n.isManual_)&&ei(9);let{scope_:r}=n;return Ui(r,t),Ji(void 0,r)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){let r=t[n];if(r.path.length===0&&r.op===`replace`){e=r.value;break}}n>-1&&(t=t.slice(n+1));let r=Ri(Fi).applyPatches_;return li(e)?r(e,t):this.produce(e,e=>r(e,t))}};function ha(e,t,n,r){let[i,a]=xi(t)?Ri(Pi).proxyMap_(t,n):Si(t)?Ri(Pi).proxySet_(t,n):aa(t,n);return(n?.scope_??Vi()).drafts_.push(i),a.callbacks_=n?.callbacks_??[],a.key_=r,n&&r!==void 0?ta(n,a,r):a.callbacks_.push(function(e){e.mapSetPlugin_?.fixSetContents(a);let{patchPlugin_:t}=e;a.modified_&&t&&t.generatePatches_(a,[],e)}),i}function ga(e){return li(e)||ei(10,e),_a(e)}function _a(e){if(!ui(e)||Ni(e))return e;let t=e[$r],n,r=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=ki(e,t.scope_.immer_.useStrictShallowCopy_),r=t.scope_.immer_.shouldUseStrictIteration()}else n=ki(e,!0);return mi(n,(e,t)=>{vi(n,e,_a(t))},r),t&&(t.finalized_=!1),n}var va=new ma().produce,B=e=>e;function ya(e){return({dispatch:t,getState:n})=>r=>i=>typeof i==`function`?i(t,n,e):r(i)}var ba=ya(),xa=ya,Sa=typeof window<`u`&&window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__?window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__:function(){if(arguments.length!==0)return typeof arguments[0]==`object`?Jr:Jr.apply(null,arguments)};typeof window<`u`&&window.__REDUX_DEVTOOLS_EXTENSION__&&window.__REDUX_DEVTOOLS_EXTENSION__;function Ca(e,t){function n(...n){if(t){let r=t(...n);if(!r)throw Error(Mo(0));return{type:e,payload:r.payload,...`meta`in r&&{meta:r.meta},...`error`in r&&{error:r.error}}}return{type:e,payload:n[0]}}return n.toString=()=>`${e}`,n.type=e,n.match=t=>Xr(t)&&t.type===e,n}var wa=class e extends Array{constructor(...t){super(...t),Object.setPrototypeOf(this,e.prototype)}static get[Symbol.species](){return e}concat(...e){return super.concat.apply(this,e)}prepend(...t){return t.length===1&&Array.isArray(t[0])?new e(...t[0].concat(this)):new e(...t.concat(this))}};function Ta(e){return ui(e)?va(e,()=>{}):e}function Ea(e,t,n){return e.has(t)?e.get(t):e.set(t,n(t)).get(t)}function Da(e){return typeof e==`boolean`}var Oa=()=>function(e){let{thunk:t=!0,immutableCheck:n=!0,serializableCheck:r=!0,actionCreatorCheck:i=!0}=e??{},a=new wa;return t&&(Da(t)?a.push(ba):a.push(xa(t.extraArgument))),a},ka=`RTK_autoBatch`,V=()=>e=>({payload:e,meta:{[ka]:!0}}),Aa=e=>t=>{setTimeout(t,e)},ja=(e,t)=>n=>{let r=!1,i=()=>{r||(r=!0,cancelAnimationFrame(a),clearTimeout(o),n())},a=e(i),o=setTimeout(i,t)},Ma=(e={type:`raf`})=>t=>(...n)=>{let r=t(...n),i=!0,a=!1,o=!1,s=new Set,c=e.type===`tick`?queueMicrotask:e.type===`raf`?typeof window<`u`&&window.requestAnimationFrame?ja(window.requestAnimationFrame,100):Aa(10):e.type===`callback`?e.queueNotification:Aa(e.timeout),l=()=>{o=!1,a&&(a=!1,s.forEach(e=>e()))};return Object.assign({},r,{subscribe(e){let t=r.subscribe(()=>i&&e());return s.add(e),()=>{t(),s.delete(e)}},dispatch(e){try{return i=!e?.meta?.[ka],a=!i,a&&(o||(o=!0,c(l))),r.dispatch(e)}finally{i=!0}}})},Na=e=>function(t){let{autoBatch:n=!0}=t??{},r=new wa(e);return n&&r.push(Ma(typeof n==`object`?n:void 0)),r};function Pa(e){let t=Oa(),{reducer:n=void 0,middleware:r,devTools:i=!0,duplicateMiddlewareCheck:a=!0,preloadedState:o=void 0,enhancers:s=void 0}=e||{},c;if(typeof n==`function`)c=n;else if(Wr(n))c=qr(n);else throw Error(Mo(1));let l;l=typeof r==`function`?r(t):t();let u=Jr;i&&(u=Sa({trace:!1,...typeof i==`object`&&i}));let d=Na(Yr(...l)),f=typeof s==`function`?s(d):d(),p=u(...f);return Gr(c,o,p)}function Fa(e){let t={},n=[],r,i={addCase(e,n){let r=typeof e==`string`?e:e.type;if(!r)throw Error(Mo(28));if(r in t)throw Error(Mo(29));return t[r]=n,i},addAsyncThunk(e,r){return r.pending&&(t[e.pending.type]=r.pending),r.rejected&&(t[e.rejected.type]=r.rejected),r.fulfilled&&(t[e.fulfilled.type]=r.fulfilled),r.settled&&n.push({matcher:e.settled,reducer:r.settled}),i},addMatcher(e,t){return n.push({matcher:e,reducer:t}),i},addDefaultCase(e){return r=e,i}};return e(i),[t,n,r]}function Ia(e){return typeof e==`function`}function La(e,t){let[n,r,i]=Fa(t),a;if(Ia(e))a=()=>Ta(e());else{let t=Ta(e);a=()=>t}function o(e=a(),t){let o=[n[t.type],...r.filter(({matcher:e})=>e(t)).map(({reducer:e})=>e)];return o.filter(e=>!!e).length===0&&(o=[i]),o.reduce((e,n)=>{if(n)if(li(e)){let r=n(e,t);return r===void 0?e:r}else if(ui(e))return va(e,e=>n(e,t));else{let r=n(e,t);if(r===void 0){if(e===null)return e;throw Error(`A case reducer on a non-draftable value must not return undefined`)}return r}return e},e)}return o.getInitialState=a,o}var Ra=`ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW`,za=(e=21)=>{let t=``,n=e;for(;n--;)t+=Ra[Math.random()*64|0];return t},Ba=Symbol.for(`rtk-slice-createasyncthunk`);function Va(e,t){return`${e}/${t}`}function Ha({creators:e}={}){let t=e?.asyncThunk?.[Ba];return function(e){let{name:n,reducerPath:r=n}=e;if(!n)throw Error(Mo(11));let i=(typeof e.reducers==`function`?e.reducers(Ga()):e.reducers)||{},a=Object.keys(i),o={sliceCaseReducersByName:{},sliceCaseReducersByType:{},actionCreators:{},sliceMatchers:[]},s={addCase(e,t){let n=typeof e==`string`?e:e.type;if(!n)throw Error(Mo(12));if(n in o.sliceCaseReducersByType)throw Error(Mo(13));return o.sliceCaseReducersByType[n]=t,s},addMatcher(e,t){return o.sliceMatchers.push({matcher:e,reducer:t}),s},exposeAction(e,t){return o.actionCreators[e]=t,s},exposeCaseReducer(e,t){return o.sliceCaseReducersByName[e]=t,s}};a.forEach(r=>{let a=i[r],o={reducerName:r,type:Va(n,r),createNotation:typeof e.reducers==`function`};qa(a)?Ya(o,a,s,t):Ka(o,a,s)});function c(){let[t={},n=[],r=void 0]=typeof e.extraReducers==`function`?Fa(e.extraReducers):[e.extraReducers],i={...t,...o.sliceCaseReducersByType};return La(e.initialState,e=>{for(let t in i)e.addCase(t,i[t]);for(let t of o.sliceMatchers)e.addMatcher(t.matcher,t.reducer);for(let t of n)e.addMatcher(t.matcher,t.reducer);r&&e.addDefaultCase(r)})}let l=e=>e,u=new Map,d=new WeakMap,f;function p(e,t){return f||=c(),f(e,t)}function m(){return f||=c(),f.getInitialState()}function h(t,n=!1){function r(e){let i=e[t];return i===void 0&&n&&(i=Ea(d,r,m)),i}function i(t=l){return Ea(Ea(u,n,()=>new WeakMap),t,()=>{let r={};for(let[i,a]of Object.entries(e.selectors??{}))r[i]=Ua(a,t,()=>Ea(d,t,m),n);return r})}return{reducerPath:t,getSelectors:i,get selectors(){return i(r)},selectSlice:r}}let g={name:n,reducer:p,actions:o.actionCreators,caseReducers:o.sliceCaseReducersByName,getInitialState:m,...h(r),injectInto(e,{reducerPath:t,...n}={}){let i=t??r;return e.inject({reducerPath:i,reducer:p},n),{...g,...h(i,!0)}}};return g}}function Ua(e,t,n,r){function i(i,...a){let o=t(i);return o===void 0&&r&&(o=n()),e(o,...a)}return i.unwrapped=e,i}var Wa=Ha();function Ga(){function e(e,t){return{_reducerDefinitionType:`asyncThunk`,payloadCreator:e,...t}}return e.withTypes=()=>e,{reducer(e){return Object.assign({[e.name](...t){return e(...t)}}[e.name],{_reducerDefinitionType:`reducer`})},preparedReducer(e,t){return{_reducerDefinitionType:`reducerWithPrepare`,prepare:e,reducer:t}},asyncThunk:e}}function Ka({type:e,reducerName:t,createNotation:n},r,i){let a,o;if(`reducer`in r){if(n&&!Ja(r))throw Error(Mo(17));a=r.reducer,o=r.prepare}else a=r;i.addCase(e,a).exposeCaseReducer(t,a).exposeAction(t,o?Ca(e,o):Ca(e))}function qa(e){return e._reducerDefinitionType===`asyncThunk`}function Ja(e){return e._reducerDefinitionType===`reducerWithPrepare`}function Ya({type:e,reducerName:t},n,r,i){if(!i)throw Error(Mo(18));let{payloadCreator:a,fulfilled:o,pending:s,rejected:c,settled:l,options:u}=n,d=i(e,a,u);r.exposeAction(t,d),o&&r.addCase(d.fulfilled,o),s&&r.addCase(d.pending,s),c&&r.addCase(d.rejected,c),l&&r.addMatcher(d.settled,l),r.exposeCaseReducer(t,{fulfilled:o||Xa,pending:s||Xa,rejected:c||Xa,settled:l||Xa})}function Xa(){}var Za=`task`,Qa=`listener`,$a=`completed`,eo=`cancelled`,to=`task-${eo}`,no=`task-${$a}`,ro=`${Qa}-${eo}`,io=`${Qa}-${$a}`,ao=class{constructor(e){this.code=e,this.message=`${Za} ${eo} (reason: ${e})`}code;name=`TaskAbortError`;message},oo=(e,t)=>{if(typeof e!=`function`)throw TypeError(Mo(32))},so=()=>{},co=(e,t=so)=>(e.catch(t),e),lo=(e,t)=>(e.addEventListener(`abort`,t,{once:!0}),()=>e.removeEventListener(`abort`,t)),uo=e=>{if(e.aborted)throw new ao(e.reason)};function fo(e,t){let n=so;return new Promise((r,i)=>{let a=()=>i(new ao(e.reason));if(e.aborted){a();return}n=lo(e,a),t.finally(()=>n()).then(r,i)}).finally(()=>{n=so})}var po=async(e,t)=>{try{return await Promise.resolve(),{status:`ok`,value:await e()}}catch(e){return{status:e instanceof ao?`cancelled`:`rejected`,error:e}}finally{t?.()}},mo=e=>t=>co(fo(e,t).then(t=>(uo(e),t))),ho=e=>{let t=mo(e);return e=>t(new Promise(t=>setTimeout(t,e)))},{assign:go}=Object,_o={},vo=`listenerMiddleware`,yo=(e,t)=>{let n=t=>lo(e,()=>t.abort(e.reason));return(r,i)=>{oo(r,`taskExecutor`);let a=new AbortController;n(a);let o=po(async()=>{uo(e),uo(a.signal);let t=await r({pause:mo(a.signal),delay:ho(a.signal),signal:a.signal});return uo(a.signal),t},()=>a.abort(no));return i?.autoJoin&&t.push(o.catch(so)),{result:mo(e)(o),cancel(){a.abort(to)}}}},bo=(e,t)=>{let n=async(n,r)=>{uo(t);let i=()=>{},a=[new Promise((t,r)=>{let a=e({predicate:n,effect:(e,n)=>{n.unsubscribe(),t([e,n.getState(),n.getOriginalState()])}});i=()=>{a(),r()}})];r!=null&&a.push(new Promise(e=>setTimeout(e,r,null)));try{let e=await fo(t,Promise.race(a));return uo(t),e}finally{i()}};return((e,t)=>co(n(e,t)))},xo=e=>{let{type:t,actionCreator:n,matcher:r,predicate:i,effect:a}=e;if(t)i=Ca(t).match;else if(n)t=n.type,i=n.match;else if(r)i=r;else if(!i)throw Error(Mo(21));return oo(a,`options.listener`),{predicate:i,type:t,effect:a}},So=go(e=>{let{type:t,predicate:n,effect:r}=xo(e);return{id:za(),effect:r,type:t,predicate:n,pending:new Set,unsubscribe:()=>{throw Error(Mo(22))}}},{withTypes:()=>So}),Co=(e,t)=>{let{type:n,effect:r,predicate:i}=xo(t);return Array.from(e.values()).find(e=>(typeof n==`string`?e.type===n:e.predicate===i)&&e.effect===r)},wo=e=>{e.pending.forEach(e=>{e.abort(ro)})},To=(e,t)=>()=>{for(let e of t.keys())wo(e);e.clear()},Eo=(e,t,n)=>{try{e(t,n)}catch(e){setTimeout(()=>{throw e},0)}},Do=go(Ca(`${vo}/add`),{withTypes:()=>Do}),Oo=Ca(`${vo}/removeAll`),ko=go(Ca(`${vo}/remove`),{withTypes:()=>ko}),Ao=(...e)=>{console.error(`${vo}/error`,...e)},jo=(e={})=>{let t=new Map,n=new Map,r=e=>{let t=n.get(e)??0;n.set(e,t+1)},i=e=>{let t=n.get(e)??1;t===1?n.delete(e):n.set(e,t-1)},{extra:a,onError:o=Ao}=e;oo(o,`onError`);let s=e=>(e.unsubscribe=()=>t.delete(e.id),t.set(e.id,e),t=>{e.unsubscribe(),t?.cancelActive&&wo(e)}),c=(e=>{let n=Co(t,e)??So(e);return s(n)});go(c,{withTypes:()=>c});let l=e=>{let n=Co(t,e);return n&&(n.unsubscribe(),e.cancelActive&&wo(n)),!!n};go(l,{withTypes:()=>l});let u=async(e,n,s,l)=>{let u=new AbortController,d=bo(c,u.signal),f=[];try{e.pending.add(u),r(e),await Promise.resolve(e.effect(n,go({},s,{getOriginalState:l,condition:(e,t)=>d(e,t).then(Boolean),take:d,delay:ho(u.signal),pause:mo(u.signal),extra:a,signal:u.signal,fork:yo(u.signal,f),unsubscribe:e.unsubscribe,subscribe:()=>{t.set(e.id,e)},cancelActiveListeners:()=>{e.pending.forEach((e,t,n)=>{e!==u&&(e.abort(ro),n.delete(e))})},cancel:()=>{u.abort(ro),e.pending.delete(u)},throwIfCancelled:()=>{uo(u.signal)}})))}catch(e){e instanceof ao||Eo(o,e,{raisedBy:`effect`})}finally{await Promise.all(f),u.abort(io),i(e),e.pending.delete(u)}},d=To(t,n);return{middleware:e=>n=>r=>{if(!Xr(r))return n(r);if(Do.match(r))return c(r.payload);if(Oo.match(r)){d();return}if(ko.match(r))return l(r.payload);let i=e.getState(),a=()=>{if(i===_o)throw Error(Mo(23));return i},s;try{if(s=n(r),t.size>0){let n=e.getState(),s=Array.from(t.values());for(let t of s){let s=!1;try{s=t.predicate(r,n,i)}catch(e){s=!1,Eo(o,e,{raisedBy:`predicate`})}s&&u(t,r,e,a)}}}finally{i=_o}return s},startListening:c,stopListening:l,clearListeners:d}};function Mo(e){return`Minified Redux Toolkit error #${e}; visit https://redux-toolkit.js.org/Errors?code=${e} for the full message or use the non-minified dev environment for full errors. `}var No=Wa({name:`chartLayout`,initialState:{layoutType:`horizontal`,width:0,height:0,margin:{top:5,right:5,bottom:5,left:5},scale:1},reducers:{setLayout(e,t){e.layoutType=t.payload},setChartSize(e,t){e.width=t.payload.width,e.height=t.payload.height},setMargin(e,t){e.margin.top=t.payload.top??0,e.margin.right=t.payload.right??0,e.margin.bottom=t.payload.bottom??0,e.margin.left=t.payload.left??0},setScale(e,t){e.scale=t.payload}}}),Po=No.actions,Fo=Po.setMargin,Io=Po.setLayout,Lo=Po.setChartSize,Ro=Po.setScale,zo=No.reducer;function Bo(e,t,n){return Array.isArray(e)&&e&&t+n!==0?e.slice(t,n+1):e}function H(e){return Number.isFinite(e)}function Vo(e){return typeof e==`number`&&e>0&&Number.isFinite(e)}function Ho(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Uo(e){for(var t=1;t{if(t&&n){var r=n.width,i=n.height,a=t.align,o=t.verticalAlign,s=t.layout,c=t.position,l=t.offset,u=l===void 0?0:l;if(c!=null){if(Ee(c)){if(c===`top`&&F(e.top))return Uo(Uo({},e),{},{top:e.top+(i||0)+u});if(c===`bottom`&&F(e.bottom))return Uo(Uo({},e),{},{bottom:e.bottom+(i||0)+u});if(c===`left`&&F(e.left))return Uo(Uo({},e),{},{left:e.left+(r||0)+u});if(c===`right`&&F(e.right))return Uo(Uo({},e),{},{right:e.right+(r||0)+u})}return e}if((s===`vertical`||s===`horizontal`&&o===`middle`)&&a!==`center`&&F(e[a]))return Uo(Uo({},e),{},{[a]:e[a]+(r||0)});if((s===`horizontal`||s===`vertical`&&a===`center`)&&o!==`middle`&&F(e[o]))return Uo(Uo({},e),{},{[o]:e[o]+(i||0)})}return e},Jo=(e,t)=>e===`horizontal`&&t===`xAxis`||e===`vertical`&&t===`yAxis`||e===`centric`&&t===`angleAxis`||e===`radial`&&t===`radiusAxis`,Yo={sign:e=>{var t=e.length;if(!(t<=0)){var n=e[0]?.length;if(!(n==null||n<=0))for(var r=0;r=0?(s[0]=i,i+=u,s[1]=i):(s[0]=a,a+=u,s[1]=a)}}}},expand:wt,none:yt,silhouette:Tt,wiggle:Et,positive:e=>{var t=e.length;if(!(t<=0)){var n=e[0]?.length;if(!(n==null||n<=0))for(var r=0;r=0?(o[0]=i,i+=s,o[1]=i):(o[0]=0,o[1]=0)}}}}},Xo=(e,t,n)=>{var r=Yo[n]??yt,i=Ct().keys(t).value((e,t)=>Number(U(e,t,0))).order(bt).offset(r)(e);return i.forEach((n,r)=>{n.forEach((n,i)=>{var a=U(e[i],t[r],0);Array.isArray(a)&&a.length===2&&F(a[0])&&F(a[1])&&(n[0]=a[0],n[1]=a[1])})}),i};function Zo(e){return e==null?void 0:String(e)}function Qo(e){var t=e.axis,n=e.ticks,r=e.bandSize,i=e.entry,a=e.index,o=e.dataKey;if(t.type===`category`){if(!t.allowDuplicatedCategory&&t.dataKey&&!me(i[t.dataKey])){var s=pe(n,`value`,i[t.dataKey]);if(s)return s.coordinate+r/2}return n!=null&&n[a]?n[a].coordinate+r/2:null}var c=U(i,me(o)?t.dataKey:o),l=t.scale.map(c);return F(l)?l:null}var $o=e=>{var t=e.flat(2).filter(F);return[Math.min(...t),Math.max(...t)]},es=e=>[e[0]===1/0?0:e[0],e[1]===-1/0?0:e[1]],ts=(e,t,n)=>{if(!(e==null||Object.keys(e).length===0))return es(Object.keys(e).reduce((r,i)=>{var a=e[i];if(!a)return r;var o=a.stackedData.reduce((e,r)=>{var i=$o(Bo(r,t,n));return!H(i[0])||!H(i[1])?e:[Math.min(e[0],i[0]),Math.max(e[1],i[1])]},[1/0,-1/0]);return[Math.min(o[0],r[0]),Math.max(o[1],r[1])]},[1/0,-1/0]))},ns=/^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,rs=/^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/,is=(e,t,n)=>{if(e&&e.scale&&e.scale.bandwidth){var r=e.scale.bandwidth();if(!n||r>0)return r}if(e&&t&&t.length>=2){for(var i=Dr(t,e=>e.coordinate),a=[],o=0,s=1,c=i.length;su&&(d=Math.min(f,d));return d===1/0?0:d}return n?void 0:0};function as(e){var t=e.tooltipEntrySettings,n=e.dataKey,r=e.payload,i=e.value,a=e.name;return Uo(Uo({},t),{},{dataKey:n,payload:r,value:i,name:a})}function os(e,t){if(e!=null)return String(e);if(typeof t==`string`)return t}var ss=(e,t)=>{if(t===`horizontal`)return e.relativeX;if(t===`vertical`)return e.relativeY},cs=(e,t)=>t===`centric`?e.angle:e.radius,ls=e=>e.layout.width,us=e=>e.layout.height,ds=e=>e.layout.scale,fs=e=>e.layout.margin,ps=z(e=>e.cartesianAxis.xAxis,e=>Object.values(e)),ms=z(e=>e.cartesianAxis.yAxis,e=>Object.values(e)),hs=`data-recharts-item-index`;function gs(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function _s(e){for(var t=1;te.brush.height;function Ss(e){return ms(e).reduce((e,t)=>t.orientation===`left`&&!t.mirror&&!t.hide?e+(typeof t.width==`number`?t.width:60):e,0)}function Cs(e){return ms(e).reduce((e,t)=>t.orientation===`right`&&!t.mirror&&!t.hide?e+(typeof t.width==`number`?t.width:60):e,0)}function ws(e){return ps(e).reduce((e,t)=>t.orientation===`top`&&!t.mirror&&!t.hide?e+(typeof t.height==`number`?t.height:30):e,0)}function Ts(e){return ps(e).reduce((e,t)=>t.orientation===`bottom`&&!t.mirror&&!t.hide?e+(typeof t.height==`number`?t.height:30):e,0)}var Es=z([ls,us,fs,xs,Ss,Cs,ws,Ts,Or,kr],(e,t,n,r,i,a,o,s,c,l)=>{var u={left:(n.left||0)+i,right:(n.right||0)+a},d=_s(_s({},{top:(n.top||0)+o,bottom:(n.bottom||0)+s}),u),f=d.bottom;d.bottom+=r,d=qo(d,c,l);var p=e-d.left-d.right,m=t-d.top-d.bottom;return _s(_s({brushBottom:f},d),{},{width:Math.max(p,0),height:Math.max(m,0)})}),Ds=z(Es,e=>({x:e.left,y:e.top,width:e.width,height:e.height})),Os=z(ls,us,(e,t)=>({x:0,y:0,width:e,height:t})),ks=(0,a.createContext)(null),As=()=>(0,a.useContext)(ks)!=null,js=e=>e.brush,Ms=z([js,Es,fs],(e,t,n)=>({height:e.height,x:F(e.x)?e.x:t.left,y:F(e.y)?e.y:t.top+t.height+t.brushBottom-(n?.bottom||0),width:F(e.width)?e.width:t.width}));function Ns(e,t,{signal:n,edges:r}={}){let i,a=null,o=r!=null&&r.includes(`leading`),s=r==null||r.includes(`trailing`),c=()=>{a!==null&&(e.apply(i,a),i=void 0,a=null)},l=()=>{s&&c(),p()},u=null,d=()=>{u!=null&&clearTimeout(u),u=setTimeout(()=>{u=null,l()},t)},f=()=>{u!==null&&(clearTimeout(u),u=null)},p=()=>{f(),i=void 0,a=null},m=()=>{c()},h=function(...e){if(n?.aborted)return;i=this,a=e;let t=u==null;d(),o&&t&&c()};return h.schedule=d,h.cancel=p,h.flush=m,n?.addEventListener(`abort`,p,{once:!0}),h}function Ps(e,t=0,n={}){typeof n!=`object`&&(n={});let{leading:r=!1,trailing:i=!0,maxWait:a}=n,o=[,,];r&&(o[0]=`leading`),i&&(o[1]=`trailing`);let s,c=null,l=Ns(function(...t){s=e.apply(this,t),c=null},t,{edges:o}),u=function(...t){return a!=null&&(c===null&&(c=Date.now()),Date.now()-c>=a)?(s=e.apply(this,t),c=Date.now(),l.cancel(),l.schedule(),s):(l.apply(this,t),s)};return u.cancel=l.cancel,u.flush=()=>(l.flush(),s),u}function Fs(e,t=0,n={}){let{leading:r=!0,trailing:i=!0}=n;return Ps(e,t,{leading:r,maxWait:t,trailing:i})}var Is=function(e,t){var n=[...arguments].slice(2);if(typeof console<`u`&&console.warn&&(t===void 0&&console.warn(`LogUtils requires an error message argument`),!e))if(t===void 0)console.warn(`Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.`);else{var r=0;console.warn(t.replace(/%s/g,()=>n[r++]))}},Ls={width:`100%`,height:`100%`,debounce:0,minWidth:0,initialDimension:{width:-1,height:-1}},Rs=(e,t,n)=>{var r=n.width,i=r===void 0?Ls.width:r,a=n.height,o=a===void 0?Ls.height:a,s=n.aspect,c=n.maxHeight,l=oe(i)?e:Number(i),u=oe(o)?t:Number(o);return s&&s>0&&(l?u=l/s:u&&(l=u*s),c&&u!=null&&u>c&&(u=c)),{calculatedWidth:l,calculatedHeight:u}},zs={width:0,height:0,overflow:`visible`},Bs={width:0,overflowX:`visible`},Vs={height:0,overflowY:`visible`},Hs={},Us=e=>{var t=e.width,n=e.height,r=oe(t),i=oe(n);return r&&i?zs:r?Bs:i?Vs:Hs};function Ws(e){var t=e.width,n=e.height,r=e.aspect,i=t,a=n;return i===void 0&&a===void 0?(i=Ls.width,a=Ls.height):i===void 0?i=r&&r>0?void 0:Ls.width:a===void 0&&(a=r&&r>0?void 0:Ls.height),{width:i,height:a}}var Gs=[`aspect`,`initialDimension`,`width`,`height`,`minWidth`,`minHeight`,`maxHeight`,`children`,`debounce`,`id`,`className`,`onResize`,`style`];function Ks(){return Ks=Object.assign?Object.assign.bind():function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=Array(t);n({width:n,height:r}),[n,r]);return sc(i)?a.createElement(oc.Provider,{value:i},t):null}var lc=()=>(0,a.useContext)(oc),uc=(0,a.forwardRef)((e,t)=>{var n=e.aspect,r=e.initialDimension,i=r===void 0?Ls.initialDimension:r,o=e.width,s=e.height,l=e.minWidth,u=l===void 0?Ls.minWidth:l,d=e.minHeight,f=e.maxHeight,p=e.children,m=e.debounce,h=m===void 0?Ls.debounce:m,g=e.id,_=e.className,v=e.onResize,y=e.style,b=y===void 0?{}:y,x=ic(e,Gs),S=(0,a.useRef)(null),C=(0,a.useRef)();C.current=v,(0,a.useImperativeHandle)(t,()=>S.current);var w=Qs((0,a.useState)({containerWidth:i.width,containerHeight:i.height}),2),T=w[0],E=w[1],D=(0,a.useCallback)((e,t)=>{E(n=>{var r=Math.round(e),i=Math.round(t);return n.containerWidth===r&&n.containerHeight===i?n:{containerWidth:r,containerHeight:i}})},[]);(0,a.useEffect)(()=>{if(S.current==null||typeof ResizeObserver>`u`)return _e;var e=e=>{var t,n=e[0];if(n!=null){var r=n.contentRect,i=r.width,a=r.height;D(i,a),(t=C.current)==null||t.call(C,i,a)}};h>0&&(e=Fs(e,h,{trailing:!0,leading:!1}));var t=new ResizeObserver(e),n=S.current.getBoundingClientRect(),r=n.width,i=n.height;return D(r,i),t.observe(S.current),()=>{t.disconnect()}},[D,h]);var O=T.containerWidth,k=T.containerHeight;Is(!n||n>0,`The aspect(%s) must be greater than zero.`,n);var A=Rs(O,k,{width:o,height:s,aspect:n,maxHeight:f}),j=A.calculatedWidth,M=A.calculatedHeight;return Is(O<0||k<0||j!=null&&j>0||M!=null&&M>0,`The width(%s) and height(%s) of chart should be greater than 0, please check the style of container, or the props width(%s) and height(%s), diff --git a/frontend/dashboard/index.html b/frontend/dashboard/index.html index f70c0c983..0047647c7 100644 --- a/frontend/dashboard/index.html +++ b/frontend/dashboard/index.html @@ -5,14 +5,14 @@ NyxStrike - + - - - - - - + + + + + + diff --git a/frontend/ui/src/App.tsx b/frontend/ui/src/App.tsx index 9a230423d..e714fd432 100644 --- a/frontend/ui/src/App.tsx +++ b/frontend/ui/src/App.tsx @@ -35,6 +35,7 @@ export default function App() { activeWorkbenchOperationId, activeWorkbenchRecipe, activeWorkbenchInput, + activePayloadWorkbenchOperationId, sidebarMobileOpen, setSidebarMobileOpen, setPage, @@ -42,6 +43,7 @@ export default function App() { setActiveToolName, setActiveWorkbenchOperationId, setActiveWorkbenchRecipe, + setActivePayloadWorkbenchOperationId, openWorkbench, } = useAppRouting(isPageEnabled) @@ -173,6 +175,8 @@ export default function App() { onWorkbenchRecipeChanged={setActiveWorkbenchRecipe} urlWorkbenchInput={activeWorkbenchInput} onOpenInWorkbench={openWorkbench} + urlPayloadWorkbenchOperationId={activePayloadWorkbenchOperationId} + onPayloadWorkbenchOperationSelected={setActivePayloadWorkbenchOperationId} openSessionDetail={openSessionDetail} activeSessionId={activeSessionId} setPage={setPage} diff --git a/frontend/ui/src/api/endpoints.ts b/frontend/ui/src/api/endpoints.ts index 851f0671f..82ec8c758 100644 --- a/frontend/ui/src/api/endpoints.ts +++ b/frontend/ui/src/api/endpoints.ts @@ -86,6 +86,15 @@ import type { WorkbenchRunRecipeOptions, WorkbenchRunRecipeResponse, WorkbenchRunResponse, + PayloadWorkbenchOperationsResponse, + PayloadWorkbenchRecipeDeleteResponse, + PayloadWorkbenchRecipeMutationResponse, + PayloadWorkbenchRecipesResponse, + PayloadWorkbenchRecipeStepInput, + PayloadWorkbenchRunRecipeOptions, + PayloadWorkbenchRunRecipeResponse, + PayloadWorkbenchRunResponse, + TestPayloadAgainstTargetResponse, } from './types'; type ProcessActionResponse = { success: boolean; message?: string; error?: string }; @@ -355,4 +364,32 @@ export const api = { patch(`/api/workbench/recipes/${recipeId}`, payload), deleteWorkbenchRecipe: (recipeId: string) => del(`/api/workbench/recipes/${recipeId}`), + + // ── Payload Workbench ──────────────────────────────────────────────────── + payloadWorkbenchOperations: () => get('/api/payload-workbench/operations'), + payloadWorkbenchRun: (operationId: string, params: Record) => + post(`/api/payload-workbench/run/${operationId}`, params), + payloadWorkbenchRunRecipe: ( + input: string, + steps: PayloadWorkbenchRecipeStepInput[], + options?: PayloadWorkbenchRunRecipeOptions + ) => + post('/api/payload-workbench/run-recipe', { + input, + steps, + continue_on_error: options?.continueOnError, + stop_after_step_index: options?.stopAfterStepIndex, + step_input_overrides: options?.stepInputOverrides, + }), + payloadWorkbenchRecipes: () => get('/api/payload-workbench/recipes'), + createPayloadWorkbenchRecipe: (name: string, steps: PayloadWorkbenchRecipeStepInput[]) => + post('/api/payload-workbench/recipes', { name, steps }), + updatePayloadWorkbenchRecipe: ( + recipeId: string, + payload: { name?: string; steps?: PayloadWorkbenchRecipeStepInput[] } + ) => patch(`/api/payload-workbench/recipes/${recipeId}`, payload), + deletePayloadWorkbenchRecipe: (recipeId: string) => + del(`/api/payload-workbench/recipes/${recipeId}`), + testPayloadAgainstTarget: (payload: string, targetUrl: string, method: 'GET' | 'POST') => + post('/api/ai/test_payload', { payload, target_url: targetUrl, method }), }; diff --git a/frontend/ui/src/api/types/index.ts b/frontend/ui/src/api/types/index.ts index 6156cd0fb..8acf2e972 100644 --- a/frontend/ui/src/api/types/index.ts +++ b/frontend/ui/src/api/types/index.ts @@ -153,3 +153,19 @@ export type { WorkbenchRunResponse, WorkbenchSavedRecipe, } from './workbench'; + +export type { + PayloadWorkbenchOperation, + PayloadWorkbenchOperationsResponse, + PayloadWorkbenchParamSpec, + PayloadWorkbenchRecipeDeleteResponse, + PayloadWorkbenchRecipeMutationResponse, + PayloadWorkbenchRecipesResponse, + PayloadWorkbenchRecipeStepInput, + PayloadWorkbenchRecipeStepResult, + PayloadWorkbenchRunRecipeOptions, + PayloadWorkbenchRunRecipeResponse, + PayloadWorkbenchRunResponse, + PayloadWorkbenchSavedRecipe, + TestPayloadAgainstTargetResponse, +} from './payload-workbench'; diff --git a/frontend/ui/src/api/types/payload-workbench.ts b/frontend/ui/src/api/types/payload-workbench.ts new file mode 100644 index 000000000..3ab1c0f5c --- /dev/null +++ b/frontend/ui/src/api/types/payload-workbench.ts @@ -0,0 +1,100 @@ +export interface PayloadWorkbenchParamSpec { + name: string; + label: string; + type: 'text' | 'textarea' | 'number' | 'select'; + required: boolean; + default: string | number; + help_text: string; + choices?: string[]; + hidden?: boolean; +} + +export interface PayloadWorkbenchOperation { + id: string; + category: string; + name: string; + description: string; + params: PayloadWorkbenchParamSpec[]; +} + +export interface PayloadWorkbenchOperationsResponse { + success: boolean; + categories: string[]; + operations: PayloadWorkbenchOperation[]; +} + +export interface PayloadWorkbenchRunResponse { + success: boolean; + output?: string; + output_mime?: string; + note?: string; + error?: string; +} + +export interface PayloadWorkbenchRecipeStepInput { + operation_id: string; + params: Record; +} + +export interface PayloadWorkbenchRecipeStepResult { + operation_id: string; + name?: string; + input?: string; + output?: string; + output_mime?: string; + error?: string; +} + +export interface PayloadWorkbenchRunRecipeOptions { + continueOnError?: boolean; + stopAfterStepIndex?: number; + stepInputOverrides?: Record; +} + +export interface PayloadWorkbenchRunRecipeResponse { + success: boolean; + output?: string; + output_mime?: string; + has_errors?: boolean; + steps?: PayloadWorkbenchRecipeStepResult[]; + error?: string; +} + +export interface PayloadWorkbenchSavedRecipe { + recipe_id: string; + name: string; + steps: PayloadWorkbenchRecipeStepInput[]; + created_at: string; + updated_at: string; +} + +export interface PayloadWorkbenchRecipesResponse { + success: boolean; + recipes: PayloadWorkbenchSavedRecipe[]; + error?: string; +} + +export interface PayloadWorkbenchRecipeMutationResponse { + success: boolean; + recipe?: PayloadWorkbenchSavedRecipe; + error?: string; +} + +export interface PayloadWorkbenchRecipeDeleteResponse { + success: boolean; + error?: string; +} + +export interface TestPayloadAgainstTargetResponse { + success: boolean; + ai_analysis?: { + payload_tested: string; + target_url: string; + method: string; + response_size: number; + success: boolean; + potential_vulnerability: boolean; + recommendations: string[]; + }; + error?: string; +} diff --git a/frontend/ui/src/app/MainContent.tsx b/frontend/ui/src/app/MainContent.tsx index fdfff28d7..121571a4f 100644 --- a/frontend/ui/src/app/MainContent.tsx +++ b/frontend/ui/src/app/MainContent.tsx @@ -29,6 +29,7 @@ const SessionsPage = lazy(() => import('../pages/sessions/SessionsPage')) const SessionDetailPage = lazy(() => import('../pages/sessions/SessionDetailPage')) const LootPage = lazy(() => import('../pages/loot/LootPage')) const WorkbenchPage = lazy(() => import('../pages/workbench/WorkbenchPage')) +const PayloadWorkbenchPage = lazy(() => import('../pages/payload-workbench/PayloadWorkbenchPage')) /** Minimal spinner shown while a lazy chunk is loading */ function PageLoader() { @@ -97,6 +98,8 @@ interface MainContentProps { onWorkbenchRecipeChanged?: (encodedRecipe: string | null) => void urlWorkbenchInput?: string | null onOpenInWorkbench?: (input: string, operationId?: string | null) => void + urlPayloadWorkbenchOperationId?: string | null + onPayloadWorkbenchOperationSelected?: (operationId: string | null) => void openSessionDetail: (sessionId: string) => void activeSessionId: string | null setPage: (page: Page) => void @@ -140,6 +143,8 @@ export function MainContent({ onWorkbenchRecipeChanged, urlWorkbenchInput, onOpenInWorkbench, + urlPayloadWorkbenchOperationId, + onPayloadWorkbenchOperationSelected, openSessionDetail, activeSessionId, setPage, @@ -167,7 +172,7 @@ export function MainContent({ }: MainContentProps) { // Flush pages render their own footer inside their main content column // (BrowserPage / RunPage) so it lines up with a single column, not the full row. - const isFlush = page === 'run' || page === 'workbench' || page === 'tools' || page === 'sessions' || page === 'plugins' || page === 'loot' || page === 'reports' || page === 'tasks' || page === 'help' || page === 'settings' || page === 'verify' || page === 'logs' + const isFlush = page === 'run' || page === 'workbench' || page === 'payload-workbench' || page === 'tools' || page === 'sessions' || page === 'plugins' || page === 'loot' || page === 'reports' || page === 'tasks' || page === 'help' || page === 'settings' || page === 'verify' || page === 'logs' return (
@@ -233,6 +238,12 @@ export function MainContent({ urlInput={urlWorkbenchInput} /> )} + {page === 'payload-workbench' && ( + + )} {page === 'logs' && ( ([ 'dashboard', @@ -29,6 +30,7 @@ const VALID_PAGES = new Set([ 'loot', 'verify', 'workbench', + 'payload-workbench', ]); export function buildWorkbenchHash( @@ -44,6 +46,10 @@ export function buildWorkbenchHash( return query ? `${path}?${query}` : path; } +export function buildPayloadWorkbenchHash(operationId: string | null): string { + return operationId ? `/payload-workbench/${encodeURIComponent(operationId)}` : '/payload-workbench'; +} + export function routeFromHash(): { page: Page; sessionId: string | null; @@ -51,6 +57,7 @@ export function routeFromHash(): { workbenchOperationId: string | null; workbenchRecipe: string | null; workbenchInput: string | null; + payloadWorkbenchOperationId: string | null; } { const hash = window.location.hash.replace(/^#\/?/, ''); if (hash.startsWith('sessions/')) { @@ -62,6 +69,7 @@ export function routeFromHash(): { workbenchOperationId: null, workbenchRecipe: null, workbenchInput: null, + payloadWorkbenchOperationId: null, }; } if (hash.startsWith('run/')) { @@ -73,6 +81,7 @@ export function routeFromHash(): { workbenchOperationId: null, workbenchRecipe: null, workbenchInput: null, + payloadWorkbenchOperationId: null, }; } if (hash === 'workbench' || hash.startsWith('workbench/') || hash.startsWith('workbench?')) { @@ -86,6 +95,20 @@ export function routeFromHash(): { workbenchOperationId: operationId || null, workbenchRecipe: query.get('recipe'), workbenchInput: query.get('input'), + payloadWorkbenchOperationId: null, + }; + } + if (hash === 'payload-workbench' || hash.startsWith('payload-workbench/')) { + const pathPart = hash.slice('payload-workbench'.length); + const operationId = pathPart.startsWith('/') ? decodeURIComponent(pathPart.slice(1)) : ''; + return { + page: 'payload-workbench', + sessionId: null, + toolName: null, + workbenchOperationId: null, + workbenchRecipe: null, + workbenchInput: null, + payloadWorkbenchOperationId: operationId || null, }; } @@ -96,5 +119,6 @@ export function routeFromHash(): { workbenchOperationId: null, workbenchRecipe: null, workbenchInput: null, + payloadWorkbenchOperationId: null, }; } diff --git a/frontend/ui/src/app/useAppRouting.ts b/frontend/ui/src/app/useAppRouting.ts index 05dc6b606..09afa49c2 100644 --- a/frontend/ui/src/app/useAppRouting.ts +++ b/frontend/ui/src/app/useAppRouting.ts @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react' -import { buildWorkbenchHash, routeFromHash, type Page } from './routing' +import { buildPayloadWorkbenchHash, buildWorkbenchHash, routeFromHash, type Page } from './routing' export function useAppRouting(isPageEnabled: (page: Page) => boolean) { const initialRoute = routeFromHash() @@ -11,6 +11,9 @@ export function useAppRouting(isPageEnabled: (page: Page) => boolean) { ) const [activeWorkbenchRecipe, setActiveWorkbenchRecipeState] = useState(initialRoute.workbenchRecipe) const [activeWorkbenchInput, setActiveWorkbenchInputState] = useState(initialRoute.workbenchInput) + const [activePayloadWorkbenchOperationId, setActivePayloadWorkbenchOperationIdState] = useState( + initialRoute.payloadWorkbenchOperationId + ) const [sidebarMobileOpen, setSidebarMobileOpen] = useState(false) function setPage(p: Page) { @@ -22,6 +25,7 @@ export function useAppRouting(isPageEnabled: (page: Page) => boolean) { setActiveWorkbenchOperationIdState(null) setActiveWorkbenchRecipeState(null) setActiveWorkbenchInputState(null) + setActivePayloadWorkbenchOperationIdState(null) setSidebarMobileOpen(false) } @@ -33,6 +37,7 @@ export function useAppRouting(isPageEnabled: (page: Page) => boolean) { setActiveWorkbenchOperationIdState(null) setActiveWorkbenchRecipeState(null) setActiveWorkbenchInputState(null) + setActivePayloadWorkbenchOperationIdState(null) setSidebarMobileOpen(false) } @@ -44,6 +49,7 @@ export function useAppRouting(isPageEnabled: (page: Page) => boolean) { setActiveWorkbenchOperationIdState(operationId) setActiveWorkbenchRecipeState(null) setActiveWorkbenchInputState(input) + setActivePayloadWorkbenchOperationIdState(null) setSidebarMobileOpen(false) } @@ -64,6 +70,11 @@ export function useAppRouting(isPageEnabled: (page: Page) => boolean) { setActiveWorkbenchRecipeState(recipeJson) } + function setActivePayloadWorkbenchOperationId(operationId: string | null) { + window.location.hash = buildPayloadWorkbenchHash(operationId) + setActivePayloadWorkbenchOperationIdState(operationId) + } + // Keep state in sync if the user presses Back/Forward useEffect(() => { function onHashChange() { @@ -74,6 +85,7 @@ export function useAppRouting(isPageEnabled: (page: Page) => boolean) { setActiveWorkbenchOperationIdState(route.workbenchOperationId) setActiveWorkbenchRecipeState(route.workbenchRecipe) setActiveWorkbenchInputState(route.workbenchInput) + setActivePayloadWorkbenchOperationIdState(route.payloadWorkbenchOperationId) setSidebarMobileOpen(false) } window.addEventListener('hashchange', onHashChange) @@ -94,6 +106,7 @@ export function useAppRouting(isPageEnabled: (page: Page) => boolean) { activeWorkbenchOperationId, activeWorkbenchRecipe, activeWorkbenchInput, + activePayloadWorkbenchOperationId, sidebarMobileOpen, setSidebarMobileOpen, setPage, @@ -101,6 +114,7 @@ export function useAppRouting(isPageEnabled: (page: Page) => boolean) { setActiveToolName, setActiveWorkbenchOperationId, setActiveWorkbenchRecipe, + setActivePayloadWorkbenchOperationId, openWorkbench, } } diff --git a/frontend/ui/src/components/modals/SendToLootModal.tsx b/frontend/ui/src/components/modals/SendToLootModal.tsx index 1eb63a142..106bb02de 100644 --- a/frontend/ui/src/components/modals/SendToLootModal.tsx +++ b/frontend/ui/src/components/modals/SendToLootModal.tsx @@ -15,9 +15,10 @@ interface SendToLootModalProps { onClose: () => void defaultTitle: string content: string + sourceTool?: string } -export function SendToLootModal({ isOpen, onClose, defaultTitle, content }: SendToLootModalProps) { +export function SendToLootModal({ isOpen, onClose, defaultTitle, content, sourceTool = 'workbench' }: SendToLootModalProps) { const { pushToast } = useToast() const [title, setTitle] = useState(defaultTitle) const [lootType, setLootType] = useState('other') @@ -37,7 +38,7 @@ export function SendToLootModal({ isOpen, onClose, defaultTitle, content }: Send loot_type: lootType, title: title.trim(), content: body, - source_tool: 'workbench', + source_tool: sourceTool, tags: tagsInput.split(',').map(t => t.trim()).filter(Boolean), }) setSaving(false) diff --git a/frontend/ui/src/components/ui/ActionButton.css b/frontend/ui/src/components/ui/ActionButton.css index 74afa175d..ab87aae6b 100644 --- a/frontend/ui/src/components/ui/ActionButton.css +++ b/frontend/ui/src/components/ui/ActionButton.css @@ -25,6 +25,11 @@ box-shadow: none; } +.action-button:focus-visible { + outline: 2px solid var(--accent, var(--green)); + outline-offset: 2px; +} + .action-button--default { border-color: color-mix(in srgb, var(--accent) 28%, var(--border)); background: diff --git a/frontend/ui/src/components/ui/SearchInput.tsx b/frontend/ui/src/components/ui/SearchInput.tsx index d0b98801e..49fec0a28 100644 --- a/frontend/ui/src/components/ui/SearchInput.tsx +++ b/frontend/ui/src/components/ui/SearchInput.tsx @@ -1,4 +1,5 @@ import { Search, X } from 'lucide-react' +import type { RefObject } from 'react' import './SearchInput.css' interface SearchInputProps { @@ -6,13 +7,15 @@ interface SearchInputProps { onChange: (value: string) => void placeholder?: string className?: string + inputRef?: RefObject } -export function SearchInput({ value, onChange, placeholder = 'Search…', className = '' }: SearchInputProps) { +export function SearchInput({ value, onChange, placeholder = 'Search…', className = '', inputRef }: SearchInputProps) { return (
, inputValue: string) => void + initialInput?: string +} + +export function OperationPanel({ operation, onAddToRecipe, initialInput }: OperationPanelProps) { + const [values, setValues] = useState>(() => + Object.fromEntries( + operation.params.map(p => [p.name, p.name === 'input' && initialInput ? initialInput : String(p.default ?? '')]) + ) + ) + const [sendToLootOpen, setSendToLootOpen] = useState(false) + const [loading, setLoading] = useState(false) + const [error, setError] = useState(null) + const [output, setOutput] = useState(null) + const [outputMime, setOutputMime] = useState(undefined) + const [note, setNote] = useState(null) + const [copied, setCopied] = useState(false) + const [added, setAdded] = useState(false) + const { pushToast } = useToast() + + function setValue(name: string, value: string) { + setValues(prev => ({ ...prev, [name]: value })) + } + + async function run() { + setLoading(true) + setError(null) + setOutput(null) + setOutputMime(undefined) + setNote(null) + try { + const res = await api.payloadWorkbenchRun(operation.id, values) + if (!res.success) { + setError(res.error ?? 'Operation failed.') + return + } + setOutput(res.output ?? '') + setOutputMime(res.output_mime) + setNote(res.note ?? null) + } catch (e) { + setError(String(e)) + } finally { + setLoading(false) + } + } + + function copyOutput() { + if (!output) return + if (!navigator.clipboard) { + pushToast('error', 'Clipboard is unavailable in this context.') + return + } + navigator.clipboard.writeText(output).then(() => { + setCopied(true) + setTimeout(() => setCopied(false), 2000) + }).catch(() => pushToast('error', 'Failed to copy output.')) + } + + function addToRecipe() { + const { input: rawInput, ...rest } = values + onAddToRecipe(operation, rest, rawInput ?? '') + setAdded(true) + setTimeout(() => setAdded(false), 1500) + } + + const canRun = !loading && operation.params.every(p => !p.required || values[p.name]?.trim()) + + function handleKeyDown(e: React.KeyboardEvent) { + if ((e.ctrlKey || e.metaKey) && e.key === 'Enter' && canRun) { + e.preventDefault() + void run() + } + } + + return ( +
+
+

{operation.name}

+
+
+

{operation.description}

+ +
+ {operation.params.filter(p => !p.hidden).map(p => ( +