diff --git a/README.md b/README.md index 78cef14..20cdefe 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ Toggle **This review** (impact subgraph) vs **Indexed architecture** (the repo m ### Pull requests -GitHub and Bitbucket via API tokens from Settings. Pick a PR and jump to a branch-range review. The screenshot uses a fixture PR so the tab is not empty. +GitHub and Bitbucket via **Sign in** (OAuth) or a token in Settings. After connecting, **My repos** lists every repository the account can access. Pick one and jump to a branch-range review. Review still runs against a **local clone** — if that clone is already a Loadpath workspace, selecting the remote repo fills the local path from `git remote`. The screenshot uses a fixture PR so the tab is not empty. ![Pull requests list](docs/screenshots/pull-requests.png) @@ -75,7 +75,11 @@ Browse the filesystem, pick a project root. Loadpath remembers recent workspaces ### Settings -Appearance (all 24 themes), GitHub / Bitbucket tokens, and AI providers (Anthropic, OpenAI, Grok/xAI, DeepSeek, Cursor-compatible, Ollama). Residual analysis only — Loadpath does not comment every hunk. +Appearance (all 24 themes), GitHub / Bitbucket **OAuth sign-in** (or a classic PAT / app password), and AI providers (Anthropic, OpenAI, Grok/xAI, DeepSeek, Cursor-compatible, Ollama). Residual analysis only — Loadpath does not comment every hunk. + +GitHub uses device flow (`repo read:user read:org`). Create an OAuth App, enable Device Flow, then set `LOADPATH_GITHUB_CLIENT_ID` or paste the client ID in Settings. + +Bitbucket uses authorization code. Create an OAuth consumer whose callback is `http://127.0.0.1:7345/api/oauth/bitbucket/callback`, then set `LOADPATH_BITBUCKET_CLIENT_ID` / `LOADPATH_BITBUCKET_CLIENT_SECRET` or paste the key and secret in Settings. Access tokens are refreshed automatically. SCM sign-in and repo listing are local-only (loopback) so a tunneled MCP server does not expose private repos. ![Settings with theme grid](docs/screenshots/settings.png) @@ -221,7 +225,7 @@ MCP URL: `https://your-tunnel.example/mcp` (or `http://127.0.0.1:7345/mcp` on th **Cursor / Claude / ChatGPT / Gemini (HTTP + OAuth)** — add that MCP URL in the host’s connectors. The first connect opens a consent page on the Loadpath machine. -Tools: `list_workspaces`, `init_repo`, `index_repo`, `architecture`, `review`, `detect_repo`, `list_pull_requests`, `post_review_comment`. `review` returns the load-path brief (confidence, sinks, reviewers) — not hunk comments. +Tools: `list_workspaces`, `init_repo`, `index_repo`, `architecture`, `review`, `detect_repo`, `list_pull_requests`, `list_remote_repositories`, `post_review_comment`. `review` returns the load-path brief (confidence, sinks, reviewers) — not hunk comments. Put `loadpath.yml` at the repo root (see [`loadpath.yml.example`](loadpath.yml.example) and [`fixtures/demo_monorepo/loadpath.yml`](fixtures/demo_monorepo/loadpath.yml)). The tool is opinionated about *your* architecture, not a generic module graph. diff --git a/SECURITY.md b/SECURITY.md index 96ac4e2..7709706 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,4 +4,4 @@ Please report vulnerabilities privately to the repository owner (`Modsofthenatio Once this repository is public, enable [GitHub private vulnerability reporting](https://docs.github.com/code-security/security-advisories/working-with-repository-security-advisories/configuring-private-vulnerability-reporting-for-a-repository) so researchers can use Security Advisories. The `/security/advisories/new` form 404s until that setting is on. -Tokens and OAuth state live on the machine that runs Loadpath (`~/.loadpath/`); treat that host as trusted. +Tokens and OAuth state live on the machine that runs Loadpath (`~/.loadpath/`); treat that host as trusted. SCM sign-in, disconnect, and `/api/scm/repos` only accept the local Loadpath UI (loopback Origin/Host), so a tunneled MCP server does not list private repositories. diff --git a/desktop/urls.mjs b/desktop/urls.mjs index e39cf16..397733e 100644 --- a/desktop/urls.mjs +++ b/desktop/urls.mjs @@ -8,11 +8,13 @@ export function isAllowedExternalUrl(url) { if (parsed.protocol !== "https:") return false; if (parsed.username || parsed.password) return false; const host = parsed.hostname.toLowerCase(); - return ( + return ( host === "github.com" || host.endsWith(".github.com") || host === "bitbucket.org" || - host.endsWith(".bitbucket.org") + host.endsWith(".bitbucket.org") || + host === "id.atlassian.com" || + host.endsWith(".atlassian.com") ); } diff --git a/desktop/urls.test.mjs b/desktop/urls.test.mjs index 1a40470..cd1e871 100644 --- a/desktop/urls.test.mjs +++ b/desktop/urls.test.mjs @@ -7,6 +7,7 @@ describe("isAllowedExternalUrl", () => { it("allows GitHub and Bitbucket https PR links", () => { assert.equal(isAllowedExternalUrl("https://github.com/acme/demo/pull/12"), true); assert.equal(isAllowedExternalUrl("https://bitbucket.org/acme/demo/pull-requests/3"), true); + assert.equal(isAllowedExternalUrl("https://id.atlassian.com/login"), true); }); it("rejects credentials, other hosts, and non-https schemes", () => { diff --git a/src/loadpath/mcp/server.py b/src/loadpath/mcp/server.py index 6bf7591..abdd217 100644 --- a/src/loadpath/mcp/server.py +++ b/src/loadpath/mcp/server.py @@ -67,6 +67,10 @@ def _register_tools(mcp: MCPServer) -> None: name="list_pull_requests", description="List GitHub or Bitbucket pull requests using tokens stored in Loadpath settings.", )(tools.list_pull_requests) + mcp.tool( + name="list_remote_repositories", + description="List GitHub or Bitbucket repositories the signed-in account can access.", + )(tools.list_remote_repositories) mcp.tool( name="post_review_comment", description="Upsert the single Loadpath markdown brief on a pull request (updated in place).", diff --git a/src/loadpath/mcp/tools.py b/src/loadpath/mcp/tools.py index 45ef745..4357bca 100644 --- a/src/loadpath/mcp/tools.py +++ b/src/loadpath/mcp/tools.py @@ -1,18 +1,51 @@ from __future__ import annotations from pathlib import Path -from typing import Any +from typing import Any, Callable, TypeVar + +import httpx from loadpath.architecture.snapshot import architecture_report, summarize_index from loadpath.config import load_config from loadpath.detect import detect_layout, write_draft_config from loadpath.index import index_repo from loadpath.mcp.compact import compact_architecture, compact_review -from loadpath.providers.scm import provider_for +from loadpath.providers.scm import attach_local_paths, provider_for from loadpath.review.engine import run_review from loadpath.review.render import render_markdown from loadpath.settings import AppSettings, register_workspace +_T = TypeVar("_T") + + +def _with_scm(provider: str, fn: Callable[[Any], _T]) -> _T | dict[str, str]: + settings = AppSettings.load() + token = settings.github_token if provider == "github" else settings.bitbucket_token + username = settings.bitbucket_username + if not token: + return {"error": f"No {provider} token configured in Loadpath settings"} + try: + return fn(provider_for(provider, token, username=username)) + except httpx.HTTPStatusError as exc: + if ( + provider == "bitbucket" + and exc.response is not None + and exc.response.status_code == 401 + and settings.bitbucket_refresh_token + ): + from loadpath.providers.oauth import refresh_bitbucket_access_token + + try: + settings = refresh_bitbucket_access_token(settings) + except Exception as refresh_exc: # noqa: BLE001 + return {"error": str(refresh_exc)} + token = settings.bitbucket_token + username = settings.bitbucket_username + return fn(provider_for(provider, token, username=username)) + return {"error": str(exc)} + except Exception as exc: # noqa: BLE001 + return {"error": str(exc)} + def _repo(path: str) -> Path | dict[str, str]: root = Path(path).expanduser().resolve() @@ -124,17 +157,21 @@ def list_pull_requests( state: str = "open", ) -> dict[str, Any]: """List pull requests from GitHub or Bitbucket using tokens in ~/.loadpath/settings.json.""" + result = _with_scm(provider, lambda scm: scm.list_pull_requests(repo, state=state)) + if isinstance(result, dict) and result.get("error"): + return result + return {"pull_requests": [p.to_dict() for p in result]} + + +def list_remote_repositories(provider: str) -> dict[str, Any]: + """List GitHub or Bitbucket repositories the saved token can access.""" settings = AppSettings.load() - token = settings.github_token if provider == "github" else settings.bitbucket_token - username = settings.bitbucket_username - if not token: - return {"error": f"No {provider} token configured in Loadpath settings"} - try: - scm = provider_for(provider, token, username=username) - prs = scm.list_pull_requests(repo, state=state) - except Exception as exc: # noqa: BLE001 - return {"error": str(exc)} - return {"pull_requests": [p.to_dict() for p in prs]} + result = _with_scm(provider, lambda scm: (scm.list_repositories(), scm.current_user())) + if isinstance(result, dict) and result.get("error"): + return result + repos, profile = result + attach_local_paths(repos, [w.path for w in settings.workspaces]) + return {"provider": provider, "user": profile, "repos": [r.to_dict() for r in repos]} def post_review_comment( @@ -146,13 +183,8 @@ def post_review_comment( """Upsert the single Loadpath brief comment on a pull request.""" if not markdown.strip(): return {"error": "markdown is empty"} - settings = AppSettings.load() - token = settings.github_token if provider == "github" else settings.bitbucket_token - username = settings.bitbucket_username - if not token: - return {"error": f"No {provider} token configured in Loadpath settings"} - try: - scm = provider_for(provider, token, username=username) - return scm.upsert_pull_request_comment(repo, number, markdown) - except Exception as exc: # noqa: BLE001 - return {"error": str(exc)} + result = _with_scm( + provider, + lambda scm: scm.upsert_pull_request_comment(repo, number, markdown), + ) + return result diff --git a/src/loadpath/providers/__init__.py b/src/loadpath/providers/__init__.py index 9f62a5e..fbcb31e 100644 --- a/src/loadpath/providers/__init__.py +++ b/src/loadpath/providers/__init__.py @@ -1,3 +1,19 @@ -from loadpath.providers.scm import BitbucketProvider, GitHubProvider, PullRequest, provider_for +from loadpath.providers.scm import ( + BitbucketProvider, + GitHubProvider, + PullRequest, + RemoteRepo, + attach_local_paths, + parse_remote_url, + provider_for, +) -__all__ = ["BitbucketProvider", "GitHubProvider", "PullRequest", "provider_for"] +__all__ = [ + "BitbucketProvider", + "GitHubProvider", + "PullRequest", + "RemoteRepo", + "attach_local_paths", + "parse_remote_url", + "provider_for", +] diff --git a/src/loadpath/providers/oauth.py b/src/loadpath/providers/oauth.py new file mode 100644 index 0000000..9107a93 --- /dev/null +++ b/src/loadpath/providers/oauth.py @@ -0,0 +1,367 @@ +"""GitHub device flow and Bitbucket authorization-code login. Tokens stay on this machine.""" + +from __future__ import annotations + +import os +import secrets +import threading +import time +from html import escape +from typing import Any +from urllib.parse import urlencode, urlparse + +import httpx + +from loadpath.providers.scm import provider_for +from loadpath.settings import AppSettings + +GITHUB_DEVICE_CODE_URL = "https://github.com/login/device/code" +GITHUB_TOKEN_URL = "https://github.com/login/oauth/access_token" +GITHUB_SCOPES = "repo read:user read:org" +BITBUCKET_AUTHORIZE_URL = "https://bitbucket.org/site/oauth2/authorize" +BITBUCKET_TOKEN_URL = "https://bitbucket.org/site/oauth2/access_token" +BITBUCKET_SCOPES = "account repository pullrequest" +LOOPBACK_HOSTS = frozenset({"127.0.0.1", "localhost", "::1", "testserver", "testclient"}) +GITHUB_DEVICE_HOSTS = frozenset({"github.com", "www.github.com"}) +MAX_PENDING = 8 + +_lock = threading.RLock() +_pending: dict[str, dict[str, Any]] = {} + + +def _hostname(host_header: str) -> str: + raw = (host_header or "").strip() + if raw.startswith("["): + return raw[1:].split("]", 1)[0].lower() + return raw.split(":", 1)[0].lower() + + +def is_loopback_request(host_header: str, origin: str = "") -> bool: + """True for the local UI, TestClient, or curl on loopback. False for other websites.""" + if (origin or "").strip(): + host = (urlparse(origin).hostname or "").lower().strip("[]") + return host in LOOPBACK_HOSTS + return _hostname(host_header) in LOOPBACK_HOSTS + + +def _is_github_device_url(url: str) -> bool: + try: + parsed = urlparse(url) + except ValueError: + return False + if parsed.scheme != "https" or parsed.username or parsed.password: + return False + if (parsed.hostname or "").lower() not in GITHUB_DEVICE_HOSTS: + return False + return parsed.path.rstrip("/") == "/login/device" + + +def github_device_urls(data: dict[str, Any], user_code: str) -> tuple[str, str]: + verification = data.get("verification_uri") or "https://github.com/login/device" + if not _is_github_device_url(verification): + raise ValueError("GitHub returned an unexpected verification URL") + complete = data.get("verification_uri_complete") or "" + if not _is_github_device_url(complete): + complete = f"https://github.com/login/device?user_code={user_code}" + return verification, complete + + +def _remember_pending(flow_id: str, row: dict[str, Any]) -> None: + with _lock: + now = time.time() + for key, item in list(_pending.items()): + if float(item.get("expires_at") or 0) < now: + _pending.pop(key, None) + while len(_pending) >= MAX_PENDING: + oldest = min(_pending, key=lambda key: float(_pending[key].get("expires_at") or 0)) + _pending.pop(oldest, None) + _pending[flow_id] = row + + +def github_client_id(settings: AppSettings | None = None) -> str: + settings = settings or AppSettings.load() + return (os.environ.get("LOADPATH_GITHUB_CLIENT_ID") or settings.github_oauth_client_id or "").strip() + + +def bitbucket_oauth_client(settings: AppSettings | None = None) -> tuple[str, str]: + settings = settings or AppSettings.load() + client_id = (os.environ.get("LOADPATH_BITBUCKET_CLIENT_ID") or settings.bitbucket_oauth_client_id or "").strip() + secret = ( + os.environ.get("LOADPATH_BITBUCKET_CLIENT_SECRET") or settings.bitbucket_oauth_client_secret or "" + ).strip() + return client_id, secret + + +def oauth_status(settings: AppSettings | None = None) -> dict[str, Any]: + settings = settings or AppSettings.load() + bb_id, bb_secret = bitbucket_oauth_client(settings) + return { + "github": { + "connected": bool(settings.github_token), + "user": settings.github_user, + "token_set": bool(settings.github_token), + "oauth_ready": bool(github_client_id(settings)), + }, + "bitbucket": { + "connected": bool(settings.bitbucket_token), + "user": settings.bitbucket_user, + "token_set": bool(settings.bitbucket_token), + "oauth_ready": bool(bb_id and bb_secret), + }, + } + + +def _client(client: httpx.Client | None) -> httpx.Client: + return client or httpx.Client(timeout=30.0) + + +def start_github_device(client: httpx.Client | None = None) -> dict[str, Any]: + settings = AppSettings.load() + client_id = github_client_id(settings) + if not client_id: + raise ValueError( + "GitHub OAuth client ID is not configured. Set LOADPATH_GITHUB_CLIENT_ID " + "or paste a GitHub OAuth App client ID in Settings (enable Device Flow on the app)." + ) + http = _client(client) + response = http.post( + GITHUB_DEVICE_CODE_URL, + data={"client_id": client_id, "scope": GITHUB_SCOPES}, + headers={"Accept": "application/json"}, + ) + response.raise_for_status() + data = response.json() + device_code = data.get("device_code") or "" + user_code = data.get("user_code") or "" + if not device_code or not user_code: + raise ValueError("GitHub did not return a device code") + verification, complete = github_device_urls(data, user_code) + flow_id = secrets.token_urlsafe(16) + interval = int(data.get("interval") or 5) + expires_in = int(data.get("expires_in") or 900) + _remember_pending( + flow_id, + { + "provider": "github", + "device_code": device_code, + "client_id": client_id, + "interval": interval, + "expires_at": time.time() + expires_in, + }, + ) + return { + "flow_id": flow_id, + "user_code": user_code, + "verification_uri": verification, + "verification_uri_complete": complete, + "interval": interval, + "expires_in": expires_in, + } + + +def poll_github_device(flow_id: str, client: httpx.Client | None = None) -> dict[str, Any]: + with _lock: + pending = _pending.get(flow_id) + if not pending or pending.get("provider") != "github": + raise ValueError("Unknown or expired GitHub sign-in") + if pending["expires_at"] < time.time(): + with _lock: + _pending.pop(flow_id, None) + return {"status": "expired"} + http = _client(client) + response = http.post( + GITHUB_TOKEN_URL, + data={ + "client_id": pending["client_id"], + "device_code": pending["device_code"], + "grant_type": "urn:ietf:params:oauth:grant-type:device_code", + }, + headers={"Accept": "application/json"}, + ) + try: + data = response.json() + except ValueError: + response.raise_for_status() + data = {} + if not isinstance(data, dict): + response.raise_for_status() + data = {} + error = data.get("error") + if error == "authorization_pending": + return {"status": "pending", "interval": pending["interval"]} + if error == "slow_down": + return {"status": "slow_down", "interval": pending["interval"] + 5} + if error in {"expired_token", "access_denied"}: + with _lock: + _pending.pop(flow_id, None) + return {"status": "denied" if error == "access_denied" else "expired"} + if error: + raise ValueError(data.get("error_description") or error) + response.raise_for_status() + token = data.get("access_token") or "" + if not token: + raise ValueError("GitHub did not return an access token") + with _lock: + _pending.pop(flow_id, None) + settings = _store_login("github", token, client=http) + return {"status": "complete", **oauth_status(settings)["github"]} + + +def start_bitbucket_authorize(redirect_uri: str) -> dict[str, Any]: + settings = AppSettings.load() + client_id, secret = bitbucket_oauth_client(settings) + if not client_id or not secret: + raise ValueError( + "Bitbucket OAuth consumer is not configured. Set LOADPATH_BITBUCKET_CLIENT_ID and " + "LOADPATH_BITBUCKET_CLIENT_SECRET, or paste the consumer key and secret in Settings. " + f"Callback URL must be {redirect_uri}." + ) + flow_id = secrets.token_urlsafe(16) + _remember_pending( + flow_id, + { + "provider": "bitbucket", + "redirect_uri": redirect_uri, + "expires_at": time.time() + 600, + }, + ) + query = urlencode( + { + "client_id": client_id, + "response_type": "code", + "scope": BITBUCKET_SCOPES, + "state": flow_id, + "redirect_uri": redirect_uri, + } + ) + return {"flow_id": flow_id, "authorize_url": f"{BITBUCKET_AUTHORIZE_URL}?{query}"} + + +def finish_bitbucket_authorize( + code: str, + state: str, + client: httpx.Client | None = None, +) -> AppSettings: + with _lock: + pending = _pending.pop(state, None) + if not pending or pending.get("provider") != "bitbucket": + raise ValueError("Unknown or expired Bitbucket sign-in") + if pending["expires_at"] < time.time(): + raise ValueError("Bitbucket sign-in expired. Start again from Settings.") + settings = AppSettings.load() + client_id, secret = bitbucket_oauth_client(settings) + http = _client(client) + response = http.post( + BITBUCKET_TOKEN_URL, + data={ + "grant_type": "authorization_code", + "code": code, + "redirect_uri": pending["redirect_uri"], + }, + auth=(client_id, secret), + headers={"Accept": "application/json"}, + ) + response.raise_for_status() + data = response.json() + token = data.get("access_token") or "" + if not token: + raise ValueError(data.get("error_description") or "Bitbucket did not return an access token") + return _store_login( + "bitbucket", + token, + refresh_token=data.get("refresh_token") or "", + client=http, + ) + + +def refresh_bitbucket_access_token( + settings: AppSettings | None = None, + client: httpx.Client | None = None, +) -> AppSettings: + settings = settings or AppSettings.load() + client_id, secret = bitbucket_oauth_client(settings) + refresh = settings.bitbucket_refresh_token + if not (client_id and secret and refresh): + raise ValueError("Bitbucket refresh token is missing") + http = _client(client) + response = http.post( + BITBUCKET_TOKEN_URL, + data={"grant_type": "refresh_token", "refresh_token": refresh}, + auth=(client_id, secret), + headers={"Accept": "application/json"}, + ) + response.raise_for_status() + data = response.json() + token = data.get("access_token") or "" + if not token: + raise ValueError("Bitbucket refresh did not return an access token") + settings.bitbucket_token = token + if data.get("refresh_token"): + settings.bitbucket_refresh_token = data["refresh_token"] + settings.save() + return settings + + +def disconnect_scm(provider: str) -> AppSettings: + settings = AppSettings.load() + if provider == "github": + settings.github_token = "" + settings.github_user = "" + elif provider == "bitbucket": + settings.bitbucket_token = "" + settings.bitbucket_user = "" + settings.bitbucket_refresh_token = "" + else: + raise ValueError(f"Unknown SCM provider: {provider}") + settings.save() + return settings + + +def _store_login( + provider: str, + token: str, + *, + refresh_token: str = "", + client: httpx.Client | None = None, +) -> AppSettings: + settings = AppSettings.load() + username = "" + if provider == "github": + settings.github_token = token + else: + settings.bitbucket_token = token + settings.bitbucket_username = "" + if refresh_token: + settings.bitbucket_refresh_token = refresh_token + try: + scm = provider_for(provider, token, username=username, client=client) + profile = scm.current_user() + login = profile.get("login") or "" + if provider == "github": + settings.github_user = login + else: + settings.bitbucket_user = login + except httpx.HTTPError: + pass + settings.save() + return settings + + +def callback_html(*, ok: bool, title: str, body: str) -> str: + tone = "#8fd4a0" if ok else "#f88" + return f""" + + + + {escape(title)} + +
+

{escape(title)}

+

{escape(body)}

+

Back to Loadpath

+
""" diff --git a/src/loadpath/providers/scm.py b/src/loadpath/providers/scm.py index 50a6fbe..23fa7f1 100644 --- a/src/loadpath/providers/scm.py +++ b/src/loadpath/providers/scm.py @@ -1,13 +1,20 @@ from __future__ import annotations import re +import subprocess from dataclasses import dataclass +from pathlib import Path from typing import Any, Protocol import httpx REPO_SLUG = re.compile(r"^[\w.-]+/[\w.-]+$") LOADPATH_COMMENT_MARKER = "" +REMOTE_HOST = re.compile( + r"(github\.com|bitbucket\.org)[:/](?P[\w.-]+/[\w.-]+?)(?:\.git)?/?$", + re.IGNORECASE, +) +REPO_LIST_LIMIT = 500 def _marked_comment(markdown: str) -> str: @@ -25,6 +32,49 @@ def require_repo_slug(repo: str) -> str: return slug +def parse_remote_url(url: str) -> tuple[str, str] | None: + """Return (provider, owner/name) for a GitHub or Bitbucket remote URL.""" + raw = (url or "").strip() + match = REMOTE_HOST.search(raw) + if not match: + return None + slug = match.group("slug").strip("/") + if not REPO_SLUG.match(slug): + return None + host = match.group(1).lower() + provider = "github" if host == "github.com" else "bitbucket" + return provider, slug + + +def attach_local_paths(repos: list[RemoteRepo], workspace_paths: list[str]) -> list[RemoteRepo]: + """Fill local_path when a registered workspace remote matches the repo slug.""" + index: dict[tuple[str, str], str] = {} + for raw in workspace_paths: + path = Path(raw).expanduser() + try: + if not path.is_dir(): + continue + listed = subprocess.check_output( + ["git", "-C", str(path), "remote", "-v"], + text=True, + stderr=subprocess.DEVNULL, + timeout=5, + ) + except (OSError, subprocess.SubprocessError): + continue + resolved = str(path.resolve()) if path.exists() else str(path) + for line in listed.splitlines(): + parts = line.split() + if len(parts) < 2: + continue + parsed = parse_remote_url(parts[1]) + if parsed: + index[(parsed[0], parsed[1].lower())] = resolved + for repo in repos: + repo.local_path = index.get((repo.provider, repo.slug.lower())) + return repos + + @dataclass class PullRequest: provider: str @@ -46,9 +96,30 @@ def to_dict(self) -> dict[str, Any]: return self.__dict__.copy() +@dataclass +class RemoteRepo: + provider: str + slug: str + name: str + owner: str + url: str + private: bool = False + default_branch: str = "" + updated_at: str = "" + description: str = "" + local_path: str | None = None + + def to_dict(self) -> dict[str, Any]: + return self.__dict__.copy() + + class SCMProvider(Protocol): name: str + def current_user(self) -> dict[str, str]: ... + + def list_repositories(self, limit: int = REPO_LIST_LIMIT) -> list[RemoteRepo]: ... + def list_pull_requests(self, repo: str, state: str = "open") -> list[PullRequest]: ... def get_pull_request(self, repo: str, number: int) -> PullRequest: ... @@ -73,6 +144,58 @@ def _headers(self) -> dict[str, str]: "X-GitHub-Api-Version": "2022-11-28", } + def current_user(self) -> dict[str, str]: + r = self.client.get(f"{self.base}/user", headers=self._headers()) + r.raise_for_status() + item = r.json() + return { + "login": item.get("login") or "", + "name": item.get("name") or item.get("login") or "", + "url": item.get("html_url") or "", + } + + def list_repositories(self, limit: int = REPO_LIST_LIMIT) -> list[RemoteRepo]: + cap = max(1, min(limit, REPO_LIST_LIMIT)) + out: list[RemoteRepo] = [] + page = 1 + while len(out) < cap: + per_page = min(100, cap - len(out)) + r = self.client.get( + f"{self.base}/user/repos", + params={ + "per_page": per_page, + "page": page, + "sort": "updated", + "affiliation": "owner,collaborator,organization_member", + }, + headers=self._headers(), + ) + r.raise_for_status() + batch = r.json() or [] + if not batch: + break + for item in batch: + slug = item.get("full_name") or "" + owner, _, name = slug.partition("/") + html = item.get("html_url") or "" + out.append( + RemoteRepo( + provider="github", + slug=slug, + name=name or slug, + owner=owner, + url=html, + private=bool(item.get("private")), + default_branch=item.get("default_branch") or "", + updated_at=item.get("updated_at") or "", + description=item.get("description") or "", + ) + ) + if len(batch) < per_page: + break + page += 1 + return out[:cap] + def list_pull_requests(self, repo: str, state: str = "open") -> list[PullRequest]: repo = require_repo_slug(repo) r = self.client.get( @@ -208,6 +331,49 @@ def _headers(self) -> dict[str, str]: return {} return {"Authorization": f"Bearer {self.token}"} + def current_user(self) -> dict[str, str]: + r = self.client.get(f"{self.base}/user", headers=self._headers(), auth=self._auth()) + r.raise_for_status() + item = r.json() + login = item.get("username") or "" + return { + "login": login, + "name": item.get("display_name") or login, + "url": ((item.get("links") or {}).get("html") or {}).get("href") or "", + } + + def list_repositories(self, limit: int = REPO_LIST_LIMIT) -> list[RemoteRepo]: + cap = max(1, min(limit, REPO_LIST_LIMIT)) + out: list[RemoteRepo] = [] + url: str | None = f"{self.base}/repositories" + params: dict[str, Any] | None = {"role": "member", "pagelen": min(50, cap), "sort": "-updated_on"} + while url and len(out) < cap: + r = self.client.get(url, params=params, headers=self._headers(), auth=self._auth()) + r.raise_for_status() + data = r.json() + params = None + for item in data.get("values") or []: + slug = item.get("full_name") or "" + owner, _, name = slug.partition("/") + html = ((item.get("links") or {}).get("html") or {}).get("href") or "" + out.append( + RemoteRepo( + provider="bitbucket", + slug=slug, + name=name or slug, + owner=owner, + url=html, + private=item.get("is_private", True), + default_branch=((item.get("mainbranch") or {}).get("name") or ""), + updated_at=item.get("updated_on") or "", + description=item.get("description") or "", + ) + ) + if len(out) >= cap: + break + url = data.get("next") or None + return out[:cap] + def list_pull_requests(self, repo: str, state: str = "open") -> list[PullRequest]: repo = require_repo_slug(repo) bb_state = "OPEN" if state == "open" else state.upper() diff --git a/src/loadpath/server/app.py b/src/loadpath/server/app.py index 9deada5..8f16bf9 100644 --- a/src/loadpath/server/app.py +++ b/src/loadpath/server/app.py @@ -4,10 +4,12 @@ from pathlib import Path from typing import Any -from fastapi import FastAPI, HTTPException +from fastapi import FastAPI, HTTPException, Query, Request from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import HTMLResponse from fastapi.staticfiles import StaticFiles from pydantic import BaseModel, Field +import httpx from loadpath import __version__ from loadpath.paths import package_dir @@ -27,7 +29,17 @@ from loadpath.detect import detect_layout, write_draft_config from loadpath.graph.store import GraphStore from loadpath.index import default_db_path, index_repo -from loadpath.providers.scm import provider_for +from loadpath.providers.oauth import ( + callback_html, + disconnect_scm, + finish_bitbucket_authorize, + is_loopback_request, + oauth_status, + poll_github_device, + start_bitbucket_authorize, + start_github_device, +) +from loadpath.providers.scm import attach_local_paths, provider_for from loadpath.review.engine import run_review from loadpath.review.render import render_html, render_markdown from loadpath.settings import AppSettings, public_settings, register_workspace, settings_path, _should_update_secret @@ -64,9 +76,12 @@ class PRCommentRequest(BaseModel): class SettingsUpdate(BaseModel): github_token: str | None = None + github_oauth_client_id: str | None = None bitbucket_token: str | None = None bitbucket_username: str | None = None bitbucket_workspace: str | None = None + bitbucket_oauth_client_id: str | None = None + bitbucket_oauth_client_secret: str | None = None ai_provider: str | None = None ai_api_key: str | None = None ai_model: str | None = None @@ -86,6 +101,14 @@ class ResidualRequest(BaseModel): review: dict[str, Any] = Field(default_factory=dict) +class GitHubOAuthPoll(BaseModel): + flow_id: str + + +class OAuthDisconnect(BaseModel): + provider: str + + def require_repo_path(path: str | None) -> Path: if not (path or "").strip(): raise HTTPException(400, "repo_path is required") @@ -95,6 +118,44 @@ def require_repo_path(path: str | None) -> Path: return root +def _scm_credentials(settings: AppSettings, provider: str) -> tuple[str, str]: + if provider == "github": + return settings.github_token, "" + if provider == "bitbucket": + return settings.bitbucket_token, settings.bitbucket_username + raise HTTPException(400, f"Unknown SCM provider: {provider}") + + +def _call_scm(provider: str, fn): + from loadpath.providers.oauth import refresh_bitbucket_access_token + + settings = AppSettings.load() + token, username = _scm_credentials(settings, provider) + if not token: + raise HTTPException(400, f"No {provider} token configured") + try: + return fn(provider_for(provider, token, username=username)) + except httpx.HTTPStatusError as exc: + if ( + provider == "bitbucket" + and exc.response is not None + and exc.response.status_code == 401 + and settings.bitbucket_refresh_token + ): + try: + settings = refresh_bitbucket_access_token(settings) + except Exception as refresh_exc: # noqa: BLE001 + raise HTTPException(502, str(refresh_exc)) from refresh_exc + token, username = _scm_credentials(settings, provider) + return fn(provider_for(provider, token, username=username)) + raise HTTPException(502, str(exc)) from exc + + +def require_loopback(request: Request) -> None: + if not is_loopback_request(request.headers.get("host") or "", request.headers.get("origin") or ""): + raise HTTPException(403, "SCM sign-in and repo listing are only available from the local Loadpath UI") + + def create_app( public_url: str | None = None, oauth_pin: str | None = None, @@ -169,12 +230,18 @@ def put_settings(body: SettingsUpdate) -> dict[str, Any]: current = AppSettings.load() if _should_update_secret(body.github_token, current.github_token): current.github_token = body.github_token or "" + if body.github_oauth_client_id is not None: + current.github_oauth_client_id = body.github_oauth_client_id.strip() if _should_update_secret(body.bitbucket_token, current.bitbucket_token): current.bitbucket_token = body.bitbucket_token or "" if body.bitbucket_username is not None: current.bitbucket_username = body.bitbucket_username if body.bitbucket_workspace is not None: current.bitbucket_workspace = body.bitbucket_workspace + if body.bitbucket_oauth_client_id is not None: + current.bitbucket_oauth_client_id = body.bitbucket_oauth_client_id.strip() + if _should_update_secret(body.bitbucket_oauth_client_secret, current.bitbucket_oauth_client_secret): + current.bitbucket_oauth_client_secret = body.bitbucket_oauth_client_secret or "" if body.ai_provider is not None: current.ai.provider = body.ai_provider if _should_update_secret(body.ai_api_key, current.ai.api_key): @@ -320,13 +387,19 @@ def api_prs(body: PRListRequest) -> dict[str, Any]: settings = AppSettings.load() token = body.token username = body.username or settings.bitbucket_username - if not token: - token = settings.github_token if body.provider == "github" else settings.bitbucket_token - if not token: - raise HTTPException(400, f"No {body.provider} token configured") + if token: + try: + scm = provider_for(body.provider, token, username=username) + prs = scm.list_pull_requests(body.repo, state=body.state) + except ValueError as exc: + raise HTTPException(400, str(exc)) from exc + except Exception as exc: # noqa: BLE001 + raise HTTPException(502, str(exc)) from exc + return {"pull_requests": [p.to_dict() for p in prs]} try: - scm = provider_for(body.provider, token, username=username) - prs = scm.list_pull_requests(body.repo, state=body.state) + prs = _call_scm(body.provider, lambda scm: scm.list_pull_requests(body.repo, state=body.state)) + except HTTPException: + raise except ValueError as exc: raise HTTPException(400, str(exc)) from exc except Exception as exc: # noqa: BLE001 @@ -350,20 +423,139 @@ def api_pr_comment(body: PRCommentRequest) -> dict[str, Any]: settings = AppSettings.load() token = body.token username = body.username or settings.bitbucket_username - if not token: - token = settings.github_token if body.provider == "github" else settings.bitbucket_token - if not token: - raise HTTPException(400, f"No {body.provider} token configured") if not body.markdown.strip(): raise HTTPException(400, "markdown is empty") + if token: + try: + scm = provider_for(body.provider, token, username=username) + return scm.upsert_pull_request_comment(body.repo, body.number, body.markdown) + except ValueError as exc: + raise HTTPException(400, str(exc)) from exc + except Exception as exc: # noqa: BLE001 + raise HTTPException(502, str(exc)) from exc + try: + return _call_scm( + body.provider, + lambda scm: scm.upsert_pull_request_comment(body.repo, body.number, body.markdown), + ) + except HTTPException: + raise + except ValueError as exc: + raise HTTPException(400, str(exc)) from exc + except Exception as exc: # noqa: BLE001 + raise HTTPException(502, str(exc)) from exc + + @app.get("/api/scm/repos") + def api_scm_repos(request: Request, provider: str = Query("github")) -> dict[str, Any]: + require_loopback(request) + settings = AppSettings.load() + + def _load(scm): + return scm.list_repositories(), scm.current_user() + try: - scm = provider_for(body.provider, token, username=username) - posted = scm.upsert_pull_request_comment(body.repo, body.number, body.markdown) + repos, profile = _call_scm(provider, _load) + except HTTPException: + raise except ValueError as exc: raise HTTPException(400, str(exc)) from exc except Exception as exc: # noqa: BLE001 raise HTTPException(502, str(exc)) from exc - return posted + attach_local_paths(repos, [w.path for w in settings.workspaces]) + login = profile.get("login") or "" + if login: + current = AppSettings.load() + if provider == "github" and current.github_user != login: + current.github_user = login + current.save() + elif provider == "bitbucket" and current.bitbucket_user != login: + current.bitbucket_user = login + current.save() + return { + "provider": provider, + "user": profile, + "repos": [r.to_dict() for r in repos], + } + + @app.get("/api/oauth/status") + def api_oauth_status(request: Request) -> dict[str, Any]: + require_loopback(request) + return oauth_status() + + @app.post("/api/oauth/github/start") + def api_github_oauth_start(request: Request) -> dict[str, Any]: + require_loopback(request) + try: + return start_github_device() + except ValueError as exc: + raise HTTPException(400, str(exc)) from exc + except httpx.HTTPError as exc: + raise HTTPException(502, str(exc)) from exc + + @app.post("/api/oauth/github/poll") + def api_github_oauth_poll(request: Request, body: GitHubOAuthPoll) -> dict[str, Any]: + require_loopback(request) + try: + return poll_github_device(body.flow_id) + except ValueError as exc: + raise HTTPException(400, str(exc)) from exc + except httpx.HTTPError as exc: + raise HTTPException(502, str(exc)) from exc + + @app.get("/api/oauth/bitbucket/start") + def api_bitbucket_oauth_start(request: Request) -> dict[str, Any]: + require_loopback(request) + redirect_uri = f"{base.rstrip('/')}/api/oauth/bitbucket/callback" + try: + return start_bitbucket_authorize(redirect_uri) + except ValueError as exc: + raise HTTPException(400, str(exc)) from exc + + @app.get("/api/oauth/bitbucket/callback") + def api_bitbucket_oauth_callback(code: str = "", state: str = "", error: str = "") -> HTMLResponse: + if error: + return HTMLResponse( + callback_html( + ok=False, + title="Bitbucket sign-in cancelled", + body=error.replace("_", " "), + ), + status_code=400, + ) + if not code or not state: + return HTMLResponse( + callback_html(ok=False, title="Bitbucket sign-in failed", body="Missing code or state."), + status_code=400, + ) + try: + settings = finish_bitbucket_authorize(code, state) + except ValueError as exc: + return HTMLResponse( + callback_html(ok=False, title="Bitbucket sign-in failed", body=str(exc)), + status_code=400, + ) + except httpx.HTTPError as exc: + return HTMLResponse( + callback_html(ok=False, title="Bitbucket sign-in failed", body=str(exc)), + status_code=502, + ) + user = settings.bitbucket_user or "your account" + return HTMLResponse( + callback_html( + ok=True, + title="Connected to Bitbucket", + body=f"Signed in as {user}. Return to Loadpath — your repositories are available on the Pull requests tab.", + ) + ) + + @app.post("/api/oauth/disconnect") + def api_oauth_disconnect(request: Request, body: OAuthDisconnect) -> dict[str, Any]: + require_loopback(request) + try: + settings = disconnect_scm(body.provider) + except ValueError as exc: + raise HTTPException(400, str(exc)) from exc + return public_settings(settings) @app.post("/api/ai/residual") def api_residual(body: ResidualRequest) -> dict[str, Any]: diff --git a/src/loadpath/settings.py b/src/loadpath/settings.py index f8c142a..c65c99c 100644 --- a/src/loadpath/settings.py +++ b/src/loadpath/settings.py @@ -38,9 +38,15 @@ class Workspace(BaseModel): class AppSettings(BaseModel): github_token: str = "" + github_user: str = "" + github_oauth_client_id: str = "" bitbucket_token: str = "" bitbucket_username: str = "" bitbucket_workspace: str = "" + bitbucket_user: str = "" + bitbucket_refresh_token: str = "" + bitbucket_oauth_client_id: str = "" + bitbucket_oauth_client_secret: str = "" ai: AISettings = Field(default_factory=AISettings) workspaces: list[Workspace] = Field(default_factory=list) connections: list[SCMConnection] = Field(default_factory=list) @@ -103,8 +109,18 @@ def public_settings(settings: AppSettings) -> dict[str, Any]: data = settings.model_dump() data["github_token"] = mask_secret(settings.github_token) data["bitbucket_token"] = mask_secret(settings.bitbucket_token) + data["bitbucket_refresh_token"] = mask_secret(settings.bitbucket_refresh_token) + data["bitbucket_oauth_client_secret"] = mask_secret(settings.bitbucket_oauth_client_secret) data["github_token_set"] = bool(settings.github_token) data["bitbucket_token_set"] = bool(settings.bitbucket_token) + data["bitbucket_oauth_client_secret_set"] = bool(settings.bitbucket_oauth_client_secret) + data["github_oauth_ready"] = bool( + (os.environ.get("LOADPATH_GITHUB_CLIENT_ID") or settings.github_oauth_client_id or "").strip() + ) + data["bitbucket_oauth_ready"] = bool( + (os.environ.get("LOADPATH_BITBUCKET_CLIENT_ID") or settings.bitbucket_oauth_client_id or "").strip() + and (os.environ.get("LOADPATH_BITBUCKET_CLIENT_SECRET") or settings.bitbucket_oauth_client_secret or "").strip() + ) data["ai"] = { "provider": settings.ai.provider, "model": settings.ai.model, diff --git a/src/loadpath/static/assets/LayeredGraph3D-ByrH7ZmH.js b/src/loadpath/static/assets/LayeredGraph3D-mUQO6wms.js similarity index 99% rename from src/loadpath/static/assets/LayeredGraph3D-ByrH7ZmH.js rename to src/loadpath/static/assets/LayeredGraph3D-mUQO6wms.js index 8e7ede2..ba45ac8 100644 --- a/src/loadpath/static/assets/LayeredGraph3D-ByrH7ZmH.js +++ b/src/loadpath/static/assets/LayeredGraph3D-mUQO6wms.js @@ -1,4 +1,4 @@ -import{r as bn,l as tc,c as nc,a as ic,L as sc,j as jn,t as rc}from"./index-CPytLSOG.js";/** +import{r as bn,l as tc,c as nc,a as ic,L as sc,j as jn,t as rc}from"./index-CEZTl1rC.js";/** * @license * Copyright 2010-2026 Three.js Authors * SPDX-License-Identifier: MIT diff --git a/src/loadpath/static/assets/index-lBf9fQrf.css b/src/loadpath/static/assets/index-B5eCWnJO.css similarity index 87% rename from src/loadpath/static/assets/index-lBf9fQrf.css rename to src/loadpath/static/assets/index-B5eCWnJO.css index b3625a3..6420f3a 100644 --- a/src/loadpath/static/assets/index-lBf9fQrf.css +++ b/src/loadpath/static/assets/index-B5eCWnJO.css @@ -1 +1 @@ -.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #555;--xy-background-pattern-lines-color-default: #333;--xy-background-pattern-cross-color-default: #333;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}:root,[data-theme=obsidian]{--bg: #070b10;--bg-2: #0d141c;--surface: #121a24;--line: #1e2c3c;--ink: #e7eef6;--muted: #8b9bb0;--high: #2a9d8f;--medium: #e9c46a;--low: #e76f51;--critical: #e85d04;--accent: #4cc9f0;--rail-from: #0b1219;--rail-to: #070b10;--rail-active: #15202c;--btn: #173044;--btn-line: #24506c;--btn-primary: #134e4a;--btn-primary-line: #2a9d8f;--node-bg: #101822;--node-line: #2a3d52;--graph-bg: #070b10;--graph-grid: rgba(42, 80, 120, .09);--edge-cheap: #4a5568;--edge-expensive: #f4a261;--edge-critical: #e85d04;--shadow: rgba(76, 201, 240, .08)}[data-theme=nord]{--bg: #2e3440;--bg-2: #3b4252;--surface: #434c5e;--line: #4c566a;--ink: #eceff4;--muted: #d8dee9;--high: #a3be8c;--medium: #ebcb8b;--low: #bf616a;--critical: #d08770;--accent: #88c0d0;--rail-from: #3b4252;--rail-to: #2e3440;--rail-active: #4c566a;--btn: #434c5e;--btn-line: #81a1c1;--btn-primary: #5e81ac;--btn-primary-line: #88c0d0;--node-bg: #3b4252;--node-line: #81a1c1;--graph-bg: #2e3440;--graph-grid: rgba(136, 192, 208, .12);--edge-cheap: #4c566a;--edge-expensive: #d08770;--edge-critical: #bf616a;--shadow: rgba(136, 192, 208, .12)}[data-theme=solarized-dark]{--bg: #002b36;--bg-2: #073642;--surface: #0a3944;--line: #16444f;--ink: #eee8d5;--muted: #93a1a1;--high: #859900;--medium: #b58900;--low: #dc322f;--critical: #cb4b16;--accent: #2aa198;--rail-from: #073642;--rail-to: #002b36;--rail-active: #16444f;--btn: #073642;--btn-line: #268bd2;--btn-primary: #0a4a42;--btn-primary-line: #2aa198;--node-bg: #073642;--node-line: #268bd2;--graph-bg: #002b36;--graph-grid: rgba(42, 161, 152, .12);--edge-cheap: #586e75;--edge-expensive: #cb4b16;--edge-critical: #dc322f;--shadow: rgba(42, 161, 152, .12)}[data-theme=forest]{--bg: #0e1510;--bg-2: #152019;--surface: #1b2a20;--line: #2c4334;--ink: #e4f0e6;--muted: #8eaa96;--high: #6ab04c;--medium: #c8a951;--low: #e17055;--critical: #d35400;--accent: #7bed9f;--rail-from: #152019;--rail-to: #0e1510;--rail-active: #1f3326;--btn: #1f3326;--btn-line: #3d6b4f;--btn-primary: #1e4d32;--btn-primary-line: #6ab04c;--node-bg: #16241b;--node-line: #3d6b4f;--graph-bg: #0e1510;--graph-grid: rgba(123, 237, 159, .1);--edge-cheap: #3d6b4f;--edge-expensive: #c8a951;--edge-critical: #d35400;--shadow: rgba(123, 237, 159, .1)}[data-theme=rose]{--bg: #191724;--bg-2: #1f1d2e;--surface: #26233a;--line: #403d52;--ink: #e0def4;--muted: #908caa;--high: #9ccfd8;--medium: #f6c177;--low: #eb6f92;--critical: #eb6f92;--accent: #c4a7e7;--rail-from: #1f1d2e;--rail-to: #191724;--rail-active: #26233a;--btn: #26233a;--btn-line: #c4a7e7;--btn-primary: #3a2f4d;--btn-primary-line: #c4a7e7;--node-bg: #1f1d2e;--node-line: #524f67;--graph-bg: #191724;--graph-grid: rgba(196, 167, 231, .12);--edge-cheap: #524f67;--edge-expensive: #f6c177;--edge-critical: #eb6f92;--shadow: rgba(196, 167, 231, .12)}[data-theme=amber]{--bg: #120e0a;--bg-2: #1c1610;--surface: #261e16;--line: #3d2f22;--ink: #f4e6d0;--muted: #b59a78;--high: #c4d6a0;--medium: #e9b44c;--low: #d8572a;--critical: #c0392b;--accent: #f0a05a;--rail-from: #1c1610;--rail-to: #120e0a;--rail-active: #2b2218;--btn: #2b2218;--btn-line: #8a5a2b;--btn-primary: #4a3418;--btn-primary-line: #f0a05a;--node-bg: #1c1610;--node-line: #8a5a2b;--graph-bg: #120e0a;--graph-grid: rgba(240, 160, 90, .12);--edge-cheap: #5c4a38;--edge-expensive: #e9b44c;--edge-critical: #d8572a;--shadow: rgba(240, 160, 90, .12)}[data-theme=volcano]{--bg: #14090a;--bg-2: #1e0e10;--surface: #2a1416;--line: #4a2226;--ink: #fde8e4;--muted: #c48b86;--high: #7bed9f;--medium: #f6c90e;--low: #ff6b6b;--critical: #ff3b3b;--accent: #ff7b54;--rail-from: #1e0e10;--rail-to: #14090a;--rail-active: #32181b;--btn: #32181b;--btn-line: #ff7b54;--btn-primary: #5a1f18;--btn-primary-line: #ff7b54;--node-bg: #1e0e10;--node-line: #7a3330;--graph-bg: #14090a;--graph-grid: rgba(255, 123, 84, .12);--edge-cheap: #5a3330;--edge-expensive: #ff7b54;--edge-critical: #ff3b3b;--shadow: rgba(255, 123, 84, .14)}[data-theme=lavender]{--bg: #12101c;--bg-2: #1a1730;--surface: #221e3c;--line: #3b3560;--ink: #efeaff;--muted: #b3a7d6;--high: #80ffdb;--medium: #ffd166;--low: #ff6b9d;--critical: #ff4d6d;--accent: #c77dff;--rail-from: #1a1730;--rail-to: #12101c;--rail-active: #2a2550;--btn: #2a2550;--btn-line: #c77dff;--btn-primary: #3d2a66;--btn-primary-line: #c77dff;--node-bg: #1a1730;--node-line: #5a4d8a;--graph-bg: #12101c;--graph-grid: rgba(199, 125, 255, .12);--edge-cheap: #5a4d8a;--edge-expensive: #ffd166;--edge-critical: #ff4d6d;--shadow: rgba(199, 125, 255, .14)}[data-theme=neon-noir]{--bg: #05060a;--bg-2: #0a0c14;--surface: #10131c;--line: #1e2436;--ink: #f0f4ff;--muted: #8b93b0;--high: #39ff88;--medium: #ffe66d;--low: #ff2d95;--critical: #ff3d5a;--accent: #00f0ff;--rail-from: #0a0c14;--rail-to: #05060a;--rail-active: #151a2a;--btn: #151a2a;--btn-line: #00f0ff;--btn-primary: #063a40;--btn-primary-line: #00f0ff;--node-bg: #0a0c14;--node-line: #2a3550;--graph-bg: #05060a;--graph-grid: rgba(0, 240, 255, .12);--edge-cheap: #3a4560;--edge-expensive: #ff2d95;--edge-critical: #ff3d5a;--shadow: rgba(0, 240, 255, .22)}[data-theme=synthwave]{--bg: #1a0a2e;--bg-2: #240b3d;--surface: #2d1250;--line: #4a1d7a;--ink: #ffe6fb;--muted: #c49ad8;--high: #00f5d4;--medium: #ffd60a;--low: #ff6b9d;--critical: #ff006e;--accent: #ff2bd6;--rail-from: #240b3d;--rail-to: #1a0a2e;--rail-active: #3a1570;--btn: #3a1570;--btn-line: #ff2bd6;--btn-primary: #5a0a4a;--btn-primary-line: #ff2bd6;--node-bg: #240b3d;--node-line: #7b2cbf;--graph-bg: #1a0a2e;--graph-grid: rgba(255, 43, 214, .16);--edge-cheap: #5a3a80;--edge-expensive: #ff9e00;--edge-critical: #ff006e;--shadow: rgba(255, 43, 214, .24)}[data-theme=phosphor]{--bg: #020804;--bg-2: #061208;--surface: #0a1a0e;--line: #163c1e;--ink: #c8ffc8;--muted: #5aaa5a;--high: #39ff14;--medium: #c8f542;--low: #ffb000;--critical: #ff5e00;--accent: #00ff66;--rail-from: #061208;--rail-to: #020804;--rail-active: #0e2414;--btn: #0e2414;--btn-line: #00ff66;--btn-primary: #0a3a18;--btn-primary-line: #00ff66;--node-bg: #061208;--node-line: #1e6a32;--graph-bg: #020804;--graph-grid: rgba(0, 255, 102, .12);--edge-cheap: #1e5a2a;--edge-expensive: #c8f542;--edge-critical: #ff5e00;--shadow: rgba(0, 255, 102, .2)}[data-theme=aurora]{--bg: #071018;--bg-2: #0c1c28;--surface: #122636;--line: #1e3d52;--ink: #e8fff6;--muted: #7eb8a8;--high: #5fffcf;--medium: #ffe566;--low: #ff7eb6;--critical: #ff4d6d;--accent: #7cffb2;--rail-from: #0c1c28;--rail-to: #071018;--rail-active: #163044;--btn: #163044;--btn-line: #7cffb2;--btn-primary: #0e3d3a;--btn-primary-line: #7cffb2;--node-bg: #0c1c28;--node-line: #2a6a78;--graph-bg: #071018;--graph-grid: rgba(124, 255, 178, .12);--edge-cheap: #2a5a68;--edge-expensive: #c9a0ff;--edge-critical: #ff4d6d;--shadow: rgba(124, 255, 178, .18)}[data-theme=biolume]{--bg: #02141c;--bg-2: #042430;--surface: #073040;--line: #0a4a5c;--ink: #e6fffb;--muted: #6eb8b0;--high: #5dffb0;--medium: #ffe066;--low: #ff79c6;--critical: #ff4d6d;--accent: #18e7d4;--rail-from: #042430;--rail-to: #02141c;--rail-active: #0a3848;--btn: #0a3848;--btn-line: #18e7d4;--btn-primary: #0a4a48;--btn-primary-line: #18e7d4;--node-bg: #042430;--node-line: #1a7080;--graph-bg: #02141c;--graph-grid: rgba(24, 231, 212, .12);--edge-cheap: #1a5a68;--edge-expensive: #ff79c6;--edge-critical: #ff4d6d;--shadow: rgba(24, 231, 212, .2)}[data-theme=carbon]{--bg: #0d0d0f;--bg-2: #16161a;--surface: #1e1e24;--line: #33333c;--ink: #f2f2f4;--muted: #9a9aa8;--high: #3dd68c;--medium: #f0c040;--low: #ff5a5a;--critical: #ff2a2a;--accent: #ff2a2a;--rail-from: #16161a;--rail-to: #0d0d0f;--rail-active: #24242c;--btn: #24242c;--btn-line: #ff2a2a;--btn-primary: #4a1212;--btn-primary-line: #ff2a2a;--node-bg: #16161a;--node-line: #4a4a55;--graph-bg: #0d0d0f;--graph-grid: rgba(255, 42, 42, .1);--edge-cheap: #4a4a55;--edge-expensive: #ff8a3d;--edge-critical: #ff2a2a;--shadow: rgba(255, 42, 42, .18)}[data-theme=paper]{--bg: #f6f1e8;--bg-2: #efe6d6;--surface: #fffaf2;--line: #d9cbb6;--ink: #2b241c;--muted: #6f6456;--high: #2a7a4b;--medium: #b5811a;--low: #c0392b;--critical: #a93226;--accent: #1d6a7a;--rail-from: #efe6d6;--rail-to: #e7dcc8;--rail-active: #e2d3bb;--btn: #fffaf2;--btn-line: #c9b79a;--btn-primary: #d7eee0;--btn-primary-line: #2a7a4b;--node-bg: #fffaf2;--node-line: #c9b79a;--graph-bg: #f6f1e8;--graph-grid: rgba(29, 106, 122, .1);--edge-cheap: #b7a48c;--edge-expensive: #c0392b;--edge-critical: #a93226;--shadow: rgba(43, 36, 28, .08)}[data-theme=solarized-light]{--bg: #fdf6e3;--bg-2: #eee8d5;--surface: #f5efdc;--line: #d6cba9;--ink: #657b83;--muted: #93a1a1;--high: #859900;--medium: #b58900;--low: #dc322f;--critical: #cb4b16;--accent: #268bd2;--rail-from: #eee8d5;--rail-to: #e6dfc8;--rail-active: #e0d9c0;--btn: #fdf6e3;--btn-line: #93a1a1;--btn-primary: #e8efc8;--btn-primary-line: #859900;--node-bg: #fdf6e3;--node-line: #93a1a1;--graph-bg: #fdf6e3;--graph-grid: rgba(38, 139, 210, .12);--edge-cheap: #93a1a1;--edge-expensive: #cb4b16;--edge-critical: #dc322f;--shadow: rgba(101, 123, 131, .1)}[data-theme=seafoam]{--bg: #eef7f4;--bg-2: #dff0ea;--surface: #ffffff;--line: #b7d5cc;--ink: #17332c;--muted: #4d7268;--high: #1b8a5a;--medium: #c48a14;--low: #c44536;--critical: #9b2d22;--accent: #1d9a8a;--rail-from: #dff0ea;--rail-to: #cfe6de;--rail-active: #c4ddd4;--btn: #ffffff;--btn-line: #8fbfb2;--btn-primary: #d4f0e4;--btn-primary-line: #1b8a5a;--node-bg: #ffffff;--node-line: #8fbfb2;--graph-bg: #eef7f4;--graph-grid: rgba(29, 154, 138, .12);--edge-cheap: #8fbfb2;--edge-expensive: #c48a14;--edge-critical: #c44536;--shadow: rgba(23, 51, 44, .08)}[data-theme=high-contrast]{--bg: #ffffff;--bg-2: #f2f2f2;--surface: #ffffff;--line: #111111;--ink: #000000;--muted: #222222;--high: #007a33;--medium: #8a5a00;--low: #b00000;--critical: #9b0000;--accent: #0033cc;--rail-from: #f2f2f2;--rail-to: #e6e6e6;--rail-active: #d9d9d9;--btn: #ffffff;--btn-line: #000000;--btn-primary: #d9f2e3;--btn-primary-line: #007a33;--node-bg: #ffffff;--node-line: #000000;--graph-bg: #ffffff;--graph-grid: rgba(0, 0, 0, .12);--edge-cheap: #444444;--edge-expensive: #8a5a00;--edge-critical: #b00000;--shadow: rgba(0, 0, 0, .12)}[data-theme=sakura]{--bg: #fff0f5;--bg-2: #ffe4ee;--surface: #fff7fa;--line: #f5b8cc;--ink: #4a1830;--muted: #a05a78;--high: #1a8a5c;--medium: #c48a14;--low: #d63d6e;--critical: #b01040;--accent: #e84a8a;--rail-from: #ffe4ee;--rail-to: #f8d4e0;--rail-active: #f5c8d8;--btn: #fff7fa;--btn-line: #e89ab0;--btn-primary: #ffd6e6;--btn-primary-line: #e84a8a;--node-bg: #fff7fa;--node-line: #e89ab0;--graph-bg: #fff0f5;--graph-grid: rgba(232, 74, 138, .12);--edge-cheap: #d4a0b0;--edge-expensive: #d63d6e;--edge-critical: #b01040;--shadow: rgba(74, 24, 48, .1)}[data-theme=citrus]{--bg: #fffce8;--bg-2: #fff3b0;--surface: #fffef5;--line: #e8d44a;--ink: #2a2a08;--muted: #6a6a20;--high: #2a8a20;--medium: #d4a000;--low: #e85d04;--critical: #c0392b;--accent: #5aad14;--rail-from: #fff3b0;--rail-to: #ffe98a;--rail-active: #ffe066;--btn: #fffef5;--btn-line: #d4c030;--btn-primary: #e8f5b8;--btn-primary-line: #5aad14;--node-bg: #fffef5;--node-line: #d4c030;--graph-bg: #fffce8;--graph-grid: rgba(90, 173, 20, .14);--edge-cheap: #c4b040;--edge-expensive: #e85d04;--edge-critical: #c0392b;--shadow: rgba(42, 42, 8, .1)}[data-theme=peach]{--bg: #fff3eb;--bg-2: #ffe0cc;--surface: #fffaf6;--line: #f0c4a8;--ink: #3a2218;--muted: #8a5a48;--high: #2a8a5c;--medium: #d48a14;--low: #e85d3a;--critical: #c0392b;--accent: #ff6b35;--rail-from: #ffe0cc;--rail-to: #ffd4b8;--rail-active: #ffc8a8;--btn: #fffaf6;--btn-line: #e8a888;--btn-primary: #ffe0cc;--btn-primary-line: #ff6b35;--node-bg: #fffaf6;--node-line: #e8a888;--graph-bg: #fff3eb;--graph-grid: rgba(255, 107, 53, .12);--edge-cheap: #d4a088;--edge-expensive: #e85d3a;--edge-critical: #c0392b;--shadow: rgba(58, 34, 24, .1)}[data-theme=candy]{--bg: #f4f0ff;--bg-2: #e8dcff;--surface: #fbf8ff;--line: #d4c0f0;--ink: #2a1848;--muted: #6a5890;--high: #1a8a6a;--medium: #c48a14;--low: #e84a8a;--critical: #c01060;--accent: #ff5eb1;--rail-from: #e8dcff;--rail-to: #ddd0ff;--rail-active: #d4c4ff;--btn: #fbf8ff;--btn-line: #c4a8e8;--btn-primary: #ffd6ec;--btn-primary-line: #ff5eb1;--node-bg: #fbf8ff;--node-line: #c4a8e8;--graph-bg: #f4f0ff;--graph-grid: rgba(255, 94, 177, .14);--edge-cheap: #b0a0d0;--edge-expensive: #e84a8a;--edge-critical: #c01060;--shadow: rgba(42, 24, 72, .1)}[data-theme=sky]{--bg: #e8f4ff;--bg-2: #cfe8ff;--surface: #f5faff;--line: #90c8f0;--ink: #0a2848;--muted: #3a6080;--high: #0a8a4a;--medium: #c48a14;--low: #e85d3a;--critical: #c0392b;--accent: #0077ff;--rail-from: #cfe8ff;--rail-to: #b8dcff;--rail-active: #a8d4ff;--btn: #f5faff;--btn-line: #70b0e0;--btn-primary: #cfe8ff;--btn-primary-line: #0077ff;--node-bg: #f5faff;--node-line: #70b0e0;--graph-bg: #e8f4ff;--graph-grid: rgba(0, 119, 255, .12);--edge-cheap: #80b0d0;--edge-expensive: #e85d3a;--edge-critical: #c0392b;--shadow: rgba(10, 40, 72, .1)}[data-theme=coral]{--bg: #fff1ee;--bg-2: #ffddd6;--surface: #fff8f6;--line: #f0b0a4;--ink: #3a1814;--muted: #8a5048;--high: #0d9488;--medium: #d48a14;--low: #e85d4a;--critical: #c0392b;--accent: #0d9488;--rail-from: #ffddd6;--rail-to: #ffd0c6;--rail-active: #ffc4b8;--btn: #fff8f6;--btn-line: #e89888;--btn-primary: #d4f4ee;--btn-primary-line: #0d9488;--node-bg: #fff8f6;--node-line: #e89888;--graph-bg: #fff1ee;--graph-grid: rgba(13, 148, 136, .14);--edge-cheap: #d4a098;--edge-expensive: #e85d4a;--edge-critical: #c0392b;--shadow: rgba(58, 24, 20, .1)}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}:root{--radius: 6px;--radius-lg: 10px;--control-h: 32px;--font: "IBM Plex Sans", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;--mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;--focus-ring: 0 0 0 2px var(--bg), 0 0 0 4px var(--accent);--space: 8px}body{background:var(--bg);color:var(--ink);font-family:var(--font);font-size:13px;line-height:1.45;-webkit-font-smoothing:antialiased}button,input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,a:focus-visible,summary:focus-visible{outline:none;box-shadow:var(--focus-ring)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.skip{position:absolute;left:12px;top:-40px;z-index:50;background:var(--surface);color:var(--ink);border:1px solid var(--accent);border-radius:var(--radius);padding:8px 12px}.skip:focus{top:12px}.app{display:grid;grid-template-columns:232px 1fr;height:100%}.rail{border-right:1px solid var(--line);background:linear-gradient(180deg,var(--rail-from),var(--rail-to));padding:16px 12px;display:flex;flex-direction:column;gap:2px;min-width:0}.brand{display:flex;flex-direction:column;gap:2px;padding:4px 8px 16px}.brand-mark{font-family:var(--mono);letter-spacing:.16em;font-size:11px;text-transform:uppercase;color:var(--accent);font-weight:600}.brand-sub{font-size:11px;color:var(--muted)}.nav-item{display:flex;align-items:center;gap:10px;background:transparent;border:0;text-align:left;padding:8px 10px;border-radius:var(--radius);color:var(--muted);cursor:pointer;width:100%}.nav-item:hover{background:color-mix(in srgb,var(--rail-active) 70%,transparent);color:var(--ink)}.nav-item.active{background:var(--rail-active);color:var(--ink);font-weight:500}.nav-item svg{flex-shrink:0}.theme-pick{margin-top:14px;display:grid;gap:4px;padding:0 2px}.theme-pick label{font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);font-weight:500}.theme-pick select,.field select,.field input,.topbar input,.topbar select,.settings input,.settings select,.explorer-path input{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:0 10px;height:var(--control-h);width:100%}.rail-foot{margin-top:auto;padding:12px 8px 4px;border-top:1px solid var(--line);display:grid;gap:6px}.kbd-hint{font-size:11px;color:var(--muted)}kbd{font-family:var(--mono);font-size:10px;border:1px solid var(--line);border-radius:4px;padding:0 4px;background:var(--surface)}.main{display:flex;flex-direction:column;min-width:0;min-height:0;position:relative;background:var(--bg)}.progress{position:absolute;top:0;left:0;right:0;height:2px;overflow:hidden;z-index:30;background:color-mix(in srgb,var(--accent) 20%,transparent)}.progress i{display:block;height:100%;width:32%;background:var(--accent);animation:indeterminate 1.1s ease-in-out infinite}@keyframes indeterminate{0%{transform:translate(-120%)}to{transform:translate(400%)}}.topbar{display:flex;gap:10px;align-items:flex-end;padding:10px 16px;border-bottom:1px solid var(--line);background:var(--bg-2);flex-wrap:wrap}.field{display:grid;gap:4px;min-width:0}.field>span{font-size:11px;color:var(--muted);font-weight:500}.field.path{flex:1;min-width:180px}.field.ref{width:188px;flex:0 0 188px}.field.workspace{width:180px;flex:0 0 180px}.path-row,.combo-row{display:flex;min-width:0}.path-row input,.combo-row input{flex:1;min-width:0}.combo{position:relative;min-width:0}.combo-row input{border-top-right-radius:0;border-bottom-right-radius:0}.topbar .icon-btn{width:var(--control-h);padding:0;flex:0 0 var(--control-h)}.combo-toggle{border-top-left-radius:0;border-bottom-left-radius:0;border-left:0}.combo-menu{position:absolute;top:calc(100% + 4px);right:0;left:auto;min-width:340px;max-width:min(480px,70vw);max-height:360px;overflow:auto;z-index:40;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:0 12px 32px var(--shadow);padding:6px 0}.combo-heading{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);font-weight:600;padding:8px 12px 4px}.combo-menu .combo-option{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;text-align:left;background:transparent;border:0;border-radius:0;height:auto;padding:6px 12px;color:var(--ink);cursor:pointer}.combo-menu .combo-option:hover,.combo-menu .combo-option.active{background:var(--rail-active)}.combo-label{font-family:var(--mono);font-size:12px}.combo-detail{color:var(--muted);font-size:12px;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.combo-empty{padding:10px 12px}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:color-mix(in srgb,var(--bg) 72%,transparent);display:grid;place-items:center;padding:24px}.modal{width:min(720px,100%);max-height:min(640px,90vh);background:var(--bg-2);border:1px solid var(--line);border-radius:var(--radius-lg);box-shadow:0 16px 48px var(--shadow);display:flex;flex-direction:column;overflow:hidden}.modal-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:14px 16px 10px;border-bottom:1px solid var(--line)}.modal-head h2{font-size:15px}.modal-head .muted{margin:4px 0 0}.explorer-path{display:flex;gap:8px;padding:12px 16px;border-bottom:1px solid var(--line)}.explorer-path input{flex:1;min-width:0}.explorer-list{flex:1;overflow:auto;padding:8px;min-height:220px}.explorer-row{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:transparent;border:0;border-radius:var(--radius);padding:8px 10px;color:var(--ink);cursor:pointer;height:auto}.explorer-row:hover,.explorer-row.active{background:var(--rail-active)}.explorer-name{min-width:0;overflow:hidden;text-overflow:ellipsis}.git-badge{margin-left:auto;margin-bottom:0}.explorer-empty{padding:18px 10px}.modal-foot{display:flex;align-items:center;gap:12px;padding:12px 16px;border-top:1px solid var(--line)}.explorer-current{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--mono);font-size:12px}.topbar input,.topbar select{min-width:0}.topbar-actions{display:flex;gap:8px;margin-left:auto;align-items:center;padding-bottom:0}.btn,.topbar button{background:var(--btn);border:1px solid var(--btn-line);border-radius:var(--radius);height:var(--control-h);padding:0 12px;cursor:pointer;font-weight:500;display:inline-flex;align-items:center;justify-content:center;gap:6px;white-space:nowrap}.btn:hover,.topbar button:hover{filter:brightness(1.08)}.btn:disabled,.topbar button:disabled{opacity:.55;cursor:not-allowed;filter:none}.btn.primary{background:var(--btn-primary);border-color:var(--btn-primary-line)}.btn.ghost{background:transparent}.alerts{display:grid;gap:8px;padding:10px 16px 0}.alerts:empty{display:none;padding:0}.stage{flex:1;min-height:0;display:flex;flex-direction:column}.content{flex:1;min-height:0;display:grid;grid-template-columns:minmax(340px,420px) 1fr}.brief{overflow:auto;border-right:1px solid var(--line);padding:16px 18px 24px;background:radial-gradient(circle at 0 0,color-mix(in srgb,var(--accent) 8%,transparent),transparent 42%),var(--bg)}.graph-wrap{position:relative;min-height:0;display:flex;flex-direction:column}.impact-graph{flex:1;min-height:0;position:relative;display:flex;flex-direction:column}.graph-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:8px 14px;border-bottom:1px solid var(--line);background:var(--bg-2)}.graph-count{margin-left:auto;font-size:11px}.chip-btn{background:var(--surface);border:1px solid var(--line);border-radius:999px;padding:4px 12px;color:var(--muted);cursor:pointer;height:26px}.chip-btn:hover{color:var(--ink)}.chip-btn.active{background:var(--rail-active);color:var(--ink)}.chip-btn:disabled{opacity:.45;cursor:not-allowed}.graph-stage{flex:1;min-height:0;position:relative;display:flex;flex-direction:column}.graph-stage .react-flow,.graph-3d,.graph-3d-host,.graph-3d-canvas-host{flex:1;width:100%;height:100%;min-height:280px}.graph-3d{position:relative;background:var(--graph-bg);display:flex;flex-direction:column}.graph-3d-host{position:relative;min-height:0;display:flex;flex-direction:column}.graph-3d-canvas-host{position:relative;min-height:0}.graph-3d canvas{display:block;width:100%;height:100%}.graph-3d-tip{position:absolute;pointer-events:none;z-index:2;max-width:320px;padding:6px 8px;border-radius:var(--radius);background:var(--surface);border:1px solid var(--line);color:var(--ink);font-size:11px;line-height:1.35;box-shadow:0 8px 24px var(--shadow)}.graph-3d-tip .t{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.graph-3d-tip .n{font-weight:600}.graph-3d-hint{position:absolute;left:10px;bottom:10px;z-index:2;margin:0;font-size:11px;color:var(--muted);max-width:min(420px,calc(100% - 24px));pointer-events:none}.graph-wrap .react-flow{background-color:var(--graph-bg);background-image:linear-gradient(var(--graph-grid) 1px,transparent 1px),linear-gradient(90deg,var(--graph-grid) 1px,transparent 1px);background-size:24px 24px}.react-flow__minimap{background:var(--graph-bg)!important;border:1px solid var(--line)!important;border-radius:var(--radius);overflow:hidden;box-shadow:0 8px 24px var(--shadow)}.react-flow__minimap-node{fill:var(--muted);stroke:none}.react-flow__minimap-node.selected{fill:var(--accent)}.react-flow__minimap-mask{fill:#00000073!important;stroke:var(--accent)!important}.react-flow__controls{box-shadow:none!important}.react-flow__controls-button{background:var(--surface)!important;border-bottom:1px solid var(--line)!important;fill:var(--ink)!important}h1{font-size:18px;margin:0 0 6px;font-weight:600}h2{font-size:13px;margin:0;font-weight:600}.merge-box{border:1px solid var(--line);background:var(--surface);border-radius:var(--radius-lg);padding:12px 14px;margin-bottom:12px}.merge-box.high{border-color:color-mix(in srgb,var(--high) 55%,var(--line))}.merge-box.medium{border-color:color-mix(in srgb,var(--medium) 55%,var(--line))}.merge-box.low{border-color:color-mix(in srgb,var(--low) 55%,var(--line))}.level{font-family:var(--mono);font-weight:600;font-size:14px}.level.high{color:var(--high)}.level.medium{color:var(--medium)}.level.low{color:var(--low)}.merge-title{margin-top:4px;font-size:13px;color:var(--ink)}.reasons{margin:10px 0 0;padding:0 0 0 18px;color:var(--muted)}.reasons li{margin:0 0 4px}.metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:0 0 14px}.metric{border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);padding:8px 10px}.metric .n{font-family:var(--mono);font-size:16px;font-weight:600;font-variant-numeric:tabular-nums}.metric .l{font-size:11px;color:var(--muted);margin-top:2px}.section{border-top:1px solid var(--line);padding:8px 0 4px}.section>summary{cursor:pointer;list-style:none;display:flex;align-items:center;justify-content:space-between;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.07em;font-weight:600;padding:6px 0}.section>summary::-webkit-details-marker{display:none}.section>summary .count{font-family:var(--mono);letter-spacing:0;text-transform:none;border:1px solid var(--line);border-radius:999px;padding:0 7px;height:18px;display:inline-flex;align-items:center;font-size:11px}.kicker{color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.08em;margin:16px 0 6px;font-weight:600}.chip{display:inline-flex;align-items:center;font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid var(--line);margin:0 6px 6px 0;color:var(--muted);background:var(--surface)}.chip.blocker{color:var(--low);border-color:var(--low)}.chip.warning{color:var(--medium);border-color:var(--medium)}.chip.strong{color:var(--low);border-color:var(--low)}.chip.worth_exploring{color:var(--medium);border-color:var(--medium)}.chip.speculative{color:var(--muted);border-color:var(--line)}.chip.open{color:var(--high);border-color:color-mix(in srgb,var(--high) 50%,var(--line))}.file{font-family:var(--mono);font-size:12px;color:var(--accent)}.read-item,.finding,.residual{padding:8px 0;border-bottom:1px solid color-mix(in srgb,var(--line) 70%,transparent)}.read-item:last-child,.finding:last-child{border-bottom:0}.read-item .why{color:var(--muted);font-size:12px;margin-top:2px}.muted{color:var(--muted);font-size:13px;line-height:1.45}.error{color:var(--low);padding:8px 12px;border:1px solid var(--low);background:color-mix(in srgb,var(--low) 10%,var(--surface));border-radius:var(--radius);display:flex;justify-content:space-between;gap:12px;align-items:flex-start}.banner{padding:8px 12px;border-radius:var(--radius);border:1px solid var(--line);background:var(--surface);font-size:13px;line-height:1.45;display:flex;justify-content:space-between;gap:12px;align-items:flex-start}.banner.warn{border-color:var(--medium);color:var(--medium)}.banner.stale{border-color:var(--low);color:var(--low)}.banner .dismiss{background:transparent;border:0;color:inherit;cursor:pointer;height:auto;padding:0 2px;opacity:.7}.empty{padding:24px 8px;color:var(--muted);font-size:13px;line-height:1.55}.empty h2{font-size:16px;color:var(--ink);margin-bottom:8px}.empty ol{margin:12px 0 0 18px;padding:0}.empty code,code{font-family:var(--mono);font-size:12px;color:var(--accent)}.btn-row{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.pr-list{padding:16px;overflow:auto}.pr-toolbar{display:flex;gap:8px;align-items:flex-end;margin-bottom:14px}.pr-toolbar .field{flex:1}.pr-toolbar .field.provider{flex:0 0 140px}.pr{border:1px solid var(--line);background:var(--surface);padding:12px 14px;border-radius:var(--radius-lg);margin-bottom:10px}.pr h3{margin:0 0 4px;font-size:14px;font-weight:600}.pr-meta{display:flex;flex-wrap:wrap;gap:8px 12px;align-items:center;margin:6px 0 10px}.pr-actions{display:flex;gap:8px;align-items:center}.settings{padding:24px;max-width:760px;overflow:auto;display:grid;gap:16px}.settings-card{border:1px solid var(--line);background:var(--surface);border-radius:var(--radius-lg);padding:16px;display:grid;gap:8px}.settings-card h2{font-size:14px;margin-bottom:2px}.settings label{font-size:12px;color:var(--muted);font-weight:500}.theme-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px}.theme-swatch{border:1px solid var(--line);background:var(--bg);color:var(--ink);border-radius:var(--radius);padding:10px;text-align:left;cursor:pointer;height:auto;box-shadow:0 1px 8px var(--shadow)}.theme-swatch.active{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent),0 1px 8px var(--shadow)}.theme-swatch .swatch-bar{height:6px;border-radius:3px;margin-bottom:8px;background:linear-gradient(90deg,var(--accent),var(--high),var(--medium),var(--low))}.theme-swatch .name{font-size:13px;font-weight:600}.theme-swatch .group{font-size:11px;color:var(--muted)}.headline{white-space:pre-wrap;font-family:var(--mono);font-size:12px;color:var(--muted);margin:8px 0 0}.graph-modes{display:flex;gap:8px;align-items:center;padding:8px 14px;border-bottom:1px solid var(--line);background:var(--bg-2)}.seg{display:inline-flex;border:1px solid var(--line);border-radius:999px;padding:2px;background:var(--surface)}.seg button,.graph-modes button{background:transparent;border:0;border-radius:999px;padding:4px 12px;color:var(--muted);cursor:pointer;height:26px}.seg button.active,.graph-modes button.active{background:var(--rail-active);color:var(--ink)}.legend{margin-left:auto;display:flex;gap:12px;color:var(--muted);font-size:11px}.legend i{display:inline-block;width:14px;height:2px;margin-right:6px;vertical-align:middle;background:var(--edge-cheap)}.legend i.exp{background:var(--edge-expensive)}.legend i.crit{background:var(--edge-critical);height:3px}.legend i.dash{border-top:2px dashed var(--muted);background:none;height:0}.inspector{position:absolute;top:12px;right:12px;z-index:5;width:300px;max-width:calc(100% - 24px);max-height:calc(100% - 24px);overflow-x:hidden;overflow-y:auto;overflow-wrap:break-word;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-lg);padding:10px 12px;box-shadow:0 8px 24px var(--shadow);font-size:12px}.inspector .t{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}.inspector .n,.inspector .file,.inspector .muted{overflow-wrap:break-word}.inspector .n{font-weight:600;margin:4px 0}.inspector-head{display:flex;align-items:flex-start;gap:8px}.inspector-roles{display:flex;flex-wrap:wrap;justify-content:flex-end;flex:1;gap:4px}.inspector-chip{font-size:10px;text-transform:uppercase;letter-spacing:.04em;padding:1px 6px;border-radius:999px;border:1px solid var(--line);color:var(--muted);white-space:nowrap}.inspector-close{flex:0 0 auto;width:24px;height:24px;padding:0;border:1px solid var(--line);border-radius:var(--radius);background:transparent;color:var(--muted);font-size:16px;line-height:1;cursor:pointer}.inspector-close:hover{color:var(--ink)}.inspector-purpose{margin:6px 0 8px;color:var(--ink);font-size:12px;line-height:1.4}.inspector-layer{margin-top:4px;font-size:11px}.inspector-facts{margin:10px 0 0;padding-top:8px;border-top:1px solid var(--line)}.inspector-fact{display:grid;grid-template-columns:minmax(64px,92px) minmax(0,1fr);gap:8px;padding:3px 0;align-items:start}.inspector-fact dt{color:var(--muted);font-size:11px;margin:0}.inspector-fact dd{margin:0;overflow-wrap:break-word}.inspector-section{margin-top:10px;padding-top:8px;border-top:1px solid var(--line)}.inspector-section h3{margin:0 0 6px;display:flex;align-items:center;justify-content:space-between;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.07em;font-weight:600}.inspector-section .count{font-family:var(--mono);letter-spacing:0;text-transform:none;border:1px solid var(--line);border-radius:999px;padding:0 7px;height:18px;display:inline-flex;align-items:center;font-size:11px}.inspector-section ul{list-style:none;margin:0;padding:0}.inspector-section li{padding:4px 0;border-bottom:1px solid color-mix(in srgb,var(--line) 70%,transparent)}.inspector-section li:last-child{border-bottom:0}.inspector-link-name{display:block;font-weight:600;overflow-wrap:break-word}.inspector-link-meta{display:block;color:var(--muted);font-size:11px}.lp-node{padding:8px 10px;border-radius:var(--radius);border:1px solid var(--node-line);background:var(--node-bg);width:180px;max-width:100%;height:56px;box-sizing:border-box;box-shadow:0 0 0 1px var(--shadow);overflow:visible;position:relative}.lp-node .t{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.lp-node .n{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lp-node.selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.react-flow__node-load .react-flow__handle{width:8px;height:8px;border:none;background:transparent;opacity:0}.type-table{width:100%;border-collapse:collapse;font-size:12px}.type-table td{padding:3px 0}.type-table td:last-child{text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--muted)}@media(prefers-reduced-motion:reduce){.progress i{animation:none;width:100%}*{scroll-behavior:auto!important}}@media(max-width:960px){.app{grid-template-columns:56px 1fr}.brand-sub,.nav-item span,.theme-pick,.kbd-hint,.rail-foot .muted{display:none}.nav-item{justify-content:center;padding:10px}.content{grid-template-columns:1fr}.brief{border-right:0;border-bottom:1px solid var(--line);max-height:42vh}} +.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #555;--xy-background-pattern-lines-color-default: #333;--xy-background-pattern-cross-color-default: #333;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}:root,[data-theme=obsidian]{--bg: #070b10;--bg-2: #0d141c;--surface: #121a24;--line: #1e2c3c;--ink: #e7eef6;--muted: #8b9bb0;--high: #2a9d8f;--medium: #e9c46a;--low: #e76f51;--critical: #e85d04;--accent: #4cc9f0;--rail-from: #0b1219;--rail-to: #070b10;--rail-active: #15202c;--btn: #173044;--btn-line: #24506c;--btn-primary: #134e4a;--btn-primary-line: #2a9d8f;--node-bg: #101822;--node-line: #2a3d52;--graph-bg: #070b10;--graph-grid: rgba(42, 80, 120, .09);--edge-cheap: #4a5568;--edge-expensive: #f4a261;--edge-critical: #e85d04;--shadow: rgba(76, 201, 240, .08)}[data-theme=nord]{--bg: #2e3440;--bg-2: #3b4252;--surface: #434c5e;--line: #4c566a;--ink: #eceff4;--muted: #d8dee9;--high: #a3be8c;--medium: #ebcb8b;--low: #bf616a;--critical: #d08770;--accent: #88c0d0;--rail-from: #3b4252;--rail-to: #2e3440;--rail-active: #4c566a;--btn: #434c5e;--btn-line: #81a1c1;--btn-primary: #5e81ac;--btn-primary-line: #88c0d0;--node-bg: #3b4252;--node-line: #81a1c1;--graph-bg: #2e3440;--graph-grid: rgba(136, 192, 208, .12);--edge-cheap: #4c566a;--edge-expensive: #d08770;--edge-critical: #bf616a;--shadow: rgba(136, 192, 208, .12)}[data-theme=solarized-dark]{--bg: #002b36;--bg-2: #073642;--surface: #0a3944;--line: #16444f;--ink: #eee8d5;--muted: #93a1a1;--high: #859900;--medium: #b58900;--low: #dc322f;--critical: #cb4b16;--accent: #2aa198;--rail-from: #073642;--rail-to: #002b36;--rail-active: #16444f;--btn: #073642;--btn-line: #268bd2;--btn-primary: #0a4a42;--btn-primary-line: #2aa198;--node-bg: #073642;--node-line: #268bd2;--graph-bg: #002b36;--graph-grid: rgba(42, 161, 152, .12);--edge-cheap: #586e75;--edge-expensive: #cb4b16;--edge-critical: #dc322f;--shadow: rgba(42, 161, 152, .12)}[data-theme=forest]{--bg: #0e1510;--bg-2: #152019;--surface: #1b2a20;--line: #2c4334;--ink: #e4f0e6;--muted: #8eaa96;--high: #6ab04c;--medium: #c8a951;--low: #e17055;--critical: #d35400;--accent: #7bed9f;--rail-from: #152019;--rail-to: #0e1510;--rail-active: #1f3326;--btn: #1f3326;--btn-line: #3d6b4f;--btn-primary: #1e4d32;--btn-primary-line: #6ab04c;--node-bg: #16241b;--node-line: #3d6b4f;--graph-bg: #0e1510;--graph-grid: rgba(123, 237, 159, .1);--edge-cheap: #3d6b4f;--edge-expensive: #c8a951;--edge-critical: #d35400;--shadow: rgba(123, 237, 159, .1)}[data-theme=rose]{--bg: #191724;--bg-2: #1f1d2e;--surface: #26233a;--line: #403d52;--ink: #e0def4;--muted: #908caa;--high: #9ccfd8;--medium: #f6c177;--low: #eb6f92;--critical: #eb6f92;--accent: #c4a7e7;--rail-from: #1f1d2e;--rail-to: #191724;--rail-active: #26233a;--btn: #26233a;--btn-line: #c4a7e7;--btn-primary: #3a2f4d;--btn-primary-line: #c4a7e7;--node-bg: #1f1d2e;--node-line: #524f67;--graph-bg: #191724;--graph-grid: rgba(196, 167, 231, .12);--edge-cheap: #524f67;--edge-expensive: #f6c177;--edge-critical: #eb6f92;--shadow: rgba(196, 167, 231, .12)}[data-theme=amber]{--bg: #120e0a;--bg-2: #1c1610;--surface: #261e16;--line: #3d2f22;--ink: #f4e6d0;--muted: #b59a78;--high: #c4d6a0;--medium: #e9b44c;--low: #d8572a;--critical: #c0392b;--accent: #f0a05a;--rail-from: #1c1610;--rail-to: #120e0a;--rail-active: #2b2218;--btn: #2b2218;--btn-line: #8a5a2b;--btn-primary: #4a3418;--btn-primary-line: #f0a05a;--node-bg: #1c1610;--node-line: #8a5a2b;--graph-bg: #120e0a;--graph-grid: rgba(240, 160, 90, .12);--edge-cheap: #5c4a38;--edge-expensive: #e9b44c;--edge-critical: #d8572a;--shadow: rgba(240, 160, 90, .12)}[data-theme=volcano]{--bg: #14090a;--bg-2: #1e0e10;--surface: #2a1416;--line: #4a2226;--ink: #fde8e4;--muted: #c48b86;--high: #7bed9f;--medium: #f6c90e;--low: #ff6b6b;--critical: #ff3b3b;--accent: #ff7b54;--rail-from: #1e0e10;--rail-to: #14090a;--rail-active: #32181b;--btn: #32181b;--btn-line: #ff7b54;--btn-primary: #5a1f18;--btn-primary-line: #ff7b54;--node-bg: #1e0e10;--node-line: #7a3330;--graph-bg: #14090a;--graph-grid: rgba(255, 123, 84, .12);--edge-cheap: #5a3330;--edge-expensive: #ff7b54;--edge-critical: #ff3b3b;--shadow: rgba(255, 123, 84, .14)}[data-theme=lavender]{--bg: #12101c;--bg-2: #1a1730;--surface: #221e3c;--line: #3b3560;--ink: #efeaff;--muted: #b3a7d6;--high: #80ffdb;--medium: #ffd166;--low: #ff6b9d;--critical: #ff4d6d;--accent: #c77dff;--rail-from: #1a1730;--rail-to: #12101c;--rail-active: #2a2550;--btn: #2a2550;--btn-line: #c77dff;--btn-primary: #3d2a66;--btn-primary-line: #c77dff;--node-bg: #1a1730;--node-line: #5a4d8a;--graph-bg: #12101c;--graph-grid: rgba(199, 125, 255, .12);--edge-cheap: #5a4d8a;--edge-expensive: #ffd166;--edge-critical: #ff4d6d;--shadow: rgba(199, 125, 255, .14)}[data-theme=neon-noir]{--bg: #05060a;--bg-2: #0a0c14;--surface: #10131c;--line: #1e2436;--ink: #f0f4ff;--muted: #8b93b0;--high: #39ff88;--medium: #ffe66d;--low: #ff2d95;--critical: #ff3d5a;--accent: #00f0ff;--rail-from: #0a0c14;--rail-to: #05060a;--rail-active: #151a2a;--btn: #151a2a;--btn-line: #00f0ff;--btn-primary: #063a40;--btn-primary-line: #00f0ff;--node-bg: #0a0c14;--node-line: #2a3550;--graph-bg: #05060a;--graph-grid: rgba(0, 240, 255, .12);--edge-cheap: #3a4560;--edge-expensive: #ff2d95;--edge-critical: #ff3d5a;--shadow: rgba(0, 240, 255, .22)}[data-theme=synthwave]{--bg: #1a0a2e;--bg-2: #240b3d;--surface: #2d1250;--line: #4a1d7a;--ink: #ffe6fb;--muted: #c49ad8;--high: #00f5d4;--medium: #ffd60a;--low: #ff6b9d;--critical: #ff006e;--accent: #ff2bd6;--rail-from: #240b3d;--rail-to: #1a0a2e;--rail-active: #3a1570;--btn: #3a1570;--btn-line: #ff2bd6;--btn-primary: #5a0a4a;--btn-primary-line: #ff2bd6;--node-bg: #240b3d;--node-line: #7b2cbf;--graph-bg: #1a0a2e;--graph-grid: rgba(255, 43, 214, .16);--edge-cheap: #5a3a80;--edge-expensive: #ff9e00;--edge-critical: #ff006e;--shadow: rgba(255, 43, 214, .24)}[data-theme=phosphor]{--bg: #020804;--bg-2: #061208;--surface: #0a1a0e;--line: #163c1e;--ink: #c8ffc8;--muted: #5aaa5a;--high: #39ff14;--medium: #c8f542;--low: #ffb000;--critical: #ff5e00;--accent: #00ff66;--rail-from: #061208;--rail-to: #020804;--rail-active: #0e2414;--btn: #0e2414;--btn-line: #00ff66;--btn-primary: #0a3a18;--btn-primary-line: #00ff66;--node-bg: #061208;--node-line: #1e6a32;--graph-bg: #020804;--graph-grid: rgba(0, 255, 102, .12);--edge-cheap: #1e5a2a;--edge-expensive: #c8f542;--edge-critical: #ff5e00;--shadow: rgba(0, 255, 102, .2)}[data-theme=aurora]{--bg: #071018;--bg-2: #0c1c28;--surface: #122636;--line: #1e3d52;--ink: #e8fff6;--muted: #7eb8a8;--high: #5fffcf;--medium: #ffe566;--low: #ff7eb6;--critical: #ff4d6d;--accent: #7cffb2;--rail-from: #0c1c28;--rail-to: #071018;--rail-active: #163044;--btn: #163044;--btn-line: #7cffb2;--btn-primary: #0e3d3a;--btn-primary-line: #7cffb2;--node-bg: #0c1c28;--node-line: #2a6a78;--graph-bg: #071018;--graph-grid: rgba(124, 255, 178, .12);--edge-cheap: #2a5a68;--edge-expensive: #c9a0ff;--edge-critical: #ff4d6d;--shadow: rgba(124, 255, 178, .18)}[data-theme=biolume]{--bg: #02141c;--bg-2: #042430;--surface: #073040;--line: #0a4a5c;--ink: #e6fffb;--muted: #6eb8b0;--high: #5dffb0;--medium: #ffe066;--low: #ff79c6;--critical: #ff4d6d;--accent: #18e7d4;--rail-from: #042430;--rail-to: #02141c;--rail-active: #0a3848;--btn: #0a3848;--btn-line: #18e7d4;--btn-primary: #0a4a48;--btn-primary-line: #18e7d4;--node-bg: #042430;--node-line: #1a7080;--graph-bg: #02141c;--graph-grid: rgba(24, 231, 212, .12);--edge-cheap: #1a5a68;--edge-expensive: #ff79c6;--edge-critical: #ff4d6d;--shadow: rgba(24, 231, 212, .2)}[data-theme=carbon]{--bg: #0d0d0f;--bg-2: #16161a;--surface: #1e1e24;--line: #33333c;--ink: #f2f2f4;--muted: #9a9aa8;--high: #3dd68c;--medium: #f0c040;--low: #ff5a5a;--critical: #ff2a2a;--accent: #ff2a2a;--rail-from: #16161a;--rail-to: #0d0d0f;--rail-active: #24242c;--btn: #24242c;--btn-line: #ff2a2a;--btn-primary: #4a1212;--btn-primary-line: #ff2a2a;--node-bg: #16161a;--node-line: #4a4a55;--graph-bg: #0d0d0f;--graph-grid: rgba(255, 42, 42, .1);--edge-cheap: #4a4a55;--edge-expensive: #ff8a3d;--edge-critical: #ff2a2a;--shadow: rgba(255, 42, 42, .18)}[data-theme=paper]{--bg: #f6f1e8;--bg-2: #efe6d6;--surface: #fffaf2;--line: #d9cbb6;--ink: #2b241c;--muted: #6f6456;--high: #2a7a4b;--medium: #b5811a;--low: #c0392b;--critical: #a93226;--accent: #1d6a7a;--rail-from: #efe6d6;--rail-to: #e7dcc8;--rail-active: #e2d3bb;--btn: #fffaf2;--btn-line: #c9b79a;--btn-primary: #d7eee0;--btn-primary-line: #2a7a4b;--node-bg: #fffaf2;--node-line: #c9b79a;--graph-bg: #f6f1e8;--graph-grid: rgba(29, 106, 122, .1);--edge-cheap: #b7a48c;--edge-expensive: #c0392b;--edge-critical: #a93226;--shadow: rgba(43, 36, 28, .08)}[data-theme=solarized-light]{--bg: #fdf6e3;--bg-2: #eee8d5;--surface: #f5efdc;--line: #d6cba9;--ink: #657b83;--muted: #93a1a1;--high: #859900;--medium: #b58900;--low: #dc322f;--critical: #cb4b16;--accent: #268bd2;--rail-from: #eee8d5;--rail-to: #e6dfc8;--rail-active: #e0d9c0;--btn: #fdf6e3;--btn-line: #93a1a1;--btn-primary: #e8efc8;--btn-primary-line: #859900;--node-bg: #fdf6e3;--node-line: #93a1a1;--graph-bg: #fdf6e3;--graph-grid: rgba(38, 139, 210, .12);--edge-cheap: #93a1a1;--edge-expensive: #cb4b16;--edge-critical: #dc322f;--shadow: rgba(101, 123, 131, .1)}[data-theme=seafoam]{--bg: #eef7f4;--bg-2: #dff0ea;--surface: #ffffff;--line: #b7d5cc;--ink: #17332c;--muted: #4d7268;--high: #1b8a5a;--medium: #c48a14;--low: #c44536;--critical: #9b2d22;--accent: #1d9a8a;--rail-from: #dff0ea;--rail-to: #cfe6de;--rail-active: #c4ddd4;--btn: #ffffff;--btn-line: #8fbfb2;--btn-primary: #d4f0e4;--btn-primary-line: #1b8a5a;--node-bg: #ffffff;--node-line: #8fbfb2;--graph-bg: #eef7f4;--graph-grid: rgba(29, 154, 138, .12);--edge-cheap: #8fbfb2;--edge-expensive: #c48a14;--edge-critical: #c44536;--shadow: rgba(23, 51, 44, .08)}[data-theme=high-contrast]{--bg: #ffffff;--bg-2: #f2f2f2;--surface: #ffffff;--line: #111111;--ink: #000000;--muted: #222222;--high: #007a33;--medium: #8a5a00;--low: #b00000;--critical: #9b0000;--accent: #0033cc;--rail-from: #f2f2f2;--rail-to: #e6e6e6;--rail-active: #d9d9d9;--btn: #ffffff;--btn-line: #000000;--btn-primary: #d9f2e3;--btn-primary-line: #007a33;--node-bg: #ffffff;--node-line: #000000;--graph-bg: #ffffff;--graph-grid: rgba(0, 0, 0, .12);--edge-cheap: #444444;--edge-expensive: #8a5a00;--edge-critical: #b00000;--shadow: rgba(0, 0, 0, .12)}[data-theme=sakura]{--bg: #fff0f5;--bg-2: #ffe4ee;--surface: #fff7fa;--line: #f5b8cc;--ink: #4a1830;--muted: #a05a78;--high: #1a8a5c;--medium: #c48a14;--low: #d63d6e;--critical: #b01040;--accent: #e84a8a;--rail-from: #ffe4ee;--rail-to: #f8d4e0;--rail-active: #f5c8d8;--btn: #fff7fa;--btn-line: #e89ab0;--btn-primary: #ffd6e6;--btn-primary-line: #e84a8a;--node-bg: #fff7fa;--node-line: #e89ab0;--graph-bg: #fff0f5;--graph-grid: rgba(232, 74, 138, .12);--edge-cheap: #d4a0b0;--edge-expensive: #d63d6e;--edge-critical: #b01040;--shadow: rgba(74, 24, 48, .1)}[data-theme=citrus]{--bg: #fffce8;--bg-2: #fff3b0;--surface: #fffef5;--line: #e8d44a;--ink: #2a2a08;--muted: #6a6a20;--high: #2a8a20;--medium: #d4a000;--low: #e85d04;--critical: #c0392b;--accent: #5aad14;--rail-from: #fff3b0;--rail-to: #ffe98a;--rail-active: #ffe066;--btn: #fffef5;--btn-line: #d4c030;--btn-primary: #e8f5b8;--btn-primary-line: #5aad14;--node-bg: #fffef5;--node-line: #d4c030;--graph-bg: #fffce8;--graph-grid: rgba(90, 173, 20, .14);--edge-cheap: #c4b040;--edge-expensive: #e85d04;--edge-critical: #c0392b;--shadow: rgba(42, 42, 8, .1)}[data-theme=peach]{--bg: #fff3eb;--bg-2: #ffe0cc;--surface: #fffaf6;--line: #f0c4a8;--ink: #3a2218;--muted: #8a5a48;--high: #2a8a5c;--medium: #d48a14;--low: #e85d3a;--critical: #c0392b;--accent: #ff6b35;--rail-from: #ffe0cc;--rail-to: #ffd4b8;--rail-active: #ffc8a8;--btn: #fffaf6;--btn-line: #e8a888;--btn-primary: #ffe0cc;--btn-primary-line: #ff6b35;--node-bg: #fffaf6;--node-line: #e8a888;--graph-bg: #fff3eb;--graph-grid: rgba(255, 107, 53, .12);--edge-cheap: #d4a088;--edge-expensive: #e85d3a;--edge-critical: #c0392b;--shadow: rgba(58, 34, 24, .1)}[data-theme=candy]{--bg: #f4f0ff;--bg-2: #e8dcff;--surface: #fbf8ff;--line: #d4c0f0;--ink: #2a1848;--muted: #6a5890;--high: #1a8a6a;--medium: #c48a14;--low: #e84a8a;--critical: #c01060;--accent: #ff5eb1;--rail-from: #e8dcff;--rail-to: #ddd0ff;--rail-active: #d4c4ff;--btn: #fbf8ff;--btn-line: #c4a8e8;--btn-primary: #ffd6ec;--btn-primary-line: #ff5eb1;--node-bg: #fbf8ff;--node-line: #c4a8e8;--graph-bg: #f4f0ff;--graph-grid: rgba(255, 94, 177, .14);--edge-cheap: #b0a0d0;--edge-expensive: #e84a8a;--edge-critical: #c01060;--shadow: rgba(42, 24, 72, .1)}[data-theme=sky]{--bg: #e8f4ff;--bg-2: #cfe8ff;--surface: #f5faff;--line: #90c8f0;--ink: #0a2848;--muted: #3a6080;--high: #0a8a4a;--medium: #c48a14;--low: #e85d3a;--critical: #c0392b;--accent: #0077ff;--rail-from: #cfe8ff;--rail-to: #b8dcff;--rail-active: #a8d4ff;--btn: #f5faff;--btn-line: #70b0e0;--btn-primary: #cfe8ff;--btn-primary-line: #0077ff;--node-bg: #f5faff;--node-line: #70b0e0;--graph-bg: #e8f4ff;--graph-grid: rgba(0, 119, 255, .12);--edge-cheap: #80b0d0;--edge-expensive: #e85d3a;--edge-critical: #c0392b;--shadow: rgba(10, 40, 72, .1)}[data-theme=coral]{--bg: #fff1ee;--bg-2: #ffddd6;--surface: #fff8f6;--line: #f0b0a4;--ink: #3a1814;--muted: #8a5048;--high: #0d9488;--medium: #d48a14;--low: #e85d4a;--critical: #c0392b;--accent: #0d9488;--rail-from: #ffddd6;--rail-to: #ffd0c6;--rail-active: #ffc4b8;--btn: #fff8f6;--btn-line: #e89888;--btn-primary: #d4f4ee;--btn-primary-line: #0d9488;--node-bg: #fff8f6;--node-line: #e89888;--graph-bg: #fff1ee;--graph-grid: rgba(13, 148, 136, .14);--edge-cheap: #d4a098;--edge-expensive: #e85d4a;--edge-critical: #c0392b;--shadow: rgba(58, 24, 20, .1)}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}:root{--radius: 6px;--radius-lg: 10px;--control-h: 32px;--font: "IBM Plex Sans", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;--mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;--focus-ring: 0 0 0 2px var(--bg), 0 0 0 4px var(--accent);--space: 8px}body{background:var(--bg);color:var(--ink);font-family:var(--font);font-size:13px;line-height:1.45;-webkit-font-smoothing:antialiased}button,input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,a:focus-visible,summary:focus-visible{outline:none;box-shadow:var(--focus-ring)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.skip{position:absolute;left:12px;top:-40px;z-index:50;background:var(--surface);color:var(--ink);border:1px solid var(--accent);border-radius:var(--radius);padding:8px 12px}.skip:focus{top:12px}.app{display:grid;grid-template-columns:232px 1fr;height:100%}.rail{border-right:1px solid var(--line);background:linear-gradient(180deg,var(--rail-from),var(--rail-to));padding:16px 12px;display:flex;flex-direction:column;gap:2px;min-width:0}.brand{display:flex;flex-direction:column;gap:2px;padding:4px 8px 16px}.brand-mark{font-family:var(--mono);letter-spacing:.16em;font-size:11px;text-transform:uppercase;color:var(--accent);font-weight:600}.brand-sub{font-size:11px;color:var(--muted)}.nav-item{display:flex;align-items:center;gap:10px;background:transparent;border:0;text-align:left;padding:8px 10px;border-radius:var(--radius);color:var(--muted);cursor:pointer;width:100%}.nav-item:hover{background:color-mix(in srgb,var(--rail-active) 70%,transparent);color:var(--ink)}.nav-item.active{background:var(--rail-active);color:var(--ink);font-weight:500}.nav-item svg{flex-shrink:0}.theme-pick{margin-top:14px;display:grid;gap:4px;padding:0 2px}.theme-pick label{font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);font-weight:500}.theme-pick select,.field select,.field input,.topbar input,.topbar select,.settings input,.settings select,.explorer-path input{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:0 10px;height:var(--control-h);width:100%}.rail-foot{margin-top:auto;padding:12px 8px 4px;border-top:1px solid var(--line);display:grid;gap:6px}.kbd-hint{font-size:11px;color:var(--muted)}kbd{font-family:var(--mono);font-size:10px;border:1px solid var(--line);border-radius:4px;padding:0 4px;background:var(--surface)}.main{display:flex;flex-direction:column;min-width:0;min-height:0;position:relative;background:var(--bg)}.progress{position:absolute;top:0;left:0;right:0;height:2px;overflow:hidden;z-index:30;background:color-mix(in srgb,var(--accent) 20%,transparent)}.progress i{display:block;height:100%;width:32%;background:var(--accent);animation:indeterminate 1.1s ease-in-out infinite}@keyframes indeterminate{0%{transform:translate(-120%)}to{transform:translate(400%)}}.topbar{display:flex;gap:10px;align-items:flex-end;padding:10px 16px;border-bottom:1px solid var(--line);background:var(--bg-2);flex-wrap:wrap}.field{display:grid;gap:4px;min-width:0}.field>span{font-size:11px;color:var(--muted);font-weight:500}.field.path{flex:1;min-width:180px}.field.ref{width:188px;flex:0 0 188px}.field.workspace{width:180px;flex:0 0 180px}.path-row,.combo-row{display:flex;min-width:0}.path-row input,.combo-row input{flex:1;min-width:0}.combo{position:relative;min-width:0}.combo-row input{border-top-right-radius:0;border-bottom-right-radius:0}.topbar .icon-btn{width:var(--control-h);padding:0;flex:0 0 var(--control-h)}.combo-toggle{border-top-left-radius:0;border-bottom-left-radius:0;border-left:0}.combo-menu{position:absolute;top:calc(100% + 4px);right:0;left:auto;min-width:340px;max-width:min(480px,70vw);max-height:360px;overflow:auto;z-index:40;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:0 12px 32px var(--shadow);padding:6px 0}.combo-heading{font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);font-weight:600;padding:8px 12px 4px}.combo-menu .combo-option{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;text-align:left;background:transparent;border:0;border-radius:0;height:auto;padding:6px 12px;color:var(--ink);cursor:pointer}.combo-menu .combo-option:hover,.combo-menu .combo-option.active{background:var(--rail-active)}.combo-label{font-family:var(--mono);font-size:12px}.combo-detail{color:var(--muted);font-size:12px;line-height:1.35;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.combo-empty{padding:10px 12px}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:color-mix(in srgb,var(--bg) 72%,transparent);display:grid;place-items:center;padding:24px}.modal{width:min(720px,100%);max-height:min(640px,90vh);background:var(--bg-2);border:1px solid var(--line);border-radius:var(--radius-lg);box-shadow:0 16px 48px var(--shadow);display:flex;flex-direction:column;overflow:hidden}.modal-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:14px 16px 10px;border-bottom:1px solid var(--line)}.modal-head h2{font-size:15px}.modal-head .muted{margin:4px 0 0}.explorer-path{display:flex;gap:8px;padding:12px 16px;border-bottom:1px solid var(--line)}.explorer-path input{flex:1;min-width:0}.explorer-list{flex:1;overflow:auto;padding:8px;min-height:220px}.explorer-row{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:transparent;border:0;border-radius:var(--radius);padding:8px 10px;color:var(--ink);cursor:pointer;height:auto}.explorer-row:hover,.explorer-row.active{background:var(--rail-active)}.explorer-name{min-width:0;overflow:hidden;text-overflow:ellipsis}.git-badge{margin-left:auto;margin-bottom:0}.explorer-empty{padding:18px 10px}.modal-foot{display:flex;align-items:center;gap:12px;padding:12px 16px;border-top:1px solid var(--line)}.explorer-current{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--mono);font-size:12px}.topbar input,.topbar select{min-width:0}.topbar-actions{display:flex;gap:8px;margin-left:auto;align-items:center;padding-bottom:0}.btn,.topbar button{background:var(--btn);border:1px solid var(--btn-line);border-radius:var(--radius);height:var(--control-h);padding:0 12px;cursor:pointer;font-weight:500;display:inline-flex;align-items:center;justify-content:center;gap:6px;white-space:nowrap}.btn:hover,.topbar button:hover{filter:brightness(1.08)}.btn:disabled,.topbar button:disabled{opacity:.55;cursor:not-allowed;filter:none}.btn.primary{background:var(--btn-primary);border-color:var(--btn-primary-line)}.btn.ghost{background:transparent}.alerts{display:grid;gap:8px;padding:10px 16px 0}.alerts:empty{display:none;padding:0}.stage{flex:1;min-height:0;display:flex;flex-direction:column}.content{flex:1;min-height:0;display:grid;grid-template-columns:minmax(340px,420px) 1fr}.brief{overflow:auto;border-right:1px solid var(--line);padding:16px 18px 24px;background:radial-gradient(circle at 0 0,color-mix(in srgb,var(--accent) 8%,transparent),transparent 42%),var(--bg)}.graph-wrap{position:relative;min-height:0;display:flex;flex-direction:column}.impact-graph{flex:1;min-height:0;position:relative;display:flex;flex-direction:column}.graph-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:8px 14px;border-bottom:1px solid var(--line);background:var(--bg-2)}.graph-count{margin-left:auto;font-size:11px}.chip-btn{background:var(--surface);border:1px solid var(--line);border-radius:999px;padding:4px 12px;color:var(--muted);cursor:pointer;height:26px}.chip-btn:hover{color:var(--ink)}.chip-btn.active{background:var(--rail-active);color:var(--ink)}.chip-btn:disabled{opacity:.45;cursor:not-allowed}.graph-stage{flex:1;min-height:0;position:relative;display:flex;flex-direction:column}.graph-stage .react-flow,.graph-3d,.graph-3d-host,.graph-3d-canvas-host{flex:1;width:100%;height:100%;min-height:280px}.graph-3d{position:relative;background:var(--graph-bg);display:flex;flex-direction:column}.graph-3d-host{position:relative;min-height:0;display:flex;flex-direction:column}.graph-3d-canvas-host{position:relative;min-height:0}.graph-3d canvas{display:block;width:100%;height:100%}.graph-3d-tip{position:absolute;pointer-events:none;z-index:2;max-width:320px;padding:6px 8px;border-radius:var(--radius);background:var(--surface);border:1px solid var(--line);color:var(--ink);font-size:11px;line-height:1.35;box-shadow:0 8px 24px var(--shadow)}.graph-3d-tip .t{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.graph-3d-tip .n{font-weight:600}.graph-3d-hint{position:absolute;left:10px;bottom:10px;z-index:2;margin:0;font-size:11px;color:var(--muted);max-width:min(420px,calc(100% - 24px));pointer-events:none}.graph-wrap .react-flow{background-color:var(--graph-bg);background-image:linear-gradient(var(--graph-grid) 1px,transparent 1px),linear-gradient(90deg,var(--graph-grid) 1px,transparent 1px);background-size:24px 24px}.react-flow__minimap{background:var(--graph-bg)!important;border:1px solid var(--line)!important;border-radius:var(--radius);overflow:hidden;box-shadow:0 8px 24px var(--shadow)}.react-flow__minimap-node{fill:var(--muted);stroke:none}.react-flow__minimap-node.selected{fill:var(--accent)}.react-flow__minimap-mask{fill:#00000073!important;stroke:var(--accent)!important}.react-flow__controls{box-shadow:none!important}.react-flow__controls-button{background:var(--surface)!important;border-bottom:1px solid var(--line)!important;fill:var(--ink)!important}h1{font-size:18px;margin:0 0 6px;font-weight:600}h2{font-size:13px;margin:0;font-weight:600}.merge-box{border:1px solid var(--line);background:var(--surface);border-radius:var(--radius-lg);padding:12px 14px;margin-bottom:12px}.merge-box.high{border-color:color-mix(in srgb,var(--high) 55%,var(--line))}.merge-box.medium{border-color:color-mix(in srgb,var(--medium) 55%,var(--line))}.merge-box.low{border-color:color-mix(in srgb,var(--low) 55%,var(--line))}.level{font-family:var(--mono);font-weight:600;font-size:14px}.level.high{color:var(--high)}.level.medium{color:var(--medium)}.level.low{color:var(--low)}.merge-title{margin-top:4px;font-size:13px;color:var(--ink)}.reasons{margin:10px 0 0;padding:0 0 0 18px;color:var(--muted)}.reasons li{margin:0 0 4px}.metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:0 0 14px}.metric{border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);padding:8px 10px}.metric .n{font-family:var(--mono);font-size:16px;font-weight:600;font-variant-numeric:tabular-nums}.metric .l{font-size:11px;color:var(--muted);margin-top:2px}.section{border-top:1px solid var(--line);padding:8px 0 4px}.section>summary{cursor:pointer;list-style:none;display:flex;align-items:center;justify-content:space-between;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.07em;font-weight:600;padding:6px 0}.section>summary::-webkit-details-marker{display:none}.section>summary .count{font-family:var(--mono);letter-spacing:0;text-transform:none;border:1px solid var(--line);border-radius:999px;padding:0 7px;height:18px;display:inline-flex;align-items:center;font-size:11px}.kicker{color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.08em;margin:16px 0 6px;font-weight:600}.chip{display:inline-flex;align-items:center;font-size:11px;padding:2px 8px;border-radius:999px;border:1px solid var(--line);margin:0 6px 6px 0;color:var(--muted);background:var(--surface)}.chip.blocker{color:var(--low);border-color:var(--low)}.chip.warning{color:var(--medium);border-color:var(--medium)}.chip.strong{color:var(--low);border-color:var(--low)}.chip.worth_exploring{color:var(--medium);border-color:var(--medium)}.chip.speculative{color:var(--muted);border-color:var(--line)}.chip.open{color:var(--high);border-color:color-mix(in srgb,var(--high) 50%,var(--line))}.file{font-family:var(--mono);font-size:12px;color:var(--accent)}.read-item,.finding,.residual{padding:8px 0;border-bottom:1px solid color-mix(in srgb,var(--line) 70%,transparent)}.read-item:last-child,.finding:last-child{border-bottom:0}.read-item .why{color:var(--muted);font-size:12px;margin-top:2px}.muted{color:var(--muted);font-size:13px;line-height:1.45}.error{color:var(--low);padding:8px 12px;border:1px solid var(--low);background:color-mix(in srgb,var(--low) 10%,var(--surface));border-radius:var(--radius);display:flex;justify-content:space-between;gap:12px;align-items:flex-start}.banner{padding:8px 12px;border-radius:var(--radius);border:1px solid var(--line);background:var(--surface);font-size:13px;line-height:1.45;display:flex;justify-content:space-between;gap:12px;align-items:flex-start}.banner.warn{border-color:var(--medium);color:var(--medium)}.banner.stale{border-color:var(--low);color:var(--low)}.banner .dismiss{background:transparent;border:0;color:inherit;cursor:pointer;height:auto;padding:0 2px;opacity:.7}.empty{padding:24px 8px;color:var(--muted);font-size:13px;line-height:1.55}.empty h2{font-size:16px;color:var(--ink);margin-bottom:8px}.empty ol{margin:12px 0 0 18px;padding:0}.empty code,code{font-family:var(--mono);font-size:12px;color:var(--accent)}.btn-row{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.pr-list{padding:16px;overflow:auto}.pr-toolbar{display:flex;gap:8px;align-items:flex-end;margin-bottom:14px}.pr-toolbar .field{flex:1}.pr-toolbar .field.provider{flex:0 0 140px}.scm-count{margin:0 0 12px;font-size:12px}.scm-login{display:flex;justify-content:space-between;gap:12px;align-items:center;padding:10px 0;border-top:1px solid var(--line)}.scm-login:first-of-type{border-top:0;padding-top:0}.scm-login .btn-row{margin-top:0}.scm-login p{margin:2px 0 0}.oauth-code{font-size:13px;margin:0}.oauth-code code{font-size:14px;letter-spacing:.08em}.pr{border:1px solid var(--line);background:var(--surface);padding:12px 14px;border-radius:var(--radius-lg);margin-bottom:10px}.pr h3{margin:0 0 4px;font-size:14px;font-weight:600}.pr-meta{display:flex;flex-wrap:wrap;gap:8px 12px;align-items:center;margin:6px 0 10px}.pr-actions{display:flex;gap:8px;align-items:center}.settings{padding:24px;max-width:760px;overflow:auto;display:grid;gap:16px}.settings-card{border:1px solid var(--line);background:var(--surface);border-radius:var(--radius-lg);padding:16px;display:grid;gap:8px}.settings-card h2{font-size:14px;margin-bottom:2px}.settings label{font-size:12px;color:var(--muted);font-weight:500}.theme-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:8px}.theme-swatch{border:1px solid var(--line);background:var(--bg);color:var(--ink);border-radius:var(--radius);padding:10px;text-align:left;cursor:pointer;height:auto;box-shadow:0 1px 8px var(--shadow)}.theme-swatch.active{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent),0 1px 8px var(--shadow)}.theme-swatch .swatch-bar{height:6px;border-radius:3px;margin-bottom:8px;background:linear-gradient(90deg,var(--accent),var(--high),var(--medium),var(--low))}.theme-swatch .name{font-size:13px;font-weight:600}.theme-swatch .group{font-size:11px;color:var(--muted)}.headline{white-space:pre-wrap;font-family:var(--mono);font-size:12px;color:var(--muted);margin:8px 0 0}.graph-modes{display:flex;gap:8px;align-items:center;padding:8px 14px;border-bottom:1px solid var(--line);background:var(--bg-2)}.seg{display:inline-flex;border:1px solid var(--line);border-radius:999px;padding:2px;background:var(--surface)}.seg button,.graph-modes button{background:transparent;border:0;border-radius:999px;padding:4px 12px;color:var(--muted);cursor:pointer;height:26px}.seg button.active,.graph-modes button.active{background:var(--rail-active);color:var(--ink)}.legend{margin-left:auto;display:flex;gap:12px;color:var(--muted);font-size:11px}.legend i{display:inline-block;width:14px;height:2px;margin-right:6px;vertical-align:middle;background:var(--edge-cheap)}.legend i.exp{background:var(--edge-expensive)}.legend i.crit{background:var(--edge-critical);height:3px}.legend i.dash{border-top:2px dashed var(--muted);background:none;height:0}.inspector{position:absolute;top:12px;right:12px;z-index:5;width:300px;max-width:calc(100% - 24px);max-height:calc(100% - 24px);overflow-x:hidden;overflow-y:auto;overflow-wrap:break-word;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-lg);padding:10px 12px;box-shadow:0 8px 24px var(--shadow);font-size:12px}.inspector .t{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em}.inspector .n,.inspector .file,.inspector .muted{overflow-wrap:break-word}.inspector .n{font-weight:600;margin:4px 0}.inspector-head{display:flex;align-items:flex-start;gap:8px}.inspector-roles{display:flex;flex-wrap:wrap;justify-content:flex-end;flex:1;gap:4px}.inspector-chip{font-size:10px;text-transform:uppercase;letter-spacing:.04em;padding:1px 6px;border-radius:999px;border:1px solid var(--line);color:var(--muted);white-space:nowrap}.inspector-close{flex:0 0 auto;width:24px;height:24px;padding:0;border:1px solid var(--line);border-radius:var(--radius);background:transparent;color:var(--muted);font-size:16px;line-height:1;cursor:pointer}.inspector-close:hover{color:var(--ink)}.inspector-purpose{margin:6px 0 8px;color:var(--ink);font-size:12px;line-height:1.4}.inspector-layer{margin-top:4px;font-size:11px}.inspector-facts{margin:10px 0 0;padding-top:8px;border-top:1px solid var(--line)}.inspector-fact{display:grid;grid-template-columns:minmax(64px,92px) minmax(0,1fr);gap:8px;padding:3px 0;align-items:start}.inspector-fact dt{color:var(--muted);font-size:11px;margin:0}.inspector-fact dd{margin:0;overflow-wrap:break-word}.inspector-section{margin-top:10px;padding-top:8px;border-top:1px solid var(--line)}.inspector-section h3{margin:0 0 6px;display:flex;align-items:center;justify-content:space-between;color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.07em;font-weight:600}.inspector-section .count{font-family:var(--mono);letter-spacing:0;text-transform:none;border:1px solid var(--line);border-radius:999px;padding:0 7px;height:18px;display:inline-flex;align-items:center;font-size:11px}.inspector-section ul{list-style:none;margin:0;padding:0}.inspector-section li{padding:4px 0;border-bottom:1px solid color-mix(in srgb,var(--line) 70%,transparent)}.inspector-section li:last-child{border-bottom:0}.inspector-link-name{display:block;font-weight:600;overflow-wrap:break-word}.inspector-link-meta{display:block;color:var(--muted);font-size:11px}.lp-node{padding:8px 10px;border-radius:var(--radius);border:1px solid var(--node-line);background:var(--node-bg);width:180px;max-width:100%;height:56px;box-sizing:border-box;box-shadow:0 0 0 1px var(--shadow);overflow:visible;position:relative}.lp-node .t{font-size:10px;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}.lp-node .n{font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lp-node.selected{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent)}.react-flow__node-load .react-flow__handle{width:8px;height:8px;border:none;background:transparent;opacity:0}.type-table{width:100%;border-collapse:collapse;font-size:12px}.type-table td{padding:3px 0}.type-table td:last-child{text-align:right;font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--muted)}@media(prefers-reduced-motion:reduce){.progress i{animation:none;width:100%}*{scroll-behavior:auto!important}}@media(max-width:960px){.app{grid-template-columns:56px 1fr}.brand-sub,.nav-item span,.theme-pick,.kbd-hint,.rail-foot .muted{display:none}.nav-item{justify-content:center;padding:10px}.content{grid-template-columns:1fr}.brief{border-right:0;border-bottom:1px solid var(--line);max-height:42vh}} diff --git a/src/loadpath/static/assets/index-CEZTl1rC.js b/src/loadpath/static/assets/index-CEZTl1rC.js new file mode 100644 index 0000000..029e199 --- /dev/null +++ b/src/loadpath/static/assets/index-CEZTl1rC.js @@ -0,0 +1,62 @@ +(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))l(a);new MutationObserver(a=>{for(const u of a)if(u.type==="childList")for(const d of u.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&l(d)}).observe(document,{childList:!0,subtree:!0});function o(a){const u={};return a.integrity&&(u.integrity=a.integrity),a.referrerPolicy&&(u.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?u.credentials="include":a.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function l(a){if(a.ep)return;a.ep=!0;const u=o(a);fetch(a.href,u)}})();function xp(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var wu={exports:{}},uo={},_u={exports:{}},Ie={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Hf;function Qy(){if(Hf)return Ie;Hf=1;var t=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),u=Symbol.for("react.provider"),d=Symbol.for("react.context"),f=Symbol.for("react.forward_ref"),g=Symbol.for("react.suspense"),y=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),x=Symbol.iterator;function v(M){return M===null||typeof M!="object"?null:(M=x&&M[x]||M["@@iterator"],typeof M=="function"?M:null)}var _={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},S=Object.assign,C={};function E(M,L,ne){this.props=M,this.context=L,this.refs=C,this.updater=ne||_}E.prototype.isReactComponent={},E.prototype.setState=function(M,L){if(typeof M!="object"&&typeof M!="function"&&M!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,M,L,"setState")},E.prototype.forceUpdate=function(M){this.updater.enqueueForceUpdate(this,M,"forceUpdate")};function N(){}N.prototype=E.prototype;function I(M,L,ne){this.props=M,this.context=L,this.refs=C,this.updater=ne||_}var k=I.prototype=new N;k.constructor=I,S(k,E.prototype),k.isPureReactComponent=!0;var j=Array.isArray,R=Object.prototype.hasOwnProperty,T={current:null},B={key:!0,ref:!0,__self:!0,__source:!0};function G(M,L,ne){var re,ce={},fe=null,de=null;if(L!=null)for(re in L.ref!==void 0&&(de=L.ref),L.key!==void 0&&(fe=""+L.key),L)R.call(L,re)&&!B.hasOwnProperty(re)&&(ce[re]=L[re]);var K=arguments.length-2;if(K===1)ce.children=ne;else if(1>>1,L=D[M];if(0>>1;Ma(ce,H))fea(de,ce)?(D[M]=de,D[fe]=H,M=fe):(D[M]=ce,D[re]=H,M=re);else if(fea(de,H))D[M]=de,D[fe]=H,M=fe;else break e}}return A}function a(D,A){var H=D.sortIndex-A.sortIndex;return H!==0?H:D.id-A.id}if(typeof performance=="object"&&typeof performance.now=="function"){var u=performance;t.unstable_now=function(){return u.now()}}else{var d=Date,f=d.now();t.unstable_now=function(){return d.now()-f}}var g=[],y=[],m=1,x=null,v=3,_=!1,S=!1,C=!1,E=typeof setTimeout=="function"?setTimeout:null,N=typeof clearTimeout=="function"?clearTimeout:null,I=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function k(D){for(var A=o(y);A!==null;){if(A.callback===null)l(y);else if(A.startTime<=D)l(y),A.sortIndex=A.expirationTime,r(g,A);else break;A=o(y)}}function j(D){if(C=!1,k(D),!S)if(o(g)!==null)S=!0,V(R);else{var A=o(y);A!==null&&W(j,A.startTime-D)}}function R(D,A){S=!1,C&&(C=!1,N(G),G=-1),_=!0;var H=v;try{for(k(A),x=o(g);x!==null&&(!(x.expirationTime>A)||D&&!q());){var M=x.callback;if(typeof M=="function"){x.callback=null,v=x.priorityLevel;var L=M(x.expirationTime<=A);A=t.unstable_now(),typeof L=="function"?x.callback=L:x===o(g)&&l(g),k(A)}else l(g);x=o(g)}if(x!==null)var ne=!0;else{var re=o(y);re!==null&&W(j,re.startTime-A),ne=!1}return ne}finally{x=null,v=H,_=!1}}var T=!1,B=null,G=-1,U=5,ee=-1;function q(){return!(t.unstable_now()-eeD||125M?(D.sortIndex=H,r(y,D),o(g)===null&&D===o(y)&&(C?(N(G),G=-1):C=!0,W(j,H-M))):(D.sortIndex=L,r(g,D),S||_||(S=!0,V(R))),D},t.unstable_shouldYield=q,t.unstable_wrapCallback=function(D){var A=v;return function(){var H=v;v=A;try{return D.apply(this,arguments)}finally{v=H}}}})(Eu)),Eu}var Yf;function e0(){return Yf||(Yf=1,ku.exports=Jy()),ku.exports}/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Xf;function t0(){if(Xf)return Ct;Xf=1;var t=bo(),r=e0();function o(e){for(var n="https://reactjs.org/docs/error-decoder.html?invariant="+e,i=1;i"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),g=Object.prototype.hasOwnProperty,y=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,m={},x={};function v(e){return g.call(x,e)?!0:g.call(m,e)?!1:y.test(e)?x[e]=!0:(m[e]=!0,!1)}function _(e,n,i,s){if(i!==null&&i.type===0)return!1;switch(typeof n){case"function":case"symbol":return!0;case"boolean":return s?!1:i!==null?!i.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function S(e,n,i,s){if(n===null||typeof n>"u"||_(e,n,i,s))return!0;if(s)return!1;if(i!==null)switch(i.type){case 3:return!n;case 4:return n===!1;case 5:return isNaN(n);case 6:return isNaN(n)||1>n}return!1}function C(e,n,i,s,c,h,w){this.acceptsBooleans=n===2||n===3||n===4,this.attributeName=s,this.attributeNamespace=c,this.mustUseProperty=i,this.propertyName=e,this.type=n,this.sanitizeURL=h,this.removeEmptyString=w}var E={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){E[e]=new C(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var n=e[0];E[n]=new C(n,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){E[e]=new C(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){E[e]=new C(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){E[e]=new C(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){E[e]=new C(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){E[e]=new C(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){E[e]=new C(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){E[e]=new C(e,5,!1,e.toLowerCase(),null,!1,!1)});var N=/[\-:]([a-z])/g;function I(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var n=e.replace(N,I);E[n]=new C(n,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var n=e.replace(N,I);E[n]=new C(n,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var n=e.replace(N,I);E[n]=new C(n,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){E[e]=new C(e,1,!1,e.toLowerCase(),null,!1,!1)}),E.xlinkHref=new C("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){E[e]=new C(e,1,!1,e.toLowerCase(),null,!0,!0)});function k(e,n,i,s){var c=E.hasOwnProperty(n)?E[n]:null;(c!==null?c.type!==0:s||!(2P||c[w]!==h[P]){var z=` +`+c[w].replace(" at new "," at ");return e.displayName&&z.includes("")&&(z=z.replace("",e.displayName)),z}while(1<=w&&0<=P);break}}}finally{ne=!1,Error.prepareStackTrace=i}return(e=e?e.displayName||e.name:"")?L(e):""}function ce(e){switch(e.tag){case 5:return L(e.type);case 16:return L("Lazy");case 13:return L("Suspense");case 19:return L("SuspenseList");case 0:case 2:case 15:return e=re(e.type,!1),e;case 11:return e=re(e.type.render,!1),e;case 1:return e=re(e.type,!0),e;default:return""}}function fe(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case B:return"Fragment";case T:return"Portal";case U:return"Profiler";case G:return"StrictMode";case J:return"Suspense";case b:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case q:return(e.displayName||"Context")+".Consumer";case ee:return(e._context.displayName||"Context")+".Provider";case te:var n=e.render;return e=e.displayName,e||(e=n.displayName||n.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Y:return n=e.displayName||null,n!==null?n:fe(e.type)||"Memo";case V:n=e._payload,e=e._init;try{return fe(e(n))}catch{}}return null}function de(e){var n=e.type;switch(e.tag){case 24:return"Cache";case 9:return(n.displayName||"Context")+".Consumer";case 10:return(n._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=n.render,e=e.displayName||e.name||"",n.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return n;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return fe(n);case 8:return n===G?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof n=="function")return n.displayName||n.name||null;if(typeof n=="string")return n}return null}function K(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function se(e){var n=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(n==="checkbox"||n==="radio")}function pe(e){var n=se(e)?"checked":"value",i=Object.getOwnPropertyDescriptor(e.constructor.prototype,n),s=""+e[n];if(!e.hasOwnProperty(n)&&typeof i<"u"&&typeof i.get=="function"&&typeof i.set=="function"){var c=i.get,h=i.set;return Object.defineProperty(e,n,{configurable:!0,get:function(){return c.call(this)},set:function(w){s=""+w,h.call(this,w)}}),Object.defineProperty(e,n,{enumerable:i.enumerable}),{getValue:function(){return s},setValue:function(w){s=""+w},stopTracking:function(){e._valueTracker=null,delete e[n]}}}}function _e(e){e._valueTracker||(e._valueTracker=pe(e))}function me(e){if(!e)return!1;var n=e._valueTracker;if(!n)return!0;var i=n.getValue(),s="";return e&&(s=se(e)?e.checked?"true":"false":e.value),e=s,e!==i?(n.setValue(e),!0):!1}function ye(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ne(e,n){var i=n.checked;return H({},n,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:i??e._wrapperState.initialChecked})}function Pe(e,n){var i=n.defaultValue==null?"":n.defaultValue,s=n.checked!=null?n.checked:n.defaultChecked;i=K(n.value!=null?n.value:i),e._wrapperState={initialChecked:s,initialValue:i,controlled:n.type==="checkbox"||n.type==="radio"?n.checked!=null:n.value!=null}}function je(e,n){n=n.checked,n!=null&&k(e,"checked",n,!1)}function Me(e,n){je(e,n);var i=K(n.value),s=n.type;if(i!=null)s==="number"?(i===0&&e.value===""||e.value!=i)&&(e.value=""+i):e.value!==""+i&&(e.value=""+i);else if(s==="submit"||s==="reset"){e.removeAttribute("value");return}n.hasOwnProperty("value")?Ge(e,n.type,i):n.hasOwnProperty("defaultValue")&&Ge(e,n.type,K(n.defaultValue)),n.checked==null&&n.defaultChecked!=null&&(e.defaultChecked=!!n.defaultChecked)}function tt(e,n,i){if(n.hasOwnProperty("value")||n.hasOwnProperty("defaultValue")){var s=n.type;if(!(s!=="submit"&&s!=="reset"||n.value!==void 0&&n.value!==null))return;n=""+e._wrapperState.initialValue,i||n===e.value||(e.value=n),e.defaultValue=n}i=e.name,i!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,i!==""&&(e.name=i)}function Ge(e,n,i){(n!=="number"||ye(e.ownerDocument)!==e)&&(i==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+i&&(e.defaultValue=""+i))}var nt=Array.isArray;function Ke(e,n,i,s){if(e=e.options,n){n={};for(var c=0;c"+n.valueOf().toString()+"",n=wt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;n.firstChild;)e.appendChild(n.firstChild)}});function Ut(e,n){if(n){var i=e.firstChild;if(i&&i===e.lastChild&&i.nodeType===3){i.nodeValue=n;return}}e.textContent=n}var gn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Ni=["Webkit","ms","Moz","O"];Object.keys(gn).forEach(function(e){Ni.forEach(function(n){n=n+e.charAt(0).toUpperCase()+e.substring(1),gn[n]=gn[e]})});function $r(e,n,i){return n==null||typeof n=="boolean"||n===""?"":i||typeof n!="number"||n===0||gn.hasOwnProperty(e)&&gn[e]?(""+n).trim():n+"px"}function ir(e,n){e=e.style;for(var i in n)if(n.hasOwnProperty(i)){var s=i.indexOf("--")===0,c=$r(i,n[i],s);i==="float"&&(i="cssFloat"),s?e.setProperty(i,c):e[i]=c}}var Ci=H({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function or(e,n){if(n){if(Ci[e]&&(n.children!=null||n.dangerouslySetInnerHTML!=null))throw Error(o(137,e));if(n.dangerouslySetInnerHTML!=null){if(n.children!=null)throw Error(o(60));if(typeof n.dangerouslySetInnerHTML!="object"||!("__html"in n.dangerouslySetInnerHTML))throw Error(o(61))}if(n.style!=null&&typeof n.style!="object")throw Error(o(62))}}function Pn(e,n){if(e.indexOf("-")===-1)return typeof n.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var mn=null;function In(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var sr=null,on=null,sn=null;function lr(e){if(e=Gi(e)){if(typeof sr!="function")throw Error(o(280));var n=e.stateNode;n&&(n=os(n),sr(e.stateNode,e.type,n))}}function ar(e){on?sn?sn.push(e):sn=[e]:on=e}function ur(){if(on){var e=on,n=sn;if(sn=on=null,lr(e),n)for(e=0;e>>=0,e===0?32:31-(Ol(e)/Fl|0)|0}var Br=64,Vr=4194304;function hr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function yn(e,n){var i=e.pendingLanes;if(i===0)return 0;var s=0,c=e.suspendedLanes,h=e.pingedLanes,w=i&268435455;if(w!==0){var P=w&~c;P!==0?s=hr(P):(h&=w,h!==0&&(s=hr(h)))}else w=i&~c,w!==0?s=hr(w):h!==0&&(s=hr(h));if(s===0)return 0;if(n!==0&&n!==s&&(n&c)===0&&(c=s&-s,h=n&-n,c>=h||c===16&&(h&4194240)!==0))return n;if((s&4)!==0&&(s|=i&16),n=e.entangledLanes,n!==0)for(e=e.entanglements,n&=s;0i;i++)n.push(e);return n}function gr(e,n,i){e.pendingLanes|=n,n!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,n=31-Pt(n),e[n]=i}function Vl(e,n){var i=e.pendingLanes&~n;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=n,e.mutableReadLanes&=n,e.entangledLanes&=n,n=e.entanglements;var s=e.eventTimes;for(e=e.expirationTimes;0=Oi),Rc=" ",Lc=!1;function zc(e,n){switch(e){case"keyup":return Um.indexOf(n.keyCode)!==-1;case"keydown":return n.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ac(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Xr=!1;function Ym(e,n){switch(e){case"compositionend":return Ac(n);case"keypress":return n.which!==32?null:(Lc=!0,Rc);case"textInput":return e=n.data,e===Rc&&Lc?null:e;default:return null}}function Xm(e,n){if(Xr)return e==="compositionend"||!ea&&zc(e,n)?(e=jc(),Go=Gl=$n=null,Xr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(n.ctrlKey||n.altKey||n.metaKey)||n.ctrlKey&&n.altKey){if(n.char&&1=n)return{node:i,offset:n-e};e=s}e:{for(;i;){if(i.nextSibling){i=i.nextSibling;break e}i=i.parentNode}i=void 0}i=Vc(i)}}function Wc(e,n){return e&&n?e===n?!0:e&&e.nodeType===3?!1:n&&n.nodeType===3?Wc(e,n.parentNode):"contains"in e?e.contains(n):e.compareDocumentPosition?!!(e.compareDocumentPosition(n)&16):!1:!1}function Yc(){for(var e=window,n=ye();n instanceof e.HTMLIFrameElement;){try{var i=typeof n.contentWindow.location.href=="string"}catch{i=!1}if(i)e=n.contentWindow;else break;n=ye(e.document)}return n}function ra(e){var n=e&&e.nodeName&&e.nodeName.toLowerCase();return n&&(n==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||n==="textarea"||e.contentEditable==="true")}function ny(e){var n=Yc(),i=e.focusedElem,s=e.selectionRange;if(n!==i&&i&&i.ownerDocument&&Wc(i.ownerDocument.documentElement,i)){if(s!==null&&ra(i)){if(n=s.start,e=s.end,e===void 0&&(e=n),"selectionStart"in i)i.selectionStart=n,i.selectionEnd=Math.min(e,i.value.length);else if(e=(n=i.ownerDocument||document)&&n.defaultView||window,e.getSelection){e=e.getSelection();var c=i.textContent.length,h=Math.min(s.start,c);s=s.end===void 0?h:Math.min(s.end,c),!e.extend&&h>s&&(c=s,s=h,h=c),c=Uc(i,h);var w=Uc(i,s);c&&w&&(e.rangeCount!==1||e.anchorNode!==c.node||e.anchorOffset!==c.offset||e.focusNode!==w.node||e.focusOffset!==w.offset)&&(n=n.createRange(),n.setStart(c.node,c.offset),e.removeAllRanges(),h>s?(e.addRange(n),e.extend(w.node,w.offset)):(n.setEnd(w.node,w.offset),e.addRange(n)))}}for(n=[],e=i;e=e.parentNode;)e.nodeType===1&&n.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof i.focus=="function"&&i.focus(),i=0;i=document.documentMode,Gr=null,ia=null,Vi=null,oa=!1;function Xc(e,n,i){var s=i.window===i?i.document:i.nodeType===9?i:i.ownerDocument;oa||Gr==null||Gr!==ye(s)||(s=Gr,"selectionStart"in s&&ra(s)?s={start:s.selectionStart,end:s.selectionEnd}:(s=(s.ownerDocument&&s.ownerDocument.defaultView||window).getSelection(),s={anchorNode:s.anchorNode,anchorOffset:s.anchorOffset,focusNode:s.focusNode,focusOffset:s.focusOffset}),Vi&&Bi(Vi,s)||(Vi=s,s=ns(ia,"onSelect"),0Jr||(e.current=ya[Jr],ya[Jr]=null,Jr--)}function De(e,n){Jr++,ya[Jr]=e.current,e.current=n}var Bn={},pt=Hn(Bn),_t=Hn(!1),yr=Bn;function ei(e,n){var i=e.type.contextTypes;if(!i)return Bn;var s=e.stateNode;if(s&&s.__reactInternalMemoizedUnmaskedChildContext===n)return s.__reactInternalMemoizedMaskedChildContext;var c={},h;for(h in i)c[h]=n[h];return s&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=n,e.__reactInternalMemoizedMaskedChildContext=c),c}function St(e){return e=e.childContextTypes,e!=null}function ss(){Fe(_t),Fe(pt)}function ad(e,n,i){if(pt.current!==Bn)throw Error(o(168));De(pt,n),De(_t,i)}function ud(e,n,i){var s=e.stateNode;if(n=n.childContextTypes,typeof s.getChildContext!="function")return i;s=s.getChildContext();for(var c in s)if(!(c in n))throw Error(o(108,de(e)||"Unknown",c));return H({},i,s)}function ls(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Bn,yr=pt.current,De(pt,e),De(_t,_t.current),!0}function cd(e,n,i){var s=e.stateNode;if(!s)throw Error(o(169));i?(e=ud(e,n,yr),s.__reactInternalMemoizedMergedChildContext=e,Fe(_t),Fe(pt),De(pt,e)):Fe(_t),De(_t,i)}var xn=null,as=!1,va=!1;function dd(e){xn===null?xn=[e]:xn.push(e)}function py(e){as=!0,dd(e)}function Vn(){if(!va&&xn!==null){va=!0;var e=0,n=ze;try{var i=xn;for(ze=1;e>=w,c-=w,wn=1<<32-Pt(n)+c|i<Ce?(at=Ee,Ee=null):at=Ee.sibling;var Le=ie(X,Ee,Q[Ce],ue);if(Le===null){Ee===null&&(Ee=at);break}e&&Ee&&Le.alternate===null&&n(X,Ee),O=h(Le,O,Ce),ke===null?we=Le:ke.sibling=Le,ke=Le,Ee=at}if(Ce===Q.length)return i(X,Ee),Be&&xr(X,Ce),we;if(Ee===null){for(;CeCe?(at=Ee,Ee=null):at=Ee.sibling;var Zn=ie(X,Ee,Le.value,ue);if(Zn===null){Ee===null&&(Ee=at);break}e&&Ee&&Zn.alternate===null&&n(X,Ee),O=h(Zn,O,Ce),ke===null?we=Zn:ke.sibling=Zn,ke=Zn,Ee=at}if(Le.done)return i(X,Ee),Be&&xr(X,Ce),we;if(Ee===null){for(;!Le.done;Ce++,Le=Q.next())Le=le(X,Le.value,ue),Le!==null&&(O=h(Le,O,Ce),ke===null?we=Le:ke.sibling=Le,ke=Le);return Be&&xr(X,Ce),we}for(Ee=s(X,Ee);!Le.done;Ce++,Le=Q.next())Le=he(Ee,X,Ce,Le.value,ue),Le!==null&&(e&&Le.alternate!==null&&Ee.delete(Le.key===null?Ce:Le.key),O=h(Le,O,Ce),ke===null?we=Le:ke.sibling=Le,ke=Le);return e&&Ee.forEach(function(Gy){return n(X,Gy)}),Be&&xr(X,Ce),we}function qe(X,O,Q,ue){if(typeof Q=="object"&&Q!==null&&Q.type===B&&Q.key===null&&(Q=Q.props.children),typeof Q=="object"&&Q!==null){switch(Q.$$typeof){case R:e:{for(var we=Q.key,ke=O;ke!==null;){if(ke.key===we){if(we=Q.type,we===B){if(ke.tag===7){i(X,ke.sibling),O=c(ke,Q.props.children),O.return=X,X=O;break e}}else if(ke.elementType===we||typeof we=="object"&&we!==null&&we.$$typeof===V&&yd(we)===ke.type){i(X,ke.sibling),O=c(ke,Q.props),O.ref=Qi(X,ke,Q),O.return=X,X=O;break e}i(X,ke);break}else n(X,ke);ke=ke.sibling}Q.type===B?(O=jr(Q.props.children,X.mode,ue,Q.key),O.return=X,X=O):(ue=As(Q.type,Q.key,Q.props,null,X.mode,ue),ue.ref=Qi(X,O,Q),ue.return=X,X=ue)}return w(X);case T:e:{for(ke=Q.key;O!==null;){if(O.key===ke)if(O.tag===4&&O.stateNode.containerInfo===Q.containerInfo&&O.stateNode.implementation===Q.implementation){i(X,O.sibling),O=c(O,Q.children||[]),O.return=X,X=O;break e}else{i(X,O);break}else n(X,O);O=O.sibling}O=gu(Q,X.mode,ue),O.return=X,X=O}return w(X);case V:return ke=Q._init,qe(X,O,ke(Q._payload),ue)}if(nt(Q))return ve(X,O,Q,ue);if(A(Q))return xe(X,O,Q,ue);fs(X,Q)}return typeof Q=="string"&&Q!==""||typeof Q=="number"?(Q=""+Q,O!==null&&O.tag===6?(i(X,O.sibling),O=c(O,Q),O.return=X,X=O):(i(X,O),O=pu(Q,X.mode,ue),O.return=X,X=O),w(X)):i(X,O)}return qe}var ii=vd(!0),xd=vd(!1),hs=Hn(null),ps=null,oi=null,Ea=null;function Na(){Ea=oi=ps=null}function Ca(e){var n=hs.current;Fe(hs),e._currentValue=n}function ja(e,n,i){for(;e!==null;){var s=e.alternate;if((e.childLanes&n)!==n?(e.childLanes|=n,s!==null&&(s.childLanes|=n)):s!==null&&(s.childLanes&n)!==n&&(s.childLanes|=n),e===i)break;e=e.return}}function si(e,n){ps=e,Ea=oi=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&n)!==0&&(kt=!0),e.firstContext=null)}function Ft(e){var n=e._currentValue;if(Ea!==e)if(e={context:e,memoizedValue:n,next:null},oi===null){if(ps===null)throw Error(o(308));oi=e,ps.dependencies={lanes:0,firstContext:e}}else oi=oi.next=e;return n}var wr=null;function ba(e){wr===null?wr=[e]:wr.push(e)}function wd(e,n,i,s){var c=n.interleaved;return c===null?(i.next=i,ba(n)):(i.next=c.next,c.next=i),n.interleaved=i,Sn(e,s)}function Sn(e,n){e.lanes|=n;var i=e.alternate;for(i!==null&&(i.lanes|=n),i=e,e=e.return;e!==null;)e.childLanes|=n,i=e.alternate,i!==null&&(i.childLanes|=n),i=e,e=e.return;return i.tag===3?i.stateNode:null}var Un=!1;function Ma(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function _d(e,n){e=e.updateQueue,n.updateQueue===e&&(n.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function kn(e,n){return{eventTime:e,lane:n,tag:0,payload:null,callback:null,next:null}}function Wn(e,n,i){var s=e.updateQueue;if(s===null)return null;if(s=s.shared,(Te&2)!==0){var c=s.pending;return c===null?n.next=n:(n.next=c.next,c.next=n),s.pending=n,Sn(e,i)}return c=s.interleaved,c===null?(n.next=n,ba(s)):(n.next=c.next,c.next=n),s.interleaved=n,Sn(e,i)}function gs(e,n,i){if(n=n.updateQueue,n!==null&&(n=n.shared,(i&4194240)!==0)){var s=n.lanes;s&=e.pendingLanes,i|=s,n.lanes=i,Ur(e,i)}}function Sd(e,n){var i=e.updateQueue,s=e.alternate;if(s!==null&&(s=s.updateQueue,i===s)){var c=null,h=null;if(i=i.firstBaseUpdate,i!==null){do{var w={eventTime:i.eventTime,lane:i.lane,tag:i.tag,payload:i.payload,callback:i.callback,next:null};h===null?c=h=w:h=h.next=w,i=i.next}while(i!==null);h===null?c=h=n:h=h.next=n}else c=h=n;i={baseState:s.baseState,firstBaseUpdate:c,lastBaseUpdate:h,shared:s.shared,effects:s.effects},e.updateQueue=i;return}e=i.lastBaseUpdate,e===null?i.firstBaseUpdate=n:e.next=n,i.lastBaseUpdate=n}function ms(e,n,i,s){var c=e.updateQueue;Un=!1;var h=c.firstBaseUpdate,w=c.lastBaseUpdate,P=c.shared.pending;if(P!==null){c.shared.pending=null;var z=P,Z=z.next;z.next=null,w===null?h=Z:w.next=Z,w=z;var oe=e.alternate;oe!==null&&(oe=oe.updateQueue,P=oe.lastBaseUpdate,P!==w&&(P===null?oe.firstBaseUpdate=Z:P.next=Z,oe.lastBaseUpdate=z))}if(h!==null){var le=c.baseState;w=0,oe=Z=z=null,P=h;do{var ie=P.lane,he=P.eventTime;if((s&ie)===ie){oe!==null&&(oe=oe.next={eventTime:he,lane:0,tag:P.tag,payload:P.payload,callback:P.callback,next:null});e:{var ve=e,xe=P;switch(ie=n,he=i,xe.tag){case 1:if(ve=xe.payload,typeof ve=="function"){le=ve.call(he,le,ie);break e}le=ve;break e;case 3:ve.flags=ve.flags&-65537|128;case 0:if(ve=xe.payload,ie=typeof ve=="function"?ve.call(he,le,ie):ve,ie==null)break e;le=H({},le,ie);break e;case 2:Un=!0}}P.callback!==null&&P.lane!==0&&(e.flags|=64,ie=c.effects,ie===null?c.effects=[P]:ie.push(P))}else he={eventTime:he,lane:ie,tag:P.tag,payload:P.payload,callback:P.callback,next:null},oe===null?(Z=oe=he,z=le):oe=oe.next=he,w|=ie;if(P=P.next,P===null){if(P=c.shared.pending,P===null)break;ie=P,P=ie.next,ie.next=null,c.lastBaseUpdate=ie,c.shared.pending=null}}while(!0);if(oe===null&&(z=le),c.baseState=z,c.firstBaseUpdate=Z,c.lastBaseUpdate=oe,n=c.shared.interleaved,n!==null){c=n;do w|=c.lane,c=c.next;while(c!==n)}else h===null&&(c.shared.lanes=0);kr|=w,e.lanes=w,e.memoizedState=le}}function kd(e,n,i){if(e=n.effects,n.effects=null,e!==null)for(n=0;ni?i:4,e(!0);var s=La.transition;La.transition={};try{e(!1),n()}finally{ze=i,La.transition=s}}function Bd(){return Ht().memoizedState}function vy(e,n,i){var s=Qn(e);if(i={lane:s,action:i,hasEagerState:!1,eagerState:null,next:null},Vd(e))Ud(n,i);else if(i=wd(e,n,i,s),i!==null){var c=xt();Kt(i,e,s,c),Wd(i,n,s)}}function xy(e,n,i){var s=Qn(e),c={lane:s,action:i,hasEagerState:!1,eagerState:null,next:null};if(Vd(e))Ud(n,c);else{var h=e.alternate;if(e.lanes===0&&(h===null||h.lanes===0)&&(h=n.lastRenderedReducer,h!==null))try{var w=n.lastRenderedState,P=h(w,i);if(c.hasEagerState=!0,c.eagerState=P,Wt(P,w)){var z=n.interleaved;z===null?(c.next=c,ba(n)):(c.next=z.next,z.next=c),n.interleaved=c;return}}catch{}finally{}i=wd(e,n,c,s),i!==null&&(c=xt(),Kt(i,e,s,c),Wd(i,n,s))}}function Vd(e){var n=e.alternate;return e===Ye||n!==null&&n===Ye}function Ud(e,n){Ji=xs=!0;var i=e.pending;i===null?n.next=n:(n.next=i.next,i.next=n),e.pending=n}function Wd(e,n,i){if((i&4194240)!==0){var s=n.lanes;s&=e.pendingLanes,i|=s,n.lanes=i,Ur(e,i)}}var Ss={readContext:Ft,useCallback:gt,useContext:gt,useEffect:gt,useImperativeHandle:gt,useInsertionEffect:gt,useLayoutEffect:gt,useMemo:gt,useReducer:gt,useRef:gt,useState:gt,useDebugValue:gt,useDeferredValue:gt,useTransition:gt,useMutableSource:gt,useSyncExternalStore:gt,useId:gt,unstable_isNewReconciler:!1},wy={readContext:Ft,useCallback:function(e,n){return cn().memoizedState=[e,n===void 0?null:n],e},useContext:Ft,useEffect:Ld,useImperativeHandle:function(e,n,i){return i=i!=null?i.concat([e]):null,ws(4194308,4,Dd.bind(null,n,e),i)},useLayoutEffect:function(e,n){return ws(4194308,4,e,n)},useInsertionEffect:function(e,n){return ws(4,2,e,n)},useMemo:function(e,n){var i=cn();return n=n===void 0?null:n,e=e(),i.memoizedState=[e,n],e},useReducer:function(e,n,i){var s=cn();return n=i!==void 0?i(n):n,s.memoizedState=s.baseState=n,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},s.queue=e,e=e.dispatch=vy.bind(null,Ye,e),[s.memoizedState,e]},useRef:function(e){var n=cn();return e={current:e},n.memoizedState=e},useState:Td,useDebugValue:Ha,useDeferredValue:function(e){return cn().memoizedState=e},useTransition:function(){var e=Td(!1),n=e[0];return e=yy.bind(null,e[1]),cn().memoizedState=e,[n,e]},useMutableSource:function(){},useSyncExternalStore:function(e,n,i){var s=Ye,c=cn();if(Be){if(i===void 0)throw Error(o(407));i=i()}else{if(i=n(),lt===null)throw Error(o(349));(Sr&30)!==0||jd(s,n,i)}c.memoizedState=i;var h={value:i,getSnapshot:n};return c.queue=h,Ld(Md.bind(null,s,h,e),[e]),s.flags|=2048,no(9,bd.bind(null,s,h,i,n),void 0,null),i},useId:function(){var e=cn(),n=lt.identifierPrefix;if(Be){var i=_n,s=wn;i=(s&~(1<<32-Pt(s)-1)).toString(32)+i,n=":"+n+"R"+i,i=eo++,0<\/script>",e=e.removeChild(e.firstChild)):typeof s.is=="string"?e=w.createElement(i,{is:s.is}):(e=w.createElement(i),i==="select"&&(w=e,s.multiple?w.multiple=!0:s.size&&(w.size=s.size))):e=w.createElementNS(e,i),e[an]=n,e[Xi]=s,ff(e,n,!1,!1),n.stateNode=e;e:{switch(w=Pn(i,s),i){case"dialog":Oe("cancel",e),Oe("close",e),c=s;break;case"iframe":case"object":case"embed":Oe("load",e),c=s;break;case"video":case"audio":for(c=0;cdi&&(n.flags|=128,s=!0,ro(h,!1),n.lanes=4194304)}else{if(!s)if(e=ys(w),e!==null){if(n.flags|=128,s=!0,i=e.updateQueue,i!==null&&(n.updateQueue=i,n.flags|=4),ro(h,!0),h.tail===null&&h.tailMode==="hidden"&&!w.alternate&&!Be)return mt(n),null}else 2*Ue()-h.renderingStartTime>di&&i!==1073741824&&(n.flags|=128,s=!0,ro(h,!1),n.lanes=4194304);h.isBackwards?(w.sibling=n.child,n.child=w):(i=h.last,i!==null?i.sibling=w:n.child=w,h.last=w)}return h.tail!==null?(n=h.tail,h.rendering=n,h.tail=n.sibling,h.renderingStartTime=Ue(),n.sibling=null,i=We.current,De(We,s?i&1|2:i&1),n):(mt(n),null);case 22:case 23:return du(),s=n.memoizedState!==null,e!==null&&e.memoizedState!==null!==s&&(n.flags|=8192),s&&(n.mode&1)!==0?(Lt&1073741824)!==0&&(mt(n),n.subtreeFlags&6&&(n.flags|=8192)):mt(n),null;case 24:return null;case 25:return null}throw Error(o(156,n.tag))}function by(e,n){switch(wa(n),n.tag){case 1:return St(n.type)&&ss(),e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 3:return li(),Fe(_t),Fe(pt),Ra(),e=n.flags,(e&65536)!==0&&(e&128)===0?(n.flags=e&-65537|128,n):null;case 5:return Ia(n),null;case 13:if(Fe(We),e=n.memoizedState,e!==null&&e.dehydrated!==null){if(n.alternate===null)throw Error(o(340));ri()}return e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 19:return Fe(We),null;case 4:return li(),null;case 10:return Ca(n.type._context),null;case 22:case 23:return du(),null;case 24:return null;default:return null}}var Cs=!1,yt=!1,My=typeof WeakSet=="function"?WeakSet:Set,ge=null;function ui(e,n){var i=e.ref;if(i!==null)if(typeof i=="function")try{i(null)}catch(s){Qe(e,n,s)}else i.current=null}function Ja(e,n,i){try{i()}catch(s){Qe(e,n,s)}}var gf=!1;function Py(e,n){if(da=Yo,e=Yc(),ra(e)){if("selectionStart"in e)var i={start:e.selectionStart,end:e.selectionEnd};else e:{i=(i=e.ownerDocument)&&i.defaultView||window;var s=i.getSelection&&i.getSelection();if(s&&s.rangeCount!==0){i=s.anchorNode;var c=s.anchorOffset,h=s.focusNode;s=s.focusOffset;try{i.nodeType,h.nodeType}catch{i=null;break e}var w=0,P=-1,z=-1,Z=0,oe=0,le=e,ie=null;t:for(;;){for(var he;le!==i||c!==0&&le.nodeType!==3||(P=w+c),le!==h||s!==0&&le.nodeType!==3||(z=w+s),le.nodeType===3&&(w+=le.nodeValue.length),(he=le.firstChild)!==null;)ie=le,le=he;for(;;){if(le===e)break t;if(ie===i&&++Z===c&&(P=w),ie===h&&++oe===s&&(z=w),(he=le.nextSibling)!==null)break;le=ie,ie=le.parentNode}le=he}i=P===-1||z===-1?null:{start:P,end:z}}else i=null}i=i||{start:0,end:0}}else i=null;for(fa={focusedElem:e,selectionRange:i},Yo=!1,ge=n;ge!==null;)if(n=ge,e=n.child,(n.subtreeFlags&1028)!==0&&e!==null)e.return=n,ge=e;else for(;ge!==null;){n=ge;try{var ve=n.alternate;if((n.flags&1024)!==0)switch(n.tag){case 0:case 11:case 15:break;case 1:if(ve!==null){var xe=ve.memoizedProps,qe=ve.memoizedState,X=n.stateNode,O=X.getSnapshotBeforeUpdate(n.elementType===n.type?xe:Xt(n.type,xe),qe);X.__reactInternalSnapshotBeforeUpdate=O}break;case 3:var Q=n.stateNode.containerInfo;Q.nodeType===1?Q.textContent="":Q.nodeType===9&&Q.documentElement&&Q.removeChild(Q.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(o(163))}}catch(ue){Qe(n,n.return,ue)}if(e=n.sibling,e!==null){e.return=n.return,ge=e;break}ge=n.return}return ve=gf,gf=!1,ve}function io(e,n,i){var s=n.updateQueue;if(s=s!==null?s.lastEffect:null,s!==null){var c=s=s.next;do{if((c.tag&e)===e){var h=c.destroy;c.destroy=void 0,h!==void 0&&Ja(n,i,h)}c=c.next}while(c!==s)}}function js(e,n){if(n=n.updateQueue,n=n!==null?n.lastEffect:null,n!==null){var i=n=n.next;do{if((i.tag&e)===e){var s=i.create;i.destroy=s()}i=i.next}while(i!==n)}}function eu(e){var n=e.ref;if(n!==null){var i=e.stateNode;switch(e.tag){case 5:e=i;break;default:e=i}typeof n=="function"?n(e):n.current=e}}function mf(e){var n=e.alternate;n!==null&&(e.alternate=null,mf(n)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(n=e.stateNode,n!==null&&(delete n[an],delete n[Xi],delete n[ma],delete n[fy],delete n[hy])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function yf(e){return e.tag===5||e.tag===3||e.tag===4}function vf(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||yf(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function tu(e,n,i){var s=e.tag;if(s===5||s===6)e=e.stateNode,n?i.nodeType===8?i.parentNode.insertBefore(e,n):i.insertBefore(e,n):(i.nodeType===8?(n=i.parentNode,n.insertBefore(e,i)):(n=i,n.appendChild(e)),i=i._reactRootContainer,i!=null||n.onclick!==null||(n.onclick=is));else if(s!==4&&(e=e.child,e!==null))for(tu(e,n,i),e=e.sibling;e!==null;)tu(e,n,i),e=e.sibling}function nu(e,n,i){var s=e.tag;if(s===5||s===6)e=e.stateNode,n?i.insertBefore(e,n):i.appendChild(e);else if(s!==4&&(e=e.child,e!==null))for(nu(e,n,i),e=e.sibling;e!==null;)nu(e,n,i),e=e.sibling}var dt=null,Gt=!1;function Yn(e,n,i){for(i=i.child;i!==null;)xf(e,n,i),i=i.sibling}function xf(e,n,i){if(Mt&&typeof Mt.onCommitFiberUnmount=="function")try{Mt.onCommitFiberUnmount(Hr,i)}catch{}switch(i.tag){case 5:yt||ui(i,n);case 6:var s=dt,c=Gt;dt=null,Yn(e,n,i),dt=s,Gt=c,dt!==null&&(Gt?(e=dt,i=i.stateNode,e.nodeType===8?e.parentNode.removeChild(i):e.removeChild(i)):dt.removeChild(i.stateNode));break;case 18:dt!==null&&(Gt?(e=dt,i=i.stateNode,e.nodeType===8?ga(e.parentNode,i):e.nodeType===1&&ga(e,i),Ai(e)):ga(dt,i.stateNode));break;case 4:s=dt,c=Gt,dt=i.stateNode.containerInfo,Gt=!0,Yn(e,n,i),dt=s,Gt=c;break;case 0:case 11:case 14:case 15:if(!yt&&(s=i.updateQueue,s!==null&&(s=s.lastEffect,s!==null))){c=s=s.next;do{var h=c,w=h.destroy;h=h.tag,w!==void 0&&((h&2)!==0||(h&4)!==0)&&Ja(i,n,w),c=c.next}while(c!==s)}Yn(e,n,i);break;case 1:if(!yt&&(ui(i,n),s=i.stateNode,typeof s.componentWillUnmount=="function"))try{s.props=i.memoizedProps,s.state=i.memoizedState,s.componentWillUnmount()}catch(P){Qe(i,n,P)}Yn(e,n,i);break;case 21:Yn(e,n,i);break;case 22:i.mode&1?(yt=(s=yt)||i.memoizedState!==null,Yn(e,n,i),yt=s):Yn(e,n,i);break;default:Yn(e,n,i)}}function wf(e){var n=e.updateQueue;if(n!==null){e.updateQueue=null;var i=e.stateNode;i===null&&(i=e.stateNode=new My),n.forEach(function(s){var c=Oy.bind(null,e,s);i.has(s)||(i.add(s),s.then(c,c))})}}function Qt(e,n){var i=n.deletions;if(i!==null)for(var s=0;sc&&(c=w),s&=~h}if(s=c,s=Ue()-s,s=(120>s?120:480>s?480:1080>s?1080:1920>s?1920:3e3>s?3e3:4320>s?4320:1960*Ty(s/1960))-s,10e?16:e,Gn===null)var s=!1;else{if(e=Gn,Gn=null,Ts=0,(Te&6)!==0)throw Error(o(331));var c=Te;for(Te|=4,ge=e.current;ge!==null;){var h=ge,w=h.child;if((ge.flags&16)!==0){var P=h.deletions;if(P!==null){for(var z=0;zUe()-ou?Nr(e,0):iu|=i),Nt(e,n)}function Rf(e,n){n===0&&((e.mode&1)===0?n=1:(n=Vr,Vr<<=1,(Vr&130023424)===0&&(Vr=4194304)));var i=xt();e=Sn(e,n),e!==null&&(gr(e,n,i),Nt(e,i))}function $y(e){var n=e.memoizedState,i=0;n!==null&&(i=n.retryLane),Rf(e,i)}function Oy(e,n){var i=0;switch(e.tag){case 13:var s=e.stateNode,c=e.memoizedState;c!==null&&(i=c.retryLane);break;case 19:s=e.stateNode;break;default:throw Error(o(314))}s!==null&&s.delete(n),Rf(e,i)}var Lf;Lf=function(e,n,i){if(e!==null)if(e.memoizedProps!==n.pendingProps||_t.current)kt=!0;else{if((e.lanes&i)===0&&(n.flags&128)===0)return kt=!1,Cy(e,n,i);kt=(e.flags&131072)!==0}else kt=!1,Be&&(n.flags&1048576)!==0&&fd(n,cs,n.index);switch(n.lanes=0,n.tag){case 2:var s=n.type;Ns(e,n),e=n.pendingProps;var c=ei(n,pt.current);si(n,i),c=Aa(null,n,s,e,c,i);var h=Da();return n.flags|=1,typeof c=="object"&&c!==null&&typeof c.render=="function"&&c.$$typeof===void 0?(n.tag=1,n.memoizedState=null,n.updateQueue=null,St(s)?(h=!0,ls(n)):h=!1,n.memoizedState=c.state!==null&&c.state!==void 0?c.state:null,Ma(n),c.updater=ks,n.stateNode=c,c._reactInternals=n,Va(n,s,e,i),n=Xa(null,n,s,!0,h,i)):(n.tag=0,Be&&h&&xa(n),vt(null,n,c,i),n=n.child),n;case 16:s=n.elementType;e:{switch(Ns(e,n),e=n.pendingProps,c=s._init,s=c(s._payload),n.type=s,c=n.tag=Hy(s),e=Xt(s,e),c){case 0:n=Ya(null,n,s,e,i);break e;case 1:n=sf(null,n,s,e,i);break e;case 11:n=ef(null,n,s,e,i);break e;case 14:n=tf(null,n,s,Xt(s.type,e),i);break e}throw Error(o(306,s,""))}return n;case 0:return s=n.type,c=n.pendingProps,c=n.elementType===s?c:Xt(s,c),Ya(e,n,s,c,i);case 1:return s=n.type,c=n.pendingProps,c=n.elementType===s?c:Xt(s,c),sf(e,n,s,c,i);case 3:e:{if(lf(n),e===null)throw Error(o(387));s=n.pendingProps,h=n.memoizedState,c=h.element,_d(e,n),ms(n,s,null,i);var w=n.memoizedState;if(s=w.element,h.isDehydrated)if(h={element:s,isDehydrated:!1,cache:w.cache,pendingSuspenseBoundaries:w.pendingSuspenseBoundaries,transitions:w.transitions},n.updateQueue.baseState=h,n.memoizedState=h,n.flags&256){c=ai(Error(o(423)),n),n=af(e,n,s,i,c);break e}else if(s!==c){c=ai(Error(o(424)),n),n=af(e,n,s,i,c);break e}else for(Rt=Fn(n.stateNode.containerInfo.firstChild),Tt=n,Be=!0,Yt=null,i=xd(n,null,s,i),n.child=i;i;)i.flags=i.flags&-3|4096,i=i.sibling;else{if(ri(),s===c){n=En(e,n,i);break e}vt(e,n,s,i)}n=n.child}return n;case 5:return Ed(n),e===null&&Sa(n),s=n.type,c=n.pendingProps,h=e!==null?e.memoizedProps:null,w=c.children,ha(s,c)?w=null:h!==null&&ha(s,h)&&(n.flags|=32),of(e,n),vt(e,n,w,i),n.child;case 6:return e===null&&Sa(n),null;case 13:return uf(e,n,i);case 4:return Pa(n,n.stateNode.containerInfo),s=n.pendingProps,e===null?n.child=ii(n,null,s,i):vt(e,n,s,i),n.child;case 11:return s=n.type,c=n.pendingProps,c=n.elementType===s?c:Xt(s,c),ef(e,n,s,c,i);case 7:return vt(e,n,n.pendingProps,i),n.child;case 8:return vt(e,n,n.pendingProps.children,i),n.child;case 12:return vt(e,n,n.pendingProps.children,i),n.child;case 10:e:{if(s=n.type._context,c=n.pendingProps,h=n.memoizedProps,w=c.value,De(hs,s._currentValue),s._currentValue=w,h!==null)if(Wt(h.value,w)){if(h.children===c.children&&!_t.current){n=En(e,n,i);break e}}else for(h=n.child,h!==null&&(h.return=n);h!==null;){var P=h.dependencies;if(P!==null){w=h.child;for(var z=P.firstContext;z!==null;){if(z.context===s){if(h.tag===1){z=kn(-1,i&-i),z.tag=2;var Z=h.updateQueue;if(Z!==null){Z=Z.shared;var oe=Z.pending;oe===null?z.next=z:(z.next=oe.next,oe.next=z),Z.pending=z}}h.lanes|=i,z=h.alternate,z!==null&&(z.lanes|=i),ja(h.return,i,n),P.lanes|=i;break}z=z.next}}else if(h.tag===10)w=h.type===n.type?null:h.child;else if(h.tag===18){if(w=h.return,w===null)throw Error(o(341));w.lanes|=i,P=w.alternate,P!==null&&(P.lanes|=i),ja(w,i,n),w=h.sibling}else w=h.child;if(w!==null)w.return=h;else for(w=h;w!==null;){if(w===n){w=null;break}if(h=w.sibling,h!==null){h.return=w.return,w=h;break}w=w.return}h=w}vt(e,n,c.children,i),n=n.child}return n;case 9:return c=n.type,s=n.pendingProps.children,si(n,i),c=Ft(c),s=s(c),n.flags|=1,vt(e,n,s,i),n.child;case 14:return s=n.type,c=Xt(s,n.pendingProps),c=Xt(s.type,c),tf(e,n,s,c,i);case 15:return nf(e,n,n.type,n.pendingProps,i);case 17:return s=n.type,c=n.pendingProps,c=n.elementType===s?c:Xt(s,c),Ns(e,n),n.tag=1,St(s)?(e=!0,ls(n)):e=!1,si(n,i),Xd(n,s,c),Va(n,s,c,i),Xa(null,n,s,!0,e,i);case 19:return df(e,n,i);case 22:return rf(e,n,i)}throw Error(o(156,n.tag))};function zf(e,n){return Do(e,n)}function Fy(e,n,i,s){this.tag=e,this.key=i,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=n,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=s,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Vt(e,n,i,s){return new Fy(e,n,i,s)}function hu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Hy(e){if(typeof e=="function")return hu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===te)return 11;if(e===Y)return 14}return 2}function qn(e,n){var i=e.alternate;return i===null?(i=Vt(e.tag,n,e.key,e.mode),i.elementType=e.elementType,i.type=e.type,i.stateNode=e.stateNode,i.alternate=e,e.alternate=i):(i.pendingProps=n,i.type=e.type,i.flags=0,i.subtreeFlags=0,i.deletions=null),i.flags=e.flags&14680064,i.childLanes=e.childLanes,i.lanes=e.lanes,i.child=e.child,i.memoizedProps=e.memoizedProps,i.memoizedState=e.memoizedState,i.updateQueue=e.updateQueue,n=e.dependencies,i.dependencies=n===null?null:{lanes:n.lanes,firstContext:n.firstContext},i.sibling=e.sibling,i.index=e.index,i.ref=e.ref,i}function As(e,n,i,s,c,h){var w=2;if(s=e,typeof e=="function")hu(e)&&(w=1);else if(typeof e=="string")w=5;else e:switch(e){case B:return jr(i.children,c,h,n);case G:w=8,c|=8;break;case U:return e=Vt(12,i,n,c|2),e.elementType=U,e.lanes=h,e;case J:return e=Vt(13,i,n,c),e.elementType=J,e.lanes=h,e;case b:return e=Vt(19,i,n,c),e.elementType=b,e.lanes=h,e;case W:return Ds(i,c,h,n);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ee:w=10;break e;case q:w=9;break e;case te:w=11;break e;case Y:w=14;break e;case V:w=16,s=null;break e}throw Error(o(130,e==null?e:typeof e,""))}return n=Vt(w,i,n,c),n.elementType=e,n.type=s,n.lanes=h,n}function jr(e,n,i,s){return e=Vt(7,e,s,n),e.lanes=i,e}function Ds(e,n,i,s){return e=Vt(22,e,s,n),e.elementType=W,e.lanes=i,e.stateNode={isHidden:!1},e}function pu(e,n,i){return e=Vt(6,e,null,n),e.lanes=i,e}function gu(e,n,i){return n=Vt(4,e.children!==null?e.children:[],e.key,n),n.lanes=i,n.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},n}function By(e,n,i,s,c){this.tag=n,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=pr(0),this.expirationTimes=pr(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=pr(0),this.identifierPrefix=s,this.onRecoverableError=c,this.mutableSourceEagerHydrationData=null}function mu(e,n,i,s,c,h,w,P,z){return e=new By(e,n,i,P,z),n===1?(n=1,h===!0&&(n|=8)):n=0,h=Vt(3,null,null,n),e.current=h,h.stateNode=e,h.memoizedState={element:s,isDehydrated:i,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ma(h),e}function Vy(e,n,i){var s=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(r){console.error(r)}}return t(),Su.exports=t0(),Su.exports}var Qf;function n0(){if(Qf)return Us;Qf=1;var t=wp();return Us.createRoot=t.createRoot,Us.hydrateRoot=t.hydrateRoot,Us}var r0=n0();function i0(t,r="Request failed"){const o=(t||"").trim();if(!o)return r;try{const a=JSON.parse(o).detail;if(typeof a=="string"&&a.trim())return a;if(Array.isArray(a)){const u=a.map(d=>typeof d=="string"?d:d&&typeof d=="object"&&"msg"in d?String(d.msg):"").filter(Boolean);if(u.length)return u.join("; ")}}catch{}return o}async function Ze(t,r){const o=await fetch(t,{...r,headers:{"Content-Type":"application/json",...(r==null?void 0:r.headers)||{}}});if(!o.ok){const l=await o.text();throw new Error(i0(l,o.statusText||"Request failed"))}return o.json()}const o0=["github_token","bitbucket_token","bitbucket_oauth_client_secret","ai_api_key","ai_model","ai_base_url"],Ve={health:()=>Ze("/api/health"),settings:()=>Ze("/api/settings"),saveSettings:t=>{const r={...t};for(const o of o0)r[o]===""&&delete r[o];return Ze("/api/settings",{method:"PUT",body:JSON.stringify(r)})},repos:()=>Ze("/api/repos"),browse:t=>Ze(`/api/fs${t?`?path=${encodeURIComponent(t)}`:""}`),gitRefs:(t,r=50)=>Ze(`/api/git/refs?repo_path=${encodeURIComponent(t)}&limit=${r}`),index:(t,r=!0)=>Ze("/api/index",{method:"POST",body:JSON.stringify({repo_path:t,incremental:r})}),indexStatus:t=>Ze(`/api/index?repo_path=${encodeURIComponent(t)}`),architecture:t=>Ze(`/api/architecture?repo_path=${encodeURIComponent(t)}`),review:(t,r,o,l=!0)=>Ze("/api/review",{method:"POST",body:JSON.stringify({repo_path:t,base:r,head:o||null,reindex:l,incremental:!0,three_dot:!0})}),init:(t,r=!1)=>Ze("/api/init",{method:"POST",body:JSON.stringify({repo_path:t,overwrite:r})}),postComment:(t,r,o,l)=>Ze("/api/prs/comment",{method:"POST",body:JSON.stringify({provider:t,repo:r,number:o,markdown:l})}),graph:(t,r="full")=>Ze(`/api/graph?repo_path=${encodeURIComponent(t)}&scope=${r}`),prs:(t,r,o="open")=>Ze("/api/prs",{method:"POST",body:JSON.stringify({provider:t,repo:r,state:o})}),scmRepos:t=>Ze(`/api/scm/repos?provider=${encodeURIComponent(t)}`),oauthStatus:()=>Ze("/api/oauth/status"),githubOAuthStart:()=>Ze("/api/oauth/github/start",{method:"POST",body:"{}"}),githubOAuthPoll:t=>Ze("/api/oauth/github/poll",{method:"POST",body:JSON.stringify({flow_id:t})}),bitbucketOAuthStart:()=>Ze("/api/oauth/bitbucket/start"),oauthDisconnect:t=>Ze("/api/oauth/disconnect",{method:"POST",body:JSON.stringify({provider:t})}),residual:t=>Ze("/api/ai/residual",{method:"POST",body:JSON.stringify({review:t})})};function yo(t){return t.replaceAll("_"," ")}function s0(t){return t.replaceAll("_"," ")}function yl(t){return t.split(".").pop()||t}function l0(t){if(!t)return"";const r=new Date(t);return Number.isNaN(r.getTime())?t:r.toLocaleString()}function pi(t){return t.replace(/([/\\._:@-])/g,"$1​")}function Dr({className:t,children:r}){return p.jsx("svg",{className:t,width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:r})}function a0({className:t}){return p.jsxs(Dr,{className:t,children:[p.jsx("path",{d:"M3 3.5h6.5L13 7v5.5H3z"}),p.jsx("path",{d:"M9.5 3.5V7H13"}),p.jsx("path",{d:"M5.5 9.5h5M5.5 11.5h3.5"})]})}function u0({className:t}){return p.jsxs(Dr,{className:t,children:[p.jsx("rect",{x:"2.5",y:"2.5",width:"4.5",height:"4.5",rx:"0.8"}),p.jsx("rect",{x:"9",y:"2.5",width:"4.5",height:"4.5",rx:"0.8"}),p.jsx("rect",{x:"2.5",y:"9",width:"4.5",height:"4.5",rx:"0.8"}),p.jsx("rect",{x:"9",y:"9",width:"4.5",height:"4.5",rx:"0.8"})]})}function c0({className:t}){return p.jsxs(Dr,{className:t,children:[p.jsx("circle",{cx:"4",cy:"8",r:"1.6"}),p.jsx("circle",{cx:"12",cy:"4",r:"1.6"}),p.jsx("circle",{cx:"12",cy:"12",r:"1.6"}),p.jsx("path",{d:"M5.5 7.2 10.4 4.8M5.5 8.8 10.4 11.2"})]})}function d0({className:t}){return p.jsxs(Dr,{className:t,children:[p.jsx("circle",{cx:"4.5",cy:"4",r:"1.4"}),p.jsx("circle",{cx:"4.5",cy:"12",r:"1.4"}),p.jsx("circle",{cx:"11.5",cy:"12",r:"1.4"}),p.jsx("path",{d:"M4.5 5.5v5M4.5 8h4.2a3 3 0 0 1 3 3"})]})}function f0({className:t}){return p.jsxs(Dr,{className:t,children:[p.jsx("circle",{cx:"8",cy:"8",r:"2.1"}),p.jsx("path",{d:"M8 2.5v1.6M8 11.9v1.6M2.5 8h1.6M11.9 8h1.6M4.1 4.1l1.1 1.1M10.8 10.8l1.1 1.1M11.9 4.1l-1.1 1.1M5.2 10.8l-1.1 1.1"})]})}function _p({className:t}){return p.jsx(Dr,{className:t,children:p.jsx("path",{d:"M2.5 4.5h4L8 6h5.5v6.5h-11z"})})}function h0({className:t}){return p.jsx(Dr,{className:t,children:p.jsx("path",{d:"M4 6.5 8 10.5 12 6.5"})})}const p0="modulepreload",g0=function(t,r){return new URL(t,r).href},Kf={},m0=function(r,o,l){let a=Promise.resolve();if(o&&o.length>0){let d=function(m){return Promise.all(m.map(x=>Promise.resolve(x).then(v=>({status:"fulfilled",value:v}),v=>({status:"rejected",reason:v}))))};const f=document.getElementsByTagName("link"),g=document.querySelector("meta[property=csp-nonce]"),y=(g==null?void 0:g.nonce)||(g==null?void 0:g.getAttribute("nonce"));a=d(o.map(m=>{if(m=g0(m,l),m in Kf)return;Kf[m]=!0;const x=m.endsWith(".css"),v=x?'[rel="stylesheet"]':"";if(!!l)for(let C=f.length-1;C>=0;C--){const E=f[C];if(E.href===m&&(!x||E.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${m}"]${v}`))return;const S=document.createElement("link");if(S.rel=x?"stylesheet":p0,x||(S.as="script"),S.crossOrigin="",S.href=m,y&&S.setAttribute("nonce",y),document.head.appendChild(S),x)return new Promise((C,E)=>{S.addEventListener("load",C),S.addEventListener("error",()=>E(new Error(`Unable to preload CSS for ${m}`)))})}))}function u(d){const f=new Event("vite:preloadError",{cancelable:!0});if(f.payload=d,window.dispatchEvent(f),!f.defaultPrevented)throw d}return a.then(d=>{for(const f of d||[])f.status==="rejected"&&u(f.reason);return r().catch(u)})};function et(t){if(typeof t=="string"||typeof t=="number")return""+t;let r="";if(Array.isArray(t))for(let o=0,l;o{}};function vl(){for(var t=0,r=arguments.length,o={},l;t=0&&(l=o.slice(a+1),o=o.slice(0,a)),o&&!r.hasOwnProperty(o))throw new Error("unknown type: "+o);return{type:o,name:l}})}tl.prototype=vl.prototype={constructor:tl,on:function(t,r){var o=this._,l=v0(t+"",o),a,u=-1,d=l.length;if(arguments.length<2){for(;++u0)for(var o=new Array(a),l=0,a,u;l=0&&(r=t.slice(0,o))!=="xmlns"&&(t=t.slice(o+1)),Zf.hasOwnProperty(r)?{space:Zf[r],local:t}:t}function w0(t){return function(){var r=this.ownerDocument,o=this.namespaceURI;return o===Ou&&r.documentElement.namespaceURI===Ou?r.createElement(t):r.createElementNS(o,t)}}function _0(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function Sp(t){var r=xl(t);return(r.local?_0:w0)(r)}function S0(){}function Ju(t){return t==null?S0:function(){return this.querySelector(t)}}function k0(t){typeof t!="function"&&(t=Ju(t));for(var r=this._groups,o=r.length,l=new Array(o),a=0;a=k&&(k=I+1);!(R=E[k])&&++k=0;)(d=l[a])&&(u&&d.compareDocumentPosition(u)^4&&u.parentNode.insertBefore(d,u),u=d);return this}function G0(t){t||(t=Q0);function r(x,v){return x&&v?t(x.__data__,v.__data__):!x-!v}for(var o=this._groups,l=o.length,a=new Array(l),u=0;ur?1:t>=r?0:NaN}function K0(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function q0(){return Array.from(this)}function Z0(){for(var t=this._groups,r=0,o=t.length;r1?this.each((r==null?uv:typeof r=="function"?dv:cv)(t,r,o??"")):vi(this.node(),t)}function vi(t,r){return t.style.getPropertyValue(r)||jp(t).getComputedStyle(t,null).getPropertyValue(r)}function hv(t){return function(){delete this[t]}}function pv(t,r){return function(){this[t]=r}}function gv(t,r){return function(){var o=r.apply(this,arguments);o==null?delete this[t]:this[t]=o}}function mv(t,r){return arguments.length>1?this.each((r==null?hv:typeof r=="function"?gv:pv)(t,r)):this.node()[t]}function bp(t){return t.trim().split(/^|\s+/)}function ec(t){return t.classList||new Mp(t)}function Mp(t){this._node=t,this._names=bp(t.getAttribute("class")||"")}Mp.prototype={add:function(t){var r=this._names.indexOf(t);r<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var r=this._names.indexOf(t);r>=0&&(this._names.splice(r,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function Pp(t,r){for(var o=ec(t),l=-1,a=r.length;++l=0&&(o=r.slice(l+1),r=r.slice(0,l)),{type:r,name:o}})}function Uv(t){return function(){var r=this.__on;if(r){for(var o=0,l=-1,a=r.length,u;o()=>t;function Fu(t,{sourceEvent:r,subject:o,target:l,identifier:a,active:u,x:d,y:f,dx:g,dy:y,dispatch:m}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:r,enumerable:!0,configurable:!0},subject:{value:o,enumerable:!0,configurable:!0},target:{value:l,enumerable:!0,configurable:!0},identifier:{value:a,enumerable:!0,configurable:!0},active:{value:u,enumerable:!0,configurable:!0},x:{value:d,enumerable:!0,configurable:!0},y:{value:f,enumerable:!0,configurable:!0},dx:{value:g,enumerable:!0,configurable:!0},dy:{value:y,enumerable:!0,configurable:!0},_:{value:m}})}Fu.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function ex(t){return!t.ctrlKey&&!t.button}function tx(){return this.parentNode}function nx(t,r){return r??{x:t.x,y:t.y}}function rx(){return navigator.maxTouchPoints||"ontouchstart"in this}function Ap(){var t=ex,r=tx,o=nx,l=rx,a={},u=vl("start","drag","end"),d=0,f,g,y,m,x=0;function v(j){j.on("mousedown.drag",_).filter(l).on("touchstart.drag",E).on("touchmove.drag",N,Jv).on("touchend.drag touchcancel.drag",I).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function _(j,R){if(!(m||!t.call(this,j,R))){var T=k(this,r.call(this,j,R),j,R,"mouse");T&&(zt(j.view).on("mousemove.drag",S,vo).on("mouseup.drag",C,vo),Lp(j.view),Nu(j),y=!1,f=j.clientX,g=j.clientY,T("start",j))}}function S(j){if(mi(j),!y){var R=j.clientX-f,T=j.clientY-g;y=R*R+T*T>x}a.mouse("drag",j)}function C(j){zt(j.view).on("mousemove.drag mouseup.drag",null),zp(j.view,y),mi(j),a.mouse("end",j)}function E(j,R){if(t.call(this,j,R)){var T=j.changedTouches,B=r.call(this,j,R),G=T.length,U,ee;for(U=0;U>8&15|r>>4&240,r>>4&15|r&240,(r&15)<<4|r&15,1):o===8?Ys(r>>24&255,r>>16&255,r>>8&255,(r&255)/255):o===4?Ys(r>>12&15|r>>8&240,r>>8&15|r>>4&240,r>>4&15|r&240,((r&15)<<4|r&15)/255):null):(r=ox.exec(t))?new jt(r[1],r[2],r[3],1):(r=sx.exec(t))?new jt(r[1]*255/100,r[2]*255/100,r[3]*255/100,1):(r=lx.exec(t))?Ys(r[1],r[2],r[3],r[4]):(r=ax.exec(t))?Ys(r[1]*255/100,r[2]*255/100,r[3]*255/100,r[4]):(r=ux.exec(t))?oh(r[1],r[2]/100,r[3]/100,1):(r=cx.exec(t))?oh(r[1],r[2]/100,r[3]/100,r[4]):Jf.hasOwnProperty(t)?nh(Jf[t]):t==="transparent"?new jt(NaN,NaN,NaN,0):null}function nh(t){return new jt(t>>16&255,t>>8&255,t&255,1)}function Ys(t,r,o,l){return l<=0&&(t=r=o=NaN),new jt(t,r,o,l)}function hx(t){return t instanceof Po||(t=Tr(t)),t?(t=t.rgb(),new jt(t.r,t.g,t.b,t.opacity)):new jt}function Hu(t,r,o,l){return arguments.length===1?hx(t):new jt(t,r,o,l??1)}function jt(t,r,o,l){this.r=+t,this.g=+r,this.b=+o,this.opacity=+l}tc(jt,Hu,Dp(Po,{brighter(t){return t=t==null?ll:Math.pow(ll,t),new jt(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?xo:Math.pow(xo,t),new jt(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new jt(Pr(this.r),Pr(this.g),Pr(this.b),al(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:rh,formatHex:rh,formatHex8:px,formatRgb:ih,toString:ih}));function rh(){return`#${Mr(this.r)}${Mr(this.g)}${Mr(this.b)}`}function px(){return`#${Mr(this.r)}${Mr(this.g)}${Mr(this.b)}${Mr((isNaN(this.opacity)?1:this.opacity)*255)}`}function ih(){const t=al(this.opacity);return`${t===1?"rgb(":"rgba("}${Pr(this.r)}, ${Pr(this.g)}, ${Pr(this.b)}${t===1?")":`, ${t})`}`}function al(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Pr(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Mr(t){return t=Pr(t),(t<16?"0":"")+t.toString(16)}function oh(t,r,o,l){return l<=0?t=r=o=NaN:o<=0||o>=1?t=r=NaN:r<=0&&(t=NaN),new Zt(t,r,o,l)}function $p(t){if(t instanceof Zt)return new Zt(t.h,t.s,t.l,t.opacity);if(t instanceof Po||(t=Tr(t)),!t)return new Zt;if(t instanceof Zt)return t;t=t.rgb();var r=t.r/255,o=t.g/255,l=t.b/255,a=Math.min(r,o,l),u=Math.max(r,o,l),d=NaN,f=u-a,g=(u+a)/2;return f?(r===u?d=(o-l)/f+(o0&&g<1?0:d,new Zt(d,f,g,t.opacity)}function gx(t,r,o,l){return arguments.length===1?$p(t):new Zt(t,r,o,l??1)}function Zt(t,r,o,l){this.h=+t,this.s=+r,this.l=+o,this.opacity=+l}tc(Zt,gx,Dp(Po,{brighter(t){return t=t==null?ll:Math.pow(ll,t),new Zt(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?xo:Math.pow(xo,t),new Zt(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,r=isNaN(t)||isNaN(this.s)?0:this.s,o=this.l,l=o+(o<.5?o:1-o)*r,a=2*o-l;return new jt(Cu(t>=240?t-240:t+120,a,l),Cu(t,a,l),Cu(t<120?t+240:t-120,a,l),this.opacity)},clamp(){return new Zt(sh(this.h),Xs(this.s),Xs(this.l),al(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=al(this.opacity);return`${t===1?"hsl(":"hsla("}${sh(this.h)}, ${Xs(this.s)*100}%, ${Xs(this.l)*100}%${t===1?")":`, ${t})`}`}}));function sh(t){return t=(t||0)%360,t<0?t+360:t}function Xs(t){return Math.max(0,Math.min(1,t||0))}function Cu(t,r,o){return(t<60?r+(o-r)*t/60:t<180?o:t<240?r+(o-r)*(240-t)/60:r)*255}const nc=t=>()=>t;function mx(t,r){return function(o){return t+o*r}}function yx(t,r,o){return t=Math.pow(t,o),r=Math.pow(r,o)-t,o=1/o,function(l){return Math.pow(t+l*r,o)}}function vx(t){return(t=+t)==1?Op:function(r,o){return o-r?yx(r,o,t):nc(isNaN(r)?o:r)}}function Op(t,r){var o=r-t;return o?mx(t,o):nc(isNaN(t)?r:t)}const ul=(function t(r){var o=vx(r);function l(a,u){var d=o((a=Hu(a)).r,(u=Hu(u)).r),f=o(a.g,u.g),g=o(a.b,u.b),y=Op(a.opacity,u.opacity);return function(m){return a.r=d(m),a.g=f(m),a.b=g(m),a.opacity=y(m),a+""}}return l.gamma=t,l})(1);function xx(t,r){r||(r=[]);var o=t?Math.min(r.length,t.length):0,l=r.slice(),a;return function(u){for(a=0;ao&&(u=r.slice(o,u),f[d]?f[d]+=u:f[++d]=u),(l=l[0])===(a=a[0])?f[d]?f[d]+=a:f[++d]=a:(f[++d]=null,g.push({i:d,x:fn(l,a)})),o=ju.lastIndex;return o180?m+=360:m-y>180&&(y+=360),v.push({i:x.push(a(x)+"rotate(",null,l)-2,x:fn(y,m)})):m&&x.push(a(x)+"rotate("+m+l)}function f(y,m,x,v){y!==m?v.push({i:x.push(a(x)+"skewX(",null,l)-2,x:fn(y,m)}):m&&x.push(a(x)+"skewX("+m+l)}function g(y,m,x,v,_,S){if(y!==x||m!==v){var C=_.push(a(_)+"scale(",null,",",null,")");S.push({i:C-4,x:fn(y,x)},{i:C-2,x:fn(m,v)})}else(x!==1||v!==1)&&_.push(a(_)+"scale("+x+","+v+")")}return function(y,m){var x=[],v=[];return y=t(y),m=t(m),u(y.translateX,y.translateY,m.translateX,m.translateY,x,v),d(y.rotate,m.rotate,x,v),f(y.skewX,m.skewX,x,v),g(y.scaleX,y.scaleY,m.scaleX,m.scaleY,x,v),y=m=null,function(_){for(var S=-1,C=v.length,E;++S=0&&t._call.call(void 0,r),t=t._next;--xi}function uh(){Rr=(dl=_o.now())+wl,xi=ho=0;try{Lx()}finally{xi=0,Ax(),Rr=0}}function zx(){var t=_o.now(),r=t-dl;r>Vp&&(wl-=r,dl=t)}function Ax(){for(var t,r=cl,o,l=1/0;r;)r._call?(l>r._time&&(l=r._time),t=r,r=r._next):(o=r._next,r._next=null,r=t?t._next=o:cl=o);po=t,Uu(l)}function Uu(t){if(!xi){ho&&(ho=clearTimeout(ho));var r=t-Rr;r>24?(t<1/0&&(ho=setTimeout(uh,t-_o.now()-wl)),co&&(co=clearInterval(co))):(co||(dl=_o.now(),co=setInterval(zx,Vp)),xi=1,Up(uh))}}function ch(t,r,o){var l=new fl;return r=r==null?0:+r,l.restart(a=>{l.stop(),t(a+r)},r,o),l}var Dx=vl("start","end","cancel","interrupt"),$x=[],Yp=0,dh=1,Wu=2,rl=3,fh=4,Yu=5,il=6;function _l(t,r,o,l,a,u){var d=t.__transition;if(!d)t.__transition={};else if(o in d)return;Ox(t,o,{name:r,index:l,group:a,on:Dx,tween:$x,time:u.time,delay:u.delay,duration:u.duration,ease:u.ease,timer:null,state:Yp})}function ic(t,r){var o=nn(t,r);if(o.state>Yp)throw new Error("too late; already scheduled");return o}function pn(t,r){var o=nn(t,r);if(o.state>rl)throw new Error("too late; already running");return o}function nn(t,r){var o=t.__transition;if(!o||!(o=o[r]))throw new Error("transition not found");return o}function Ox(t,r,o){var l=t.__transition,a;l[r]=o,o.timer=Wp(u,0,o.time);function u(y){o.state=dh,o.timer.restart(d,o.delay,o.time),o.delay<=y&&d(y-o.delay)}function d(y){var m,x,v,_;if(o.state!==dh)return g();for(m in l)if(_=l[m],_.name===o.name){if(_.state===rl)return ch(d);_.state===fh?(_.state=il,_.timer.stop(),_.on.call("interrupt",t,t.__data__,_.index,_.group),delete l[m]):+mWu&&l.state=0&&(r=r.slice(0,o)),!r||r==="start"})}function gw(t,r,o){var l,a,u=pw(r)?ic:pn;return function(){var d=u(this,t),f=d.on;f!==l&&(a=(l=f).copy()).on(r,o),d.on=a}}function mw(t,r){var o=this._id;return arguments.length<2?nn(this.node(),o).on.on(t):this.each(gw(o,t,r))}function yw(t){return function(){var r=this.parentNode;for(var o in this.__transition)if(+o!==t)return;r&&r.removeChild(this)}}function vw(){return this.on("end.remove",yw(this._id))}function xw(t){var r=this._name,o=this._id;typeof t!="function"&&(t=Ju(t));for(var l=this._groups,a=l.length,u=new Array(a),d=0;d()=>t;function Uw(t,{sourceEvent:r,target:o,transform:l,dispatch:a}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:r,enumerable:!0,configurable:!0},target:{value:o,enumerable:!0,configurable:!0},transform:{value:l,enumerable:!0,configurable:!0},_:{value:a}})}function jn(t,r,o){this.k=t,this.x=r,this.y=o}jn.prototype={constructor:jn,scale:function(t){return t===1?this:new jn(this.k*t,this.x,this.y)},translate:function(t,r){return t===0&r===0?this:new jn(this.k,this.x+this.k*t,this.y+this.k*r)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var Sl=new jn(1,0,0);Kp.prototype=jn.prototype;function Kp(t){for(;!t.__zoom;)if(!(t=t.parentNode))return Sl;return t.__zoom}function bu(t){t.stopImmediatePropagation()}function fo(t){t.preventDefault(),t.stopImmediatePropagation()}function Ww(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function Yw(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function hh(){return this.__zoom||Sl}function Xw(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function Gw(){return navigator.maxTouchPoints||"ontouchstart"in this}function Qw(t,r,o){var l=t.invertX(r[0][0])-o[0][0],a=t.invertX(r[1][0])-o[1][0],u=t.invertY(r[0][1])-o[0][1],d=t.invertY(r[1][1])-o[1][1];return t.translate(a>l?(l+a)/2:Math.min(0,l)||Math.max(0,a),d>u?(u+d)/2:Math.min(0,u)||Math.max(0,d))}function qp(){var t=Ww,r=Yw,o=Qw,l=Xw,a=Gw,u=[0,1/0],d=[[-1/0,-1/0],[1/0,1/0]],f=250,g=nl,y=vl("start","zoom","end"),m,x,v,_=500,S=150,C=0,E=10;function N(b){b.property("__zoom",hh).on("wheel.zoom",G,{passive:!1}).on("mousedown.zoom",U).on("dblclick.zoom",ee).filter(a).on("touchstart.zoom",q).on("touchmove.zoom",te).on("touchend.zoom touchcancel.zoom",J).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}N.transform=function(b,Y,V,W){var D=b.selection?b.selection():b;D.property("__zoom",hh),b!==D?R(b,Y,V,W):D.interrupt().each(function(){T(this,arguments).event(W).start().zoom(null,typeof Y=="function"?Y.apply(this,arguments):Y).end()})},N.scaleBy=function(b,Y,V,W){N.scaleTo(b,function(){var D=this.__zoom.k,A=typeof Y=="function"?Y.apply(this,arguments):Y;return D*A},V,W)},N.scaleTo=function(b,Y,V,W){N.transform(b,function(){var D=r.apply(this,arguments),A=this.__zoom,H=V==null?j(D):typeof V=="function"?V.apply(this,arguments):V,M=A.invert(H),L=typeof Y=="function"?Y.apply(this,arguments):Y;return o(k(I(A,L),H,M),D,d)},V,W)},N.translateBy=function(b,Y,V,W){N.transform(b,function(){return o(this.__zoom.translate(typeof Y=="function"?Y.apply(this,arguments):Y,typeof V=="function"?V.apply(this,arguments):V),r.apply(this,arguments),d)},null,W)},N.translateTo=function(b,Y,V,W,D){N.transform(b,function(){var A=r.apply(this,arguments),H=this.__zoom,M=W==null?j(A):typeof W=="function"?W.apply(this,arguments):W;return o(Sl.translate(M[0],M[1]).scale(H.k).translate(typeof Y=="function"?-Y.apply(this,arguments):-Y,typeof V=="function"?-V.apply(this,arguments):-V),A,d)},W,D)};function I(b,Y){return Y=Math.max(u[0],Math.min(u[1],Y)),Y===b.k?b:new jn(Y,b.x,b.y)}function k(b,Y,V){var W=Y[0]-V[0]*b.k,D=Y[1]-V[1]*b.k;return W===b.x&&D===b.y?b:new jn(b.k,W,D)}function j(b){return[(+b[0][0]+ +b[1][0])/2,(+b[0][1]+ +b[1][1])/2]}function R(b,Y,V,W){b.on("start.zoom",function(){T(this,arguments).event(W).start()}).on("interrupt.zoom end.zoom",function(){T(this,arguments).event(W).end()}).tween("zoom",function(){var D=this,A=arguments,H=T(D,A).event(W),M=r.apply(D,A),L=V==null?j(M):typeof V=="function"?V.apply(D,A):V,ne=Math.max(M[1][0]-M[0][0],M[1][1]-M[0][1]),re=D.__zoom,ce=typeof Y=="function"?Y.apply(D,A):Y,fe=g(re.invert(L).concat(ne/re.k),ce.invert(L).concat(ne/ce.k));return function(de){if(de===1)de=ce;else{var K=fe(de),se=ne/K[2];de=new jn(se,L[0]-K[0]*se,L[1]-K[1]*se)}H.zoom(null,de)}})}function T(b,Y,V){return!V&&b.__zooming||new B(b,Y)}function B(b,Y){this.that=b,this.args=Y,this.active=0,this.sourceEvent=null,this.extent=r.apply(b,Y),this.taps=0}B.prototype={event:function(b){return b&&(this.sourceEvent=b),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(b,Y){return this.mouse&&b!=="mouse"&&(this.mouse[1]=Y.invert(this.mouse[0])),this.touch0&&b!=="touch"&&(this.touch0[1]=Y.invert(this.touch0[0])),this.touch1&&b!=="touch"&&(this.touch1[1]=Y.invert(this.touch1[0])),this.that.__zoom=Y,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(b){var Y=zt(this.that).datum();y.call(b,this.that,new Uw(b,{sourceEvent:this.sourceEvent,target:N,transform:this.that.__zoom,dispatch:y}),Y)}};function G(b,...Y){if(!t.apply(this,arguments))return;var V=T(this,Y).event(b),W=this.__zoom,D=Math.max(u[0],Math.min(u[1],W.k*Math.pow(2,l.apply(this,arguments)))),A=qt(b);if(V.wheel)(V.mouse[0][0]!==A[0]||V.mouse[0][1]!==A[1])&&(V.mouse[1]=W.invert(V.mouse[0]=A)),clearTimeout(V.wheel);else{if(W.k===D)return;V.mouse=[A,W.invert(A)],ol(this),V.start()}fo(b),V.wheel=setTimeout(H,S),V.zoom("mouse",o(k(I(W,D),V.mouse[0],V.mouse[1]),V.extent,d));function H(){V.wheel=null,V.end()}}function U(b,...Y){if(v||!t.apply(this,arguments))return;var V=b.currentTarget,W=T(this,Y,!0).event(b),D=zt(b.view).on("mousemove.zoom",L,!0).on("mouseup.zoom",ne,!0),A=qt(b,V),H=b.clientX,M=b.clientY;Lp(b.view),bu(b),W.mouse=[A,this.__zoom.invert(A)],ol(this),W.start();function L(re){if(fo(re),!W.moved){var ce=re.clientX-H,fe=re.clientY-M;W.moved=ce*ce+fe*fe>C}W.event(re).zoom("mouse",o(k(W.that.__zoom,W.mouse[0]=qt(re,V),W.mouse[1]),W.extent,d))}function ne(re){D.on("mousemove.zoom mouseup.zoom",null),zp(re.view,W.moved),fo(re),W.event(re).end()}}function ee(b,...Y){if(t.apply(this,arguments)){var V=this.__zoom,W=qt(b.changedTouches?b.changedTouches[0]:b,this),D=V.invert(W),A=V.k*(b.shiftKey?.5:2),H=o(k(I(V,A),W,D),r.apply(this,Y),d);fo(b),f>0?zt(this).transition().duration(f).call(R,H,W,b):zt(this).call(N.transform,H,W,b)}}function q(b,...Y){if(t.apply(this,arguments)){var V=b.touches,W=V.length,D=T(this,Y,b.changedTouches.length===W).event(b),A,H,M,L;for(bu(b),H=0;H`Seems like you have not used ${t==="svelte"?"SvelteFlowProvider":"ReactFlowProvider"} as an ancestor. Help: https://${t}flow.dev/error#001`,error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:t=>`Node type "${t}" not found. Using fallback type "default".`,error004:()=>"The parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:t=>`The old edge with id=${t} does not exist.`,error009:t=>`Marker type "${t}" doesn't exist.`,error008:(t,{id:r,sourceHandle:o,targetHandle:l})=>`Couldn't create edge for ${t} handle id: "${t==="source"?o:l}", edge id: ${r}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:t=>`Edge type "${t}" not found. Using fallback type "default".`,error012:t=>`Node with id "${t}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(t="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${t}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs.",error016:t=>`Edge with id "${t}" does not exist, it may have been removed. This can happen when an edge is deleted before the "onEdgeClick" handler is called.`},So=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],Zp=["Enter"," ","Escape"],Jp={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:t,x:r,y:o})=>`Moved selected node ${t}. New position, x: ${r}, y: ${o}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var wi;(function(t){t.Strict="strict",t.Loose="loose"})(wi||(wi={}));var Ir;(function(t){t.Free="free",t.Vertical="vertical",t.Horizontal="horizontal"})(Ir||(Ir={}));var ko;(function(t){t.Partial="partial",t.Full="full"})(ko||(ko={}));const eg={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var nr;(function(t){t.Bezier="default",t.Straight="straight",t.Step="step",t.SmoothStep="smoothstep",t.SimpleBezier="simplebezier"})(nr||(nr={}));var Eo;(function(t){t.Arrow="arrow",t.ArrowClosed="arrowclosed"})(Eo||(Eo={}));var Se;(function(t){t.Left="left",t.Top="top",t.Right="right",t.Bottom="bottom"})(Se||(Se={}));const ph={[Se.Left]:Se.Right,[Se.Right]:Se.Left,[Se.Top]:Se.Bottom,[Se.Bottom]:Se.Top};function tg(t){return t===null?null:t?"valid":"invalid"}const ng=t=>!!t&&typeof t=="object"&&"id"in t&&"source"in t&&"target"in t,Kw=t=>!!t&&typeof t=="object"&&"id"in t&&"position"in t&&!("source"in t)&&!("target"in t),sc=t=>!!t&&typeof t=="object"&&"id"in t&&"internals"in t&&!("source"in t)&&!("target"in t),Io=(t,r=[0,0])=>{const{width:o,height:l}=rn(t),a=t.origin??r,u=o*a[0],d=l*a[1];return{x:t.position.x-u,y:t.position.y-d}},qw=(t,r={nodeOrigin:[0,0]})=>{if(t.length===0)return{x:0,y:0,width:0,height:0};let o=!1;const l=t.reduce((a,u)=>{const d=typeof u=="string";let f=!r.nodeLookup&&!d?u:void 0;return r.nodeLookup&&(f=d?r.nodeLookup.get(u):sc(u)?u:r.nodeLookup.get(u.id)),f?(o=!0,kl(a,hl(f,r.nodeOrigin))):a},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return o?El(l):{x:0,y:0,width:0,height:0}},To=(t,r={})=>{let o={x:1/0,y:1/0,x2:-1/0,y2:-1/0},l=!1;return t.forEach(a=>{(r.filter===void 0||r.filter(a))&&(o=kl(o,hl(a)),l=!0)}),l?El(o):{x:0,y:0,width:0,height:0}},lc=(t,r,[o,l,a]=[0,0,1],u=!1,d=!1)=>{const f=(r.x-o)/a,g=(r.y-l)/a,y=r.width/a,m=r.height/a,x=[];for(const v of t.values()){const{measured:_,selectable:S=!0,hidden:C=!1}=v;if(d&&!S||C)continue;const E=_.width??v.width??v.initialWidth??0,N=_.height??v.height??v.initialHeight??0,{x:I,y:k}=v.internals.positionAbsolute,j=sg(f,g,y,m,I,k,E,N),R=E*N,T=u&&j>0;(!v.internals.handleBounds||T||j>=R||v.dragging)&&x.push(v)}return x},Zw=(t,r)=>{const o=new Set;return t.forEach(l=>{o.add(l.id)}),r.filter(l=>o.has(l.source)||o.has(l.target))};function Jw(t,r){const o=new Map,l=r!=null&&r.nodes?new Set(r.nodes.map(a=>a.id)):null;return t.forEach(a=>{let u;if(r!=null&&r.includeHiddenNodes){const{width:d,height:f}=rn(a);u=d>0&&f>0}else u=!!(a.measured.width&&a.measured.height&&!a.hidden);u&&(!l||l.has(a.id))&&o.set(a.id,a)}),o}async function e1({nodes:t,width:r,height:o,panZoom:l,minZoom:a,maxZoom:u},d){if(t.size===0)return!0;const f=Jw(t,d),g=To(f),y=uc(g,r,o,(d==null?void 0:d.minZoom)??a,(d==null?void 0:d.maxZoom)??u,(d==null?void 0:d.padding)??.1);return await l.setViewport(y,{duration:d==null?void 0:d.duration,ease:d==null?void 0:d.ease,interpolate:d==null?void 0:d.interpolate}),!0}function rg({nodeId:t,nextPosition:r,nodeLookup:o,nodeOrigin:l=[0,0],nodeExtent:a,onError:u}){const d=o.get(t),f=d.parentId?o.get(d.parentId):void 0,{x:g,y}=f?f.internals.positionAbsolute:{x:0,y:0},m=d.origin??l;let x=d.extent||a;if(d.extent==="parent"&&!d.expandParent)if(!f)u==null||u("005",tn.error005());else{const{width:_,height:S}=rn(f);_&&S&&(x=[[g,y],[g+_,y+S]])}else f&&zr(d.extent)&&(x=[[d.extent[0][0]+g,d.extent[0][1]+y],[d.extent[1][0]+g,d.extent[1][1]+y]]);const v=zr(x)?Lr(r,x,d.measured):r;return(d.measured.width===void 0||d.measured.height===void 0)&&(u==null||u("015",tn.error015())),{position:{x:v.x-g+(d.measured.width??0)*m[0],y:v.y-y+(d.measured.height??0)*m[1]},positionAbsolute:v}}async function t1({nodesToRemove:t=[],edgesToRemove:r=[],nodes:o,edges:l,onBeforeDelete:a}){const u=new Set(t.map(v=>v.id)),d=[];for(const v of o){if(v.deletable===!1)continue;const _=u.has(v.id),S=!_&&v.parentId&&d.find(C=>C.id===v.parentId);(_||S)&&d.push(v)}const f=new Set(r.map(v=>v.id)),g=l.filter(v=>v.deletable!==!1),m=Zw(d,g);for(const v of g)f.has(v.id)&&!m.find(S=>S.id===v.id)&&m.push(v);if(!a)return{edges:m,nodes:d};const x=await a({nodes:d,edges:m});return typeof x=="boolean"?x?{edges:m,nodes:d}:{edges:[],nodes:[]}:x}const _i=(t,r=0,o=1)=>Math.min(Math.max(t,r),o),Lr=(t={x:0,y:0},r,o)=>({x:_i(t.x,r[0][0],r[1][0]-((o==null?void 0:o.width)??0)),y:_i(t.y,r[0][1],r[1][1]-((o==null?void 0:o.height)??0))});function ig(t,r,o){const{width:l,height:a}=rn(o),{x:u,y:d}=o.internals.positionAbsolute;return Lr(t,[[u,d],[u+l,d+a]],r)}const gh=(t,r,o)=>to?-_i(Math.abs(t-o),1,r)/r:0,ac=(t,r,o=15,l=40)=>{const a=gh(t.x,l,r.width-l)*o,u=gh(t.y,l,r.height-l)*o;return[a,u]},kl=(t,r)=>({x:Math.min(t.x,r.x),y:Math.min(t.y,r.y),x2:Math.max(t.x2,r.x2),y2:Math.max(t.y2,r.y2)}),Xu=({x:t,y:r,width:o,height:l})=>({x:t,y:r,x2:t+o,y2:r+l}),El=({x:t,y:r,x2:o,y2:l})=>({x:t,y:r,width:o-t,height:l-r}),No=(t,r=[0,0])=>{var a,u;const{x:o,y:l}=sc(t)?t.internals.positionAbsolute:Io(t,r);return{x:o,y:l,width:((a=t.measured)==null?void 0:a.width)??t.width??t.initialWidth??0,height:((u=t.measured)==null?void 0:u.height)??t.height??t.initialHeight??0}},hl=(t,r=[0,0])=>{var a,u;const{x:o,y:l}=sc(t)?t.internals.positionAbsolute:Io(t,r);return{x:o,y:l,x2:o+(((a=t.measured)==null?void 0:a.width)??t.width??t.initialWidth??0),y2:l+(((u=t.measured)==null?void 0:u.height)??t.height??t.initialHeight??0)}},og=(t,r)=>El(kl(Xu(t),Xu(r))),sg=(t,r,o,l,a,u,d,f)=>{const g=Math.max(0,Math.min(t+o,a+d)-Math.max(t,a)),y=Math.max(0,Math.min(r+l,u+f)-Math.max(r,u));return Math.ceil(g*y)},pl=(t,r)=>sg(t.x,t.y,t.width,t.height,r.x,r.y,r.width,r.height),mh=t=>Jt(t.width)&&Jt(t.height)&&Jt(t.x)&&Jt(t.y),Jt=t=>!isNaN(t)&&isFinite(t),lg=(t,r)=>(o,l)=>{},Ro=(t,r=[1,1])=>({x:r[0]*Math.round(t.x/r[0]),y:r[1]*Math.round(t.y/r[1])}),Lo=({x:t,y:r},[o,l,a],u=!1,d=[1,1])=>{const f={x:(t-o)/a,y:(r-l)/a};return u?Ro(f,d):f},Si=({x:t,y:r},[o,l,a])=>({x:t*a+o,y:r*a+l});function hi(t,r){if(typeof t=="number")return Math.floor((r-r/(1+t))*.5);if(typeof t=="string"&&t.endsWith("px")){const o=parseFloat(t);if(!Number.isNaN(o))return Math.floor(o)}if(typeof t=="string"&&t.endsWith("%")){const o=parseFloat(t);if(!Number.isNaN(o))return Math.floor(r*o*.01)}return console.error(`The padding value "${t}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function n1(t,r,o){if(typeof t=="string"||typeof t=="number"){const l=hi(t,o),a=hi(t,r);return{top:l,right:a,bottom:l,left:a,x:a*2,y:l*2}}if(typeof t=="object"){const l=hi(t.top??t.y??0,o),a=hi(t.bottom??t.y??0,o),u=hi(t.left??t.x??0,r),d=hi(t.right??t.x??0,r);return{top:l,right:d,bottom:a,left:u,x:u+d,y:l+a}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function r1(t,r,o,l,a,u){const{x:d,y:f}=Si(t,[r,o,l]),{x:g,y}=Si({x:t.x+t.width,y:t.y+t.height},[r,o,l]),m=a-g,x=u-y;return{left:Math.floor(d),top:Math.floor(f),right:Math.floor(m),bottom:Math.floor(x)}}const uc=(t,r,o,l,a,u)=>{const d=n1(u,r,o),f=(r-d.x)/t.width,g=(o-d.y)/t.height,y=Math.min(f,g),m=_i(y,l,a),x=t.x+t.width/2,v=t.y+t.height/2,_=r/2-x*m,S=o/2-v*m,C=r1(t,_,S,m,r,o),E={left:Math.min(C.left-d.left,0),top:Math.min(C.top-d.top,0),right:Math.min(C.right-d.right,0),bottom:Math.min(C.bottom-d.bottom,0)};return{x:_-E.left+E.right,y:S-E.top+E.bottom,zoom:m}},Co=()=>{var t;return typeof navigator<"u"&&((t=navigator==null?void 0:navigator.userAgent)==null?void 0:t.indexOf("Mac"))>=0};function zr(t){return t!=null&&t!=="parent"}function rn(t){var r,o;return{width:((r=t.measured)==null?void 0:r.width)??t.width??t.initialWidth??0,height:((o=t.measured)==null?void 0:o.height)??t.height??t.initialHeight??0}}function ag(t){var r,o;return(((r=t.measured)==null?void 0:r.width)??t.width??t.initialWidth)!==void 0&&(((o=t.measured)==null?void 0:o.height)??t.height??t.initialHeight)!==void 0}function ug(t,r={width:0,height:0},o,l,a){const u={...t},d=l.get(o);if(d){const f=d.origin||a;u.x+=d.internals.positionAbsolute.x-(r.width??0)*f[0],u.y+=d.internals.positionAbsolute.y-(r.height??0)*f[1]}return u}function yh(t,r){if(t.size!==r.size)return!1;for(const o of t)if(!r.has(o))return!1;return!0}function i1(){let t,r;return{promise:new Promise((l,a)=>{t=l,r=a}),resolve:t,reject:r}}function o1(t){return{...Jp,...t||{}}}function mo(t,{snapGrid:r=[0,0],snapToGrid:o=!1,transform:l,containerBounds:a}){const{x:u,y:d}=en(t),f=Lo({x:u-((a==null?void 0:a.left)??0),y:d-((a==null?void 0:a.top)??0)},l),{x:g,y}=o?Ro(f,r):f;return{xSnapped:g,ySnapped:y,...f}}const cc=t=>({width:t.offsetWidth,height:t.offsetHeight}),cg=t=>{var r;return((r=t==null?void 0:t.getRootNode)==null?void 0:r.call(t))||(window==null?void 0:window.document)},s1=["INPUT","SELECT","TEXTAREA"];function dg(t){var l,a;const r=((a=(l=t.composedPath)==null?void 0:l.call(t))==null?void 0:a[0])||t.target;return(r==null?void 0:r.nodeType)!==1?!1:s1.includes(r.nodeName)||r.hasAttribute("contenteditable")||!!r.closest(".nokey")}const fg=t=>"clientX"in t,en=(t,r)=>{var u,d;const o=fg(t),l=o?t.clientX:(u=t.touches)==null?void 0:u[0].clientX,a=o?t.clientY:(d=t.touches)==null?void 0:d[0].clientY;return{x:l-((r==null?void 0:r.left)??0),y:a-((r==null?void 0:r.top)??0)}},vh=(t,r,o,l,a)=>{const u=r.querySelectorAll(`.${t}`);return!u||!u.length?null:Array.from(u).map(d=>{const f=d.getBoundingClientRect();return{id:d.getAttribute("data-handleid"),type:t,nodeId:a,position:d.getAttribute("data-handlepos"),x:(f.left-o.left)/l,y:(f.top-o.top)/l,...cc(d)}})};function hg({sourceX:t,sourceY:r,targetX:o,targetY:l,sourceControlX:a,sourceControlY:u,targetControlX:d,targetControlY:f}){const g=t*.125+a*.375+d*.375+o*.125,y=r*.125+u*.375+f*.375+l*.125,m=Math.abs(g-t),x=Math.abs(y-r);return[g,y,m,x]}function Ks(t,r){return t>=0?.5*t:r*25*Math.sqrt(-t)}function xh({pos:t,x1:r,y1:o,x2:l,y2:a,c:u}){switch(t){case Se.Left:return[r-Ks(r-l,u),o];case Se.Right:return[r+Ks(l-r,u),o];case Se.Top:return[r,o-Ks(o-a,u)];case Se.Bottom:return[r,o+Ks(a-o,u)]}}function pg({sourceX:t,sourceY:r,sourcePosition:o=Se.Bottom,targetX:l,targetY:a,targetPosition:u=Se.Top,curvature:d=.25}){const[f,g]=xh({pos:o,x1:t,y1:r,x2:l,y2:a,c:d}),[y,m]=xh({pos:u,x1:l,y1:a,x2:t,y2:r,c:d}),[x,v,_,S]=hg({sourceX:t,sourceY:r,targetX:l,targetY:a,sourceControlX:f,sourceControlY:g,targetControlX:y,targetControlY:m});return[`M${t},${r} C${f},${g} ${y},${m} ${l},${a}`,x,v,_,S]}function gg({sourceX:t,sourceY:r,targetX:o,targetY:l}){const a=Math.abs(o-t)/2,u=o0}const u1=({source:t,sourceHandle:r,target:o,targetHandle:l})=>`xy-edge__${t}${r||""}-${o}${l||""}`,c1=(t,r)=>r.some(o=>o.source===t.source&&o.target===t.target&&(o.sourceHandle===t.sourceHandle||!o.sourceHandle&&!t.sourceHandle)&&(o.targetHandle===t.targetHandle||!o.targetHandle&&!t.targetHandle)),d1=(t,r,o={})=>{var u;if(!t.source||!t.target)return(u=o.onError)==null||u.call(o,"006",tn.error006()),r;const l=o.getEdgeId||u1;let a;return ng(t)?a={...t}:a={...t,id:l(t)},c1(a,r)?r:(a.sourceHandle===null&&delete a.sourceHandle,a.targetHandle===null&&delete a.targetHandle,r.concat(a))};function mg({sourceX:t,sourceY:r,targetX:o,targetY:l}){const[a,u,d,f]=gg({sourceX:t,sourceY:r,targetX:o,targetY:l});return[`M ${t},${r}L ${o},${l}`,a,u,d,f]}const wh={[Se.Left]:{x:-1,y:0},[Se.Right]:{x:1,y:0},[Se.Top]:{x:0,y:-1},[Se.Bottom]:{x:0,y:1}},f1=({source:t,sourcePosition:r=Se.Bottom,target:o})=>r===Se.Left||r===Se.Right?t.xMath.sqrt(Math.pow(r.x-t.x,2)+Math.pow(r.y-t.y,2));function h1({source:t,sourcePosition:r=Se.Bottom,target:o,targetPosition:l=Se.Top,center:a,offset:u,stepPosition:d}){const f=wh[r],g=wh[l],y={x:t.x+f.x*u,y:t.y+f.y*u},m={x:o.x+g.x*u,y:o.y+g.y*u},x=f1({source:y,sourcePosition:r,target:m}),v=x.x!==0?"x":"y",_=x[v];let S=[],C,E;const N={x:0,y:0},I={x:0,y:0},[,,k,j]=gg({sourceX:t.x,sourceY:t.y,targetX:o.x,targetY:o.y});if(f[v]*g[v]===-1){v==="x"?(C=a.x??y.x+(m.x-y.x)*d,E=a.y??(y.y+m.y)/2):(C=a.x??(y.x+m.x)/2,E=a.y??y.y+(m.y-y.y)*d);const G=[{x:C,y:y.y},{x:C,y:m.y}],U=[{x:y.x,y:E},{x:m.x,y:E}];f[v]===_?S=v==="x"?G:U:S=v==="x"?U:G}else{const G=[{x:y.x,y:m.y}],U=[{x:m.x,y:y.y}];if(v==="x"?S=f.x===_?U:G:S=f.y===_?G:U,r===l){const b=Math.abs(t[v]-o[v]);if(b<=u){const Y=Math.min(u-1,u-b);f[v]===_?N[v]=(y[v]>t[v]?-1:1)*Y:I[v]=(m[v]>o[v]?-1:1)*Y}}if(r!==l){const b=v==="x"?"y":"x",Y=f[v]===g[b],V=y[b]>m[b],W=y[b]=J?(C=(ee.x+q.x)/2,E=S[0].y):(C=S[0].x,E=(ee.y+q.y)/2)}const R={x:y.x+N.x,y:y.y+N.y},T={x:m.x+I.x,y:m.y+I.y};return[[t,...R.x!==S[0].x||R.y!==S[0].y?[R]:[],...S,...T.x!==S[S.length-1].x||T.y!==S[S.length-1].y?[T]:[],o],C,E,k,j]}function p1(t,r,o,l){const a=Math.min(_h(t,r)/2,_h(r,o)/2,l),{x:u,y:d}=r;if(t.x===u&&u===o.x||t.y===d&&d===o.y)return`L${u} ${d}`;if(t.y===d){const y=t.xo.id===r):t[0])||null}function Qu(t,r){return t?typeof t=="string"?t:`${r?`${r}__`:""}${Object.keys(t).sort().map(l=>`${l}=${t[l]}`).join("&")}`:""}function m1(t,{id:r,defaultColor:o,defaultMarkerStart:l,defaultMarkerEnd:a}){const u=new Set;return t.reduce((d,f)=>([f.markerStart||l,f.markerEnd||a].forEach(g=>{if(g&&typeof g=="object"){const y=Qu(g,r);u.has(y)||(d.push({id:y,color:g.color||o,...g}),u.add(y))}}),d),[]).sort((d,f)=>d.id.localeCompare(f.id))}const yg=1e3,y1=10,dc={nodeOrigin:[0,0],nodeExtent:So,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},v1={...dc,checkEquality:!0};function fc(t,r){const o={...t};for(const l in r)r[l]!==void 0&&(o[l]=r[l]);return o}function x1(t,r,o){const l=fc(dc,o);for(const a of t.values())if(a.parentId)pc(a,t,r,l);else{const u=Io(a,l.nodeOrigin),d=zr(a.extent)?a.extent:l.nodeExtent,f=Lr(u,d,rn(a));a.internals.positionAbsolute=f}}function w1(t,r){if(!t.handles)return t.measured?r==null?void 0:r.internals.handleBounds:void 0;const o=[],l=[];for(const a of t.handles){const u={id:a.id,width:a.width??1,height:a.height??1,nodeId:t.id,x:a.x,y:a.y,position:a.position,type:a.type};a.type==="source"?o.push(u):a.type==="target"&&l.push(u)}return{source:o,target:l}}function hc(t){return t==="manual"}function Ku(t,r,o,l={}){var m,x;const a=fc(v1,l),u={i:0},d=new Map(r),f=a!=null&&a.elevateNodesOnSelect&&!hc(a.zIndexMode)?yg:0;let g=t.length>0,y=!1;r.clear(),o.clear();for(const v of t){let _=d.get(v.id);if(a.checkEquality&&v===(_==null?void 0:_.internals.userNode))r.set(v.id,_);else{const S=Io(v,a.nodeOrigin),C=zr(v.extent)?v.extent:a.nodeExtent,E=Lr(S,C,rn(v));_={...a.defaults,...v,measured:{width:(m=v.measured)==null?void 0:m.width,height:(x=v.measured)==null?void 0:x.height},internals:{positionAbsolute:E,handleBounds:w1(v,_),z:vg(v,f,a.zIndexMode),userNode:v}},r.set(v.id,_)}(_.measured===void 0||_.measured.width===void 0||_.measured.height===void 0)&&!_.hidden&&(g=!1),v.parentId&&pc(_,r,o,l,u),y||(y=v.selected??!1)}return{nodesInitialized:g,hasSelectedNodes:y}}function _1(t,r){if(!t.parentId)return;const o=r.get(t.parentId);o?o.set(t.id,t):r.set(t.parentId,new Map([[t.id,t]]))}function pc(t,r,o,l,a){const{elevateNodesOnSelect:u,nodeOrigin:d,nodeExtent:f,zIndexMode:g}=fc(dc,l),y=t.parentId,m=r.get(y);if(!m){console.warn(`Parent node ${y} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}_1(t,o),a&&!m.parentId&&m.internals.rootParentIndex===void 0&&g==="auto"&&(m.internals.rootParentIndex=++a.i,m.internals.z=m.internals.z+a.i*y1),a&&m.internals.rootParentIndex!==void 0&&(a.i=m.internals.rootParentIndex);const x=u&&!hc(g)?yg:0,{x:v,y:_,z:S}=S1(t,m,d,f,x,g),{positionAbsolute:C}=t.internals,E=v!==C.x||_!==C.y;(E||S!==t.internals.z)&&r.set(t.id,{...t,internals:{...t.internals,positionAbsolute:E?{x:v,y:_}:C,z:S}})}function vg(t,r,o){const l=Jt(t.zIndex)?t.zIndex:0;return hc(o)?l:l+(t.selected?r:0)}function S1(t,r,o,l,a,u){const{x:d,y:f}=r.internals.positionAbsolute,g=rn(t),y=Io(t,o),m=zr(t.extent)?Lr(y,t.extent,g):y;let x=Lr({x:d+m.x,y:f+m.y},l,g);t.extent==="parent"&&(x=ig(x,g,r));const v=vg(t,a,u),_=r.internals.z??0;return{x:x.x,y:x.y,z:_>=v?_+1:v}}function gc(t,r,o,l=[0,0]){var d;const a=[],u=new Map;for(const f of t){const g=r.get(f.parentId);if(!g)continue;const y=((d=u.get(f.parentId))==null?void 0:d.expandedRect)??No(g),m=og(y,f.rect);u.set(f.parentId,{expandedRect:m,parent:g})}return u.size>0&&u.forEach(({expandedRect:f,parent:g},y)=>{var k;const m=g.internals.positionAbsolute,x=rn(g),v=g.origin??l,_=f.x0||S>0||N||I)&&(a.push({id:y,type:"position",position:{x:g.position.x-_+N,y:g.position.y-S+I}}),(k=o.get(y))==null||k.forEach(j=>{t.some(R=>R.id===j.id)||a.push({id:j.id,type:"position",position:{x:j.position.x+_,y:j.position.y+S}})})),(x.width0){const _=gc(v,r,o,a);y.push(..._)}return{changes:y,updatedInternals:g}}async function E1({delta:t,panZoom:r,transform:o,translateExtent:l,width:a,height:u}){if(!r||!t.x&&!t.y)return!1;const d=await r.setViewportConstrained({x:o[0]+t.x,y:o[1]+t.y,zoom:o[2]},[[0,0],[a,u]],l);return!!d&&(d.x!==o[0]||d.y!==o[1]||d.k!==o[2])}function Nh(t,r,o,l,a,u){let d=a;const f=l.get(d)||new Map;l.set(d,f.set(o,r)),d=`${a}-${t}`;const g=l.get(d)||new Map;if(l.set(d,g.set(o,r)),u){d=`${a}-${t}-${u}`;const y=l.get(d)||new Map;l.set(d,y.set(o,r))}}function xg(t,r,o){t.clear(),r.clear();for(const l of o){const{source:a,target:u,sourceHandle:d=null,targetHandle:f=null}=l,g={edgeId:l.id,source:a,target:u,sourceHandle:d,targetHandle:f},y=`${a}-${d}--${u}-${f}`,m=`${u}-${f}--${a}-${d}`;Nh("source",g,m,t,a,d),Nh("target",g,y,t,u,f),r.set(l.id,l)}}function wg(t,r){if(!t.parentId)return!1;const o=r.get(t.parentId);return o?o.selected?!0:wg(o,r):!1}function Ch(t,r,o){var a;let l=t;do{if((a=l==null?void 0:l.matches)!=null&&a.call(l,r))return!0;if(l===o)return!1;l=l==null?void 0:l.parentElement}while(l);return!1}function N1(t,r,o,l){const a=new Map;for(const[u,d]of t)if((d.selected||d.id===l)&&(!d.parentId||!wg(d,t))&&(d.draggable||r&&typeof d.draggable>"u")){const f=t.get(u);f&&a.set(u,{id:u,position:f.position||{x:0,y:0},distance:{x:o.x-f.internals.positionAbsolute.x,y:o.y-f.internals.positionAbsolute.y},extent:f.extent,parentId:f.parentId,origin:f.origin,expandParent:f.expandParent,internals:{positionAbsolute:f.internals.positionAbsolute||{x:0,y:0}},measured:{width:f.measured.width??0,height:f.measured.height??0}})}return a}function Mu({nodeId:t,dragItems:r,nodeLookup:o,dragging:l=!0}){var d,f,g;const a=[];for(const[y,m]of r){const x=(d=o.get(y))==null?void 0:d.internals.userNode;x&&a.push({...x,position:m.position,dragging:l})}if(!t)return[a[0],a];const u=(f=o.get(t))==null?void 0:f.internals.userNode;return[u?{...u,position:((g=r.get(t))==null?void 0:g.position)||u.position,dragging:l}:a[0],a]}function C1({dragItems:t,snapGrid:r,x:o,y:l}){const a=t.values().next().value;if(!a)return null;const u={x:o-a.distance.x,y:l-a.distance.y},d=Ro(u,r);return{x:d.x-u.x,y:d.y-u.y}}function j1({onNodeMouseDown:t,getStoreItems:r,onDragStart:o,onDrag:l,onDragStop:a}){let u={x:null,y:null},d=0,f=new Map,g=!1,y={x:0,y:0},m=null,x=!1,v=null,_=!1,S=!1,C=null;function E({noDragClassName:I,handleSelector:k,domNode:j,isSelectable:R,nodeId:T,nodeClickDistance:B=0}){v=zt(j);function G({x:te,y:J}){const{nodeLookup:b,nodeExtent:Y,snapGrid:V,snapToGrid:W,nodeOrigin:D,onNodeDrag:A,onSelectionDrag:H,onError:M,updateNodePositions:L}=r();u={x:te,y:J};let ne=!1;const re=f.size>1,ce=re&&Y?Xu(To(f)):null,fe=re&&W?C1({dragItems:f,snapGrid:V,x:te,y:J}):null;for(const[de,K]of f){if(!b.has(de))continue;let se={x:te-K.distance.x,y:J-K.distance.y};W&&(se=fe?{x:Math.round(se.x+fe.x),y:Math.round(se.y+fe.y)}:Ro(se,V));let pe=null;if(re&&Y&&!K.extent&&ce){const{positionAbsolute:ye}=K.internals,Ne=ye.x-ce.x+Y[0][0],Pe=ye.x+K.measured.width-ce.x2+Y[1][0],je=ye.y-ce.y+Y[0][1],Me=ye.y+K.measured.height-ce.y2+Y[1][1];pe=[[Ne,je],[Pe,Me]]}const{position:_e,positionAbsolute:me}=rg({nodeId:de,nextPosition:se,nodeLookup:b,nodeExtent:pe||Y,nodeOrigin:D,onError:M});ne=ne||K.position.x!==_e.x||K.position.y!==_e.y,K.position=_e,K.internals.positionAbsolute=me}if(S=S||ne,!!ne&&(L(f,!0),C&&(l||A||!T&&H))){const[de,K]=Mu({nodeId:T,dragItems:f,nodeLookup:b});l==null||l(C,f,de,K),A==null||A(C,de,K),T||H==null||H(C,K)}}async function U(){if(!m)return;const{transform:te,panBy:J,autoPanSpeed:b,autoPanOnNodeDrag:Y}=r();if(!Y){g=!1,cancelAnimationFrame(d);return}const[V,W]=ac(y,m,b);(V!==0||W!==0)&&(u.x=(u.x??0)-V/te[2],u.y=(u.y??0)-W/te[2],await J({x:V,y:W})&&G(u)),d=requestAnimationFrame(U)}function ee(te){var re;const{nodeLookup:J,multiSelectionActive:b,nodesDraggable:Y,transform:V,snapGrid:W,snapToGrid:D,selectNodesOnDrag:A,onNodeDragStart:H,onSelectionDragStart:M,unselectNodesAndEdges:L}=r();x=!0,(!A||!R)&&!b&&T&&((re=J.get(T))!=null&&re.selected||L()),R&&A&&T&&(t==null||t(T));const ne=mo(te.sourceEvent,{transform:V,snapGrid:W,snapToGrid:D,containerBounds:m});if(u=ne,f=N1(J,Y,ne,T),f.size>0&&(o||H||!T&&M)){const[ce,fe]=Mu({nodeId:T,dragItems:f,nodeLookup:J});o==null||o(te.sourceEvent,f,ce,fe),H==null||H(te.sourceEvent,ce,fe),T||M==null||M(te.sourceEvent,fe)}}const q=Ap().clickDistance(B).on("start",te=>{const{domNode:J,nodeDragThreshold:b,transform:Y,snapGrid:V,snapToGrid:W}=r();m=(J==null?void 0:J.getBoundingClientRect())||null,_=!1,S=!1,C=te.sourceEvent,b===0&&ee(te),u=mo(te.sourceEvent,{transform:Y,snapGrid:V,snapToGrid:W,containerBounds:m}),y=en(te.sourceEvent,m)}).on("drag",te=>{const{autoPanOnNodeDrag:J,transform:b,snapGrid:Y,snapToGrid:V,nodeDragThreshold:W,nodeLookup:D}=r(),A=mo(te.sourceEvent,{transform:b,snapGrid:Y,snapToGrid:V,containerBounds:m});if(C=te.sourceEvent,(te.sourceEvent.type==="touchmove"&&te.sourceEvent.touches.length>1||T&&!D.has(T))&&(_=!0),!_){if(!g&&J&&x&&(g=!0,U()),!x){const H=en(te.sourceEvent,m),M=H.x-y.x,L=H.y-y.y;Math.sqrt(M*M+L*L)>W&&ee(te)}(u.x!==A.xSnapped||u.y!==A.ySnapped)&&f&&x&&(y=en(te.sourceEvent,m),G(A))}}).on("end",te=>{if(!x||_){_&&f.size>0&&r().updateNodePositions(f,!1);return}if(g=!1,x=!1,cancelAnimationFrame(d),f.size>0){const{nodeLookup:J,updateNodePositions:b,onNodeDragStop:Y,onSelectionDragStop:V}=r();if(S&&(b(f,!1),S=!1),a||Y||!T&&V){const[W,D]=Mu({nodeId:T,dragItems:f,nodeLookup:J,dragging:!1});a==null||a(te.sourceEvent,f,W,D),Y==null||Y(te.sourceEvent,W,D),T||V==null||V(te.sourceEvent,D)}}}).filter(te=>{const J=te.target;return!te.button&&(!I||!Ch(J,`.${I}`,j))&&(!k||Ch(J,k,j))});v.call(q)}function N(){v==null||v.on(".drag",null)}return{update:E,destroy:N}}function b1(t,r,o){const l=[],a={x:t.x-o,y:t.y-o,width:o*2,height:o*2};for(const u of r.values())pl(a,No(u))>0&&l.push(u);return l}const M1=250;function P1(t,r,o,l){var f,g;let a=[],u=1/0;const d=b1(t,o,r+M1);for(const y of d){const m=[...((f=y.internals.handleBounds)==null?void 0:f.source)??[],...((g=y.internals.handleBounds)==null?void 0:g.target)??[]];for(const x of m){if(l.nodeId===x.nodeId&&l.type===x.type&&l.id===x.id)continue;const{x:v,y:_}=Ar(y,x,x.position,!0),S=Math.sqrt(Math.pow(v-t.x,2)+Math.pow(_-t.y,2));S>r||(S1){const y=l.type==="source"?"target":"source";return a.find(m=>m.type===y)??a[0]}return a[0]}function _g(t,r,o,l,a,u=!1){var y,m,x;const d=l.get(t);if(!d)return null;const f=a==="strict"?(y=d.internals.handleBounds)==null?void 0:y[r]:[...((m=d.internals.handleBounds)==null?void 0:m.source)??[],...((x=d.internals.handleBounds)==null?void 0:x.target)??[]],g=(o?f==null?void 0:f.find(v=>v.id===o):f==null?void 0:f[0])??null;return g&&u?{...g,...Ar(d,g,g.position,!0)}:g}function Sg(t,r){return t||(r!=null&&r.classList.contains("target")?"target":r!=null&&r.classList.contains("source")?"source":null)}function I1(t,r){let o=null;return r?o=!0:t&&!r&&(o=!1),o}const kg=()=>!0;function T1(t,{connectionMode:r,connectionRadius:o,handleId:l,nodeId:a,edgeUpdaterType:u,isTarget:d,domNode:f,nodeLookup:g,lib:y,autoPanOnConnect:m,flowId:x,panBy:v,cancelConnection:_,onConnectStart:S,onConnect:C,onConnectEnd:E,isValidConnection:N=kg,onReconnectEnd:I,updateConnection:k,getTransform:j,getFromHandle:R,autoPanSpeed:T,dragThreshold:B=1,handleDomNode:G}){const U=cg(t.target);let ee=0,q;const{x:te,y:J}=en(t),b=Sg(u,G),Y=f==null?void 0:f.getBoundingClientRect();let V=!1;if(!Y||!b)return;const W=_g(a,b,l,g,r);if(!W)return;let D=en(t,Y),A=!1,H=null,M=!1,L=null;function ne(){if(!m||!Y)return;const[_e,me]=ac(D,Y,T);v({x:_e,y:me}),ee=requestAnimationFrame(ne)}const re={...W,nodeId:a,type:b,position:W.position},ce=g.get(a);let de={inProgress:!0,isValid:null,from:Ar(ce,re,Se.Left,!0),fromHandle:re,fromPosition:re.position,fromNode:ce,to:D,toHandle:null,toPosition:ph[re.position],toNode:null,pointer:D};function K(){V=!0,k(de),S==null||S(t,{nodeId:a,handleId:l,handleType:b})}B===0&&K();function se(_e){if(!V){const{x:Me,y:tt}=en(_e),Ge=Me-te,nt=tt-J;if(!(Ge*Ge+nt*nt>B*B))return;K()}if(!R()||!re){pe(_e);return}const me=j();D=en(_e,Y),q=P1(Lo(D,me,!1,[1,1]),o,g,re),A||(ne(),A=!0);const ye=Eg(_e,{handle:q,connectionMode:r,fromNodeId:a,fromHandleId:l,fromType:d?"target":"source",isValidConnection:N,doc:U,lib:y,flowId:x,nodeLookup:g});L=ye.handleDomNode,H=ye.connection,M=I1(!!q,ye.isValid);const Ne=g.get(a),Pe=Ne?Ar(Ne,re,Se.Left,!0):de.from,je={...de,from:Pe,isValid:M,to:ye.toHandle&&M?Si({x:ye.toHandle.x,y:ye.toHandle.y},me):D,toHandle:ye.toHandle,toPosition:M&&ye.toHandle?ye.toHandle.position:ph[re.position],toNode:ye.toHandle?g.get(ye.toHandle.nodeId):null,pointer:D};k(je),de=je}function pe(_e){if(!("touches"in _e&&_e.touches.length>0)){if(V){(q||L)&&H&&M&&(C==null||C(H));const{inProgress:me,...ye}=de,Ne={...ye,toPosition:de.toHandle?de.toPosition:null};E==null||E(_e,Ne),u&&(I==null||I(_e,Ne))}_(),cancelAnimationFrame(ee),A=!1,M=!1,H=null,L=null,U.removeEventListener("mousemove",se),U.removeEventListener("mouseup",pe),U.removeEventListener("touchmove",se),U.removeEventListener("touchend",pe)}}U.addEventListener("mousemove",se),U.addEventListener("mouseup",pe),U.addEventListener("touchmove",se),U.addEventListener("touchend",pe)}function Eg(t,{handle:r,connectionMode:o,fromNodeId:l,fromHandleId:a,fromType:u,doc:d,lib:f,flowId:g,isValidConnection:y=kg,nodeLookup:m}){const x=u==="target",v=r?d.querySelector(`.${f}-flow__handle[data-id="${g}-${r==null?void 0:r.nodeId}-${r==null?void 0:r.id}-${r==null?void 0:r.type}"]`):null,{x:_,y:S}=en(t),C=d.elementFromPoint(_,S),E=C!=null&&C.classList.contains(`${f}-flow__handle`)?C:v,N={handleDomNode:E,isValid:!1,connection:null,toHandle:null};if(E){const I=Sg(void 0,E),k=E.getAttribute("data-nodeid"),j=E.getAttribute("data-handleid"),R=E.classList.contains("connectable"),T=E.classList.contains("connectableend");if(!k||!I)return N;const B={source:x?k:l,sourceHandle:x?j:a,target:x?l:k,targetHandle:x?a:j};N.connection=B;const U=R&&T&&(o===wi.Strict?x&&I==="source"||!x&&I==="target":k!==l||j!==a);N.isValid=U&&y(B),N.toHandle=_g(k,I,j,m,o,!0)}return N}const qu={onPointerDown:T1,isValid:Eg};function R1({domNode:t,panZoom:r,getTransform:o,getViewScale:l}){const a=zt(t);function u({translateExtent:f,width:g,height:y,zoomStep:m=1,pannable:x=!0,zoomable:v=!0,inversePan:_=!1}){const S=k=>{if(k.sourceEvent.type!=="wheel"||!r)return;const j=o(),R=k.sourceEvent.ctrlKey&&Co()?10:1,T=-k.sourceEvent.deltaY*(k.sourceEvent.deltaMode===1?.05:k.sourceEvent.deltaMode?1:.002)*m,B=j[2]*Math.pow(2,T*R);r.scaleTo(B)};let C=[0,0];const E=k=>{(k.sourceEvent.type==="mousedown"||k.sourceEvent.type==="touchstart")&&(C=[k.sourceEvent.clientX??k.sourceEvent.touches[0].clientX,k.sourceEvent.clientY??k.sourceEvent.touches[0].clientY])},N=k=>{const j=o();if(k.sourceEvent.type!=="mousemove"&&k.sourceEvent.type!=="touchmove"||!r)return;const R=[k.sourceEvent.clientX??k.sourceEvent.touches[0].clientX,k.sourceEvent.clientY??k.sourceEvent.touches[0].clientY],T=[R[0]-C[0],R[1]-C[1]];C=R;const B=l()*Math.max(j[2],Math.log(j[2]))*(_?-1:1),G={x:j[0]-T[0]*B,y:j[1]-T[1]*B},U=[[0,0],[g,y]];r.setViewportConstrained({x:G.x,y:G.y,zoom:j[2]},U,f)},I=qp().on("start",E).on("zoom",x?N:null).on("zoom.wheel",v?S:null);a.call(I,{})}function d(){a.on("zoom",null)}return{update:u,destroy:d,pointer:qt}}const Nl=t=>({x:t.x,y:t.y,zoom:t.k}),Pu=({x:t,y:r,zoom:o})=>Sl.translate(t,r).scale(o),tr=(t,r)=>t.target.closest(`.${r}`),Ng=(t,r)=>r===2&&Array.isArray(t)&&t.includes(2),L1=t=>((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2,Iu=(t,r=0,o=L1,l=()=>{})=>{const a=typeof r=="number"&&r>0;return a||l(),a?t.transition().duration(r).ease(o).on("end",l):t},Cg=t=>{const r=t.ctrlKey&&Co()?10:1;return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*r};function z1({zoomPanValues:t,noWheelClassName:r,d3Selection:o,d3Zoom:l,panOnScrollMode:a,panOnScrollSpeed:u,zoomOnPinch:d,onPanZoomStart:f,onPanZoom:g,onPanZoomEnd:y}){return m=>{if(tr(m,r))return m.ctrlKey&&m.preventDefault(),!1;m.preventDefault(),m.stopImmediatePropagation();const x=o.property("__zoom").k||1;if(m.ctrlKey&&d){const E=qt(m),N=Cg(m),I=x*Math.pow(2,N);l.scaleTo(o,I,E,m);return}const v=m.deltaMode===1?20:1;let _=a===Ir.Vertical?0:m.deltaX*v,S=a===Ir.Horizontal?0:m.deltaY*v;!Co()&&m.shiftKey&&a!==Ir.Vertical&&(_=m.deltaY*v,S=0),l.translateBy(o,-(_/x)*u,-(S/x)*u,{internal:!0});const C=Nl(o.property("__zoom"));clearTimeout(t.panScrollTimeout),t.isPanScrolling?g==null||g(m,C):(t.isPanScrolling=!0,f==null||f(m,C)),t.panScrollTimeout=setTimeout(()=>{y==null||y(m,C),t.isPanScrolling=!1},150)}}function A1({noWheelClassName:t,preventScrolling:r,d3ZoomHandler:o}){return function(l,a){const u=l.type==="wheel",d=!r&&u&&!l.ctrlKey,f=tr(l,t);if(l.ctrlKey&&u&&f&&l.preventDefault(),d||f)return null;l.preventDefault(),o.call(this,l,a)}}function D1({zoomPanValues:t,onDraggingChange:r,onPanZoomStart:o}){return l=>{var u,d,f;if((u=l.sourceEvent)!=null&&u.internal)return;const a=Nl(l.transform);t.mouseButton=((d=l.sourceEvent)==null?void 0:d.button)||0,t.isZoomingOrPanning=!0,t.prevViewport=a,((f=l.sourceEvent)==null?void 0:f.type)==="mousedown"&&r(!0),o&&(o==null||o(l.sourceEvent,a))}}function $1({zoomPanValues:t,panOnDrag:r,onPaneContextMenu:o,onTransformChange:l,onPanZoom:a}){return u=>{var d,f;t.usedRightMouseButton=!!(o&&Ng(r,t.mouseButton??0)),(d=u.sourceEvent)!=null&&d.sync||l([u.transform.x,u.transform.y,u.transform.k]),a&&!((f=u.sourceEvent)!=null&&f.internal)&&(a==null||a(u.sourceEvent,Nl(u.transform)))}}function O1({zoomPanValues:t,panOnDrag:r,panOnScroll:o,onDraggingChange:l,onPanZoomEnd:a,onPaneContextMenu:u}){return d=>{var f;if(!((f=d.sourceEvent)!=null&&f.internal)&&(t.isZoomingOrPanning=!1,u&&Ng(r,t.mouseButton??0)&&!t.usedRightMouseButton&&d.sourceEvent&&u(d.sourceEvent),t.usedRightMouseButton=!1,l(!1),a)){const g=Nl(d.transform);t.prevViewport=g,clearTimeout(t.timerId),t.timerId=setTimeout(()=>{a==null||a(d.sourceEvent,g)},o?150:0)}}}function F1({panActivationKeyPressed:t,zoomActivationKeyPressed:r,zoomOnScroll:o,zoomOnPinch:l,panOnDrag:a,panOnScroll:u,zoomOnDoubleClick:d,userSelectionActive:f,noWheelClassName:g,noPanClassName:y,lib:m,connectionInProgress:x}){return v=>{var N;const _=r||o,S=l&&v.ctrlKey,C=v.type==="wheel";if(v.button===1&&v.type==="mousedown"&&(tr(v,`${m}-flow__node`)||tr(v,`${m}-flow__edge`)||tr(v,`${m}-flow__selection`)||tr(v,`${m}-flow__nodesselection`)))return!0;if(!a&&!_&&!u&&!d&&!l||f||x&&!C||tr(v,g)&&C||tr(v,y)&&(!C||u&&C&&!r)||!l&&v.ctrlKey&&C)return!1;if(!l&&v.type==="touchstart"&&((N=v.touches)==null?void 0:N.length)>1)return v.preventDefault(),!1;if(!_&&!u&&!S&&C||!a&&(v.type==="mousedown"||v.type==="touchstart")||Array.isArray(a)&&!a.includes(v.button)&&v.type==="mousedown")return!1;const E=Array.isArray(a)&&a.includes(v.button)||!v.button||v.button<=1;return(!v.ctrlKey||C||t)&&E}}function H1({domNode:t,minZoom:r,maxZoom:o,translateExtent:l,viewport:a,onPanZoom:u,onPanZoomStart:d,onPanZoomEnd:f,onDraggingChange:g}){const y={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},m=t.getBoundingClientRect();let x=[[0,0],[m.width,m.height]];const v=typeof ResizeObserver<"u"?new ResizeObserver(J=>{const b=J[0];b&&(x=[[0,0],[b.contentRect.width,b.contentRect.height]])}):null;v==null||v.observe(t);const _=qp().extent(()=>x).scaleExtent([r,o]).translateExtent(l),S=zt(t).call(_);j({x:a.x,y:a.y,zoom:_i(a.zoom,r,o)},[[0,0],[m.width,m.height]],l);const C=S.on("wheel.zoom"),E=S.on("dblclick.zoom");_.wheelDelta(Cg);async function N(J,b){return S?new Promise(Y=>{_==null||_.interpolate((b==null?void 0:b.interpolate)==="linear"?go:nl).transform(Iu(S,b==null?void 0:b.duration,b==null?void 0:b.ease,()=>Y(!0)),J)}):!1}function I({noWheelClassName:J,noPanClassName:b,onPaneContextMenu:Y,userSelectionActive:V,panOnScroll:W,panOnDrag:D,panOnScrollMode:A,panOnScrollSpeed:H,preventScrolling:M,zoomOnPinch:L,zoomOnScroll:ne,zoomOnDoubleClick:re,panActivationKeyPressed:ce=!1,zoomActivationKeyPressed:fe,lib:de,onTransformChange:K,connectionInProgress:se,paneClickDistance:pe,selectionOnDrag:_e}){V&&!y.isZoomingOrPanning&&k();const me=W&&!fe&&!V;_.clickDistance(_e?1/0:!Jt(pe)||pe<0?0:pe);const ye=me?z1({zoomPanValues:y,noWheelClassName:J,d3Selection:S,d3Zoom:_,panOnScrollMode:A,panOnScrollSpeed:H,zoomOnPinch:L,onPanZoomStart:d,onPanZoom:u,onPanZoomEnd:f}):A1({noWheelClassName:J,preventScrolling:M,d3ZoomHandler:C});S.on("wheel.zoom",ye,{passive:!1});const Ne=D1({zoomPanValues:y,onDraggingChange:g,onPanZoomStart:d});_.on("start",Ne);const Pe=$1({zoomPanValues:y,panOnDrag:D,onPaneContextMenu:!!Y,onPanZoom:u,onTransformChange:K});_.on("zoom",Pe);const je=O1({zoomPanValues:y,panOnDrag:D,panOnScroll:W,onPaneContextMenu:Y,onPanZoomEnd:f,onDraggingChange:g});_.on("end",je);const Me=F1({panActivationKeyPressed:ce,zoomActivationKeyPressed:fe,panOnDrag:D,zoomOnScroll:ne,panOnScroll:W,zoomOnDoubleClick:re,zoomOnPinch:L,userSelectionActive:V,noPanClassName:b,noWheelClassName:J,lib:de,connectionInProgress:se});_.filter(Me),re?S.on("dblclick.zoom",E):S.on("dblclick.zoom",null)}function k(){_.on("zoom",null)}async function j(J,b,Y){const V=Pu(J),W=_==null?void 0:_.constrain()(V,b,Y);return W&&await N(W),W}async function R(J,b){const Y=Pu(J);return await N(Y,b),Y}function T(J){if(S){const b=Pu(J),Y=S.property("__zoom");(Y.k!==J.zoom||Y.x!==J.x||Y.y!==J.y)&&(_==null||_.transform(S,b,null,{sync:!0}))}}function B(){const J=S?Kp(S.node()):{x:0,y:0,k:1};return{x:J.x,y:J.y,zoom:J.k}}async function G(J,b){return S?new Promise(Y=>{_==null||_.interpolate((b==null?void 0:b.interpolate)==="linear"?go:nl).scaleTo(Iu(S,b==null?void 0:b.duration,b==null?void 0:b.ease,()=>Y(!0)),J)}):!1}async function U(J,b){return S?new Promise(Y=>{_==null||_.interpolate((b==null?void 0:b.interpolate)==="linear"?go:nl).scaleBy(Iu(S,b==null?void 0:b.duration,b==null?void 0:b.ease,()=>Y(!0)),J)}):!1}function ee(J){_==null||_.scaleExtent(J)}function q(J){_==null||_.translateExtent(J)}function te(J){const b=!Jt(J)||J<0?0:J;_==null||_.clickDistance(b)}return{update:I,destroy:k,setViewport:R,setViewportConstrained:j,getViewport:B,scaleTo:G,scaleBy:U,setScaleExtent:ee,setTranslateExtent:q,syncViewport:T,setClickDistance:te}}var ki;(function(t){t.Line="line",t.Handle="handle"})(ki||(ki={}));function B1({width:t,prevWidth:r,height:o,prevHeight:l,affectsX:a,affectsY:u}){const d=t-r,f=o-l,g=[d>0?1:d<0?-1:0,f>0?1:f<0?-1:0];return d&&a&&(g[0]=g[0]*-1),f&&u&&(g[1]=g[1]*-1),g}function jh(t){const r=t.includes("right")||t.includes("left"),o=t.includes("bottom")||t.includes("top"),l=t.includes("left"),a=t.includes("top");return{isHorizontal:r,isVertical:o,affectsX:l,affectsY:a}}function Jn(t,r){return Math.max(0,r-t)}function er(t,r){return Math.max(0,t-r)}function qs(t,r,o){return Math.max(0,r-t,t-o)}function bh(t,r){return t?!r:r}function V1(t,r,o,l,a,u,d,f){let{affectsX:g,affectsY:y}=r;const{isHorizontal:m,isVertical:x}=r,v=m&&x,{xSnapped:_,ySnapped:S}=o,{minWidth:C,maxWidth:E,minHeight:N,maxHeight:I}=l,{x:k,y:j,width:R,height:T,aspectRatio:B}=t;let G=Math.floor(m?_-t.pointerX:0),U=Math.floor(x?S-t.pointerY:0);const ee=R+(g?-G:G),q=T+(y?-U:U),te=-u[0]*R,J=-u[1]*T;let b=qs(ee,C,E),Y=qs(q,N,I);if(d){let D=0,A=0;g&&G<0?D=Jn(k+G+te,d[0][0]):!g&&G>0&&(D=er(k+ee+te,d[1][0])),y&&U<0?A=Jn(j+U+J,d[0][1]):!y&&U>0&&(A=er(j+q+J,d[1][1])),b=Math.max(b,D),Y=Math.max(Y,A)}if(f){let D=0,A=0;g&&G>0?D=er(k+G,f[0][0]):!g&&G<0&&(D=Jn(k+ee,f[1][0])),y&&U>0?A=er(j+U,f[0][1]):!y&&U<0&&(A=Jn(j+q,f[1][1])),b=Math.max(b,D),Y=Math.max(Y,A)}if(a){if(m){const D=qs(ee/B,N,I)*B;if(b=Math.max(b,D),d){let A=0;!g&&!y||g&&!y&&v?A=er(j+J+ee/B,d[1][1])*B:A=Jn(j+J+(g?G:-G)/B,d[0][1])*B,b=Math.max(b,A)}if(f){let A=0;!g&&!y||g&&!y&&v?A=Jn(j+ee/B,f[1][1])*B:A=er(j+(g?G:-G)/B,f[0][1])*B,b=Math.max(b,A)}}if(x){const D=qs(q*B,C,E)/B;if(Y=Math.max(Y,D),d){let A=0;!g&&!y||y&&!g&&v?A=er(k+q*B+te,d[1][0])/B:A=Jn(k+(y?U:-U)*B+te,d[0][0])/B,Y=Math.max(Y,A)}if(f){let A=0;!g&&!y||y&&!g&&v?A=Jn(k+q*B,f[1][0])/B:A=er(k+(y?U:-U)*B,f[0][0])/B,Y=Math.max(Y,A)}}}U=U+(U<0?Y:-Y),G=G+(G<0?b:-b),a&&(v?ee>q*B?U=(bh(g,y)?-G:G)/B:G=(bh(g,y)?-U:U)*B:m?(U=G/B,y=g):(G=U*B,g=y));const V=g?k+G:k,W=y?j+U:j;return{width:R+(g?-G:G),height:T+(y?-U:U),x:u[0]*G*(g?-1:1)+V,y:u[1]*U*(y?-1:1)+W}}const jg={width:0,height:0,x:0,y:0},U1={...jg,pointerX:0,pointerY:0,aspectRatio:1};function W1(t,r,o){const l=r.position.x+t.position.x,a=r.position.y+t.position.y,u=t.measured.width??0,d=t.measured.height??0,f=o[0]*u,g=o[1]*d;return[[l-f,a-g],[l+u-f,a+d-g]]}function Y1({domNode:t,nodeId:r,getStoreItems:o,onChange:l,onEnd:a}){const u=zt(t);let d={controlDirection:jh("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function f({controlPosition:y,boundaries:m,keepAspectRatio:x,resizeDirection:v,onResizeStart:_,onResize:S,onResizeEnd:C,shouldResize:E}){let N={...jg},I={...U1};d={boundaries:m,resizeDirection:v,keepAspectRatio:x,controlDirection:jh(y)};let k,j=null,R=[],T,B,G,U=!1;const ee=Ap().on("start",q=>{const{nodeLookup:te,transform:J,snapGrid:b,snapToGrid:Y,nodeOrigin:V,paneDomNode:W}=o();if(k=te.get(r),!k)return;j=(W==null?void 0:W.getBoundingClientRect())??null;const{xSnapped:D,ySnapped:A}=mo(q.sourceEvent,{transform:J,snapGrid:b,snapToGrid:Y,containerBounds:j});N={width:k.measured.width??0,height:k.measured.height??0,x:k.position.x??0,y:k.position.y??0},I={...N,pointerX:D,pointerY:A,aspectRatio:N.width/N.height},T=void 0,B=zr(k.extent)?k.extent:void 0,k.parentId&&(k.extent==="parent"||k.expandParent)&&(T=te.get(k.parentId)),T&&k.extent==="parent"&&(B=[[0,0],[T.measured.width,T.measured.height]]),R=[],G=void 0;for(const[H,M]of te)if(M.parentId===r&&(R.push({id:H,position:{...M.position},extent:M.extent}),M.extent==="parent"||M.expandParent)){const L=W1(M,k,M.origin??V);G?G=[[Math.min(L[0][0],G[0][0]),Math.min(L[0][1],G[0][1])],[Math.max(L[1][0],G[1][0]),Math.max(L[1][1],G[1][1])]]:G=L}_==null||_(q,{...N})}).on("drag",q=>{const{transform:te,snapGrid:J,snapToGrid:b,nodeOrigin:Y}=o(),V=mo(q.sourceEvent,{transform:te,snapGrid:J,snapToGrid:b,containerBounds:j}),W=[];if(!k)return;const{x:D,y:A,width:H,height:M}=N,L={},ne=k.origin??Y,{width:re,height:ce,x:fe,y:de}=V1(I,d.controlDirection,V,d.boundaries,d.keepAspectRatio,ne,B,G),K=re!==H,se=ce!==M,pe=fe!==D&&K,_e=de!==A&&se;if(!pe&&!_e&&!K&&!se)return;if((pe||_e||ne[0]===1||ne[1]===1)&&(L.x=pe?fe:N.x,L.y=_e?de:N.y,N.x=L.x,N.y=L.y,R.length>0)){const Pe=fe-D,je=de-A;for(const Me of R)Me.position={x:Me.position.x-Pe+ne[0]*(re-H),y:Me.position.y-je+ne[1]*(ce-M)},W.push(Me)}if((K||se)&&(L.width=K&&(!d.resizeDirection||d.resizeDirection==="horizontal")?re:N.width,L.height=se&&(!d.resizeDirection||d.resizeDirection==="vertical")?ce:N.height,N.width=L.width,N.height=L.height),T&&k.expandParent){const Pe=ne[0]*(L.width??0);L.x&&L.x{U&&(C==null||C(q,{...N}),a==null||a({...N}),U=!1)});u.call(ee)}function g(){u.on(".drag",null)}return{update:f,destroy:g}}var Tu={exports:{}},Ru={},Lu={exports:{}},zu={};/** + * @license React + * use-sync-external-store-shim.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Mh;function X1(){if(Mh)return zu;Mh=1;var t=bo();function r(x,v){return x===v&&(x!==0||1/x===1/v)||x!==x&&v!==v}var o=typeof Object.is=="function"?Object.is:r,l=t.useState,a=t.useEffect,u=t.useLayoutEffect,d=t.useDebugValue;function f(x,v){var _=v(),S=l({inst:{value:_,getSnapshot:v}}),C=S[0].inst,E=S[1];return u(function(){C.value=_,C.getSnapshot=v,g(C)&&E({inst:C})},[x,_,v]),a(function(){return g(C)&&E({inst:C}),x(function(){g(C)&&E({inst:C})})},[x]),d(_),_}function g(x){var v=x.getSnapshot;x=x.value;try{var _=v();return!o(x,_)}catch{return!0}}function y(x,v){return v()}var m=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?y:f;return zu.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:m,zu}var Ph;function G1(){return Ph||(Ph=1,Lu.exports=X1()),Lu.exports}/** + * @license React + * use-sync-external-store-shim/with-selector.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ih;function Q1(){if(Ih)return Ru;Ih=1;var t=bo(),r=G1();function o(y,m){return y===m&&(y!==0||1/y===1/m)||y!==y&&m!==m}var l=typeof Object.is=="function"?Object.is:o,a=r.useSyncExternalStore,u=t.useRef,d=t.useEffect,f=t.useMemo,g=t.useDebugValue;return Ru.useSyncExternalStoreWithSelector=function(y,m,x,v,_){var S=u(null);if(S.current===null){var C={hasValue:!1,value:null};S.current=C}else C=S.current;S=f(function(){function N(T){if(!I){if(I=!0,k=T,T=v(T),_!==void 0&&C.hasValue){var B=C.value;if(_(B,T))return j=B}return j=T}if(B=j,l(k,T))return B;var G=v(T);return _!==void 0&&_(B,G)?(k=T,B):(k=T,j=G)}var I=!1,k,j,R=x===void 0?null:x;return[function(){return N(m())},R===null?void 0:function(){return N(R())}]},[m,x,v,_]);var E=a(y,S[0],S[1]);return d(function(){C.hasValue=!0,C.value=E},[E]),g(E),E},Ru}var Th;function K1(){return Th||(Th=1,Tu.exports=Q1()),Tu.exports}var q1=K1();const Z1=xp(q1),J1={},Rh=t=>{let r;const o=new Set,l=(m,x)=>{const v=typeof m=="function"?m(r):m;if(!Object.is(v,r)){const _=r;r=x??(typeof v!="object"||v===null)?v:Object.assign({},r,v),o.forEach(S=>S(r,_))}},a=()=>r,g={setState:l,getState:a,getInitialState:()=>y,subscribe:m=>(o.add(m),()=>o.delete(m)),destroy:()=>{(J1?"production":void 0)!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),o.clear()}},y=r=t(l,a,g);return g},e_=t=>t?Rh(t):Rh,{useDebugValue:t_}=Zy,{useSyncExternalStoreWithSelector:n_}=Z1,r_=t=>t;function bg(t,r=r_,o){const l=n_(t.subscribe,t.getState,t.getServerState||t.getInitialState,r,o);return t_(l),l}const Lh=(t,r)=>{const o=e_(t),l=(a,u=r)=>bg(o,a,u);return Object.assign(l,o),l},i_=(t,r)=>t?Lh(t,r):Lh;function Xe(t,r){if(Object.is(t,r))return!0;if(typeof t!="object"||t===null||typeof r!="object"||r===null)return!1;if(t instanceof Map&&r instanceof Map){if(t.size!==r.size)return!1;for(const[l,a]of t)if(!Object.is(a,r.get(l)))return!1;return!0}if(t instanceof Set&&r instanceof Set){if(t.size!==r.size)return!1;for(const l of t)if(!r.has(l))return!1;return!0}const o=Object.keys(t);if(o.length!==Object.keys(r).length)return!1;for(const l of o)if(!Object.prototype.hasOwnProperty.call(r,l)||!Object.is(t[l],r[l]))return!1;return!0}wp();const Cl=$.createContext(null),o_=Cl.Provider,Mg=tn.error001("react");function Re(t,r){const o=$.useContext(Cl);if(o===null)throw new Error(Mg);return bg(o,t,r)}function He(){const t=$.useContext(Cl);if(t===null)throw new Error(Mg);return $.useMemo(()=>({getState:t.getState,setState:t.setState,subscribe:t.subscribe}),[t])}const zh={display:"none"},s_={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},Pg="react-flow__node-desc",Ig="react-flow__edge-desc",l_="react-flow__aria-live",a_=t=>t.ariaLiveMessage,u_=t=>t.ariaLabelConfig;function c_({rfId:t}){const r=Re(a_);return p.jsx("div",{id:`${l_}-${t}`,"aria-live":"assertive","aria-atomic":"true",style:s_,children:r})}function d_({rfId:t,disableKeyboardA11y:r}){const o=Re(u_);return p.jsxs(p.Fragment,{children:[p.jsx("div",{id:`${Pg}-${t}`,style:zh,children:r?o["node.a11yDescription.default"]:o["node.a11yDescription.keyboardDisabled"]}),p.jsx("div",{id:`${Ig}-${t}`,style:zh,children:o["edge.a11yDescription.default"]}),!r&&p.jsx(c_,{rfId:t})]})}const jl=$.forwardRef(({position:t="top-left",children:r,className:o,style:l,...a},u)=>{const d=`${t}`.split("-");return p.jsx("div",{className:et(["react-flow__panel",o,...d]),style:l,ref:u,...a,children:r})});jl.displayName="Panel";const Ah="https://reactflow.dev?utm_source=attribution";function f_({proOptions:t,position:r="bottom-right"}){return t!=null&&t.hideAttribution?null:p.jsx(jl,{position:r,className:"react-flow__attribution","data-message":`Please only hide this attribution when you are subscribed to React Flow Pro: ${Ah}`,children:p.jsx("a",{href:Ah,target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}const h_=t=>{const r=[],o=[];for(const[,l]of t.nodeLookup)l.selected&&r.push(l.internals.userNode);for(const[,l]of t.edgeLookup)l.selected&&o.push(l);return{selectedNodes:r,selectedEdges:o}},Zs=t=>t.id;function p_(t,r){return Xe(t.selectedNodes.map(Zs),r.selectedNodes.map(Zs))&&Xe(t.selectedEdges.map(Zs),r.selectedEdges.map(Zs))}function g_({onSelectionChange:t}){const r=He(),{selectedNodes:o,selectedEdges:l}=Re(h_,p_);return $.useEffect(()=>{const a={nodes:o,edges:l};t==null||t(a),r.getState().onSelectionChangeHandlers.forEach(u=>u(a))},[o,l,t]),null}const m_=t=>!!t.onSelectionChangeHandlers;function y_({onSelectionChange:t}){const r=Re(m_);return t||r?p.jsx(g_,{onSelectionChange:t}):null}const Tg=[0,0],v_={x:0,y:0,zoom:1},x_=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","nodesFocusable","edgesFocusable","edgesReconnectable","elevateNodesOnSelect","elevateEdgesOnSelect","minZoom","maxZoom","nodeExtent","onNodesChange","onEdgesChange","elementsSelectable","connectionMode","snapGrid","snapToGrid","translateExtent","connectOnClick","defaultEdgeOptions","fitView","fitViewOptions","onNodesDelete","onEdgesDelete","onDelete","onNodeDrag","onNodeDragStart","onNodeDragStop","onSelectionDrag","onSelectionDragStart","onSelectionDragStop","onMoveStart","onMove","onMoveEnd","noPanClassName","nodeOrigin","autoPanOnConnect","autoPanOnNodeDrag","onError","connectionRadius","isValidConnection","selectNodesOnDrag","nodeDragThreshold","connectionDragThreshold","onBeforeDelete","debug","autoPanSpeed","ariaLabelConfig","zIndexMode"],Dh=[...x_,"rfId"],w_=t=>({setNodes:t.setNodes,setEdges:t.setEdges,setMinZoom:t.setMinZoom,setMaxZoom:t.setMaxZoom,setTranslateExtent:t.setTranslateExtent,setNodeExtent:t.setNodeExtent,reset:t.reset,setDefaultNodesAndEdges:t.setDefaultNodesAndEdges}),$h={translateExtent:So,nodeOrigin:Tg,minZoom:.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function __(t){const{setNodes:r,setEdges:o,setMinZoom:l,setMaxZoom:a,setTranslateExtent:u,setNodeExtent:d,reset:f,setDefaultNodesAndEdges:g}=Re(w_,Xe),y=He();$.useEffect(()=>(g(t.defaultNodes,t.defaultEdges),()=>{m.current=$h,f()}),[]);const m=$.useRef($h);return $.useEffect(()=>{for(const x of Dh){const v=t[x],_=m.current[x];v!==_&&(typeof t[x]>"u"||(x==="nodes"?r(v):x==="edges"?o(v):x==="minZoom"?l(v):x==="maxZoom"?a(v):x==="translateExtent"?u(v):x==="nodeExtent"?d(v):x==="ariaLabelConfig"?y.setState({ariaLabelConfig:o1(v)}):x==="fitView"?y.setState({fitViewQueued:v}):x==="fitViewOptions"?y.setState({fitViewOptions:v}):y.setState({[x]:v})))}m.current=t},Dh.map(x=>t[x])),null}function Oh(){return typeof window>"u"||!window.matchMedia?null:window.matchMedia("(prefers-color-scheme: dark)")}function S_(t){var l;const[r,o]=$.useState(t==="system"?null:t);return $.useEffect(()=>{if(t!=="system"){o(t);return}const a=Oh(),u=()=>o(a!=null&&a.matches?"dark":"light");return u(),a==null||a.addEventListener("change",u),()=>{a==null||a.removeEventListener("change",u)}},[t]),r!==null?r:(l=Oh())!=null&&l.matches?"dark":"light"}const Fh=typeof document<"u"?document:null;function jo(t=null,r={target:Fh,actInsideInputWithModifier:!0}){const[o,l]=$.useState(!1),a=$.useRef(!1),u=$.useRef(new Set([])),[d,f]=$.useMemo(()=>{if(t!==null){const y=(Array.isArray(t)?t:[t]).filter(x=>typeof x=="string").map(x=>x.replace(/\+/g,` +`).replace(` + +`,` ++`).split(` +`)),m=y.reduce((x,v)=>x.concat(...v),[]);return[y,m]}return[[],[]]},[t]);return $.useEffect(()=>{const g=(r==null?void 0:r.target)??Fh,y=(r==null?void 0:r.actInsideInputWithModifier)??!0;if(t!==null){const m=_=>{var E,N;if(a.current=_.ctrlKey||_.metaKey||_.shiftKey||_.altKey,(!a.current||a.current&&!y)&&dg(_))return!1;const C=Bh(_.code,f);if(u.current.add(_[C]),Hh(d,u.current,!1)){const I=((N=(E=_.composedPath)==null?void 0:E.call(_))==null?void 0:N[0])||_.target,k=(I==null?void 0:I.nodeName)==="BUTTON"||(I==null?void 0:I.nodeName)==="A";r.preventDefault!==!1&&(a.current||!k)&&_.preventDefault(),l(!0)}},x=_=>{const S=Bh(_.code,f);Hh(d,u.current,!0)?(l(!1),u.current.clear()):u.current.delete(_[S]),_.key==="Meta"&&u.current.clear(),a.current=!1},v=()=>{u.current.clear(),l(!1)};return g==null||g.addEventListener("keydown",m),g==null||g.addEventListener("keyup",x),window.addEventListener("blur",v),window.addEventListener("contextmenu",v),()=>{g==null||g.removeEventListener("keydown",m),g==null||g.removeEventListener("keyup",x),window.removeEventListener("blur",v),window.removeEventListener("contextmenu",v)}}},[t,l]),o}function Hh(t,r,o){return t.filter(l=>o||l.length===r.size).some(l=>l.every(a=>r.has(a)))}function Bh(t,r){return r.includes(t)?"code":"key"}const k_=()=>{const t=He();return $.useMemo(()=>({zoomIn:async r=>{const{panZoom:o}=t.getState();return o?o.scaleBy(1.2,r):!1},zoomOut:async r=>{const{panZoom:o}=t.getState();return o?o.scaleBy(1/1.2,r):!1},zoomTo:async(r,o)=>{const{panZoom:l}=t.getState();return l?l.scaleTo(r,o):!1},getZoom:()=>t.getState().transform[2],setViewport:async(r,o)=>{const{transform:[l,a,u],panZoom:d}=t.getState();return d?(await d.setViewport({x:r.x??l,y:r.y??a,zoom:r.zoom??u},o),!0):!1},getViewport:()=>{const[r,o,l]=t.getState().transform;return{x:r,y:o,zoom:l}},setCenter:async(r,o,l)=>t.getState().setCenter(r,o,l),fitBounds:async(r,o)=>{const{width:l,height:a,minZoom:u,maxZoom:d,panZoom:f}=t.getState(),g=uc(r,l,a,u,d,(o==null?void 0:o.padding)??.1);return f?(await f.setViewport(g,{duration:o==null?void 0:o.duration,ease:o==null?void 0:o.ease,interpolate:o==null?void 0:o.interpolate}),!0):!1},screenToFlowPosition:(r,o={})=>{const{transform:l,snapGrid:a,snapToGrid:u,domNode:d}=t.getState();if(!d)return r;const{x:f,y:g}=d.getBoundingClientRect(),y={x:r.x-f,y:r.y-g},m=o.snapGrid??a,x=o.snapToGrid??u;return Lo(y,l,x,m)},flowToScreenPosition:r=>{const{transform:o,domNode:l}=t.getState();if(!l)return r;const{x:a,y:u}=l.getBoundingClientRect(),d=Si(r,o);return{x:d.x+a,y:d.y+u}}}),[])};function Rg(t,r){const o=[],l=new Map,a=[];for(const u of t)if(u.type==="add"){a.push(u);continue}else if(u.type==="remove"||u.type==="replace")l.set(u.id,[u]);else{const d=l.get(u.id);d?d.push(u):l.set(u.id,[u])}for(const u of r){const d=l.get(u.id);if(!d){o.push(u);continue}if(d[0].type==="remove")continue;if(d[0].type==="replace"){o.push({...d[0].item});continue}const f={...u};for(const g of d)E_(g,f);o.push(f)}return a.length&&a.forEach(u=>{u.index!==void 0?o.splice(u.index,0,{...u.item}):o.push({...u.item})}),o}function E_(t,r){switch(t.type){case"select":{r.selected=t.selected;break}case"position":{typeof t.position<"u"&&(r.position=t.position),typeof t.dragging<"u"&&(r.dragging=t.dragging);break}case"dimensions":{typeof t.dimensions<"u"&&(r.measured={...t.dimensions},t.setAttributes&&((t.setAttributes===!0||t.setAttributes==="width")&&(r.width=t.dimensions.width),(t.setAttributes===!0||t.setAttributes==="height")&&(r.height=t.dimensions.height))),typeof t.resizing=="boolean"&&(r.resizing=t.resizing);break}}}function N_(t,r){return Rg(t,r)}function C_(t,r){return Rg(t,r)}function br(t,r){return{id:t,type:"select",selected:r}}function gi(t,r=new Set,o=!1){const l=[];for(const[a,u]of t){const d=r.has(a);!(u.selected===void 0&&!d)&&u.selected!==d&&(o&&(u.selected=d),l.push(br(u.id,d)))}return l}function Vh({items:t=[],lookup:r}){var a;const o=[],l=new Map(t.map(u=>[u.id,u]));for(const[u,d]of t.entries()){const f=r.get(d.id),g=((a=f==null?void 0:f.internals)==null?void 0:a.userNode)??f;g!==void 0&&g!==d&&o.push({id:d.id,item:d,type:"replace"}),g===void 0&&o.push({item:d,type:"add",index:u})}for(const[u]of r)l.get(u)===void 0&&o.push({id:u,type:"remove"});return o}function Uh(t){return{id:t.id,type:"remove"}}const j_=lg();function b_(t,r,o={}){return d1(t,r,{...o,onError:o.onError??j_})}const Wh=t=>Kw(t),M_=t=>ng(t);function Lg(t){return $.forwardRef(t)}const zg=typeof window<"u"?$.useLayoutEffect:$.useEffect;function Yh(t){const[r,o]=$.useState(BigInt(0)),[l]=$.useState(()=>P_(()=>o(a=>a+BigInt(1))));return zg(()=>{const a=l.get();a.length&&(t(a),l.reset())},[r]),l}function P_(t){let r=[];return{get:()=>r,reset:()=>{r=[]},push:o=>{r.push(o),t()}}}const Ag=$.createContext(null);function I_({children:t}){const r=He(),o=$.useCallback(f=>{const{nodes:g=[],setNodes:y,hasDefaultNodes:m,onNodesChange:x,nodeLookup:v,fitViewQueued:_,onNodesChangeMiddlewareMap:S}=r.getState();let C=g;for(const N of f)C=typeof N=="function"?N(C):N;let E=Vh({items:C,lookup:v});for(const N of S.values())E=N(E);m&&y(C),E.length>0?x==null||x(E):_&&window.requestAnimationFrame(()=>{const{fitViewQueued:N,nodes:I,setNodes:k}=r.getState();N&&k(I)})},[]),l=Yh(o),a=$.useCallback(f=>{const{edges:g=[],setEdges:y,hasDefaultEdges:m,onEdgesChange:x,edgeLookup:v}=r.getState();let _=g;for(const S of f)_=typeof S=="function"?S(_):S;m?y(_):x&&x(Vh({items:_,lookup:v}))},[]),u=Yh(a),d=$.useMemo(()=>({nodeQueue:l,edgeQueue:u}),[]);return p.jsx(Ag.Provider,{value:d,children:t})}function T_(){const t=$.useContext(Ag);if(!t)throw new Error("useBatchContext must be used within a BatchProvider");return t}const R_=t=>!!t.panZoom;function mc(){const t=k_(),r=He(),o=T_(),l=Re(R_),a=$.useMemo(()=>{const u=x=>r.getState().nodeLookup.get(x),d=x=>{o.nodeQueue.push(x)},f=x=>{o.edgeQueue.push(x)},g=x=>{var N,I;const{nodeLookup:v,nodeOrigin:_}=r.getState(),S=Wh(x)?x:v.get(x.id),C=S.parentId?ug(S.position,S.measured,S.parentId,v,_):S.position,E={...S,position:C,width:((N=S.measured)==null?void 0:N.width)??S.width,height:((I=S.measured)==null?void 0:I.height)??S.height};return No(E)},y=(x,v,_={replace:!1})=>{d(S=>S.map(C=>{if(C.id===x){const E=typeof v=="function"?v(C):v;return _.replace&&Wh(E)?E:{...C,...E}}return C}))},m=(x,v,_={replace:!1})=>{f(S=>S.map(C=>{if(C.id===x){const E=typeof v=="function"?v(C):v;return _.replace&&M_(E)?E:{...C,...E}}return C}))};return{getNodes:()=>r.getState().nodes.map(x=>({...x})),getNode:x=>{var v;return(v=u(x))==null?void 0:v.internals.userNode},getInternalNode:u,getEdges:()=>{const{edges:x=[]}=r.getState();return x.map(v=>({...v}))},getEdge:x=>r.getState().edgeLookup.get(x),setNodes:d,setEdges:f,addNodes:x=>{const v=Array.isArray(x)?x:[x];o.nodeQueue.push(_=>[..._,...v])},addEdges:x=>{const v=Array.isArray(x)?x:[x];o.edgeQueue.push(_=>[..._,...v])},toObject:()=>{const{nodes:x=[],edges:v=[],transform:_}=r.getState(),[S,C,E]=_;return{nodes:x.map(N=>({...N})),edges:v.map(N=>({...N})),viewport:{x:S,y:C,zoom:E}}},deleteElements:async({nodes:x=[],edges:v=[]})=>{const{nodes:_,edges:S,onNodesDelete:C,onEdgesDelete:E,triggerNodeChanges:N,triggerEdgeChanges:I,onDelete:k,onBeforeDelete:j}=r.getState(),{nodes:R,edges:T}=await t1({nodesToRemove:x,edgesToRemove:v,nodes:_,edges:S,onBeforeDelete:j}),B=T.length>0,G=R.length>0;if(B){const U=T.map(Uh);E==null||E(T),I(U)}if(G){const U=R.map(Uh);C==null||C(R),N(U)}return(G||B)&&(k==null||k({nodes:R,edges:T})),{deletedNodes:R,deletedEdges:T}},getIntersectingNodes:(x,v=!0,_)=>{const S=mh(x),C=S?x:g(x),E=_!==void 0;return C?(_||r.getState().nodes).filter(N=>{const I=r.getState().nodeLookup.get(N.id);if(I&&!S&&(N.id===x.id||!I.internals.positionAbsolute))return!1;const k=No(E?N:I),j=pl(k,C);return v&&j>0||j>=k.width*k.height||j>=C.width*C.height}):[]},isNodeIntersecting:(x,v,_=!0)=>{const C=mh(x)?x:g(x);if(!C)return!1;const E=pl(C,v);return _&&E>0||E>=v.width*v.height||E>=C.width*C.height},updateNode:y,updateNodeData:(x,v,_={replace:!1})=>{y(x,S=>{const C=typeof v=="function"?v(S):v;return _.replace?{...S,data:C}:{...S,data:{...S.data,...C}}},_)},updateEdge:m,updateEdgeData:(x,v,_={replace:!1})=>{m(x,S=>{const C=typeof v=="function"?v(S):v;return _.replace?{...S,data:C}:{...S,data:{...S.data,...C}}},_)},getNodesBounds:x=>{const{nodeLookup:v,nodeOrigin:_}=r.getState();return qw(x,{nodeLookup:v,nodeOrigin:_})},getHandleConnections:({type:x,id:v,nodeId:_})=>{var S;return Array.from(((S=r.getState().connectionLookup.get(`${_}-${x}${v?`-${v}`:""}`))==null?void 0:S.values())??[])},getNodeConnections:({type:x,handleId:v,nodeId:_})=>{var S;return Array.from(((S=r.getState().connectionLookup.get(`${_}${x?v?`-${x}-${v}`:`-${x}`:""}`))==null?void 0:S.values())??[])},fitView:async x=>{const v=r.getState().fitViewResolver??i1();return r.setState({fitViewQueued:!0,fitViewOptions:x,fitViewResolver:v}),o.nodeQueue.push(_=>[..._]),v.promise}}},[]);return $.useMemo(()=>({...a,...t,viewportInitialized:l}),[l])}const Xh=t=>t.selected,L_=typeof window<"u"?window:void 0;function z_({deleteKeyCode:t,multiSelectionKeyCode:r}){const o=He(),{deleteElements:l}=mc(),a=jo(t,{actInsideInputWithModifier:!1}),u=jo(r,{target:L_});$.useEffect(()=>{if(a){const{edges:d,nodes:f}=o.getState();l({nodes:f.filter(Xh),edges:d.filter(Xh)}),o.setState({nodesSelectionActive:!1})}},[a]),$.useEffect(()=>{o.setState({multiSelectionActive:u})},[u])}function A_(t){const r=He();$.useEffect(()=>{const o=()=>{var a,u,d,f;if(!t.current||!(((u=(a=t.current).checkVisibility)==null?void 0:u.call(a))??!0))return!1;const l=cc(t.current);(l.height===0||l.width===0)&&((f=(d=r.getState()).onError)==null||f.call(d,"004",tn.error004())),r.setState({width:l.width||500,height:l.height||500})};if(t.current){o(),window.addEventListener("resize",o);const l=new ResizeObserver(()=>o());return l.observe(t.current),()=>{window.removeEventListener("resize",o),l&&t.current&&l.unobserve(t.current)}}},[])}const bl={position:"absolute",width:"100%",height:"100%",top:0,left:0},D_=t=>({userSelectionActive:t.userSelectionActive,lib:t.lib,connectionInProgress:t.connection.inProgress});function $_({onPaneContextMenu:t,zoomOnScroll:r=!0,zoomOnPinch:o=!0,panOnScroll:l=!1,panActivationKeyPressed:a,panOnScrollSpeed:u=.5,panOnScrollMode:d=Ir.Free,zoomOnDoubleClick:f=!0,panOnDrag:g=!0,defaultViewport:y,translateExtent:m,minZoom:x,maxZoom:v,zoomActivationKeyCode:_,preventScrolling:S=!0,children:C,noWheelClassName:E,noPanClassName:N,onViewportChange:I,isControlledViewport:k,paneClickDistance:j,selectionOnDrag:R}){const T=He(),B=$.useRef(null),{userSelectionActive:G,lib:U,connectionInProgress:ee}=Re(D_,Xe),q=jo(_),te=$.useRef();A_(B);const J=$.useCallback(b=>{I==null||I({x:b[0],y:b[1],zoom:b[2]}),k||T.setState({transform:b})},[I,k]);return $.useEffect(()=>{if(B.current){te.current=H1({domNode:B.current,minZoom:x,maxZoom:v,translateExtent:m,viewport:y,onDraggingChange:W=>T.setState(D=>D.paneDragging===W?D:{paneDragging:W}),onPanZoomStart:(W,D)=>{const{onViewportChangeStart:A,onMoveStart:H}=T.getState();H==null||H(W,D),A==null||A(D)},onPanZoom:(W,D)=>{const{onViewportChange:A,onMove:H}=T.getState();H==null||H(W,D),A==null||A(D)},onPanZoomEnd:(W,D)=>{const{onViewportChangeEnd:A,onMoveEnd:H}=T.getState();H==null||H(W,D),A==null||A(D)}});const{x:b,y:Y,zoom:V}=te.current.getViewport();return T.setState({panZoom:te.current,transform:[b,Y,V],domNode:B.current.closest(".react-flow")}),()=>{var W;(W=te.current)==null||W.destroy()}}},[]),$.useEffect(()=>{var b;(b=te.current)==null||b.update({onPaneContextMenu:t,zoomOnScroll:r,zoomOnPinch:o,panOnScroll:l,panActivationKeyPressed:a,panOnScrollSpeed:u,panOnScrollMode:d,zoomOnDoubleClick:f,panOnDrag:g,zoomActivationKeyPressed:q,preventScrolling:S,noPanClassName:N,userSelectionActive:G,noWheelClassName:E,lib:U,onTransformChange:J,connectionInProgress:ee,selectionOnDrag:R,paneClickDistance:j})},[t,r,o,l,a,u,d,f,g,q,S,N,G,E,U,J,ee,R,j]),p.jsx("div",{className:"react-flow__renderer",ref:B,style:bl,children:C})}const O_=t=>({userSelectionActive:t.userSelectionActive,userSelectionRect:t.userSelectionRect});function F_(){const{userSelectionActive:t,userSelectionRect:r}=Re(O_,Xe);return t&&r?p.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:r.width,height:r.height,transform:`translate(${r.x}px, ${r.y}px)`}}):null}const Au=(t,r)=>o=>{o.target===r.current&&(t==null||t(o))},H_=t=>({userSelectionActive:t.userSelectionActive,elementsSelectable:t.elementsSelectable,dragging:t.paneDragging,panBy:t.panBy,autoPanSpeed:t.autoPanSpeed});function B_({isSelecting:t,selectionKeyPressed:r,selectionMode:o=ko.Full,panOnDrag:l,autoPanOnSelection:a,paneClickDistance:u,selectionOnDrag:d,onSelectionStart:f,onSelectionEnd:g,onPaneClick:y,onPaneContextMenu:m,onPaneScroll:x,onPaneMouseEnter:v,onPaneMouseMove:_,onPaneMouseLeave:S,children:C}){const E=$.useRef(0),N=He(),{userSelectionActive:I,elementsSelectable:k,dragging:j,panBy:R,autoPanSpeed:T}=Re(H_,Xe),B=k&&(t||I),G=$.useRef(null),U=$.useRef(),ee=$.useRef(new Set),q=$.useRef(new Set),te=$.useRef(!1),J=$.useRef(!1),b=$.useRef({x:0,y:0}),Y=$.useRef(!1),V=K=>{if(J.current||te.current||N.getState().connection.inProgress){J.current=!1,te.current=!1;return}y==null||y(K),N.getState().resetSelectedElements(),N.setState({nodesSelectionActive:!1})},W=K=>{if(Array.isArray(l)&&(l!=null&&l.includes(2))){K.preventDefault();return}m==null||m(K)},D=x?K=>x(K):void 0,A=K=>{J.current&&(K.stopPropagation(),J.current=!1)},H=K=>{var Me,tt;if(K.pointerType==="touch"&&l!==!1&&!r)return;const{domNode:se,transform:pe}=N.getState();if(U.current=se==null?void 0:se.getBoundingClientRect(),!U.current)return;const _e=K.target===G.current;if(!_e&&!!K.target.closest(".nokey")||!t||!(d&&_e||r)||K.button!==0||!K.isPrimary)return;(tt=(Me=K.target)==null?void 0:Me.setPointerCapture)==null||tt.call(Me,K.pointerId),J.current=!1;const{x:Ne,y:Pe}=en(K.nativeEvent,U.current),je=Lo({x:Ne,y:Pe},pe);N.setState({userSelectionRect:{width:0,height:0,startX:je.x,startY:je.y,x:Ne,y:Pe}}),_e||(K.stopPropagation(),K.preventDefault())};function M(K,se){const{userSelectionRect:pe}=N.getState();if(!pe)return;const{transform:_e,nodeLookup:me,edgeLookup:ye,connectionLookup:Ne,triggerNodeChanges:Pe,triggerEdgeChanges:je,defaultEdgeOptions:Me}=N.getState(),tt={x:pe.startX,y:pe.startY},{x:Ge,y:nt}=Si(tt,_e),Ke={startX:tt.x,startY:tt.y,x:Kut.id)),q.current=new Set;const ot=(Me==null?void 0:Me.selectable)??!0;for(const ut of ee.current){const ct=Ne.get(ut);if(ct)for(const{edgeId:ht}of ct.values()){const wt=ye.get(ht);wt&&(wt.selectable??ot)&&q.current.add(ht)}}if(!yh(bt,ee.current)){const ut=gi(me,ee.current,!0);Pe(ut)}if(!yh(Dt,q.current)){const ut=gi(ye,q.current);je(ut)}N.setState({userSelectionRect:Ke,userSelectionActive:!0,nodesSelectionActive:!1})}function L(){if(!a||!U.current)return;const[K,se]=ac(b.current,U.current,T);R({x:K,y:se}).then(pe=>{if(!J.current||!pe){E.current=requestAnimationFrame(L);return}const{x:_e,y:me}=b.current;M(_e,me),E.current=requestAnimationFrame(L)})}const ne=()=>{cancelAnimationFrame(E.current),E.current=0,Y.current=!1};$.useEffect(()=>()=>ne(),[]);const re=K=>{const{userSelectionRect:se,transform:pe,resetSelectedElements:_e}=N.getState();if(!U.current||!se)return;const{x:me,y:ye}=en(K.nativeEvent,U.current);b.current={x:me,y:ye};const Ne=Si({x:se.startX,y:se.startY},pe);if(!J.current){const Pe=r?0:u;if(Math.hypot(me-Ne.x,ye-Ne.y)<=Pe)return;_e(),f==null||f(K)}J.current=!0,Y.current||(L(),Y.current=!0),M(me,ye)},ce=K=>{var se,pe;if(!B){K.target===G.current&&N.getState().connection.inProgress&&(te.current=!0);return}K.button===0&&((pe=(se=K.target)==null?void 0:se.releasePointerCapture)==null||pe.call(se,K.pointerId),!I&&K.target===G.current&&N.getState().userSelectionRect&&(V==null||V(K)),N.setState({userSelectionActive:!1,userSelectionRect:null}),J.current&&(g==null||g(K),N.setState({nodesSelectionActive:ee.current.size>0})),ne())},fe=K=>{var se,pe;(pe=(se=K.target)==null?void 0:se.releasePointerCapture)==null||pe.call(se,K.pointerId),ne()},de=l===!0||Array.isArray(l)&&l.includes(0);return p.jsxs("div",{className:et(["react-flow__pane",{draggable:de,dragging:j,selection:t}]),onClick:B?void 0:Au(V,G),onContextMenu:Au(W,G),onWheel:Au(D,G),onPointerEnter:B?void 0:v,onPointerMove:B?re:_,onPointerUp:ce,onPointerCancel:B?fe:void 0,onPointerDownCapture:B?H:void 0,onClickCapture:B?A:void 0,onPointerLeave:S,ref:G,style:bl,children:[C,p.jsx(F_,{})]})}function Zu({id:t,store:r,unselect:o=!1,nodeRef:l}){const{addSelectedNodes:a,unselectNodesAndEdges:u,multiSelectionActive:d,nodeLookup:f,onError:g}=r.getState(),y=f.get(t);if(!y){g==null||g("012",tn.error012(t));return}r.setState({nodesSelectionActive:!1}),y.selected?(o||y.selected&&d)&&(u({nodes:[y],edges:[]}),requestAnimationFrame(()=>{var m;return(m=l==null?void 0:l.current)==null?void 0:m.blur()})):a([t])}function Dg({nodeRef:t,disabled:r=!1,noDragClassName:o,handleSelector:l,nodeId:a,isSelectable:u,nodeClickDistance:d}){const f=He(),[g,y]=$.useState(!1),m=$.useRef();return $.useEffect(()=>{if(!r)return m.current=j1({getStoreItems:()=>f.getState(),onNodeMouseDown:x=>{Zu({id:x,store:f,nodeRef:t})},onDragStart:()=>{y(!0)},onDragStop:()=>{y(!1)}}),()=>{var x;(x=m.current)==null||x.destroy(),m.current=void 0}},[r,f,t]),$.useEffect(()=>{r||!t.current||!m.current||m.current.update({noDragClassName:o,handleSelector:l,domNode:t.current,isSelectable:u,nodeId:a,nodeClickDistance:d})},[o,l,r,u,t,a,d]),g}const V_=t=>r=>r.selected&&(r.draggable||t&&typeof r.draggable>"u");function $g(){const t=He();return $.useCallback(o=>{const{nodeExtent:l,snapToGrid:a,snapGrid:u,nodesDraggable:d,onError:f,updateNodePositions:g,nodeLookup:y,nodeOrigin:m}=t.getState(),x=new Map,v=V_(d),_=a?u[0]:5,S=a?u[1]:5,C=o.direction.x*_*o.factor,E=o.direction.y*S*o.factor;for(const[,N]of y){if(!v(N))continue;let I={x:N.internals.positionAbsolute.x+C,y:N.internals.positionAbsolute.y+E};a&&(I=Ro(I,u));const{position:k,positionAbsolute:j}=rg({nodeId:N.id,nextPosition:I,nodeLookup:y,nodeExtent:l,nodeOrigin:m,onError:f});N.position=k,N.internals.positionAbsolute=j,x.set(N.id,N)}g(x)},[])}const yc=$.createContext(null),U_=yc.Provider;yc.Consumer;const Og=()=>$.useContext(yc),W_=t=>({connectOnClick:t.connectOnClick,noPanClassName:t.noPanClassName,rfId:t.rfId}),Fg=$.createContext(null);function Y_({children:t}){const r=Re(W_,Xe);return p.jsx(Fg.Provider,{value:r,children:t})}function X_(){const t=$.useContext(Fg);if(!t)throw new Error("useHandleConfig must be used within a HandleConfigProvider");return t}const G_={connectingFrom:!1,connectingTo:!1,clickConnecting:!1,isPossibleEndHandle:!0,connectionInProcess:!1,clickConnectionInProcess:!1,valid:!1},Q_=(t,r,o)=>l=>{const{connectionClickStartHandle:a,connectionMode:u,connection:d}=l,{fromHandle:f,toHandle:g,isValid:y}=d;if(!f&&!a)return G_;const m=(g==null?void 0:g.nodeId)===t&&(g==null?void 0:g.id)===r&&(g==null?void 0:g.type)===o;return{connectingFrom:(f==null?void 0:f.nodeId)===t&&(f==null?void 0:f.id)===r&&(f==null?void 0:f.type)===o,connectingTo:m,clickConnecting:(a==null?void 0:a.nodeId)===t&&(a==null?void 0:a.id)===r&&(a==null?void 0:a.type)===o,isPossibleEndHandle:u===wi.Strict?(f==null?void 0:f.type)!==o:t!==(f==null?void 0:f.nodeId)||r!==(f==null?void 0:f.id),connectionInProcess:!!f,clickConnectionInProcess:!!a,valid:m&&y}};function K_({type:t="source",position:r=Se.Top,isValidConnection:o,isConnectable:l=!0,isConnectableStart:a=!0,isConnectableEnd:u=!0,id:d,onConnect:f,children:g,className:y,onMouseDown:m,onTouchStart:x,...v},_){var Y,V;const S=d||null,C=t==="target",E=He(),N=Og(),{connectOnClick:I,noPanClassName:k,rfId:j}=X_(),{connectingFrom:R,connectingTo:T,clickConnecting:B,isPossibleEndHandle:G,connectionInProcess:U,clickConnectionInProcess:ee,valid:q}=Re(Q_(N,S,t),Xe);N||(V=(Y=E.getState()).onError)==null||V.call(Y,"010",tn.error010());const te=W=>{const{defaultEdgeOptions:D,onConnect:A,hasDefaultEdges:H}=E.getState(),M={...D,...W};if(H){const{edges:L,setEdges:ne,onError:re}=E.getState();ne(b_(M,L,{onError:re}))}A==null||A(M),f==null||f(M)},J=W=>{if(!N)return;const D=fg(W.nativeEvent);if(a&&(D&&W.button===0||!D)){const A=E.getState();qu.onPointerDown(W.nativeEvent,{handleDomNode:W.currentTarget,autoPanOnConnect:A.autoPanOnConnect,connectionMode:A.connectionMode,connectionRadius:A.connectionRadius,domNode:A.domNode,nodeLookup:A.nodeLookup,lib:A.lib,isTarget:C,handleId:S,nodeId:N,flowId:A.rfId,panBy:A.panBy,cancelConnection:A.cancelConnection,onConnectStart:A.onConnectStart,onConnectEnd:(...H)=>{var M,L;return(L=(M=E.getState()).onConnectEnd)==null?void 0:L.call(M,...H)},updateConnection:A.updateConnection,onConnect:te,isValidConnection:o||((...H)=>{var M,L;return((L=(M=E.getState()).isValidConnection)==null?void 0:L.call(M,...H))??!0}),getTransform:()=>E.getState().transform,getFromHandle:()=>E.getState().connection.fromHandle,autoPanSpeed:A.autoPanSpeed,dragThreshold:A.connectionDragThreshold})}D?m==null||m(W):x==null||x(W)},b=W=>{const{onClickConnectStart:D,onClickConnectEnd:A,connectionClickStartHandle:H,connectionMode:M,isValidConnection:L,lib:ne,rfId:re,nodeLookup:ce,connection:fe}=E.getState();if(!N||!H&&!a)return;if(!H){D==null||D(W.nativeEvent,{nodeId:N,handleId:S,handleType:t}),E.setState({connectionClickStartHandle:{nodeId:N,type:t,id:S}});return}const de=cg(W.target),K=o||L,{connection:se,isValid:pe}=qu.isValid(W.nativeEvent,{handle:{nodeId:N,id:S,type:t},connectionMode:M,fromNodeId:H.nodeId,fromHandleId:H.id||null,fromType:H.type,isValidConnection:K,flowId:re,doc:de,lib:ne,nodeLookup:ce});pe&&se&&te(se);const _e=structuredClone(fe);delete _e.inProgress,_e.toPosition=_e.toHandle?_e.toHandle.position:null,A==null||A(W,_e),E.setState({connectionClickStartHandle:null})};return p.jsx("div",{"data-handleid":S,"data-nodeid":N,"data-handlepos":r,"data-id":`${j}-${N}-${S}-${t}`,className:et(["react-flow__handle",`react-flow__handle-${r}`,"nodrag",k,y,{source:!C,target:C,connectable:l,connectablestart:a,connectableend:u,clickconnecting:B,connectingfrom:R,connectingto:T,valid:q,connectionindicator:l&&(!U||G)&&(U||ee?u:a)}]),onMouseDown:J,onTouchStart:J,onClick:I?b:void 0,ref:_,...v,children:g})}const Ei=$.memo(Lg(K_));function q_({data:t,isConnectable:r,sourcePosition:o=Se.Bottom}){return p.jsxs(p.Fragment,{children:[t==null?void 0:t.label,p.jsx(Ei,{type:"source",position:o,isConnectable:r})]})}function Z_({data:t,isConnectable:r,targetPosition:o=Se.Top,sourcePosition:l=Se.Bottom}){return p.jsxs(p.Fragment,{children:[p.jsx(Ei,{type:"target",position:o,isConnectable:r}),t==null?void 0:t.label,p.jsx(Ei,{type:"source",position:l,isConnectable:r})]})}function J_(){return null}function eS({data:t,isConnectable:r,targetPosition:o=Se.Top}){return p.jsxs(p.Fragment,{children:[p.jsx(Ei,{type:"target",position:o,isConnectable:r}),t==null?void 0:t.label]})}const gl={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},Gh={input:q_,default:Z_,output:eS,group:J_};function tS(t){var r,o,l,a;return t.internals.handleBounds===void 0?{width:t.width??t.initialWidth??((r=t.style)==null?void 0:r.width),height:t.height??t.initialHeight??((o=t.style)==null?void 0:o.height)}:{width:t.width??((l=t.style)==null?void 0:l.width),height:t.height??((a=t.style)==null?void 0:a.height)}}const nS=t=>{const{width:r,height:o,x:l,y:a}=To(t.nodeLookup,{filter:u=>!!u.selected});return{width:Jt(r)?r:null,height:Jt(o)?o:null,userSelectionActive:t.userSelectionActive,transformString:`translate(${t.transform[0]}px,${t.transform[1]}px) scale(${t.transform[2]}) translate(${l}px,${a}px)`}};function rS({onSelectionContextMenu:t,noPanClassName:r,disableKeyboardA11y:o}){const l=He(),{width:a,height:u,transformString:d,userSelectionActive:f}=Re(nS,Xe),g=$g(),y=$.useRef(null);$.useEffect(()=>{var _;o||(_=y.current)==null||_.focus({preventScroll:!0})},[o]);const m=!f&&a!==null&&u!==null;if(Dg({nodeRef:y,disabled:!m}),!m)return null;const x=t?_=>{const S=l.getState().nodes.filter(C=>C.selected);t(_,S)}:void 0,v=_=>{Object.prototype.hasOwnProperty.call(gl,_.key)&&(_.preventDefault(),g({direction:gl[_.key],factor:_.shiftKey?4:1}))};return p.jsx("div",{className:et(["react-flow__nodesselection","react-flow__container",r]),style:{transform:d},children:p.jsx("div",{ref:y,className:"react-flow__nodesselection-rect",onContextMenu:x,tabIndex:o?void 0:-1,onKeyDown:o?void 0:v,style:{width:a,height:u}})})}const Qh=typeof window<"u"?window:void 0,iS=t=>({nodesSelectionActive:t.nodesSelectionActive,userSelectionActive:t.userSelectionActive});function Hg({children:t,onPaneClick:r,onPaneMouseEnter:o,onPaneMouseMove:l,onPaneMouseLeave:a,onPaneContextMenu:u,onPaneScroll:d,paneClickDistance:f,deleteKeyCode:g,selectionKeyCode:y,selectionOnDrag:m,selectionMode:x,onSelectionStart:v,onSelectionEnd:_,multiSelectionKeyCode:S,panActivationKeyCode:C,zoomActivationKeyCode:E,elementsSelectable:N,zoomOnScroll:I,zoomOnPinch:k,panOnScroll:j,panOnScrollSpeed:R,panOnScrollMode:T,zoomOnDoubleClick:B,panOnDrag:G,autoPanOnSelection:U,defaultViewport:ee,translateExtent:q,minZoom:te,maxZoom:J,preventScrolling:b,onSelectionContextMenu:Y,noWheelClassName:V,noPanClassName:W,disableKeyboardA11y:D,onViewportChange:A,isControlledViewport:H}){const{nodesSelectionActive:M,userSelectionActive:L}=Re(iS,Xe),ne=jo(y,{target:Qh}),re=jo(C,{target:Qh}),ce=re||G,fe=re||j,de=m&&ce!==!0,K=ne||L||de;return z_({deleteKeyCode:g,multiSelectionKeyCode:S}),p.jsx($_,{onPaneContextMenu:u,elementsSelectable:N,zoomOnScroll:I,zoomOnPinch:k,panOnScroll:fe,panActivationKeyPressed:re,panOnScrollSpeed:R,panOnScrollMode:T,zoomOnDoubleClick:B,panOnDrag:!ne&&ce,defaultViewport:ee,translateExtent:q,minZoom:te,maxZoom:J,zoomActivationKeyCode:E,preventScrolling:b,noWheelClassName:V,noPanClassName:W,onViewportChange:A,isControlledViewport:H,paneClickDistance:f,selectionOnDrag:de,children:p.jsxs(B_,{onSelectionStart:v,onSelectionEnd:_,onPaneClick:r,onPaneMouseEnter:o,onPaneMouseMove:l,onPaneMouseLeave:a,onPaneContextMenu:u,onPaneScroll:d,panOnDrag:ce,autoPanOnSelection:U,isSelecting:!!K,selectionMode:x,selectionKeyPressed:ne,paneClickDistance:f,selectionOnDrag:de,children:[t,M&&p.jsx(rS,{onSelectionContextMenu:Y,noPanClassName:W,disableKeyboardA11y:D})]})})}Hg.displayName="FlowRenderer";const oS=$.memo(Hg),sS=t=>r=>t?lc(r.nodeLookup,{x:0,y:0,width:r.width,height:r.height},r.transform,!0).map(o=>o.id):Array.from(r.nodeLookup.keys());function lS(t){return Re($.useCallback(sS(t),[t]),Xe)}const aS=t=>t.updateNodeInternals;function uS(){const t=Re(aS),[r]=$.useState(()=>typeof ResizeObserver>"u"?null:new ResizeObserver(o=>{const l=new Map;o.forEach(a=>{const u=a.target.getAttribute("data-id");l.set(u,{id:u,nodeElement:a.target,force:!0})}),t(l)}));return $.useEffect(()=>()=>{r==null||r.disconnect()},[r]),r}function cS({node:t,nodeType:r,hasDimensions:o,resizeObserver:l}){const a=He(),u=$.useRef(null),d=$.useRef(null),f=$.useRef(t.sourcePosition),g=$.useRef(t.targetPosition),y=$.useRef(r),m=o&&!!t.internals.handleBounds;return $.useEffect(()=>{u.current&&!t.hidden&&(!m||d.current!==u.current)&&(d.current&&(l==null||l.unobserve(d.current)),l==null||l.observe(u.current),d.current=u.current)},[m,t.hidden]),$.useEffect(()=>()=>{d.current&&(l==null||l.unobserve(d.current),d.current=null)},[]),$.useEffect(()=>{if(u.current){const x=y.current!==r,v=f.current!==t.sourcePosition,_=g.current!==t.targetPosition;(x||v||_)&&(y.current=r,f.current=t.sourcePosition,g.current=t.targetPosition,a.getState().updateNodeInternals(new Map([[t.id,{id:t.id,nodeElement:u.current,force:!0}]])))}},[t.id,r,t.sourcePosition,t.targetPosition]),u}function dS({id:t,onClick:r,onMouseEnter:o,onMouseMove:l,onMouseLeave:a,onContextMenu:u,onDoubleClick:d,nodesDraggable:f,elementsSelectable:g,nodesConnectable:y,nodesFocusable:m,resizeObserver:x,noDragClassName:v,noPanClassName:_,disableKeyboardA11y:S,rfId:C,nodeTypes:E,nodeClickDistance:N,onError:I}){const{node:k,internals:j,isParent:R}=Re(K=>{const se=K.nodeLookup.get(t),pe=K.parentLookup.has(t);return{node:se,internals:se.internals,isParent:pe}},Xe);let T=k.type||"default",B=(E==null?void 0:E[T])||Gh[T];B===void 0&&(I==null||I("003",tn.error003(T)),T="default",B=(E==null?void 0:E.default)||Gh.default);const G=!!(k.draggable||f&&typeof k.draggable>"u"),U=!!(k.selectable||g&&typeof k.selectable>"u"),ee=!!(k.connectable||y&&typeof k.connectable>"u"),q=!!(k.focusable||m&&typeof k.focusable>"u"),te=He(),J=ag(k),b=cS({node:k,nodeType:T,hasDimensions:J,resizeObserver:x}),Y=Dg({nodeRef:b,disabled:k.hidden||!G,noDragClassName:v,handleSelector:k.dragHandle,nodeId:t,isSelectable:U,nodeClickDistance:N}),V=$g();if(k.hidden)return null;const W=rn(k),D=tS(k),A=U||G||r||o||l||a,H=o?K=>o(K,{...j.userNode}):void 0,M=l?K=>l(K,{...j.userNode}):void 0,L=a?K=>a(K,{...j.userNode}):void 0,ne=u?K=>u(K,{...j.userNode}):void 0,re=d?K=>d(K,{...j.userNode}):void 0,ce=K=>{const{selectNodesOnDrag:se,nodeDragThreshold:pe}=te.getState();U&&(!se||!G||pe>0)&&Zu({id:t,store:te,nodeRef:b}),r&&r(K,{...j.userNode})},fe=K=>{if(!(dg(K.nativeEvent)||S)){if(Zp.includes(K.key)&&U){const se=K.key==="Escape";Zu({id:t,store:te,unselect:se,nodeRef:b})}else if(G&&k.selected&&Object.prototype.hasOwnProperty.call(gl,K.key)){K.preventDefault();const{ariaLabelConfig:se}=te.getState();te.setState({ariaLiveMessage:se["node.a11yDescription.ariaLiveMessage"]({direction:K.key.replace("Arrow","").toLowerCase(),x:~~j.positionAbsolute.x,y:~~j.positionAbsolute.y})}),V({direction:gl[K.key],factor:K.shiftKey?4:1})}}},de=()=>{var Ne;if(S||!((Ne=b.current)!=null&&Ne.matches(":focus-visible")))return;const{transform:K,width:se,height:pe,autoPanOnNodeFocus:_e,setCenter:me}=te.getState();if(!_e)return;lc(new Map([[t,k]]),{x:0,y:0,width:se,height:pe},K,!0).length>0||me(k.position.x+W.width/2,k.position.y+W.height/2,{zoom:K[2]})};return p.jsx("div",{className:et(["react-flow__node",`react-flow__node-${T}`,{[_]:G},k.className,{selected:k.selected,selectable:U,parent:R,draggable:G,dragging:Y}]),ref:b,style:{zIndex:j.z,transform:`translate(${j.positionAbsolute.x}px,${j.positionAbsolute.y}px)`,pointerEvents:A?"all":"none",visibility:J?"visible":"hidden",...k.style,...D},"data-id":t,"data-testid":`rf__node-${t}`,onMouseEnter:H,onMouseMove:M,onMouseLeave:L,onContextMenu:ne,onClick:ce,onDoubleClick:re,onKeyDown:q?fe:void 0,tabIndex:q?0:void 0,onFocus:q?de:void 0,role:k.ariaRole??(q?"group":void 0),"aria-roledescription":"node","aria-describedby":S?void 0:`${Pg}-${C}`,"aria-label":k.ariaLabel,...k.domAttributes,children:p.jsx(U_,{value:t,children:p.jsx(B,{id:t,data:k.data,type:T,positionAbsoluteX:j.positionAbsolute.x,positionAbsoluteY:j.positionAbsolute.y,selected:k.selected??!1,selectable:U,draggable:G,deletable:k.deletable??!0,isConnectable:ee,sourcePosition:k.sourcePosition,targetPosition:k.targetPosition,dragging:Y,dragHandle:k.dragHandle,zIndex:j.z,parentId:k.parentId,...W})})})}var fS=$.memo(dS);const hS=t=>({nodesConnectable:t.nodesConnectable,nodesFocusable:t.nodesFocusable,elementsSelectable:t.elementsSelectable,onError:t.onError});function Bg(t){const{nodesConnectable:r,nodesFocusable:o,elementsSelectable:l,onError:a}=Re(hS,Xe),u=lS(t.onlyRenderVisibleElements),d=uS();return p.jsx("div",{className:"react-flow__nodes",style:bl,children:u.map(f=>p.jsx(fS,{id:f,nodeTypes:t.nodeTypes,nodeExtent:t.nodeExtent,onClick:t.onNodeClick,onMouseEnter:t.onNodeMouseEnter,onMouseMove:t.onNodeMouseMove,onMouseLeave:t.onNodeMouseLeave,onContextMenu:t.onNodeContextMenu,onDoubleClick:t.onNodeDoubleClick,noDragClassName:t.noDragClassName,noPanClassName:t.noPanClassName,rfId:t.rfId,disableKeyboardA11y:t.disableKeyboardA11y,resizeObserver:d,nodesDraggable:t.nodesDraggable??!0,nodesConnectable:r,nodesFocusable:o,elementsSelectable:l,nodeClickDistance:t.nodeClickDistance,onError:a},f))})}Bg.displayName="NodeRenderer";const pS=$.memo(Bg);function gS(t){return Re($.useCallback(o=>{if(!t)return o.edges.map(a=>a.id);const l=[];if(o.width&&o.height)for(const a of o.edges){const u=o.nodeLookup.get(a.source),d=o.nodeLookup.get(a.target);u&&d&&a1({sourceNode:u,targetNode:d,width:o.width,height:o.height,transform:o.transform})&&l.push(a.id)}return l},[t]),Xe)}const mS=({color:t="none",strokeWidth:r=1})=>{const o={strokeWidth:r,...t&&{stroke:t}};return p.jsx("polyline",{className:"arrow",style:o,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},yS=({color:t="none",strokeWidth:r=1})=>{const o={strokeWidth:r,...t&&{stroke:t,fill:t}};return p.jsx("polyline",{className:"arrowclosed",style:o,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},Kh={[Eo.Arrow]:mS,[Eo.ArrowClosed]:yS};function vS(t){const r=He();return $.useMemo(()=>{var a,u;return Object.prototype.hasOwnProperty.call(Kh,t)?Kh[t]:((u=(a=r.getState()).onError)==null||u.call(a,"009",tn.error009(t)),null)},[t])}const xS=({id:t,type:r,color:o,width:l=12.5,height:a=12.5,markerUnits:u="strokeWidth",strokeWidth:d,orient:f="auto-start-reverse"})=>{const g=vS(r);return g?p.jsx("marker",{className:"react-flow__arrowhead",id:t,markerWidth:`${l}`,markerHeight:`${a}`,viewBox:"-10 -10 20 20",markerUnits:u,orient:f,refX:"0",refY:"0",children:p.jsx(g,{color:o,strokeWidth:d})}):null},Vg=({defaultColor:t,rfId:r})=>{const o=Re(u=>u.edges),l=Re(u=>u.defaultEdgeOptions),a=$.useMemo(()=>m1(o,{id:r,defaultColor:t,defaultMarkerStart:l==null?void 0:l.markerStart,defaultMarkerEnd:l==null?void 0:l.markerEnd}),[o,l,r,t]);return a.length?p.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:p.jsx("defs",{children:a.map(u=>p.jsx(xS,{id:u.id,type:u.type,color:u.color,width:u.width,height:u.height,markerUnits:u.markerUnits,strokeWidth:u.strokeWidth,orient:u.orient},u.id))})}):null};Vg.displayName="MarkerDefinitions";var wS=$.memo(Vg);function Ug({x:t,y:r,label:o,labelStyle:l,labelShowBg:a=!0,labelBgStyle:u,labelBgPadding:d=[2,4],labelBgBorderRadius:f=2,children:g,className:y,...m}){const[x,v]=$.useState({x:1,y:0,width:0,height:0}),_=et(["react-flow__edge-textwrapper",y]),S=$.useRef(null);return $.useEffect(()=>{if(S.current){const C=S.current.getBBox();v({x:C.x,y:C.y,width:C.width,height:C.height})}},[o]),o?p.jsxs("g",{transform:`translate(${t-x.width/2} ${r-x.height/2})`,className:_,visibility:x.width?"visible":"hidden",...m,children:[a&&p.jsx("rect",{width:x.width+2*d[0],x:-d[0],y:-d[1],height:x.height+2*d[1],className:"react-flow__edge-textbg",style:u,rx:f,ry:f}),p.jsx("text",{className:"react-flow__edge-text",y:x.height/2,dy:"0.3em",ref:S,style:l,children:o}),g]}):null}Ug.displayName="EdgeText";const _S=$.memo(Ug);function Ml({path:t,labelX:r,labelY:o,label:l,labelStyle:a,labelShowBg:u,labelBgStyle:d,labelBgPadding:f,labelBgBorderRadius:g,interactionWidth:y=20,...m}){return p.jsxs(p.Fragment,{children:[p.jsx("path",{...m,d:t,fill:"none",className:et(["react-flow__edge-path",m.className])}),y?p.jsx("path",{d:t,fill:"none",strokeOpacity:0,strokeWidth:y,className:"react-flow__edge-interaction"}):null,l&&Jt(r)&&Jt(o)?p.jsx(_S,{x:r,y:o,label:l,labelStyle:a,labelShowBg:u,labelBgStyle:d,labelBgPadding:f,labelBgBorderRadius:g}):null]})}function qh({pos:t,x1:r,y1:o,x2:l,y2:a}){return t===Se.Left||t===Se.Right?[.5*(r+l),o]:[r,.5*(o+a)]}function Wg({sourceX:t,sourceY:r,sourcePosition:o=Se.Bottom,targetX:l,targetY:a,targetPosition:u=Se.Top}){const[d,f]=qh({pos:o,x1:t,y1:r,x2:l,y2:a}),[g,y]=qh({pos:u,x1:l,y1:a,x2:t,y2:r}),[m,x,v,_]=hg({sourceX:t,sourceY:r,targetX:l,targetY:a,sourceControlX:d,sourceControlY:f,targetControlX:g,targetControlY:y});return[`M${t},${r} C${d},${f} ${g},${y} ${l},${a}`,m,x,v,_]}function Yg(t){return $.memo(({id:r,sourceX:o,sourceY:l,targetX:a,targetY:u,sourcePosition:d,targetPosition:f,label:g,labelStyle:y,labelShowBg:m,labelBgStyle:x,labelBgPadding:v,labelBgBorderRadius:_,style:S,markerEnd:C,markerStart:E,interactionWidth:N})=>{const[I,k,j]=Wg({sourceX:o,sourceY:l,sourcePosition:d,targetX:a,targetY:u,targetPosition:f}),R=t.isInternal?void 0:r;return p.jsx(Ml,{id:R,path:I,labelX:k,labelY:j,label:g,labelStyle:y,labelShowBg:m,labelBgStyle:x,labelBgPadding:v,labelBgBorderRadius:_,style:S,markerEnd:C,markerStart:E,interactionWidth:N})})}const SS=Yg({isInternal:!1}),Xg=Yg({isInternal:!0});SS.displayName="SimpleBezierEdge";Xg.displayName="SimpleBezierEdgeInternal";function Gg(t){return $.memo(({id:r,sourceX:o,sourceY:l,targetX:a,targetY:u,label:d,labelStyle:f,labelShowBg:g,labelBgStyle:y,labelBgPadding:m,labelBgBorderRadius:x,style:v,sourcePosition:_=Se.Bottom,targetPosition:S=Se.Top,markerEnd:C,markerStart:E,pathOptions:N,interactionWidth:I})=>{const[k,j,R]=Gu({sourceX:o,sourceY:l,sourcePosition:_,targetX:a,targetY:u,targetPosition:S,borderRadius:N==null?void 0:N.borderRadius,offset:N==null?void 0:N.offset,stepPosition:N==null?void 0:N.stepPosition}),T=t.isInternal?void 0:r;return p.jsx(Ml,{id:T,path:k,labelX:j,labelY:R,label:d,labelStyle:f,labelShowBg:g,labelBgStyle:y,labelBgPadding:m,labelBgBorderRadius:x,style:v,markerEnd:C,markerStart:E,interactionWidth:I})})}const Qg=Gg({isInternal:!1}),Kg=Gg({isInternal:!0});Qg.displayName="SmoothStepEdge";Kg.displayName="SmoothStepEdgeInternal";function qg(t){return $.memo(({id:r,...o})=>{var a;const l=t.isInternal?void 0:r;return p.jsx(Qg,{...o,id:l,pathOptions:$.useMemo(()=>{var u;return{borderRadius:0,offset:(u=o.pathOptions)==null?void 0:u.offset}},[(a=o.pathOptions)==null?void 0:a.offset])})})}const kS=qg({isInternal:!1}),Zg=qg({isInternal:!0});kS.displayName="StepEdge";Zg.displayName="StepEdgeInternal";function Jg(t){return $.memo(({id:r,sourceX:o,sourceY:l,targetX:a,targetY:u,label:d,labelStyle:f,labelShowBg:g,labelBgStyle:y,labelBgPadding:m,labelBgBorderRadius:x,style:v,markerEnd:_,markerStart:S,interactionWidth:C})=>{const[E,N,I]=mg({sourceX:o,sourceY:l,targetX:a,targetY:u}),k=t.isInternal?void 0:r;return p.jsx(Ml,{id:k,path:E,labelX:N,labelY:I,label:d,labelStyle:f,labelShowBg:g,labelBgStyle:y,labelBgPadding:m,labelBgBorderRadius:x,style:v,markerEnd:_,markerStart:S,interactionWidth:C})})}const ES=Jg({isInternal:!1}),em=Jg({isInternal:!0});ES.displayName="StraightEdge";em.displayName="StraightEdgeInternal";function tm(t){return $.memo(({id:r,sourceX:o,sourceY:l,targetX:a,targetY:u,sourcePosition:d=Se.Bottom,targetPosition:f=Se.Top,label:g,labelStyle:y,labelShowBg:m,labelBgStyle:x,labelBgPadding:v,labelBgBorderRadius:_,style:S,markerEnd:C,markerStart:E,pathOptions:N,interactionWidth:I})=>{const[k,j,R]=pg({sourceX:o,sourceY:l,sourcePosition:d,targetX:a,targetY:u,targetPosition:f,curvature:N==null?void 0:N.curvature}),T=t.isInternal?void 0:r;return p.jsx(Ml,{id:T,path:k,labelX:j,labelY:R,label:g,labelStyle:y,labelShowBg:m,labelBgStyle:x,labelBgPadding:v,labelBgBorderRadius:_,style:S,markerEnd:C,markerStart:E,interactionWidth:I})})}const NS=tm({isInternal:!1}),nm=tm({isInternal:!0});NS.displayName="BezierEdge";nm.displayName="BezierEdgeInternal";const Zh={default:nm,straight:em,step:Zg,smoothstep:Kg,simplebezier:Xg},Jh={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null,zIndex:void 0},CS=(t,r,o)=>o===Se.Left?t-r:o===Se.Right?t+r:t,jS=(t,r,o)=>o===Se.Top?t-r:o===Se.Bottom?t+r:t,ep="react-flow__edgeupdater";function tp({position:t,centerX:r,centerY:o,radius:l=10,onMouseDown:a,onMouseEnter:u,onMouseOut:d,type:f}){return p.jsx("circle",{onMouseDown:a,onMouseEnter:u,onMouseOut:d,className:et([ep,`${ep}-${f}`]),cx:CS(r,l,t),cy:jS(o,l,t),r:l,stroke:"transparent",fill:"transparent"})}function bS({isReconnectable:t,reconnectRadius:r,edge:o,sourceX:l,sourceY:a,targetX:u,targetY:d,sourcePosition:f,targetPosition:g,onReconnect:y,onReconnectStart:m,onReconnectEnd:x,setReconnecting:v,setUpdateHover:_}){const S=He(),C=(j,R)=>{if(j.button!==0)return;const{autoPanOnConnect:T,domNode:B,connectionMode:G,connectionRadius:U,lib:ee,onConnectStart:q,cancelConnection:te,nodeLookup:J,rfId:b,panBy:Y,updateConnection:V}=S.getState(),W=R.type==="target",D=(M,L)=>{v(!1),x==null||x(M,o,R.type,L)},A=M=>y==null?void 0:y(o,M),H=(M,L)=>{v(!0),m==null||m(j,o,R.type),q==null||q(M,L)};qu.onPointerDown(j.nativeEvent,{autoPanOnConnect:T,connectionMode:G,connectionRadius:U,domNode:B,handleId:R.id,nodeId:R.nodeId,nodeLookup:J,isTarget:W,edgeUpdaterType:R.type,lib:ee,flowId:b,cancelConnection:te,panBy:Y,isValidConnection:(...M)=>{var L,ne;return((ne=(L=S.getState()).isValidConnection)==null?void 0:ne.call(L,...M))??!0},onConnect:A,onConnectStart:H,onConnectEnd:(...M)=>{var L,ne;return(ne=(L=S.getState()).onConnectEnd)==null?void 0:ne.call(L,...M)},onReconnectEnd:D,updateConnection:V,getTransform:()=>S.getState().transform,getFromHandle:()=>S.getState().connection.fromHandle,dragThreshold:S.getState().connectionDragThreshold,handleDomNode:j.currentTarget})},E=j=>C(j,{nodeId:o.target,id:o.targetHandle??null,type:"target"}),N=j=>C(j,{nodeId:o.source,id:o.sourceHandle??null,type:"source"}),I=()=>_(!0),k=()=>_(!1);return p.jsxs(p.Fragment,{children:[(t===!0||t==="source")&&p.jsx(tp,{position:f,centerX:l,centerY:a,radius:r,onMouseDown:E,onMouseEnter:I,onMouseOut:k,type:"source"}),(t===!0||t==="target")&&p.jsx(tp,{position:g,centerX:u,centerY:d,radius:r,onMouseDown:N,onMouseEnter:I,onMouseOut:k,type:"target"})]})}function MS({id:t,edgesFocusable:r,edgesReconnectable:o,elementsSelectable:l,onClick:a,onDoubleClick:u,onContextMenu:d,onMouseEnter:f,onMouseMove:g,onMouseLeave:y,reconnectRadius:m,onReconnect:x,onReconnectStart:v,onReconnectEnd:_,rfId:S,edgeTypes:C,noPanClassName:E,onError:N,disableKeyboardA11y:I}){let k=Re(me=>me.edgeLookup.get(t));const j=Re(me=>me.defaultEdgeOptions);k=j?{...j,...k}:k;let R=k.type||"default",T=(C==null?void 0:C[R])||Zh[R];T===void 0&&(N==null||N("011",tn.error011(R)),R="default",T=(C==null?void 0:C.default)||Zh.default);const B=!!(k.focusable||r&&typeof k.focusable>"u"),G=typeof x<"u"&&(k.reconnectable||o&&typeof k.reconnectable>"u"),U=!!(k.selectable||l&&typeof k.selectable>"u"),ee=$.useRef(null),[q,te]=$.useState(!1),[J,b]=$.useState(!1),Y=He(),{zIndex:V=k.zIndex,sourceX:W,sourceY:D,targetX:A,targetY:H,sourcePosition:M,targetPosition:L}=Re($.useCallback(me=>{const ye=me.nodeLookup.get(k.source),Ne=me.nodeLookup.get(k.target);if(!ye||!Ne)return Jh;const Pe=g1({id:t,sourceNode:ye,targetNode:Ne,sourceHandle:k.sourceHandle||null,targetHandle:k.targetHandle||null,connectionMode:me.connectionMode,onError:N}),je=l1({selected:k.selected,zIndex:k.zIndex,sourceNode:ye,targetNode:Ne,elevateOnSelect:me.elevateEdgesOnSelect,zIndexMode:me.zIndexMode});return{...Pe||Jh,zIndex:je}},[k.source,k.target,k.sourceHandle,k.targetHandle,k.selected,k.zIndex,N]),Xe),ne=$.useMemo(()=>k.markerStart?`url('#${Qu(k.markerStart,S)}')`:void 0,[k.markerStart,S]),re=$.useMemo(()=>k.markerEnd?`url('#${Qu(k.markerEnd,S)}')`:void 0,[k.markerEnd,S]);if(k.hidden||W===null||D===null||A===null||H===null)return null;const ce=me=>{var je;const{addSelectedEdges:ye,unselectNodesAndEdges:Ne,multiSelectionActive:Pe}=Y.getState();U&&(Y.setState({nodesSelectionActive:!1}),k.selected&&Pe?(Ne({nodes:[],edges:[k]}),(je=ee.current)==null||je.blur()):ye([t])),a&&a(me,k)},fe=u?me=>{u(me,{...k})}:void 0,de=d?me=>{d(me,{...k})}:void 0,K=f?me=>{f(me,{...k})}:void 0,se=g?me=>{g(me,{...k})}:void 0,pe=y?me=>{y(me,{...k})}:void 0,_e=me=>{var ye;if(!I&&Zp.includes(me.key)&&U){const{unselectNodesAndEdges:Ne,addSelectedEdges:Pe}=Y.getState();me.key==="Escape"?((ye=ee.current)==null||ye.blur(),Ne({edges:[k]})):Pe([t])}};return p.jsx("svg",{style:{zIndex:V},children:p.jsxs("g",{className:et(["react-flow__edge",`react-flow__edge-${R}`,k.className,E,{selected:k.selected,animated:k.animated,inactive:!U&&!a,updating:q,selectable:U}]),onClick:ce,onDoubleClick:fe,onContextMenu:de,onMouseEnter:K,onMouseMove:se,onMouseLeave:pe,onKeyDown:B?_e:void 0,tabIndex:B?0:void 0,role:k.ariaRole??(B?"group":"img"),"aria-roledescription":"edge","data-id":t,"data-testid":`rf__edge-${t}`,"aria-label":k.ariaLabel===null?void 0:k.ariaLabel||`Edge from ${k.source} to ${k.target}`,"aria-describedby":B?`${Ig}-${S}`:void 0,ref:ee,...k.domAttributes,children:[!J&&p.jsx(T,{id:t,source:k.source,target:k.target,type:k.type,selected:k.selected,animated:k.animated,selectable:U,deletable:k.deletable??!0,label:k.label,labelStyle:k.labelStyle,labelShowBg:k.labelShowBg,labelBgStyle:k.labelBgStyle,labelBgPadding:k.labelBgPadding,labelBgBorderRadius:k.labelBgBorderRadius,sourceX:W,sourceY:D,targetX:A,targetY:H,sourcePosition:M,targetPosition:L,data:k.data,style:k.style,sourceHandleId:k.sourceHandle,targetHandleId:k.targetHandle,markerStart:ne,markerEnd:re,pathOptions:"pathOptions"in k?k.pathOptions:void 0,interactionWidth:k.interactionWidth}),G&&p.jsx(bS,{edge:k,isReconnectable:G,reconnectRadius:m,onReconnect:x,onReconnectStart:v,onReconnectEnd:_,sourceX:W,sourceY:D,targetX:A,targetY:H,sourcePosition:M,targetPosition:L,setUpdateHover:te,setReconnecting:b})]})})}var PS=$.memo(MS);const IS=t=>({edgesFocusable:t.edgesFocusable,edgesReconnectable:t.edgesReconnectable,elementsSelectable:t.elementsSelectable,connectionMode:t.connectionMode,onError:t.onError});function rm({defaultMarkerColor:t,onlyRenderVisibleElements:r,rfId:o,edgeTypes:l,noPanClassName:a,onReconnect:u,onEdgeContextMenu:d,onEdgeMouseEnter:f,onEdgeMouseMove:g,onEdgeMouseLeave:y,onEdgeClick:m,reconnectRadius:x,onEdgeDoubleClick:v,onReconnectStart:_,onReconnectEnd:S,disableKeyboardA11y:C}){const{edgesFocusable:E,edgesReconnectable:N,elementsSelectable:I,onError:k}=Re(IS,Xe),j=gS(r);return p.jsxs("div",{className:"react-flow__edges",children:[p.jsx(wS,{defaultColor:t,rfId:o}),j.map(R=>p.jsx(PS,{id:R,edgesFocusable:E,edgesReconnectable:N,elementsSelectable:I,noPanClassName:a,onReconnect:u,onContextMenu:d,onMouseEnter:f,onMouseMove:g,onMouseLeave:y,onClick:m,reconnectRadius:x,onDoubleClick:v,onReconnectStart:_,onReconnectEnd:S,rfId:o,onError:k,edgeTypes:l,disableKeyboardA11y:C},R))]})}rm.displayName="EdgeRenderer";const TS=$.memo(rm),np=t=>`translate(${t[0]}px,${t[1]}px) scale(${t[2]})`;function RS({children:t}){const r=He(),o=$.useRef(null),[l]=$.useState(()=>r.getState().transform);return zg(()=>{let a=null;const u=()=>{const d=r.getState().transform;a&&d[0]===a[0]&&d[1]===a[1]&&d[2]===a[2]||(a=d,o.current&&(o.current.style.transform=np(d)))};return u(),r.subscribe(u)},[r]),p.jsx("div",{ref:o,className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:np(l)},children:t})}function LS(t){const r=mc(),o=$.useRef(!1);$.useEffect(()=>{!o.current&&r.viewportInitialized&&t&&(setTimeout(()=>t(r),1),o.current=!0)},[t,r.viewportInitialized])}const zS=t=>{var r;return(r=t.panZoom)==null?void 0:r.syncViewport};function AS(t){const r=Re(zS),o=He();return $.useEffect(()=>{t&&(r==null||r(t),o.setState({transform:[t.x,t.y,t.zoom]}))},[t,r]),null}function DS(t){return t.connection.inProgress?{...t.connection,to:Lo(t.connection.to,t.transform)}:{...t.connection}}function $S(t){return DS}function OS(t){const r=$S();return Re(r,Xe)}const FS=t=>({nodesConnectable:t.nodesConnectable,isValid:t.connection.isValid,inProgress:t.connection.inProgress,width:t.width,height:t.height});function HS({containerStyle:t,style:r,type:o,component:l}){const{nodesConnectable:a,width:u,height:d,isValid:f,inProgress:g}=Re(FS,Xe);return!(u&&a&&g)?null:p.jsx("svg",{style:t,width:u,height:d,className:"react-flow__connectionline react-flow__container",children:p.jsx("g",{className:et(["react-flow__connection",tg(f)]),children:p.jsx(im,{style:r,type:o,CustomComponent:l,isValid:f})})})}const im=({style:t,type:r=nr.Bezier,CustomComponent:o,isValid:l})=>{const{inProgress:a,from:u,fromNode:d,fromHandle:f,fromPosition:g,to:y,toNode:m,toHandle:x,toPosition:v,pointer:_}=OS();if(!a)return;if(o)return p.jsx(o,{connectionLineType:r,connectionLineStyle:t,fromNode:d,fromHandle:f,fromX:u.x,fromY:u.y,toX:y.x,toY:y.y,fromPosition:g,toPosition:v,connectionStatus:tg(l),toNode:m,toHandle:x,pointer:_});let S="";const C={sourceX:u.x,sourceY:u.y,sourcePosition:g,targetX:y.x,targetY:y.y,targetPosition:v};switch(r){case nr.Bezier:[S]=pg(C);break;case nr.SimpleBezier:[S]=Wg(C);break;case nr.Step:[S]=Gu({...C,borderRadius:0});break;case nr.SmoothStep:[S]=Gu(C);break;default:[S]=mg(C)}return p.jsx("path",{d:S,fill:"none",className:"react-flow__connection-path",style:t})};im.displayName="ConnectionLine";const BS={};function rp(t=BS){$.useRef(t),He(),$.useEffect(()=>{},[t])}function VS(){He(),$.useRef(!1),$.useEffect(()=>{},[])}function om({nodeTypes:t,edgeTypes:r,onInit:o,onNodeClick:l,onEdgeClick:a,onNodeDoubleClick:u,onEdgeDoubleClick:d,onNodeMouseEnter:f,onNodeMouseMove:g,onNodeMouseLeave:y,onNodeContextMenu:m,onSelectionContextMenu:x,onSelectionStart:v,onSelectionEnd:_,connectionLineType:S,connectionLineStyle:C,connectionLineComponent:E,connectionLineContainerStyle:N,selectionKeyCode:I,selectionOnDrag:k,selectionMode:j,multiSelectionKeyCode:R,panActivationKeyCode:T,zoomActivationKeyCode:B,deleteKeyCode:G,onlyRenderVisibleElements:U,elementsSelectable:ee,defaultViewport:q,translateExtent:te,minZoom:J,maxZoom:b,preventScrolling:Y,defaultMarkerColor:V,zoomOnScroll:W,zoomOnPinch:D,panOnScroll:A,panOnScrollSpeed:H,panOnScrollMode:M,zoomOnDoubleClick:L,panOnDrag:ne,autoPanOnSelection:re,onPaneClick:ce,onPaneMouseEnter:fe,onPaneMouseMove:de,onPaneMouseLeave:K,onPaneScroll:se,onPaneContextMenu:pe,paneClickDistance:_e,nodeClickDistance:me,onEdgeContextMenu:ye,onEdgeMouseEnter:Ne,onEdgeMouseMove:Pe,onEdgeMouseLeave:je,reconnectRadius:Me,onReconnect:tt,onReconnectStart:Ge,onReconnectEnd:nt,noDragClassName:Ke,noWheelClassName:bt,noPanClassName:Dt,disableKeyboardA11y:ot,nodeExtent:ut,rfId:ct,viewport:ht,onViewportChange:wt,nodesDraggable:Mn}){return rp(t),rp(r),VS(),LS(o),AS(ht),p.jsx(oS,{onPaneClick:ce,onPaneMouseEnter:fe,onPaneMouseMove:de,onPaneMouseLeave:K,onPaneContextMenu:pe,onPaneScroll:se,paneClickDistance:_e,deleteKeyCode:G,selectionKeyCode:I,selectionOnDrag:k,selectionMode:j,onSelectionStart:v,onSelectionEnd:_,multiSelectionKeyCode:R,panActivationKeyCode:T,zoomActivationKeyCode:B,elementsSelectable:ee,zoomOnScroll:W,zoomOnPinch:D,zoomOnDoubleClick:L,panOnScroll:A,panOnScrollSpeed:H,panOnScrollMode:M,panOnDrag:ne,autoPanOnSelection:re,defaultViewport:q,translateExtent:te,minZoom:J,maxZoom:b,onSelectionContextMenu:x,preventScrolling:Y,noDragClassName:Ke,noWheelClassName:bt,noPanClassName:Dt,disableKeyboardA11y:ot,onViewportChange:wt,isControlledViewport:!!ht,children:p.jsxs(RS,{children:[p.jsx(TS,{edgeTypes:r,onEdgeClick:a,onEdgeDoubleClick:d,onReconnect:tt,onReconnectStart:Ge,onReconnectEnd:nt,onlyRenderVisibleElements:U,onEdgeContextMenu:ye,onEdgeMouseEnter:Ne,onEdgeMouseMove:Pe,onEdgeMouseLeave:je,reconnectRadius:Me,defaultMarkerColor:V,noPanClassName:Dt,disableKeyboardA11y:ot,rfId:ct}),p.jsx(HS,{style:C,type:S,component:E,containerStyle:N}),p.jsx("div",{className:"react-flow__edgelabel-renderer"}),p.jsx(pS,{nodeTypes:t,onNodeClick:l,onNodeDoubleClick:u,onNodeMouseEnter:f,onNodeMouseMove:g,onNodeMouseLeave:y,onNodeContextMenu:m,nodeClickDistance:me,onlyRenderVisibleElements:U,noPanClassName:Dt,noDragClassName:Ke,disableKeyboardA11y:ot,nodeExtent:ut,rfId:ct,nodesDraggable:Mn}),p.jsx("div",{className:"react-flow__viewport-portal"})]})})}om.displayName="GraphView";const US=$.memo(om),WS=lg(),ip=({nodes:t,edges:r,defaultNodes:o,defaultEdges:l,width:a,height:u,fitView:d,fitViewOptions:f,minZoom:g=.5,maxZoom:y=2,nodeOrigin:m,nodeExtent:x,zIndexMode:v="basic"}={})=>{const _=new Map,S=new Map,C=new Map,E=new Map,N=l??r??[],I=o??t??[],k=m??[0,0],j=x??So;xg(C,E,N);const{nodesInitialized:R}=Ku(I,_,S,{nodeOrigin:k,nodeExtent:j,zIndexMode:v});let T=[0,0,1];if(d&&a&&u){const B=To(_,{filter:q=>!!((q.width||q.initialWidth)&&(q.height||q.initialHeight))}),{x:G,y:U,zoom:ee}=uc(B,a,u,g,y,(f==null?void 0:f.padding)??.1);T=[G,U,ee]}return{rfId:"1",width:a??0,height:u??0,transform:T,nodes:I,nodesInitialized:R,nodeLookup:_,parentLookup:S,edges:N,edgeLookup:E,connectionLookup:C,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:o!==void 0,hasDefaultEdges:l!==void 0,panZoom:null,minZoom:g,maxZoom:y,translateExtent:So,nodeExtent:j,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:wi.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:k,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:d??!1,fitViewOptions:f,fitViewResolver:null,connection:{...eg},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:WS,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:Jp,zIndexMode:v,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},YS=({nodes:t,edges:r,defaultNodes:o,defaultEdges:l,width:a,height:u,fitView:d,fitViewOptions:f,minZoom:g,maxZoom:y,nodeOrigin:m,nodeExtent:x,zIndexMode:v})=>i_((_,S)=>{async function C(){const{nodeLookup:E,panZoom:N,fitViewOptions:I,fitViewResolver:k,width:j,height:R,minZoom:T,maxZoom:B}=S();N&&(await e1({nodes:E,width:j,height:R,panZoom:N,minZoom:T,maxZoom:B},I),k==null||k.resolve(!0),_({fitViewResolver:null}))}return{...ip({nodes:t,edges:r,width:a,height:u,fitView:d,fitViewOptions:f,minZoom:g,maxZoom:y,nodeOrigin:m,nodeExtent:x,defaultNodes:o,defaultEdges:l,zIndexMode:v}),setNodes:E=>{const{nodeLookup:N,parentLookup:I,nodeOrigin:k,nodeExtent:j,elevateNodesOnSelect:R,fitViewQueued:T,zIndexMode:B,nodesSelectionActive:G}=S(),{nodesInitialized:U,hasSelectedNodes:ee}=Ku(E,N,I,{nodeOrigin:k,nodeExtent:j,elevateNodesOnSelect:R,checkEquality:!0,zIndexMode:B}),q=G&ⅇT&&U?(C(),_({nodes:E,nodesInitialized:U,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:q})):_({nodes:E,nodesInitialized:U,nodesSelectionActive:q})},setEdges:E=>{const{connectionLookup:N,edgeLookup:I}=S();xg(N,I,E),_({edges:E})},setDefaultNodesAndEdges:(E,N)=>{if(E){const{setNodes:I}=S();I(E),_({hasDefaultNodes:!0})}if(N){const{setEdges:I}=S();I(N),_({hasDefaultEdges:!0})}},updateNodeInternals:E=>{const{triggerNodeChanges:N,nodeLookup:I,parentLookup:k,domNode:j,nodeOrigin:R,nodeExtent:T,debug:B,fitViewQueued:G,zIndexMode:U}=S(),{changes:ee,updatedInternals:q}=k1(E,I,k,j,R,T,U);q&&(x1(I,k,{nodeOrigin:R,nodeExtent:T,zIndexMode:U}),G?(C(),_({fitViewQueued:!1,fitViewOptions:void 0})):_({}),(ee==null?void 0:ee.length)>0&&(B&&console.log("React Flow: trigger node changes",ee),N==null||N(ee)))},updateNodePositions:(E,N=!1)=>{const I=[];let k=[];const{nodeLookup:j,triggerNodeChanges:R,connection:T,updateConnection:B,onNodesChangeMiddlewareMap:G}=S();for(const[U,ee]of E){const q=j.get(U),te=!!(q!=null&&q.expandParent&&(q!=null&&q.parentId)&&(ee!=null&&ee.position)),J={id:U,type:"position",position:te?{x:Math.max(0,ee.position.x),y:Math.max(0,ee.position.y)}:ee.position,dragging:N};if(q&&T.inProgress&&T.fromNode.id===q.id){const b=Ar(q,T.fromHandle,Se.Left,!0);B({...T,from:b})}te&&q.parentId&&I.push({id:U,parentId:q.parentId,rect:{...ee.internals.positionAbsolute,width:ee.measured.width??0,height:ee.measured.height??0}}),k.push(J)}if(I.length>0){const{parentLookup:U,nodeOrigin:ee}=S(),q=gc(I,j,U,ee);k.push(...q)}for(const U of G.values())k=U(k);R(k)},triggerNodeChanges:E=>{const{onNodesChange:N,setNodes:I,nodes:k,hasDefaultNodes:j,debug:R}=S();if(E!=null&&E.length){if(j){const T=N_(E,k);I(T)}R&&console.log("React Flow: trigger node changes",E),N==null||N(E)}},triggerEdgeChanges:E=>{const{onEdgesChange:N,setEdges:I,edges:k,hasDefaultEdges:j,debug:R}=S();if(E!=null&&E.length){if(j){const T=C_(E,k);I(T)}R&&console.log("React Flow: trigger edge changes",E),N==null||N(E)}},addSelectedNodes:E=>{const{multiSelectionActive:N,edgeLookup:I,nodeLookup:k,triggerNodeChanges:j,triggerEdgeChanges:R}=S();if(N){const T=E.map(B=>br(B,!0));j(T);return}j(gi(k,new Set([...E]),!0)),R(gi(I))},addSelectedEdges:E=>{const{multiSelectionActive:N,edgeLookup:I,nodeLookup:k,triggerNodeChanges:j,triggerEdgeChanges:R}=S();if(N){const T=E.map(B=>br(B,!0));R(T);return}R(gi(I,new Set([...E]))),j(gi(k,new Set,!0))},unselectNodesAndEdges:({nodes:E,edges:N}={})=>{const{edges:I,nodes:k,nodeLookup:j,triggerNodeChanges:R,triggerEdgeChanges:T}=S(),B=E||k,G=N||I,U=[];for(const q of B){if(!q.selected)continue;const te=j.get(q.id);te&&(te.selected=!1),U.push(br(q.id,!1))}const ee=[];for(const q of G)q.selected&&ee.push(br(q.id,!1));R(U),T(ee)},setMinZoom:E=>{const{panZoom:N,maxZoom:I}=S();N==null||N.setScaleExtent([E,I]),_({minZoom:E})},setMaxZoom:E=>{const{panZoom:N,minZoom:I}=S();N==null||N.setScaleExtent([I,E]),_({maxZoom:E})},setTranslateExtent:E=>{var N;(N=S().panZoom)==null||N.setTranslateExtent(E),_({translateExtent:E})},resetSelectedElements:()=>{const{edges:E,nodes:N,triggerNodeChanges:I,triggerEdgeChanges:k,elementsSelectable:j}=S();if(!j)return;const R=N.reduce((B,G)=>G.selected?[...B,br(G.id,!1)]:B,[]),T=E.reduce((B,G)=>G.selected?[...B,br(G.id,!1)]:B,[]);I(R),k(T)},setNodeExtent:E=>{const{nodes:N,nodeLookup:I,parentLookup:k,nodeOrigin:j,elevateNodesOnSelect:R,nodeExtent:T,zIndexMode:B}=S();E[0][0]===T[0][0]&&E[0][1]===T[0][1]&&E[1][0]===T[1][0]&&E[1][1]===T[1][1]||(Ku(N,I,k,{nodeOrigin:j,nodeExtent:E,elevateNodesOnSelect:R,checkEquality:!1,zIndexMode:B}),_({nodeExtent:E}))},panBy:E=>{const{transform:N,width:I,height:k,panZoom:j,translateExtent:R}=S();return E1({delta:E,panZoom:j,transform:N,translateExtent:R,width:I,height:k})},setCenter:async(E,N,I)=>{const{width:k,height:j,maxZoom:R,panZoom:T}=S();if(!T)return!1;const B=typeof(I==null?void 0:I.zoom)<"u"?I.zoom:R;return await T.setViewport({x:k/2-E*B,y:j/2-N*B,zoom:B},{duration:I==null?void 0:I.duration,ease:I==null?void 0:I.ease,interpolate:I==null?void 0:I.interpolate}),!0},cancelConnection:()=>{_({connection:{...eg}})},updateConnection:E=>{_({connection:E})},reset:()=>_({...ip()})}},Object.is);function sm({initialNodes:t,initialEdges:r,defaultNodes:o,defaultEdges:l,initialWidth:a,initialHeight:u,initialMinZoom:d,initialMaxZoom:f,initialFitViewOptions:g,fitView:y,nodeOrigin:m,nodeExtent:x,zIndexMode:v,children:_}){const[S]=$.useState(()=>YS({nodes:t,edges:r,defaultNodes:o,defaultEdges:l,width:a,height:u,fitView:y,minZoom:d,maxZoom:f,fitViewOptions:g,nodeOrigin:m,nodeExtent:x,zIndexMode:v}));return p.jsx(o_,{value:S,children:p.jsx(I_,{children:p.jsx(Y_,{children:_})})})}function XS({children:t,nodes:r,edges:o,defaultNodes:l,defaultEdges:a,width:u,height:d,fitView:f,fitViewOptions:g,minZoom:y,maxZoom:m,nodeOrigin:x,nodeExtent:v,zIndexMode:_}){return $.useContext(Cl)?p.jsx(p.Fragment,{children:t}):p.jsx(sm,{initialNodes:r,initialEdges:o,defaultNodes:l,defaultEdges:a,initialWidth:u,initialHeight:d,fitView:f,initialFitViewOptions:g,initialMinZoom:y,initialMaxZoom:m,nodeOrigin:x,nodeExtent:v,zIndexMode:_,children:t})}const GS={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function QS({nodes:t,edges:r,defaultNodes:o,defaultEdges:l,className:a,nodeTypes:u,edgeTypes:d,onNodeClick:f,onEdgeClick:g,onInit:y,onMove:m,onMoveStart:x,onMoveEnd:v,onConnect:_,onConnectStart:S,onConnectEnd:C,onClickConnectStart:E,onClickConnectEnd:N,onNodeMouseEnter:I,onNodeMouseMove:k,onNodeMouseLeave:j,onNodeContextMenu:R,onNodeDoubleClick:T,onNodeDragStart:B,onNodeDrag:G,onNodeDragStop:U,onNodesDelete:ee,onEdgesDelete:q,onDelete:te,onSelectionChange:J,onSelectionDragStart:b,onSelectionDrag:Y,onSelectionDragStop:V,onSelectionContextMenu:W,onSelectionStart:D,onSelectionEnd:A,onBeforeDelete:H,connectionMode:M,connectionLineType:L=nr.Bezier,connectionLineStyle:ne,connectionLineComponent:re,connectionLineContainerStyle:ce,deleteKeyCode:fe="Backspace",selectionKeyCode:de="Shift",selectionOnDrag:K=!1,selectionMode:se=ko.Full,panActivationKeyCode:pe="Space",multiSelectionKeyCode:_e=Co()?"Meta":"Control",zoomActivationKeyCode:me=Co()?"Meta":"Control",snapToGrid:ye,snapGrid:Ne,onlyRenderVisibleElements:Pe=!1,selectNodesOnDrag:je,nodesDraggable:Me,autoPanOnNodeFocus:tt,nodesConnectable:Ge,nodesFocusable:nt,nodeOrigin:Ke=Tg,edgesFocusable:bt,edgesReconnectable:Dt,elementsSelectable:ot=!0,defaultViewport:ut=v_,minZoom:ct=.5,maxZoom:ht=2,translateExtent:wt=So,preventScrolling:Mn=!0,nodeExtent:Ut,defaultMarkerColor:gn="#b1b1b7",zoomOnScroll:Ni=!0,zoomOnPinch:$r=!0,panOnScroll:ir=!1,panOnScrollSpeed:Ci=.5,panOnScrollMode:or=Ir.Free,zoomOnDoubleClick:Pn=!0,panOnDrag:mn=!0,onPaneClick:In,onPaneMouseEnter:sr,onPaneMouseMove:on,onPaneMouseLeave:sn,onPaneScroll:lr,onPaneContextMenu:ar,paneClickDistance:ur=1,nodeClickDistance:cr=0,children:dr,onReconnect:Tn,onReconnectStart:fr,onReconnectEnd:F,onEdgeContextMenu:ae,onEdgeDoubleClick:be,onEdgeMouseEnter:$e,onEdgeMouseMove:Ae,onEdgeMouseLeave:Rn,reconnectRadius:Or=10,onNodesChange:ji,onEdgesChange:Il,noDragClassName:Tl="nodrag",noWheelClassName:Rl="nowheel",noPanClassName:ln="nopan",fitView:bi,fitViewOptions:Mi,connectOnClick:Ll,attributionPosition:zo,proOptions:Ao,defaultEdgeOptions:Do,elevateNodesOnSelect:$o=!0,elevateEdgesOnSelect:zl=!1,disableKeyboardA11y:Oo=!1,autoPanOnConnect:Ue,autoPanOnNodeDrag:Al,autoPanOnSelection:Pi=!0,autoPanSpeed:Fo,connectionRadius:Fr,isValidConnection:Dl,onError:Ho,style:Hr,id:Mt,nodeDragThreshold:$l,connectionDragThreshold:Pt,viewport:Ol,onViewportChange:Fl,width:Hl,height:Br,colorMode:Vr="light",debug:hr,onScroll:yn,ariaLabelConfig:Bl,zIndexMode:Bo="basic",...Ii},Vo){const pr=Mt||"1",gr=S_(Vr),Vl=$.useCallback(Ur=>{Ur.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),yn==null||yn(Ur)},[yn]);return p.jsx("div",{"data-testid":"rf__wrapper",...Ii,onScroll:Vl,style:{...Hr,...GS},ref:Vo,className:et(["react-flow",a,gr]),id:Mt,role:"application",children:p.jsxs(XS,{nodes:t,edges:r,width:Hl,height:Br,fitView:bi,fitViewOptions:Mi,minZoom:ct,maxZoom:ht,nodeOrigin:Ke,nodeExtent:Ut,zIndexMode:Bo,children:[p.jsx(__,{nodes:t,edges:r,defaultNodes:o,defaultEdges:l,onConnect:_,onConnectStart:S,onConnectEnd:C,onClickConnectStart:E,onClickConnectEnd:N,nodesDraggable:Me,autoPanOnNodeFocus:tt,nodesConnectable:Ge,nodesFocusable:nt,edgesFocusable:bt,edgesReconnectable:Dt,elementsSelectable:ot,elevateNodesOnSelect:$o,elevateEdgesOnSelect:zl,minZoom:ct,maxZoom:ht,nodeExtent:Ut,onNodesChange:ji,onEdgesChange:Il,snapToGrid:ye,snapGrid:Ne,connectionMode:M,translateExtent:wt,connectOnClick:Ll,defaultEdgeOptions:Do,fitView:bi,fitViewOptions:Mi,onNodesDelete:ee,onEdgesDelete:q,onDelete:te,onNodeDragStart:B,onNodeDrag:G,onNodeDragStop:U,onSelectionDrag:Y,onSelectionDragStart:b,onSelectionDragStop:V,onMove:m,onMoveStart:x,onMoveEnd:v,noPanClassName:ln,nodeOrigin:Ke,rfId:pr,autoPanOnConnect:Ue,autoPanOnNodeDrag:Al,autoPanSpeed:Fo,onError:Ho,connectionRadius:Fr,isValidConnection:Dl,selectNodesOnDrag:je,nodeDragThreshold:$l,connectionDragThreshold:Pt,onBeforeDelete:H,debug:hr,ariaLabelConfig:Bl,zIndexMode:Bo}),p.jsx(US,{onInit:y,onNodeClick:f,onEdgeClick:g,onNodeMouseEnter:I,onNodeMouseMove:k,onNodeMouseLeave:j,onNodeContextMenu:R,onNodeDoubleClick:T,nodeTypes:u,edgeTypes:d,connectionLineType:L,connectionLineStyle:ne,connectionLineComponent:re,connectionLineContainerStyle:ce,selectionKeyCode:de,selectionOnDrag:K,selectionMode:se,deleteKeyCode:fe,multiSelectionKeyCode:_e,panActivationKeyCode:pe,zoomActivationKeyCode:me,onlyRenderVisibleElements:Pe,defaultViewport:ut,translateExtent:wt,minZoom:ct,maxZoom:ht,preventScrolling:Mn,zoomOnScroll:Ni,zoomOnPinch:$r,zoomOnDoubleClick:Pn,panOnScroll:ir,panOnScrollSpeed:Ci,panOnScrollMode:or,panOnDrag:mn,autoPanOnSelection:Pi,onPaneClick:In,onPaneMouseEnter:sr,onPaneMouseMove:on,onPaneMouseLeave:sn,onPaneScroll:lr,onPaneContextMenu:ar,paneClickDistance:ur,nodeClickDistance:cr,onSelectionContextMenu:W,onSelectionStart:D,onSelectionEnd:A,onReconnect:Tn,onReconnectStart:fr,onReconnectEnd:F,onEdgeContextMenu:ae,onEdgeDoubleClick:be,onEdgeMouseEnter:$e,onEdgeMouseMove:Ae,onEdgeMouseLeave:Rn,reconnectRadius:Or,defaultMarkerColor:gn,noDragClassName:Tl,noWheelClassName:Rl,noPanClassName:ln,rfId:pr,disableKeyboardA11y:Oo,nodeExtent:Ut,viewport:Ol,onViewportChange:Fl,nodesDraggable:Me}),p.jsx(y_,{onSelectionChange:J}),dr,p.jsx(f_,{proOptions:Ao,position:zo}),p.jsx(d_,{rfId:pr,disableKeyboardA11y:Oo})]})})}var KS=Lg(QS);function qS({dimensions:t,lineWidth:r,variant:o,className:l}){return p.jsx("path",{strokeWidth:r,d:`M${t[0]/2} 0 V${t[1]} M0 ${t[1]/2} H${t[0]}`,className:et(["react-flow__background-pattern",o,l])})}function ZS({radius:t,className:r}){return p.jsx("circle",{cx:t,cy:t,r:t,className:et(["react-flow__background-pattern","dots",r])})}var rr;(function(t){t.Lines="lines",t.Dots="dots",t.Cross="cross"})(rr||(rr={}));const JS={[rr.Dots]:1,[rr.Lines]:1,[rr.Cross]:6},ek=t=>({transform:t.transform,patternId:`pattern-${t.rfId}`});function lm({id:t,variant:r=rr.Dots,gap:o=20,size:l,lineWidth:a=1,offset:u=0,color:d,bgColor:f,style:g,className:y,patternClassName:m}){const x=$.useRef(null),{transform:v,patternId:_}=Re(ek,Xe),S=l||JS[r],C=r===rr.Dots,E=r===rr.Cross,N=Array.isArray(o)?o:[o,o],I=[N[0]*v[2]||1,N[1]*v[2]||1],k=S*v[2],j=Array.isArray(u)?u:[u,u],R=E?[k,k]:I,T=[j[0]*v[2]+R[0]/2,j[1]*v[2]+R[1]/2],B=`${_}${t||""}`;return p.jsxs("svg",{className:et(["react-flow__background",y]),style:{...g,...bl,"--xy-background-color-props":f,"--xy-background-pattern-color-props":d},ref:x,"data-testid":"rf__background",children:[p.jsx("pattern",{id:B,x:v[0]%I[0],y:v[1]%I[1],width:I[0],height:I[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${T[0]},-${T[1]})`,children:C?p.jsx(ZS,{radius:k/2,className:m}):p.jsx(qS,{dimensions:R,lineWidth:a,variant:r,className:m})}),p.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${B})`})]})}lm.displayName="Background";const tk=$.memo(lm);function nk(){return p.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:p.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function rk(){return p.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:p.jsx("path",{d:"M0 0h32v4.2H0z"})})}function ik(){return p.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:p.jsx("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"})})}function ok(){return p.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:p.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"})})}function sk(){return p.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:p.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z"})})}function Js({children:t,className:r,...o}){return p.jsx("button",{type:"button",className:et(["react-flow__controls-button",r]),...o,children:t})}const lk=t=>({isInteractive:t.nodesDraggable||t.nodesConnectable||t.elementsSelectable,minZoomReached:t.transform[2]<=t.minZoom,maxZoomReached:t.transform[2]>=t.maxZoom,ariaLabelConfig:t.ariaLabelConfig});function am({style:t,showZoom:r=!0,showFitView:o=!0,showInteractive:l=!0,fitViewOptions:a,onZoomIn:u,onZoomOut:d,onFitView:f,onInteractiveChange:g,className:y,children:m,position:x="bottom-left",orientation:v="vertical","aria-label":_}){const S=He(),{isInteractive:C,minZoomReached:E,maxZoomReached:N,ariaLabelConfig:I}=Re(lk,Xe),{zoomIn:k,zoomOut:j,fitView:R}=mc(),T=()=>{k(),u==null||u()},B=()=>{j(),d==null||d()},G=()=>{R(a),f==null||f()},U=()=>{S.setState({nodesDraggable:!C,nodesConnectable:!C,elementsSelectable:!C}),g==null||g(!C)},ee=v==="horizontal"?"horizontal":"vertical";return p.jsxs(jl,{className:et(["react-flow__controls",ee,y]),position:x,style:t,"data-testid":"rf__controls","aria-label":_??I["controls.ariaLabel"],children:[r&&p.jsxs(p.Fragment,{children:[p.jsx(Js,{onClick:T,className:"react-flow__controls-zoomin",title:I["controls.zoomIn.ariaLabel"],"aria-label":I["controls.zoomIn.ariaLabel"],disabled:N,children:p.jsx(nk,{})}),p.jsx(Js,{onClick:B,className:"react-flow__controls-zoomout",title:I["controls.zoomOut.ariaLabel"],"aria-label":I["controls.zoomOut.ariaLabel"],disabled:E,children:p.jsx(rk,{})})]}),o&&p.jsx(Js,{className:"react-flow__controls-fitview",onClick:G,title:I["controls.fitView.ariaLabel"],"aria-label":I["controls.fitView.ariaLabel"],children:p.jsx(ik,{})}),l&&p.jsx(Js,{className:"react-flow__controls-interactive",onClick:U,title:I["controls.interactive.ariaLabel"],"aria-label":I["controls.interactive.ariaLabel"],children:C?p.jsx(sk,{}):p.jsx(ok,{})}),m]})}am.displayName="Controls";const ak=$.memo(am);function uk({id:t,x:r,y:o,width:l,height:a,style:u,color:d,strokeColor:f,strokeWidth:g,className:y,borderRadius:m,shapeRendering:x,selected:v,onClick:_}){const{background:S,backgroundColor:C}=u||{},E=d||S||C;return p.jsx("rect",{className:et(["react-flow__minimap-node",{selected:v},y]),x:r,y:o,rx:m,ry:m,width:l,height:a,style:{fill:E,stroke:f,strokeWidth:g},shapeRendering:x,onClick:_?N=>_(N,t):void 0})}const ck=$.memo(uk),dk=t=>t.nodes.map(r=>r.id),Du=t=>t instanceof Function?t:()=>t;function fk({nodeStrokeColor:t,nodeColor:r,nodeClassName:o="",nodeBorderRadius:l=5,nodeStrokeWidth:a,nodeComponent:u=ck,onClick:d}){const f=Re(dk,Xe),g=Du(r),y=Du(t),m=Du(o),x=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";return p.jsx(p.Fragment,{children:f.map(v=>p.jsx(pk,{id:v,nodeColorFunc:g,nodeStrokeColorFunc:y,nodeClassNameFunc:m,nodeBorderRadius:l,nodeStrokeWidth:a,NodeComponent:u,onClick:d,shapeRendering:x},v))})}function hk({id:t,nodeColorFunc:r,nodeStrokeColorFunc:o,nodeClassNameFunc:l,nodeBorderRadius:a,nodeStrokeWidth:u,shapeRendering:d,NodeComponent:f,onClick:g}){const{node:y,x:m,y:x,width:v,height:_}=Re(S=>{const C=S.nodeLookup.get(t);if(!C)return{node:void 0,x:0,y:0,width:0,height:0};const E=C.internals.userNode,{x:N,y:I}=C.internals.positionAbsolute,{width:k,height:j}=rn(E);return{node:E,x:N,y:I,width:k,height:j}},Xe);return!y||y.hidden||!ag(y)?null:p.jsx(f,{x:m,y:x,width:v,height:_,style:y.style,selected:!!y.selected,className:l(y),color:r(y),borderRadius:a,strokeColor:o(y),strokeWidth:u,shapeRendering:d,onClick:g,id:y.id})}const pk=$.memo(hk);var gk=$.memo(fk);const mk=200,yk=150,vk=t=>!t.hidden,xk=t=>{const r={x:-t.transform[0]/t.transform[2],y:-t.transform[1]/t.transform[2],width:t.width/t.transform[2],height:t.height/t.transform[2]};return{viewBB:r,boundingRect:t.nodeLookup.size>0?og(To(t.nodeLookup,{filter:vk}),r):r,rfId:t.rfId,panZoom:t.panZoom,translateExtent:t.translateExtent,flowWidth:t.width,flowHeight:t.height,ariaLabelConfig:t.ariaLabelConfig}},op=(t,r)=>t.x===r.x&&t.y===r.y&&t.width===r.width&&t.height===r.height,wk=(t,r)=>op(t.viewBB,r.viewBB)&&op(t.boundingRect,r.boundingRect)&&t.rfId===r.rfId&&t.panZoom===r.panZoom&&t.translateExtent===r.translateExtent&&t.flowWidth===r.flowWidth&&t.flowHeight===r.flowHeight&&t.ariaLabelConfig===r.ariaLabelConfig,_k="react-flow__minimap-desc";function um({style:t,className:r,nodeStrokeColor:o,nodeColor:l,nodeClassName:a="",nodeBorderRadius:u=5,nodeStrokeWidth:d,nodeComponent:f,bgColor:g,maskColor:y,maskStrokeColor:m,maskStrokeWidth:x,position:v="bottom-right",onClick:_,onNodeClick:S,pannable:C=!1,zoomable:E=!1,ariaLabel:N,inversePan:I,zoomStep:k=1,offsetScale:j=5}){const R=He(),T=$.useRef(null),{boundingRect:B,viewBB:G,rfId:U,panZoom:ee,translateExtent:q,flowWidth:te,flowHeight:J,ariaLabelConfig:b}=Re(xk,wk),Y=(t==null?void 0:t.width)??mk,V=(t==null?void 0:t.height)??yk,W=B.width/Y,D=B.height/V,A=Math.max(W,D),H=A*Y,M=A*V,L=j*A,ne=B.x-(H-B.width)/2-L,re=B.y-(M-B.height)/2-L,ce=H+L*2,fe=M+L*2,de=`${_k}-${U}`,K=$.useRef(0),se=$.useRef();K.current=A,$.useEffect(()=>{if(T.current&&ee)return se.current=R1({domNode:T.current,panZoom:ee,getTransform:()=>R.getState().transform,getViewScale:()=>K.current}),()=>{var ye;(ye=se.current)==null||ye.destroy()}},[ee]),$.useEffect(()=>{var ye;(ye=se.current)==null||ye.update({translateExtent:q,width:te,height:J,inversePan:I,pannable:C,zoomStep:k,zoomable:E})},[C,E,I,k,q,te,J]);const pe=_?ye=>{var je;const[Ne,Pe]=((je=se.current)==null?void 0:je.pointer(ye))||[0,0];_(ye,{x:Ne,y:Pe})}:void 0,_e=S?$.useCallback((ye,Ne)=>{const Pe=R.getState().nodeLookup.get(Ne).internals.userNode;S(ye,Pe)},[]):void 0,me=N??b["minimap.ariaLabel"];return p.jsx(jl,{position:v,style:{...t,"--xy-minimap-background-color-props":typeof g=="string"?g:void 0,"--xy-minimap-mask-background-color-props":typeof y=="string"?y:void 0,"--xy-minimap-mask-stroke-color-props":typeof m=="string"?m:void 0,"--xy-minimap-mask-stroke-width-props":typeof x=="number"?x*A:void 0,"--xy-minimap-node-background-color-props":typeof l=="string"?l:void 0,"--xy-minimap-node-stroke-color-props":typeof o=="string"?o:void 0,"--xy-minimap-node-stroke-width-props":typeof d=="number"?d:void 0},className:et(["react-flow__minimap",r]),"data-testid":"rf__minimap",children:p.jsxs("svg",{width:Y,height:V,viewBox:`${ne} ${re} ${ce} ${fe}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":de,ref:T,onClick:pe,children:[me&&p.jsx("title",{id:de,children:me}),p.jsx(gk,{onClick:_e,nodeColor:l,nodeStrokeColor:o,nodeBorderRadius:u,nodeClassName:a,nodeStrokeWidth:d,nodeComponent:f}),p.jsx("path",{className:"react-flow__minimap-mask",d:`M${ne-L},${re-L}h${ce+L*2}v${fe+L*2}h${-ce-L*2}z + M${G.x},${G.y}h${G.width}v${G.height}h${-G.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}um.displayName="MiniMap";const Sk=$.memo(um),kk=t=>r=>t?`${Math.max(1/r.transform[2],1)}`:void 0,Ek={[ki.Line]:"right",[ki.Handle]:"bottom-right"};function Nk({nodeId:t,position:r,variant:o=ki.Handle,className:l,style:a=void 0,children:u,color:d,minWidth:f=10,minHeight:g=10,maxWidth:y=Number.MAX_VALUE,maxHeight:m=Number.MAX_VALUE,keepAspectRatio:x=!1,resizeDirection:v,autoScale:_=!0,shouldResize:S,onResizeStart:C,onResize:E,onResizeEnd:N}){const I=Og(),k=typeof t=="string"?t:I,j=He(),R=$.useRef(null),T=o===ki.Handle,B=Re($.useCallback(kk(T&&_),[T,_]),Xe),G=$.useRef(null),U=r??Ek[o];$.useEffect(()=>{if(!(!R.current||!k))return G.current||(G.current=Y1({domNode:R.current,nodeId:k,getStoreItems:()=>{const{nodeLookup:q,transform:te,snapGrid:J,snapToGrid:b,nodeOrigin:Y,domNode:V}=j.getState();return{nodeLookup:q,transform:te,snapGrid:J,snapToGrid:b,nodeOrigin:Y,paneDomNode:V}},onChange:(q,te)=>{const{triggerNodeChanges:J,nodeLookup:b,parentLookup:Y,nodeOrigin:V}=j.getState(),W=[],D={x:q.x,y:q.y},A=b.get(k);if(A&&A.expandParent&&A.parentId){const H=A.origin??V,M=q.width??A.measured.width??0,L=q.height??A.measured.height??0,ne={id:A.id,parentId:A.parentId,rect:{width:M,height:L,...ug({x:q.x??A.position.x,y:q.y??A.position.y},{width:M,height:L},A.parentId,b,H)}},re=gc([ne],b,Y,V);W.push(...re),D.x=q.x?Math.max(H[0]*M,q.x):void 0,D.y=q.y?Math.max(H[1]*L,q.y):void 0}if(D.x!==void 0&&D.y!==void 0){const H={id:k,type:"position",position:{...D}};W.push(H)}if(q.width!==void 0&&q.height!==void 0){const M={id:k,type:"dimensions",resizing:!0,setAttributes:v?v==="horizontal"?"width":"height":!0,dimensions:{width:q.width,height:q.height}};W.push(M)}for(const H of te){const M={...H,type:"position"};W.push(M)}J(W)},onEnd:({width:q,height:te})=>{const J={id:k,type:"dimensions",resizing:!1,dimensions:{width:q,height:te}};j.getState().triggerNodeChanges([J])}})),G.current.update({controlPosition:U,boundaries:{minWidth:f,minHeight:g,maxWidth:y,maxHeight:m},keepAspectRatio:x,resizeDirection:v,onResizeStart:C,onResize:E,onResizeEnd:N,shouldResize:S}),()=>{var q;(q=G.current)==null||q.destroy()}},[U,f,g,y,m,x,C,E,N,S]);const ee=U.split("-");return p.jsx("div",{className:et(["react-flow__resize-control","nodrag",...ee,o,l]),ref:R,style:{...a,scale:B,...d&&{[T?"backgroundColor":"borderColor"]:d}},children:u})}$.memo(Nk);const Ck={"arch.context":0,"django.app":0,"django.route":1,"django.url_name":1,"django.view":2,"django.viewset_action":2,"django.permission":2,"django.serializer":3,"django.form":3,"django.serializer_field":4,"django.service":4,"django.model":5,"django.field":6,"django.relation":6,"django.task":7,"django.receiver":7,"django.signal":7,"django.test":7,"django.migration_op":7,"django.admin":7,"openapi.path":8,"react.api_client":9,"react.query_key":10,"react.hook":10,"react.feature":10,"react.route":11,"react.page":11,"react.component":12,"react.form_schema":13,"react.test":13,"react.context":12};function Pl(t){return Ck[t]??8}function jk(t){const r=new Map;for(const l of t){const a=Pl(l.type),u=r.get(a)??[];u.push(l),r.set(a,u)}const o=new Map;for(const[l,a]of r)a.sort((u,d)=>u.name.localeCompare(d.name)),a.forEach((u,d)=>{o.set(u.id,{x:l*260,y:d*108})});return o}const cm=90,bk=new Set(["django.field","django.serializer_field","django.relation","django.test","react.test","django.url_name","django.throttle"]),sp={"arch.context":"#edf2f4","django.app":"#8d99ae","django.route":"#4cc9f0","django.view":"#4895ef","django.viewset_action":"#4361ee","django.permission":"#7b8cde","django.serializer":"#f4a261","django.form":"#e9c46a","django.serializer_field":"#e9c46a","django.service":"#90be6d","django.model":"#2a9d8f","django.field":"#8ac926","django.task":"#e76f51","django.receiver":"#e85d04","django.signal":"#f4a261","django.test":"#6c757d","django.admin":"#adb5bd","django.migration_op":"#9d4edd","openapi.path":"#00bbf9","react.api_client":"#ff6b6b","react.query_key":"#adb5bd","react.hook":"#7b2cbf","react.feature":"#9d4edd","react.route":"#c77dff","react.page":"#c77dff","react.component":"#9d4edd","react.form_schema":"#ffd166","react.test":"#6c757d"},Mk=Math.PI*(3-Math.sqrt(5)),dm=220,Pk=26,Ik={0:"context",1:"routes",2:"views",3:"serializers",4:"services",5:"models",6:"fields",7:"jobs / signals",8:"openapi",9:"api client",10:"hooks",11:"pages",12:"components",13:"forms / tests"};function fm(t){return t.startsWith("react.")?"react":t.startsWith("openapi.")?"stitch":t.startsWith("arch.")?"arch":"django"}function cE(t){return sp[t]?sp[t]:t.startsWith("react.")?"#9d4edd":t.startsWith("openapi.")?"#00bbf9":"#4a5568"}function Tk(t){return t>=cm?"3d":"2d"}function Rk(t){return t>=cm?"overview":"full"}function Lk(t,r,o=1){const l=new Set([t]);let a=new Set([t]);for(let u=0;uo.families.has(fm(f.type)));o.detail==="overview"&&(l=l.filter(f=>!bk.has(f.type)));const a=new Set(l.map(f=>f.id)),u=r.filter(f=>a.has(f.src)&&a.has(f.dst)),d=o.focusId?Lk(o.focusId,u,1):new Set;if(o.neighborhoodOnly&&o.focusId&&d.size){l=l.filter(g=>d.has(g.id));const f=new Set(l.map(g=>g.id));return{nodes:l,edges:u.filter(g=>f.has(g.src)&&f.has(g.dst)),neighborIds:d}}return{nodes:l,edges:u,neighborIds:d}}function dE(t){const r=new Map;for(const l of t){const a=Pl(l.type),u=r.get(a)??[];u.push(l),r.set(a,u)}const o=new Map;for(const[l,a]of r){a.sort((d,f)=>d.name.localeCompare(f.name));const u=l*dm;a.forEach((d,f)=>{if(a.length===1){o.set(d.id,{x:u,y:0,z:0});return}const g=Pk*Math.sqrt(f+1),y=f*Mk;o.set(d.id,{x:u,y:g*Math.cos(y),z:g*Math.sin(y)})})}return o}function fE(t){const r=new Map;for(const o of t){const l=Pl(o.type);r.set(l,(r.get(l)||0)+1)}return[...r.entries()].sort((o,l)=>o[0]-l[0]).map(([o,l])=>({layer:o,x:o*dm,count:l}))}const el=16,Ak=12,Dk=new Set(["django.route","react.route","react.page","django.task","django.migration_op","django.permission","django.throttle","django.admin","django.management_command","openapi.path"]),$k=new Set(["django.serializer","django.serializer_field","django.form","openapi.path","react.form_schema","django.route"]),lp={"arch.context":"Ownership boundary from loadpath.yml — the context this code belongs to.","django.app":"Django app package that owns models, views, and jobs.","django.route":"HTTP URL that publishes a view. A sink: this is where a change becomes a public request.","django.url_name":"Named URL used by reverse() / {% url %} lookups.","django.view":"Request handler (class-based view, function view, or ViewSet).","django.viewset_action":"One ViewSet action (list, create, retrieve, update, destroy).","django.permission":"Auth gate on a view — who is allowed to hit this path.","django.throttle":"Rate-limit class attached to a view.","django.serializer":"Request/response contract: which fields go in and come out.","django.form":"Django form that validates submitted input.","django.serializer_field":"One field on a serializer or form — the typed slot on the contract.","django.service":"Internal service or use-case. Work that is not itself an HTTP sink.","django.model":"ORM model. Schema and relations live here.","django.field":"Model column. Type, indexes, and relations are the contract of the table.","django.relation":"Model-to-model relation (FK / M2M / O2O).","django.task":"Celery or Dramatiq job. Once enqueued, this is a sink.","django.receiver":"Signal handler that runs after a model event.","django.signal":"Django signal that receivers subscribe to.","django.test":"Backend test that mentions symbols on this path.","django.admin":"Django admin class for a model.","django.migration_op":"Schema migration operation (CreateModel, AlterField, …).","django.management_command":"manage.py command — an operational sink.","openapi.path":"Generated OpenAPI operation. The typed HTTP contract between stacks.","react.api_client":"Frontend fetch or generated client call to an API path.","react.query_key":"React Query cache key. Invalidation and reads share this name.","react.hook":"Data hook wrapping query or mutation calls.","react.feature":"Frontend feature module (folder).","react.route":"Client-side route. A sink: this is a URL the user can open.","react.page":"Page or screen component rendered by a route.","react.component":"UI component.","react.form_schema":"Zod (or similar) schema — typed form inputs on the client.","react.test":"Frontend test covering a page, hook, or component.","react.context":"React context provider."},Ok={field_type:"Type",fields:"Fields",form_fields:"Form fields",permissions:"Permissions",throttles:"Throttles",authentication:"Authentication",pagination:"Pagination",filterset:"Filterset",bases:"Extends",on_delete:"on_delete",related_name:"related_name",unique:"Unique",db_index:"Indexed",relation:"Relation field",looks_idempotent_on_pk:"Idempotent on pk",broker:"Broker",route:"Route",url_name:"URL name",view:"View",include:"Includes",mounted_at:"Mounted at",full_path:"Full path",method:"Method",path:"Path",operation_id:"Operation",raw:"URL",kind:"Schema",exclude:"Excludes",queryset_in_serializer:"Queryset in serializer",get_queryset:"Custom get_queryset",get_serializer_class:"Dynamic serializer",dynamic:"Dynamic",fbv:"Function view",ninja:"Django Ninja",django_form:"Django form",mutation:"Mutation",has_error_boundary:"Error boundary",invalidation:"Cache invalidation",inferred:"Inferred stitch",generated:"Generated",shared:"Shared module",element:"Renders",model_name:"Model",field_name:"Field",op:"Operation",app:"App",feature:"Feature",from_view:"From view",mentions:"Mentions",nodeid:"Test id",task:"Task",to:"Related to"},ap=["field_type","method","path","operation_id","raw","route","mounted_at","full_path","url_name","view","element","fields","form_fields","exclude","kind","bases","permissions","authentication","throttles","pagination","filterset","on_delete","related_name","to","unique","db_index","relation","looks_idempotent_on_pk","broker","task","model_name","field_name","op","app","feature","from_view","include","fbv","ninja","django_form","mutation","has_error_boundary","invalidation","inferred","generated","shared","queryset_in_serializer","get_queryset","get_serializer_class","dynamic","mentions","nodeid"],up=new Set(["referenced","placeholder","booted","line","call","from","import","local","source","file","plain_handler","string_ref","pagination_sink","match","via","generated_client","django","react","superseded_by_generated","foreign_app","imported"]),Fk=new Set(["looks_idempotent_on_pk"]),Hk=new Set(["inferred","generated","mutation","fbv","ninja"]);function Bk(t){return lp[t]?lp[t]:t.startsWith("react.")?"A React node on the load path.":t.startsWith("django.")?"A Django node on the load path.":t.startsWith("openapi.")?"A stitch node between Django and React.":"A node on the architecture graph."}function Vk(t,r,o){const l=new Map(r.map(x=>[x.id,x])),a=[];Dk.has(t.type)&&a.push("sink"),$k.has(t.type)&&a.push("contract");const u=t.extra??{};u.inferred&&a.push("inferred"),u.generated&&a.push("generated"),u.mutation&&a.push("mutation"),u.fbv&&a.push("function view"),u.ninja&&a.push("ninja");const d=o.filter(x=>x.dst===t.id),f=o.filter(x=>x.src===t.id),g=d.slice(0,el).map(x=>cp(x,l,x.src)),y=f.slice(0,el).map(x=>cp(x,l,x.dst)),m=t.file_path?`${t.file_path}${t.start_line?`:${t.start_line}`:""}`:void 0;return{type:t.type,typeLabel:yo(yl(t.type)),layer:Ik[Pl(t.type)]??"other",purpose:Bk(t.type),name:t.name,qualifiedName:t.qualified_name,file:m,context:t.context,roles:a,facts:Uk(u).filter(x=>!(x.key==="app"&&x.value===t.context)),inputs:g,outputs:y,extraInputs:Math.max(0,d.length-el),extraOutputs:Math.max(0,f.length-el)}}function cp(t,r,o){const l=r.get(o),a=o.includes(":")?o.slice(o.indexOf(":")+1):o;return{id:o,name:(l==null?void 0:l.name)||a,type:(l==null?void 0:l.type)||"",typeLabel:l?yo(yl(l.type)):"",edgeType:t.type,edgeLabel:yo(t.type),inferred:t.confidence<.8}}function Uk(t){const r=[...ap.filter(a=>a in t),...Object.keys(t).filter(a=>!ap.includes(a)&&!up.has(a))],o=[],l=new Set;for(const a of r){if(l.has(a)||up.has(a)||Hk.has(a))continue;l.add(a);const u=Wk(a,t[a]);u!=null&&o.push({key:a,label:Ok[a]??yo(a),value:u})}return o}function Wk(t,r){if(r==null)return null;if(typeof r=="boolean")return!r&&!Fk.has(t)?null:r?"yes":"no";if(typeof r=="number")return String(r);if(typeof r=="string")return r.trim()||null;if(Array.isArray(r)){const o=r.map(u=>typeof u=="string"||typeof u=="number"?String(u):"").filter(Boolean);if(!o.length)return null;const l=o.slice(0,Ak),a=o.length-l.length;return a>0?`${l.join(", ")} +${a} more`:l.join(", ")}return null}const Yk=$.lazy(()=>m0(()=>import("./LayeredGraph3D-mUQO6wms.js"),[],import.meta.url).then(t=>({default:t.LayeredGraph3D}))),Xk={cheap:"var(--edge-cheap)",expensive:"var(--edge-expensive)",critical:"var(--edge-critical)"};function Gk({data:t,selected:r}){return p.jsxs("div",{className:r?"lp-node selected":"lp-node",children:[p.jsx(Ei,{type:"target",position:Se.Left,isConnectable:!1}),p.jsx("div",{className:"t",children:yl(t.type)}),p.jsx("div",{className:"n",title:t.name,children:t.name}),p.jsx(Ei,{type:"source",position:Se.Right,isConnectable:!1})]})}const Qk={load:Gk},dp=180,fp=56,Kk=new Set(["django","react","stitch","arch"]);function qk(t,r,o=null){const l=new Map(t.map(f=>[f.id,f])),a=jk(t),u=t.map(f=>({id:f.id,type:"load",position:a.get(f.id)??{x:0,y:0},data:{name:f.name,type:f.type,file:f.file_path},selected:o===f.id,sourcePosition:Se.Right,targetPosition:Se.Left,width:dp,height:fp,style:{width:dp,height:fp}})),d=r.filter(f=>l.has(f.src)&&l.has(f.dst)).map(f=>{const g=Xk[f.weight]||"var(--edge-cheap)";return{id:f.id,source:f.src,target:f.dst,type:"smoothstep",animated:f.weight==="critical",style:{stroke:g,strokeWidth:f.weight==="critical"?2.4:1.2,strokeDasharray:f.confidence<.8?"6 4":void 0},markerEnd:{type:Eo.ArrowClosed,width:14,height:14,color:g},label:f.type.replaceAll("_"," "),labelStyle:{fill:"var(--muted)",fontSize:10}}});return{rfNodes:u,rfEdges:d}}function hp({node:t,nodes:r,edges:o,onClose:l}){const a=Vk(t,r,o);return $.useEffect(()=>{const u=d=>{d.key==="Escape"&&l()};return window.addEventListener("keydown",u),()=>window.removeEventListener("keydown",u)},[l]),p.jsxs("aside",{className:"inspector","data-testid":"graph-inspector",children:[p.jsxs("div",{className:"inspector-head",children:[p.jsx("div",{className:"t",children:a.typeLabel}),p.jsx("div",{className:"inspector-roles",children:a.roles.map(u=>p.jsx("span",{className:"inspector-chip",children:u},u))}),p.jsx("button",{type:"button",className:"inspector-close","data-testid":"graph-inspector-close","aria-label":"Close inspector",onClick:l,children:"×"})]}),p.jsx("div",{className:"n",children:pi(a.name)}),p.jsx("p",{className:"inspector-purpose","data-testid":"graph-inspector-purpose",children:a.purpose}),a.context?p.jsx("div",{className:"muted",children:pi(a.context)}):null,a.file?p.jsx("div",{className:"file",children:pi(a.file)}):null,p.jsx("div",{className:"muted",children:pi(a.qualifiedName)}),p.jsxs("div",{className:"muted inspector-layer",children:["layer · ",a.layer]}),a.facts.length?p.jsx("dl",{className:"inspector-facts","data-testid":"graph-inspector-facts",children:a.facts.map(u=>p.jsxs("div",{className:"inspector-fact",children:[p.jsx("dt",{children:u.label}),p.jsx("dd",{children:pi(u.value)})]},u.key))}):null,p.jsx(pp,{title:"Inputs",testId:"graph-inspector-inputs",links:a.inputs,extra:a.extraInputs,empty:"Nothing in this graph points here."}),p.jsx(pp,{title:"Outputs",testId:"graph-inspector-outputs",links:a.outputs,extra:a.extraOutputs,empty:"This node does not point at anything in this graph."})]})}function pp({title:t,testId:r,links:o,extra:l,empty:a}){return p.jsxs("section",{className:"inspector-section","data-testid":r,children:[p.jsxs("h3",{children:[t,p.jsx("span",{className:"count",children:o.length+l})]}),o.length?p.jsx("ul",{children:o.map((u,d)=>p.jsxs("li",{children:[p.jsx("span",{className:"inspector-link-name",title:u.name,children:pi(u.name)}),p.jsxs("span",{className:"inspector-link-meta",children:[u.typeLabel?`${u.typeLabel} · `:"",u.edgeLabel,u.inferred?" · inferred":""]})]},`${u.edgeType}:${u.id}:${d}`))}):p.jsx("p",{className:"muted",children:a}),l?p.jsxs("p",{className:"muted",children:["+",l," more"]}):null]})}function $u({nodes:t,edges:r}){const[o,l]=$.useState(null),[a,u]=$.useState(null),[d,f]=$.useState(null),[g,y]=$.useState(new Set(Kk)),[m,x]=$.useState(!1),v=typeof window<"u"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches,_=a??Tk(t.length),S=d??Rk(t.length),C=$.useMemo(()=>zk(t,r,{detail:S,families:g,focusId:o,neighborhoodOnly:m&&_==="3d"}),[t,r,S,g,o,m,_]),E=$.useMemo(()=>new Map(C.nodes.map(U=>[U.id,U])),[C.nodes]),N=o?E.get(o)??null:null,{rfNodes:I,rfEdges:k}=$.useMemo(()=>{const U=qk(C.nodes,C.edges,o);return v&&(U.rfEdges=U.rfEdges.map(ee=>({...ee,animated:!1}))),U},[C.nodes,C.edges,o,v]);$.useEffect(()=>{o&&!E.has(o)&&l(null)},[E,o]);const j=(U,ee)=>{l(ee.id)},R=()=>{l(null),x(!1)},T=U=>{y(ee=>{const q=new Set(ee);if(q.has(U)){if(q.size===1)return ee;q.delete(U)}else q.add(U);return q})},B=$.useMemo(()=>{const U=new Set;for(const ee of t)U.add(fm(ee.type));return U},[t]),G=t.length-C.nodes.length;return p.jsxs("div",{className:"impact-graph",style:{flex:1,minHeight:0,position:"relative",display:"flex",flexDirection:"column"},children:[p.jsxs("div",{className:"graph-toolbar","data-testid":"graph-toolbar",children:[p.jsxs("div",{className:"seg","aria-label":"Graph projection",children:[p.jsx("button",{type:"button","data-testid":"graph-view-2d",className:_==="2d"?"active":"","aria-pressed":_==="2d",onClick:()=>u("2d"),children:"2D map"}),p.jsx("button",{type:"button","data-testid":"graph-view-3d",className:_==="3d"?"active":"","aria-pressed":_==="3d",onClick:()=>u("3d"),children:"3D layers"})]}),p.jsxs("div",{className:"seg","aria-label":"Graph detail",children:[p.jsx("button",{type:"button","data-testid":"graph-detail-overview",className:S==="overview"?"active":"","aria-pressed":S==="overview",onClick:()=>f("overview"),children:"Overview"}),p.jsx("button",{type:"button","data-testid":"graph-detail-full",className:S==="full"?"active":"","aria-pressed":S==="full",onClick:()=>f("full"),children:"Full"})]}),p.jsx("div",{className:"seg","aria-label":"Graph families",children:["django","stitch","react"].filter(U=>B.has(U)).map(U=>p.jsx("button",{type:"button","data-testid":`graph-family-${U}`,className:g.has(U)?"active":"","aria-pressed":g.has(U),onClick:()=>T(U),children:U},U))}),_==="3d"?p.jsx("button",{type:"button",className:m?"chip-btn active":"chip-btn","data-testid":"graph-neighborhood",disabled:!o,onClick:()=>x(U=>!U),children:m?"Neighborhood":"Focus neighbors"}):null,p.jsxs("span",{className:"muted graph-count",children:[C.nodes.length," nodes · ",C.edges.length," edges",G?` · ${G} hidden`:""]})]}),p.jsx("div",{className:"graph-stage",children:_==="3d"?p.jsxs("div",{className:"graph-3d","data-testid":"graph-3d",children:[p.jsx("p",{className:"graph-3d-hint",children:"Architecture layers are stacked in depth (Django → stitch → React). Drag to orbit, scroll to zoom, click a node to inspect it."}),p.jsx($.Suspense,{fallback:p.jsx("p",{className:"muted graph-3d-hint",children:"Loading 3D layers…"}),children:p.jsx(Yk,{nodes:C.nodes,edges:C.edges,selectedId:o,neighborIds:C.neighborIds,onSelect:U=>{l(U),U||x(!1)}})}),N?p.jsx(hp,{node:N,nodes:t,edges:r,onClose:R}):null]}):p.jsxs(sm,{children:[p.jsxs(KS,{nodes:I,edges:k,nodeTypes:Qk,fitView:!0,fitViewOptions:{padding:.2,maxZoom:1.15},minZoom:.25,nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,deleteKeyCode:null,onNodeClick:j,onPaneClick:R,proOptions:{hideAttribution:!1},"data-testid":"impact-graph",children:[p.jsx(tk,{}),p.jsx(Sk,{pannable:!0,zoomable:!0,ariaLabel:"Impact graph overview",nodeColor:"var(--muted)",nodeStrokeColor:"transparent",nodeStrokeWidth:0,maskColor:"rgba(0, 0, 0, 0.45)",maskStrokeColor:"var(--accent)",maskStrokeWidth:1.4,bgColor:"var(--graph-bg)",style:{width:184,height:128}}),p.jsx(ak,{})]}),N?p.jsx(hp,{node:N,nodes:t,edges:r,onClose:R}):null]})})]})}const gp=[{value:"HEAD",label:"HEAD",group:"preset"},{value:"HEAD~1",label:"HEAD~1",group:"preset"}],Zk=["preset","branch","tag","commit"];function Jk(t){var a;if(!(t!=null&&t.git))return[...gp];const r=((a=t.presets)!=null&&a.length?t.presets:gp.map(u=>u.value)).map(u=>({value:u,label:u,group:"preset"})),o=new Set(r.map(u=>u.value)),l=[...r];for(const u of t.branches||[])o.has(u.name)||(o.add(u.name),l.push({value:u.name,label:u.current?`${u.name} (current)`:u.name,detail:u.subject,group:"branch"}));for(const u of t.tags||[])o.has(u.name)||(o.add(u.name),l.push({value:u.name,label:u.name,detail:u.subject,group:"tag"}));for(const u of t.commits||[])o.has(u.sha)||(o.add(u.sha),l.push({value:u.sha,label:u.short,detail:u.subject,group:"commit"}));return l}function eE(t,r){const o=r.trim().toLowerCase();return o?t.filter(l=>l.value.toLowerCase().includes(o)||l.label.toLowerCase().includes(o)||(l.detail||"").toLowerCase().includes(o)):t}function tE(t){return Zk.map(r=>({group:r,items:t.filter(o=>o.group===r)})).filter(r=>r.items.length>0)}function nE(t){return t==="preset"?"Common":t==="branch"?"Branches":t==="tag"?"Tags":"Recent commits"}function mp({value:t,onChange:r,placeholder:o,testId:l,menuTestId:a,refs:u,onNeedRefs:d}){const f=$.useId(),g=$.useRef(null),[y,m]=$.useState(!1),[x,v]=$.useState(null),[_,S]=$.useState(0),C=$.useMemo(()=>{const j=Jk(u);return x===null?j:eE(j,x)},[u,x]),E=$.useMemo(()=>tE(C),[C]);$.useEffect(()=>{y&&d()},[y,d]),$.useEffect(()=>{S(0)},[x,y]);const N=()=>{m(!1),v(null)},I=j=>{r(j.value),N()},k=j=>{if(j.key==="ArrowDown"){if(j.preventDefault(),!y){m(!0);return}S(R=>Math.min(R+1,Math.max(C.length-1,0)))}else if(j.key==="ArrowUp"){if(j.preventDefault(),!y)return;S(R=>Math.max(R-1,0))}else if(j.key==="Enter"&&y){j.preventDefault();const R=C[_];R&&I(R)}else j.key==="Escape"&&y&&(j.preventDefault(),N())};return p.jsxs("div",{className:"combo",ref:g,onBlur:j=>{j.currentTarget.contains(j.relatedTarget)||N()},children:[p.jsxs("div",{className:"combo-row",children:[p.jsx("input",{"data-testid":l,value:t,placeholder:o,spellCheck:!1,role:"combobox","aria-expanded":y,"aria-controls":f,"aria-autocomplete":"list",onChange:j=>{r(j.target.value),y&&v(j.target.value)},onKeyDown:k}),p.jsx("button",{type:"button",className:"icon-btn combo-toggle","data-testid":`${l}-toggle`,"aria-label":"Show recent refs","aria-expanded":y,onMouseDown:j=>j.preventDefault(),onClick:()=>y?N():m(!0),children:p.jsx(h0,{})})]}),y?p.jsx("div",{className:"combo-menu",id:f,role:"listbox","data-testid":a,children:E.length===0?p.jsx("div",{className:"combo-empty muted",children:"No matching refs — the typed value is kept"}):E.map(j=>p.jsxs("div",{className:"combo-group",children:[p.jsx("div",{className:"combo-heading",children:nE(j.group)}),j.items.map(R=>{const T=C.indexOf(R);return p.jsxs("button",{type:"button",role:"option","aria-selected":T===_,className:T===_?"combo-option active":"combo-option","data-testid":`ref-option-${R.group}`,onMouseDown:B=>B.preventDefault(),onMouseEnter:()=>S(T),onClick:()=>I(R),children:[p.jsx("span",{className:"combo-label",children:R.label}),R.detail?p.jsx("span",{className:"combo-detail",children:R.detail}):null]},`${R.group}:${R.value}`)})]},j.group))}):null]})}function rE({initialPath:t,onSelect:r,onClose:o}){const[l,a]=$.useState(null),[u,d]=$.useState(t),[f,g]=$.useState(null),[y,m]=$.useState(""),[x,v]=$.useState(!1),_=$.useRef(null),S=$.useRef(0),C=async k=>{const j=S.current+1;S.current=j,v(!0);try{const R=await Ve.browse(k);if(S.current!==j)return;a(R),d(R.path),g(R.is_git?R.path:null),m("")}catch(R){if(S.current!==j)return;m(R instanceof Error?R.message:String(R))}finally{S.current===j&&v(!1)}};$.useEffect(()=>{var k,j;C(t),(k=_.current)==null||k.focus(),(j=_.current)==null||j.select()},[t]);const E=f||(l==null?void 0:l.path)||u,N=f&&f!==(l==null?void 0:l.path)?f.split(/[\\/]/).filter(Boolean).pop():l!=null&&l.is_git?"this repository":"this folder",I=k=>{k.key==="Escape"&&(k.preventDefault(),o())};return p.jsx("div",{className:"modal-backdrop","data-testid":"repo-explorer","data-overlay":"true",onClick:o,onKeyDown:I,children:p.jsxs("div",{className:"modal",role:"dialog","aria-modal":"true","aria-labelledby":"explorer-title",onClick:k=>k.stopPropagation(),children:[p.jsxs("div",{className:"modal-head",children:[p.jsxs("div",{children:[p.jsx("h2",{id:"explorer-title",children:"Select repository"}),p.jsx("p",{className:"muted",children:"Browse to a git root, or paste the full path."})]}),p.jsx("button",{type:"button",className:"btn ghost","data-testid":"explorer-cancel",onClick:o,children:"Cancel"})]}),p.jsxs("form",{className:"explorer-path",onSubmit:k=>{k.preventDefault(),C(u)},children:[p.jsx("input",{ref:_,"data-testid":"explorer-path",value:u,onChange:k=>d(k.target.value),spellCheck:!1,"aria-label":"Directory path"}),p.jsx("button",{type:"button",className:"btn",disabled:!(l!=null&&l.parent),onClick:()=>(l==null?void 0:l.parent)&&void C(l.parent),children:"Up"}),p.jsx("button",{type:"button",className:"btn",onClick:()=>l&&void C(l.home),children:"Home"}),p.jsx("button",{type:"submit",className:"btn",children:"Go"})]}),y?p.jsx("div",{className:"error",role:"alert",children:y}):null,p.jsx("div",{className:"explorer-list",role:"listbox","aria-label":"Folders","aria-busy":x,children:l!=null&&l.entries.length?l.entries.map(k=>{const j=f===k.path;return p.jsxs("button",{type:"button",role:"option","aria-selected":j,className:j?"explorer-row active":"explorer-row","data-testid":"explorer-entry","data-path":k.path,onClick:()=>g(k.path),onDoubleClick:()=>void C(k.path),children:[p.jsx(_p,{}),p.jsx("span",{className:"explorer-name",children:k.name}),k.is_git?p.jsx("span",{className:"chip git-badge",children:"git"}):null]},k.path)}):p.jsx("div",{className:"muted explorer-empty",children:x?"Loading…":"No folders here"})}),p.jsxs("div",{className:"modal-foot",children:[p.jsx("span",{className:"muted explorer-current",title:E,children:E}),p.jsxs("button",{type:"button",className:"btn primary","data-testid":"explorer-use",disabled:!E,onClick:()=>E&&r(E),children:["Use ",N]})]})]})})}const ml=[{id:"obsidian",label:"Obsidian",group:"dark"},{id:"nord",label:"Nord",group:"dark"},{id:"solarized-dark",label:"Solarized Dark",group:"dark"},{id:"forest",label:"Forest",group:"dark"},{id:"rose",label:"Rose Pine",group:"dark"},{id:"amber",label:"Midnight Amber",group:"dark"},{id:"volcano",label:"Volcano",group:"dark"},{id:"lavender",label:"Lavender",group:"dark"},{id:"neon-noir",label:"Neon Noir",group:"dark"},{id:"synthwave",label:"Synthwave",group:"dark"},{id:"phosphor",label:"Phosphor",group:"dark"},{id:"aurora",label:"Aurora",group:"dark"},{id:"biolume",label:"Biolume",group:"dark"},{id:"carbon",label:"Carbon",group:"dark"},{id:"paper",label:"Paper",group:"light"},{id:"solarized-light",label:"Solarized Light",group:"light"},{id:"seafoam",label:"Seafoam",group:"light"},{id:"high-contrast",label:"High Contrast",group:"light"},{id:"sakura",label:"Sakura",group:"light"},{id:"citrus",label:"Citrus",group:"light"},{id:"peach",label:"Peach Fuzz",group:"light"},{id:"candy",label:"Cotton Candy",group:"light"},{id:"sky",label:"Clear Sky",group:"light"},{id:"coral",label:"Coral Reef",group:"light"}],iE="obsidian",hm="loadpath.theme";function oE(t){return ml.some(r=>r.id===t)}function pm(){try{const t=localStorage.getItem(hm)||"";if(oE(t))return t}catch{}return iE}function sE(t){var r;return((r=ml.find(o=>o.id===t))==null?void 0:r.group)==="light"?"light":"dark"}function gm(t){document.documentElement.dataset.theme=t,document.documentElement.style.colorScheme=sE(t);try{localStorage.setItem(hm,t)}catch{}}const yp=[{id:"review",label:"Review",testId:"tab-review",shortcut:"1",icon:a0},{id:"architecture",label:"Architecture",testId:"tab-architecture",shortcut:"2",icon:u0},{id:"graph",label:"Impact graph",testId:"tab-graph",shortcut:"3",icon:c0},{id:"prs",label:"Pull requests",testId:"tab-prs",shortcut:"4",icon:d0},{id:"settings",label:"Settings",testId:"tab-settings",shortcut:"5",icon:f0}];function vp(t,r,o){let l;try{l=new URL(t)}catch{return}if(l.protocol!=="https:"||l.username||l.password)return;const a=l.hostname.toLowerCase();a!==r&&!a.endsWith(`.${r}`)||l.pathname.startsWith(o)&&window.open(l.toString(),"_blank","noopener,noreferrer")}function lE(){var lr,ar,ur,cr,dr,Tn,fr;const[t,r]=$.useState("review"),[o,l]=$.useState(localStorage.getItem("loadpath.repo")||""),[a,u]=$.useState(localStorage.getItem("loadpath.base")||"HEAD~1"),[d,f]=$.useState(localStorage.getItem("loadpath.head")||"HEAD"),[g,y]=$.useState(null),[m,x]=$.useState(null),[v,_]=$.useState([]),[S,C]=$.useState("review"),[E,N]=$.useState(""),[I,k]=$.useState(""),[j,R]=$.useState(""),[T,B]=$.useState({}),[G,U]=$.useState([]),[ee,q]=$.useState([]),[te,J]=$.useState(localStorage.getItem("loadpath.scmRepo")||""),[b,Y]=$.useState(localStorage.getItem("loadpath.provider")||"github"),[V,W]=$.useState(localStorage.getItem("loadpath.prNumber")||""),[D,A]=$.useState(""),[H,M]=$.useState(pm),[L,ne]=$.useState(!1),[re,ce]=$.useState(!1),[fe,de]=$.useState(null),[K,se]=$.useState(null),[pe,_e]=$.useState(!1),me=$.useRef(o);me.current=o;const ye=$.useRef(!1);ye.current=re;const Ne=$.useRef(""),Pe=F=>{M(F),gm(F)},je=$.useRef(""),Me=F=>{je.current=F,k(F)};$.useEffect(()=>{Ve.settings().then(B).catch(()=>{}).finally(()=>ne(!0)),Ve.repos().then(F=>_(F.repos)).catch(()=>{})},[]);const tt=()=>o.trim()?!0:(N("Point at a local repository path first."),!1);$.useEffect(()=>{if(t!=="architecture"||!o.trim())return;const F=o;let ae=!1;return Ve.architecture(F).then(be=>{!ae&&me.current===F&&x(be)}).catch(()=>{}),()=>{ae=!0}},[t,o]);const Ge=F=>{l(F),localStorage.setItem("loadpath.repo",F),F.trim()!==Ne.current&&(Ne.current="",de(null))},nt=$.useCallback(()=>{const F=me.current.trim();!F||Ne.current===F||(Ne.current=F,Ve.gitRefs(F).then(ae=>{me.current.trim()===F&&de(ae)}).catch(()=>{Ne.current===F&&(Ne.current="",de(null))}))},[]),Ke=(F,ae)=>{u(F),f(ae),localStorage.setItem("loadpath.base",F),localStorage.setItem("loadpath.head",ae)},bt=(F,ae,be)=>{Y(F),J(ae),localStorage.setItem("loadpath.provider",F),localStorage.setItem("loadpath.scmRepo",ae),be!==void 0&&(W(be),localStorage.setItem("loadpath.prNumber",be))},Dt=F=>F==="github"?!!T.github_token_set:!!T.bitbucket_token_set,ot=$.useCallback(async(F=b)=>{var ae;try{const be=await Ve.scmRepos(F);q(be.repos),(ae=be.user)!=null&&ae.login&&B($e=>({...$e,...F==="github"?{github_user:be.user.login}:{bitbucket_user:be.user.login}}))}catch{q([])}},[b]);$.useEffect(()=>{if(t!=="prs")return;let F=!1;return ot(b).catch(()=>{F||q([])}),()=>{F=!0}},[t,b,ot]),$.useEffect(()=>{if(!K)return;let F=!1,ae=0;const be=async()=>{try{const $e=await Ve.githubOAuthPoll(K.flow_id);if(F)return;if($e.status==="complete"){se(null);const Ae=await Ve.settings();B(Ae),R($e.user?`Signed in to GitHub as ${$e.user}`:"Signed in to GitHub"),ot("github");return}if($e.status==="pending"||$e.status==="slow_down"){ae=window.setTimeout(be,Math.max($e.interval||K.interval,5)*1e3);return}se(null),N($e.status==="denied"?"GitHub sign-in was denied.":"GitHub sign-in expired. Try again.")}catch($e){if(F)return;se(null),N($e instanceof Error?$e.message:String($e))}};return ae=window.setTimeout(be,Math.max(K.interval,5)*1e3),()=>{F=!0,window.clearTimeout(ae)}},[K,ot]),$.useEffect(()=>{if(!pe)return;let F=!1,ae=0;const be=Date.now(),$e=async()=>{try{const Ae=await Ve.oauthStatus();if(F)return;if(Ae.bitbucket.connected){_e(!1);const Rn=await Ve.settings();B(Rn),R(Ae.bitbucket.user?`Signed in to Bitbucket as ${Ae.bitbucket.user}`:"Signed in to Bitbucket"),ot("bitbucket");return}if(Date.now()-be>18e4){_e(!1),N("Bitbucket sign-in timed out. Finish in the browser, or try again.");return}ae=window.setTimeout($e,1500)}catch(Ae){if(F)return;_e(!1),N(Ae instanceof Error?Ae.message:String(Ae))}};return ae=window.setTimeout($e,1500),()=>{F=!0,window.clearTimeout(ae)}},[pe,ot]);const ut=async(F=o)=>{if(!F.trim())return null;const ae=await Ve.architecture(F);return me.current===F&&x(ae),ae},ct=async()=>{if(!je.current&&tt()){N(""),R(""),Me("Tracing load path…"),Ge(o),Ke(a,d);try{const F=await Ve.review(o,a,d,!0);y(F),C("review"),r("review"),await Ve.repos().then(ae=>_(ae.repos)).catch(()=>{}),await ut(o)}catch(F){N(F instanceof Error?F.message:String(F))}finally{Me("")}}},ht=async(F=!0)=>{if(!je.current&&tt()){N(""),R(""),Me(F?"Indexing…":"Full reindex…"),Ge(o);try{await Ve.index(o,F);const ae=await ut(o);await Ve.repos().then(be=>_(be.repos)).catch(()=>{}),ae!=null&&ae.indexed&&(C("architecture"),r("architecture"))}catch(ae){N(ae instanceof Error?ae.message:String(ae))}finally{Me("")}}},wt=async()=>{if(!je.current&&tt()){N(""),R(""),Me("Detecting layout…"),Ge(o);try{const F=await Ve.init(o);R(F.message),await Ve.repos().then(ae=>_(ae.repos)).catch(()=>{})}catch(F){N(F instanceof Error?F.message:String(F))}finally{Me("")}}},Mn=async()=>{if(g!=null&&g.markdown)try{await navigator.clipboard.writeText(g.markdown),R("Copied markdown brief")}catch(F){N(F instanceof Error?F.message:String(F))}},Ut=async()=>{if(!je.current){if(!(g!=null&&g.markdown)||!te||!V){N("Pick a pull request first (Pull requests tab), then post the brief.");return}Me("Posting Loadpath brief…");try{const F=await Ve.postComment(b,te,Number(V),g.markdown);R(F.updated?"Updated the Loadpath PR comment":"Posted the Loadpath PR comment")}catch(F){N(F instanceof Error?F.message:String(F))}finally{Me("")}}},gn=async()=>{if(!je.current){N(""),Me("Fetching pull requests…");try{const F=await Ve.prs(b,te);U(F.pull_requests);const ae=ee.find(be=>be.slug.toLowerCase()===te.trim().toLowerCase());ae!=null&&ae.local_path&&Ge(ae.local_path)}catch(F){N(F instanceof Error?F.message:String(F))}finally{Me("")}}},Ni=async()=>{N("");try{const F=await Ve.githubOAuthStart();se(F),vp(F.verification_uri_complete,"github.com","/login/device")}catch(F){N(F instanceof Error?F.message:String(F))}},$r=async()=>{N("");try{const F=await Ve.bitbucketOAuthStart();_e(!0),vp(F.authorize_url,"bitbucket.org","/site/oauth2/authorize")}catch(F){_e(!1),N(F instanceof Error?F.message:String(F))}},ir=async F=>{N("");try{B(await Ve.oauthDisconnect(F)),b===F&&q([]),R(`Disconnected ${F}`)}catch(ae){N(ae instanceof Error?ae.message:String(ae))}},Ci=async F=>{F.preventDefault();const ae=new FormData(F.currentTarget),be={github_token:String(ae.get("github_token")||""),github_oauth_client_id:String(ae.get("github_oauth_client_id")||""),bitbucket_token:String(ae.get("bitbucket_token")||""),bitbucket_username:String(ae.get("bitbucket_username")||""),bitbucket_oauth_client_id:String(ae.get("bitbucket_oauth_client_id")||""),bitbucket_oauth_client_secret:String(ae.get("bitbucket_oauth_client_secret")||""),ai_provider:String(ae.get("ai_provider")||"none"),ai_api_key:String(ae.get("ai_api_key")||""),ai_model:String(ae.get("ai_model")||""),ai_base_url:String(ae.get("ai_base_url")||"")},$e=v.length?{...be,workspaces:v.map(Ae=>({path:Ae.path,name:Ae.name}))}:be;try{B(await Ve.saveSettings($e)),R("Settings saved on this machine")}catch(Ae){N(Ae instanceof Error?Ae.message:String(Ae))}},or=async()=>{if(!(!g||je.current)){Me("Residual analysis…");try{const F=await Ve.residual(g);A(F.note)}catch(F){N(F instanceof Error?F.message:String(F))}finally{Me("")}}},Pn=$.useRef(ct);Pn.current=ct;const mn=$.useRef(t);mn.current=t,$.useEffect(()=>{const F=ae=>{if(ye.current){ae.key==="Escape"&&(ae.preventDefault(),ce(!1));return}const be=ae.target;if(be&&(be.tagName==="INPUT"||be.tagName==="TEXTAREA"||be.tagName==="SELECT"||be.isContentEditable)){ae.key==="Escape"&&be.blur();return}if(ae.key==="Escape"){N(""),R("");return}const $e=yp.find(Ae=>Ae.shortcut===ae.key);if($e&&!ae.metaKey&&!ae.ctrlKey&&!ae.altKey&&r($e.id),(ae.metaKey||ae.ctrlKey)&&ae.key==="Enter"){if(mn.current==="settings"||mn.current==="prs"||je.current)return;ae.preventDefault(),Pn.current()}};return window.addEventListener("keydown",F),()=>window.removeEventListener("keydown",F)},[]);const In=$.useMemo(()=>S==="architecture"?(m==null?void 0:m.nodes)??[]:(g==null?void 0:g.nodes)??[],[S,m,g]),sr=$.useMemo(()=>S==="architecture"?(m==null?void 0:m.edges)??[]:(g==null?void 0:g.edges)??[],[S,m,g]),on=g!=null&&g.index?`${g.index.counts.nodes} nodes · ${g.index.counts.edges} edges`:m!=null&&m.indexed?`${m.counts.nodes} nodes · ${m.counts.edges} edges`:"Not indexed",sn=((g==null?void 0:g.findings)||[]).filter(F=>!F.waived);return p.jsxs("div",{className:"app",children:[p.jsx("a",{className:"skip",href:"#main",children:"Skip to content"}),p.jsxs("nav",{className:"rail","data-testid":"rail","aria-label":"Primary",children:[p.jsxs("div",{className:"brand",children:[p.jsx("div",{className:"brand-mark",children:"Loadpath"}),p.jsx("div",{className:"brand-sub",children:"Load-path review"})]}),yp.map(F=>{const ae=F.icon,be=t===F.id;return p.jsxs("button",{type:"button","data-testid":F.testId,className:be?"nav-item active":"nav-item","aria-current":be?"page":void 0,"aria-label":F.label,onClick:()=>r(F.id),children:[p.jsx(ae,{}),p.jsx("span",{children:F.label})]},F.id)}),p.jsxs("div",{className:"theme-pick",children:[p.jsx("label",{htmlFor:"theme-select",children:"Theme"}),p.jsx("select",{id:"theme-select","data-testid":"theme-select",value:H,onChange:F=>Pe(F.target.value),children:["dark","light"].map(F=>p.jsx("optgroup",{label:F==="dark"?"Dark":"Light",children:ml.filter(ae=>ae.group===F).map(ae=>p.jsx("option",{value:ae.id,children:ae.label},ae.id))},F))})]}),p.jsxs("div",{className:"rail-foot",children:[p.jsx("div",{className:"muted",role:"status",children:I||on}),p.jsxs("div",{className:"kbd-hint",children:[p.jsx("kbd",{children:"1"}),"–",p.jsx("kbd",{children:"5"})," tabs · ",p.jsx("kbd",{children:"Ctrl"}),"+",p.jsx("kbd",{children:"Enter"})," review"]})]})]}),p.jsxs("div",{className:"main",id:"main",children:[I?p.jsxs("div",{className:"progress",role:"status","aria-live":"polite","aria-busy":"true",children:[p.jsx("i",{}),p.jsx("span",{className:"sr-only",children:I})]}):null,p.jsxs("header",{className:"topbar","data-testid":"topbar",children:[v.length>0?p.jsxs("label",{className:"field workspace",children:[p.jsx("span",{children:"Workspace"}),p.jsxs("select",{"data-testid":"workspace-select",value:v.some(F=>F.path===o)?o:"",onChange:F=>{F.target.value&&Ge(F.target.value)},children:[p.jsx("option",{value:"",children:"Indexed repos…"}),v.map(F=>p.jsxs("option",{value:F.path,children:[F.name,F.indexed?` (${F.counts.nodes})`:""]},F.path))]})]}):null,p.jsxs("label",{className:"field path",children:[p.jsx("span",{children:"Repository"}),p.jsxs("div",{className:"path-row",children:[p.jsx("input",{"data-testid":"repo-path",placeholder:"Local monorepo path",value:o,onChange:F=>{const ae=F.target.value;l(ae),ae.trim()!==Ne.current&&(Ne.current="",de(null))},spellCheck:!1}),p.jsx("button",{type:"button",className:"icon-btn","data-testid":"btn-browse-repo","aria-label":"Browse for a local repository",onClick:()=>ce(!0),children:p.jsx(_p,{})})]})]}),p.jsxs("label",{className:"field ref",children:[p.jsx("span",{children:"Base"}),p.jsx(mp,{testId:"base-ref",menuTestId:"base-ref-menu",value:a,onChange:F=>Ke(F,d),placeholder:"base",refs:fe,onNeedRefs:nt})]}),p.jsxs("label",{className:"field ref",children:[p.jsx("span",{children:"Head"}),p.jsx(mp,{testId:"head-ref",menuTestId:"head-ref-menu",value:d,onChange:F=>Ke(a,F),placeholder:"head",refs:fe,onNeedRefs:nt})]}),p.jsxs("div",{className:"topbar-actions",children:[p.jsx("button",{type:"button","data-testid":"btn-init",disabled:!!I,onClick:wt,children:"Draft config"}),p.jsx("button",{type:"button","data-testid":"btn-index",disabled:!!I,onClick:()=>ht(!0),children:"Index"}),p.jsx("button",{type:"button","data-testid":"btn-review",className:"btn primary",disabled:!!I,onClick:ct,children:"Review"})]})]}),p.jsxs("div",{className:"alerts",children:[E?p.jsxs("div",{className:"error","data-testid":"error",role:"alert",children:[p.jsx("span",{children:E}),p.jsx("button",{type:"button",className:"dismiss",onClick:()=>N(""),"aria-label":"Dismiss error",children:"×"})]}):null,j?p.jsxs("div",{className:"banner","data-testid":"status-note",children:[p.jsx("span",{children:j}),p.jsx("button",{type:"button",className:"dismiss",onClick:()=>R(""),"aria-label":"Dismiss",children:"×"})]}):null,((lr=g==null?void 0:g.index)!=null&&lr.stale||m!=null&&m.stale)&&(t==="review"||t==="architecture")?p.jsx("div",{className:"banner stale","data-testid":"index-stale",children:"Index is stale — files changed since the last extract. Index again before trusting this walk."}):null,((ar=g==null?void 0:g.index)==null?void 0:ar.django_boot)==="failed"||(m==null?void 0:m.django_boot)==="failed"?p.jsx("div",{className:"banner warn","data-testid":"django-boot-failed",children:((ur=g==null?void 0:g.index)==null?void 0:ur.django_boot_detail)||(m==null?void 0:m.django_boot_detail)||"django.setup() failed"}):null,(cr=g==null?void 0:g.workspace)!=null&&cr.dirty_overlaps_review&&t==="review"?p.jsxs("div",{className:"banner warn","data-testid":"dirty-tree",children:["Uncommitted files overlap this review: ",(g.workspace.dirty_overlap||[]).slice(0,6).join(", ")]}):null]}),p.jsxs("div",{className:"stage",children:[t==="review"&&p.jsxs("div",{className:"content","data-testid":"review-layout",children:[p.jsx("aside",{className:"brief","data-testid":"brief",children:g?p.jsx(aE,{review:g,findings:sn,aiNote:D,busy:!!I,onAskAi:or,onCopy:Mn,onPost:Ut}):p.jsxs("div",{className:"empty","data-testid":"review-empty",children:[p.jsx("h2",{children:"Trace the force of this diff"}),p.jsx("p",{children:"The graph is the architecture. The brief is where this change travels — not a hunk list."}),p.jsxs("ol",{children:[p.jsx("li",{children:"Point at a Django + React monorepo, or pick an indexed workspace."}),p.jsxs("li",{children:["Index it. Missing ",p.jsx("code",{children:"loadpath.yml"})," is drafted from ",p.jsx("code",{children:"manage.py"})," and"," ",p.jsx("code",{children:"src/features"}),"."]}),p.jsx("li",{children:"Review a git range, or open a pull request so base/head become a three-dot merge-base."})]})]})}),p.jsx("div",{className:"graph-wrap","data-testid":"review-graph",children:g?p.jsx($u,{nodes:g.nodes,edges:g.edges}):null})]}),t==="architecture"&&p.jsxs("div",{className:"content","data-testid":"architecture-panel",children:[p.jsx("aside",{className:"brief","data-testid":"architecture-brief",children:m!=null&&m.indexed?p.jsx(uE,{architecture:m,busy:!!I,onReindex:()=>ht(!1),onReview:ct}):p.jsx("p",{className:"muted","data-testid":"architecture-empty",children:"Index this repo to build the architecture graph. Review then walks that same graph for a git range — it does not start from a hunk list."})}),p.jsx("div",{className:"graph-wrap","data-testid":"architecture-graph",children:m!=null&&m.indexed?p.jsx($u,{nodes:m.nodes,edges:m.edges}):null})]}),t==="graph"&&p.jsxs("div",{className:"graph-wrap","data-testid":"graph-full",style:{height:"100%"},children:[p.jsxs("div",{className:"graph-modes",children:[p.jsxs("div",{className:"seg","aria-label":"Graph scope",children:[p.jsx("button",{type:"button","aria-pressed":S==="review","data-testid":"graph-mode-review",className:S==="review"?"active":"",onClick:()=>C("review"),children:"This review"}),p.jsx("button",{type:"button","aria-pressed":S==="architecture","data-testid":"graph-mode-architecture",className:S==="architecture"?"active":"",onClick:()=>C("architecture"),children:"Indexed architecture"})]}),p.jsxs("div",{className:"legend","aria-hidden":"true",children:[p.jsxs("span",{children:[p.jsx("i",{})," cheap"]}),p.jsxs("span",{children:[p.jsx("i",{className:"exp"})," expensive"]}),p.jsxs("span",{children:[p.jsx("i",{className:"crit"})," critical"]}),p.jsxs("span",{children:[p.jsx("i",{className:"dash"})," inferred"]})]})]}),In.length?p.jsx($u,{nodes:In,edges:sr}):p.jsx("p",{className:"empty","data-testid":"graph-empty",children:"Index the repo or run a review first. Click a node to inspect it."})]}),t==="prs"&&p.jsxs("div",{className:"pr-list","data-testid":"pr-list",children:[p.jsxs("div",{className:"pr-toolbar",children:[p.jsxs("label",{className:"field provider",children:[p.jsx("span",{children:"Provider"}),p.jsxs("select",{"data-testid":"pr-provider",value:b,onChange:F=>bt(F.target.value,te,V),children:[p.jsx("option",{value:"github",children:"GitHub"}),p.jsx("option",{value:"bitbucket",children:"Bitbucket"})]})]}),p.jsxs("label",{className:"field",children:[p.jsx("span",{children:"Repository"}),p.jsx("input",{"data-testid":"pr-repo",placeholder:ee.length?"Search your repos":"owner/repo",value:te,onChange:F=>bt(b,F.target.value,V),list:"scm-repos",spellCheck:!1}),p.jsx("datalist",{id:"scm-repos",children:ee.map(F=>p.jsxs("option",{value:F.slug,children:[F.private?"private":"public",F.local_path?" · local":""]},F.slug))})]}),p.jsx("button",{type:"button","data-testid":"btn-refresh-repos",className:"btn",disabled:!!I||!Dt(b),onClick:()=>{ot(b)},children:"My repos"}),p.jsx("button",{type:"button","data-testid":"btn-list-prs",className:"btn",disabled:!!I,onClick:gn,children:"List PRs"})]}),ee.length>0?p.jsxs("p",{className:"muted scm-count","data-testid":"scm-repo-count",children:[ee.length," ",b," repositor",ee.length===1?"y":"ies",b==="github"&&T.github_user?` · @${String(T.github_user)}`:"",b==="bitbucket"&&T.bitbucket_user?` · ${String(T.bitbucket_user)}`:""]}):null,G.length===0?p.jsxs("div",{className:"empty","data-testid":"pr-empty",children:[p.jsx("h2",{children:"No pull requests loaded"}),p.jsx("p",{children:"Sign in under Settings (or paste a token), load your repositories, then list open PRs. Reviewing a PR fills base and head from its SHAs."})]}):G.map(F=>p.jsxs("article",{className:"pr","data-testid":`pr-${F.number}`,children:[p.jsxs("h3",{children:["#",F.number," ",F.title]}),p.jsxs("div",{className:"pr-meta muted",children:[p.jsx("span",{className:`chip ${F.draft?"":"open"}`,children:F.draft?"draft":F.state}),p.jsx("span",{children:F.author}),p.jsxs("span",{children:[F.source_branch," → ",F.target_branch]})]}),p.jsxs("div",{className:"pr-actions",children:[p.jsxs("a",{href:F.url,target:"_blank",rel:"noreferrer",children:["Open on ",F.provider]}),p.jsx("button",{type:"button",className:"btn primary","data-testid":`pr-review-${F.number}`,onClick:()=>{Ke(F.base_sha||F.target_branch,F.head_sha||F.source_branch),bt(F.provider,F.repo,String(F.number));const ae=ee.find(be=>be.slug.toLowerCase()===F.repo.toLowerCase());ae!=null&&ae.local_path&&Ge(ae.local_path),r("review")},children:"Review this range"})]})]},`${F.provider}-${F.number}`))]}),t==="settings"&&L&&p.jsxs("form",{className:"settings","data-testid":"settings-form",onSubmit:Ci,children:[p.jsxs("div",{children:[p.jsx("h1",{children:"Settings"}),p.jsx("p",{className:"muted",children:"Tokens stay on this machine in ~/.loadpath/settings.json. AI runs only on residual uncertainty the graph could not close."})]}),p.jsxs("section",{className:"settings-card",children:[p.jsx("h2",{children:"Appearance"}),p.jsx("p",{className:"muted",children:"Local to this browser. High contrast is a first-class theme, not an afterthought."}),p.jsx("div",{className:"theme-grid","data-testid":"theme-grid",children:ml.map(F=>p.jsxs("button",{type:"button","data-theme":F.id,className:H===F.id?"theme-swatch active":"theme-swatch","data-testid":`theme-${F.id}`,onClick:()=>Pe(F.id),children:[p.jsx("div",{className:"swatch-bar","aria-hidden":"true"}),p.jsx("div",{className:"name",children:F.label}),p.jsx("div",{className:"group",children:F.group})]},F.id))})]}),p.jsxs("section",{className:"settings-card",children:[p.jsx("h2",{children:"Source control"}),p.jsx("p",{className:"muted",children:"Sign in with OAuth to list every repository the account can access. Tokens stay in ~/.loadpath/settings.json. A classic PAT still works if you prefer not to register an OAuth app."}),p.jsxs("div",{className:"scm-login","data-testid":"scm-github",children:[p.jsxs("div",{children:[p.jsx("strong",{children:"GitHub"}),p.jsx("p",{className:"muted",children:T.github_token_set?T.github_user?`Signed in as @${String(T.github_user)}`:"Token saved on this machine":"Not connected"})]}),p.jsx("div",{className:"btn-row",children:T.github_token_set?p.jsx("button",{type:"button",className:"btn","data-testid":"btn-github-disconnect",onClick:()=>void ir("github"),children:"Disconnect"}):p.jsx("button",{type:"button",className:"btn primary","data-testid":"btn-github-login",disabled:!!K||!T.github_oauth_ready,onClick:()=>void Ni(),children:K?"Waiting for GitHub…":"Sign in with GitHub"})})]}),K?p.jsxs("p",{className:"oauth-code","data-testid":"github-user-code",children:["Enter ",p.jsx("code",{children:K.user_code})," at GitHub if the browser did not fill it in."]}):null,T.github_oauth_ready?null:p.jsx("p",{className:"muted",children:"Sign-in needs a GitHub OAuth App with Device Flow enabled. Set LOADPATH_GITHUB_CLIENT_ID or paste the client ID below."}),p.jsx("label",{htmlFor:"github_oauth_client_id",children:"GitHub OAuth client ID"}),p.jsx("input",{id:"github_oauth_client_id",name:"github_oauth_client_id","data-testid":"github-oauth-client-id",placeholder:"Ov23…",defaultValue:String(T.github_oauth_client_id||""),autoComplete:"off"}),p.jsx("label",{htmlFor:"github_token",children:"GitHub token (optional PAT)"}),p.jsx("input",{id:"github_token",name:"github_token",type:"password",placeholder:"ghp_…",autoComplete:"off"}),p.jsxs("div",{className:"scm-login","data-testid":"scm-bitbucket",children:[p.jsxs("div",{children:[p.jsx("strong",{children:"Bitbucket"}),p.jsx("p",{className:"muted",children:T.bitbucket_token_set?T.bitbucket_user?`Signed in as ${String(T.bitbucket_user)}`:"Token saved on this machine":"Not connected"})]}),p.jsx("div",{className:"btn-row",children:T.bitbucket_token_set?p.jsx("button",{type:"button",className:"btn","data-testid":"btn-bitbucket-disconnect",onClick:()=>void ir("bitbucket"),children:"Disconnect"}):p.jsx("button",{type:"button",className:"btn primary","data-testid":"btn-bitbucket-login",disabled:pe||!T.bitbucket_oauth_ready,onClick:()=>void $r(),children:pe?"Waiting for Bitbucket…":"Sign in with Bitbucket"})})]}),T.bitbucket_oauth_ready?null:p.jsxs("p",{className:"muted",children:["Sign-in needs a Bitbucket OAuth consumer (key + secret). Callback URL:"," ",p.jsx("code",{children:"/api/oauth/bitbucket/callback"})," on this app origin."]}),p.jsx("label",{htmlFor:"bitbucket_oauth_client_id",children:"Bitbucket OAuth key"}),p.jsx("input",{id:"bitbucket_oauth_client_id",name:"bitbucket_oauth_client_id","data-testid":"bitbucket-oauth-client-id",defaultValue:String(T.bitbucket_oauth_client_id||""),autoComplete:"off"}),p.jsx("label",{htmlFor:"bitbucket_oauth_client_secret",children:"Bitbucket OAuth secret"}),p.jsx("input",{id:"bitbucket_oauth_client_secret",name:"bitbucket_oauth_client_secret",type:"password",autoComplete:"off"}),p.jsx("label",{htmlFor:"bitbucket_token",children:"Bitbucket token (optional app password)"}),p.jsx("input",{id:"bitbucket_token",name:"bitbucket_token",type:"password",autoComplete:"off"}),p.jsx("label",{htmlFor:"bitbucket_username",children:"Bitbucket username (app passwords)"}),p.jsx("input",{id:"bitbucket_username",name:"bitbucket_username",defaultValue:String(T.bitbucket_username||"")})]}),p.jsxs("section",{className:"settings-card",children:[p.jsx("h2",{children:"Residual AI"}),p.jsx("label",{htmlFor:"ai_provider",children:"Provider"}),p.jsxs("select",{id:"ai_provider",name:"ai_provider",defaultValue:String(((dr=T.ai)==null?void 0:dr.provider)||"none"),children:[p.jsx("option",{value:"none",children:"none (graph only)"}),p.jsx("option",{value:"anthropic",children:"Anthropic"}),p.jsx("option",{value:"openai",children:"OpenAI"}),p.jsx("option",{value:"grok",children:"Grok / xAI"}),p.jsx("option",{value:"deepseek",children:"DeepSeek"}),p.jsx("option",{value:"cursor",children:"Cursor-compatible (OpenAI protocol)"}),p.jsx("option",{value:"ollama",children:"Ollama local"})]}),p.jsx("label",{htmlFor:"ai_api_key",children:"API key"}),p.jsx("input",{id:"ai_api_key",name:"ai_api_key",type:"password",autoComplete:"off"}),p.jsx("label",{htmlFor:"ai_model",children:"Model"}),p.jsx("input",{id:"ai_model",name:"ai_model","data-testid":"ai-model",placeholder:"optional override",defaultValue:String(((Tn=T.ai)==null?void 0:Tn.model)||"")}),p.jsx("label",{htmlFor:"ai_base_url",children:"Base URL"}),p.jsx("input",{id:"ai_base_url",name:"ai_base_url","data-testid":"ai-base-url",placeholder:"optional, OpenAI-compatible",defaultValue:String(((fr=T.ai)==null?void 0:fr.base_url)||"")}),p.jsx("button",{className:"btn primary",type:"submit","data-testid":"btn-save-settings",children:"Save"})]})]})]})]}),re?p.jsx(rE,{initialPath:o,onClose:()=>ce(!1),onSelect:F=>{Ge(F),ce(!1)}}):null]})}function aE({review:t,findings:r,aiNote:o,busy:l,onAskAi:a,onCopy:u,onPost:d}){var g,y,m,x,v,_,S,C;const f=[...new Set(t.confidence.reasons||[])];return p.jsxs(p.Fragment,{children:[p.jsxs("div",{className:`merge-box ${t.confidence.level}`,children:[p.jsxs("div",{className:`level ${t.confidence.level}`,children:[t.confidence.level.toUpperCase()," — ",t.title]}),f.length?p.jsx("ul",{className:"reasons",children:f.map(E=>p.jsx("li",{children:E},E))}):null,t.low_risk?p.jsx("span",{className:"chip",children:"low-risk"}):null,t.change_kinds.map(E=>p.jsx("span",{className:"chip",children:yo(E)},E))]}),p.jsxs("div",{className:"metrics",children:[p.jsxs("div",{className:"metric",children:[p.jsxs("div",{className:"n",children:[t.confidence.covered_sinks,"/",t.confidence.sinks]}),p.jsx("div",{className:"l",children:"Sinks tested"})]}),p.jsxs("div",{className:"metric",children:[p.jsx("div",{className:"n",children:r.length}),p.jsx("div",{className:"l",children:"Findings"})]}),p.jsxs("div",{className:"metric",children:[p.jsx("div",{className:"n",children:t.residuals.length}),p.jsx("div",{className:"l",children:"Residuals"})]})]}),p.jsx("pre",{className:"headline",children:t.headline}),t.index?p.jsxs("details",{className:"section",open:!0,children:[p.jsxs("summary",{children:["Index ",p.jsx("span",{className:"count",children:t.index.counts.nodes})]}),p.jsxs("div",{className:"muted",children:["Walked ",t.index.counts.nodes," nodes / ",t.index.counts.edges," edges",t.index.reindex_skipped?" from an unchanged index":t.index.reindexed?" after an incremental refresh":" from the existing index",t.index.django_boot&&t.index.django_boot!=="off"?` · Django boot ${t.index.django_boot}`:"",(g=t.workspace)!=null&&g.three_dot?" · three-dot range":""]})]}):null,p.jsxs("details",{className:"section",open:!0,children:[p.jsxs("summary",{children:["Read this ",p.jsx("span",{className:"count",children:t.read_order.length})]}),t.read_order.map((E,N)=>p.jsxs("div",{className:"read-item",children:[p.jsxs("span",{className:"file",children:[N+1,". ",E.path]}),p.jsx("div",{className:"why",children:E.why})]},E.path))]}),p.jsxs("details",{className:"section",children:[p.jsxs("summary",{children:["Clusters ",p.jsx("span",{className:"count",children:t.clusters.length})]}),t.clusters.map(E=>p.jsxs("div",{className:"muted",children:[p.jsx("strong",{children:E.title})," — ",E.files.join(", ")]},E.id))]}),p.jsxs("details",{className:"section",open:!0,children:[p.jsxs("summary",{children:["Architecture ",p.jsx("span",{className:"count",children:r.length})]}),r.length===0?p.jsx("div",{className:"muted",children:t.architecture_note}):r.map(E=>p.jsxs("div",{className:"finding",children:[p.jsx("span",{className:`chip ${E.severity}`,children:E.severity}),E.message]},E.rule+E.message))]}),p.jsx(mm,{cards:t.deepening}),p.jsxs("details",{className:"section",open:!0,children:[p.jsxs("summary",{children:["Residual ",p.jsx("span",{className:"count",children:t.residuals.length})]}),p.jsx("p",{className:"muted",children:"AI is only used here, on what the graph could not close."}),t.residuals.map(E=>p.jsx("div",{className:"residual muted",children:E},E))]}),(m=(y=t.evolution)==null?void 0:y.notes)!=null&&m.length||(v=(x=t.evolution)==null?void 0:x.hotspots)!=null&&v.some(E=>E.commits)?p.jsxs("details",{className:"section",children:[p.jsx("summary",{children:"Churn & coupling"}),(((_=t.evolution)==null?void 0:_.notes)||[]).map(E=>p.jsx("div",{className:"muted",children:E},E)),(((S=t.evolution)==null?void 0:S.hotspots)||[]).filter(E=>E.commits).slice(0,6).map(E=>p.jsxs("div",{className:"muted",children:[p.jsx("span",{className:"file",children:E.path})," — ",E.commits," commits, bus factor ",E.bus_factor]},E.path))]}):null,p.jsxs("div",{className:"btn-row",children:[p.jsx("button",{type:"button",className:"btn",disabled:l,onClick:a,children:"Ask configured model"}),p.jsx("button",{type:"button",className:"btn","data-testid":"btn-copy-markdown",onClick:u,children:"Copy markdown"}),p.jsx("button",{type:"button",className:"btn","data-testid":"btn-post-comment",onClick:d,children:"Post to PR"})]}),o?p.jsx("pre",{className:"headline",children:o}):null,p.jsx("div",{className:"kicker",children:"Reviewers"}),p.jsx("div",{className:"muted",children:t.suggested_reviewers.join(", ")||"—"}),(C=t.knowledge_owners)!=null&&C.length?p.jsxs("div",{className:"muted",children:["Knowledge: ",t.knowledge_owners.join(", ")]}):null]})}function uE({architecture:t,busy:r,onReindex:o,onReview:l}){const a=t.findings.filter(u=>!u.waived);return p.jsxs(p.Fragment,{children:[p.jsxs("div",{className:"merge-box high",children:[p.jsxs("div",{className:"level high",children:["INDEXED — ",t.counts.nodes," nodes"]}),p.jsxs("div",{className:"muted",style:{marginTop:8},children:[t.indexed_at?`Last index ${l0(t.indexed_at)}`:"Indexed",t.incremental?" · incremental":" · full",t.stale?" · stale":"",t.django_boot&&t.django_boot!=="off"?` · Django boot ${t.django_boot}`:""]}),p.jsxs("span",{className:"chip",children:[t.counts.edges," edges"]}),t.has_config?p.jsx("span",{className:"chip",children:"loadpath.yml"}):null]}),p.jsxs("details",{className:"section",open:!0,children:[p.jsx("summary",{children:"Bounded contexts"}),Object.values(t.contexts).map(u=>p.jsxs("div",{className:"muted",children:[p.jsx("strong",{children:u.name})," — ",(u.django_apps||[]).join(", ")||"no apps"," ·"," ",(u.owners||[]).join(", ")||"unowned"]},u.name))]}),p.jsxs("details",{className:"section",children:[p.jsxs("summary",{children:["Rules ",p.jsx("span",{className:"count",children:(t.rules||[]).length})]}),(t.rules||[]).map(u=>p.jsx("div",{className:"muted",children:u},u))]}),p.jsxs("details",{className:"section",open:!0,children:[p.jsxs("summary",{children:["Findings ",p.jsx("span",{className:"count",children:a.length})]}),a.length===0?p.jsx("div",{className:"muted",children:"No architecture rule hits on the full graph."}):a.map(u=>p.jsxs("div",{className:"finding",children:[p.jsx("span",{className:`chip ${u.severity}`,children:u.severity}),u.message]},u.rule+u.message))]}),p.jsx(mm,{cards:t.deepening}),p.jsxs("details",{className:"section",open:!0,children:[p.jsx("summary",{children:"Types"}),p.jsx("table",{className:"type-table",children:p.jsx("tbody",{children:Object.entries(t.type_counts||{}).sort((u,d)=>d[1]-u[1]).slice(0,12).map(([u,d])=>p.jsxs("tr",{children:[p.jsx("td",{children:yl(u)}),p.jsx("td",{children:d})]},u))})})]}),p.jsxs("div",{className:"btn-row",children:[p.jsx("button",{type:"button",className:"btn",disabled:r,onClick:o,"data-testid":"btn-full-reindex",children:"Full reindex"}),p.jsx("button",{type:"button",className:"btn primary",disabled:r,onClick:l,children:"Review against this index"})]})]})}function mm({cards:t}){const r=t||[];return r.length?p.jsxs("details",{className:"section",open:!0,"data-testid":"deepening-list",children:[p.jsxs("summary",{children:["Depth ",p.jsx("span",{className:"count",children:r.length})]}),p.jsx("p",{className:"muted",children:"Deepening opportunities: more behaviour behind a smaller interface, at a real seam."}),r.map(o=>p.jsxs("div",{className:"finding","data-testid":"deepening-card",children:[p.jsx("span",{className:`chip ${o.strength}`,children:s0(o.strength)}),o.top?p.jsx("span",{className:"chip",children:"top"}):null,p.jsx("strong",{children:o.title}),p.jsx("div",{className:"why",children:o.message}),o.deletion_test?p.jsxs("div",{className:"muted",children:["Deletion test: ",o.deletion_test]}):null,o.before&&o.after?p.jsxs("div",{className:"muted",children:[o.before," → ",o.after]}):null]},o.rule+o.title))]}):null}gm(pm());r0.createRoot(document.getElementById("root")).render(p.jsx($.StrictMode,{children:p.jsx(lE,{})}));export{Ik as L,fE as a,cE as c,p as j,dE as l,$ as r,yl as t}; diff --git a/src/loadpath/static/assets/index-CPytLSOG.js b/src/loadpath/static/assets/index-CPytLSOG.js deleted file mode 100644 index 4146731..0000000 --- a/src/loadpath/static/assets/index-CPytLSOG.js +++ /dev/null @@ -1,62 +0,0 @@ -(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const a of document.querySelectorAll('link[rel="modulepreload"]'))l(a);new MutationObserver(a=>{for(const u of a)if(u.type==="childList")for(const d of u.addedNodes)d.tagName==="LINK"&&d.rel==="modulepreload"&&l(d)}).observe(document,{childList:!0,subtree:!0});function i(a){const u={};return a.integrity&&(u.integrity=a.integrity),a.referrerPolicy&&(u.referrerPolicy=a.referrerPolicy),a.crossOrigin==="use-credentials"?u.credentials="include":a.crossOrigin==="anonymous"?u.credentials="omit":u.credentials="same-origin",u}function l(a){if(a.ep)return;a.ep=!0;const u=i(a);fetch(a.href,u)}})();function vp(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var wu={exports:{}},oi={},_u={exports:{}},Pe={};/** - * @license React - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Hf;function G0(){if(Hf)return Pe;Hf=1;var t=Symbol.for("react.element"),r=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),u=Symbol.for("react.provider"),d=Symbol.for("react.context"),f=Symbol.for("react.forward_ref"),p=Symbol.for("react.suspense"),y=Symbol.for("react.memo"),g=Symbol.for("react.lazy"),x=Symbol.iterator;function v(P){return P===null||typeof P!="object"?null:(P=x&&P[x]||P["@@iterator"],typeof P=="function"?P:null)}var _={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},S=Object.assign,C={};function E(P,T,ne){this.props=P,this.context=T,this.refs=C,this.updater=ne||_}E.prototype.isReactComponent={},E.prototype.setState=function(P,T){if(typeof P!="object"&&typeof P!="function"&&P!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,P,T,"setState")},E.prototype.forceUpdate=function(P){this.updater.enqueueForceUpdate(this,P,"forceUpdate")};function N(){}N.prototype=E.prototype;function b(P,T,ne){this.props=P,this.context=T,this.refs=C,this.updater=ne||_}var k=b.prototype=new N;k.constructor=b,S(k,E.prototype),k.isPureReactComponent=!0;var j=Array.isArray,R=Object.prototype.hasOwnProperty,D={current:null},H={key:!0,ref:!0,__self:!0,__source:!0};function X(P,T,ne){var re,ue={},ce=null,de=null;if(T!=null)for(re in T.ref!==void 0&&(de=T.ref),T.key!==void 0&&(ce=""+T.key),T)R.call(T,re)&&!H.hasOwnProperty(re)&&(ue[re]=T[re]);var Q=arguments.length-2;if(Q===1)ue.children=ne;else if(1>>1,T=A[P];if(0>>1;Pa(ue,F))cea(de,ue)?(A[P]=de,A[ce]=F,P=ce):(A[P]=ue,A[re]=F,P=re);else if(cea(de,F))A[P]=de,A[ce]=F,P=ce;else break e}}return z}function a(A,z){var F=A.sortIndex-z.sortIndex;return F!==0?F:A.id-z.id}if(typeof performance=="object"&&typeof performance.now=="function"){var u=performance;t.unstable_now=function(){return u.now()}}else{var d=Date,f=d.now();t.unstable_now=function(){return d.now()-f}}var p=[],y=[],g=1,x=null,v=3,_=!1,S=!1,C=!1,E=typeof setTimeout=="function"?setTimeout:null,N=typeof clearTimeout=="function"?clearTimeout:null,b=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function k(A){for(var z=i(y);z!==null;){if(z.callback===null)l(y);else if(z.startTime<=A)l(y),z.sortIndex=z.expirationTime,r(p,z);else break;z=i(y)}}function j(A){if(C=!1,k(A),!S)if(i(p)!==null)S=!0,B(R);else{var z=i(y);z!==null&&U(j,z.startTime-A)}}function R(A,z){S=!1,C&&(C=!1,N(X),X=-1),_=!0;var F=v;try{for(k(z),x=i(p);x!==null&&(!(x.expirationTime>z)||A&&!Z());){var P=x.callback;if(typeof P=="function"){x.callback=null,v=x.priorityLevel;var T=P(x.expirationTime<=z);z=t.unstable_now(),typeof T=="function"?x.callback=T:x===i(p)&&l(p),k(z)}else l(p);x=i(p)}if(x!==null)var ne=!0;else{var re=i(y);re!==null&&U(j,re.startTime-z),ne=!1}return ne}finally{x=null,v=F,_=!1}}var D=!1,H=null,X=-1,V=5,ee=-1;function Z(){return!(t.unstable_now()-eeA||125P?(A.sortIndex=F,r(y,A),i(p)===null&&A===i(y)&&(C?(N(X),X=-1):C=!0,U(j,F-P))):(A.sortIndex=T,r(p,A),S||_||(S=!0,B(R))),A},t.unstable_shouldYield=Z,t.unstable_wrapCallback=function(A){var z=v;return function(){var F=v;v=z;try{return A.apply(this,arguments)}finally{v=F}}}})(Eu)),Eu}var Yf;function J0(){return Yf||(Yf=1,ku.exports=Z0()),ku.exports}/** - * @license React - * react-dom.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Xf;function ey(){if(Xf)return kt;Xf=1;var t=Si(),r=J0();function i(e){for(var n="https://reactjs.org/docs/error-decoder.html?invariant="+e,o=1;o"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),p=Object.prototype.hasOwnProperty,y=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,g={},x={};function v(e){return p.call(x,e)?!0:p.call(g,e)?!1:y.test(e)?x[e]=!0:(g[e]=!0,!1)}function _(e,n,o,s){if(o!==null&&o.type===0)return!1;switch(typeof n){case"function":case"symbol":return!0;case"boolean":return s?!1:o!==null?!o.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function S(e,n,o,s){if(n===null||typeof n>"u"||_(e,n,o,s))return!0;if(s)return!1;if(o!==null)switch(o.type){case 3:return!n;case 4:return n===!1;case 5:return isNaN(n);case 6:return isNaN(n)||1>n}return!1}function C(e,n,o,s,c,h,w){this.acceptsBooleans=n===2||n===3||n===4,this.attributeName=s,this.attributeNamespace=c,this.mustUseProperty=o,this.propertyName=e,this.type=n,this.sanitizeURL=h,this.removeEmptyString=w}var E={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){E[e]=new C(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var n=e[0];E[n]=new C(n,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){E[e]=new C(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){E[e]=new C(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){E[e]=new C(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){E[e]=new C(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){E[e]=new C(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){E[e]=new C(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){E[e]=new C(e,5,!1,e.toLowerCase(),null,!1,!1)});var N=/[\-:]([a-z])/g;function b(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var n=e.replace(N,b);E[n]=new C(n,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var n=e.replace(N,b);E[n]=new C(n,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var n=e.replace(N,b);E[n]=new C(n,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){E[e]=new C(e,1,!1,e.toLowerCase(),null,!1,!1)}),E.xlinkHref=new C("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){E[e]=new C(e,1,!1,e.toLowerCase(),null,!0,!0)});function k(e,n,o,s){var c=E.hasOwnProperty(n)?E[n]:null;(c!==null?c.type!==0:s||!(2I||c[w]!==h[I]){var L=` -`+c[w].replace(" at new "," at ");return e.displayName&&L.includes("")&&(L=L.replace("",e.displayName)),L}while(1<=w&&0<=I);break}}}finally{ne=!1,Error.prepareStackTrace=o}return(e=e?e.displayName||e.name:"")?T(e):""}function ue(e){switch(e.tag){case 5:return T(e.type);case 16:return T("Lazy");case 13:return T("Suspense");case 19:return T("SuspenseList");case 0:case 2:case 15:return e=re(e.type,!1),e;case 11:return e=re(e.type.render,!1),e;case 1:return e=re(e.type,!0),e;default:return""}}function ce(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case H:return"Fragment";case D:return"Portal";case V:return"Profiler";case X:return"StrictMode";case J:return"Suspense";case M:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case Z:return(e.displayName||"Context")+".Consumer";case ee:return(e._context.displayName||"Context")+".Provider";case te:var n=e.render;return e=e.displayName,e||(e=n.displayName||n.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case W:return n=e.displayName||null,n!==null?n:ce(e.type)||"Memo";case B:n=e._payload,e=e._init;try{return ce(e(n))}catch{}}return null}function de(e){var n=e.type;switch(e.tag){case 24:return"Cache";case 9:return(n.displayName||"Context")+".Consumer";case 10:return(n._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=n.render,e=e.displayName||e.name||"",n.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return n;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ce(n);case 8:return n===X?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof n=="function")return n.displayName||n.name||null;if(typeof n=="string")return n}return null}function Q(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function se(e){var n=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(n==="checkbox"||n==="radio")}function fe(e){var n=se(e)?"checked":"value",o=Object.getOwnPropertyDescriptor(e.constructor.prototype,n),s=""+e[n];if(!e.hasOwnProperty(n)&&typeof o<"u"&&typeof o.get=="function"&&typeof o.set=="function"){var c=o.get,h=o.set;return Object.defineProperty(e,n,{configurable:!0,get:function(){return c.call(this)},set:function(w){s=""+w,h.call(this,w)}}),Object.defineProperty(e,n,{enumerable:o.enumerable}),{getValue:function(){return s},setValue:function(w){s=""+w},stopTracking:function(){e._valueTracker=null,delete e[n]}}}}function me(e){e._valueTracker||(e._valueTracker=fe(e))}function xe(e){if(!e)return!1;var n=e._valueTracker;if(!n)return!0;var o=n.getValue(),s="";return e&&(s=se(e)?e.checked?"true":"false":e.value),e=s,e!==o?(n.setValue(e),!0):!1}function pe(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ce(e,n){var o=n.checked;return F({},n,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:o??e._wrapperState.initialChecked})}function je(e,n){var o=n.defaultValue==null?"":n.defaultValue,s=n.checked!=null?n.checked:n.defaultChecked;o=Q(n.value!=null?n.value:o),e._wrapperState={initialChecked:s,initialValue:o,controlled:n.type==="checkbox"||n.type==="radio"?n.checked!=null:n.value!=null}}function Me(e,n){n=n.checked,n!=null&&k(e,"checked",n,!1)}function Re(e,n){Me(e,n);var o=Q(n.value),s=n.type;if(o!=null)s==="number"?(o===0&&e.value===""||e.value!=o)&&(e.value=""+o):e.value!==""+o&&(e.value=""+o);else if(s==="submit"||s==="reset"){e.removeAttribute("value");return}n.hasOwnProperty("value")?rt(e,n.type,o):n.hasOwnProperty("defaultValue")&&rt(e,n.type,Q(n.defaultValue)),n.checked==null&&n.defaultChecked!=null&&(e.defaultChecked=!!n.defaultChecked)}function Xe(e,n,o){if(n.hasOwnProperty("value")||n.hasOwnProperty("defaultValue")){var s=n.type;if(!(s!=="submit"&&s!=="reset"||n.value!==void 0&&n.value!==null))return;n=""+e._wrapperState.initialValue,o||n===e.value||(e.value=n),e.defaultValue=n}o=e.name,o!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,o!==""&&(e.name=o)}function rt(e,n,o){(n!=="number"||pe(e.ownerDocument)!==e)&&(o==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+o&&(e.defaultValue=""+o))}var Ze=Array.isArray;function Je(e,n,o,s){if(e=e.options,n){n={};for(var c=0;c"+n.valueOf().toString()+"",n=pt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;n.firstChild;)e.appendChild(n.firstChild)}});function Ut(e,n){if(n){var o=e.firstChild;if(o&&o===e.lastChild&&o.nodeType===3){o.nodeValue=n;return}}e.textContent=n}var hn={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Ir=["Webkit","ms","Moz","O"];Object.keys(hn).forEach(function(e){Ir.forEach(function(n){n=n+e.charAt(0).toUpperCase()+e.substring(1),hn[n]=hn[e]})});function er(e,n,o){return n==null||typeof n=="boolean"||n===""?"":o||typeof n!="number"||n===0||hn.hasOwnProperty(e)&&hn[e]?(""+n).trim():n+"px"}function tr(e,n){e=e.style;for(var o in n)if(n.hasOwnProperty(o)){var s=o.indexOf("--")===0,c=er(o,n[o],s);o==="float"&&(o="cssFloat"),s?e.setProperty(o,c):e[o]=c}}var br=F({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function jn(e,n){if(n){if(br[e]&&(n.children!=null||n.dangerouslySetInnerHTML!=null))throw Error(i(137,e));if(n.dangerouslySetInnerHTML!=null){if(n.children!=null)throw Error(i(60));if(typeof n.dangerouslySetInnerHTML!="object"||!("__html"in n.dangerouslySetInnerHTML))throw Error(i(61))}if(n.style!=null&&typeof n.style!="object")throw Error(i(62))}}function Mn(e,n){if(e.indexOf("-")===-1)return typeof n.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Pn=null;function K(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var ye=null,Le=null,Nt=null;function Ct(e){if(e=Vo(e)){if(typeof ye!="function")throw Error(i(280));var n=e.stateNode;n&&(n=os(n),ye(e.stateNode,e.type,n))}}function Pi(e){Le?Nt?Nt.push(e):Nt=[e]:Le=e}function Ii(){if(Le){var e=Le,n=Nt;if(Nt=Le=null,Ct(e),n)for(e=0;e>>=0,e===0?32:31-(Ol(e)/Fl|0)|0}var Ar=64,Dr=4194304;function ir(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function pn(e,n){var o=e.pendingLanes;if(o===0)return 0;var s=0,c=e.suspendedLanes,h=e.pingedLanes,w=o&268435455;if(w!==0){var I=w&~c;I!==0?s=ir(I):(h&=w,h!==0&&(s=ir(h)))}else w=o&~c,w!==0?s=ir(w):h!==0&&(s=ir(h));if(s===0)return 0;if(n!==0&&n!==s&&(n&c)===0&&(c=s&-s,h=n&-n,c>=h||c===16&&(h&4194240)!==0))return n;if((s&4)!==0&&(s|=o&16),n=e.entangledLanes,n!==0)for(e=e.entanglements,n&=s;0o;o++)n.push(e);return n}function lr(e,n,o){e.pendingLanes|=n,n!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,n=31-Mt(n),e[n]=o}function Vl(e,n){var o=e.pendingLanes&~n;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=n,e.mutableReadLanes&=n,e.entangledLanes&=n,n=e.entanglements;var s=e.eventTimes;for(e=e.expirationTimes;0=Lo),Rc=" ",Lc=!1;function zc(e,n){switch(e){case"keyup":return Vg.indexOf(n.keyCode)!==-1;case"keydown":return n.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Ac(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Hr=!1;function Wg(e,n){switch(e){case"compositionend":return Ac(n);case"keypress":return n.which!==32?null:(Lc=!0,Rc);case"textInput":return e=n.data,e===Rc&&Lc?null:e;default:return null}}function Yg(e,n){if(Hr)return e==="compositionend"||!ea&&zc(e,n)?(e=jc(),Xi=Gl=Ln=null,Hr=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(n.ctrlKey||n.altKey||n.metaKey)||n.ctrlKey&&n.altKey){if(n.char&&1=n)return{node:o,offset:n-e};e=s}e:{for(;o;){if(o.nextSibling){o=o.nextSibling;break e}o=o.parentNode}o=void 0}o=Vc(o)}}function Wc(e,n){return e&&n?e===n?!0:e&&e.nodeType===3?!1:n&&n.nodeType===3?Wc(e,n.parentNode):"contains"in e?e.contains(n):e.compareDocumentPosition?!!(e.compareDocumentPosition(n)&16):!1:!1}function Yc(){for(var e=window,n=pe();n instanceof e.HTMLIFrameElement;){try{var o=typeof n.contentWindow.location.href=="string"}catch{o=!1}if(o)e=n.contentWindow;else break;n=pe(e.document)}return n}function ra(e){var n=e&&e.nodeName&&e.nodeName.toLowerCase();return n&&(n==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||n==="textarea"||e.contentEditable==="true")}function t0(e){var n=Yc(),o=e.focusedElem,s=e.selectionRange;if(n!==o&&o&&o.ownerDocument&&Wc(o.ownerDocument.documentElement,o)){if(s!==null&&ra(o)){if(n=s.start,e=s.end,e===void 0&&(e=n),"selectionStart"in o)o.selectionStart=n,o.selectionEnd=Math.min(e,o.value.length);else if(e=(n=o.ownerDocument||document)&&n.defaultView||window,e.getSelection){e=e.getSelection();var c=o.textContent.length,h=Math.min(s.start,c);s=s.end===void 0?h:Math.min(s.end,c),!e.extend&&h>s&&(c=s,s=h,h=c),c=Uc(o,h);var w=Uc(o,s);c&&w&&(e.rangeCount!==1||e.anchorNode!==c.node||e.anchorOffset!==c.offset||e.focusNode!==w.node||e.focusOffset!==w.offset)&&(n=n.createRange(),n.setStart(c.node,c.offset),e.removeAllRanges(),h>s?(e.addRange(n),e.extend(w.node,w.offset)):(n.setEnd(w.node,w.offset),e.addRange(n)))}}for(n=[],e=o;e=e.parentNode;)e.nodeType===1&&n.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof o.focus=="function"&&o.focus(),o=0;o=document.documentMode,Br=null,oa=null,$o=null,ia=!1;function Xc(e,n,o){var s=o.window===o?o.document:o.nodeType===9?o:o.ownerDocument;ia||Br==null||Br!==pe(s)||(s=Br,"selectionStart"in s&&ra(s)?s={start:s.selectionStart,end:s.selectionEnd}:(s=(s.ownerDocument&&s.ownerDocument.defaultView||window).getSelection(),s={anchorNode:s.anchorNode,anchorOffset:s.anchorOffset,focusNode:s.focusNode,focusOffset:s.focusOffset}),$o&&Do($o,s)||($o=s,s=ts(oa,"onSelect"),0Xr||(e.current=ya[Xr],ya[Xr]=null,Xr--)}function Ae(e,n){Xr++,ya[Xr]=e.current,e.current=n}var $n={},at=Dn($n),vt=Dn(!1),ur=$n;function Gr(e,n){var o=e.type.contextTypes;if(!o)return $n;var s=e.stateNode;if(s&&s.__reactInternalMemoizedUnmaskedChildContext===n)return s.__reactInternalMemoizedMaskedChildContext;var c={},h;for(h in o)c[h]=n[h];return s&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=n,e.__reactInternalMemoizedMaskedChildContext=c),c}function xt(e){return e=e.childContextTypes,e!=null}function is(){$e(vt),$e(at)}function ad(e,n,o){if(at.current!==$n)throw Error(i(168));Ae(at,n),Ae(vt,o)}function ud(e,n,o){var s=e.stateNode;if(n=n.childContextTypes,typeof s.getChildContext!="function")return o;s=s.getChildContext();for(var c in s)if(!(c in n))throw Error(i(108,de(e)||"Unknown",c));return F({},o,s)}function ss(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||$n,ur=at.current,Ae(at,e),Ae(vt,vt.current),!0}function cd(e,n,o){var s=e.stateNode;if(!s)throw Error(i(169));o?(e=ud(e,n,ur),s.__reactInternalMemoizedMergedChildContext=e,$e(vt),$e(at),Ae(at,e)):$e(vt),Ae(vt,o)}var gn=null,ls=!1,va=!1;function dd(e){gn===null?gn=[e]:gn.push(e)}function h0(e){ls=!0,dd(e)}function On(){if(!va&&gn!==null){va=!0;var e=0,n=ze;try{var o=gn;for(ze=1;e>=w,c-=w,yn=1<<32-Mt(n)+c|o<Ne?(nt=Ee,Ee=null):nt=Ee.sibling;var Te=oe(Y,Ee,G[Ne],ae);if(Te===null){Ee===null&&(Ee=nt);break}e&&Ee&&Te.alternate===null&&n(Y,Ee),$=h(Te,$,Ne),ke===null?_e=Te:ke.sibling=Te,ke=Te,Ee=nt}if(Ne===G.length)return o(Y,Ee),Fe&&dr(Y,Ne),_e;if(Ee===null){for(;NeNe?(nt=Ee,Ee=null):nt=Ee.sibling;var Gn=oe(Y,Ee,Te.value,ae);if(Gn===null){Ee===null&&(Ee=nt);break}e&&Ee&&Gn.alternate===null&&n(Y,Ee),$=h(Gn,$,Ne),ke===null?_e=Gn:ke.sibling=Gn,ke=Gn,Ee=nt}if(Te.done)return o(Y,Ee),Fe&&dr(Y,Ne),_e;if(Ee===null){for(;!Te.done;Ne++,Te=G.next())Te=le(Y,Te.value,ae),Te!==null&&($=h(Te,$,Ne),ke===null?_e=Te:ke.sibling=Te,ke=Te);return Fe&&dr(Y,Ne),_e}for(Ee=s(Y,Ee);!Te.done;Ne++,Te=G.next())Te=he(Ee,Y,Ne,Te.value,ae),Te!==null&&(e&&Te.alternate!==null&&Ee.delete(Te.key===null?Ne:Te.key),$=h(Te,$,Ne),ke===null?_e=Te:ke.sibling=Te,ke=Te);return e&&Ee.forEach(function(X0){return n(Y,X0)}),Fe&&dr(Y,Ne),_e}function Ye(Y,$,G,ae){if(typeof G=="object"&&G!==null&&G.type===H&&G.key===null&&(G=G.props.children),typeof G=="object"&&G!==null){switch(G.$$typeof){case R:e:{for(var _e=G.key,ke=$;ke!==null;){if(ke.key===_e){if(_e=G.type,_e===H){if(ke.tag===7){o(Y,ke.sibling),$=c(ke,G.props.children),$.return=Y,Y=$;break e}}else if(ke.elementType===_e||typeof _e=="object"&&_e!==null&&_e.$$typeof===B&&yd(_e)===ke.type){o(Y,ke.sibling),$=c(ke,G.props),$.ref=Uo(Y,ke,G),$.return=Y,Y=$;break e}o(Y,ke);break}else n(Y,ke);ke=ke.sibling}G.type===H?($=xr(G.props.children,Y.mode,ae,G.key),$.return=Y,Y=$):(ae=zs(G.type,G.key,G.props,null,Y.mode,ae),ae.ref=Uo(Y,$,G),ae.return=Y,Y=ae)}return w(Y);case D:e:{for(ke=G.key;$!==null;){if($.key===ke)if($.tag===4&&$.stateNode.containerInfo===G.containerInfo&&$.stateNode.implementation===G.implementation){o(Y,$.sibling),$=c($,G.children||[]),$.return=Y,Y=$;break e}else{o(Y,$);break}else n(Y,$);$=$.sibling}$=mu(G,Y.mode,ae),$.return=Y,Y=$}return w(Y);case B:return ke=G._init,Ye(Y,$,ke(G._payload),ae)}if(Ze(G))return ve(Y,$,G,ae);if(z(G))return we(Y,$,G,ae);ds(Y,G)}return typeof G=="string"&&G!==""||typeof G=="number"?(G=""+G,$!==null&&$.tag===6?(o(Y,$.sibling),$=c($,G),$.return=Y,Y=$):(o(Y,$),$=pu(G,Y.mode,ae),$.return=Y,Y=$),w(Y)):o(Y,$)}return Ye}var Zr=vd(!0),xd=vd(!1),fs=Dn(null),hs=null,Jr=null,Ea=null;function Na(){Ea=Jr=hs=null}function Ca(e){var n=fs.current;$e(fs),e._currentValue=n}function ja(e,n,o){for(;e!==null;){var s=e.alternate;if((e.childLanes&n)!==n?(e.childLanes|=n,s!==null&&(s.childLanes|=n)):s!==null&&(s.childLanes&n)!==n&&(s.childLanes|=n),e===o)break;e=e.return}}function eo(e,n){hs=e,Ea=Jr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&n)!==0&&(wt=!0),e.firstContext=null)}function Ot(e){var n=e._currentValue;if(Ea!==e)if(e={context:e,memoizedValue:n,next:null},Jr===null){if(hs===null)throw Error(i(308));Jr=e,hs.dependencies={lanes:0,firstContext:e}}else Jr=Jr.next=e;return n}var fr=null;function Ma(e){fr===null?fr=[e]:fr.push(e)}function wd(e,n,o,s){var c=n.interleaved;return c===null?(o.next=o,Ma(n)):(o.next=c.next,c.next=o),n.interleaved=o,xn(e,s)}function xn(e,n){e.lanes|=n;var o=e.alternate;for(o!==null&&(o.lanes|=n),o=e,e=e.return;e!==null;)e.childLanes|=n,o=e.alternate,o!==null&&(o.childLanes|=n),o=e,e=e.return;return o.tag===3?o.stateNode:null}var Fn=!1;function Pa(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function _d(e,n){e=e.updateQueue,n.updateQueue===e&&(n.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function wn(e,n){return{eventTime:e,lane:n,tag:0,payload:null,callback:null,next:null}}function Hn(e,n,o){var s=e.updateQueue;if(s===null)return null;if(s=s.shared,(Ie&2)!==0){var c=s.pending;return c===null?n.next=n:(n.next=c.next,c.next=n),s.pending=n,xn(e,o)}return c=s.interleaved,c===null?(n.next=n,Ma(s)):(n.next=c.next,c.next=n),s.interleaved=n,xn(e,o)}function ps(e,n,o){if(n=n.updateQueue,n!==null&&(n=n.shared,(o&4194240)!==0)){var s=n.lanes;s&=e.pendingLanes,o|=s,n.lanes=o,$r(e,o)}}function Sd(e,n){var o=e.updateQueue,s=e.alternate;if(s!==null&&(s=s.updateQueue,o===s)){var c=null,h=null;if(o=o.firstBaseUpdate,o!==null){do{var w={eventTime:o.eventTime,lane:o.lane,tag:o.tag,payload:o.payload,callback:o.callback,next:null};h===null?c=h=w:h=h.next=w,o=o.next}while(o!==null);h===null?c=h=n:h=h.next=n}else c=h=n;o={baseState:s.baseState,firstBaseUpdate:c,lastBaseUpdate:h,shared:s.shared,effects:s.effects},e.updateQueue=o;return}e=o.lastBaseUpdate,e===null?o.firstBaseUpdate=n:e.next=n,o.lastBaseUpdate=n}function ms(e,n,o,s){var c=e.updateQueue;Fn=!1;var h=c.firstBaseUpdate,w=c.lastBaseUpdate,I=c.shared.pending;if(I!==null){c.shared.pending=null;var L=I,q=L.next;L.next=null,w===null?h=q:w.next=q,w=L;var ie=e.alternate;ie!==null&&(ie=ie.updateQueue,I=ie.lastBaseUpdate,I!==w&&(I===null?ie.firstBaseUpdate=q:I.next=q,ie.lastBaseUpdate=L))}if(h!==null){var le=c.baseState;w=0,ie=q=L=null,I=h;do{var oe=I.lane,he=I.eventTime;if((s&oe)===oe){ie!==null&&(ie=ie.next={eventTime:he,lane:0,tag:I.tag,payload:I.payload,callback:I.callback,next:null});e:{var ve=e,we=I;switch(oe=n,he=o,we.tag){case 1:if(ve=we.payload,typeof ve=="function"){le=ve.call(he,le,oe);break e}le=ve;break e;case 3:ve.flags=ve.flags&-65537|128;case 0:if(ve=we.payload,oe=typeof ve=="function"?ve.call(he,le,oe):ve,oe==null)break e;le=F({},le,oe);break e;case 2:Fn=!0}}I.callback!==null&&I.lane!==0&&(e.flags|=64,oe=c.effects,oe===null?c.effects=[I]:oe.push(I))}else he={eventTime:he,lane:oe,tag:I.tag,payload:I.payload,callback:I.callback,next:null},ie===null?(q=ie=he,L=le):ie=ie.next=he,w|=oe;if(I=I.next,I===null){if(I=c.shared.pending,I===null)break;oe=I,I=oe.next,oe.next=null,c.lastBaseUpdate=oe,c.shared.pending=null}}while(!0);if(ie===null&&(L=le),c.baseState=L,c.firstBaseUpdate=q,c.lastBaseUpdate=ie,n=c.shared.interleaved,n!==null){c=n;do w|=c.lane,c=c.next;while(c!==n)}else h===null&&(c.shared.lanes=0);mr|=w,e.lanes=w,e.memoizedState=le}}function kd(e,n,o){if(e=n.effects,n.effects=null,e!==null)for(n=0;no?o:4,e(!0);var s=La.transition;La.transition={};try{e(!1),n()}finally{ze=o,La.transition=s}}function Bd(){return Ft().memoizedState}function y0(e,n,o){var s=Wn(e);if(o={lane:s,action:o,hasEagerState:!1,eagerState:null,next:null},Vd(e))Ud(n,o);else if(o=wd(e,n,o,s),o!==null){var c=gt();Kt(o,e,s,c),Wd(o,n,s)}}function v0(e,n,o){var s=Wn(e),c={lane:s,action:o,hasEagerState:!1,eagerState:null,next:null};if(Vd(e))Ud(n,c);else{var h=e.alternate;if(e.lanes===0&&(h===null||h.lanes===0)&&(h=n.lastRenderedReducer,h!==null))try{var w=n.lastRenderedState,I=h(w,o);if(c.hasEagerState=!0,c.eagerState=I,Wt(I,w)){var L=n.interleaved;L===null?(c.next=c,Ma(n)):(c.next=L.next,L.next=c),n.interleaved=c;return}}catch{}finally{}o=wd(e,n,c,s),o!==null&&(c=gt(),Kt(o,e,s,c),Wd(o,n,s))}}function Vd(e){var n=e.alternate;return e===Ve||n!==null&&n===Ve}function Ud(e,n){Go=vs=!0;var o=e.pending;o===null?n.next=n:(n.next=o.next,o.next=n),e.pending=n}function Wd(e,n,o){if((o&4194240)!==0){var s=n.lanes;s&=e.pendingLanes,o|=s,n.lanes=o,$r(e,o)}}var _s={readContext:Ot,useCallback:ut,useContext:ut,useEffect:ut,useImperativeHandle:ut,useInsertionEffect:ut,useLayoutEffect:ut,useMemo:ut,useReducer:ut,useRef:ut,useState:ut,useDebugValue:ut,useDeferredValue:ut,useTransition:ut,useMutableSource:ut,useSyncExternalStore:ut,useId:ut,unstable_isNewReconciler:!1},x0={readContext:Ot,useCallback:function(e,n){return an().memoizedState=[e,n===void 0?null:n],e},useContext:Ot,useEffect:Ld,useImperativeHandle:function(e,n,o){return o=o!=null?o.concat([e]):null,xs(4194308,4,Dd.bind(null,n,e),o)},useLayoutEffect:function(e,n){return xs(4194308,4,e,n)},useInsertionEffect:function(e,n){return xs(4,2,e,n)},useMemo:function(e,n){var o=an();return n=n===void 0?null:n,e=e(),o.memoizedState=[e,n],e},useReducer:function(e,n,o){var s=an();return n=o!==void 0?o(n):n,s.memoizedState=s.baseState=n,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:n},s.queue=e,e=e.dispatch=y0.bind(null,Ve,e),[s.memoizedState,e]},useRef:function(e){var n=an();return e={current:e},n.memoizedState=e},useState:Td,useDebugValue:Ha,useDeferredValue:function(e){return an().memoizedState=e},useTransition:function(){var e=Td(!1),n=e[0];return e=g0.bind(null,e[1]),an().memoizedState=e,[n,e]},useMutableSource:function(){},useSyncExternalStore:function(e,n,o){var s=Ve,c=an();if(Fe){if(o===void 0)throw Error(i(407));o=o()}else{if(o=n(),tt===null)throw Error(i(349));(pr&30)!==0||jd(s,n,o)}c.memoizedState=o;var h={value:o,getSnapshot:n};return c.queue=h,Ld(Pd.bind(null,s,h,e),[e]),s.flags|=2048,qo(9,Md.bind(null,s,h,o,n),void 0,null),o},useId:function(){var e=an(),n=tt.identifierPrefix;if(Fe){var o=vn,s=yn;o=(s&~(1<<32-Mt(s)-1)).toString(32)+o,n=":"+n+"R"+o,o=Qo++,0<\/script>",e=e.removeChild(e.firstChild)):typeof s.is=="string"?e=w.createElement(o,{is:s.is}):(e=w.createElement(o),o==="select"&&(w=e,s.multiple?w.multiple=!0:s.size&&(w.size=s.size))):e=w.createElementNS(e,o),e[sn]=n,e[Bo]=s,ff(e,n,!1,!1),n.stateNode=e;e:{switch(w=Mn(o,s),o){case"dialog":De("cancel",e),De("close",e),c=s;break;case"iframe":case"object":case"embed":De("load",e),c=s;break;case"video":case"audio":for(c=0;cio&&(n.flags|=128,s=!0,Zo(h,!1),n.lanes=4194304)}else{if(!s)if(e=gs(w),e!==null){if(n.flags|=128,s=!0,o=e.updateQueue,o!==null&&(n.updateQueue=o,n.flags|=4),Zo(h,!0),h.tail===null&&h.tailMode==="hidden"&&!w.alternate&&!Fe)return ct(n),null}else 2*He()-h.renderingStartTime>io&&o!==1073741824&&(n.flags|=128,s=!0,Zo(h,!1),n.lanes=4194304);h.isBackwards?(w.sibling=n.child,n.child=w):(o=h.last,o!==null?o.sibling=w:n.child=w,h.last=w)}return h.tail!==null?(n=h.tail,h.rendering=n,h.tail=n.sibling,h.renderingStartTime=He(),n.sibling=null,o=Be.current,Ae(Be,s?o&1|2:o&1),n):(ct(n),null);case 22:case 23:return du(),s=n.memoizedState!==null,e!==null&&e.memoizedState!==null!==s&&(n.flags|=8192),s&&(n.mode&1)!==0?(Tt&1073741824)!==0&&(ct(n),n.subtreeFlags&6&&(n.flags|=8192)):ct(n),null;case 24:return null;case 25:return null}throw Error(i(156,n.tag))}function j0(e,n){switch(wa(n),n.tag){case 1:return xt(n.type)&&is(),e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 3:return to(),$e(vt),$e(at),Ra(),e=n.flags,(e&65536)!==0&&(e&128)===0?(n.flags=e&-65537|128,n):null;case 5:return ba(n),null;case 13:if($e(Be),e=n.memoizedState,e!==null&&e.dehydrated!==null){if(n.alternate===null)throw Error(i(340));qr()}return e=n.flags,e&65536?(n.flags=e&-65537|128,n):null;case 19:return $e(Be),null;case 4:return to(),null;case 10:return Ca(n.type._context),null;case 22:case 23:return du(),null;case 24:return null;default:return null}}var Ns=!1,dt=!1,M0=typeof WeakSet=="function"?WeakSet:Set,ge=null;function ro(e,n){var o=e.ref;if(o!==null)if(typeof o=="function")try{o(null)}catch(s){We(e,n,s)}else o.current=null}function Ja(e,n,o){try{o()}catch(s){We(e,n,s)}}var mf=!1;function P0(e,n){if(da=Wi,e=Yc(),ra(e)){if("selectionStart"in e)var o={start:e.selectionStart,end:e.selectionEnd};else e:{o=(o=e.ownerDocument)&&o.defaultView||window;var s=o.getSelection&&o.getSelection();if(s&&s.rangeCount!==0){o=s.anchorNode;var c=s.anchorOffset,h=s.focusNode;s=s.focusOffset;try{o.nodeType,h.nodeType}catch{o=null;break e}var w=0,I=-1,L=-1,q=0,ie=0,le=e,oe=null;t:for(;;){for(var he;le!==o||c!==0&&le.nodeType!==3||(I=w+c),le!==h||s!==0&&le.nodeType!==3||(L=w+s),le.nodeType===3&&(w+=le.nodeValue.length),(he=le.firstChild)!==null;)oe=le,le=he;for(;;){if(le===e)break t;if(oe===o&&++q===c&&(I=w),oe===h&&++ie===s&&(L=w),(he=le.nextSibling)!==null)break;le=oe,oe=le.parentNode}le=he}o=I===-1||L===-1?null:{start:I,end:L}}else o=null}o=o||{start:0,end:0}}else o=null;for(fa={focusedElem:e,selectionRange:o},Wi=!1,ge=n;ge!==null;)if(n=ge,e=n.child,(n.subtreeFlags&1028)!==0&&e!==null)e.return=n,ge=e;else for(;ge!==null;){n=ge;try{var ve=n.alternate;if((n.flags&1024)!==0)switch(n.tag){case 0:case 11:case 15:break;case 1:if(ve!==null){var we=ve.memoizedProps,Ye=ve.memoizedState,Y=n.stateNode,$=Y.getSnapshotBeforeUpdate(n.elementType===n.type?we:Xt(n.type,we),Ye);Y.__reactInternalSnapshotBeforeUpdate=$}break;case 3:var G=n.stateNode.containerInfo;G.nodeType===1?G.textContent="":G.nodeType===9&&G.documentElement&&G.removeChild(G.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(i(163))}}catch(ae){We(n,n.return,ae)}if(e=n.sibling,e!==null){e.return=n.return,ge=e;break}ge=n.return}return ve=mf,mf=!1,ve}function Jo(e,n,o){var s=n.updateQueue;if(s=s!==null?s.lastEffect:null,s!==null){var c=s=s.next;do{if((c.tag&e)===e){var h=c.destroy;c.destroy=void 0,h!==void 0&&Ja(n,o,h)}c=c.next}while(c!==s)}}function Cs(e,n){if(n=n.updateQueue,n=n!==null?n.lastEffect:null,n!==null){var o=n=n.next;do{if((o.tag&e)===e){var s=o.create;o.destroy=s()}o=o.next}while(o!==n)}}function eu(e){var n=e.ref;if(n!==null){var o=e.stateNode;switch(e.tag){case 5:e=o;break;default:e=o}typeof n=="function"?n(e):n.current=e}}function gf(e){var n=e.alternate;n!==null&&(e.alternate=null,gf(n)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(n=e.stateNode,n!==null&&(delete n[sn],delete n[Bo],delete n[ga],delete n[d0],delete n[f0])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function yf(e){return e.tag===5||e.tag===3||e.tag===4}function vf(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||yf(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function tu(e,n,o){var s=e.tag;if(s===5||s===6)e=e.stateNode,n?o.nodeType===8?o.parentNode.insertBefore(e,n):o.insertBefore(e,n):(o.nodeType===8?(n=o.parentNode,n.insertBefore(e,o)):(n=o,n.appendChild(e)),o=o._reactRootContainer,o!=null||n.onclick!==null||(n.onclick=rs));else if(s!==4&&(e=e.child,e!==null))for(tu(e,n,o),e=e.sibling;e!==null;)tu(e,n,o),e=e.sibling}function nu(e,n,o){var s=e.tag;if(s===5||s===6)e=e.stateNode,n?o.insertBefore(e,n):o.appendChild(e);else if(s!==4&&(e=e.child,e!==null))for(nu(e,n,o),e=e.sibling;e!==null;)nu(e,n,o),e=e.sibling}var it=null,Gt=!1;function Bn(e,n,o){for(o=o.child;o!==null;)xf(e,n,o),o=o.sibling}function xf(e,n,o){if(jt&&typeof jt.onCommitFiberUnmount=="function")try{jt.onCommitFiberUnmount(zr,o)}catch{}switch(o.tag){case 5:dt||ro(o,n);case 6:var s=it,c=Gt;it=null,Bn(e,n,o),it=s,Gt=c,it!==null&&(Gt?(e=it,o=o.stateNode,e.nodeType===8?e.parentNode.removeChild(o):e.removeChild(o)):it.removeChild(o.stateNode));break;case 18:it!==null&&(Gt?(e=it,o=o.stateNode,e.nodeType===8?ma(e.parentNode,o):e.nodeType===1&&ma(e,o),bo(e)):ma(it,o.stateNode));break;case 4:s=it,c=Gt,it=o.stateNode.containerInfo,Gt=!0,Bn(e,n,o),it=s,Gt=c;break;case 0:case 11:case 14:case 15:if(!dt&&(s=o.updateQueue,s!==null&&(s=s.lastEffect,s!==null))){c=s=s.next;do{var h=c,w=h.destroy;h=h.tag,w!==void 0&&((h&2)!==0||(h&4)!==0)&&Ja(o,n,w),c=c.next}while(c!==s)}Bn(e,n,o);break;case 1:if(!dt&&(ro(o,n),s=o.stateNode,typeof s.componentWillUnmount=="function"))try{s.props=o.memoizedProps,s.state=o.memoizedState,s.componentWillUnmount()}catch(I){We(o,n,I)}Bn(e,n,o);break;case 21:Bn(e,n,o);break;case 22:o.mode&1?(dt=(s=dt)||o.memoizedState!==null,Bn(e,n,o),dt=s):Bn(e,n,o);break;default:Bn(e,n,o)}}function wf(e){var n=e.updateQueue;if(n!==null){e.updateQueue=null;var o=e.stateNode;o===null&&(o=e.stateNode=new M0),n.forEach(function(s){var c=$0.bind(null,e,s);o.has(s)||(o.add(s),s.then(c,c))})}}function Qt(e,n){var o=n.deletions;if(o!==null)for(var s=0;sc&&(c=w),s&=~h}if(s=c,s=He()-s,s=(120>s?120:480>s?480:1080>s?1080:1920>s?1920:3e3>s?3e3:4320>s?4320:1960*b0(s/1960))-s,10e?16:e,Un===null)var s=!1;else{if(e=Un,Un=null,bs=0,(Ie&6)!==0)throw Error(i(331));var c=Ie;for(Ie|=4,ge=e.current;ge!==null;){var h=ge,w=h.child;if((ge.flags&16)!==0){var I=h.deletions;if(I!==null){for(var L=0;LHe()-iu?yr(e,0):ou|=o),St(e,n)}function Rf(e,n){n===0&&((e.mode&1)===0?n=1:(n=Dr,Dr<<=1,(Dr&130023424)===0&&(Dr=4194304)));var o=gt();e=xn(e,n),e!==null&&(lr(e,n,o),St(e,o))}function D0(e){var n=e.memoizedState,o=0;n!==null&&(o=n.retryLane),Rf(e,o)}function $0(e,n){var o=0;switch(e.tag){case 13:var s=e.stateNode,c=e.memoizedState;c!==null&&(o=c.retryLane);break;case 19:s=e.stateNode;break;default:throw Error(i(314))}s!==null&&s.delete(n),Rf(e,o)}var Lf;Lf=function(e,n,o){if(e!==null)if(e.memoizedProps!==n.pendingProps||vt.current)wt=!0;else{if((e.lanes&o)===0&&(n.flags&128)===0)return wt=!1,N0(e,n,o);wt=(e.flags&131072)!==0}else wt=!1,Fe&&(n.flags&1048576)!==0&&fd(n,us,n.index);switch(n.lanes=0,n.tag){case 2:var s=n.type;Es(e,n),e=n.pendingProps;var c=Gr(n,at.current);eo(n,o),c=Aa(null,n,s,e,c,o);var h=Da();return n.flags|=1,typeof c=="object"&&c!==null&&typeof c.render=="function"&&c.$$typeof===void 0?(n.tag=1,n.memoizedState=null,n.updateQueue=null,xt(s)?(h=!0,ss(n)):h=!1,n.memoizedState=c.state!==null&&c.state!==void 0?c.state:null,Pa(n),c.updater=Ss,n.stateNode=c,c._reactInternals=n,Va(n,s,e,o),n=Xa(null,n,s,!0,h,o)):(n.tag=0,Fe&&h&&xa(n),mt(null,n,c,o),n=n.child),n;case 16:s=n.elementType;e:{switch(Es(e,n),e=n.pendingProps,c=s._init,s=c(s._payload),n.type=s,c=n.tag=F0(s),e=Xt(s,e),c){case 0:n=Ya(null,n,s,e,o);break e;case 1:n=sf(null,n,s,e,o);break e;case 11:n=ef(null,n,s,e,o);break e;case 14:n=tf(null,n,s,Xt(s.type,e),o);break e}throw Error(i(306,s,""))}return n;case 0:return s=n.type,c=n.pendingProps,c=n.elementType===s?c:Xt(s,c),Ya(e,n,s,c,o);case 1:return s=n.type,c=n.pendingProps,c=n.elementType===s?c:Xt(s,c),sf(e,n,s,c,o);case 3:e:{if(lf(n),e===null)throw Error(i(387));s=n.pendingProps,h=n.memoizedState,c=h.element,_d(e,n),ms(n,s,null,o);var w=n.memoizedState;if(s=w.element,h.isDehydrated)if(h={element:s,isDehydrated:!1,cache:w.cache,pendingSuspenseBoundaries:w.pendingSuspenseBoundaries,transitions:w.transitions},n.updateQueue.baseState=h,n.memoizedState=h,n.flags&256){c=no(Error(i(423)),n),n=af(e,n,s,o,c);break e}else if(s!==c){c=no(Error(i(424)),n),n=af(e,n,s,o,c);break e}else for(bt=An(n.stateNode.containerInfo.firstChild),It=n,Fe=!0,Yt=null,o=xd(n,null,s,o),n.child=o;o;)o.flags=o.flags&-3|4096,o=o.sibling;else{if(qr(),s===c){n=_n(e,n,o);break e}mt(e,n,s,o)}n=n.child}return n;case 5:return Ed(n),e===null&&Sa(n),s=n.type,c=n.pendingProps,h=e!==null?e.memoizedProps:null,w=c.children,ha(s,c)?w=null:h!==null&&ha(s,h)&&(n.flags|=32),of(e,n),mt(e,n,w,o),n.child;case 6:return e===null&&Sa(n),null;case 13:return uf(e,n,o);case 4:return Ia(n,n.stateNode.containerInfo),s=n.pendingProps,e===null?n.child=Zr(n,null,s,o):mt(e,n,s,o),n.child;case 11:return s=n.type,c=n.pendingProps,c=n.elementType===s?c:Xt(s,c),ef(e,n,s,c,o);case 7:return mt(e,n,n.pendingProps,o),n.child;case 8:return mt(e,n,n.pendingProps.children,o),n.child;case 12:return mt(e,n,n.pendingProps.children,o),n.child;case 10:e:{if(s=n.type._context,c=n.pendingProps,h=n.memoizedProps,w=c.value,Ae(fs,s._currentValue),s._currentValue=w,h!==null)if(Wt(h.value,w)){if(h.children===c.children&&!vt.current){n=_n(e,n,o);break e}}else for(h=n.child,h!==null&&(h.return=n);h!==null;){var I=h.dependencies;if(I!==null){w=h.child;for(var L=I.firstContext;L!==null;){if(L.context===s){if(h.tag===1){L=wn(-1,o&-o),L.tag=2;var q=h.updateQueue;if(q!==null){q=q.shared;var ie=q.pending;ie===null?L.next=L:(L.next=ie.next,ie.next=L),q.pending=L}}h.lanes|=o,L=h.alternate,L!==null&&(L.lanes|=o),ja(h.return,o,n),I.lanes|=o;break}L=L.next}}else if(h.tag===10)w=h.type===n.type?null:h.child;else if(h.tag===18){if(w=h.return,w===null)throw Error(i(341));w.lanes|=o,I=w.alternate,I!==null&&(I.lanes|=o),ja(w,o,n),w=h.sibling}else w=h.child;if(w!==null)w.return=h;else for(w=h;w!==null;){if(w===n){w=null;break}if(h=w.sibling,h!==null){h.return=w.return,w=h;break}w=w.return}h=w}mt(e,n,c.children,o),n=n.child}return n;case 9:return c=n.type,s=n.pendingProps.children,eo(n,o),c=Ot(c),s=s(c),n.flags|=1,mt(e,n,s,o),n.child;case 14:return s=n.type,c=Xt(s,n.pendingProps),c=Xt(s.type,c),tf(e,n,s,c,o);case 15:return nf(e,n,n.type,n.pendingProps,o);case 17:return s=n.type,c=n.pendingProps,c=n.elementType===s?c:Xt(s,c),Es(e,n),n.tag=1,xt(s)?(e=!0,ss(n)):e=!1,eo(n,o),Xd(n,s,c),Va(n,s,c,o),Xa(null,n,s,!0,e,o);case 19:return df(e,n,o);case 22:return rf(e,n,o)}throw Error(i(156,n.tag))};function zf(e,n){return Ai(e,n)}function O0(e,n,o,s){this.tag=e,this.key=o,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=n,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=s,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Bt(e,n,o,s){return new O0(e,n,o,s)}function hu(e){return e=e.prototype,!(!e||!e.isReactComponent)}function F0(e){if(typeof e=="function")return hu(e)?1:0;if(e!=null){if(e=e.$$typeof,e===te)return 11;if(e===W)return 14}return 2}function Xn(e,n){var o=e.alternate;return o===null?(o=Bt(e.tag,n,e.key,e.mode),o.elementType=e.elementType,o.type=e.type,o.stateNode=e.stateNode,o.alternate=e,e.alternate=o):(o.pendingProps=n,o.type=e.type,o.flags=0,o.subtreeFlags=0,o.deletions=null),o.flags=e.flags&14680064,o.childLanes=e.childLanes,o.lanes=e.lanes,o.child=e.child,o.memoizedProps=e.memoizedProps,o.memoizedState=e.memoizedState,o.updateQueue=e.updateQueue,n=e.dependencies,o.dependencies=n===null?null:{lanes:n.lanes,firstContext:n.firstContext},o.sibling=e.sibling,o.index=e.index,o.ref=e.ref,o}function zs(e,n,o,s,c,h){var w=2;if(s=e,typeof e=="function")hu(e)&&(w=1);else if(typeof e=="string")w=5;else e:switch(e){case H:return xr(o.children,c,h,n);case X:w=8,c|=8;break;case V:return e=Bt(12,o,n,c|2),e.elementType=V,e.lanes=h,e;case J:return e=Bt(13,o,n,c),e.elementType=J,e.lanes=h,e;case M:return e=Bt(19,o,n,c),e.elementType=M,e.lanes=h,e;case U:return As(o,c,h,n);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ee:w=10;break e;case Z:w=9;break e;case te:w=11;break e;case W:w=14;break e;case B:w=16,s=null;break e}throw Error(i(130,e==null?e:typeof e,""))}return n=Bt(w,o,n,c),n.elementType=e,n.type=s,n.lanes=h,n}function xr(e,n,o,s){return e=Bt(7,e,s,n),e.lanes=o,e}function As(e,n,o,s){return e=Bt(22,e,s,n),e.elementType=U,e.lanes=o,e.stateNode={isHidden:!1},e}function pu(e,n,o){return e=Bt(6,e,null,n),e.lanes=o,e}function mu(e,n,o){return n=Bt(4,e.children!==null?e.children:[],e.key,n),n.lanes=o,n.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},n}function H0(e,n,o,s,c){this.tag=n,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=sr(0),this.expirationTimes=sr(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=sr(0),this.identifierPrefix=s,this.onRecoverableError=c,this.mutableSourceEagerHydrationData=null}function gu(e,n,o,s,c,h,w,I,L){return e=new H0(e,n,o,I,L),n===1?(n=1,h===!0&&(n|=8)):n=0,h=Bt(3,null,null,n),e.current=h,h.stateNode=e,h.memoizedState={element:s,isDehydrated:o,cache:null,transitions:null,pendingSuspenseBoundaries:null},Pa(h),e}function B0(e,n,o){var s=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(r){console.error(r)}}return t(),Su.exports=ey(),Su.exports}var Qf;function ty(){if(Qf)return Vs;Qf=1;var t=xp();return Vs.createRoot=t.createRoot,Vs.hydrateRoot=t.hydrateRoot,Vs}var ny=ty();function ry(t,r="Request failed"){const i=(t||"").trim();if(!i)return r;try{const a=JSON.parse(i).detail;if(typeof a=="string"&&a.trim())return a;if(Array.isArray(a)){const u=a.map(d=>typeof d=="string"?d:d&&typeof d=="object"&&"msg"in d?String(d.msg):"").filter(Boolean);if(u.length)return u.join("; ")}}catch{}return i}async function yt(t,r){const i=await fetch(t,{...r,headers:{"Content-Type":"application/json",...(r==null?void 0:r.headers)||{}}});if(!i.ok){const l=await i.text();throw new Error(ry(l,i.statusText||"Request failed"))}return i.json()}const oy=["github_token","bitbucket_token","ai_api_key","ai_model","ai_base_url"],ft={health:()=>yt("/api/health"),settings:()=>yt("/api/settings"),saveSettings:t=>{const r={...t};for(const i of oy)r[i]===""&&delete r[i];return yt("/api/settings",{method:"PUT",body:JSON.stringify(r)})},repos:()=>yt("/api/repos"),browse:t=>yt(`/api/fs${t?`?path=${encodeURIComponent(t)}`:""}`),gitRefs:(t,r=50)=>yt(`/api/git/refs?repo_path=${encodeURIComponent(t)}&limit=${r}`),index:(t,r=!0)=>yt("/api/index",{method:"POST",body:JSON.stringify({repo_path:t,incremental:r})}),indexStatus:t=>yt(`/api/index?repo_path=${encodeURIComponent(t)}`),architecture:t=>yt(`/api/architecture?repo_path=${encodeURIComponent(t)}`),review:(t,r,i,l=!0)=>yt("/api/review",{method:"POST",body:JSON.stringify({repo_path:t,base:r,head:i||null,reindex:l,incremental:!0,three_dot:!0})}),init:(t,r=!1)=>yt("/api/init",{method:"POST",body:JSON.stringify({repo_path:t,overwrite:r})}),postComment:(t,r,i,l)=>yt("/api/prs/comment",{method:"POST",body:JSON.stringify({provider:t,repo:r,number:i,markdown:l})}),graph:(t,r="full")=>yt(`/api/graph?repo_path=${encodeURIComponent(t)}&scope=${r}`),prs:(t,r,i="open")=>yt("/api/prs",{method:"POST",body:JSON.stringify({provider:t,repo:r,state:i})}),residual:t=>yt("/api/ai/residual",{method:"POST",body:JSON.stringify({review:t})})};function di(t){return t.replaceAll("_"," ")}function iy(t){return t.replaceAll("_"," ")}function gl(t){return t.split(".").pop()||t}function sy(t){if(!t)return"";const r=new Date(t);return Number.isNaN(r.getTime())?t:r.toLocaleString()}function ao(t){return t.replace(/([/\\._:@-])/g,"$1​")}function Pr({className:t,children:r}){return m.jsx("svg",{className:t,width:"16",height:"16",viewBox:"0 0 16 16",fill:"none",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",children:r})}function ly({className:t}){return m.jsxs(Pr,{className:t,children:[m.jsx("path",{d:"M3 3.5h6.5L13 7v5.5H3z"}),m.jsx("path",{d:"M9.5 3.5V7H13"}),m.jsx("path",{d:"M5.5 9.5h5M5.5 11.5h3.5"})]})}function ay({className:t}){return m.jsxs(Pr,{className:t,children:[m.jsx("rect",{x:"2.5",y:"2.5",width:"4.5",height:"4.5",rx:"0.8"}),m.jsx("rect",{x:"9",y:"2.5",width:"4.5",height:"4.5",rx:"0.8"}),m.jsx("rect",{x:"2.5",y:"9",width:"4.5",height:"4.5",rx:"0.8"}),m.jsx("rect",{x:"9",y:"9",width:"4.5",height:"4.5",rx:"0.8"})]})}function uy({className:t}){return m.jsxs(Pr,{className:t,children:[m.jsx("circle",{cx:"4",cy:"8",r:"1.6"}),m.jsx("circle",{cx:"12",cy:"4",r:"1.6"}),m.jsx("circle",{cx:"12",cy:"12",r:"1.6"}),m.jsx("path",{d:"M5.5 7.2 10.4 4.8M5.5 8.8 10.4 11.2"})]})}function cy({className:t}){return m.jsxs(Pr,{className:t,children:[m.jsx("circle",{cx:"4.5",cy:"4",r:"1.4"}),m.jsx("circle",{cx:"4.5",cy:"12",r:"1.4"}),m.jsx("circle",{cx:"11.5",cy:"12",r:"1.4"}),m.jsx("path",{d:"M4.5 5.5v5M4.5 8h4.2a3 3 0 0 1 3 3"})]})}function dy({className:t}){return m.jsxs(Pr,{className:t,children:[m.jsx("circle",{cx:"8",cy:"8",r:"2.1"}),m.jsx("path",{d:"M8 2.5v1.6M8 11.9v1.6M2.5 8h1.6M11.9 8h1.6M4.1 4.1l1.1 1.1M10.8 10.8l1.1 1.1M11.9 4.1l-1.1 1.1M5.2 10.8l-1.1 1.1"})]})}function wp({className:t}){return m.jsx(Pr,{className:t,children:m.jsx("path",{d:"M2.5 4.5h4L8 6h5.5v6.5h-11z"})})}function fy({className:t}){return m.jsx(Pr,{className:t,children:m.jsx("path",{d:"M4 6.5 8 10.5 12 6.5"})})}const hy="modulepreload",py=function(t,r){return new URL(t,r).href},Kf={},my=function(r,i,l){let a=Promise.resolve();if(i&&i.length>0){let d=function(g){return Promise.all(g.map(x=>Promise.resolve(x).then(v=>({status:"fulfilled",value:v}),v=>({status:"rejected",reason:v}))))};const f=document.getElementsByTagName("link"),p=document.querySelector("meta[property=csp-nonce]"),y=(p==null?void 0:p.nonce)||(p==null?void 0:p.getAttribute("nonce"));a=d(i.map(g=>{if(g=py(g,l),g in Kf)return;Kf[g]=!0;const x=g.endsWith(".css"),v=x?'[rel="stylesheet"]':"";if(!!l)for(let C=f.length-1;C>=0;C--){const E=f[C];if(E.href===g&&(!x||E.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${g}"]${v}`))return;const S=document.createElement("link");if(S.rel=x?"stylesheet":hy,x||(S.as="script"),S.crossOrigin="",S.href=g,y&&S.setAttribute("nonce",y),document.head.appendChild(S),x)return new Promise((C,E)=>{S.addEventListener("load",C),S.addEventListener("error",()=>E(new Error(`Unable to preload CSS for ${g}`)))})}))}function u(d){const f=new Event("vite:preloadError",{cancelable:!0});if(f.payload=d,window.dispatchEvent(f),!f.defaultPrevented)throw d}return a.then(d=>{for(const f of d||[])f.status==="rejected"&&u(f.reason);return r().catch(u)})};function Qe(t){if(typeof t=="string"||typeof t=="number")return""+t;let r="";if(Array.isArray(t))for(let i=0,l;i{}};function yl(){for(var t=0,r=arguments.length,i={},l;t=0&&(l=i.slice(a+1),i=i.slice(0,a)),i&&!r.hasOwnProperty(i))throw new Error("unknown type: "+i);return{type:i,name:l}})}el.prototype=yl.prototype={constructor:el,on:function(t,r){var i=this._,l=yy(t+"",i),a,u=-1,d=l.length;if(arguments.length<2){for(;++u0)for(var i=new Array(a),l=0,a,u;l=0&&(r=t.slice(0,i))!=="xmlns"&&(t=t.slice(i+1)),Zf.hasOwnProperty(r)?{space:Zf[r],local:t}:t}function xy(t){return function(){var r=this.ownerDocument,i=this.namespaceURI;return i===Ou&&r.documentElement.namespaceURI===Ou?r.createElement(t):r.createElementNS(i,t)}}function wy(t){return function(){return this.ownerDocument.createElementNS(t.space,t.local)}}function _p(t){var r=vl(t);return(r.local?wy:xy)(r)}function _y(){}function Ju(t){return t==null?_y:function(){return this.querySelector(t)}}function Sy(t){typeof t!="function"&&(t=Ju(t));for(var r=this._groups,i=r.length,l=new Array(i),a=0;a=k&&(k=b+1);!(R=E[k])&&++k=0;)(d=l[a])&&(u&&d.compareDocumentPosition(u)^4&&u.parentNode.insertBefore(d,u),u=d);return this}function Xy(t){t||(t=Gy);function r(x,v){return x&&v?t(x.__data__,v.__data__):!x-!v}for(var i=this._groups,l=i.length,a=new Array(l),u=0;ur?1:t>=r?0:NaN}function Qy(){var t=arguments[0];return arguments[0]=this,t.apply(null,arguments),this}function Ky(){return Array.from(this)}function qy(){for(var t=this._groups,r=0,i=t.length;r1?this.each((r==null?av:typeof r=="function"?cv:uv)(t,r,i??"")):ho(this.node(),t)}function ho(t,r){return t.style.getPropertyValue(r)||Cp(t).getComputedStyle(t,null).getPropertyValue(r)}function fv(t){return function(){delete this[t]}}function hv(t,r){return function(){this[t]=r}}function pv(t,r){return function(){var i=r.apply(this,arguments);i==null?delete this[t]:this[t]=i}}function mv(t,r){return arguments.length>1?this.each((r==null?fv:typeof r=="function"?pv:hv)(t,r)):this.node()[t]}function jp(t){return t.trim().split(/^|\s+/)}function ec(t){return t.classList||new Mp(t)}function Mp(t){this._node=t,this._names=jp(t.getAttribute("class")||"")}Mp.prototype={add:function(t){var r=this._names.indexOf(t);r<0&&(this._names.push(t),this._node.setAttribute("class",this._names.join(" ")))},remove:function(t){var r=this._names.indexOf(t);r>=0&&(this._names.splice(r,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};function Pp(t,r){for(var i=ec(t),l=-1,a=r.length;++l=0&&(i=r.slice(l+1),r=r.slice(0,l)),{type:r,name:i}})}function Vv(t){return function(){var r=this.__on;if(r){for(var i=0,l=-1,a=r.length,u;i()=>t;function Fu(t,{sourceEvent:r,subject:i,target:l,identifier:a,active:u,x:d,y:f,dx:p,dy:y,dispatch:g}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:r,enumerable:!0,configurable:!0},subject:{value:i,enumerable:!0,configurable:!0},target:{value:l,enumerable:!0,configurable:!0},identifier:{value:a,enumerable:!0,configurable:!0},active:{value:u,enumerable:!0,configurable:!0},x:{value:d,enumerable:!0,configurable:!0},y:{value:f,enumerable:!0,configurable:!0},dx:{value:p,enumerable:!0,configurable:!0},dy:{value:y,enumerable:!0,configurable:!0},_:{value:g}})}Fu.prototype.on=function(){var t=this._.on.apply(this._,arguments);return t===this._?this:t};function Jv(t){return!t.ctrlKey&&!t.button}function ex(){return this.parentNode}function tx(t,r){return r??{x:t.x,y:t.y}}function nx(){return navigator.maxTouchPoints||"ontouchstart"in this}function zp(){var t=Jv,r=ex,i=tx,l=nx,a={},u=yl("start","drag","end"),d=0,f,p,y,g,x=0;function v(j){j.on("mousedown.drag",_).filter(l).on("touchstart.drag",E).on("touchmove.drag",N,Zv).on("touchend.drag touchcancel.drag",b).style("touch-action","none").style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}function _(j,R){if(!(g||!t.call(this,j,R))){var D=k(this,r.call(this,j,R),j,R,"mouse");D&&(Rt(j.view).on("mousemove.drag",S,fi).on("mouseup.drag",C,fi),Rp(j.view),Nu(j),y=!1,f=j.clientX,p=j.clientY,D("start",j))}}function S(j){if(co(j),!y){var R=j.clientX-f,D=j.clientY-p;y=R*R+D*D>x}a.mouse("drag",j)}function C(j){Rt(j.view).on("mousemove.drag mouseup.drag",null),Lp(j.view,y),co(j),a.mouse("end",j)}function E(j,R){if(t.call(this,j,R)){var D=j.changedTouches,H=r.call(this,j,R),X=D.length,V,ee;for(V=0;V>8&15|r>>4&240,r>>4&15|r&240,(r&15)<<4|r&15,1):i===8?Ws(r>>24&255,r>>16&255,r>>8&255,(r&255)/255):i===4?Ws(r>>12&15|r>>8&240,r>>8&15|r>>4&240,r>>4&15|r&240,((r&15)<<4|r&15)/255):null):(r=ox.exec(t))?new Et(r[1],r[2],r[3],1):(r=ix.exec(t))?new Et(r[1]*255/100,r[2]*255/100,r[3]*255/100,1):(r=sx.exec(t))?Ws(r[1],r[2],r[3],r[4]):(r=lx.exec(t))?Ws(r[1]*255/100,r[2]*255/100,r[3]*255/100,r[4]):(r=ax.exec(t))?ih(r[1],r[2]/100,r[3]/100,1):(r=ux.exec(t))?ih(r[1],r[2]/100,r[3]/100,r[4]):Jf.hasOwnProperty(t)?nh(Jf[t]):t==="transparent"?new Et(NaN,NaN,NaN,0):null}function nh(t){return new Et(t>>16&255,t>>8&255,t&255,1)}function Ws(t,r,i,l){return l<=0&&(t=r=i=NaN),new Et(t,r,i,l)}function fx(t){return t instanceof Ei||(t=Er(t)),t?(t=t.rgb(),new Et(t.r,t.g,t.b,t.opacity)):new Et}function Hu(t,r,i,l){return arguments.length===1?fx(t):new Et(t,r,i,l??1)}function Et(t,r,i,l){this.r=+t,this.g=+r,this.b=+i,this.opacity=+l}tc(Et,Hu,Ap(Ei,{brighter(t){return t=t==null?sl:Math.pow(sl,t),new Et(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=t==null?hi:Math.pow(hi,t),new Et(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Et(Sr(this.r),Sr(this.g),Sr(this.b),ll(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:rh,formatHex:rh,formatHex8:hx,formatRgb:oh,toString:oh}));function rh(){return`#${_r(this.r)}${_r(this.g)}${_r(this.b)}`}function hx(){return`#${_r(this.r)}${_r(this.g)}${_r(this.b)}${_r((isNaN(this.opacity)?1:this.opacity)*255)}`}function oh(){const t=ll(this.opacity);return`${t===1?"rgb(":"rgba("}${Sr(this.r)}, ${Sr(this.g)}, ${Sr(this.b)}${t===1?")":`, ${t})`}`}function ll(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Sr(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function _r(t){return t=Sr(t),(t<16?"0":"")+t.toString(16)}function ih(t,r,i,l){return l<=0?t=r=i=NaN:i<=0||i>=1?t=r=NaN:r<=0&&(t=NaN),new Zt(t,r,i,l)}function Dp(t){if(t instanceof Zt)return new Zt(t.h,t.s,t.l,t.opacity);if(t instanceof Ei||(t=Er(t)),!t)return new Zt;if(t instanceof Zt)return t;t=t.rgb();var r=t.r/255,i=t.g/255,l=t.b/255,a=Math.min(r,i,l),u=Math.max(r,i,l),d=NaN,f=u-a,p=(u+a)/2;return f?(r===u?d=(i-l)/f+(i0&&p<1?0:d,new Zt(d,f,p,t.opacity)}function px(t,r,i,l){return arguments.length===1?Dp(t):new Zt(t,r,i,l??1)}function Zt(t,r,i,l){this.h=+t,this.s=+r,this.l=+i,this.opacity=+l}tc(Zt,px,Ap(Ei,{brighter(t){return t=t==null?sl:Math.pow(sl,t),new Zt(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=t==null?hi:Math.pow(hi,t),new Zt(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+(this.h<0)*360,r=isNaN(t)||isNaN(this.s)?0:this.s,i=this.l,l=i+(i<.5?i:1-i)*r,a=2*i-l;return new Et(Cu(t>=240?t-240:t+120,a,l),Cu(t,a,l),Cu(t<120?t+240:t-120,a,l),this.opacity)},clamp(){return new Zt(sh(this.h),Ys(this.s),Ys(this.l),ll(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=ll(this.opacity);return`${t===1?"hsl(":"hsla("}${sh(this.h)}, ${Ys(this.s)*100}%, ${Ys(this.l)*100}%${t===1?")":`, ${t})`}`}}));function sh(t){return t=(t||0)%360,t<0?t+360:t}function Ys(t){return Math.max(0,Math.min(1,t||0))}function Cu(t,r,i){return(t<60?r+(i-r)*t/60:t<180?i:t<240?r+(i-r)*(240-t)/60:r)*255}const nc=t=>()=>t;function mx(t,r){return function(i){return t+i*r}}function gx(t,r,i){return t=Math.pow(t,i),r=Math.pow(r,i)-t,i=1/i,function(l){return Math.pow(t+l*r,i)}}function yx(t){return(t=+t)==1?$p:function(r,i){return i-r?gx(r,i,t):nc(isNaN(r)?i:r)}}function $p(t,r){var i=r-t;return i?mx(t,i):nc(isNaN(t)?r:t)}const al=(function t(r){var i=yx(r);function l(a,u){var d=i((a=Hu(a)).r,(u=Hu(u)).r),f=i(a.g,u.g),p=i(a.b,u.b),y=$p(a.opacity,u.opacity);return function(g){return a.r=d(g),a.g=f(g),a.b=p(g),a.opacity=y(g),a+""}}return l.gamma=t,l})(1);function vx(t,r){r||(r=[]);var i=t?Math.min(r.length,t.length):0,l=r.slice(),a;return function(u){for(a=0;ai&&(u=r.slice(i,u),f[d]?f[d]+=u:f[++d]=u),(l=l[0])===(a=a[0])?f[d]?f[d]+=a:f[++d]=a:(f[++d]=null,p.push({i:d,x:cn(l,a)})),i=ju.lastIndex;return i180?g+=360:g-y>180&&(y+=360),v.push({i:x.push(a(x)+"rotate(",null,l)-2,x:cn(y,g)})):g&&x.push(a(x)+"rotate("+g+l)}function f(y,g,x,v){y!==g?v.push({i:x.push(a(x)+"skewX(",null,l)-2,x:cn(y,g)}):g&&x.push(a(x)+"skewX("+g+l)}function p(y,g,x,v,_,S){if(y!==x||g!==v){var C=_.push(a(_)+"scale(",null,",",null,")");S.push({i:C-4,x:cn(y,x)},{i:C-2,x:cn(g,v)})}else(x!==1||v!==1)&&_.push(a(_)+"scale("+x+","+v+")")}return function(y,g){var x=[],v=[];return y=t(y),g=t(g),u(y.translateX,y.translateY,g.translateX,g.translateY,x,v),d(y.rotate,g.rotate,x,v),f(y.skewX,g.skewX,x,v),p(y.scaleX,y.scaleY,g.scaleX,g.scaleY,x,v),y=g=null,function(_){for(var S=-1,C=v.length,E;++S=0&&t._call.call(void 0,r),t=t._next;--po}function uh(){Nr=(cl=mi.now())+xl,po=li=0;try{Rx()}finally{po=0,zx(),Nr=0}}function Lx(){var t=mi.now(),r=t-cl;r>Bp&&(xl-=r,cl=t)}function zx(){for(var t,r=ul,i,l=1/0;r;)r._call?(l>r._time&&(l=r._time),t=r,r=r._next):(i=r._next,r._next=null,r=t?t._next=i:ul=i);ai=t,Uu(l)}function Uu(t){if(!po){li&&(li=clearTimeout(li));var r=t-Nr;r>24?(t<1/0&&(li=setTimeout(uh,t-mi.now()-xl)),ii&&(ii=clearInterval(ii))):(ii||(cl=mi.now(),ii=setInterval(Lx,Bp)),po=1,Vp(uh))}}function ch(t,r,i){var l=new dl;return r=r==null?0:+r,l.restart(a=>{l.stop(),t(a+r)},r,i),l}var Ax=yl("start","end","cancel","interrupt"),Dx=[],Wp=0,dh=1,Wu=2,nl=3,fh=4,Yu=5,rl=6;function wl(t,r,i,l,a,u){var d=t.__transition;if(!d)t.__transition={};else if(i in d)return;$x(t,i,{name:r,index:l,group:a,on:Ax,tween:Dx,time:u.time,delay:u.delay,duration:u.duration,ease:u.ease,timer:null,state:Wp})}function oc(t,r){var i=nn(t,r);if(i.state>Wp)throw new Error("too late; already scheduled");return i}function fn(t,r){var i=nn(t,r);if(i.state>nl)throw new Error("too late; already running");return i}function nn(t,r){var i=t.__transition;if(!i||!(i=i[r]))throw new Error("transition not found");return i}function $x(t,r,i){var l=t.__transition,a;l[r]=i,i.timer=Up(u,0,i.time);function u(y){i.state=dh,i.timer.restart(d,i.delay,i.time),i.delay<=y&&d(y-i.delay)}function d(y){var g,x,v,_;if(i.state!==dh)return p();for(g in l)if(_=l[g],_.name===i.name){if(_.state===nl)return ch(d);_.state===fh?(_.state=rl,_.timer.stop(),_.on.call("interrupt",t,t.__data__,_.index,_.group),delete l[g]):+gWu&&l.state=0&&(r=r.slice(0,i)),!r||r==="start"})}function pw(t,r,i){var l,a,u=hw(r)?oc:fn;return function(){var d=u(this,t),f=d.on;f!==l&&(a=(l=f).copy()).on(r,i),d.on=a}}function mw(t,r){var i=this._id;return arguments.length<2?nn(this.node(),i).on.on(t):this.each(pw(i,t,r))}function gw(t){return function(){var r=this.parentNode;for(var i in this.__transition)if(+i!==t)return;r&&r.removeChild(this)}}function yw(){return this.on("end.remove",gw(this._id))}function vw(t){var r=this._name,i=this._id;typeof t!="function"&&(t=Ju(t));for(var l=this._groups,a=l.length,u=new Array(a),d=0;d()=>t;function Vw(t,{sourceEvent:r,target:i,transform:l,dispatch:a}){Object.defineProperties(this,{type:{value:t,enumerable:!0,configurable:!0},sourceEvent:{value:r,enumerable:!0,configurable:!0},target:{value:i,enumerable:!0,configurable:!0},transform:{value:l,enumerable:!0,configurable:!0},_:{value:a}})}function En(t,r,i){this.k=t,this.x=r,this.y=i}En.prototype={constructor:En,scale:function(t){return t===1?this:new En(this.k*t,this.x,this.y)},translate:function(t,r){return t===0&r===0?this:new En(this.k,this.x+this.k*t,this.y+this.k*r)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};var _l=new En(1,0,0);Qp.prototype=En.prototype;function Qp(t){for(;!t.__zoom;)if(!(t=t.parentNode))return _l;return t.__zoom}function Mu(t){t.stopImmediatePropagation()}function si(t){t.preventDefault(),t.stopImmediatePropagation()}function Uw(t){return(!t.ctrlKey||t.type==="wheel")&&!t.button}function Ww(){var t=this;return t instanceof SVGElement?(t=t.ownerSVGElement||t,t.hasAttribute("viewBox")?(t=t.viewBox.baseVal,[[t.x,t.y],[t.x+t.width,t.y+t.height]]):[[0,0],[t.width.baseVal.value,t.height.baseVal.value]]):[[0,0],[t.clientWidth,t.clientHeight]]}function hh(){return this.__zoom||_l}function Yw(t){return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*(t.ctrlKey?10:1)}function Xw(){return navigator.maxTouchPoints||"ontouchstart"in this}function Gw(t,r,i){var l=t.invertX(r[0][0])-i[0][0],a=t.invertX(r[1][0])-i[1][0],u=t.invertY(r[0][1])-i[0][1],d=t.invertY(r[1][1])-i[1][1];return t.translate(a>l?(l+a)/2:Math.min(0,l)||Math.max(0,a),d>u?(u+d)/2:Math.min(0,u)||Math.max(0,d))}function Kp(){var t=Uw,r=Ww,i=Gw,l=Yw,a=Xw,u=[0,1/0],d=[[-1/0,-1/0],[1/0,1/0]],f=250,p=tl,y=yl("start","zoom","end"),g,x,v,_=500,S=150,C=0,E=10;function N(M){M.property("__zoom",hh).on("wheel.zoom",X,{passive:!1}).on("mousedown.zoom",V).on("dblclick.zoom",ee).filter(a).on("touchstart.zoom",Z).on("touchmove.zoom",te).on("touchend.zoom touchcancel.zoom",J).style("-webkit-tap-highlight-color","rgba(0,0,0,0)")}N.transform=function(M,W,B,U){var A=M.selection?M.selection():M;A.property("__zoom",hh),M!==A?R(M,W,B,U):A.interrupt().each(function(){D(this,arguments).event(U).start().zoom(null,typeof W=="function"?W.apply(this,arguments):W).end()})},N.scaleBy=function(M,W,B,U){N.scaleTo(M,function(){var A=this.__zoom.k,z=typeof W=="function"?W.apply(this,arguments):W;return A*z},B,U)},N.scaleTo=function(M,W,B,U){N.transform(M,function(){var A=r.apply(this,arguments),z=this.__zoom,F=B==null?j(A):typeof B=="function"?B.apply(this,arguments):B,P=z.invert(F),T=typeof W=="function"?W.apply(this,arguments):W;return i(k(b(z,T),F,P),A,d)},B,U)},N.translateBy=function(M,W,B,U){N.transform(M,function(){return i(this.__zoom.translate(typeof W=="function"?W.apply(this,arguments):W,typeof B=="function"?B.apply(this,arguments):B),r.apply(this,arguments),d)},null,U)},N.translateTo=function(M,W,B,U,A){N.transform(M,function(){var z=r.apply(this,arguments),F=this.__zoom,P=U==null?j(z):typeof U=="function"?U.apply(this,arguments):U;return i(_l.translate(P[0],P[1]).scale(F.k).translate(typeof W=="function"?-W.apply(this,arguments):-W,typeof B=="function"?-B.apply(this,arguments):-B),z,d)},U,A)};function b(M,W){return W=Math.max(u[0],Math.min(u[1],W)),W===M.k?M:new En(W,M.x,M.y)}function k(M,W,B){var U=W[0]-B[0]*M.k,A=W[1]-B[1]*M.k;return U===M.x&&A===M.y?M:new En(M.k,U,A)}function j(M){return[(+M[0][0]+ +M[1][0])/2,(+M[0][1]+ +M[1][1])/2]}function R(M,W,B,U){M.on("start.zoom",function(){D(this,arguments).event(U).start()}).on("interrupt.zoom end.zoom",function(){D(this,arguments).event(U).end()}).tween("zoom",function(){var A=this,z=arguments,F=D(A,z).event(U),P=r.apply(A,z),T=B==null?j(P):typeof B=="function"?B.apply(A,z):B,ne=Math.max(P[1][0]-P[0][0],P[1][1]-P[0][1]),re=A.__zoom,ue=typeof W=="function"?W.apply(A,z):W,ce=p(re.invert(T).concat(ne/re.k),ue.invert(T).concat(ne/ue.k));return function(de){if(de===1)de=ue;else{var Q=ce(de),se=ne/Q[2];de=new En(se,T[0]-Q[0]*se,T[1]-Q[1]*se)}F.zoom(null,de)}})}function D(M,W,B){return!B&&M.__zooming||new H(M,W)}function H(M,W){this.that=M,this.args=W,this.active=0,this.sourceEvent=null,this.extent=r.apply(M,W),this.taps=0}H.prototype={event:function(M){return M&&(this.sourceEvent=M),this},start:function(){return++this.active===1&&(this.that.__zooming=this,this.emit("start")),this},zoom:function(M,W){return this.mouse&&M!=="mouse"&&(this.mouse[1]=W.invert(this.mouse[0])),this.touch0&&M!=="touch"&&(this.touch0[1]=W.invert(this.touch0[0])),this.touch1&&M!=="touch"&&(this.touch1[1]=W.invert(this.touch1[0])),this.that.__zoom=W,this.emit("zoom"),this},end:function(){return--this.active===0&&(delete this.that.__zooming,this.emit("end")),this},emit:function(M){var W=Rt(this.that).datum();y.call(M,this.that,new Vw(M,{sourceEvent:this.sourceEvent,target:N,transform:this.that.__zoom,dispatch:y}),W)}};function X(M,...W){if(!t.apply(this,arguments))return;var B=D(this,W).event(M),U=this.__zoom,A=Math.max(u[0],Math.min(u[1],U.k*Math.pow(2,l.apply(this,arguments)))),z=qt(M);if(B.wheel)(B.mouse[0][0]!==z[0]||B.mouse[0][1]!==z[1])&&(B.mouse[1]=U.invert(B.mouse[0]=z)),clearTimeout(B.wheel);else{if(U.k===A)return;B.mouse=[z,U.invert(z)],ol(this),B.start()}si(M),B.wheel=setTimeout(F,S),B.zoom("mouse",i(k(b(U,A),B.mouse[0],B.mouse[1]),B.extent,d));function F(){B.wheel=null,B.end()}}function V(M,...W){if(v||!t.apply(this,arguments))return;var B=M.currentTarget,U=D(this,W,!0).event(M),A=Rt(M.view).on("mousemove.zoom",T,!0).on("mouseup.zoom",ne,!0),z=qt(M,B),F=M.clientX,P=M.clientY;Rp(M.view),Mu(M),U.mouse=[z,this.__zoom.invert(z)],ol(this),U.start();function T(re){if(si(re),!U.moved){var ue=re.clientX-F,ce=re.clientY-P;U.moved=ue*ue+ce*ce>C}U.event(re).zoom("mouse",i(k(U.that.__zoom,U.mouse[0]=qt(re,B),U.mouse[1]),U.extent,d))}function ne(re){A.on("mousemove.zoom mouseup.zoom",null),Lp(re.view,U.moved),si(re),U.event(re).end()}}function ee(M,...W){if(t.apply(this,arguments)){var B=this.__zoom,U=qt(M.changedTouches?M.changedTouches[0]:M,this),A=B.invert(U),z=B.k*(M.shiftKey?.5:2),F=i(k(b(B,z),U,A),r.apply(this,W),d);si(M),f>0?Rt(this).transition().duration(f).call(R,F,U,M):Rt(this).call(N.transform,F,U,M)}}function Z(M,...W){if(t.apply(this,arguments)){var B=M.touches,U=B.length,A=D(this,W,M.changedTouches.length===U).event(M),z,F,P,T;for(Mu(M),F=0;F`Seems like you have not used ${t==="svelte"?"SvelteFlowProvider":"ReactFlowProvider"} as an ancestor. Help: https://${t}flow.dev/error#001`,error002:()=>"It looks like you've created a new nodeTypes or edgeTypes object. If this wasn't on purpose please define the nodeTypes/edgeTypes outside of the component or memoize them.",error003:t=>`Node type "${t}" not found. Using fallback type "default".`,error004:()=>"The parent container needs a width and a height to render the graph.",error005:()=>"Only child nodes can use a parent extent.",error006:()=>"Can't create edge. An edge needs a source and a target.",error007:t=>`The old edge with id=${t} does not exist.`,error009:t=>`Marker type "${t}" doesn't exist.`,error008:(t,{id:r,sourceHandle:i,targetHandle:l})=>`Couldn't create edge for ${t} handle id: "${t==="source"?i:l}", edge id: ${r}.`,error010:()=>"Handle: No node id found. Make sure to only use a Handle inside a custom Node.",error011:t=>`Edge type "${t}" not found. Using fallback type "default".`,error012:t=>`Node with id "${t}" does not exist, it may have been removed. This can happen when a node is deleted before the "onNodeClick" handler is called.`,error013:(t="react")=>`It seems that you haven't loaded the styles. Please import '@xyflow/${t}/dist/style.css' or base.css to make sure everything is working properly.`,error014:()=>"useNodeConnections: No node ID found. Call useNodeConnections inside a custom Node or provide a node ID.",error015:()=>"It seems that you are trying to drag a node that is not initialized. Please use onNodesChange as explained in the docs.",error016:t=>`Edge with id "${t}" does not exist, it may have been removed. This can happen when an edge is deleted before the "onEdgeClick" handler is called.`},gi=[[Number.NEGATIVE_INFINITY,Number.NEGATIVE_INFINITY],[Number.POSITIVE_INFINITY,Number.POSITIVE_INFINITY]],qp=["Enter"," ","Escape"],Zp={"node.a11yDescription.default":"Press enter or space to select a node. Press delete to remove it and escape to cancel.","node.a11yDescription.keyboardDisabled":"Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.","node.a11yDescription.ariaLiveMessage":({direction:t,x:r,y:i})=>`Moved selected node ${t}. New position, x: ${r}, y: ${i}`,"edge.a11yDescription.default":"Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.","controls.ariaLabel":"Control Panel","controls.zoomIn.ariaLabel":"Zoom In","controls.zoomOut.ariaLabel":"Zoom Out","controls.fitView.ariaLabel":"Fit View","controls.interactive.ariaLabel":"Toggle Interactivity","minimap.ariaLabel":"Mini Map","handle.ariaLabel":"Handle"};var mo;(function(t){t.Strict="strict",t.Loose="loose"})(mo||(mo={}));var kr;(function(t){t.Free="free",t.Vertical="vertical",t.Horizontal="horizontal"})(kr||(kr={}));var yi;(function(t){t.Partial="partial",t.Full="full"})(yi||(yi={}));const Jp={inProgress:!1,isValid:null,from:null,fromHandle:null,fromPosition:null,fromNode:null,to:null,toHandle:null,toPosition:null,toNode:null,pointer:null};var Zn;(function(t){t.Bezier="default",t.Straight="straight",t.Step="step",t.SmoothStep="smoothstep",t.SimpleBezier="simplebezier"})(Zn||(Zn={}));var vi;(function(t){t.Arrow="arrow",t.ArrowClosed="arrowclosed"})(vi||(vi={}));var Se;(function(t){t.Left="left",t.Top="top",t.Right="right",t.Bottom="bottom"})(Se||(Se={}));const ph={[Se.Left]:Se.Right,[Se.Right]:Se.Left,[Se.Top]:Se.Bottom,[Se.Bottom]:Se.Top};function em(t){return t===null?null:t?"valid":"invalid"}const tm=t=>!!t&&typeof t=="object"&&"id"in t&&"source"in t&&"target"in t,Qw=t=>!!t&&typeof t=="object"&&"id"in t&&"position"in t&&!("source"in t)&&!("target"in t),sc=t=>!!t&&typeof t=="object"&&"id"in t&&"internals"in t&&!("source"in t)&&!("target"in t),Ni=(t,r=[0,0])=>{const{width:i,height:l}=rn(t),a=t.origin??r,u=i*a[0],d=l*a[1];return{x:t.position.x-u,y:t.position.y-d}},Kw=(t,r={nodeOrigin:[0,0]})=>{if(t.length===0)return{x:0,y:0,width:0,height:0};let i=!1;const l=t.reduce((a,u)=>{const d=typeof u=="string";let f=!r.nodeLookup&&!d?u:void 0;return r.nodeLookup&&(f=d?r.nodeLookup.get(u):sc(u)?u:r.nodeLookup.get(u.id)),f?(i=!0,Sl(a,fl(f,r.nodeOrigin))):a},{x:1/0,y:1/0,x2:-1/0,y2:-1/0});return i?kl(l):{x:0,y:0,width:0,height:0}},Ci=(t,r={})=>{let i={x:1/0,y:1/0,x2:-1/0,y2:-1/0},l=!1;return t.forEach(a=>{(r.filter===void 0||r.filter(a))&&(i=Sl(i,fl(a)),l=!0)}),l?kl(i):{x:0,y:0,width:0,height:0}},lc=(t,r,[i,l,a]=[0,0,1],u=!1,d=!1)=>{const f=(r.x-i)/a,p=(r.y-l)/a,y=r.width/a,g=r.height/a,x=[];for(const v of t.values()){const{measured:_,selectable:S=!0,hidden:C=!1}=v;if(d&&!S||C)continue;const E=_.width??v.width??v.initialWidth??0,N=_.height??v.height??v.initialHeight??0,{x:b,y:k}=v.internals.positionAbsolute,j=im(f,p,y,g,b,k,E,N),R=E*N,D=u&&j>0;(!v.internals.handleBounds||D||j>=R||v.dragging)&&x.push(v)}return x},qw=(t,r)=>{const i=new Set;return t.forEach(l=>{i.add(l.id)}),r.filter(l=>i.has(l.source)||i.has(l.target))};function Zw(t,r){const i=new Map,l=r!=null&&r.nodes?new Set(r.nodes.map(a=>a.id)):null;return t.forEach(a=>{let u;if(r!=null&&r.includeHiddenNodes){const{width:d,height:f}=rn(a);u=d>0&&f>0}else u=!!(a.measured.width&&a.measured.height&&!a.hidden);u&&(!l||l.has(a.id))&&i.set(a.id,a)}),i}async function Jw({nodes:t,width:r,height:i,panZoom:l,minZoom:a,maxZoom:u},d){if(t.size===0)return!0;const f=Zw(t,d),p=Ci(f),y=uc(p,r,i,(d==null?void 0:d.minZoom)??a,(d==null?void 0:d.maxZoom)??u,(d==null?void 0:d.padding)??.1);return await l.setViewport(y,{duration:d==null?void 0:d.duration,ease:d==null?void 0:d.ease,interpolate:d==null?void 0:d.interpolate}),!0}function nm({nodeId:t,nextPosition:r,nodeLookup:i,nodeOrigin:l=[0,0],nodeExtent:a,onError:u}){const d=i.get(t),f=d.parentId?i.get(d.parentId):void 0,{x:p,y}=f?f.internals.positionAbsolute:{x:0,y:0},g=d.origin??l;let x=d.extent||a;if(d.extent==="parent"&&!d.expandParent)if(!f)u==null||u("005",tn.error005());else{const{width:_,height:S}=rn(f);_&&S&&(x=[[p,y],[p+_,y+S]])}else f&&jr(d.extent)&&(x=[[d.extent[0][0]+p,d.extent[0][1]+y],[d.extent[1][0]+p,d.extent[1][1]+y]]);const v=jr(x)?Cr(r,x,d.measured):r;return(d.measured.width===void 0||d.measured.height===void 0)&&(u==null||u("015",tn.error015())),{position:{x:v.x-p+(d.measured.width??0)*g[0],y:v.y-y+(d.measured.height??0)*g[1]},positionAbsolute:v}}async function e1({nodesToRemove:t=[],edgesToRemove:r=[],nodes:i,edges:l,onBeforeDelete:a}){const u=new Set(t.map(v=>v.id)),d=[];for(const v of i){if(v.deletable===!1)continue;const _=u.has(v.id),S=!_&&v.parentId&&d.find(C=>C.id===v.parentId);(_||S)&&d.push(v)}const f=new Set(r.map(v=>v.id)),p=l.filter(v=>v.deletable!==!1),g=qw(d,p);for(const v of p)f.has(v.id)&&!g.find(S=>S.id===v.id)&&g.push(v);if(!a)return{edges:g,nodes:d};const x=await a({nodes:d,edges:g});return typeof x=="boolean"?x?{edges:g,nodes:d}:{edges:[],nodes:[]}:x}const go=(t,r=0,i=1)=>Math.min(Math.max(t,r),i),Cr=(t={x:0,y:0},r,i)=>({x:go(t.x,r[0][0],r[1][0]-((i==null?void 0:i.width)??0)),y:go(t.y,r[0][1],r[1][1]-((i==null?void 0:i.height)??0))});function rm(t,r,i){const{width:l,height:a}=rn(i),{x:u,y:d}=i.internals.positionAbsolute;return Cr(t,[[u,d],[u+l,d+a]],r)}const mh=(t,r,i)=>ti?-go(Math.abs(t-i),1,r)/r:0,ac=(t,r,i=15,l=40)=>{const a=mh(t.x,l,r.width-l)*i,u=mh(t.y,l,r.height-l)*i;return[a,u]},Sl=(t,r)=>({x:Math.min(t.x,r.x),y:Math.min(t.y,r.y),x2:Math.max(t.x2,r.x2),y2:Math.max(t.y2,r.y2)}),Xu=({x:t,y:r,width:i,height:l})=>({x:t,y:r,x2:t+i,y2:r+l}),kl=({x:t,y:r,x2:i,y2:l})=>({x:t,y:r,width:i-t,height:l-r}),xi=(t,r=[0,0])=>{var a,u;const{x:i,y:l}=sc(t)?t.internals.positionAbsolute:Ni(t,r);return{x:i,y:l,width:((a=t.measured)==null?void 0:a.width)??t.width??t.initialWidth??0,height:((u=t.measured)==null?void 0:u.height)??t.height??t.initialHeight??0}},fl=(t,r=[0,0])=>{var a,u;const{x:i,y:l}=sc(t)?t.internals.positionAbsolute:Ni(t,r);return{x:i,y:l,x2:i+(((a=t.measured)==null?void 0:a.width)??t.width??t.initialWidth??0),y2:l+(((u=t.measured)==null?void 0:u.height)??t.height??t.initialHeight??0)}},om=(t,r)=>kl(Sl(Xu(t),Xu(r))),im=(t,r,i,l,a,u,d,f)=>{const p=Math.max(0,Math.min(t+i,a+d)-Math.max(t,a)),y=Math.max(0,Math.min(r+l,u+f)-Math.max(r,u));return Math.ceil(p*y)},hl=(t,r)=>im(t.x,t.y,t.width,t.height,r.x,r.y,r.width,r.height),gh=t=>Jt(t.width)&&Jt(t.height)&&Jt(t.x)&&Jt(t.y),Jt=t=>!isNaN(t)&&isFinite(t),sm=(t,r)=>(i,l)=>{},ji=(t,r=[1,1])=>({x:r[0]*Math.round(t.x/r[0]),y:r[1]*Math.round(t.y/r[1])}),Mi=({x:t,y:r},[i,l,a],u=!1,d=[1,1])=>{const f={x:(t-i)/a,y:(r-l)/a};return u?ji(f,d):f},yo=({x:t,y:r},[i,l,a])=>({x:t*a+i,y:r*a+l});function lo(t,r){if(typeof t=="number")return Math.floor((r-r/(1+t))*.5);if(typeof t=="string"&&t.endsWith("px")){const i=parseFloat(t);if(!Number.isNaN(i))return Math.floor(i)}if(typeof t=="string"&&t.endsWith("%")){const i=parseFloat(t);if(!Number.isNaN(i))return Math.floor(r*i*.01)}return console.error(`The padding value "${t}" is invalid. Please provide a number or a string with a valid unit (px or %).`),0}function t1(t,r,i){if(typeof t=="string"||typeof t=="number"){const l=lo(t,i),a=lo(t,r);return{top:l,right:a,bottom:l,left:a,x:a*2,y:l*2}}if(typeof t=="object"){const l=lo(t.top??t.y??0,i),a=lo(t.bottom??t.y??0,i),u=lo(t.left??t.x??0,r),d=lo(t.right??t.x??0,r);return{top:l,right:d,bottom:a,left:u,x:u+d,y:l+a}}return{top:0,right:0,bottom:0,left:0,x:0,y:0}}function n1(t,r,i,l,a,u){const{x:d,y:f}=yo(t,[r,i,l]),{x:p,y}=yo({x:t.x+t.width,y:t.y+t.height},[r,i,l]),g=a-p,x=u-y;return{left:Math.floor(d),top:Math.floor(f),right:Math.floor(g),bottom:Math.floor(x)}}const uc=(t,r,i,l,a,u)=>{const d=t1(u,r,i),f=(r-d.x)/t.width,p=(i-d.y)/t.height,y=Math.min(f,p),g=go(y,l,a),x=t.x+t.width/2,v=t.y+t.height/2,_=r/2-x*g,S=i/2-v*g,C=n1(t,_,S,g,r,i),E={left:Math.min(C.left-d.left,0),top:Math.min(C.top-d.top,0),right:Math.min(C.right-d.right,0),bottom:Math.min(C.bottom-d.bottom,0)};return{x:_-E.left+E.right,y:S-E.top+E.bottom,zoom:g}},wi=()=>{var t;return typeof navigator<"u"&&((t=navigator==null?void 0:navigator.userAgent)==null?void 0:t.indexOf("Mac"))>=0};function jr(t){return t!=null&&t!=="parent"}function rn(t){var r,i;return{width:((r=t.measured)==null?void 0:r.width)??t.width??t.initialWidth??0,height:((i=t.measured)==null?void 0:i.height)??t.height??t.initialHeight??0}}function lm(t){var r,i;return(((r=t.measured)==null?void 0:r.width)??t.width??t.initialWidth)!==void 0&&(((i=t.measured)==null?void 0:i.height)??t.height??t.initialHeight)!==void 0}function am(t,r={width:0,height:0},i,l,a){const u={...t},d=l.get(i);if(d){const f=d.origin||a;u.x+=d.internals.positionAbsolute.x-(r.width??0)*f[0],u.y+=d.internals.positionAbsolute.y-(r.height??0)*f[1]}return u}function yh(t,r){if(t.size!==r.size)return!1;for(const i of t)if(!r.has(i))return!1;return!0}function r1(){let t,r;return{promise:new Promise((l,a)=>{t=l,r=a}),resolve:t,reject:r}}function o1(t){return{...Zp,...t||{}}}function ci(t,{snapGrid:r=[0,0],snapToGrid:i=!1,transform:l,containerBounds:a}){const{x:u,y:d}=en(t),f=Mi({x:u-((a==null?void 0:a.left)??0),y:d-((a==null?void 0:a.top)??0)},l),{x:p,y}=i?ji(f,r):f;return{xSnapped:p,ySnapped:y,...f}}const cc=t=>({width:t.offsetWidth,height:t.offsetHeight}),um=t=>{var r;return((r=t==null?void 0:t.getRootNode)==null?void 0:r.call(t))||(window==null?void 0:window.document)},i1=["INPUT","SELECT","TEXTAREA"];function cm(t){var l,a;const r=((a=(l=t.composedPath)==null?void 0:l.call(t))==null?void 0:a[0])||t.target;return(r==null?void 0:r.nodeType)!==1?!1:i1.includes(r.nodeName)||r.hasAttribute("contenteditable")||!!r.closest(".nokey")}const dm=t=>"clientX"in t,en=(t,r)=>{var u,d;const i=dm(t),l=i?t.clientX:(u=t.touches)==null?void 0:u[0].clientX,a=i?t.clientY:(d=t.touches)==null?void 0:d[0].clientY;return{x:l-((r==null?void 0:r.left)??0),y:a-((r==null?void 0:r.top)??0)}},vh=(t,r,i,l,a)=>{const u=r.querySelectorAll(`.${t}`);return!u||!u.length?null:Array.from(u).map(d=>{const f=d.getBoundingClientRect();return{id:d.getAttribute("data-handleid"),type:t,nodeId:a,position:d.getAttribute("data-handlepos"),x:(f.left-i.left)/l,y:(f.top-i.top)/l,...cc(d)}})};function fm({sourceX:t,sourceY:r,targetX:i,targetY:l,sourceControlX:a,sourceControlY:u,targetControlX:d,targetControlY:f}){const p=t*.125+a*.375+d*.375+i*.125,y=r*.125+u*.375+f*.375+l*.125,g=Math.abs(p-t),x=Math.abs(y-r);return[p,y,g,x]}function Qs(t,r){return t>=0?.5*t:r*25*Math.sqrt(-t)}function xh({pos:t,x1:r,y1:i,x2:l,y2:a,c:u}){switch(t){case Se.Left:return[r-Qs(r-l,u),i];case Se.Right:return[r+Qs(l-r,u),i];case Se.Top:return[r,i-Qs(i-a,u)];case Se.Bottom:return[r,i+Qs(a-i,u)]}}function hm({sourceX:t,sourceY:r,sourcePosition:i=Se.Bottom,targetX:l,targetY:a,targetPosition:u=Se.Top,curvature:d=.25}){const[f,p]=xh({pos:i,x1:t,y1:r,x2:l,y2:a,c:d}),[y,g]=xh({pos:u,x1:l,y1:a,x2:t,y2:r,c:d}),[x,v,_,S]=fm({sourceX:t,sourceY:r,targetX:l,targetY:a,sourceControlX:f,sourceControlY:p,targetControlX:y,targetControlY:g});return[`M${t},${r} C${f},${p} ${y},${g} ${l},${a}`,x,v,_,S]}function pm({sourceX:t,sourceY:r,targetX:i,targetY:l}){const a=Math.abs(i-t)/2,u=i0}const a1=({source:t,sourceHandle:r,target:i,targetHandle:l})=>`xy-edge__${t}${r||""}-${i}${l||""}`,u1=(t,r)=>r.some(i=>i.source===t.source&&i.target===t.target&&(i.sourceHandle===t.sourceHandle||!i.sourceHandle&&!t.sourceHandle)&&(i.targetHandle===t.targetHandle||!i.targetHandle&&!t.targetHandle)),c1=(t,r,i={})=>{var u;if(!t.source||!t.target)return(u=i.onError)==null||u.call(i,"006",tn.error006()),r;const l=i.getEdgeId||a1;let a;return tm(t)?a={...t}:a={...t,id:l(t)},u1(a,r)?r:(a.sourceHandle===null&&delete a.sourceHandle,a.targetHandle===null&&delete a.targetHandle,r.concat(a))};function mm({sourceX:t,sourceY:r,targetX:i,targetY:l}){const[a,u,d,f]=pm({sourceX:t,sourceY:r,targetX:i,targetY:l});return[`M ${t},${r}L ${i},${l}`,a,u,d,f]}const wh={[Se.Left]:{x:-1,y:0},[Se.Right]:{x:1,y:0},[Se.Top]:{x:0,y:-1},[Se.Bottom]:{x:0,y:1}},d1=({source:t,sourcePosition:r=Se.Bottom,target:i})=>r===Se.Left||r===Se.Right?t.xMath.sqrt(Math.pow(r.x-t.x,2)+Math.pow(r.y-t.y,2));function f1({source:t,sourcePosition:r=Se.Bottom,target:i,targetPosition:l=Se.Top,center:a,offset:u,stepPosition:d}){const f=wh[r],p=wh[l],y={x:t.x+f.x*u,y:t.y+f.y*u},g={x:i.x+p.x*u,y:i.y+p.y*u},x=d1({source:y,sourcePosition:r,target:g}),v=x.x!==0?"x":"y",_=x[v];let S=[],C,E;const N={x:0,y:0},b={x:0,y:0},[,,k,j]=pm({sourceX:t.x,sourceY:t.y,targetX:i.x,targetY:i.y});if(f[v]*p[v]===-1){v==="x"?(C=a.x??y.x+(g.x-y.x)*d,E=a.y??(y.y+g.y)/2):(C=a.x??(y.x+g.x)/2,E=a.y??y.y+(g.y-y.y)*d);const X=[{x:C,y:y.y},{x:C,y:g.y}],V=[{x:y.x,y:E},{x:g.x,y:E}];f[v]===_?S=v==="x"?X:V:S=v==="x"?V:X}else{const X=[{x:y.x,y:g.y}],V=[{x:g.x,y:y.y}];if(v==="x"?S=f.x===_?V:X:S=f.y===_?X:V,r===l){const M=Math.abs(t[v]-i[v]);if(M<=u){const W=Math.min(u-1,u-M);f[v]===_?N[v]=(y[v]>t[v]?-1:1)*W:b[v]=(g[v]>i[v]?-1:1)*W}}if(r!==l){const M=v==="x"?"y":"x",W=f[v]===p[M],B=y[M]>g[M],U=y[M]=J?(C=(ee.x+Z.x)/2,E=S[0].y):(C=S[0].x,E=(ee.y+Z.y)/2)}const R={x:y.x+N.x,y:y.y+N.y},D={x:g.x+b.x,y:g.y+b.y};return[[t,...R.x!==S[0].x||R.y!==S[0].y?[R]:[],...S,...D.x!==S[S.length-1].x||D.y!==S[S.length-1].y?[D]:[],i],C,E,k,j]}function h1(t,r,i,l){const a=Math.min(_h(t,r)/2,_h(r,i)/2,l),{x:u,y:d}=r;if(t.x===u&&u===i.x||t.y===d&&d===i.y)return`L${u} ${d}`;if(t.y===d){const y=t.xi.id===r):t[0])||null}function Qu(t,r){return t?typeof t=="string"?t:`${r?`${r}__`:""}${Object.keys(t).sort().map(l=>`${l}=${t[l]}`).join("&")}`:""}function m1(t,{id:r,defaultColor:i,defaultMarkerStart:l,defaultMarkerEnd:a}){const u=new Set;return t.reduce((d,f)=>([f.markerStart||l,f.markerEnd||a].forEach(p=>{if(p&&typeof p=="object"){const y=Qu(p,r);u.has(y)||(d.push({id:y,color:p.color||i,...p}),u.add(y))}}),d),[]).sort((d,f)=>d.id.localeCompare(f.id))}const gm=1e3,g1=10,dc={nodeOrigin:[0,0],nodeExtent:gi,elevateNodesOnSelect:!0,zIndexMode:"basic",defaults:{}},y1={...dc,checkEquality:!0};function fc(t,r){const i={...t};for(const l in r)r[l]!==void 0&&(i[l]=r[l]);return i}function v1(t,r,i){const l=fc(dc,i);for(const a of t.values())if(a.parentId)pc(a,t,r,l);else{const u=Ni(a,l.nodeOrigin),d=jr(a.extent)?a.extent:l.nodeExtent,f=Cr(u,d,rn(a));a.internals.positionAbsolute=f}}function x1(t,r){if(!t.handles)return t.measured?r==null?void 0:r.internals.handleBounds:void 0;const i=[],l=[];for(const a of t.handles){const u={id:a.id,width:a.width??1,height:a.height??1,nodeId:t.id,x:a.x,y:a.y,position:a.position,type:a.type};a.type==="source"?i.push(u):a.type==="target"&&l.push(u)}return{source:i,target:l}}function hc(t){return t==="manual"}function Ku(t,r,i,l={}){var g,x;const a=fc(y1,l),u={i:0},d=new Map(r),f=a!=null&&a.elevateNodesOnSelect&&!hc(a.zIndexMode)?gm:0;let p=t.length>0,y=!1;r.clear(),i.clear();for(const v of t){let _=d.get(v.id);if(a.checkEquality&&v===(_==null?void 0:_.internals.userNode))r.set(v.id,_);else{const S=Ni(v,a.nodeOrigin),C=jr(v.extent)?v.extent:a.nodeExtent,E=Cr(S,C,rn(v));_={...a.defaults,...v,measured:{width:(g=v.measured)==null?void 0:g.width,height:(x=v.measured)==null?void 0:x.height},internals:{positionAbsolute:E,handleBounds:x1(v,_),z:ym(v,f,a.zIndexMode),userNode:v}},r.set(v.id,_)}(_.measured===void 0||_.measured.width===void 0||_.measured.height===void 0)&&!_.hidden&&(p=!1),v.parentId&&pc(_,r,i,l,u),y||(y=v.selected??!1)}return{nodesInitialized:p,hasSelectedNodes:y}}function w1(t,r){if(!t.parentId)return;const i=r.get(t.parentId);i?i.set(t.id,t):r.set(t.parentId,new Map([[t.id,t]]))}function pc(t,r,i,l,a){const{elevateNodesOnSelect:u,nodeOrigin:d,nodeExtent:f,zIndexMode:p}=fc(dc,l),y=t.parentId,g=r.get(y);if(!g){console.warn(`Parent node ${y} not found. Please make sure that parent nodes are in front of their child nodes in the nodes array.`);return}w1(t,i),a&&!g.parentId&&g.internals.rootParentIndex===void 0&&p==="auto"&&(g.internals.rootParentIndex=++a.i,g.internals.z=g.internals.z+a.i*g1),a&&g.internals.rootParentIndex!==void 0&&(a.i=g.internals.rootParentIndex);const x=u&&!hc(p)?gm:0,{x:v,y:_,z:S}=_1(t,g,d,f,x,p),{positionAbsolute:C}=t.internals,E=v!==C.x||_!==C.y;(E||S!==t.internals.z)&&r.set(t.id,{...t,internals:{...t.internals,positionAbsolute:E?{x:v,y:_}:C,z:S}})}function ym(t,r,i){const l=Jt(t.zIndex)?t.zIndex:0;return hc(i)?l:l+(t.selected?r:0)}function _1(t,r,i,l,a,u){const{x:d,y:f}=r.internals.positionAbsolute,p=rn(t),y=Ni(t,i),g=jr(t.extent)?Cr(y,t.extent,p):y;let x=Cr({x:d+g.x,y:f+g.y},l,p);t.extent==="parent"&&(x=rm(x,p,r));const v=ym(t,a,u),_=r.internals.z??0;return{x:x.x,y:x.y,z:_>=v?_+1:v}}function mc(t,r,i,l=[0,0]){var d;const a=[],u=new Map;for(const f of t){const p=r.get(f.parentId);if(!p)continue;const y=((d=u.get(f.parentId))==null?void 0:d.expandedRect)??xi(p),g=om(y,f.rect);u.set(f.parentId,{expandedRect:g,parent:p})}return u.size>0&&u.forEach(({expandedRect:f,parent:p},y)=>{var k;const g=p.internals.positionAbsolute,x=rn(p),v=p.origin??l,_=f.x0||S>0||N||b)&&(a.push({id:y,type:"position",position:{x:p.position.x-_+N,y:p.position.y-S+b}}),(k=i.get(y))==null||k.forEach(j=>{t.some(R=>R.id===j.id)||a.push({id:j.id,type:"position",position:{x:j.position.x+_,y:j.position.y+S}})})),(x.width0){const _=mc(v,r,i,a);y.push(..._)}return{changes:y,updatedInternals:p}}async function k1({delta:t,panZoom:r,transform:i,translateExtent:l,width:a,height:u}){if(!r||!t.x&&!t.y)return!1;const d=await r.setViewportConstrained({x:i[0]+t.x,y:i[1]+t.y,zoom:i[2]},[[0,0],[a,u]],l);return!!d&&(d.x!==i[0]||d.y!==i[1]||d.k!==i[2])}function Nh(t,r,i,l,a,u){let d=a;const f=l.get(d)||new Map;l.set(d,f.set(i,r)),d=`${a}-${t}`;const p=l.get(d)||new Map;if(l.set(d,p.set(i,r)),u){d=`${a}-${t}-${u}`;const y=l.get(d)||new Map;l.set(d,y.set(i,r))}}function vm(t,r,i){t.clear(),r.clear();for(const l of i){const{source:a,target:u,sourceHandle:d=null,targetHandle:f=null}=l,p={edgeId:l.id,source:a,target:u,sourceHandle:d,targetHandle:f},y=`${a}-${d}--${u}-${f}`,g=`${u}-${f}--${a}-${d}`;Nh("source",p,g,t,a,d),Nh("target",p,y,t,u,f),r.set(l.id,l)}}function xm(t,r){if(!t.parentId)return!1;const i=r.get(t.parentId);return i?i.selected?!0:xm(i,r):!1}function Ch(t,r,i){var a;let l=t;do{if((a=l==null?void 0:l.matches)!=null&&a.call(l,r))return!0;if(l===i)return!1;l=l==null?void 0:l.parentElement}while(l);return!1}function E1(t,r,i,l){const a=new Map;for(const[u,d]of t)if((d.selected||d.id===l)&&(!d.parentId||!xm(d,t))&&(d.draggable||r&&typeof d.draggable>"u")){const f=t.get(u);f&&a.set(u,{id:u,position:f.position||{x:0,y:0},distance:{x:i.x-f.internals.positionAbsolute.x,y:i.y-f.internals.positionAbsolute.y},extent:f.extent,parentId:f.parentId,origin:f.origin,expandParent:f.expandParent,internals:{positionAbsolute:f.internals.positionAbsolute||{x:0,y:0}},measured:{width:f.measured.width??0,height:f.measured.height??0}})}return a}function Pu({nodeId:t,dragItems:r,nodeLookup:i,dragging:l=!0}){var d,f,p;const a=[];for(const[y,g]of r){const x=(d=i.get(y))==null?void 0:d.internals.userNode;x&&a.push({...x,position:g.position,dragging:l})}if(!t)return[a[0],a];const u=(f=i.get(t))==null?void 0:f.internals.userNode;return[u?{...u,position:((p=r.get(t))==null?void 0:p.position)||u.position,dragging:l}:a[0],a]}function N1({dragItems:t,snapGrid:r,x:i,y:l}){const a=t.values().next().value;if(!a)return null;const u={x:i-a.distance.x,y:l-a.distance.y},d=ji(u,r);return{x:d.x-u.x,y:d.y-u.y}}function C1({onNodeMouseDown:t,getStoreItems:r,onDragStart:i,onDrag:l,onDragStop:a}){let u={x:null,y:null},d=0,f=new Map,p=!1,y={x:0,y:0},g=null,x=!1,v=null,_=!1,S=!1,C=null;function E({noDragClassName:b,handleSelector:k,domNode:j,isSelectable:R,nodeId:D,nodeClickDistance:H=0}){v=Rt(j);function X({x:te,y:J}){const{nodeLookup:M,nodeExtent:W,snapGrid:B,snapToGrid:U,nodeOrigin:A,onNodeDrag:z,onSelectionDrag:F,onError:P,updateNodePositions:T}=r();u={x:te,y:J};let ne=!1;const re=f.size>1,ue=re&&W?Xu(Ci(f)):null,ce=re&&U?N1({dragItems:f,snapGrid:B,x:te,y:J}):null;for(const[de,Q]of f){if(!M.has(de))continue;let se={x:te-Q.distance.x,y:J-Q.distance.y};U&&(se=ce?{x:Math.round(se.x+ce.x),y:Math.round(se.y+ce.y)}:ji(se,B));let fe=null;if(re&&W&&!Q.extent&&ue){const{positionAbsolute:pe}=Q.internals,Ce=pe.x-ue.x+W[0][0],je=pe.x+Q.measured.width-ue.x2+W[1][0],Me=pe.y-ue.y+W[0][1],Re=pe.y+Q.measured.height-ue.y2+W[1][1];fe=[[Ce,Me],[je,Re]]}const{position:me,positionAbsolute:xe}=nm({nodeId:de,nextPosition:se,nodeLookup:M,nodeExtent:fe||W,nodeOrigin:A,onError:P});ne=ne||Q.position.x!==me.x||Q.position.y!==me.y,Q.position=me,Q.internals.positionAbsolute=xe}if(S=S||ne,!!ne&&(T(f,!0),C&&(l||z||!D&&F))){const[de,Q]=Pu({nodeId:D,dragItems:f,nodeLookup:M});l==null||l(C,f,de,Q),z==null||z(C,de,Q),D||F==null||F(C,Q)}}async function V(){if(!g)return;const{transform:te,panBy:J,autoPanSpeed:M,autoPanOnNodeDrag:W}=r();if(!W){p=!1,cancelAnimationFrame(d);return}const[B,U]=ac(y,g,M);(B!==0||U!==0)&&(u.x=(u.x??0)-B/te[2],u.y=(u.y??0)-U/te[2],await J({x:B,y:U})&&X(u)),d=requestAnimationFrame(V)}function ee(te){var re;const{nodeLookup:J,multiSelectionActive:M,nodesDraggable:W,transform:B,snapGrid:U,snapToGrid:A,selectNodesOnDrag:z,onNodeDragStart:F,onSelectionDragStart:P,unselectNodesAndEdges:T}=r();x=!0,(!z||!R)&&!M&&D&&((re=J.get(D))!=null&&re.selected||T()),R&&z&&D&&(t==null||t(D));const ne=ci(te.sourceEvent,{transform:B,snapGrid:U,snapToGrid:A,containerBounds:g});if(u=ne,f=E1(J,W,ne,D),f.size>0&&(i||F||!D&&P)){const[ue,ce]=Pu({nodeId:D,dragItems:f,nodeLookup:J});i==null||i(te.sourceEvent,f,ue,ce),F==null||F(te.sourceEvent,ue,ce),D||P==null||P(te.sourceEvent,ce)}}const Z=zp().clickDistance(H).on("start",te=>{const{domNode:J,nodeDragThreshold:M,transform:W,snapGrid:B,snapToGrid:U}=r();g=(J==null?void 0:J.getBoundingClientRect())||null,_=!1,S=!1,C=te.sourceEvent,M===0&&ee(te),u=ci(te.sourceEvent,{transform:W,snapGrid:B,snapToGrid:U,containerBounds:g}),y=en(te.sourceEvent,g)}).on("drag",te=>{const{autoPanOnNodeDrag:J,transform:M,snapGrid:W,snapToGrid:B,nodeDragThreshold:U,nodeLookup:A}=r(),z=ci(te.sourceEvent,{transform:M,snapGrid:W,snapToGrid:B,containerBounds:g});if(C=te.sourceEvent,(te.sourceEvent.type==="touchmove"&&te.sourceEvent.touches.length>1||D&&!A.has(D))&&(_=!0),!_){if(!p&&J&&x&&(p=!0,V()),!x){const F=en(te.sourceEvent,g),P=F.x-y.x,T=F.y-y.y;Math.sqrt(P*P+T*T)>U&&ee(te)}(u.x!==z.xSnapped||u.y!==z.ySnapped)&&f&&x&&(y=en(te.sourceEvent,g),X(z))}}).on("end",te=>{if(!x||_){_&&f.size>0&&r().updateNodePositions(f,!1);return}if(p=!1,x=!1,cancelAnimationFrame(d),f.size>0){const{nodeLookup:J,updateNodePositions:M,onNodeDragStop:W,onSelectionDragStop:B}=r();if(S&&(M(f,!1),S=!1),a||W||!D&&B){const[U,A]=Pu({nodeId:D,dragItems:f,nodeLookup:J,dragging:!1});a==null||a(te.sourceEvent,f,U,A),W==null||W(te.sourceEvent,U,A),D||B==null||B(te.sourceEvent,A)}}}).filter(te=>{const J=te.target;return!te.button&&(!b||!Ch(J,`.${b}`,j))&&(!k||Ch(J,k,j))});v.call(Z)}function N(){v==null||v.on(".drag",null)}return{update:E,destroy:N}}function j1(t,r,i){const l=[],a={x:t.x-i,y:t.y-i,width:i*2,height:i*2};for(const u of r.values())hl(a,xi(u))>0&&l.push(u);return l}const M1=250;function P1(t,r,i,l){var f,p;let a=[],u=1/0;const d=j1(t,i,r+M1);for(const y of d){const g=[...((f=y.internals.handleBounds)==null?void 0:f.source)??[],...((p=y.internals.handleBounds)==null?void 0:p.target)??[]];for(const x of g){if(l.nodeId===x.nodeId&&l.type===x.type&&l.id===x.id)continue;const{x:v,y:_}=Mr(y,x,x.position,!0),S=Math.sqrt(Math.pow(v-t.x,2)+Math.pow(_-t.y,2));S>r||(S1){const y=l.type==="source"?"target":"source";return a.find(g=>g.type===y)??a[0]}return a[0]}function wm(t,r,i,l,a,u=!1){var y,g,x;const d=l.get(t);if(!d)return null;const f=a==="strict"?(y=d.internals.handleBounds)==null?void 0:y[r]:[...((g=d.internals.handleBounds)==null?void 0:g.source)??[],...((x=d.internals.handleBounds)==null?void 0:x.target)??[]],p=(i?f==null?void 0:f.find(v=>v.id===i):f==null?void 0:f[0])??null;return p&&u?{...p,...Mr(d,p,p.position,!0)}:p}function _m(t,r){return t||(r!=null&&r.classList.contains("target")?"target":r!=null&&r.classList.contains("source")?"source":null)}function I1(t,r){let i=null;return r?i=!0:t&&!r&&(i=!1),i}const Sm=()=>!0;function b1(t,{connectionMode:r,connectionRadius:i,handleId:l,nodeId:a,edgeUpdaterType:u,isTarget:d,domNode:f,nodeLookup:p,lib:y,autoPanOnConnect:g,flowId:x,panBy:v,cancelConnection:_,onConnectStart:S,onConnect:C,onConnectEnd:E,isValidConnection:N=Sm,onReconnectEnd:b,updateConnection:k,getTransform:j,getFromHandle:R,autoPanSpeed:D,dragThreshold:H=1,handleDomNode:X}){const V=um(t.target);let ee=0,Z;const{x:te,y:J}=en(t),M=_m(u,X),W=f==null?void 0:f.getBoundingClientRect();let B=!1;if(!W||!M)return;const U=wm(a,M,l,p,r);if(!U)return;let A=en(t,W),z=!1,F=null,P=!1,T=null;function ne(){if(!g||!W)return;const[me,xe]=ac(A,W,D);v({x:me,y:xe}),ee=requestAnimationFrame(ne)}const re={...U,nodeId:a,type:M,position:U.position},ue=p.get(a);let de={inProgress:!0,isValid:null,from:Mr(ue,re,Se.Left,!0),fromHandle:re,fromPosition:re.position,fromNode:ue,to:A,toHandle:null,toPosition:ph[re.position],toNode:null,pointer:A};function Q(){B=!0,k(de),S==null||S(t,{nodeId:a,handleId:l,handleType:M})}H===0&&Q();function se(me){if(!B){const{x:Re,y:Xe}=en(me),rt=Re-te,Ze=Xe-J;if(!(rt*rt+Ze*Ze>H*H))return;Q()}if(!R()||!re){fe(me);return}const xe=j();A=en(me,W),Z=P1(Mi(A,xe,!1,[1,1]),i,p,re),z||(ne(),z=!0);const pe=km(me,{handle:Z,connectionMode:r,fromNodeId:a,fromHandleId:l,fromType:d?"target":"source",isValidConnection:N,doc:V,lib:y,flowId:x,nodeLookup:p});T=pe.handleDomNode,F=pe.connection,P=I1(!!Z,pe.isValid);const Ce=p.get(a),je=Ce?Mr(Ce,re,Se.Left,!0):de.from,Me={...de,from:je,isValid:P,to:pe.toHandle&&P?yo({x:pe.toHandle.x,y:pe.toHandle.y},xe):A,toHandle:pe.toHandle,toPosition:P&&pe.toHandle?pe.toHandle.position:ph[re.position],toNode:pe.toHandle?p.get(pe.toHandle.nodeId):null,pointer:A};k(Me),de=Me}function fe(me){if(!("touches"in me&&me.touches.length>0)){if(B){(Z||T)&&F&&P&&(C==null||C(F));const{inProgress:xe,...pe}=de,Ce={...pe,toPosition:de.toHandle?de.toPosition:null};E==null||E(me,Ce),u&&(b==null||b(me,Ce))}_(),cancelAnimationFrame(ee),z=!1,P=!1,F=null,T=null,V.removeEventListener("mousemove",se),V.removeEventListener("mouseup",fe),V.removeEventListener("touchmove",se),V.removeEventListener("touchend",fe)}}V.addEventListener("mousemove",se),V.addEventListener("mouseup",fe),V.addEventListener("touchmove",se),V.addEventListener("touchend",fe)}function km(t,{handle:r,connectionMode:i,fromNodeId:l,fromHandleId:a,fromType:u,doc:d,lib:f,flowId:p,isValidConnection:y=Sm,nodeLookup:g}){const x=u==="target",v=r?d.querySelector(`.${f}-flow__handle[data-id="${p}-${r==null?void 0:r.nodeId}-${r==null?void 0:r.id}-${r==null?void 0:r.type}"]`):null,{x:_,y:S}=en(t),C=d.elementFromPoint(_,S),E=C!=null&&C.classList.contains(`${f}-flow__handle`)?C:v,N={handleDomNode:E,isValid:!1,connection:null,toHandle:null};if(E){const b=_m(void 0,E),k=E.getAttribute("data-nodeid"),j=E.getAttribute("data-handleid"),R=E.classList.contains("connectable"),D=E.classList.contains("connectableend");if(!k||!b)return N;const H={source:x?k:l,sourceHandle:x?j:a,target:x?l:k,targetHandle:x?a:j};N.connection=H;const V=R&&D&&(i===mo.Strict?x&&b==="source"||!x&&b==="target":k!==l||j!==a);N.isValid=V&&y(H),N.toHandle=wm(k,b,j,g,i,!0)}return N}const qu={onPointerDown:b1,isValid:km};function T1({domNode:t,panZoom:r,getTransform:i,getViewScale:l}){const a=Rt(t);function u({translateExtent:f,width:p,height:y,zoomStep:g=1,pannable:x=!0,zoomable:v=!0,inversePan:_=!1}){const S=k=>{if(k.sourceEvent.type!=="wheel"||!r)return;const j=i(),R=k.sourceEvent.ctrlKey&&wi()?10:1,D=-k.sourceEvent.deltaY*(k.sourceEvent.deltaMode===1?.05:k.sourceEvent.deltaMode?1:.002)*g,H=j[2]*Math.pow(2,D*R);r.scaleTo(H)};let C=[0,0];const E=k=>{(k.sourceEvent.type==="mousedown"||k.sourceEvent.type==="touchstart")&&(C=[k.sourceEvent.clientX??k.sourceEvent.touches[0].clientX,k.sourceEvent.clientY??k.sourceEvent.touches[0].clientY])},N=k=>{const j=i();if(k.sourceEvent.type!=="mousemove"&&k.sourceEvent.type!=="touchmove"||!r)return;const R=[k.sourceEvent.clientX??k.sourceEvent.touches[0].clientX,k.sourceEvent.clientY??k.sourceEvent.touches[0].clientY],D=[R[0]-C[0],R[1]-C[1]];C=R;const H=l()*Math.max(j[2],Math.log(j[2]))*(_?-1:1),X={x:j[0]-D[0]*H,y:j[1]-D[1]*H},V=[[0,0],[p,y]];r.setViewportConstrained({x:X.x,y:X.y,zoom:j[2]},V,f)},b=Kp().on("start",E).on("zoom",x?N:null).on("zoom.wheel",v?S:null);a.call(b,{})}function d(){a.on("zoom",null)}return{update:u,destroy:d,pointer:qt}}const El=t=>({x:t.x,y:t.y,zoom:t.k}),Iu=({x:t,y:r,zoom:i})=>_l.translate(t,r).scale(i),qn=(t,r)=>t.target.closest(`.${r}`),Em=(t,r)=>r===2&&Array.isArray(t)&&t.includes(2),R1=t=>((t*=2)<=1?t*t*t:(t-=2)*t*t+2)/2,bu=(t,r=0,i=R1,l=()=>{})=>{const a=typeof r=="number"&&r>0;return a||l(),a?t.transition().duration(r).ease(i).on("end",l):t},Nm=t=>{const r=t.ctrlKey&&wi()?10:1;return-t.deltaY*(t.deltaMode===1?.05:t.deltaMode?1:.002)*r};function L1({zoomPanValues:t,noWheelClassName:r,d3Selection:i,d3Zoom:l,panOnScrollMode:a,panOnScrollSpeed:u,zoomOnPinch:d,onPanZoomStart:f,onPanZoom:p,onPanZoomEnd:y}){return g=>{if(qn(g,r))return g.ctrlKey&&g.preventDefault(),!1;g.preventDefault(),g.stopImmediatePropagation();const x=i.property("__zoom").k||1;if(g.ctrlKey&&d){const E=qt(g),N=Nm(g),b=x*Math.pow(2,N);l.scaleTo(i,b,E,g);return}const v=g.deltaMode===1?20:1;let _=a===kr.Vertical?0:g.deltaX*v,S=a===kr.Horizontal?0:g.deltaY*v;!wi()&&g.shiftKey&&a!==kr.Vertical&&(_=g.deltaY*v,S=0),l.translateBy(i,-(_/x)*u,-(S/x)*u,{internal:!0});const C=El(i.property("__zoom"));clearTimeout(t.panScrollTimeout),t.isPanScrolling?p==null||p(g,C):(t.isPanScrolling=!0,f==null||f(g,C)),t.panScrollTimeout=setTimeout(()=>{y==null||y(g,C),t.isPanScrolling=!1},150)}}function z1({noWheelClassName:t,preventScrolling:r,d3ZoomHandler:i}){return function(l,a){const u=l.type==="wheel",d=!r&&u&&!l.ctrlKey,f=qn(l,t);if(l.ctrlKey&&u&&f&&l.preventDefault(),d||f)return null;l.preventDefault(),i.call(this,l,a)}}function A1({zoomPanValues:t,onDraggingChange:r,onPanZoomStart:i}){return l=>{var u,d,f;if((u=l.sourceEvent)!=null&&u.internal)return;const a=El(l.transform);t.mouseButton=((d=l.sourceEvent)==null?void 0:d.button)||0,t.isZoomingOrPanning=!0,t.prevViewport=a,((f=l.sourceEvent)==null?void 0:f.type)==="mousedown"&&r(!0),i&&(i==null||i(l.sourceEvent,a))}}function D1({zoomPanValues:t,panOnDrag:r,onPaneContextMenu:i,onTransformChange:l,onPanZoom:a}){return u=>{var d,f;t.usedRightMouseButton=!!(i&&Em(r,t.mouseButton??0)),(d=u.sourceEvent)!=null&&d.sync||l([u.transform.x,u.transform.y,u.transform.k]),a&&!((f=u.sourceEvent)!=null&&f.internal)&&(a==null||a(u.sourceEvent,El(u.transform)))}}function $1({zoomPanValues:t,panOnDrag:r,panOnScroll:i,onDraggingChange:l,onPanZoomEnd:a,onPaneContextMenu:u}){return d=>{var f;if(!((f=d.sourceEvent)!=null&&f.internal)&&(t.isZoomingOrPanning=!1,u&&Em(r,t.mouseButton??0)&&!t.usedRightMouseButton&&d.sourceEvent&&u(d.sourceEvent),t.usedRightMouseButton=!1,l(!1),a)){const p=El(d.transform);t.prevViewport=p,clearTimeout(t.timerId),t.timerId=setTimeout(()=>{a==null||a(d.sourceEvent,p)},i?150:0)}}}function O1({panActivationKeyPressed:t,zoomActivationKeyPressed:r,zoomOnScroll:i,zoomOnPinch:l,panOnDrag:a,panOnScroll:u,zoomOnDoubleClick:d,userSelectionActive:f,noWheelClassName:p,noPanClassName:y,lib:g,connectionInProgress:x}){return v=>{var N;const _=r||i,S=l&&v.ctrlKey,C=v.type==="wheel";if(v.button===1&&v.type==="mousedown"&&(qn(v,`${g}-flow__node`)||qn(v,`${g}-flow__edge`)||qn(v,`${g}-flow__selection`)||qn(v,`${g}-flow__nodesselection`)))return!0;if(!a&&!_&&!u&&!d&&!l||f||x&&!C||qn(v,p)&&C||qn(v,y)&&(!C||u&&C&&!r)||!l&&v.ctrlKey&&C)return!1;if(!l&&v.type==="touchstart"&&((N=v.touches)==null?void 0:N.length)>1)return v.preventDefault(),!1;if(!_&&!u&&!S&&C||!a&&(v.type==="mousedown"||v.type==="touchstart")||Array.isArray(a)&&!a.includes(v.button)&&v.type==="mousedown")return!1;const E=Array.isArray(a)&&a.includes(v.button)||!v.button||v.button<=1;return(!v.ctrlKey||C||t)&&E}}function F1({domNode:t,minZoom:r,maxZoom:i,translateExtent:l,viewport:a,onPanZoom:u,onPanZoomStart:d,onPanZoomEnd:f,onDraggingChange:p}){const y={isZoomingOrPanning:!1,usedRightMouseButton:!1,prevViewport:{},mouseButton:0,timerId:void 0,panScrollTimeout:void 0,isPanScrolling:!1},g=t.getBoundingClientRect();let x=[[0,0],[g.width,g.height]];const v=typeof ResizeObserver<"u"?new ResizeObserver(J=>{const M=J[0];M&&(x=[[0,0],[M.contentRect.width,M.contentRect.height]])}):null;v==null||v.observe(t);const _=Kp().extent(()=>x).scaleExtent([r,i]).translateExtent(l),S=Rt(t).call(_);j({x:a.x,y:a.y,zoom:go(a.zoom,r,i)},[[0,0],[g.width,g.height]],l);const C=S.on("wheel.zoom"),E=S.on("dblclick.zoom");_.wheelDelta(Nm);async function N(J,M){return S?new Promise(W=>{_==null||_.interpolate((M==null?void 0:M.interpolate)==="linear"?ui:tl).transform(bu(S,M==null?void 0:M.duration,M==null?void 0:M.ease,()=>W(!0)),J)}):!1}function b({noWheelClassName:J,noPanClassName:M,onPaneContextMenu:W,userSelectionActive:B,panOnScroll:U,panOnDrag:A,panOnScrollMode:z,panOnScrollSpeed:F,preventScrolling:P,zoomOnPinch:T,zoomOnScroll:ne,zoomOnDoubleClick:re,panActivationKeyPressed:ue=!1,zoomActivationKeyPressed:ce,lib:de,onTransformChange:Q,connectionInProgress:se,paneClickDistance:fe,selectionOnDrag:me}){B&&!y.isZoomingOrPanning&&k();const xe=U&&!ce&&!B;_.clickDistance(me?1/0:!Jt(fe)||fe<0?0:fe);const pe=xe?L1({zoomPanValues:y,noWheelClassName:J,d3Selection:S,d3Zoom:_,panOnScrollMode:z,panOnScrollSpeed:F,zoomOnPinch:T,onPanZoomStart:d,onPanZoom:u,onPanZoomEnd:f}):z1({noWheelClassName:J,preventScrolling:P,d3ZoomHandler:C});S.on("wheel.zoom",pe,{passive:!1});const Ce=A1({zoomPanValues:y,onDraggingChange:p,onPanZoomStart:d});_.on("start",Ce);const je=D1({zoomPanValues:y,panOnDrag:A,onPaneContextMenu:!!W,onPanZoom:u,onTransformChange:Q});_.on("zoom",je);const Me=$1({zoomPanValues:y,panOnDrag:A,panOnScroll:U,onPaneContextMenu:W,onPanZoomEnd:f,onDraggingChange:p});_.on("end",Me);const Re=O1({panActivationKeyPressed:ue,zoomActivationKeyPressed:ce,panOnDrag:A,zoomOnScroll:ne,panOnScroll:U,zoomOnDoubleClick:re,zoomOnPinch:T,userSelectionActive:B,noPanClassName:M,noWheelClassName:J,lib:de,connectionInProgress:se});_.filter(Re),re?S.on("dblclick.zoom",E):S.on("dblclick.zoom",null)}function k(){_.on("zoom",null)}async function j(J,M,W){const B=Iu(J),U=_==null?void 0:_.constrain()(B,M,W);return U&&await N(U),U}async function R(J,M){const W=Iu(J);return await N(W,M),W}function D(J){if(S){const M=Iu(J),W=S.property("__zoom");(W.k!==J.zoom||W.x!==J.x||W.y!==J.y)&&(_==null||_.transform(S,M,null,{sync:!0}))}}function H(){const J=S?Qp(S.node()):{x:0,y:0,k:1};return{x:J.x,y:J.y,zoom:J.k}}async function X(J,M){return S?new Promise(W=>{_==null||_.interpolate((M==null?void 0:M.interpolate)==="linear"?ui:tl).scaleTo(bu(S,M==null?void 0:M.duration,M==null?void 0:M.ease,()=>W(!0)),J)}):!1}async function V(J,M){return S?new Promise(W=>{_==null||_.interpolate((M==null?void 0:M.interpolate)==="linear"?ui:tl).scaleBy(bu(S,M==null?void 0:M.duration,M==null?void 0:M.ease,()=>W(!0)),J)}):!1}function ee(J){_==null||_.scaleExtent(J)}function Z(J){_==null||_.translateExtent(J)}function te(J){const M=!Jt(J)||J<0?0:J;_==null||_.clickDistance(M)}return{update:b,destroy:k,setViewport:R,setViewportConstrained:j,getViewport:H,scaleTo:X,scaleBy:V,setScaleExtent:ee,setTranslateExtent:Z,syncViewport:D,setClickDistance:te}}var vo;(function(t){t.Line="line",t.Handle="handle"})(vo||(vo={}));function H1({width:t,prevWidth:r,height:i,prevHeight:l,affectsX:a,affectsY:u}){const d=t-r,f=i-l,p=[d>0?1:d<0?-1:0,f>0?1:f<0?-1:0];return d&&a&&(p[0]=p[0]*-1),f&&u&&(p[1]=p[1]*-1),p}function jh(t){const r=t.includes("right")||t.includes("left"),i=t.includes("bottom")||t.includes("top"),l=t.includes("left"),a=t.includes("top");return{isHorizontal:r,isVertical:i,affectsX:l,affectsY:a}}function Qn(t,r){return Math.max(0,r-t)}function Kn(t,r){return Math.max(0,t-r)}function Ks(t,r,i){return Math.max(0,r-t,t-i)}function Mh(t,r){return t?!r:r}function B1(t,r,i,l,a,u,d,f){let{affectsX:p,affectsY:y}=r;const{isHorizontal:g,isVertical:x}=r,v=g&&x,{xSnapped:_,ySnapped:S}=i,{minWidth:C,maxWidth:E,minHeight:N,maxHeight:b}=l,{x:k,y:j,width:R,height:D,aspectRatio:H}=t;let X=Math.floor(g?_-t.pointerX:0),V=Math.floor(x?S-t.pointerY:0);const ee=R+(p?-X:X),Z=D+(y?-V:V),te=-u[0]*R,J=-u[1]*D;let M=Ks(ee,C,E),W=Ks(Z,N,b);if(d){let A=0,z=0;p&&X<0?A=Qn(k+X+te,d[0][0]):!p&&X>0&&(A=Kn(k+ee+te,d[1][0])),y&&V<0?z=Qn(j+V+J,d[0][1]):!y&&V>0&&(z=Kn(j+Z+J,d[1][1])),M=Math.max(M,A),W=Math.max(W,z)}if(f){let A=0,z=0;p&&X>0?A=Kn(k+X,f[0][0]):!p&&X<0&&(A=Qn(k+ee,f[1][0])),y&&V>0?z=Kn(j+V,f[0][1]):!y&&V<0&&(z=Qn(j+Z,f[1][1])),M=Math.max(M,A),W=Math.max(W,z)}if(a){if(g){const A=Ks(ee/H,N,b)*H;if(M=Math.max(M,A),d){let z=0;!p&&!y||p&&!y&&v?z=Kn(j+J+ee/H,d[1][1])*H:z=Qn(j+J+(p?X:-X)/H,d[0][1])*H,M=Math.max(M,z)}if(f){let z=0;!p&&!y||p&&!y&&v?z=Qn(j+ee/H,f[1][1])*H:z=Kn(j+(p?X:-X)/H,f[0][1])*H,M=Math.max(M,z)}}if(x){const A=Ks(Z*H,C,E)/H;if(W=Math.max(W,A),d){let z=0;!p&&!y||y&&!p&&v?z=Kn(k+Z*H+te,d[1][0])/H:z=Qn(k+(y?V:-V)*H+te,d[0][0])/H,W=Math.max(W,z)}if(f){let z=0;!p&&!y||y&&!p&&v?z=Qn(k+Z*H,f[1][0])/H:z=Kn(k+(y?V:-V)*H,f[0][0])/H,W=Math.max(W,z)}}}V=V+(V<0?W:-W),X=X+(X<0?M:-M),a&&(v?ee>Z*H?V=(Mh(p,y)?-X:X)/H:X=(Mh(p,y)?-V:V)*H:g?(V=X/H,y=p):(X=V*H,p=y));const B=p?k+X:k,U=y?j+V:j;return{width:R+(p?-X:X),height:D+(y?-V:V),x:u[0]*X*(p?-1:1)+B,y:u[1]*V*(y?-1:1)+U}}const Cm={width:0,height:0,x:0,y:0},V1={...Cm,pointerX:0,pointerY:0,aspectRatio:1};function U1(t,r,i){const l=r.position.x+t.position.x,a=r.position.y+t.position.y,u=t.measured.width??0,d=t.measured.height??0,f=i[0]*u,p=i[1]*d;return[[l-f,a-p],[l+u-f,a+d-p]]}function W1({domNode:t,nodeId:r,getStoreItems:i,onChange:l,onEnd:a}){const u=Rt(t);let d={controlDirection:jh("bottom-right"),boundaries:{minWidth:0,minHeight:0,maxWidth:Number.MAX_VALUE,maxHeight:Number.MAX_VALUE},resizeDirection:void 0,keepAspectRatio:!1};function f({controlPosition:y,boundaries:g,keepAspectRatio:x,resizeDirection:v,onResizeStart:_,onResize:S,onResizeEnd:C,shouldResize:E}){let N={...Cm},b={...V1};d={boundaries:g,resizeDirection:v,keepAspectRatio:x,controlDirection:jh(y)};let k,j=null,R=[],D,H,X,V=!1;const ee=zp().on("start",Z=>{const{nodeLookup:te,transform:J,snapGrid:M,snapToGrid:W,nodeOrigin:B,paneDomNode:U}=i();if(k=te.get(r),!k)return;j=(U==null?void 0:U.getBoundingClientRect())??null;const{xSnapped:A,ySnapped:z}=ci(Z.sourceEvent,{transform:J,snapGrid:M,snapToGrid:W,containerBounds:j});N={width:k.measured.width??0,height:k.measured.height??0,x:k.position.x??0,y:k.position.y??0},b={...N,pointerX:A,pointerY:z,aspectRatio:N.width/N.height},D=void 0,H=jr(k.extent)?k.extent:void 0,k.parentId&&(k.extent==="parent"||k.expandParent)&&(D=te.get(k.parentId)),D&&k.extent==="parent"&&(H=[[0,0],[D.measured.width,D.measured.height]]),R=[],X=void 0;for(const[F,P]of te)if(P.parentId===r&&(R.push({id:F,position:{...P.position},extent:P.extent}),P.extent==="parent"||P.expandParent)){const T=U1(P,k,P.origin??B);X?X=[[Math.min(T[0][0],X[0][0]),Math.min(T[0][1],X[0][1])],[Math.max(T[1][0],X[1][0]),Math.max(T[1][1],X[1][1])]]:X=T}_==null||_(Z,{...N})}).on("drag",Z=>{const{transform:te,snapGrid:J,snapToGrid:M,nodeOrigin:W}=i(),B=ci(Z.sourceEvent,{transform:te,snapGrid:J,snapToGrid:M,containerBounds:j}),U=[];if(!k)return;const{x:A,y:z,width:F,height:P}=N,T={},ne=k.origin??W,{width:re,height:ue,x:ce,y:de}=B1(b,d.controlDirection,B,d.boundaries,d.keepAspectRatio,ne,H,X),Q=re!==F,se=ue!==P,fe=ce!==A&&Q,me=de!==z&&se;if(!fe&&!me&&!Q&&!se)return;if((fe||me||ne[0]===1||ne[1]===1)&&(T.x=fe?ce:N.x,T.y=me?de:N.y,N.x=T.x,N.y=T.y,R.length>0)){const je=ce-A,Me=de-z;for(const Re of R)Re.position={x:Re.position.x-je+ne[0]*(re-F),y:Re.position.y-Me+ne[1]*(ue-P)},U.push(Re)}if((Q||se)&&(T.width=Q&&(!d.resizeDirection||d.resizeDirection==="horizontal")?re:N.width,T.height=se&&(!d.resizeDirection||d.resizeDirection==="vertical")?ue:N.height,N.width=T.width,N.height=T.height),D&&k.expandParent){const je=ne[0]*(T.width??0);T.x&&T.x{V&&(C==null||C(Z,{...N}),a==null||a({...N}),V=!1)});u.call(ee)}function p(){u.on(".drag",null)}return{update:f,destroy:p}}var Tu={exports:{}},Ru={},Lu={exports:{}},zu={};/** - * @license React - * use-sync-external-store-shim.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var Ph;function Y1(){if(Ph)return zu;Ph=1;var t=Si();function r(x,v){return x===v&&(x!==0||1/x===1/v)||x!==x&&v!==v}var i=typeof Object.is=="function"?Object.is:r,l=t.useState,a=t.useEffect,u=t.useLayoutEffect,d=t.useDebugValue;function f(x,v){var _=v(),S=l({inst:{value:_,getSnapshot:v}}),C=S[0].inst,E=S[1];return u(function(){C.value=_,C.getSnapshot=v,p(C)&&E({inst:C})},[x,_,v]),a(function(){return p(C)&&E({inst:C}),x(function(){p(C)&&E({inst:C})})},[x]),d(_),_}function p(x){var v=x.getSnapshot;x=x.value;try{var _=v();return!i(x,_)}catch{return!0}}function y(x,v){return v()}var g=typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"?y:f;return zu.useSyncExternalStore=t.useSyncExternalStore!==void 0?t.useSyncExternalStore:g,zu}var Ih;function X1(){return Ih||(Ih=1,Lu.exports=Y1()),Lu.exports}/** - * @license React - * use-sync-external-store-shim/with-selector.production.js - * - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */var bh;function G1(){if(bh)return Ru;bh=1;var t=Si(),r=X1();function i(y,g){return y===g&&(y!==0||1/y===1/g)||y!==y&&g!==g}var l=typeof Object.is=="function"?Object.is:i,a=r.useSyncExternalStore,u=t.useRef,d=t.useEffect,f=t.useMemo,p=t.useDebugValue;return Ru.useSyncExternalStoreWithSelector=function(y,g,x,v,_){var S=u(null);if(S.current===null){var C={hasValue:!1,value:null};S.current=C}else C=S.current;S=f(function(){function N(D){if(!b){if(b=!0,k=D,D=v(D),_!==void 0&&C.hasValue){var H=C.value;if(_(H,D))return j=H}return j=D}if(H=j,l(k,D))return H;var X=v(D);return _!==void 0&&_(H,X)?(k=D,H):(k=D,j=X)}var b=!1,k,j,R=x===void 0?null:x;return[function(){return N(g())},R===null?void 0:function(){return N(R())}]},[g,x,v,_]);var E=a(y,S[0],S[1]);return d(function(){C.hasValue=!0,C.value=E},[E]),p(E),E},Ru}var Th;function Q1(){return Th||(Th=1,Tu.exports=G1()),Tu.exports}var K1=Q1();const q1=vp(K1),Z1={},Rh=t=>{let r;const i=new Set,l=(g,x)=>{const v=typeof g=="function"?g(r):g;if(!Object.is(v,r)){const _=r;r=x??(typeof v!="object"||v===null)?v:Object.assign({},r,v),i.forEach(S=>S(r,_))}},a=()=>r,p={setState:l,getState:a,getInitialState:()=>y,subscribe:g=>(i.add(g),()=>i.delete(g)),destroy:()=>{(Z1?"production":void 0)!=="production"&&console.warn("[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected."),i.clear()}},y=r=t(l,a,p);return p},J1=t=>t?Rh(t):Rh,{useDebugValue:e_}=q0,{useSyncExternalStoreWithSelector:t_}=q1,n_=t=>t;function jm(t,r=n_,i){const l=t_(t.subscribe,t.getState,t.getServerState||t.getInitialState,r,i);return e_(l),l}const Lh=(t,r)=>{const i=J1(t),l=(a,u=r)=>jm(i,a,u);return Object.assign(l,i),l},r_=(t,r)=>t?Lh(t,r):Lh;function Ue(t,r){if(Object.is(t,r))return!0;if(typeof t!="object"||t===null||typeof r!="object"||r===null)return!1;if(t instanceof Map&&r instanceof Map){if(t.size!==r.size)return!1;for(const[l,a]of t)if(!Object.is(a,r.get(l)))return!1;return!0}if(t instanceof Set&&r instanceof Set){if(t.size!==r.size)return!1;for(const l of t)if(!r.has(l))return!1;return!0}const i=Object.keys(t);if(i.length!==Object.keys(r).length)return!1;for(const l of i)if(!Object.prototype.hasOwnProperty.call(r,l)||!Object.is(t[l],r[l]))return!1;return!0}xp();const Nl=O.createContext(null),o_=Nl.Provider,Mm=tn.error001("react");function be(t,r){const i=O.useContext(Nl);if(i===null)throw new Error(Mm);return jm(i,t,r)}function Oe(){const t=O.useContext(Nl);if(t===null)throw new Error(Mm);return O.useMemo(()=>({getState:t.getState,setState:t.setState,subscribe:t.subscribe}),[t])}const zh={display:"none"},i_={position:"absolute",width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0px, 0px, 0px, 0px)",clipPath:"inset(100%)"},Pm="react-flow__node-desc",Im="react-flow__edge-desc",s_="react-flow__aria-live",l_=t=>t.ariaLiveMessage,a_=t=>t.ariaLabelConfig;function u_({rfId:t}){const r=be(l_);return m.jsx("div",{id:`${s_}-${t}`,"aria-live":"assertive","aria-atomic":"true",style:i_,children:r})}function c_({rfId:t,disableKeyboardA11y:r}){const i=be(a_);return m.jsxs(m.Fragment,{children:[m.jsx("div",{id:`${Pm}-${t}`,style:zh,children:r?i["node.a11yDescription.default"]:i["node.a11yDescription.keyboardDisabled"]}),m.jsx("div",{id:`${Im}-${t}`,style:zh,children:i["edge.a11yDescription.default"]}),!r&&m.jsx(u_,{rfId:t})]})}const Cl=O.forwardRef(({position:t="top-left",children:r,className:i,style:l,...a},u)=>{const d=`${t}`.split("-");return m.jsx("div",{className:Qe(["react-flow__panel",i,...d]),style:l,ref:u,...a,children:r})});Cl.displayName="Panel";const Ah="https://reactflow.dev?utm_source=attribution";function d_({proOptions:t,position:r="bottom-right"}){return t!=null&&t.hideAttribution?null:m.jsx(Cl,{position:r,className:"react-flow__attribution","data-message":`Please only hide this attribution when you are subscribed to React Flow Pro: ${Ah}`,children:m.jsx("a",{href:Ah,target:"_blank",rel:"noopener noreferrer","aria-label":"React Flow attribution",children:"React Flow"})})}const f_=t=>{const r=[],i=[];for(const[,l]of t.nodeLookup)l.selected&&r.push(l.internals.userNode);for(const[,l]of t.edgeLookup)l.selected&&i.push(l);return{selectedNodes:r,selectedEdges:i}},qs=t=>t.id;function h_(t,r){return Ue(t.selectedNodes.map(qs),r.selectedNodes.map(qs))&&Ue(t.selectedEdges.map(qs),r.selectedEdges.map(qs))}function p_({onSelectionChange:t}){const r=Oe(),{selectedNodes:i,selectedEdges:l}=be(f_,h_);return O.useEffect(()=>{const a={nodes:i,edges:l};t==null||t(a),r.getState().onSelectionChangeHandlers.forEach(u=>u(a))},[i,l,t]),null}const m_=t=>!!t.onSelectionChangeHandlers;function g_({onSelectionChange:t}){const r=be(m_);return t||r?m.jsx(p_,{onSelectionChange:t}):null}const bm=[0,0],y_={x:0,y:0,zoom:1},v_=["nodes","edges","defaultNodes","defaultEdges","onConnect","onConnectStart","onConnectEnd","onClickConnectStart","onClickConnectEnd","nodesDraggable","autoPanOnNodeFocus","nodesConnectable","nodesFocusable","edgesFocusable","edgesReconnectable","elevateNodesOnSelect","elevateEdgesOnSelect","minZoom","maxZoom","nodeExtent","onNodesChange","onEdgesChange","elementsSelectable","connectionMode","snapGrid","snapToGrid","translateExtent","connectOnClick","defaultEdgeOptions","fitView","fitViewOptions","onNodesDelete","onEdgesDelete","onDelete","onNodeDrag","onNodeDragStart","onNodeDragStop","onSelectionDrag","onSelectionDragStart","onSelectionDragStop","onMoveStart","onMove","onMoveEnd","noPanClassName","nodeOrigin","autoPanOnConnect","autoPanOnNodeDrag","onError","connectionRadius","isValidConnection","selectNodesOnDrag","nodeDragThreshold","connectionDragThreshold","onBeforeDelete","debug","autoPanSpeed","ariaLabelConfig","zIndexMode"],Dh=[...v_,"rfId"],x_=t=>({setNodes:t.setNodes,setEdges:t.setEdges,setMinZoom:t.setMinZoom,setMaxZoom:t.setMaxZoom,setTranslateExtent:t.setTranslateExtent,setNodeExtent:t.setNodeExtent,reset:t.reset,setDefaultNodesAndEdges:t.setDefaultNodesAndEdges}),$h={translateExtent:gi,nodeOrigin:bm,minZoom:.5,maxZoom:2,elementsSelectable:!0,noPanClassName:"nopan",rfId:"1"};function w_(t){const{setNodes:r,setEdges:i,setMinZoom:l,setMaxZoom:a,setTranslateExtent:u,setNodeExtent:d,reset:f,setDefaultNodesAndEdges:p}=be(x_,Ue),y=Oe();O.useEffect(()=>(p(t.defaultNodes,t.defaultEdges),()=>{g.current=$h,f()}),[]);const g=O.useRef($h);return O.useEffect(()=>{for(const x of Dh){const v=t[x],_=g.current[x];v!==_&&(typeof t[x]>"u"||(x==="nodes"?r(v):x==="edges"?i(v):x==="minZoom"?l(v):x==="maxZoom"?a(v):x==="translateExtent"?u(v):x==="nodeExtent"?d(v):x==="ariaLabelConfig"?y.setState({ariaLabelConfig:o1(v)}):x==="fitView"?y.setState({fitViewQueued:v}):x==="fitViewOptions"?y.setState({fitViewOptions:v}):y.setState({[x]:v})))}g.current=t},Dh.map(x=>t[x])),null}function Oh(){return typeof window>"u"||!window.matchMedia?null:window.matchMedia("(prefers-color-scheme: dark)")}function __(t){var l;const[r,i]=O.useState(t==="system"?null:t);return O.useEffect(()=>{if(t!=="system"){i(t);return}const a=Oh(),u=()=>i(a!=null&&a.matches?"dark":"light");return u(),a==null||a.addEventListener("change",u),()=>{a==null||a.removeEventListener("change",u)}},[t]),r!==null?r:(l=Oh())!=null&&l.matches?"dark":"light"}const Fh=typeof document<"u"?document:null;function _i(t=null,r={target:Fh,actInsideInputWithModifier:!0}){const[i,l]=O.useState(!1),a=O.useRef(!1),u=O.useRef(new Set([])),[d,f]=O.useMemo(()=>{if(t!==null){const y=(Array.isArray(t)?t:[t]).filter(x=>typeof x=="string").map(x=>x.replace(/\+/g,` -`).replace(` - -`,` -+`).split(` -`)),g=y.reduce((x,v)=>x.concat(...v),[]);return[y,g]}return[[],[]]},[t]);return O.useEffect(()=>{const p=(r==null?void 0:r.target)??Fh,y=(r==null?void 0:r.actInsideInputWithModifier)??!0;if(t!==null){const g=_=>{var E,N;if(a.current=_.ctrlKey||_.metaKey||_.shiftKey||_.altKey,(!a.current||a.current&&!y)&&cm(_))return!1;const C=Bh(_.code,f);if(u.current.add(_[C]),Hh(d,u.current,!1)){const b=((N=(E=_.composedPath)==null?void 0:E.call(_))==null?void 0:N[0])||_.target,k=(b==null?void 0:b.nodeName)==="BUTTON"||(b==null?void 0:b.nodeName)==="A";r.preventDefault!==!1&&(a.current||!k)&&_.preventDefault(),l(!0)}},x=_=>{const S=Bh(_.code,f);Hh(d,u.current,!0)?(l(!1),u.current.clear()):u.current.delete(_[S]),_.key==="Meta"&&u.current.clear(),a.current=!1},v=()=>{u.current.clear(),l(!1)};return p==null||p.addEventListener("keydown",g),p==null||p.addEventListener("keyup",x),window.addEventListener("blur",v),window.addEventListener("contextmenu",v),()=>{p==null||p.removeEventListener("keydown",g),p==null||p.removeEventListener("keyup",x),window.removeEventListener("blur",v),window.removeEventListener("contextmenu",v)}}},[t,l]),i}function Hh(t,r,i){return t.filter(l=>i||l.length===r.size).some(l=>l.every(a=>r.has(a)))}function Bh(t,r){return r.includes(t)?"code":"key"}const S_=()=>{const t=Oe();return O.useMemo(()=>({zoomIn:async r=>{const{panZoom:i}=t.getState();return i?i.scaleBy(1.2,r):!1},zoomOut:async r=>{const{panZoom:i}=t.getState();return i?i.scaleBy(1/1.2,r):!1},zoomTo:async(r,i)=>{const{panZoom:l}=t.getState();return l?l.scaleTo(r,i):!1},getZoom:()=>t.getState().transform[2],setViewport:async(r,i)=>{const{transform:[l,a,u],panZoom:d}=t.getState();return d?(await d.setViewport({x:r.x??l,y:r.y??a,zoom:r.zoom??u},i),!0):!1},getViewport:()=>{const[r,i,l]=t.getState().transform;return{x:r,y:i,zoom:l}},setCenter:async(r,i,l)=>t.getState().setCenter(r,i,l),fitBounds:async(r,i)=>{const{width:l,height:a,minZoom:u,maxZoom:d,panZoom:f}=t.getState(),p=uc(r,l,a,u,d,(i==null?void 0:i.padding)??.1);return f?(await f.setViewport(p,{duration:i==null?void 0:i.duration,ease:i==null?void 0:i.ease,interpolate:i==null?void 0:i.interpolate}),!0):!1},screenToFlowPosition:(r,i={})=>{const{transform:l,snapGrid:a,snapToGrid:u,domNode:d}=t.getState();if(!d)return r;const{x:f,y:p}=d.getBoundingClientRect(),y={x:r.x-f,y:r.y-p},g=i.snapGrid??a,x=i.snapToGrid??u;return Mi(y,l,x,g)},flowToScreenPosition:r=>{const{transform:i,domNode:l}=t.getState();if(!l)return r;const{x:a,y:u}=l.getBoundingClientRect(),d=yo(r,i);return{x:d.x+a,y:d.y+u}}}),[])};function Tm(t,r){const i=[],l=new Map,a=[];for(const u of t)if(u.type==="add"){a.push(u);continue}else if(u.type==="remove"||u.type==="replace")l.set(u.id,[u]);else{const d=l.get(u.id);d?d.push(u):l.set(u.id,[u])}for(const u of r){const d=l.get(u.id);if(!d){i.push(u);continue}if(d[0].type==="remove")continue;if(d[0].type==="replace"){i.push({...d[0].item});continue}const f={...u};for(const p of d)k_(p,f);i.push(f)}return a.length&&a.forEach(u=>{u.index!==void 0?i.splice(u.index,0,{...u.item}):i.push({...u.item})}),i}function k_(t,r){switch(t.type){case"select":{r.selected=t.selected;break}case"position":{typeof t.position<"u"&&(r.position=t.position),typeof t.dragging<"u"&&(r.dragging=t.dragging);break}case"dimensions":{typeof t.dimensions<"u"&&(r.measured={...t.dimensions},t.setAttributes&&((t.setAttributes===!0||t.setAttributes==="width")&&(r.width=t.dimensions.width),(t.setAttributes===!0||t.setAttributes==="height")&&(r.height=t.dimensions.height))),typeof t.resizing=="boolean"&&(r.resizing=t.resizing);break}}}function E_(t,r){return Tm(t,r)}function N_(t,r){return Tm(t,r)}function wr(t,r){return{id:t,type:"select",selected:r}}function uo(t,r=new Set,i=!1){const l=[];for(const[a,u]of t){const d=r.has(a);!(u.selected===void 0&&!d)&&u.selected!==d&&(i&&(u.selected=d),l.push(wr(u.id,d)))}return l}function Vh({items:t=[],lookup:r}){var a;const i=[],l=new Map(t.map(u=>[u.id,u]));for(const[u,d]of t.entries()){const f=r.get(d.id),p=((a=f==null?void 0:f.internals)==null?void 0:a.userNode)??f;p!==void 0&&p!==d&&i.push({id:d.id,item:d,type:"replace"}),p===void 0&&i.push({item:d,type:"add",index:u})}for(const[u]of r)l.get(u)===void 0&&i.push({id:u,type:"remove"});return i}function Uh(t){return{id:t.id,type:"remove"}}const C_=sm();function j_(t,r,i={}){return c1(t,r,{...i,onError:i.onError??C_})}const Wh=t=>Qw(t),M_=t=>tm(t);function Rm(t){return O.forwardRef(t)}const Lm=typeof window<"u"?O.useLayoutEffect:O.useEffect;function Yh(t){const[r,i]=O.useState(BigInt(0)),[l]=O.useState(()=>P_(()=>i(a=>a+BigInt(1))));return Lm(()=>{const a=l.get();a.length&&(t(a),l.reset())},[r]),l}function P_(t){let r=[];return{get:()=>r,reset:()=>{r=[]},push:i=>{r.push(i),t()}}}const zm=O.createContext(null);function I_({children:t}){const r=Oe(),i=O.useCallback(f=>{const{nodes:p=[],setNodes:y,hasDefaultNodes:g,onNodesChange:x,nodeLookup:v,fitViewQueued:_,onNodesChangeMiddlewareMap:S}=r.getState();let C=p;for(const N of f)C=typeof N=="function"?N(C):N;let E=Vh({items:C,lookup:v});for(const N of S.values())E=N(E);g&&y(C),E.length>0?x==null||x(E):_&&window.requestAnimationFrame(()=>{const{fitViewQueued:N,nodes:b,setNodes:k}=r.getState();N&&k(b)})},[]),l=Yh(i),a=O.useCallback(f=>{const{edges:p=[],setEdges:y,hasDefaultEdges:g,onEdgesChange:x,edgeLookup:v}=r.getState();let _=p;for(const S of f)_=typeof S=="function"?S(_):S;g?y(_):x&&x(Vh({items:_,lookup:v}))},[]),u=Yh(a),d=O.useMemo(()=>({nodeQueue:l,edgeQueue:u}),[]);return m.jsx(zm.Provider,{value:d,children:t})}function b_(){const t=O.useContext(zm);if(!t)throw new Error("useBatchContext must be used within a BatchProvider");return t}const T_=t=>!!t.panZoom;function gc(){const t=S_(),r=Oe(),i=b_(),l=be(T_),a=O.useMemo(()=>{const u=x=>r.getState().nodeLookup.get(x),d=x=>{i.nodeQueue.push(x)},f=x=>{i.edgeQueue.push(x)},p=x=>{var N,b;const{nodeLookup:v,nodeOrigin:_}=r.getState(),S=Wh(x)?x:v.get(x.id),C=S.parentId?am(S.position,S.measured,S.parentId,v,_):S.position,E={...S,position:C,width:((N=S.measured)==null?void 0:N.width)??S.width,height:((b=S.measured)==null?void 0:b.height)??S.height};return xi(E)},y=(x,v,_={replace:!1})=>{d(S=>S.map(C=>{if(C.id===x){const E=typeof v=="function"?v(C):v;return _.replace&&Wh(E)?E:{...C,...E}}return C}))},g=(x,v,_={replace:!1})=>{f(S=>S.map(C=>{if(C.id===x){const E=typeof v=="function"?v(C):v;return _.replace&&M_(E)?E:{...C,...E}}return C}))};return{getNodes:()=>r.getState().nodes.map(x=>({...x})),getNode:x=>{var v;return(v=u(x))==null?void 0:v.internals.userNode},getInternalNode:u,getEdges:()=>{const{edges:x=[]}=r.getState();return x.map(v=>({...v}))},getEdge:x=>r.getState().edgeLookup.get(x),setNodes:d,setEdges:f,addNodes:x=>{const v=Array.isArray(x)?x:[x];i.nodeQueue.push(_=>[..._,...v])},addEdges:x=>{const v=Array.isArray(x)?x:[x];i.edgeQueue.push(_=>[..._,...v])},toObject:()=>{const{nodes:x=[],edges:v=[],transform:_}=r.getState(),[S,C,E]=_;return{nodes:x.map(N=>({...N})),edges:v.map(N=>({...N})),viewport:{x:S,y:C,zoom:E}}},deleteElements:async({nodes:x=[],edges:v=[]})=>{const{nodes:_,edges:S,onNodesDelete:C,onEdgesDelete:E,triggerNodeChanges:N,triggerEdgeChanges:b,onDelete:k,onBeforeDelete:j}=r.getState(),{nodes:R,edges:D}=await e1({nodesToRemove:x,edgesToRemove:v,nodes:_,edges:S,onBeforeDelete:j}),H=D.length>0,X=R.length>0;if(H){const V=D.map(Uh);E==null||E(D),b(V)}if(X){const V=R.map(Uh);C==null||C(R),N(V)}return(X||H)&&(k==null||k({nodes:R,edges:D})),{deletedNodes:R,deletedEdges:D}},getIntersectingNodes:(x,v=!0,_)=>{const S=gh(x),C=S?x:p(x),E=_!==void 0;return C?(_||r.getState().nodes).filter(N=>{const b=r.getState().nodeLookup.get(N.id);if(b&&!S&&(N.id===x.id||!b.internals.positionAbsolute))return!1;const k=xi(E?N:b),j=hl(k,C);return v&&j>0||j>=k.width*k.height||j>=C.width*C.height}):[]},isNodeIntersecting:(x,v,_=!0)=>{const C=gh(x)?x:p(x);if(!C)return!1;const E=hl(C,v);return _&&E>0||E>=v.width*v.height||E>=C.width*C.height},updateNode:y,updateNodeData:(x,v,_={replace:!1})=>{y(x,S=>{const C=typeof v=="function"?v(S):v;return _.replace?{...S,data:C}:{...S,data:{...S.data,...C}}},_)},updateEdge:g,updateEdgeData:(x,v,_={replace:!1})=>{g(x,S=>{const C=typeof v=="function"?v(S):v;return _.replace?{...S,data:C}:{...S,data:{...S.data,...C}}},_)},getNodesBounds:x=>{const{nodeLookup:v,nodeOrigin:_}=r.getState();return Kw(x,{nodeLookup:v,nodeOrigin:_})},getHandleConnections:({type:x,id:v,nodeId:_})=>{var S;return Array.from(((S=r.getState().connectionLookup.get(`${_}-${x}${v?`-${v}`:""}`))==null?void 0:S.values())??[])},getNodeConnections:({type:x,handleId:v,nodeId:_})=>{var S;return Array.from(((S=r.getState().connectionLookup.get(`${_}${x?v?`-${x}-${v}`:`-${x}`:""}`))==null?void 0:S.values())??[])},fitView:async x=>{const v=r.getState().fitViewResolver??r1();return r.setState({fitViewQueued:!0,fitViewOptions:x,fitViewResolver:v}),i.nodeQueue.push(_=>[..._]),v.promise}}},[]);return O.useMemo(()=>({...a,...t,viewportInitialized:l}),[l])}const Xh=t=>t.selected,R_=typeof window<"u"?window:void 0;function L_({deleteKeyCode:t,multiSelectionKeyCode:r}){const i=Oe(),{deleteElements:l}=gc(),a=_i(t,{actInsideInputWithModifier:!1}),u=_i(r,{target:R_});O.useEffect(()=>{if(a){const{edges:d,nodes:f}=i.getState();l({nodes:f.filter(Xh),edges:d.filter(Xh)}),i.setState({nodesSelectionActive:!1})}},[a]),O.useEffect(()=>{i.setState({multiSelectionActive:u})},[u])}function z_(t){const r=Oe();O.useEffect(()=>{const i=()=>{var a,u,d,f;if(!t.current||!(((u=(a=t.current).checkVisibility)==null?void 0:u.call(a))??!0))return!1;const l=cc(t.current);(l.height===0||l.width===0)&&((f=(d=r.getState()).onError)==null||f.call(d,"004",tn.error004())),r.setState({width:l.width||500,height:l.height||500})};if(t.current){i(),window.addEventListener("resize",i);const l=new ResizeObserver(()=>i());return l.observe(t.current),()=>{window.removeEventListener("resize",i),l&&t.current&&l.unobserve(t.current)}}},[])}const jl={position:"absolute",width:"100%",height:"100%",top:0,left:0},A_=t=>({userSelectionActive:t.userSelectionActive,lib:t.lib,connectionInProgress:t.connection.inProgress});function D_({onPaneContextMenu:t,zoomOnScroll:r=!0,zoomOnPinch:i=!0,panOnScroll:l=!1,panActivationKeyPressed:a,panOnScrollSpeed:u=.5,panOnScrollMode:d=kr.Free,zoomOnDoubleClick:f=!0,panOnDrag:p=!0,defaultViewport:y,translateExtent:g,minZoom:x,maxZoom:v,zoomActivationKeyCode:_,preventScrolling:S=!0,children:C,noWheelClassName:E,noPanClassName:N,onViewportChange:b,isControlledViewport:k,paneClickDistance:j,selectionOnDrag:R}){const D=Oe(),H=O.useRef(null),{userSelectionActive:X,lib:V,connectionInProgress:ee}=be(A_,Ue),Z=_i(_),te=O.useRef();z_(H);const J=O.useCallback(M=>{b==null||b({x:M[0],y:M[1],zoom:M[2]}),k||D.setState({transform:M})},[b,k]);return O.useEffect(()=>{if(H.current){te.current=F1({domNode:H.current,minZoom:x,maxZoom:v,translateExtent:g,viewport:y,onDraggingChange:U=>D.setState(A=>A.paneDragging===U?A:{paneDragging:U}),onPanZoomStart:(U,A)=>{const{onViewportChangeStart:z,onMoveStart:F}=D.getState();F==null||F(U,A),z==null||z(A)},onPanZoom:(U,A)=>{const{onViewportChange:z,onMove:F}=D.getState();F==null||F(U,A),z==null||z(A)},onPanZoomEnd:(U,A)=>{const{onViewportChangeEnd:z,onMoveEnd:F}=D.getState();F==null||F(U,A),z==null||z(A)}});const{x:M,y:W,zoom:B}=te.current.getViewport();return D.setState({panZoom:te.current,transform:[M,W,B],domNode:H.current.closest(".react-flow")}),()=>{var U;(U=te.current)==null||U.destroy()}}},[]),O.useEffect(()=>{var M;(M=te.current)==null||M.update({onPaneContextMenu:t,zoomOnScroll:r,zoomOnPinch:i,panOnScroll:l,panActivationKeyPressed:a,panOnScrollSpeed:u,panOnScrollMode:d,zoomOnDoubleClick:f,panOnDrag:p,zoomActivationKeyPressed:Z,preventScrolling:S,noPanClassName:N,userSelectionActive:X,noWheelClassName:E,lib:V,onTransformChange:J,connectionInProgress:ee,selectionOnDrag:R,paneClickDistance:j})},[t,r,i,l,a,u,d,f,p,Z,S,N,X,E,V,J,ee,R,j]),m.jsx("div",{className:"react-flow__renderer",ref:H,style:jl,children:C})}const $_=t=>({userSelectionActive:t.userSelectionActive,userSelectionRect:t.userSelectionRect});function O_(){const{userSelectionActive:t,userSelectionRect:r}=be($_,Ue);return t&&r?m.jsx("div",{className:"react-flow__selection react-flow__container",style:{width:r.width,height:r.height,transform:`translate(${r.x}px, ${r.y}px)`}}):null}const Au=(t,r)=>i=>{i.target===r.current&&(t==null||t(i))},F_=t=>({userSelectionActive:t.userSelectionActive,elementsSelectable:t.elementsSelectable,dragging:t.paneDragging,panBy:t.panBy,autoPanSpeed:t.autoPanSpeed});function H_({isSelecting:t,selectionKeyPressed:r,selectionMode:i=yi.Full,panOnDrag:l,autoPanOnSelection:a,paneClickDistance:u,selectionOnDrag:d,onSelectionStart:f,onSelectionEnd:p,onPaneClick:y,onPaneContextMenu:g,onPaneScroll:x,onPaneMouseEnter:v,onPaneMouseMove:_,onPaneMouseLeave:S,children:C}){const E=O.useRef(0),N=Oe(),{userSelectionActive:b,elementsSelectable:k,dragging:j,panBy:R,autoPanSpeed:D}=be(F_,Ue),H=k&&(t||b),X=O.useRef(null),V=O.useRef(),ee=O.useRef(new Set),Z=O.useRef(new Set),te=O.useRef(!1),J=O.useRef(!1),M=O.useRef({x:0,y:0}),W=O.useRef(!1),B=Q=>{if(J.current||te.current||N.getState().connection.inProgress){J.current=!1,te.current=!1;return}y==null||y(Q),N.getState().resetSelectedElements(),N.setState({nodesSelectionActive:!1})},U=Q=>{if(Array.isArray(l)&&(l!=null&&l.includes(2))){Q.preventDefault();return}g==null||g(Q)},A=x?Q=>x(Q):void 0,z=Q=>{J.current&&(Q.stopPropagation(),J.current=!1)},F=Q=>{var Re,Xe;if(Q.pointerType==="touch"&&l!==!1&&!r)return;const{domNode:se,transform:fe}=N.getState();if(V.current=se==null?void 0:se.getBoundingClientRect(),!V.current)return;const me=Q.target===X.current;if(!me&&!!Q.target.closest(".nokey")||!t||!(d&&me||r)||Q.button!==0||!Q.isPrimary)return;(Xe=(Re=Q.target)==null?void 0:Re.setPointerCapture)==null||Xe.call(Re,Q.pointerId),J.current=!1;const{x:Ce,y:je}=en(Q.nativeEvent,V.current),Me=Mi({x:Ce,y:je},fe);N.setState({userSelectionRect:{width:0,height:0,startX:Me.x,startY:Me.y,x:Ce,y:je}}),me||(Q.stopPropagation(),Q.preventDefault())};function P(Q,se){const{userSelectionRect:fe}=N.getState();if(!fe)return;const{transform:me,nodeLookup:xe,edgeLookup:pe,connectionLookup:Ce,triggerNodeChanges:je,triggerEdgeChanges:Me,defaultEdgeOptions:Re}=N.getState(),Xe={x:fe.startX,y:fe.startY},{x:rt,y:Ze}=yo(Xe,me),Je={startX:Xe.x,startY:Xe.y,x:Qlt.id)),Z.current=new Set;const At=(Re==null?void 0:Re.selectable)??!0;for(const lt of ee.current){const ht=Ce.get(lt);if(ht)for(const{edgeId:ot}of ht.values()){const pt=pe.get(ot);pt&&(pt.selectable??At)&&Z.current.add(ot)}}if(!yh(Vt,ee.current)){const lt=uo(xe,ee.current,!0);je(lt)}if(!yh(zt,Z.current)){const lt=uo(pe,Z.current);Me(lt)}N.setState({userSelectionRect:Je,userSelectionActive:!0,nodesSelectionActive:!1})}function T(){if(!a||!V.current)return;const[Q,se]=ac(M.current,V.current,D);R({x:Q,y:se}).then(fe=>{if(!J.current||!fe){E.current=requestAnimationFrame(T);return}const{x:me,y:xe}=M.current;P(me,xe),E.current=requestAnimationFrame(T)})}const ne=()=>{cancelAnimationFrame(E.current),E.current=0,W.current=!1};O.useEffect(()=>()=>ne(),[]);const re=Q=>{const{userSelectionRect:se,transform:fe,resetSelectedElements:me}=N.getState();if(!V.current||!se)return;const{x:xe,y:pe}=en(Q.nativeEvent,V.current);M.current={x:xe,y:pe};const Ce=yo({x:se.startX,y:se.startY},fe);if(!J.current){const je=r?0:u;if(Math.hypot(xe-Ce.x,pe-Ce.y)<=je)return;me(),f==null||f(Q)}J.current=!0,W.current||(T(),W.current=!0),P(xe,pe)},ue=Q=>{var se,fe;if(!H){Q.target===X.current&&N.getState().connection.inProgress&&(te.current=!0);return}Q.button===0&&((fe=(se=Q.target)==null?void 0:se.releasePointerCapture)==null||fe.call(se,Q.pointerId),!b&&Q.target===X.current&&N.getState().userSelectionRect&&(B==null||B(Q)),N.setState({userSelectionActive:!1,userSelectionRect:null}),J.current&&(p==null||p(Q),N.setState({nodesSelectionActive:ee.current.size>0})),ne())},ce=Q=>{var se,fe;(fe=(se=Q.target)==null?void 0:se.releasePointerCapture)==null||fe.call(se,Q.pointerId),ne()},de=l===!0||Array.isArray(l)&&l.includes(0);return m.jsxs("div",{className:Qe(["react-flow__pane",{draggable:de,dragging:j,selection:t}]),onClick:H?void 0:Au(B,X),onContextMenu:Au(U,X),onWheel:Au(A,X),onPointerEnter:H?void 0:v,onPointerMove:H?re:_,onPointerUp:ue,onPointerCancel:H?ce:void 0,onPointerDownCapture:H?F:void 0,onClickCapture:H?z:void 0,onPointerLeave:S,ref:X,style:jl,children:[C,m.jsx(O_,{})]})}function Zu({id:t,store:r,unselect:i=!1,nodeRef:l}){const{addSelectedNodes:a,unselectNodesAndEdges:u,multiSelectionActive:d,nodeLookup:f,onError:p}=r.getState(),y=f.get(t);if(!y){p==null||p("012",tn.error012(t));return}r.setState({nodesSelectionActive:!1}),y.selected?(i||y.selected&&d)&&(u({nodes:[y],edges:[]}),requestAnimationFrame(()=>{var g;return(g=l==null?void 0:l.current)==null?void 0:g.blur()})):a([t])}function Am({nodeRef:t,disabled:r=!1,noDragClassName:i,handleSelector:l,nodeId:a,isSelectable:u,nodeClickDistance:d}){const f=Oe(),[p,y]=O.useState(!1),g=O.useRef();return O.useEffect(()=>{if(!r)return g.current=C1({getStoreItems:()=>f.getState(),onNodeMouseDown:x=>{Zu({id:x,store:f,nodeRef:t})},onDragStart:()=>{y(!0)},onDragStop:()=>{y(!1)}}),()=>{var x;(x=g.current)==null||x.destroy(),g.current=void 0}},[r,f,t]),O.useEffect(()=>{r||!t.current||!g.current||g.current.update({noDragClassName:i,handleSelector:l,domNode:t.current,isSelectable:u,nodeId:a,nodeClickDistance:d})},[i,l,r,u,t,a,d]),p}const B_=t=>r=>r.selected&&(r.draggable||t&&typeof r.draggable>"u");function Dm(){const t=Oe();return O.useCallback(i=>{const{nodeExtent:l,snapToGrid:a,snapGrid:u,nodesDraggable:d,onError:f,updateNodePositions:p,nodeLookup:y,nodeOrigin:g}=t.getState(),x=new Map,v=B_(d),_=a?u[0]:5,S=a?u[1]:5,C=i.direction.x*_*i.factor,E=i.direction.y*S*i.factor;for(const[,N]of y){if(!v(N))continue;let b={x:N.internals.positionAbsolute.x+C,y:N.internals.positionAbsolute.y+E};a&&(b=ji(b,u));const{position:k,positionAbsolute:j}=nm({nodeId:N.id,nextPosition:b,nodeLookup:y,nodeExtent:l,nodeOrigin:g,onError:f});N.position=k,N.internals.positionAbsolute=j,x.set(N.id,N)}p(x)},[])}const yc=O.createContext(null),V_=yc.Provider;yc.Consumer;const $m=()=>O.useContext(yc),U_=t=>({connectOnClick:t.connectOnClick,noPanClassName:t.noPanClassName,rfId:t.rfId}),Om=O.createContext(null);function W_({children:t}){const r=be(U_,Ue);return m.jsx(Om.Provider,{value:r,children:t})}function Y_(){const t=O.useContext(Om);if(!t)throw new Error("useHandleConfig must be used within a HandleConfigProvider");return t}const X_={connectingFrom:!1,connectingTo:!1,clickConnecting:!1,isPossibleEndHandle:!0,connectionInProcess:!1,clickConnectionInProcess:!1,valid:!1},G_=(t,r,i)=>l=>{const{connectionClickStartHandle:a,connectionMode:u,connection:d}=l,{fromHandle:f,toHandle:p,isValid:y}=d;if(!f&&!a)return X_;const g=(p==null?void 0:p.nodeId)===t&&(p==null?void 0:p.id)===r&&(p==null?void 0:p.type)===i;return{connectingFrom:(f==null?void 0:f.nodeId)===t&&(f==null?void 0:f.id)===r&&(f==null?void 0:f.type)===i,connectingTo:g,clickConnecting:(a==null?void 0:a.nodeId)===t&&(a==null?void 0:a.id)===r&&(a==null?void 0:a.type)===i,isPossibleEndHandle:u===mo.Strict?(f==null?void 0:f.type)!==i:t!==(f==null?void 0:f.nodeId)||r!==(f==null?void 0:f.id),connectionInProcess:!!f,clickConnectionInProcess:!!a,valid:g&&y}};function Q_({type:t="source",position:r=Se.Top,isValidConnection:i,isConnectable:l=!0,isConnectableStart:a=!0,isConnectableEnd:u=!0,id:d,onConnect:f,children:p,className:y,onMouseDown:g,onTouchStart:x,...v},_){var W,B;const S=d||null,C=t==="target",E=Oe(),N=$m(),{connectOnClick:b,noPanClassName:k,rfId:j}=Y_(),{connectingFrom:R,connectingTo:D,clickConnecting:H,isPossibleEndHandle:X,connectionInProcess:V,clickConnectionInProcess:ee,valid:Z}=be(G_(N,S,t),Ue);N||(B=(W=E.getState()).onError)==null||B.call(W,"010",tn.error010());const te=U=>{const{defaultEdgeOptions:A,onConnect:z,hasDefaultEdges:F}=E.getState(),P={...A,...U};if(F){const{edges:T,setEdges:ne,onError:re}=E.getState();ne(j_(P,T,{onError:re}))}z==null||z(P),f==null||f(P)},J=U=>{if(!N)return;const A=dm(U.nativeEvent);if(a&&(A&&U.button===0||!A)){const z=E.getState();qu.onPointerDown(U.nativeEvent,{handleDomNode:U.currentTarget,autoPanOnConnect:z.autoPanOnConnect,connectionMode:z.connectionMode,connectionRadius:z.connectionRadius,domNode:z.domNode,nodeLookup:z.nodeLookup,lib:z.lib,isTarget:C,handleId:S,nodeId:N,flowId:z.rfId,panBy:z.panBy,cancelConnection:z.cancelConnection,onConnectStart:z.onConnectStart,onConnectEnd:(...F)=>{var P,T;return(T=(P=E.getState()).onConnectEnd)==null?void 0:T.call(P,...F)},updateConnection:z.updateConnection,onConnect:te,isValidConnection:i||((...F)=>{var P,T;return((T=(P=E.getState()).isValidConnection)==null?void 0:T.call(P,...F))??!0}),getTransform:()=>E.getState().transform,getFromHandle:()=>E.getState().connection.fromHandle,autoPanSpeed:z.autoPanSpeed,dragThreshold:z.connectionDragThreshold})}A?g==null||g(U):x==null||x(U)},M=U=>{const{onClickConnectStart:A,onClickConnectEnd:z,connectionClickStartHandle:F,connectionMode:P,isValidConnection:T,lib:ne,rfId:re,nodeLookup:ue,connection:ce}=E.getState();if(!N||!F&&!a)return;if(!F){A==null||A(U.nativeEvent,{nodeId:N,handleId:S,handleType:t}),E.setState({connectionClickStartHandle:{nodeId:N,type:t,id:S}});return}const de=um(U.target),Q=i||T,{connection:se,isValid:fe}=qu.isValid(U.nativeEvent,{handle:{nodeId:N,id:S,type:t},connectionMode:P,fromNodeId:F.nodeId,fromHandleId:F.id||null,fromType:F.type,isValidConnection:Q,flowId:re,doc:de,lib:ne,nodeLookup:ue});fe&&se&&te(se);const me=structuredClone(ce);delete me.inProgress,me.toPosition=me.toHandle?me.toHandle.position:null,z==null||z(U,me),E.setState({connectionClickStartHandle:null})};return m.jsx("div",{"data-handleid":S,"data-nodeid":N,"data-handlepos":r,"data-id":`${j}-${N}-${S}-${t}`,className:Qe(["react-flow__handle",`react-flow__handle-${r}`,"nodrag",k,y,{source:!C,target:C,connectable:l,connectablestart:a,connectableend:u,clickconnecting:H,connectingfrom:R,connectingto:D,valid:Z,connectionindicator:l&&(!V||X)&&(V||ee?u:a)}]),onMouseDown:J,onTouchStart:J,onClick:b?M:void 0,ref:_,...v,children:p})}const xo=O.memo(Rm(Q_));function K_({data:t,isConnectable:r,sourcePosition:i=Se.Bottom}){return m.jsxs(m.Fragment,{children:[t==null?void 0:t.label,m.jsx(xo,{type:"source",position:i,isConnectable:r})]})}function q_({data:t,isConnectable:r,targetPosition:i=Se.Top,sourcePosition:l=Se.Bottom}){return m.jsxs(m.Fragment,{children:[m.jsx(xo,{type:"target",position:i,isConnectable:r}),t==null?void 0:t.label,m.jsx(xo,{type:"source",position:l,isConnectable:r})]})}function Z_(){return null}function J_({data:t,isConnectable:r,targetPosition:i=Se.Top}){return m.jsxs(m.Fragment,{children:[m.jsx(xo,{type:"target",position:i,isConnectable:r}),t==null?void 0:t.label]})}const pl={ArrowUp:{x:0,y:-1},ArrowDown:{x:0,y:1},ArrowLeft:{x:-1,y:0},ArrowRight:{x:1,y:0}},Gh={input:K_,default:q_,output:J_,group:Z_};function eS(t){var r,i,l,a;return t.internals.handleBounds===void 0?{width:t.width??t.initialWidth??((r=t.style)==null?void 0:r.width),height:t.height??t.initialHeight??((i=t.style)==null?void 0:i.height)}:{width:t.width??((l=t.style)==null?void 0:l.width),height:t.height??((a=t.style)==null?void 0:a.height)}}const tS=t=>{const{width:r,height:i,x:l,y:a}=Ci(t.nodeLookup,{filter:u=>!!u.selected});return{width:Jt(r)?r:null,height:Jt(i)?i:null,userSelectionActive:t.userSelectionActive,transformString:`translate(${t.transform[0]}px,${t.transform[1]}px) scale(${t.transform[2]}) translate(${l}px,${a}px)`}};function nS({onSelectionContextMenu:t,noPanClassName:r,disableKeyboardA11y:i}){const l=Oe(),{width:a,height:u,transformString:d,userSelectionActive:f}=be(tS,Ue),p=Dm(),y=O.useRef(null);O.useEffect(()=>{var _;i||(_=y.current)==null||_.focus({preventScroll:!0})},[i]);const g=!f&&a!==null&&u!==null;if(Am({nodeRef:y,disabled:!g}),!g)return null;const x=t?_=>{const S=l.getState().nodes.filter(C=>C.selected);t(_,S)}:void 0,v=_=>{Object.prototype.hasOwnProperty.call(pl,_.key)&&(_.preventDefault(),p({direction:pl[_.key],factor:_.shiftKey?4:1}))};return m.jsx("div",{className:Qe(["react-flow__nodesselection","react-flow__container",r]),style:{transform:d},children:m.jsx("div",{ref:y,className:"react-flow__nodesselection-rect",onContextMenu:x,tabIndex:i?void 0:-1,onKeyDown:i?void 0:v,style:{width:a,height:u}})})}const Qh=typeof window<"u"?window:void 0,rS=t=>({nodesSelectionActive:t.nodesSelectionActive,userSelectionActive:t.userSelectionActive});function Fm({children:t,onPaneClick:r,onPaneMouseEnter:i,onPaneMouseMove:l,onPaneMouseLeave:a,onPaneContextMenu:u,onPaneScroll:d,paneClickDistance:f,deleteKeyCode:p,selectionKeyCode:y,selectionOnDrag:g,selectionMode:x,onSelectionStart:v,onSelectionEnd:_,multiSelectionKeyCode:S,panActivationKeyCode:C,zoomActivationKeyCode:E,elementsSelectable:N,zoomOnScroll:b,zoomOnPinch:k,panOnScroll:j,panOnScrollSpeed:R,panOnScrollMode:D,zoomOnDoubleClick:H,panOnDrag:X,autoPanOnSelection:V,defaultViewport:ee,translateExtent:Z,minZoom:te,maxZoom:J,preventScrolling:M,onSelectionContextMenu:W,noWheelClassName:B,noPanClassName:U,disableKeyboardA11y:A,onViewportChange:z,isControlledViewport:F}){const{nodesSelectionActive:P,userSelectionActive:T}=be(rS,Ue),ne=_i(y,{target:Qh}),re=_i(C,{target:Qh}),ue=re||X,ce=re||j,de=g&&ue!==!0,Q=ne||T||de;return L_({deleteKeyCode:p,multiSelectionKeyCode:S}),m.jsx(D_,{onPaneContextMenu:u,elementsSelectable:N,zoomOnScroll:b,zoomOnPinch:k,panOnScroll:ce,panActivationKeyPressed:re,panOnScrollSpeed:R,panOnScrollMode:D,zoomOnDoubleClick:H,panOnDrag:!ne&&ue,defaultViewport:ee,translateExtent:Z,minZoom:te,maxZoom:J,zoomActivationKeyCode:E,preventScrolling:M,noWheelClassName:B,noPanClassName:U,onViewportChange:z,isControlledViewport:F,paneClickDistance:f,selectionOnDrag:de,children:m.jsxs(H_,{onSelectionStart:v,onSelectionEnd:_,onPaneClick:r,onPaneMouseEnter:i,onPaneMouseMove:l,onPaneMouseLeave:a,onPaneContextMenu:u,onPaneScroll:d,panOnDrag:ue,autoPanOnSelection:V,isSelecting:!!Q,selectionMode:x,selectionKeyPressed:ne,paneClickDistance:f,selectionOnDrag:de,children:[t,P&&m.jsx(nS,{onSelectionContextMenu:W,noPanClassName:U,disableKeyboardA11y:A})]})})}Fm.displayName="FlowRenderer";const oS=O.memo(Fm),iS=t=>r=>t?lc(r.nodeLookup,{x:0,y:0,width:r.width,height:r.height},r.transform,!0).map(i=>i.id):Array.from(r.nodeLookup.keys());function sS(t){return be(O.useCallback(iS(t),[t]),Ue)}const lS=t=>t.updateNodeInternals;function aS(){const t=be(lS),[r]=O.useState(()=>typeof ResizeObserver>"u"?null:new ResizeObserver(i=>{const l=new Map;i.forEach(a=>{const u=a.target.getAttribute("data-id");l.set(u,{id:u,nodeElement:a.target,force:!0})}),t(l)}));return O.useEffect(()=>()=>{r==null||r.disconnect()},[r]),r}function uS({node:t,nodeType:r,hasDimensions:i,resizeObserver:l}){const a=Oe(),u=O.useRef(null),d=O.useRef(null),f=O.useRef(t.sourcePosition),p=O.useRef(t.targetPosition),y=O.useRef(r),g=i&&!!t.internals.handleBounds;return O.useEffect(()=>{u.current&&!t.hidden&&(!g||d.current!==u.current)&&(d.current&&(l==null||l.unobserve(d.current)),l==null||l.observe(u.current),d.current=u.current)},[g,t.hidden]),O.useEffect(()=>()=>{d.current&&(l==null||l.unobserve(d.current),d.current=null)},[]),O.useEffect(()=>{if(u.current){const x=y.current!==r,v=f.current!==t.sourcePosition,_=p.current!==t.targetPosition;(x||v||_)&&(y.current=r,f.current=t.sourcePosition,p.current=t.targetPosition,a.getState().updateNodeInternals(new Map([[t.id,{id:t.id,nodeElement:u.current,force:!0}]])))}},[t.id,r,t.sourcePosition,t.targetPosition]),u}function cS({id:t,onClick:r,onMouseEnter:i,onMouseMove:l,onMouseLeave:a,onContextMenu:u,onDoubleClick:d,nodesDraggable:f,elementsSelectable:p,nodesConnectable:y,nodesFocusable:g,resizeObserver:x,noDragClassName:v,noPanClassName:_,disableKeyboardA11y:S,rfId:C,nodeTypes:E,nodeClickDistance:N,onError:b}){const{node:k,internals:j,isParent:R}=be(Q=>{const se=Q.nodeLookup.get(t),fe=Q.parentLookup.has(t);return{node:se,internals:se.internals,isParent:fe}},Ue);let D=k.type||"default",H=(E==null?void 0:E[D])||Gh[D];H===void 0&&(b==null||b("003",tn.error003(D)),D="default",H=(E==null?void 0:E.default)||Gh.default);const X=!!(k.draggable||f&&typeof k.draggable>"u"),V=!!(k.selectable||p&&typeof k.selectable>"u"),ee=!!(k.connectable||y&&typeof k.connectable>"u"),Z=!!(k.focusable||g&&typeof k.focusable>"u"),te=Oe(),J=lm(k),M=uS({node:k,nodeType:D,hasDimensions:J,resizeObserver:x}),W=Am({nodeRef:M,disabled:k.hidden||!X,noDragClassName:v,handleSelector:k.dragHandle,nodeId:t,isSelectable:V,nodeClickDistance:N}),B=Dm();if(k.hidden)return null;const U=rn(k),A=eS(k),z=V||X||r||i||l||a,F=i?Q=>i(Q,{...j.userNode}):void 0,P=l?Q=>l(Q,{...j.userNode}):void 0,T=a?Q=>a(Q,{...j.userNode}):void 0,ne=u?Q=>u(Q,{...j.userNode}):void 0,re=d?Q=>d(Q,{...j.userNode}):void 0,ue=Q=>{const{selectNodesOnDrag:se,nodeDragThreshold:fe}=te.getState();V&&(!se||!X||fe>0)&&Zu({id:t,store:te,nodeRef:M}),r&&r(Q,{...j.userNode})},ce=Q=>{if(!(cm(Q.nativeEvent)||S)){if(qp.includes(Q.key)&&V){const se=Q.key==="Escape";Zu({id:t,store:te,unselect:se,nodeRef:M})}else if(X&&k.selected&&Object.prototype.hasOwnProperty.call(pl,Q.key)){Q.preventDefault();const{ariaLabelConfig:se}=te.getState();te.setState({ariaLiveMessage:se["node.a11yDescription.ariaLiveMessage"]({direction:Q.key.replace("Arrow","").toLowerCase(),x:~~j.positionAbsolute.x,y:~~j.positionAbsolute.y})}),B({direction:pl[Q.key],factor:Q.shiftKey?4:1})}}},de=()=>{var Ce;if(S||!((Ce=M.current)!=null&&Ce.matches(":focus-visible")))return;const{transform:Q,width:se,height:fe,autoPanOnNodeFocus:me,setCenter:xe}=te.getState();if(!me)return;lc(new Map([[t,k]]),{x:0,y:0,width:se,height:fe},Q,!0).length>0||xe(k.position.x+U.width/2,k.position.y+U.height/2,{zoom:Q[2]})};return m.jsx("div",{className:Qe(["react-flow__node",`react-flow__node-${D}`,{[_]:X},k.className,{selected:k.selected,selectable:V,parent:R,draggable:X,dragging:W}]),ref:M,style:{zIndex:j.z,transform:`translate(${j.positionAbsolute.x}px,${j.positionAbsolute.y}px)`,pointerEvents:z?"all":"none",visibility:J?"visible":"hidden",...k.style,...A},"data-id":t,"data-testid":`rf__node-${t}`,onMouseEnter:F,onMouseMove:P,onMouseLeave:T,onContextMenu:ne,onClick:ue,onDoubleClick:re,onKeyDown:Z?ce:void 0,tabIndex:Z?0:void 0,onFocus:Z?de:void 0,role:k.ariaRole??(Z?"group":void 0),"aria-roledescription":"node","aria-describedby":S?void 0:`${Pm}-${C}`,"aria-label":k.ariaLabel,...k.domAttributes,children:m.jsx(V_,{value:t,children:m.jsx(H,{id:t,data:k.data,type:D,positionAbsoluteX:j.positionAbsolute.x,positionAbsoluteY:j.positionAbsolute.y,selected:k.selected??!1,selectable:V,draggable:X,deletable:k.deletable??!0,isConnectable:ee,sourcePosition:k.sourcePosition,targetPosition:k.targetPosition,dragging:W,dragHandle:k.dragHandle,zIndex:j.z,parentId:k.parentId,...U})})})}var dS=O.memo(cS);const fS=t=>({nodesConnectable:t.nodesConnectable,nodesFocusable:t.nodesFocusable,elementsSelectable:t.elementsSelectable,onError:t.onError});function Hm(t){const{nodesConnectable:r,nodesFocusable:i,elementsSelectable:l,onError:a}=be(fS,Ue),u=sS(t.onlyRenderVisibleElements),d=aS();return m.jsx("div",{className:"react-flow__nodes",style:jl,children:u.map(f=>m.jsx(dS,{id:f,nodeTypes:t.nodeTypes,nodeExtent:t.nodeExtent,onClick:t.onNodeClick,onMouseEnter:t.onNodeMouseEnter,onMouseMove:t.onNodeMouseMove,onMouseLeave:t.onNodeMouseLeave,onContextMenu:t.onNodeContextMenu,onDoubleClick:t.onNodeDoubleClick,noDragClassName:t.noDragClassName,noPanClassName:t.noPanClassName,rfId:t.rfId,disableKeyboardA11y:t.disableKeyboardA11y,resizeObserver:d,nodesDraggable:t.nodesDraggable??!0,nodesConnectable:r,nodesFocusable:i,elementsSelectable:l,nodeClickDistance:t.nodeClickDistance,onError:a},f))})}Hm.displayName="NodeRenderer";const hS=O.memo(Hm);function pS(t){return be(O.useCallback(i=>{if(!t)return i.edges.map(a=>a.id);const l=[];if(i.width&&i.height)for(const a of i.edges){const u=i.nodeLookup.get(a.source),d=i.nodeLookup.get(a.target);u&&d&&l1({sourceNode:u,targetNode:d,width:i.width,height:i.height,transform:i.transform})&&l.push(a.id)}return l},[t]),Ue)}const mS=({color:t="none",strokeWidth:r=1})=>{const i={strokeWidth:r,...t&&{stroke:t}};return m.jsx("polyline",{className:"arrow",style:i,strokeLinecap:"round",fill:"none",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4"})},gS=({color:t="none",strokeWidth:r=1})=>{const i={strokeWidth:r,...t&&{stroke:t,fill:t}};return m.jsx("polyline",{className:"arrowclosed",style:i,strokeLinecap:"round",strokeLinejoin:"round",points:"-5,-4 0,0 -5,4 -5,-4"})},Kh={[vi.Arrow]:mS,[vi.ArrowClosed]:gS};function yS(t){const r=Oe();return O.useMemo(()=>{var a,u;return Object.prototype.hasOwnProperty.call(Kh,t)?Kh[t]:((u=(a=r.getState()).onError)==null||u.call(a,"009",tn.error009(t)),null)},[t])}const vS=({id:t,type:r,color:i,width:l=12.5,height:a=12.5,markerUnits:u="strokeWidth",strokeWidth:d,orient:f="auto-start-reverse"})=>{const p=yS(r);return p?m.jsx("marker",{className:"react-flow__arrowhead",id:t,markerWidth:`${l}`,markerHeight:`${a}`,viewBox:"-10 -10 20 20",markerUnits:u,orient:f,refX:"0",refY:"0",children:m.jsx(p,{color:i,strokeWidth:d})}):null},Bm=({defaultColor:t,rfId:r})=>{const i=be(u=>u.edges),l=be(u=>u.defaultEdgeOptions),a=O.useMemo(()=>m1(i,{id:r,defaultColor:t,defaultMarkerStart:l==null?void 0:l.markerStart,defaultMarkerEnd:l==null?void 0:l.markerEnd}),[i,l,r,t]);return a.length?m.jsx("svg",{className:"react-flow__marker","aria-hidden":"true",children:m.jsx("defs",{children:a.map(u=>m.jsx(vS,{id:u.id,type:u.type,color:u.color,width:u.width,height:u.height,markerUnits:u.markerUnits,strokeWidth:u.strokeWidth,orient:u.orient},u.id))})}):null};Bm.displayName="MarkerDefinitions";var xS=O.memo(Bm);function Vm({x:t,y:r,label:i,labelStyle:l,labelShowBg:a=!0,labelBgStyle:u,labelBgPadding:d=[2,4],labelBgBorderRadius:f=2,children:p,className:y,...g}){const[x,v]=O.useState({x:1,y:0,width:0,height:0}),_=Qe(["react-flow__edge-textwrapper",y]),S=O.useRef(null);return O.useEffect(()=>{if(S.current){const C=S.current.getBBox();v({x:C.x,y:C.y,width:C.width,height:C.height})}},[i]),i?m.jsxs("g",{transform:`translate(${t-x.width/2} ${r-x.height/2})`,className:_,visibility:x.width?"visible":"hidden",...g,children:[a&&m.jsx("rect",{width:x.width+2*d[0],x:-d[0],y:-d[1],height:x.height+2*d[1],className:"react-flow__edge-textbg",style:u,rx:f,ry:f}),m.jsx("text",{className:"react-flow__edge-text",y:x.height/2,dy:"0.3em",ref:S,style:l,children:i}),p]}):null}Vm.displayName="EdgeText";const wS=O.memo(Vm);function Ml({path:t,labelX:r,labelY:i,label:l,labelStyle:a,labelShowBg:u,labelBgStyle:d,labelBgPadding:f,labelBgBorderRadius:p,interactionWidth:y=20,...g}){return m.jsxs(m.Fragment,{children:[m.jsx("path",{...g,d:t,fill:"none",className:Qe(["react-flow__edge-path",g.className])}),y?m.jsx("path",{d:t,fill:"none",strokeOpacity:0,strokeWidth:y,className:"react-flow__edge-interaction"}):null,l&&Jt(r)&&Jt(i)?m.jsx(wS,{x:r,y:i,label:l,labelStyle:a,labelShowBg:u,labelBgStyle:d,labelBgPadding:f,labelBgBorderRadius:p}):null]})}function qh({pos:t,x1:r,y1:i,x2:l,y2:a}){return t===Se.Left||t===Se.Right?[.5*(r+l),i]:[r,.5*(i+a)]}function Um({sourceX:t,sourceY:r,sourcePosition:i=Se.Bottom,targetX:l,targetY:a,targetPosition:u=Se.Top}){const[d,f]=qh({pos:i,x1:t,y1:r,x2:l,y2:a}),[p,y]=qh({pos:u,x1:l,y1:a,x2:t,y2:r}),[g,x,v,_]=fm({sourceX:t,sourceY:r,targetX:l,targetY:a,sourceControlX:d,sourceControlY:f,targetControlX:p,targetControlY:y});return[`M${t},${r} C${d},${f} ${p},${y} ${l},${a}`,g,x,v,_]}function Wm(t){return O.memo(({id:r,sourceX:i,sourceY:l,targetX:a,targetY:u,sourcePosition:d,targetPosition:f,label:p,labelStyle:y,labelShowBg:g,labelBgStyle:x,labelBgPadding:v,labelBgBorderRadius:_,style:S,markerEnd:C,markerStart:E,interactionWidth:N})=>{const[b,k,j]=Um({sourceX:i,sourceY:l,sourcePosition:d,targetX:a,targetY:u,targetPosition:f}),R=t.isInternal?void 0:r;return m.jsx(Ml,{id:R,path:b,labelX:k,labelY:j,label:p,labelStyle:y,labelShowBg:g,labelBgStyle:x,labelBgPadding:v,labelBgBorderRadius:_,style:S,markerEnd:C,markerStart:E,interactionWidth:N})})}const _S=Wm({isInternal:!1}),Ym=Wm({isInternal:!0});_S.displayName="SimpleBezierEdge";Ym.displayName="SimpleBezierEdgeInternal";function Xm(t){return O.memo(({id:r,sourceX:i,sourceY:l,targetX:a,targetY:u,label:d,labelStyle:f,labelShowBg:p,labelBgStyle:y,labelBgPadding:g,labelBgBorderRadius:x,style:v,sourcePosition:_=Se.Bottom,targetPosition:S=Se.Top,markerEnd:C,markerStart:E,pathOptions:N,interactionWidth:b})=>{const[k,j,R]=Gu({sourceX:i,sourceY:l,sourcePosition:_,targetX:a,targetY:u,targetPosition:S,borderRadius:N==null?void 0:N.borderRadius,offset:N==null?void 0:N.offset,stepPosition:N==null?void 0:N.stepPosition}),D=t.isInternal?void 0:r;return m.jsx(Ml,{id:D,path:k,labelX:j,labelY:R,label:d,labelStyle:f,labelShowBg:p,labelBgStyle:y,labelBgPadding:g,labelBgBorderRadius:x,style:v,markerEnd:C,markerStart:E,interactionWidth:b})})}const Gm=Xm({isInternal:!1}),Qm=Xm({isInternal:!0});Gm.displayName="SmoothStepEdge";Qm.displayName="SmoothStepEdgeInternal";function Km(t){return O.memo(({id:r,...i})=>{var a;const l=t.isInternal?void 0:r;return m.jsx(Gm,{...i,id:l,pathOptions:O.useMemo(()=>{var u;return{borderRadius:0,offset:(u=i.pathOptions)==null?void 0:u.offset}},[(a=i.pathOptions)==null?void 0:a.offset])})})}const SS=Km({isInternal:!1}),qm=Km({isInternal:!0});SS.displayName="StepEdge";qm.displayName="StepEdgeInternal";function Zm(t){return O.memo(({id:r,sourceX:i,sourceY:l,targetX:a,targetY:u,label:d,labelStyle:f,labelShowBg:p,labelBgStyle:y,labelBgPadding:g,labelBgBorderRadius:x,style:v,markerEnd:_,markerStart:S,interactionWidth:C})=>{const[E,N,b]=mm({sourceX:i,sourceY:l,targetX:a,targetY:u}),k=t.isInternal?void 0:r;return m.jsx(Ml,{id:k,path:E,labelX:N,labelY:b,label:d,labelStyle:f,labelShowBg:p,labelBgStyle:y,labelBgPadding:g,labelBgBorderRadius:x,style:v,markerEnd:_,markerStart:S,interactionWidth:C})})}const kS=Zm({isInternal:!1}),Jm=Zm({isInternal:!0});kS.displayName="StraightEdge";Jm.displayName="StraightEdgeInternal";function eg(t){return O.memo(({id:r,sourceX:i,sourceY:l,targetX:a,targetY:u,sourcePosition:d=Se.Bottom,targetPosition:f=Se.Top,label:p,labelStyle:y,labelShowBg:g,labelBgStyle:x,labelBgPadding:v,labelBgBorderRadius:_,style:S,markerEnd:C,markerStart:E,pathOptions:N,interactionWidth:b})=>{const[k,j,R]=hm({sourceX:i,sourceY:l,sourcePosition:d,targetX:a,targetY:u,targetPosition:f,curvature:N==null?void 0:N.curvature}),D=t.isInternal?void 0:r;return m.jsx(Ml,{id:D,path:k,labelX:j,labelY:R,label:p,labelStyle:y,labelShowBg:g,labelBgStyle:x,labelBgPadding:v,labelBgBorderRadius:_,style:S,markerEnd:C,markerStart:E,interactionWidth:b})})}const ES=eg({isInternal:!1}),tg=eg({isInternal:!0});ES.displayName="BezierEdge";tg.displayName="BezierEdgeInternal";const Zh={default:tg,straight:Jm,step:qm,smoothstep:Qm,simplebezier:Ym},Jh={sourceX:null,sourceY:null,targetX:null,targetY:null,sourcePosition:null,targetPosition:null,zIndex:void 0},NS=(t,r,i)=>i===Se.Left?t-r:i===Se.Right?t+r:t,CS=(t,r,i)=>i===Se.Top?t-r:i===Se.Bottom?t+r:t,ep="react-flow__edgeupdater";function tp({position:t,centerX:r,centerY:i,radius:l=10,onMouseDown:a,onMouseEnter:u,onMouseOut:d,type:f}){return m.jsx("circle",{onMouseDown:a,onMouseEnter:u,onMouseOut:d,className:Qe([ep,`${ep}-${f}`]),cx:NS(r,l,t),cy:CS(i,l,t),r:l,stroke:"transparent",fill:"transparent"})}function jS({isReconnectable:t,reconnectRadius:r,edge:i,sourceX:l,sourceY:a,targetX:u,targetY:d,sourcePosition:f,targetPosition:p,onReconnect:y,onReconnectStart:g,onReconnectEnd:x,setReconnecting:v,setUpdateHover:_}){const S=Oe(),C=(j,R)=>{if(j.button!==0)return;const{autoPanOnConnect:D,domNode:H,connectionMode:X,connectionRadius:V,lib:ee,onConnectStart:Z,cancelConnection:te,nodeLookup:J,rfId:M,panBy:W,updateConnection:B}=S.getState(),U=R.type==="target",A=(P,T)=>{v(!1),x==null||x(P,i,R.type,T)},z=P=>y==null?void 0:y(i,P),F=(P,T)=>{v(!0),g==null||g(j,i,R.type),Z==null||Z(P,T)};qu.onPointerDown(j.nativeEvent,{autoPanOnConnect:D,connectionMode:X,connectionRadius:V,domNode:H,handleId:R.id,nodeId:R.nodeId,nodeLookup:J,isTarget:U,edgeUpdaterType:R.type,lib:ee,flowId:M,cancelConnection:te,panBy:W,isValidConnection:(...P)=>{var T,ne;return((ne=(T=S.getState()).isValidConnection)==null?void 0:ne.call(T,...P))??!0},onConnect:z,onConnectStart:F,onConnectEnd:(...P)=>{var T,ne;return(ne=(T=S.getState()).onConnectEnd)==null?void 0:ne.call(T,...P)},onReconnectEnd:A,updateConnection:B,getTransform:()=>S.getState().transform,getFromHandle:()=>S.getState().connection.fromHandle,dragThreshold:S.getState().connectionDragThreshold,handleDomNode:j.currentTarget})},E=j=>C(j,{nodeId:i.target,id:i.targetHandle??null,type:"target"}),N=j=>C(j,{nodeId:i.source,id:i.sourceHandle??null,type:"source"}),b=()=>_(!0),k=()=>_(!1);return m.jsxs(m.Fragment,{children:[(t===!0||t==="source")&&m.jsx(tp,{position:f,centerX:l,centerY:a,radius:r,onMouseDown:E,onMouseEnter:b,onMouseOut:k,type:"source"}),(t===!0||t==="target")&&m.jsx(tp,{position:p,centerX:u,centerY:d,radius:r,onMouseDown:N,onMouseEnter:b,onMouseOut:k,type:"target"})]})}function MS({id:t,edgesFocusable:r,edgesReconnectable:i,elementsSelectable:l,onClick:a,onDoubleClick:u,onContextMenu:d,onMouseEnter:f,onMouseMove:p,onMouseLeave:y,reconnectRadius:g,onReconnect:x,onReconnectStart:v,onReconnectEnd:_,rfId:S,edgeTypes:C,noPanClassName:E,onError:N,disableKeyboardA11y:b}){let k=be(xe=>xe.edgeLookup.get(t));const j=be(xe=>xe.defaultEdgeOptions);k=j?{...j,...k}:k;let R=k.type||"default",D=(C==null?void 0:C[R])||Zh[R];D===void 0&&(N==null||N("011",tn.error011(R)),R="default",D=(C==null?void 0:C.default)||Zh.default);const H=!!(k.focusable||r&&typeof k.focusable>"u"),X=typeof x<"u"&&(k.reconnectable||i&&typeof k.reconnectable>"u"),V=!!(k.selectable||l&&typeof k.selectable>"u"),ee=O.useRef(null),[Z,te]=O.useState(!1),[J,M]=O.useState(!1),W=Oe(),{zIndex:B=k.zIndex,sourceX:U,sourceY:A,targetX:z,targetY:F,sourcePosition:P,targetPosition:T}=be(O.useCallback(xe=>{const pe=xe.nodeLookup.get(k.source),Ce=xe.nodeLookup.get(k.target);if(!pe||!Ce)return Jh;const je=p1({id:t,sourceNode:pe,targetNode:Ce,sourceHandle:k.sourceHandle||null,targetHandle:k.targetHandle||null,connectionMode:xe.connectionMode,onError:N}),Me=s1({selected:k.selected,zIndex:k.zIndex,sourceNode:pe,targetNode:Ce,elevateOnSelect:xe.elevateEdgesOnSelect,zIndexMode:xe.zIndexMode});return{...je||Jh,zIndex:Me}},[k.source,k.target,k.sourceHandle,k.targetHandle,k.selected,k.zIndex,N]),Ue),ne=O.useMemo(()=>k.markerStart?`url('#${Qu(k.markerStart,S)}')`:void 0,[k.markerStart,S]),re=O.useMemo(()=>k.markerEnd?`url('#${Qu(k.markerEnd,S)}')`:void 0,[k.markerEnd,S]);if(k.hidden||U===null||A===null||z===null||F===null)return null;const ue=xe=>{var Me;const{addSelectedEdges:pe,unselectNodesAndEdges:Ce,multiSelectionActive:je}=W.getState();V&&(W.setState({nodesSelectionActive:!1}),k.selected&&je?(Ce({nodes:[],edges:[k]}),(Me=ee.current)==null||Me.blur()):pe([t])),a&&a(xe,k)},ce=u?xe=>{u(xe,{...k})}:void 0,de=d?xe=>{d(xe,{...k})}:void 0,Q=f?xe=>{f(xe,{...k})}:void 0,se=p?xe=>{p(xe,{...k})}:void 0,fe=y?xe=>{y(xe,{...k})}:void 0,me=xe=>{var pe;if(!b&&qp.includes(xe.key)&&V){const{unselectNodesAndEdges:Ce,addSelectedEdges:je}=W.getState();xe.key==="Escape"?((pe=ee.current)==null||pe.blur(),Ce({edges:[k]})):je([t])}};return m.jsx("svg",{style:{zIndex:B},children:m.jsxs("g",{className:Qe(["react-flow__edge",`react-flow__edge-${R}`,k.className,E,{selected:k.selected,animated:k.animated,inactive:!V&&!a,updating:Z,selectable:V}]),onClick:ue,onDoubleClick:ce,onContextMenu:de,onMouseEnter:Q,onMouseMove:se,onMouseLeave:fe,onKeyDown:H?me:void 0,tabIndex:H?0:void 0,role:k.ariaRole??(H?"group":"img"),"aria-roledescription":"edge","data-id":t,"data-testid":`rf__edge-${t}`,"aria-label":k.ariaLabel===null?void 0:k.ariaLabel||`Edge from ${k.source} to ${k.target}`,"aria-describedby":H?`${Im}-${S}`:void 0,ref:ee,...k.domAttributes,children:[!J&&m.jsx(D,{id:t,source:k.source,target:k.target,type:k.type,selected:k.selected,animated:k.animated,selectable:V,deletable:k.deletable??!0,label:k.label,labelStyle:k.labelStyle,labelShowBg:k.labelShowBg,labelBgStyle:k.labelBgStyle,labelBgPadding:k.labelBgPadding,labelBgBorderRadius:k.labelBgBorderRadius,sourceX:U,sourceY:A,targetX:z,targetY:F,sourcePosition:P,targetPosition:T,data:k.data,style:k.style,sourceHandleId:k.sourceHandle,targetHandleId:k.targetHandle,markerStart:ne,markerEnd:re,pathOptions:"pathOptions"in k?k.pathOptions:void 0,interactionWidth:k.interactionWidth}),X&&m.jsx(jS,{edge:k,isReconnectable:X,reconnectRadius:g,onReconnect:x,onReconnectStart:v,onReconnectEnd:_,sourceX:U,sourceY:A,targetX:z,targetY:F,sourcePosition:P,targetPosition:T,setUpdateHover:te,setReconnecting:M})]})})}var PS=O.memo(MS);const IS=t=>({edgesFocusable:t.edgesFocusable,edgesReconnectable:t.edgesReconnectable,elementsSelectable:t.elementsSelectable,connectionMode:t.connectionMode,onError:t.onError});function ng({defaultMarkerColor:t,onlyRenderVisibleElements:r,rfId:i,edgeTypes:l,noPanClassName:a,onReconnect:u,onEdgeContextMenu:d,onEdgeMouseEnter:f,onEdgeMouseMove:p,onEdgeMouseLeave:y,onEdgeClick:g,reconnectRadius:x,onEdgeDoubleClick:v,onReconnectStart:_,onReconnectEnd:S,disableKeyboardA11y:C}){const{edgesFocusable:E,edgesReconnectable:N,elementsSelectable:b,onError:k}=be(IS,Ue),j=pS(r);return m.jsxs("div",{className:"react-flow__edges",children:[m.jsx(xS,{defaultColor:t,rfId:i}),j.map(R=>m.jsx(PS,{id:R,edgesFocusable:E,edgesReconnectable:N,elementsSelectable:b,noPanClassName:a,onReconnect:u,onContextMenu:d,onMouseEnter:f,onMouseMove:p,onMouseLeave:y,onClick:g,reconnectRadius:x,onDoubleClick:v,onReconnectStart:_,onReconnectEnd:S,rfId:i,onError:k,edgeTypes:l,disableKeyboardA11y:C},R))]})}ng.displayName="EdgeRenderer";const bS=O.memo(ng),np=t=>`translate(${t[0]}px,${t[1]}px) scale(${t[2]})`;function TS({children:t}){const r=Oe(),i=O.useRef(null),[l]=O.useState(()=>r.getState().transform);return Lm(()=>{let a=null;const u=()=>{const d=r.getState().transform;a&&d[0]===a[0]&&d[1]===a[1]&&d[2]===a[2]||(a=d,i.current&&(i.current.style.transform=np(d)))};return u(),r.subscribe(u)},[r]),m.jsx("div",{ref:i,className:"react-flow__viewport xyflow__viewport react-flow__container",style:{transform:np(l)},children:t})}function RS(t){const r=gc(),i=O.useRef(!1);O.useEffect(()=>{!i.current&&r.viewportInitialized&&t&&(setTimeout(()=>t(r),1),i.current=!0)},[t,r.viewportInitialized])}const LS=t=>{var r;return(r=t.panZoom)==null?void 0:r.syncViewport};function zS(t){const r=be(LS),i=Oe();return O.useEffect(()=>{t&&(r==null||r(t),i.setState({transform:[t.x,t.y,t.zoom]}))},[t,r]),null}function AS(t){return t.connection.inProgress?{...t.connection,to:Mi(t.connection.to,t.transform)}:{...t.connection}}function DS(t){return AS}function $S(t){const r=DS();return be(r,Ue)}const OS=t=>({nodesConnectable:t.nodesConnectable,isValid:t.connection.isValid,inProgress:t.connection.inProgress,width:t.width,height:t.height});function FS({containerStyle:t,style:r,type:i,component:l}){const{nodesConnectable:a,width:u,height:d,isValid:f,inProgress:p}=be(OS,Ue);return!(u&&a&&p)?null:m.jsx("svg",{style:t,width:u,height:d,className:"react-flow__connectionline react-flow__container",children:m.jsx("g",{className:Qe(["react-flow__connection",em(f)]),children:m.jsx(rg,{style:r,type:i,CustomComponent:l,isValid:f})})})}const rg=({style:t,type:r=Zn.Bezier,CustomComponent:i,isValid:l})=>{const{inProgress:a,from:u,fromNode:d,fromHandle:f,fromPosition:p,to:y,toNode:g,toHandle:x,toPosition:v,pointer:_}=$S();if(!a)return;if(i)return m.jsx(i,{connectionLineType:r,connectionLineStyle:t,fromNode:d,fromHandle:f,fromX:u.x,fromY:u.y,toX:y.x,toY:y.y,fromPosition:p,toPosition:v,connectionStatus:em(l),toNode:g,toHandle:x,pointer:_});let S="";const C={sourceX:u.x,sourceY:u.y,sourcePosition:p,targetX:y.x,targetY:y.y,targetPosition:v};switch(r){case Zn.Bezier:[S]=hm(C);break;case Zn.SimpleBezier:[S]=Um(C);break;case Zn.Step:[S]=Gu({...C,borderRadius:0});break;case Zn.SmoothStep:[S]=Gu(C);break;default:[S]=mm(C)}return m.jsx("path",{d:S,fill:"none",className:"react-flow__connection-path",style:t})};rg.displayName="ConnectionLine";const HS={};function rp(t=HS){O.useRef(t),Oe(),O.useEffect(()=>{},[t])}function BS(){Oe(),O.useRef(!1),O.useEffect(()=>{},[])}function og({nodeTypes:t,edgeTypes:r,onInit:i,onNodeClick:l,onEdgeClick:a,onNodeDoubleClick:u,onEdgeDoubleClick:d,onNodeMouseEnter:f,onNodeMouseMove:p,onNodeMouseLeave:y,onNodeContextMenu:g,onSelectionContextMenu:x,onSelectionStart:v,onSelectionEnd:_,connectionLineType:S,connectionLineStyle:C,connectionLineComponent:E,connectionLineContainerStyle:N,selectionKeyCode:b,selectionOnDrag:k,selectionMode:j,multiSelectionKeyCode:R,panActivationKeyCode:D,zoomActivationKeyCode:H,deleteKeyCode:X,onlyRenderVisibleElements:V,elementsSelectable:ee,defaultViewport:Z,translateExtent:te,minZoom:J,maxZoom:M,preventScrolling:W,defaultMarkerColor:B,zoomOnScroll:U,zoomOnPinch:A,panOnScroll:z,panOnScrollSpeed:F,panOnScrollMode:P,zoomOnDoubleClick:T,panOnDrag:ne,autoPanOnSelection:re,onPaneClick:ue,onPaneMouseEnter:ce,onPaneMouseMove:de,onPaneMouseLeave:Q,onPaneScroll:se,onPaneContextMenu:fe,paneClickDistance:me,nodeClickDistance:xe,onEdgeContextMenu:pe,onEdgeMouseEnter:Ce,onEdgeMouseMove:je,onEdgeMouseLeave:Me,reconnectRadius:Re,onReconnect:Xe,onReconnectStart:rt,onReconnectEnd:Ze,noDragClassName:Je,noWheelClassName:Vt,noPanClassName:zt,disableKeyboardA11y:At,nodeExtent:lt,rfId:ht,viewport:ot,onViewportChange:pt,nodesDraggable:Cn}){return rp(t),rp(r),BS(),RS(i),zS(ot),m.jsx(oS,{onPaneClick:ue,onPaneMouseEnter:ce,onPaneMouseMove:de,onPaneMouseLeave:Q,onPaneContextMenu:fe,onPaneScroll:se,paneClickDistance:me,deleteKeyCode:X,selectionKeyCode:b,selectionOnDrag:k,selectionMode:j,onSelectionStart:v,onSelectionEnd:_,multiSelectionKeyCode:R,panActivationKeyCode:D,zoomActivationKeyCode:H,elementsSelectable:ee,zoomOnScroll:U,zoomOnPinch:A,zoomOnDoubleClick:T,panOnScroll:z,panOnScrollSpeed:F,panOnScrollMode:P,panOnDrag:ne,autoPanOnSelection:re,defaultViewport:Z,translateExtent:te,minZoom:J,maxZoom:M,onSelectionContextMenu:x,preventScrolling:W,noDragClassName:Je,noWheelClassName:Vt,noPanClassName:zt,disableKeyboardA11y:At,onViewportChange:pt,isControlledViewport:!!ot,children:m.jsxs(TS,{children:[m.jsx(bS,{edgeTypes:r,onEdgeClick:a,onEdgeDoubleClick:d,onReconnect:Xe,onReconnectStart:rt,onReconnectEnd:Ze,onlyRenderVisibleElements:V,onEdgeContextMenu:pe,onEdgeMouseEnter:Ce,onEdgeMouseMove:je,onEdgeMouseLeave:Me,reconnectRadius:Re,defaultMarkerColor:B,noPanClassName:zt,disableKeyboardA11y:At,rfId:ht}),m.jsx(FS,{style:C,type:S,component:E,containerStyle:N}),m.jsx("div",{className:"react-flow__edgelabel-renderer"}),m.jsx(hS,{nodeTypes:t,onNodeClick:l,onNodeDoubleClick:u,onNodeMouseEnter:f,onNodeMouseMove:p,onNodeMouseLeave:y,onNodeContextMenu:g,nodeClickDistance:xe,onlyRenderVisibleElements:V,noPanClassName:zt,noDragClassName:Je,disableKeyboardA11y:At,nodeExtent:lt,rfId:ht,nodesDraggable:Cn}),m.jsx("div",{className:"react-flow__viewport-portal"})]})})}og.displayName="GraphView";const VS=O.memo(og),US=sm(),op=({nodes:t,edges:r,defaultNodes:i,defaultEdges:l,width:a,height:u,fitView:d,fitViewOptions:f,minZoom:p=.5,maxZoom:y=2,nodeOrigin:g,nodeExtent:x,zIndexMode:v="basic"}={})=>{const _=new Map,S=new Map,C=new Map,E=new Map,N=l??r??[],b=i??t??[],k=g??[0,0],j=x??gi;vm(C,E,N);const{nodesInitialized:R}=Ku(b,_,S,{nodeOrigin:k,nodeExtent:j,zIndexMode:v});let D=[0,0,1];if(d&&a&&u){const H=Ci(_,{filter:Z=>!!((Z.width||Z.initialWidth)&&(Z.height||Z.initialHeight))}),{x:X,y:V,zoom:ee}=uc(H,a,u,p,y,(f==null?void 0:f.padding)??.1);D=[X,V,ee]}return{rfId:"1",width:a??0,height:u??0,transform:D,nodes:b,nodesInitialized:R,nodeLookup:_,parentLookup:S,edges:N,edgeLookup:E,connectionLookup:C,onNodesChange:null,onEdgesChange:null,hasDefaultNodes:i!==void 0,hasDefaultEdges:l!==void 0,panZoom:null,minZoom:p,maxZoom:y,translateExtent:gi,nodeExtent:j,nodesSelectionActive:!1,userSelectionActive:!1,userSelectionRect:null,connectionMode:mo.Strict,domNode:null,paneDragging:!1,noPanClassName:"nopan",nodeOrigin:k,nodeDragThreshold:1,connectionDragThreshold:1,snapGrid:[15,15],snapToGrid:!1,nodesDraggable:!0,nodesConnectable:!0,nodesFocusable:!0,edgesFocusable:!0,edgesReconnectable:!0,elementsSelectable:!0,elevateNodesOnSelect:!0,elevateEdgesOnSelect:!0,selectNodesOnDrag:!0,multiSelectionActive:!1,fitViewQueued:d??!1,fitViewOptions:f,fitViewResolver:null,connection:{...Jp},connectionClickStartHandle:null,connectOnClick:!0,ariaLiveMessage:"",autoPanOnConnect:!0,autoPanOnNodeDrag:!0,autoPanOnNodeFocus:!0,autoPanSpeed:15,connectionRadius:20,onError:US,isValidConnection:void 0,onSelectionChangeHandlers:[],lib:"react",debug:!1,ariaLabelConfig:Zp,zIndexMode:v,onNodesChangeMiddlewareMap:new Map,onEdgesChangeMiddlewareMap:new Map}},WS=({nodes:t,edges:r,defaultNodes:i,defaultEdges:l,width:a,height:u,fitView:d,fitViewOptions:f,minZoom:p,maxZoom:y,nodeOrigin:g,nodeExtent:x,zIndexMode:v})=>r_((_,S)=>{async function C(){const{nodeLookup:E,panZoom:N,fitViewOptions:b,fitViewResolver:k,width:j,height:R,minZoom:D,maxZoom:H}=S();N&&(await Jw({nodes:E,width:j,height:R,panZoom:N,minZoom:D,maxZoom:H},b),k==null||k.resolve(!0),_({fitViewResolver:null}))}return{...op({nodes:t,edges:r,width:a,height:u,fitView:d,fitViewOptions:f,minZoom:p,maxZoom:y,nodeOrigin:g,nodeExtent:x,defaultNodes:i,defaultEdges:l,zIndexMode:v}),setNodes:E=>{const{nodeLookup:N,parentLookup:b,nodeOrigin:k,nodeExtent:j,elevateNodesOnSelect:R,fitViewQueued:D,zIndexMode:H,nodesSelectionActive:X}=S(),{nodesInitialized:V,hasSelectedNodes:ee}=Ku(E,N,b,{nodeOrigin:k,nodeExtent:j,elevateNodesOnSelect:R,checkEquality:!0,zIndexMode:H}),Z=X&ⅇD&&V?(C(),_({nodes:E,nodesInitialized:V,fitViewQueued:!1,fitViewOptions:void 0,nodesSelectionActive:Z})):_({nodes:E,nodesInitialized:V,nodesSelectionActive:Z})},setEdges:E=>{const{connectionLookup:N,edgeLookup:b}=S();vm(N,b,E),_({edges:E})},setDefaultNodesAndEdges:(E,N)=>{if(E){const{setNodes:b}=S();b(E),_({hasDefaultNodes:!0})}if(N){const{setEdges:b}=S();b(N),_({hasDefaultEdges:!0})}},updateNodeInternals:E=>{const{triggerNodeChanges:N,nodeLookup:b,parentLookup:k,domNode:j,nodeOrigin:R,nodeExtent:D,debug:H,fitViewQueued:X,zIndexMode:V}=S(),{changes:ee,updatedInternals:Z}=S1(E,b,k,j,R,D,V);Z&&(v1(b,k,{nodeOrigin:R,nodeExtent:D,zIndexMode:V}),X?(C(),_({fitViewQueued:!1,fitViewOptions:void 0})):_({}),(ee==null?void 0:ee.length)>0&&(H&&console.log("React Flow: trigger node changes",ee),N==null||N(ee)))},updateNodePositions:(E,N=!1)=>{const b=[];let k=[];const{nodeLookup:j,triggerNodeChanges:R,connection:D,updateConnection:H,onNodesChangeMiddlewareMap:X}=S();for(const[V,ee]of E){const Z=j.get(V),te=!!(Z!=null&&Z.expandParent&&(Z!=null&&Z.parentId)&&(ee!=null&&ee.position)),J={id:V,type:"position",position:te?{x:Math.max(0,ee.position.x),y:Math.max(0,ee.position.y)}:ee.position,dragging:N};if(Z&&D.inProgress&&D.fromNode.id===Z.id){const M=Mr(Z,D.fromHandle,Se.Left,!0);H({...D,from:M})}te&&Z.parentId&&b.push({id:V,parentId:Z.parentId,rect:{...ee.internals.positionAbsolute,width:ee.measured.width??0,height:ee.measured.height??0}}),k.push(J)}if(b.length>0){const{parentLookup:V,nodeOrigin:ee}=S(),Z=mc(b,j,V,ee);k.push(...Z)}for(const V of X.values())k=V(k);R(k)},triggerNodeChanges:E=>{const{onNodesChange:N,setNodes:b,nodes:k,hasDefaultNodes:j,debug:R}=S();if(E!=null&&E.length){if(j){const D=E_(E,k);b(D)}R&&console.log("React Flow: trigger node changes",E),N==null||N(E)}},triggerEdgeChanges:E=>{const{onEdgesChange:N,setEdges:b,edges:k,hasDefaultEdges:j,debug:R}=S();if(E!=null&&E.length){if(j){const D=N_(E,k);b(D)}R&&console.log("React Flow: trigger edge changes",E),N==null||N(E)}},addSelectedNodes:E=>{const{multiSelectionActive:N,edgeLookup:b,nodeLookup:k,triggerNodeChanges:j,triggerEdgeChanges:R}=S();if(N){const D=E.map(H=>wr(H,!0));j(D);return}j(uo(k,new Set([...E]),!0)),R(uo(b))},addSelectedEdges:E=>{const{multiSelectionActive:N,edgeLookup:b,nodeLookup:k,triggerNodeChanges:j,triggerEdgeChanges:R}=S();if(N){const D=E.map(H=>wr(H,!0));R(D);return}R(uo(b,new Set([...E]))),j(uo(k,new Set,!0))},unselectNodesAndEdges:({nodes:E,edges:N}={})=>{const{edges:b,nodes:k,nodeLookup:j,triggerNodeChanges:R,triggerEdgeChanges:D}=S(),H=E||k,X=N||b,V=[];for(const Z of H){if(!Z.selected)continue;const te=j.get(Z.id);te&&(te.selected=!1),V.push(wr(Z.id,!1))}const ee=[];for(const Z of X)Z.selected&&ee.push(wr(Z.id,!1));R(V),D(ee)},setMinZoom:E=>{const{panZoom:N,maxZoom:b}=S();N==null||N.setScaleExtent([E,b]),_({minZoom:E})},setMaxZoom:E=>{const{panZoom:N,minZoom:b}=S();N==null||N.setScaleExtent([b,E]),_({maxZoom:E})},setTranslateExtent:E=>{var N;(N=S().panZoom)==null||N.setTranslateExtent(E),_({translateExtent:E})},resetSelectedElements:()=>{const{edges:E,nodes:N,triggerNodeChanges:b,triggerEdgeChanges:k,elementsSelectable:j}=S();if(!j)return;const R=N.reduce((H,X)=>X.selected?[...H,wr(X.id,!1)]:H,[]),D=E.reduce((H,X)=>X.selected?[...H,wr(X.id,!1)]:H,[]);b(R),k(D)},setNodeExtent:E=>{const{nodes:N,nodeLookup:b,parentLookup:k,nodeOrigin:j,elevateNodesOnSelect:R,nodeExtent:D,zIndexMode:H}=S();E[0][0]===D[0][0]&&E[0][1]===D[0][1]&&E[1][0]===D[1][0]&&E[1][1]===D[1][1]||(Ku(N,b,k,{nodeOrigin:j,nodeExtent:E,elevateNodesOnSelect:R,checkEquality:!1,zIndexMode:H}),_({nodeExtent:E}))},panBy:E=>{const{transform:N,width:b,height:k,panZoom:j,translateExtent:R}=S();return k1({delta:E,panZoom:j,transform:N,translateExtent:R,width:b,height:k})},setCenter:async(E,N,b)=>{const{width:k,height:j,maxZoom:R,panZoom:D}=S();if(!D)return!1;const H=typeof(b==null?void 0:b.zoom)<"u"?b.zoom:R;return await D.setViewport({x:k/2-E*H,y:j/2-N*H,zoom:H},{duration:b==null?void 0:b.duration,ease:b==null?void 0:b.ease,interpolate:b==null?void 0:b.interpolate}),!0},cancelConnection:()=>{_({connection:{...Jp}})},updateConnection:E=>{_({connection:E})},reset:()=>_({...op()})}},Object.is);function ig({initialNodes:t,initialEdges:r,defaultNodes:i,defaultEdges:l,initialWidth:a,initialHeight:u,initialMinZoom:d,initialMaxZoom:f,initialFitViewOptions:p,fitView:y,nodeOrigin:g,nodeExtent:x,zIndexMode:v,children:_}){const[S]=O.useState(()=>WS({nodes:t,edges:r,defaultNodes:i,defaultEdges:l,width:a,height:u,fitView:y,minZoom:d,maxZoom:f,fitViewOptions:p,nodeOrigin:g,nodeExtent:x,zIndexMode:v}));return m.jsx(o_,{value:S,children:m.jsx(I_,{children:m.jsx(W_,{children:_})})})}function YS({children:t,nodes:r,edges:i,defaultNodes:l,defaultEdges:a,width:u,height:d,fitView:f,fitViewOptions:p,minZoom:y,maxZoom:g,nodeOrigin:x,nodeExtent:v,zIndexMode:_}){return O.useContext(Nl)?m.jsx(m.Fragment,{children:t}):m.jsx(ig,{initialNodes:r,initialEdges:i,defaultNodes:l,defaultEdges:a,initialWidth:u,initialHeight:d,fitView:f,initialFitViewOptions:p,initialMinZoom:y,initialMaxZoom:g,nodeOrigin:x,nodeExtent:v,zIndexMode:_,children:t})}const XS={width:"100%",height:"100%",overflow:"hidden",position:"relative",zIndex:0};function GS({nodes:t,edges:r,defaultNodes:i,defaultEdges:l,className:a,nodeTypes:u,edgeTypes:d,onNodeClick:f,onEdgeClick:p,onInit:y,onMove:g,onMoveStart:x,onMoveEnd:v,onConnect:_,onConnectStart:S,onConnectEnd:C,onClickConnectStart:E,onClickConnectEnd:N,onNodeMouseEnter:b,onNodeMouseMove:k,onNodeMouseLeave:j,onNodeContextMenu:R,onNodeDoubleClick:D,onNodeDragStart:H,onNodeDrag:X,onNodeDragStop:V,onNodesDelete:ee,onEdgesDelete:Z,onDelete:te,onSelectionChange:J,onSelectionDragStart:M,onSelectionDrag:W,onSelectionDragStop:B,onSelectionContextMenu:U,onSelectionStart:A,onSelectionEnd:z,onBeforeDelete:F,connectionMode:P,connectionLineType:T=Zn.Bezier,connectionLineStyle:ne,connectionLineComponent:re,connectionLineContainerStyle:ue,deleteKeyCode:ce="Backspace",selectionKeyCode:de="Shift",selectionOnDrag:Q=!1,selectionMode:se=yi.Full,panActivationKeyCode:fe="Space",multiSelectionKeyCode:me=wi()?"Meta":"Control",zoomActivationKeyCode:xe=wi()?"Meta":"Control",snapToGrid:pe,snapGrid:Ce,onlyRenderVisibleElements:je=!1,selectNodesOnDrag:Me,nodesDraggable:Re,autoPanOnNodeFocus:Xe,nodesConnectable:rt,nodesFocusable:Ze,nodeOrigin:Je=bm,edgesFocusable:Vt,edgesReconnectable:zt,elementsSelectable:At=!0,defaultViewport:lt=y_,minZoom:ht=.5,maxZoom:ot=2,translateExtent:pt=gi,preventScrolling:Cn=!0,nodeExtent:Ut,defaultMarkerColor:hn="#b1b1b7",zoomOnScroll:Ir=!0,zoomOnPinch:er=!0,panOnScroll:tr=!1,panOnScrollSpeed:br=.5,panOnScrollMode:jn=kr.Free,zoomOnDoubleClick:Mn=!0,panOnDrag:Pn=!0,onPaneClick:K,onPaneMouseEnter:ye,onPaneMouseMove:Le,onPaneMouseLeave:Nt,onPaneScroll:Ct,onPaneContextMenu:Pi,paneClickDistance:Ii=1,nodeClickDistance:bi=0,children:Ti,onReconnect:wo,onReconnectStart:Ri,onReconnectEnd:nr,onEdgeContextMenu:_o,onEdgeDoubleClick:rr,onEdgeMouseEnter:Il,onEdgeMouseMove:or,onEdgeMouseLeave:Tr,reconnectRadius:Rr=10,onNodesChange:So,onEdgesChange:bl,noDragClassName:Tl="nodrag",noWheelClassName:Rl="nowheel",noPanClassName:on="nopan",fitView:ko,fitViewOptions:Eo,connectOnClick:Ll,attributionPosition:Li,proOptions:zi,defaultEdgeOptions:Ai,elevateNodesOnSelect:Di=!0,elevateEdgesOnSelect:zl=!1,disableKeyboardA11y:$i=!1,autoPanOnConnect:He,autoPanOnNodeDrag:Al,autoPanOnSelection:No=!0,autoPanSpeed:Oi,connectionRadius:Lr,isValidConnection:Dl,onError:Fi,style:zr,id:jt,nodeDragThreshold:$l,connectionDragThreshold:Mt,viewport:Ol,onViewportChange:Fl,width:Hl,height:Ar,colorMode:Dr="light",debug:ir,onScroll:pn,ariaLabelConfig:Bl,zIndexMode:Hi="basic",...Co},Bi){const sr=jt||"1",lr=__(Dr),Vl=O.useCallback($r=>{$r.currentTarget.scrollTo({top:0,left:0,behavior:"instant"}),pn==null||pn($r)},[pn]);return m.jsx("div",{"data-testid":"rf__wrapper",...Co,onScroll:Vl,style:{...zr,...XS},ref:Bi,className:Qe(["react-flow",a,lr]),id:jt,role:"application",children:m.jsxs(YS,{nodes:t,edges:r,width:Hl,height:Ar,fitView:ko,fitViewOptions:Eo,minZoom:ht,maxZoom:ot,nodeOrigin:Je,nodeExtent:Ut,zIndexMode:Hi,children:[m.jsx(w_,{nodes:t,edges:r,defaultNodes:i,defaultEdges:l,onConnect:_,onConnectStart:S,onConnectEnd:C,onClickConnectStart:E,onClickConnectEnd:N,nodesDraggable:Re,autoPanOnNodeFocus:Xe,nodesConnectable:rt,nodesFocusable:Ze,edgesFocusable:Vt,edgesReconnectable:zt,elementsSelectable:At,elevateNodesOnSelect:Di,elevateEdgesOnSelect:zl,minZoom:ht,maxZoom:ot,nodeExtent:Ut,onNodesChange:So,onEdgesChange:bl,snapToGrid:pe,snapGrid:Ce,connectionMode:P,translateExtent:pt,connectOnClick:Ll,defaultEdgeOptions:Ai,fitView:ko,fitViewOptions:Eo,onNodesDelete:ee,onEdgesDelete:Z,onDelete:te,onNodeDragStart:H,onNodeDrag:X,onNodeDragStop:V,onSelectionDrag:W,onSelectionDragStart:M,onSelectionDragStop:B,onMove:g,onMoveStart:x,onMoveEnd:v,noPanClassName:on,nodeOrigin:Je,rfId:sr,autoPanOnConnect:He,autoPanOnNodeDrag:Al,autoPanSpeed:Oi,onError:Fi,connectionRadius:Lr,isValidConnection:Dl,selectNodesOnDrag:Me,nodeDragThreshold:$l,connectionDragThreshold:Mt,onBeforeDelete:F,debug:ir,ariaLabelConfig:Bl,zIndexMode:Hi}),m.jsx(VS,{onInit:y,onNodeClick:f,onEdgeClick:p,onNodeMouseEnter:b,onNodeMouseMove:k,onNodeMouseLeave:j,onNodeContextMenu:R,onNodeDoubleClick:D,nodeTypes:u,edgeTypes:d,connectionLineType:T,connectionLineStyle:ne,connectionLineComponent:re,connectionLineContainerStyle:ue,selectionKeyCode:de,selectionOnDrag:Q,selectionMode:se,deleteKeyCode:ce,multiSelectionKeyCode:me,panActivationKeyCode:fe,zoomActivationKeyCode:xe,onlyRenderVisibleElements:je,defaultViewport:lt,translateExtent:pt,minZoom:ht,maxZoom:ot,preventScrolling:Cn,zoomOnScroll:Ir,zoomOnPinch:er,zoomOnDoubleClick:Mn,panOnScroll:tr,panOnScrollSpeed:br,panOnScrollMode:jn,panOnDrag:Pn,autoPanOnSelection:No,onPaneClick:K,onPaneMouseEnter:ye,onPaneMouseMove:Le,onPaneMouseLeave:Nt,onPaneScroll:Ct,onPaneContextMenu:Pi,paneClickDistance:Ii,nodeClickDistance:bi,onSelectionContextMenu:U,onSelectionStart:A,onSelectionEnd:z,onReconnect:wo,onReconnectStart:Ri,onReconnectEnd:nr,onEdgeContextMenu:_o,onEdgeDoubleClick:rr,onEdgeMouseEnter:Il,onEdgeMouseMove:or,onEdgeMouseLeave:Tr,reconnectRadius:Rr,defaultMarkerColor:hn,noDragClassName:Tl,noWheelClassName:Rl,noPanClassName:on,rfId:sr,disableKeyboardA11y:$i,nodeExtent:Ut,viewport:Ol,onViewportChange:Fl,nodesDraggable:Re}),m.jsx(g_,{onSelectionChange:J}),Ti,m.jsx(d_,{proOptions:zi,position:Li}),m.jsx(c_,{rfId:sr,disableKeyboardA11y:$i})]})})}var QS=Rm(GS);function KS({dimensions:t,lineWidth:r,variant:i,className:l}){return m.jsx("path",{strokeWidth:r,d:`M${t[0]/2} 0 V${t[1]} M0 ${t[1]/2} H${t[0]}`,className:Qe(["react-flow__background-pattern",i,l])})}function qS({radius:t,className:r}){return m.jsx("circle",{cx:t,cy:t,r:t,className:Qe(["react-flow__background-pattern","dots",r])})}var Jn;(function(t){t.Lines="lines",t.Dots="dots",t.Cross="cross"})(Jn||(Jn={}));const ZS={[Jn.Dots]:1,[Jn.Lines]:1,[Jn.Cross]:6},JS=t=>({transform:t.transform,patternId:`pattern-${t.rfId}`});function sg({id:t,variant:r=Jn.Dots,gap:i=20,size:l,lineWidth:a=1,offset:u=0,color:d,bgColor:f,style:p,className:y,patternClassName:g}){const x=O.useRef(null),{transform:v,patternId:_}=be(JS,Ue),S=l||ZS[r],C=r===Jn.Dots,E=r===Jn.Cross,N=Array.isArray(i)?i:[i,i],b=[N[0]*v[2]||1,N[1]*v[2]||1],k=S*v[2],j=Array.isArray(u)?u:[u,u],R=E?[k,k]:b,D=[j[0]*v[2]+R[0]/2,j[1]*v[2]+R[1]/2],H=`${_}${t||""}`;return m.jsxs("svg",{className:Qe(["react-flow__background",y]),style:{...p,...jl,"--xy-background-color-props":f,"--xy-background-pattern-color-props":d},ref:x,"data-testid":"rf__background",children:[m.jsx("pattern",{id:H,x:v[0]%b[0],y:v[1]%b[1],width:b[0],height:b[1],patternUnits:"userSpaceOnUse",patternTransform:`translate(-${D[0]},-${D[1]})`,children:C?m.jsx(qS,{radius:k/2,className:g}):m.jsx(KS,{dimensions:R,lineWidth:a,variant:r,className:g})}),m.jsx("rect",{x:"0",y:"0",width:"100%",height:"100%",fill:`url(#${H})`})]})}sg.displayName="Background";const ek=O.memo(sg);function tk(){return m.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32",children:m.jsx("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"})})}function nk(){return m.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5",children:m.jsx("path",{d:"M0 0h32v4.2H0z"})})}function rk(){return m.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30",children:m.jsx("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0027.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94c-.531 0-.939-.4-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"})})}function ok(){return m.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:m.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"})})}function ik(){return m.jsx("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32",children:m.jsx("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z"})})}function Zs({children:t,className:r,...i}){return m.jsx("button",{type:"button",className:Qe(["react-flow__controls-button",r]),...i,children:t})}const sk=t=>({isInteractive:t.nodesDraggable||t.nodesConnectable||t.elementsSelectable,minZoomReached:t.transform[2]<=t.minZoom,maxZoomReached:t.transform[2]>=t.maxZoom,ariaLabelConfig:t.ariaLabelConfig});function lg({style:t,showZoom:r=!0,showFitView:i=!0,showInteractive:l=!0,fitViewOptions:a,onZoomIn:u,onZoomOut:d,onFitView:f,onInteractiveChange:p,className:y,children:g,position:x="bottom-left",orientation:v="vertical","aria-label":_}){const S=Oe(),{isInteractive:C,minZoomReached:E,maxZoomReached:N,ariaLabelConfig:b}=be(sk,Ue),{zoomIn:k,zoomOut:j,fitView:R}=gc(),D=()=>{k(),u==null||u()},H=()=>{j(),d==null||d()},X=()=>{R(a),f==null||f()},V=()=>{S.setState({nodesDraggable:!C,nodesConnectable:!C,elementsSelectable:!C}),p==null||p(!C)},ee=v==="horizontal"?"horizontal":"vertical";return m.jsxs(Cl,{className:Qe(["react-flow__controls",ee,y]),position:x,style:t,"data-testid":"rf__controls","aria-label":_??b["controls.ariaLabel"],children:[r&&m.jsxs(m.Fragment,{children:[m.jsx(Zs,{onClick:D,className:"react-flow__controls-zoomin",title:b["controls.zoomIn.ariaLabel"],"aria-label":b["controls.zoomIn.ariaLabel"],disabled:N,children:m.jsx(tk,{})}),m.jsx(Zs,{onClick:H,className:"react-flow__controls-zoomout",title:b["controls.zoomOut.ariaLabel"],"aria-label":b["controls.zoomOut.ariaLabel"],disabled:E,children:m.jsx(nk,{})})]}),i&&m.jsx(Zs,{className:"react-flow__controls-fitview",onClick:X,title:b["controls.fitView.ariaLabel"],"aria-label":b["controls.fitView.ariaLabel"],children:m.jsx(rk,{})}),l&&m.jsx(Zs,{className:"react-flow__controls-interactive",onClick:V,title:b["controls.interactive.ariaLabel"],"aria-label":b["controls.interactive.ariaLabel"],children:C?m.jsx(ik,{}):m.jsx(ok,{})}),g]})}lg.displayName="Controls";const lk=O.memo(lg);function ak({id:t,x:r,y:i,width:l,height:a,style:u,color:d,strokeColor:f,strokeWidth:p,className:y,borderRadius:g,shapeRendering:x,selected:v,onClick:_}){const{background:S,backgroundColor:C}=u||{},E=d||S||C;return m.jsx("rect",{className:Qe(["react-flow__minimap-node",{selected:v},y]),x:r,y:i,rx:g,ry:g,width:l,height:a,style:{fill:E,stroke:f,strokeWidth:p},shapeRendering:x,onClick:_?N=>_(N,t):void 0})}const uk=O.memo(ak),ck=t=>t.nodes.map(r=>r.id),Du=t=>t instanceof Function?t:()=>t;function dk({nodeStrokeColor:t,nodeColor:r,nodeClassName:i="",nodeBorderRadius:l=5,nodeStrokeWidth:a,nodeComponent:u=uk,onClick:d}){const f=be(ck,Ue),p=Du(r),y=Du(t),g=Du(i),x=typeof window>"u"||window.chrome?"crispEdges":"geometricPrecision";return m.jsx(m.Fragment,{children:f.map(v=>m.jsx(hk,{id:v,nodeColorFunc:p,nodeStrokeColorFunc:y,nodeClassNameFunc:g,nodeBorderRadius:l,nodeStrokeWidth:a,NodeComponent:u,onClick:d,shapeRendering:x},v))})}function fk({id:t,nodeColorFunc:r,nodeStrokeColorFunc:i,nodeClassNameFunc:l,nodeBorderRadius:a,nodeStrokeWidth:u,shapeRendering:d,NodeComponent:f,onClick:p}){const{node:y,x:g,y:x,width:v,height:_}=be(S=>{const C=S.nodeLookup.get(t);if(!C)return{node:void 0,x:0,y:0,width:0,height:0};const E=C.internals.userNode,{x:N,y:b}=C.internals.positionAbsolute,{width:k,height:j}=rn(E);return{node:E,x:N,y:b,width:k,height:j}},Ue);return!y||y.hidden||!lm(y)?null:m.jsx(f,{x:g,y:x,width:v,height:_,style:y.style,selected:!!y.selected,className:l(y),color:r(y),borderRadius:a,strokeColor:i(y),strokeWidth:u,shapeRendering:d,onClick:p,id:y.id})}const hk=O.memo(fk);var pk=O.memo(dk);const mk=200,gk=150,yk=t=>!t.hidden,vk=t=>{const r={x:-t.transform[0]/t.transform[2],y:-t.transform[1]/t.transform[2],width:t.width/t.transform[2],height:t.height/t.transform[2]};return{viewBB:r,boundingRect:t.nodeLookup.size>0?om(Ci(t.nodeLookup,{filter:yk}),r):r,rfId:t.rfId,panZoom:t.panZoom,translateExtent:t.translateExtent,flowWidth:t.width,flowHeight:t.height,ariaLabelConfig:t.ariaLabelConfig}},ip=(t,r)=>t.x===r.x&&t.y===r.y&&t.width===r.width&&t.height===r.height,xk=(t,r)=>ip(t.viewBB,r.viewBB)&&ip(t.boundingRect,r.boundingRect)&&t.rfId===r.rfId&&t.panZoom===r.panZoom&&t.translateExtent===r.translateExtent&&t.flowWidth===r.flowWidth&&t.flowHeight===r.flowHeight&&t.ariaLabelConfig===r.ariaLabelConfig,wk="react-flow__minimap-desc";function ag({style:t,className:r,nodeStrokeColor:i,nodeColor:l,nodeClassName:a="",nodeBorderRadius:u=5,nodeStrokeWidth:d,nodeComponent:f,bgColor:p,maskColor:y,maskStrokeColor:g,maskStrokeWidth:x,position:v="bottom-right",onClick:_,onNodeClick:S,pannable:C=!1,zoomable:E=!1,ariaLabel:N,inversePan:b,zoomStep:k=1,offsetScale:j=5}){const R=Oe(),D=O.useRef(null),{boundingRect:H,viewBB:X,rfId:V,panZoom:ee,translateExtent:Z,flowWidth:te,flowHeight:J,ariaLabelConfig:M}=be(vk,xk),W=(t==null?void 0:t.width)??mk,B=(t==null?void 0:t.height)??gk,U=H.width/W,A=H.height/B,z=Math.max(U,A),F=z*W,P=z*B,T=j*z,ne=H.x-(F-H.width)/2-T,re=H.y-(P-H.height)/2-T,ue=F+T*2,ce=P+T*2,de=`${wk}-${V}`,Q=O.useRef(0),se=O.useRef();Q.current=z,O.useEffect(()=>{if(D.current&&ee)return se.current=T1({domNode:D.current,panZoom:ee,getTransform:()=>R.getState().transform,getViewScale:()=>Q.current}),()=>{var pe;(pe=se.current)==null||pe.destroy()}},[ee]),O.useEffect(()=>{var pe;(pe=se.current)==null||pe.update({translateExtent:Z,width:te,height:J,inversePan:b,pannable:C,zoomStep:k,zoomable:E})},[C,E,b,k,Z,te,J]);const fe=_?pe=>{var Me;const[Ce,je]=((Me=se.current)==null?void 0:Me.pointer(pe))||[0,0];_(pe,{x:Ce,y:je})}:void 0,me=S?O.useCallback((pe,Ce)=>{const je=R.getState().nodeLookup.get(Ce).internals.userNode;S(pe,je)},[]):void 0,xe=N??M["minimap.ariaLabel"];return m.jsx(Cl,{position:v,style:{...t,"--xy-minimap-background-color-props":typeof p=="string"?p:void 0,"--xy-minimap-mask-background-color-props":typeof y=="string"?y:void 0,"--xy-minimap-mask-stroke-color-props":typeof g=="string"?g:void 0,"--xy-minimap-mask-stroke-width-props":typeof x=="number"?x*z:void 0,"--xy-minimap-node-background-color-props":typeof l=="string"?l:void 0,"--xy-minimap-node-stroke-color-props":typeof i=="string"?i:void 0,"--xy-minimap-node-stroke-width-props":typeof d=="number"?d:void 0},className:Qe(["react-flow__minimap",r]),"data-testid":"rf__minimap",children:m.jsxs("svg",{width:W,height:B,viewBox:`${ne} ${re} ${ue} ${ce}`,className:"react-flow__minimap-svg",role:"img","aria-labelledby":de,ref:D,onClick:fe,children:[xe&&m.jsx("title",{id:de,children:xe}),m.jsx(pk,{onClick:me,nodeColor:l,nodeStrokeColor:i,nodeBorderRadius:u,nodeClassName:a,nodeStrokeWidth:d,nodeComponent:f}),m.jsx("path",{className:"react-flow__minimap-mask",d:`M${ne-T},${re-T}h${ue+T*2}v${ce+T*2}h${-ue-T*2}z - M${X.x},${X.y}h${X.width}v${X.height}h${-X.width}z`,fillRule:"evenodd",pointerEvents:"none"})]})})}ag.displayName="MiniMap";const _k=O.memo(ag),Sk=t=>r=>t?`${Math.max(1/r.transform[2],1)}`:void 0,kk={[vo.Line]:"right",[vo.Handle]:"bottom-right"};function Ek({nodeId:t,position:r,variant:i=vo.Handle,className:l,style:a=void 0,children:u,color:d,minWidth:f=10,minHeight:p=10,maxWidth:y=Number.MAX_VALUE,maxHeight:g=Number.MAX_VALUE,keepAspectRatio:x=!1,resizeDirection:v,autoScale:_=!0,shouldResize:S,onResizeStart:C,onResize:E,onResizeEnd:N}){const b=$m(),k=typeof t=="string"?t:b,j=Oe(),R=O.useRef(null),D=i===vo.Handle,H=be(O.useCallback(Sk(D&&_),[D,_]),Ue),X=O.useRef(null),V=r??kk[i];O.useEffect(()=>{if(!(!R.current||!k))return X.current||(X.current=W1({domNode:R.current,nodeId:k,getStoreItems:()=>{const{nodeLookup:Z,transform:te,snapGrid:J,snapToGrid:M,nodeOrigin:W,domNode:B}=j.getState();return{nodeLookup:Z,transform:te,snapGrid:J,snapToGrid:M,nodeOrigin:W,paneDomNode:B}},onChange:(Z,te)=>{const{triggerNodeChanges:J,nodeLookup:M,parentLookup:W,nodeOrigin:B}=j.getState(),U=[],A={x:Z.x,y:Z.y},z=M.get(k);if(z&&z.expandParent&&z.parentId){const F=z.origin??B,P=Z.width??z.measured.width??0,T=Z.height??z.measured.height??0,ne={id:z.id,parentId:z.parentId,rect:{width:P,height:T,...am({x:Z.x??z.position.x,y:Z.y??z.position.y},{width:P,height:T},z.parentId,M,F)}},re=mc([ne],M,W,B);U.push(...re),A.x=Z.x?Math.max(F[0]*P,Z.x):void 0,A.y=Z.y?Math.max(F[1]*T,Z.y):void 0}if(A.x!==void 0&&A.y!==void 0){const F={id:k,type:"position",position:{...A}};U.push(F)}if(Z.width!==void 0&&Z.height!==void 0){const P={id:k,type:"dimensions",resizing:!0,setAttributes:v?v==="horizontal"?"width":"height":!0,dimensions:{width:Z.width,height:Z.height}};U.push(P)}for(const F of te){const P={...F,type:"position"};U.push(P)}J(U)},onEnd:({width:Z,height:te})=>{const J={id:k,type:"dimensions",resizing:!1,dimensions:{width:Z,height:te}};j.getState().triggerNodeChanges([J])}})),X.current.update({controlPosition:V,boundaries:{minWidth:f,minHeight:p,maxWidth:y,maxHeight:g},keepAspectRatio:x,resizeDirection:v,onResizeStart:C,onResize:E,onResizeEnd:N,shouldResize:S}),()=>{var Z;(Z=X.current)==null||Z.destroy()}},[V,f,p,y,g,x,C,E,N,S]);const ee=V.split("-");return m.jsx("div",{className:Qe(["react-flow__resize-control","nodrag",...ee,i,l]),ref:R,style:{...a,scale:H,...d&&{[D?"backgroundColor":"borderColor"]:d}},children:u})}O.memo(Ek);const Nk={"arch.context":0,"django.app":0,"django.route":1,"django.url_name":1,"django.view":2,"django.viewset_action":2,"django.permission":2,"django.serializer":3,"django.form":3,"django.serializer_field":4,"django.service":4,"django.model":5,"django.field":6,"django.relation":6,"django.task":7,"django.receiver":7,"django.signal":7,"django.test":7,"django.migration_op":7,"django.admin":7,"openapi.path":8,"react.api_client":9,"react.query_key":10,"react.hook":10,"react.feature":10,"react.route":11,"react.page":11,"react.component":12,"react.form_schema":13,"react.test":13,"react.context":12};function Pl(t){return Nk[t]??8}function Ck(t){const r=new Map;for(const l of t){const a=Pl(l.type),u=r.get(a)??[];u.push(l),r.set(a,u)}const i=new Map;for(const[l,a]of r)a.sort((u,d)=>u.name.localeCompare(d.name)),a.forEach((u,d)=>{i.set(u.id,{x:l*260,y:d*108})});return i}const ug=90,jk=new Set(["django.field","django.serializer_field","django.relation","django.test","react.test","django.url_name","django.throttle"]),sp={"arch.context":"#edf2f4","django.app":"#8d99ae","django.route":"#4cc9f0","django.view":"#4895ef","django.viewset_action":"#4361ee","django.permission":"#7b8cde","django.serializer":"#f4a261","django.form":"#e9c46a","django.serializer_field":"#e9c46a","django.service":"#90be6d","django.model":"#2a9d8f","django.field":"#8ac926","django.task":"#e76f51","django.receiver":"#e85d04","django.signal":"#f4a261","django.test":"#6c757d","django.admin":"#adb5bd","django.migration_op":"#9d4edd","openapi.path":"#00bbf9","react.api_client":"#ff6b6b","react.query_key":"#adb5bd","react.hook":"#7b2cbf","react.feature":"#9d4edd","react.route":"#c77dff","react.page":"#c77dff","react.component":"#9d4edd","react.form_schema":"#ffd166","react.test":"#6c757d"},Mk=Math.PI*(3-Math.sqrt(5)),cg=220,Pk=26,Ik={0:"context",1:"routes",2:"views",3:"serializers",4:"services",5:"models",6:"fields",7:"jobs / signals",8:"openapi",9:"api client",10:"hooks",11:"pages",12:"components",13:"forms / tests"};function dg(t){return t.startsWith("react.")?"react":t.startsWith("openapi.")?"stitch":t.startsWith("arch.")?"arch":"django"}function uE(t){return sp[t]?sp[t]:t.startsWith("react.")?"#9d4edd":t.startsWith("openapi.")?"#00bbf9":"#4a5568"}function bk(t){return t>=ug?"3d":"2d"}function Tk(t){return t>=ug?"overview":"full"}function Rk(t,r,i=1){const l=new Set([t]);let a=new Set([t]);for(let u=0;ui.families.has(dg(f.type)));i.detail==="overview"&&(l=l.filter(f=>!jk.has(f.type)));const a=new Set(l.map(f=>f.id)),u=r.filter(f=>a.has(f.src)&&a.has(f.dst)),d=i.focusId?Rk(i.focusId,u,1):new Set;if(i.neighborhoodOnly&&i.focusId&&d.size){l=l.filter(p=>d.has(p.id));const f=new Set(l.map(p=>p.id));return{nodes:l,edges:u.filter(p=>f.has(p.src)&&f.has(p.dst)),neighborIds:d}}return{nodes:l,edges:u,neighborIds:d}}function cE(t){const r=new Map;for(const l of t){const a=Pl(l.type),u=r.get(a)??[];u.push(l),r.set(a,u)}const i=new Map;for(const[l,a]of r){a.sort((d,f)=>d.name.localeCompare(f.name));const u=l*cg;a.forEach((d,f)=>{if(a.length===1){i.set(d.id,{x:u,y:0,z:0});return}const p=Pk*Math.sqrt(f+1),y=f*Mk;i.set(d.id,{x:u,y:p*Math.cos(y),z:p*Math.sin(y)})})}return i}function dE(t){const r=new Map;for(const i of t){const l=Pl(i.type);r.set(l,(r.get(l)||0)+1)}return[...r.entries()].sort((i,l)=>i[0]-l[0]).map(([i,l])=>({layer:i,x:i*cg,count:l}))}const Js=16,zk=12,Ak=new Set(["django.route","react.route","react.page","django.task","django.migration_op","django.permission","django.throttle","django.admin","django.management_command","openapi.path"]),Dk=new Set(["django.serializer","django.serializer_field","django.form","openapi.path","react.form_schema","django.route"]),lp={"arch.context":"Ownership boundary from loadpath.yml — the context this code belongs to.","django.app":"Django app package that owns models, views, and jobs.","django.route":"HTTP URL that publishes a view. A sink: this is where a change becomes a public request.","django.url_name":"Named URL used by reverse() / {% url %} lookups.","django.view":"Request handler (class-based view, function view, or ViewSet).","django.viewset_action":"One ViewSet action (list, create, retrieve, update, destroy).","django.permission":"Auth gate on a view — who is allowed to hit this path.","django.throttle":"Rate-limit class attached to a view.","django.serializer":"Request/response contract: which fields go in and come out.","django.form":"Django form that validates submitted input.","django.serializer_field":"One field on a serializer or form — the typed slot on the contract.","django.service":"Internal service or use-case. Work that is not itself an HTTP sink.","django.model":"ORM model. Schema and relations live here.","django.field":"Model column. Type, indexes, and relations are the contract of the table.","django.relation":"Model-to-model relation (FK / M2M / O2O).","django.task":"Celery or Dramatiq job. Once enqueued, this is a sink.","django.receiver":"Signal handler that runs after a model event.","django.signal":"Django signal that receivers subscribe to.","django.test":"Backend test that mentions symbols on this path.","django.admin":"Django admin class for a model.","django.migration_op":"Schema migration operation (CreateModel, AlterField, …).","django.management_command":"manage.py command — an operational sink.","openapi.path":"Generated OpenAPI operation. The typed HTTP contract between stacks.","react.api_client":"Frontend fetch or generated client call to an API path.","react.query_key":"React Query cache key. Invalidation and reads share this name.","react.hook":"Data hook wrapping query or mutation calls.","react.feature":"Frontend feature module (folder).","react.route":"Client-side route. A sink: this is a URL the user can open.","react.page":"Page or screen component rendered by a route.","react.component":"UI component.","react.form_schema":"Zod (or similar) schema — typed form inputs on the client.","react.test":"Frontend test covering a page, hook, or component.","react.context":"React context provider."},$k={field_type:"Type",fields:"Fields",form_fields:"Form fields",permissions:"Permissions",throttles:"Throttles",authentication:"Authentication",pagination:"Pagination",filterset:"Filterset",bases:"Extends",on_delete:"on_delete",related_name:"related_name",unique:"Unique",db_index:"Indexed",relation:"Relation field",looks_idempotent_on_pk:"Idempotent on pk",broker:"Broker",route:"Route",url_name:"URL name",view:"View",include:"Includes",mounted_at:"Mounted at",full_path:"Full path",method:"Method",path:"Path",operation_id:"Operation",raw:"URL",kind:"Schema",exclude:"Excludes",queryset_in_serializer:"Queryset in serializer",get_queryset:"Custom get_queryset",get_serializer_class:"Dynamic serializer",dynamic:"Dynamic",fbv:"Function view",ninja:"Django Ninja",django_form:"Django form",mutation:"Mutation",has_error_boundary:"Error boundary",invalidation:"Cache invalidation",inferred:"Inferred stitch",generated:"Generated",shared:"Shared module",element:"Renders",model_name:"Model",field_name:"Field",op:"Operation",app:"App",feature:"Feature",from_view:"From view",mentions:"Mentions",nodeid:"Test id",task:"Task",to:"Related to"},ap=["field_type","method","path","operation_id","raw","route","mounted_at","full_path","url_name","view","element","fields","form_fields","exclude","kind","bases","permissions","authentication","throttles","pagination","filterset","on_delete","related_name","to","unique","db_index","relation","looks_idempotent_on_pk","broker","task","model_name","field_name","op","app","feature","from_view","include","fbv","ninja","django_form","mutation","has_error_boundary","invalidation","inferred","generated","shared","queryset_in_serializer","get_queryset","get_serializer_class","dynamic","mentions","nodeid"],up=new Set(["referenced","placeholder","booted","line","call","from","import","local","source","file","plain_handler","string_ref","pagination_sink","match","via","generated_client","django","react","superseded_by_generated","foreign_app","imported"]),Ok=new Set(["looks_idempotent_on_pk"]),Fk=new Set(["inferred","generated","mutation","fbv","ninja"]);function Hk(t){return lp[t]?lp[t]:t.startsWith("react.")?"A React node on the load path.":t.startsWith("django.")?"A Django node on the load path.":t.startsWith("openapi.")?"A stitch node between Django and React.":"A node on the architecture graph."}function Bk(t,r,i){const l=new Map(r.map(x=>[x.id,x])),a=[];Ak.has(t.type)&&a.push("sink"),Dk.has(t.type)&&a.push("contract");const u=t.extra??{};u.inferred&&a.push("inferred"),u.generated&&a.push("generated"),u.mutation&&a.push("mutation"),u.fbv&&a.push("function view"),u.ninja&&a.push("ninja");const d=i.filter(x=>x.dst===t.id),f=i.filter(x=>x.src===t.id),p=d.slice(0,Js).map(x=>cp(x,l,x.src)),y=f.slice(0,Js).map(x=>cp(x,l,x.dst)),g=t.file_path?`${t.file_path}${t.start_line?`:${t.start_line}`:""}`:void 0;return{type:t.type,typeLabel:di(gl(t.type)),layer:Ik[Pl(t.type)]??"other",purpose:Hk(t.type),name:t.name,qualifiedName:t.qualified_name,file:g,context:t.context,roles:a,facts:Vk(u).filter(x=>!(x.key==="app"&&x.value===t.context)),inputs:p,outputs:y,extraInputs:Math.max(0,d.length-Js),extraOutputs:Math.max(0,f.length-Js)}}function cp(t,r,i){const l=r.get(i),a=i.includes(":")?i.slice(i.indexOf(":")+1):i;return{id:i,name:(l==null?void 0:l.name)||a,type:(l==null?void 0:l.type)||"",typeLabel:l?di(gl(l.type)):"",edgeType:t.type,edgeLabel:di(t.type),inferred:t.confidence<.8}}function Vk(t){const r=[...ap.filter(a=>a in t),...Object.keys(t).filter(a=>!ap.includes(a)&&!up.has(a))],i=[],l=new Set;for(const a of r){if(l.has(a)||up.has(a)||Fk.has(a))continue;l.add(a);const u=Uk(a,t[a]);u!=null&&i.push({key:a,label:$k[a]??di(a),value:u})}return i}function Uk(t,r){if(r==null)return null;if(typeof r=="boolean")return!r&&!Ok.has(t)?null:r?"yes":"no";if(typeof r=="number")return String(r);if(typeof r=="string")return r.trim()||null;if(Array.isArray(r)){const i=r.map(u=>typeof u=="string"||typeof u=="number"?String(u):"").filter(Boolean);if(!i.length)return null;const l=i.slice(0,zk),a=i.length-l.length;return a>0?`${l.join(", ")} +${a} more`:l.join(", ")}return null}const Wk=O.lazy(()=>my(()=>import("./LayeredGraph3D-ByrH7ZmH.js"),[],import.meta.url).then(t=>({default:t.LayeredGraph3D}))),Yk={cheap:"var(--edge-cheap)",expensive:"var(--edge-expensive)",critical:"var(--edge-critical)"};function Xk({data:t,selected:r}){return m.jsxs("div",{className:r?"lp-node selected":"lp-node",children:[m.jsx(xo,{type:"target",position:Se.Left,isConnectable:!1}),m.jsx("div",{className:"t",children:gl(t.type)}),m.jsx("div",{className:"n",title:t.name,children:t.name}),m.jsx(xo,{type:"source",position:Se.Right,isConnectable:!1})]})}const Gk={load:Xk},dp=180,fp=56,Qk=new Set(["django","react","stitch","arch"]);function Kk(t,r,i=null){const l=new Map(t.map(f=>[f.id,f])),a=Ck(t),u=t.map(f=>({id:f.id,type:"load",position:a.get(f.id)??{x:0,y:0},data:{name:f.name,type:f.type,file:f.file_path},selected:i===f.id,sourcePosition:Se.Right,targetPosition:Se.Left,width:dp,height:fp,style:{width:dp,height:fp}})),d=r.filter(f=>l.has(f.src)&&l.has(f.dst)).map(f=>{const p=Yk[f.weight]||"var(--edge-cheap)";return{id:f.id,source:f.src,target:f.dst,type:"smoothstep",animated:f.weight==="critical",style:{stroke:p,strokeWidth:f.weight==="critical"?2.4:1.2,strokeDasharray:f.confidence<.8?"6 4":void 0},markerEnd:{type:vi.ArrowClosed,width:14,height:14,color:p},label:f.type.replaceAll("_"," "),labelStyle:{fill:"var(--muted)",fontSize:10}}});return{rfNodes:u,rfEdges:d}}function hp({node:t,nodes:r,edges:i,onClose:l}){const a=Bk(t,r,i);return O.useEffect(()=>{const u=d=>{d.key==="Escape"&&l()};return window.addEventListener("keydown",u),()=>window.removeEventListener("keydown",u)},[l]),m.jsxs("aside",{className:"inspector","data-testid":"graph-inspector",children:[m.jsxs("div",{className:"inspector-head",children:[m.jsx("div",{className:"t",children:a.typeLabel}),m.jsx("div",{className:"inspector-roles",children:a.roles.map(u=>m.jsx("span",{className:"inspector-chip",children:u},u))}),m.jsx("button",{type:"button",className:"inspector-close","data-testid":"graph-inspector-close","aria-label":"Close inspector",onClick:l,children:"×"})]}),m.jsx("div",{className:"n",children:ao(a.name)}),m.jsx("p",{className:"inspector-purpose","data-testid":"graph-inspector-purpose",children:a.purpose}),a.context?m.jsx("div",{className:"muted",children:ao(a.context)}):null,a.file?m.jsx("div",{className:"file",children:ao(a.file)}):null,m.jsx("div",{className:"muted",children:ao(a.qualifiedName)}),m.jsxs("div",{className:"muted inspector-layer",children:["layer · ",a.layer]}),a.facts.length?m.jsx("dl",{className:"inspector-facts","data-testid":"graph-inspector-facts",children:a.facts.map(u=>m.jsxs("div",{className:"inspector-fact",children:[m.jsx("dt",{children:u.label}),m.jsx("dd",{children:ao(u.value)})]},u.key))}):null,m.jsx(pp,{title:"Inputs",testId:"graph-inspector-inputs",links:a.inputs,extra:a.extraInputs,empty:"Nothing in this graph points here."}),m.jsx(pp,{title:"Outputs",testId:"graph-inspector-outputs",links:a.outputs,extra:a.extraOutputs,empty:"This node does not point at anything in this graph."})]})}function pp({title:t,testId:r,links:i,extra:l,empty:a}){return m.jsxs("section",{className:"inspector-section","data-testid":r,children:[m.jsxs("h3",{children:[t,m.jsx("span",{className:"count",children:i.length+l})]}),i.length?m.jsx("ul",{children:i.map((u,d)=>m.jsxs("li",{children:[m.jsx("span",{className:"inspector-link-name",title:u.name,children:ao(u.name)}),m.jsxs("span",{className:"inspector-link-meta",children:[u.typeLabel?`${u.typeLabel} · `:"",u.edgeLabel,u.inferred?" · inferred":""]})]},`${u.edgeType}:${u.id}:${d}`))}):m.jsx("p",{className:"muted",children:a}),l?m.jsxs("p",{className:"muted",children:["+",l," more"]}):null]})}function $u({nodes:t,edges:r}){const[i,l]=O.useState(null),[a,u]=O.useState(null),[d,f]=O.useState(null),[p,y]=O.useState(new Set(Qk)),[g,x]=O.useState(!1),v=typeof window<"u"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches,_=a??bk(t.length),S=d??Tk(t.length),C=O.useMemo(()=>Lk(t,r,{detail:S,families:p,focusId:i,neighborhoodOnly:g&&_==="3d"}),[t,r,S,p,i,g,_]),E=O.useMemo(()=>new Map(C.nodes.map(V=>[V.id,V])),[C.nodes]),N=i?E.get(i)??null:null,{rfNodes:b,rfEdges:k}=O.useMemo(()=>{const V=Kk(C.nodes,C.edges,i);return v&&(V.rfEdges=V.rfEdges.map(ee=>({...ee,animated:!1}))),V},[C.nodes,C.edges,i,v]);O.useEffect(()=>{i&&!E.has(i)&&l(null)},[E,i]);const j=(V,ee)=>{l(ee.id)},R=()=>{l(null),x(!1)},D=V=>{y(ee=>{const Z=new Set(ee);if(Z.has(V)){if(Z.size===1)return ee;Z.delete(V)}else Z.add(V);return Z})},H=O.useMemo(()=>{const V=new Set;for(const ee of t)V.add(dg(ee.type));return V},[t]),X=t.length-C.nodes.length;return m.jsxs("div",{className:"impact-graph",style:{flex:1,minHeight:0,position:"relative",display:"flex",flexDirection:"column"},children:[m.jsxs("div",{className:"graph-toolbar","data-testid":"graph-toolbar",children:[m.jsxs("div",{className:"seg","aria-label":"Graph projection",children:[m.jsx("button",{type:"button","data-testid":"graph-view-2d",className:_==="2d"?"active":"","aria-pressed":_==="2d",onClick:()=>u("2d"),children:"2D map"}),m.jsx("button",{type:"button","data-testid":"graph-view-3d",className:_==="3d"?"active":"","aria-pressed":_==="3d",onClick:()=>u("3d"),children:"3D layers"})]}),m.jsxs("div",{className:"seg","aria-label":"Graph detail",children:[m.jsx("button",{type:"button","data-testid":"graph-detail-overview",className:S==="overview"?"active":"","aria-pressed":S==="overview",onClick:()=>f("overview"),children:"Overview"}),m.jsx("button",{type:"button","data-testid":"graph-detail-full",className:S==="full"?"active":"","aria-pressed":S==="full",onClick:()=>f("full"),children:"Full"})]}),m.jsx("div",{className:"seg","aria-label":"Graph families",children:["django","stitch","react"].filter(V=>H.has(V)).map(V=>m.jsx("button",{type:"button","data-testid":`graph-family-${V}`,className:p.has(V)?"active":"","aria-pressed":p.has(V),onClick:()=>D(V),children:V},V))}),_==="3d"?m.jsx("button",{type:"button",className:g?"chip-btn active":"chip-btn","data-testid":"graph-neighborhood",disabled:!i,onClick:()=>x(V=>!V),children:g?"Neighborhood":"Focus neighbors"}):null,m.jsxs("span",{className:"muted graph-count",children:[C.nodes.length," nodes · ",C.edges.length," edges",X?` · ${X} hidden`:""]})]}),m.jsx("div",{className:"graph-stage",children:_==="3d"?m.jsxs("div",{className:"graph-3d","data-testid":"graph-3d",children:[m.jsx("p",{className:"graph-3d-hint",children:"Architecture layers are stacked in depth (Django → stitch → React). Drag to orbit, scroll to zoom, click a node to inspect it."}),m.jsx(O.Suspense,{fallback:m.jsx("p",{className:"muted graph-3d-hint",children:"Loading 3D layers…"}),children:m.jsx(Wk,{nodes:C.nodes,edges:C.edges,selectedId:i,neighborIds:C.neighborIds,onSelect:V=>{l(V),V||x(!1)}})}),N?m.jsx(hp,{node:N,nodes:t,edges:r,onClose:R}):null]}):m.jsxs(ig,{children:[m.jsxs(QS,{nodes:b,edges:k,nodeTypes:Gk,fitView:!0,fitViewOptions:{padding:.2,maxZoom:1.15},minZoom:.25,nodesDraggable:!1,nodesConnectable:!1,elementsSelectable:!0,deleteKeyCode:null,onNodeClick:j,onPaneClick:R,proOptions:{hideAttribution:!1},"data-testid":"impact-graph",children:[m.jsx(ek,{}),m.jsx(_k,{pannable:!0,zoomable:!0,ariaLabel:"Impact graph overview",nodeColor:"var(--muted)",nodeStrokeColor:"transparent",nodeStrokeWidth:0,maskColor:"rgba(0, 0, 0, 0.45)",maskStrokeColor:"var(--accent)",maskStrokeWidth:1.4,bgColor:"var(--graph-bg)",style:{width:184,height:128}}),m.jsx(lk,{})]}),N?m.jsx(hp,{node:N,nodes:t,edges:r,onClose:R}):null]})})]})}const mp=[{value:"HEAD",label:"HEAD",group:"preset"},{value:"HEAD~1",label:"HEAD~1",group:"preset"}],qk=["preset","branch","tag","commit"];function Zk(t){var a;if(!(t!=null&&t.git))return[...mp];const r=((a=t.presets)!=null&&a.length?t.presets:mp.map(u=>u.value)).map(u=>({value:u,label:u,group:"preset"})),i=new Set(r.map(u=>u.value)),l=[...r];for(const u of t.branches||[])i.has(u.name)||(i.add(u.name),l.push({value:u.name,label:u.current?`${u.name} (current)`:u.name,detail:u.subject,group:"branch"}));for(const u of t.tags||[])i.has(u.name)||(i.add(u.name),l.push({value:u.name,label:u.name,detail:u.subject,group:"tag"}));for(const u of t.commits||[])i.has(u.sha)||(i.add(u.sha),l.push({value:u.sha,label:u.short,detail:u.subject,group:"commit"}));return l}function Jk(t,r){const i=r.trim().toLowerCase();return i?t.filter(l=>l.value.toLowerCase().includes(i)||l.label.toLowerCase().includes(i)||(l.detail||"").toLowerCase().includes(i)):t}function eE(t){return qk.map(r=>({group:r,items:t.filter(i=>i.group===r)})).filter(r=>r.items.length>0)}function tE(t){return t==="preset"?"Common":t==="branch"?"Branches":t==="tag"?"Tags":"Recent commits"}function gp({value:t,onChange:r,placeholder:i,testId:l,menuTestId:a,refs:u,onNeedRefs:d}){const f=O.useId(),p=O.useRef(null),[y,g]=O.useState(!1),[x,v]=O.useState(null),[_,S]=O.useState(0),C=O.useMemo(()=>{const j=Zk(u);return x===null?j:Jk(j,x)},[u,x]),E=O.useMemo(()=>eE(C),[C]);O.useEffect(()=>{y&&d()},[y,d]),O.useEffect(()=>{S(0)},[x,y]);const N=()=>{g(!1),v(null)},b=j=>{r(j.value),N()},k=j=>{if(j.key==="ArrowDown"){if(j.preventDefault(),!y){g(!0);return}S(R=>Math.min(R+1,Math.max(C.length-1,0)))}else if(j.key==="ArrowUp"){if(j.preventDefault(),!y)return;S(R=>Math.max(R-1,0))}else if(j.key==="Enter"&&y){j.preventDefault();const R=C[_];R&&b(R)}else j.key==="Escape"&&y&&(j.preventDefault(),N())};return m.jsxs("div",{className:"combo",ref:p,onBlur:j=>{j.currentTarget.contains(j.relatedTarget)||N()},children:[m.jsxs("div",{className:"combo-row",children:[m.jsx("input",{"data-testid":l,value:t,placeholder:i,spellCheck:!1,role:"combobox","aria-expanded":y,"aria-controls":f,"aria-autocomplete":"list",onChange:j=>{r(j.target.value),y&&v(j.target.value)},onKeyDown:k}),m.jsx("button",{type:"button",className:"icon-btn combo-toggle","data-testid":`${l}-toggle`,"aria-label":"Show recent refs","aria-expanded":y,onMouseDown:j=>j.preventDefault(),onClick:()=>y?N():g(!0),children:m.jsx(fy,{})})]}),y?m.jsx("div",{className:"combo-menu",id:f,role:"listbox","data-testid":a,children:E.length===0?m.jsx("div",{className:"combo-empty muted",children:"No matching refs — the typed value is kept"}):E.map(j=>m.jsxs("div",{className:"combo-group",children:[m.jsx("div",{className:"combo-heading",children:tE(j.group)}),j.items.map(R=>{const D=C.indexOf(R);return m.jsxs("button",{type:"button",role:"option","aria-selected":D===_,className:D===_?"combo-option active":"combo-option","data-testid":`ref-option-${R.group}`,onMouseDown:H=>H.preventDefault(),onMouseEnter:()=>S(D),onClick:()=>b(R),children:[m.jsx("span",{className:"combo-label",children:R.label}),R.detail?m.jsx("span",{className:"combo-detail",children:R.detail}):null]},`${R.group}:${R.value}`)})]},j.group))}):null]})}function nE({initialPath:t,onSelect:r,onClose:i}){const[l,a]=O.useState(null),[u,d]=O.useState(t),[f,p]=O.useState(null),[y,g]=O.useState(""),[x,v]=O.useState(!1),_=O.useRef(null),S=O.useRef(0),C=async k=>{const j=S.current+1;S.current=j,v(!0);try{const R=await ft.browse(k);if(S.current!==j)return;a(R),d(R.path),p(R.is_git?R.path:null),g("")}catch(R){if(S.current!==j)return;g(R instanceof Error?R.message:String(R))}finally{S.current===j&&v(!1)}};O.useEffect(()=>{var k,j;C(t),(k=_.current)==null||k.focus(),(j=_.current)==null||j.select()},[t]);const E=f||(l==null?void 0:l.path)||u,N=f&&f!==(l==null?void 0:l.path)?f.split(/[\\/]/).filter(Boolean).pop():l!=null&&l.is_git?"this repository":"this folder",b=k=>{k.key==="Escape"&&(k.preventDefault(),i())};return m.jsx("div",{className:"modal-backdrop","data-testid":"repo-explorer","data-overlay":"true",onClick:i,onKeyDown:b,children:m.jsxs("div",{className:"modal",role:"dialog","aria-modal":"true","aria-labelledby":"explorer-title",onClick:k=>k.stopPropagation(),children:[m.jsxs("div",{className:"modal-head",children:[m.jsxs("div",{children:[m.jsx("h2",{id:"explorer-title",children:"Select repository"}),m.jsx("p",{className:"muted",children:"Browse to a git root, or paste the full path."})]}),m.jsx("button",{type:"button",className:"btn ghost","data-testid":"explorer-cancel",onClick:i,children:"Cancel"})]}),m.jsxs("form",{className:"explorer-path",onSubmit:k=>{k.preventDefault(),C(u)},children:[m.jsx("input",{ref:_,"data-testid":"explorer-path",value:u,onChange:k=>d(k.target.value),spellCheck:!1,"aria-label":"Directory path"}),m.jsx("button",{type:"button",className:"btn",disabled:!(l!=null&&l.parent),onClick:()=>(l==null?void 0:l.parent)&&void C(l.parent),children:"Up"}),m.jsx("button",{type:"button",className:"btn",onClick:()=>l&&void C(l.home),children:"Home"}),m.jsx("button",{type:"submit",className:"btn",children:"Go"})]}),y?m.jsx("div",{className:"error",role:"alert",children:y}):null,m.jsx("div",{className:"explorer-list",role:"listbox","aria-label":"Folders","aria-busy":x,children:l!=null&&l.entries.length?l.entries.map(k=>{const j=f===k.path;return m.jsxs("button",{type:"button",role:"option","aria-selected":j,className:j?"explorer-row active":"explorer-row","data-testid":"explorer-entry","data-path":k.path,onClick:()=>p(k.path),onDoubleClick:()=>void C(k.path),children:[m.jsx(wp,{}),m.jsx("span",{className:"explorer-name",children:k.name}),k.is_git?m.jsx("span",{className:"chip git-badge",children:"git"}):null]},k.path)}):m.jsx("div",{className:"muted explorer-empty",children:x?"Loading…":"No folders here"})}),m.jsxs("div",{className:"modal-foot",children:[m.jsx("span",{className:"muted explorer-current",title:E,children:E}),m.jsxs("button",{type:"button",className:"btn primary","data-testid":"explorer-use",disabled:!E,onClick:()=>E&&r(E),children:["Use ",N]})]})]})})}const ml=[{id:"obsidian",label:"Obsidian",group:"dark"},{id:"nord",label:"Nord",group:"dark"},{id:"solarized-dark",label:"Solarized Dark",group:"dark"},{id:"forest",label:"Forest",group:"dark"},{id:"rose",label:"Rose Pine",group:"dark"},{id:"amber",label:"Midnight Amber",group:"dark"},{id:"volcano",label:"Volcano",group:"dark"},{id:"lavender",label:"Lavender",group:"dark"},{id:"neon-noir",label:"Neon Noir",group:"dark"},{id:"synthwave",label:"Synthwave",group:"dark"},{id:"phosphor",label:"Phosphor",group:"dark"},{id:"aurora",label:"Aurora",group:"dark"},{id:"biolume",label:"Biolume",group:"dark"},{id:"carbon",label:"Carbon",group:"dark"},{id:"paper",label:"Paper",group:"light"},{id:"solarized-light",label:"Solarized Light",group:"light"},{id:"seafoam",label:"Seafoam",group:"light"},{id:"high-contrast",label:"High Contrast",group:"light"},{id:"sakura",label:"Sakura",group:"light"},{id:"citrus",label:"Citrus",group:"light"},{id:"peach",label:"Peach Fuzz",group:"light"},{id:"candy",label:"Cotton Candy",group:"light"},{id:"sky",label:"Clear Sky",group:"light"},{id:"coral",label:"Coral Reef",group:"light"}],rE="obsidian",fg="loadpath.theme";function oE(t){return ml.some(r=>r.id===t)}function hg(){try{const t=localStorage.getItem(fg)||"";if(oE(t))return t}catch{}return rE}function iE(t){var r;return((r=ml.find(i=>i.id===t))==null?void 0:r.group)==="light"?"light":"dark"}function pg(t){document.documentElement.dataset.theme=t,document.documentElement.style.colorScheme=iE(t);try{localStorage.setItem(fg,t)}catch{}}const yp=[{id:"review",label:"Review",testId:"tab-review",shortcut:"1",icon:ly},{id:"architecture",label:"Architecture",testId:"tab-architecture",shortcut:"2",icon:ay},{id:"graph",label:"Impact graph",testId:"tab-graph",shortcut:"3",icon:uy},{id:"prs",label:"Pull requests",testId:"tab-prs",shortcut:"4",icon:cy},{id:"settings",label:"Settings",testId:"tab-settings",shortcut:"5",icon:dy}];function sE(){var Ir,er,tr,br,jn,Mn,Pn;const[t,r]=O.useState("review"),[i,l]=O.useState(localStorage.getItem("loadpath.repo")||""),[a,u]=O.useState(localStorage.getItem("loadpath.base")||"HEAD~1"),[d,f]=O.useState(localStorage.getItem("loadpath.head")||"HEAD"),[p,y]=O.useState(null),[g,x]=O.useState(null),[v,_]=O.useState([]),[S,C]=O.useState("review"),[E,N]=O.useState(""),[b,k]=O.useState(""),[j,R]=O.useState(""),[D,H]=O.useState({}),[X,V]=O.useState([]),[ee,Z]=O.useState(localStorage.getItem("loadpath.scmRepo")||""),[te,J]=O.useState(localStorage.getItem("loadpath.provider")||"github"),[M,W]=O.useState(localStorage.getItem("loadpath.prNumber")||""),[B,U]=O.useState(""),[A,z]=O.useState(hg),[F,P]=O.useState(!1),[T,ne]=O.useState(!1),[re,ue]=O.useState(null),ce=O.useRef(i);ce.current=i;const de=O.useRef(!1);de.current=T;const Q=O.useRef(""),se=K=>{z(K),pg(K)},fe=O.useRef(""),me=K=>{fe.current=K,k(K)};O.useEffect(()=>{ft.settings().then(H).catch(()=>{}).finally(()=>P(!0)),ft.repos().then(K=>_(K.repos)).catch(()=>{})},[]);const xe=()=>i.trim()?!0:(N("Point at a local repository path first."),!1);O.useEffect(()=>{if(t!=="architecture"||!i.trim())return;const K=i;let ye=!1;return ft.architecture(K).then(Le=>{!ye&&ce.current===K&&x(Le)}).catch(()=>{}),()=>{ye=!0}},[t,i]);const pe=K=>{l(K),localStorage.setItem("loadpath.repo",K),K.trim()!==Q.current&&(Q.current="",ue(null))},Ce=O.useCallback(()=>{const K=ce.current.trim();!K||Q.current===K||(Q.current=K,ft.gitRefs(K).then(ye=>{ce.current.trim()===K&&ue(ye)}).catch(()=>{Q.current===K&&(Q.current="",ue(null))}))},[]),je=(K,ye)=>{u(K),f(ye),localStorage.setItem("loadpath.base",K),localStorage.setItem("loadpath.head",ye)},Me=(K,ye,Le)=>{J(K),Z(ye),localStorage.setItem("loadpath.provider",K),localStorage.setItem("loadpath.scmRepo",ye),Le!==void 0&&(W(Le),localStorage.setItem("loadpath.prNumber",Le))},Re=async(K=i)=>{if(!K.trim())return null;const ye=await ft.architecture(K);return ce.current===K&&x(ye),ye},Xe=async()=>{if(!fe.current&&xe()){N(""),R(""),me("Tracing load path…"),pe(i),je(a,d);try{const K=await ft.review(i,a,d,!0);y(K),C("review"),r("review"),await ft.repos().then(ye=>_(ye.repos)).catch(()=>{}),await Re(i)}catch(K){N(K instanceof Error?K.message:String(K))}finally{me("")}}},rt=async(K=!0)=>{if(!fe.current&&xe()){N(""),R(""),me(K?"Indexing…":"Full reindex…"),pe(i);try{await ft.index(i,K);const ye=await Re(i);await ft.repos().then(Le=>_(Le.repos)).catch(()=>{}),ye!=null&&ye.indexed&&(C("architecture"),r("architecture"))}catch(ye){N(ye instanceof Error?ye.message:String(ye))}finally{me("")}}},Ze=async()=>{if(!fe.current&&xe()){N(""),R(""),me("Detecting layout…"),pe(i);try{const K=await ft.init(i);R(K.message),await ft.repos().then(ye=>_(ye.repos)).catch(()=>{})}catch(K){N(K instanceof Error?K.message:String(K))}finally{me("")}}},Je=async()=>{if(p!=null&&p.markdown)try{await navigator.clipboard.writeText(p.markdown),R("Copied markdown brief")}catch(K){N(K instanceof Error?K.message:String(K))}},Vt=async()=>{if(!fe.current){if(!(p!=null&&p.markdown)||!ee||!M){N("Pick a pull request first (Pull requests tab), then post the brief.");return}me("Posting Loadpath brief…");try{const K=await ft.postComment(te,ee,Number(M),p.markdown);R(K.updated?"Updated the Loadpath PR comment":"Posted the Loadpath PR comment")}catch(K){N(K instanceof Error?K.message:String(K))}finally{me("")}}},zt=async()=>{if(!fe.current){N(""),me("Fetching pull requests…");try{const K=await ft.prs(te,ee);V(K.pull_requests)}catch(K){N(K instanceof Error?K.message:String(K))}finally{me("")}}},At=async K=>{K.preventDefault();const ye=new FormData(K.currentTarget),Le={github_token:String(ye.get("github_token")||""),bitbucket_token:String(ye.get("bitbucket_token")||""),bitbucket_username:String(ye.get("bitbucket_username")||""),ai_provider:String(ye.get("ai_provider")||"none"),ai_api_key:String(ye.get("ai_api_key")||""),ai_model:String(ye.get("ai_model")||""),ai_base_url:String(ye.get("ai_base_url")||"")},Nt=v.length?{...Le,workspaces:v.map(Ct=>({path:Ct.path,name:Ct.name}))}:Le;try{H(await ft.saveSettings(Nt)),R("Settings saved on this machine")}catch(Ct){N(Ct instanceof Error?Ct.message:String(Ct))}},lt=async()=>{if(!(!p||fe.current)){me("Residual analysis…");try{const K=await ft.residual(p);U(K.note)}catch(K){N(K instanceof Error?K.message:String(K))}finally{me("")}}},ht=O.useRef(Xe);ht.current=Xe;const ot=O.useRef(t);ot.current=t,O.useEffect(()=>{const K=ye=>{if(de.current){ye.key==="Escape"&&(ye.preventDefault(),ne(!1));return}const Le=ye.target;if(Le&&(Le.tagName==="INPUT"||Le.tagName==="TEXTAREA"||Le.tagName==="SELECT"||Le.isContentEditable)){ye.key==="Escape"&&Le.blur();return}if(ye.key==="Escape"){N(""),R("");return}const Nt=yp.find(Ct=>Ct.shortcut===ye.key);if(Nt&&!ye.metaKey&&!ye.ctrlKey&&!ye.altKey&&r(Nt.id),(ye.metaKey||ye.ctrlKey)&&ye.key==="Enter"){if(ot.current==="settings"||ot.current==="prs"||fe.current)return;ye.preventDefault(),ht.current()}};return window.addEventListener("keydown",K),()=>window.removeEventListener("keydown",K)},[]);const pt=O.useMemo(()=>S==="architecture"?(g==null?void 0:g.nodes)??[]:(p==null?void 0:p.nodes)??[],[S,g,p]),Cn=O.useMemo(()=>S==="architecture"?(g==null?void 0:g.edges)??[]:(p==null?void 0:p.edges)??[],[S,g,p]),Ut=p!=null&&p.index?`${p.index.counts.nodes} nodes · ${p.index.counts.edges} edges`:g!=null&&g.indexed?`${g.counts.nodes} nodes · ${g.counts.edges} edges`:"Not indexed",hn=((p==null?void 0:p.findings)||[]).filter(K=>!K.waived);return m.jsxs("div",{className:"app",children:[m.jsx("a",{className:"skip",href:"#main",children:"Skip to content"}),m.jsxs("nav",{className:"rail","data-testid":"rail","aria-label":"Primary",children:[m.jsxs("div",{className:"brand",children:[m.jsx("div",{className:"brand-mark",children:"Loadpath"}),m.jsx("div",{className:"brand-sub",children:"Load-path review"})]}),yp.map(K=>{const ye=K.icon,Le=t===K.id;return m.jsxs("button",{type:"button","data-testid":K.testId,className:Le?"nav-item active":"nav-item","aria-current":Le?"page":void 0,"aria-label":K.label,onClick:()=>r(K.id),children:[m.jsx(ye,{}),m.jsx("span",{children:K.label})]},K.id)}),m.jsxs("div",{className:"theme-pick",children:[m.jsx("label",{htmlFor:"theme-select",children:"Theme"}),m.jsx("select",{id:"theme-select","data-testid":"theme-select",value:A,onChange:K=>se(K.target.value),children:["dark","light"].map(K=>m.jsx("optgroup",{label:K==="dark"?"Dark":"Light",children:ml.filter(ye=>ye.group===K).map(ye=>m.jsx("option",{value:ye.id,children:ye.label},ye.id))},K))})]}),m.jsxs("div",{className:"rail-foot",children:[m.jsx("div",{className:"muted",role:"status",children:b||Ut}),m.jsxs("div",{className:"kbd-hint",children:[m.jsx("kbd",{children:"1"}),"–",m.jsx("kbd",{children:"5"})," tabs · ",m.jsx("kbd",{children:"Ctrl"}),"+",m.jsx("kbd",{children:"Enter"})," review"]})]})]}),m.jsxs("div",{className:"main",id:"main",children:[b?m.jsxs("div",{className:"progress",role:"status","aria-live":"polite","aria-busy":"true",children:[m.jsx("i",{}),m.jsx("span",{className:"sr-only",children:b})]}):null,m.jsxs("header",{className:"topbar","data-testid":"topbar",children:[v.length>0?m.jsxs("label",{className:"field workspace",children:[m.jsx("span",{children:"Workspace"}),m.jsxs("select",{"data-testid":"workspace-select",value:v.some(K=>K.path===i)?i:"",onChange:K=>{K.target.value&&pe(K.target.value)},children:[m.jsx("option",{value:"",children:"Indexed repos…"}),v.map(K=>m.jsxs("option",{value:K.path,children:[K.name,K.indexed?` (${K.counts.nodes})`:""]},K.path))]})]}):null,m.jsxs("label",{className:"field path",children:[m.jsx("span",{children:"Repository"}),m.jsxs("div",{className:"path-row",children:[m.jsx("input",{"data-testid":"repo-path",placeholder:"Local monorepo path",value:i,onChange:K=>{const ye=K.target.value;l(ye),ye.trim()!==Q.current&&(Q.current="",ue(null))},spellCheck:!1}),m.jsx("button",{type:"button",className:"icon-btn","data-testid":"btn-browse-repo","aria-label":"Browse for a local repository",onClick:()=>ne(!0),children:m.jsx(wp,{})})]})]}),m.jsxs("label",{className:"field ref",children:[m.jsx("span",{children:"Base"}),m.jsx(gp,{testId:"base-ref",menuTestId:"base-ref-menu",value:a,onChange:K=>je(K,d),placeholder:"base",refs:re,onNeedRefs:Ce})]}),m.jsxs("label",{className:"field ref",children:[m.jsx("span",{children:"Head"}),m.jsx(gp,{testId:"head-ref",menuTestId:"head-ref-menu",value:d,onChange:K=>je(a,K),placeholder:"head",refs:re,onNeedRefs:Ce})]}),m.jsxs("div",{className:"topbar-actions",children:[m.jsx("button",{type:"button","data-testid":"btn-init",disabled:!!b,onClick:Ze,children:"Draft config"}),m.jsx("button",{type:"button","data-testid":"btn-index",disabled:!!b,onClick:()=>rt(!0),children:"Index"}),m.jsx("button",{type:"button","data-testid":"btn-review",className:"btn primary",disabled:!!b,onClick:Xe,children:"Review"})]})]}),m.jsxs("div",{className:"alerts",children:[E?m.jsxs("div",{className:"error","data-testid":"error",role:"alert",children:[m.jsx("span",{children:E}),m.jsx("button",{type:"button",className:"dismiss",onClick:()=>N(""),"aria-label":"Dismiss error",children:"×"})]}):null,j?m.jsxs("div",{className:"banner","data-testid":"status-note",children:[m.jsx("span",{children:j}),m.jsx("button",{type:"button",className:"dismiss",onClick:()=>R(""),"aria-label":"Dismiss",children:"×"})]}):null,((Ir=p==null?void 0:p.index)!=null&&Ir.stale||g!=null&&g.stale)&&(t==="review"||t==="architecture")?m.jsx("div",{className:"banner stale","data-testid":"index-stale",children:"Index is stale — files changed since the last extract. Index again before trusting this walk."}):null,((er=p==null?void 0:p.index)==null?void 0:er.django_boot)==="failed"||(g==null?void 0:g.django_boot)==="failed"?m.jsx("div",{className:"banner warn","data-testid":"django-boot-failed",children:((tr=p==null?void 0:p.index)==null?void 0:tr.django_boot_detail)||(g==null?void 0:g.django_boot_detail)||"django.setup() failed"}):null,(br=p==null?void 0:p.workspace)!=null&&br.dirty_overlaps_review&&t==="review"?m.jsxs("div",{className:"banner warn","data-testid":"dirty-tree",children:["Uncommitted files overlap this review: ",(p.workspace.dirty_overlap||[]).slice(0,6).join(", ")]}):null]}),m.jsxs("div",{className:"stage",children:[t==="review"&&m.jsxs("div",{className:"content","data-testid":"review-layout",children:[m.jsx("aside",{className:"brief","data-testid":"brief",children:p?m.jsx(lE,{review:p,findings:hn,aiNote:B,busy:!!b,onAskAi:lt,onCopy:Je,onPost:Vt}):m.jsxs("div",{className:"empty","data-testid":"review-empty",children:[m.jsx("h2",{children:"Trace the force of this diff"}),m.jsx("p",{children:"The graph is the architecture. The brief is where this change travels — not a hunk list."}),m.jsxs("ol",{children:[m.jsx("li",{children:"Point at a Django + React monorepo, or pick an indexed workspace."}),m.jsxs("li",{children:["Index it. Missing ",m.jsx("code",{children:"loadpath.yml"})," is drafted from ",m.jsx("code",{children:"manage.py"})," and"," ",m.jsx("code",{children:"src/features"}),"."]}),m.jsx("li",{children:"Review a git range, or open a pull request so base/head become a three-dot merge-base."})]})]})}),m.jsx("div",{className:"graph-wrap","data-testid":"review-graph",children:p?m.jsx($u,{nodes:p.nodes,edges:p.edges}):null})]}),t==="architecture"&&m.jsxs("div",{className:"content","data-testid":"architecture-panel",children:[m.jsx("aside",{className:"brief","data-testid":"architecture-brief",children:g!=null&&g.indexed?m.jsx(aE,{architecture:g,busy:!!b,onReindex:()=>rt(!1),onReview:Xe}):m.jsx("p",{className:"muted","data-testid":"architecture-empty",children:"Index this repo to build the architecture graph. Review then walks that same graph for a git range — it does not start from a hunk list."})}),m.jsx("div",{className:"graph-wrap","data-testid":"architecture-graph",children:g!=null&&g.indexed?m.jsx($u,{nodes:g.nodes,edges:g.edges}):null})]}),t==="graph"&&m.jsxs("div",{className:"graph-wrap","data-testid":"graph-full",style:{height:"100%"},children:[m.jsxs("div",{className:"graph-modes",children:[m.jsxs("div",{className:"seg","aria-label":"Graph scope",children:[m.jsx("button",{type:"button","aria-pressed":S==="review","data-testid":"graph-mode-review",className:S==="review"?"active":"",onClick:()=>C("review"),children:"This review"}),m.jsx("button",{type:"button","aria-pressed":S==="architecture","data-testid":"graph-mode-architecture",className:S==="architecture"?"active":"",onClick:()=>C("architecture"),children:"Indexed architecture"})]}),m.jsxs("div",{className:"legend","aria-hidden":"true",children:[m.jsxs("span",{children:[m.jsx("i",{})," cheap"]}),m.jsxs("span",{children:[m.jsx("i",{className:"exp"})," expensive"]}),m.jsxs("span",{children:[m.jsx("i",{className:"crit"})," critical"]}),m.jsxs("span",{children:[m.jsx("i",{className:"dash"})," inferred"]})]})]}),pt.length?m.jsx($u,{nodes:pt,edges:Cn}):m.jsx("p",{className:"empty","data-testid":"graph-empty",children:"Index the repo or run a review first. Click a node to inspect it."})]}),t==="prs"&&m.jsxs("div",{className:"pr-list","data-testid":"pr-list",children:[m.jsxs("div",{className:"pr-toolbar",children:[m.jsxs("label",{className:"field provider",children:[m.jsx("span",{children:"Provider"}),m.jsxs("select",{"data-testid":"pr-provider",value:te,onChange:K=>Me(K.target.value,ee,M),children:[m.jsx("option",{value:"github",children:"GitHub"}),m.jsx("option",{value:"bitbucket",children:"Bitbucket"})]})]}),m.jsxs("label",{className:"field",children:[m.jsx("span",{children:"Repository"}),m.jsx("input",{"data-testid":"pr-repo",placeholder:"owner/repo",value:ee,onChange:K=>Me(te,K.target.value,M),spellCheck:!1})]}),m.jsx("button",{type:"button","data-testid":"btn-list-prs",className:"btn",disabled:!!b,onClick:zt,children:"List PRs"})]}),X.length===0?m.jsxs("div",{className:"empty","data-testid":"pr-empty",children:[m.jsx("h2",{children:"No pull requests loaded"}),m.jsx("p",{children:"Enter an owner/repo, then list open PRs. Reviewing a PR fills base and head from its SHAs."})]}):X.map(K=>m.jsxs("article",{className:"pr","data-testid":`pr-${K.number}`,children:[m.jsxs("h3",{children:["#",K.number," ",K.title]}),m.jsxs("div",{className:"pr-meta muted",children:[m.jsx("span",{className:`chip ${K.draft?"":"open"}`,children:K.draft?"draft":K.state}),m.jsx("span",{children:K.author}),m.jsxs("span",{children:[K.source_branch," → ",K.target_branch]})]}),m.jsxs("div",{className:"pr-actions",children:[m.jsxs("a",{href:K.url,target:"_blank",rel:"noreferrer",children:["Open on ",K.provider]}),m.jsx("button",{type:"button",className:"btn primary","data-testid":`pr-review-${K.number}`,onClick:()=>{je(K.base_sha||K.target_branch,K.head_sha||K.source_branch),Me(K.provider,K.repo,String(K.number)),r("review")},children:"Review this range"})]})]},`${K.provider}-${K.number}`))]}),t==="settings"&&F&&m.jsxs("form",{className:"settings","data-testid":"settings-form",onSubmit:At,children:[m.jsxs("div",{children:[m.jsx("h1",{children:"Settings"}),m.jsx("p",{className:"muted",children:"Tokens stay on this machine in ~/.loadpath/settings.json. AI runs only on residual uncertainty the graph could not close."})]}),m.jsxs("section",{className:"settings-card",children:[m.jsx("h2",{children:"Appearance"}),m.jsx("p",{className:"muted",children:"Local to this browser. High contrast is a first-class theme, not an afterthought."}),m.jsx("div",{className:"theme-grid","data-testid":"theme-grid",children:ml.map(K=>m.jsxs("button",{type:"button","data-theme":K.id,className:A===K.id?"theme-swatch active":"theme-swatch","data-testid":`theme-${K.id}`,onClick:()=>se(K.id),children:[m.jsx("div",{className:"swatch-bar","aria-hidden":"true"}),m.jsx("div",{className:"name",children:K.label}),m.jsx("div",{className:"group",children:K.group})]},K.id))})]}),m.jsxs("section",{className:"settings-card",children:[m.jsx("h2",{children:"Source control"}),m.jsx("label",{htmlFor:"github_token",children:"GitHub token"}),m.jsx("input",{id:"github_token",name:"github_token",type:"password",placeholder:"ghp_…",autoComplete:"off"}),m.jsx("label",{htmlFor:"bitbucket_token",children:"Bitbucket token"}),m.jsx("input",{id:"bitbucket_token",name:"bitbucket_token",type:"password",autoComplete:"off"}),m.jsx("label",{htmlFor:"bitbucket_username",children:"Bitbucket username (app passwords)"}),m.jsx("input",{id:"bitbucket_username",name:"bitbucket_username",defaultValue:String(D.bitbucket_username||"")})]}),m.jsxs("section",{className:"settings-card",children:[m.jsx("h2",{children:"Residual AI"}),m.jsx("label",{htmlFor:"ai_provider",children:"Provider"}),m.jsxs("select",{id:"ai_provider",name:"ai_provider",defaultValue:String(((jn=D.ai)==null?void 0:jn.provider)||"none"),children:[m.jsx("option",{value:"none",children:"none (graph only)"}),m.jsx("option",{value:"anthropic",children:"Anthropic"}),m.jsx("option",{value:"openai",children:"OpenAI"}),m.jsx("option",{value:"grok",children:"Grok / xAI"}),m.jsx("option",{value:"deepseek",children:"DeepSeek"}),m.jsx("option",{value:"cursor",children:"Cursor-compatible (OpenAI protocol)"}),m.jsx("option",{value:"ollama",children:"Ollama local"})]}),m.jsx("label",{htmlFor:"ai_api_key",children:"API key"}),m.jsx("input",{id:"ai_api_key",name:"ai_api_key",type:"password",autoComplete:"off"}),m.jsx("label",{htmlFor:"ai_model",children:"Model"}),m.jsx("input",{id:"ai_model",name:"ai_model","data-testid":"ai-model",placeholder:"optional override",defaultValue:String(((Mn=D.ai)==null?void 0:Mn.model)||"")}),m.jsx("label",{htmlFor:"ai_base_url",children:"Base URL"}),m.jsx("input",{id:"ai_base_url",name:"ai_base_url","data-testid":"ai-base-url",placeholder:"optional, OpenAI-compatible",defaultValue:String(((Pn=D.ai)==null?void 0:Pn.base_url)||"")}),m.jsx("button",{className:"btn primary",type:"submit","data-testid":"btn-save-settings",children:"Save"})]})]})]})]}),T?m.jsx(nE,{initialPath:i,onClose:()=>ne(!1),onSelect:K=>{pe(K),ne(!1)}}):null]})}function lE({review:t,findings:r,aiNote:i,busy:l,onAskAi:a,onCopy:u,onPost:d}){var p,y,g,x,v,_,S,C;const f=[...new Set(t.confidence.reasons||[])];return m.jsxs(m.Fragment,{children:[m.jsxs("div",{className:`merge-box ${t.confidence.level}`,children:[m.jsxs("div",{className:`level ${t.confidence.level}`,children:[t.confidence.level.toUpperCase()," — ",t.title]}),f.length?m.jsx("ul",{className:"reasons",children:f.map(E=>m.jsx("li",{children:E},E))}):null,t.low_risk?m.jsx("span",{className:"chip",children:"low-risk"}):null,t.change_kinds.map(E=>m.jsx("span",{className:"chip",children:di(E)},E))]}),m.jsxs("div",{className:"metrics",children:[m.jsxs("div",{className:"metric",children:[m.jsxs("div",{className:"n",children:[t.confidence.covered_sinks,"/",t.confidence.sinks]}),m.jsx("div",{className:"l",children:"Sinks tested"})]}),m.jsxs("div",{className:"metric",children:[m.jsx("div",{className:"n",children:r.length}),m.jsx("div",{className:"l",children:"Findings"})]}),m.jsxs("div",{className:"metric",children:[m.jsx("div",{className:"n",children:t.residuals.length}),m.jsx("div",{className:"l",children:"Residuals"})]})]}),m.jsx("pre",{className:"headline",children:t.headline}),t.index?m.jsxs("details",{className:"section",open:!0,children:[m.jsxs("summary",{children:["Index ",m.jsx("span",{className:"count",children:t.index.counts.nodes})]}),m.jsxs("div",{className:"muted",children:["Walked ",t.index.counts.nodes," nodes / ",t.index.counts.edges," edges",t.index.reindex_skipped?" from an unchanged index":t.index.reindexed?" after an incremental refresh":" from the existing index",t.index.django_boot&&t.index.django_boot!=="off"?` · Django boot ${t.index.django_boot}`:"",(p=t.workspace)!=null&&p.three_dot?" · three-dot range":""]})]}):null,m.jsxs("details",{className:"section",open:!0,children:[m.jsxs("summary",{children:["Read this ",m.jsx("span",{className:"count",children:t.read_order.length})]}),t.read_order.map((E,N)=>m.jsxs("div",{className:"read-item",children:[m.jsxs("span",{className:"file",children:[N+1,". ",E.path]}),m.jsx("div",{className:"why",children:E.why})]},E.path))]}),m.jsxs("details",{className:"section",children:[m.jsxs("summary",{children:["Clusters ",m.jsx("span",{className:"count",children:t.clusters.length})]}),t.clusters.map(E=>m.jsxs("div",{className:"muted",children:[m.jsx("strong",{children:E.title})," — ",E.files.join(", ")]},E.id))]}),m.jsxs("details",{className:"section",open:!0,children:[m.jsxs("summary",{children:["Architecture ",m.jsx("span",{className:"count",children:r.length})]}),r.length===0?m.jsx("div",{className:"muted",children:t.architecture_note}):r.map(E=>m.jsxs("div",{className:"finding",children:[m.jsx("span",{className:`chip ${E.severity}`,children:E.severity}),E.message]},E.rule+E.message))]}),m.jsx(mg,{cards:t.deepening}),m.jsxs("details",{className:"section",open:!0,children:[m.jsxs("summary",{children:["Residual ",m.jsx("span",{className:"count",children:t.residuals.length})]}),m.jsx("p",{className:"muted",children:"AI is only used here, on what the graph could not close."}),t.residuals.map(E=>m.jsx("div",{className:"residual muted",children:E},E))]}),(g=(y=t.evolution)==null?void 0:y.notes)!=null&&g.length||(v=(x=t.evolution)==null?void 0:x.hotspots)!=null&&v.some(E=>E.commits)?m.jsxs("details",{className:"section",children:[m.jsx("summary",{children:"Churn & coupling"}),(((_=t.evolution)==null?void 0:_.notes)||[]).map(E=>m.jsx("div",{className:"muted",children:E},E)),(((S=t.evolution)==null?void 0:S.hotspots)||[]).filter(E=>E.commits).slice(0,6).map(E=>m.jsxs("div",{className:"muted",children:[m.jsx("span",{className:"file",children:E.path})," — ",E.commits," commits, bus factor ",E.bus_factor]},E.path))]}):null,m.jsxs("div",{className:"btn-row",children:[m.jsx("button",{type:"button",className:"btn",disabled:l,onClick:a,children:"Ask configured model"}),m.jsx("button",{type:"button",className:"btn","data-testid":"btn-copy-markdown",onClick:u,children:"Copy markdown"}),m.jsx("button",{type:"button",className:"btn","data-testid":"btn-post-comment",onClick:d,children:"Post to PR"})]}),i?m.jsx("pre",{className:"headline",children:i}):null,m.jsx("div",{className:"kicker",children:"Reviewers"}),m.jsx("div",{className:"muted",children:t.suggested_reviewers.join(", ")||"—"}),(C=t.knowledge_owners)!=null&&C.length?m.jsxs("div",{className:"muted",children:["Knowledge: ",t.knowledge_owners.join(", ")]}):null]})}function aE({architecture:t,busy:r,onReindex:i,onReview:l}){const a=t.findings.filter(u=>!u.waived);return m.jsxs(m.Fragment,{children:[m.jsxs("div",{className:"merge-box high",children:[m.jsxs("div",{className:"level high",children:["INDEXED — ",t.counts.nodes," nodes"]}),m.jsxs("div",{className:"muted",style:{marginTop:8},children:[t.indexed_at?`Last index ${sy(t.indexed_at)}`:"Indexed",t.incremental?" · incremental":" · full",t.stale?" · stale":"",t.django_boot&&t.django_boot!=="off"?` · Django boot ${t.django_boot}`:""]}),m.jsxs("span",{className:"chip",children:[t.counts.edges," edges"]}),t.has_config?m.jsx("span",{className:"chip",children:"loadpath.yml"}):null]}),m.jsxs("details",{className:"section",open:!0,children:[m.jsx("summary",{children:"Bounded contexts"}),Object.values(t.contexts).map(u=>m.jsxs("div",{className:"muted",children:[m.jsx("strong",{children:u.name})," — ",(u.django_apps||[]).join(", ")||"no apps"," ·"," ",(u.owners||[]).join(", ")||"unowned"]},u.name))]}),m.jsxs("details",{className:"section",children:[m.jsxs("summary",{children:["Rules ",m.jsx("span",{className:"count",children:(t.rules||[]).length})]}),(t.rules||[]).map(u=>m.jsx("div",{className:"muted",children:u},u))]}),m.jsxs("details",{className:"section",open:!0,children:[m.jsxs("summary",{children:["Findings ",m.jsx("span",{className:"count",children:a.length})]}),a.length===0?m.jsx("div",{className:"muted",children:"No architecture rule hits on the full graph."}):a.map(u=>m.jsxs("div",{className:"finding",children:[m.jsx("span",{className:`chip ${u.severity}`,children:u.severity}),u.message]},u.rule+u.message))]}),m.jsx(mg,{cards:t.deepening}),m.jsxs("details",{className:"section",open:!0,children:[m.jsx("summary",{children:"Types"}),m.jsx("table",{className:"type-table",children:m.jsx("tbody",{children:Object.entries(t.type_counts||{}).sort((u,d)=>d[1]-u[1]).slice(0,12).map(([u,d])=>m.jsxs("tr",{children:[m.jsx("td",{children:gl(u)}),m.jsx("td",{children:d})]},u))})})]}),m.jsxs("div",{className:"btn-row",children:[m.jsx("button",{type:"button",className:"btn",disabled:r,onClick:i,"data-testid":"btn-full-reindex",children:"Full reindex"}),m.jsx("button",{type:"button",className:"btn primary",disabled:r,onClick:l,children:"Review against this index"})]})]})}function mg({cards:t}){const r=t||[];return r.length?m.jsxs("details",{className:"section",open:!0,"data-testid":"deepening-list",children:[m.jsxs("summary",{children:["Depth ",m.jsx("span",{className:"count",children:r.length})]}),m.jsx("p",{className:"muted",children:"Deepening opportunities: more behaviour behind a smaller interface, at a real seam."}),r.map(i=>m.jsxs("div",{className:"finding","data-testid":"deepening-card",children:[m.jsx("span",{className:`chip ${i.strength}`,children:iy(i.strength)}),i.top?m.jsx("span",{className:"chip",children:"top"}):null,m.jsx("strong",{children:i.title}),m.jsx("div",{className:"why",children:i.message}),i.deletion_test?m.jsxs("div",{className:"muted",children:["Deletion test: ",i.deletion_test]}):null,i.before&&i.after?m.jsxs("div",{className:"muted",children:[i.before," → ",i.after]}):null]},i.rule+i.title))]}):null}pg(hg());ny.createRoot(document.getElementById("root")).render(m.jsx(O.StrictMode,{children:m.jsx(sE,{})}));export{Ik as L,dE as a,uE as c,m as j,cE as l,O as r,gl as t}; diff --git a/src/loadpath/static/index.html b/src/loadpath/static/index.html index 31e0d16..ea5fecf 100644 --- a/src/loadpath/static/index.html +++ b/src/loadpath/static/index.html @@ -17,8 +17,8 @@ - - + +
diff --git a/tests/e2e/test_ui_flows.py b/tests/e2e/test_ui_flows.py index 98ff0ad..b78fa60 100644 --- a/tests/e2e/test_ui_flows.py +++ b/tests/e2e/test_ui_flows.py @@ -276,3 +276,59 @@ def test_ui_browse_repo_and_pick_git_refs(live_app, browser_page): heads.wait_for() heads.get_by_test_id("ref-option-branch").filter(has_text="main").click() assert page.get_by_test_id("head-ref").input_value() == "main" + + +@pytest.mark.playwright +def test_ui_oauth_login_and_remote_repo_list(live_app, browser_page): + base_url, _repo = live_app + page = browser_page + page.request.put( + f"{base_url}/api/settings", + headers={"Content-Type": "application/json"}, + data='{"github_oauth_client_id":"Ov23ui","github_token":"ghp_ui_token"}', + ) + page.route( + "**/api/scm/repos**", + lambda route: route.fulfill( + status=200, + content_type="application/json", + body=( + '{"provider":"github","user":{"login":"ada","name":"Ada","url":"https://github.com/ada"},' + '"repos":[{"provider":"github","slug":"acme/demo","name":"demo","owner":"acme",' + '"url":"https://github.com/acme/demo","private":true,"default_branch":"main",' + '"updated_at":"","description":"","local_path":null},' + '{"provider":"github","slug":"acme/ledger","name":"ledger","owner":"acme",' + '"url":"https://github.com/acme/ledger","private":false,"default_branch":"main",' + '"updated_at":"","description":"","local_path":null}]}' + ), + ), + ) + page.route( + "**/api/oauth/github/start", + lambda route: route.fulfill( + status=200, + content_type="application/json", + body=( + '{"flow_id":"flow1","user_code":"WXYZ-9876",' + '"verification_uri":"https://github.com/login/device",' + '"verification_uri_complete":"https://github.com/login/device?user_code=WXYZ-9876",' + '"interval":5,"expires_in":900}' + ), + ), + ) + page.add_init_script("window.open = () => null;") + page.goto(base_url, wait_until="networkidle") + + page.get_by_test_id("tab-prs").click() + page.get_by_test_id("scm-repo-count").wait_for(timeout=10_000) + assert "2 github repositories" in page.get_by_test_id("scm-repo-count").inner_text() + page.get_by_test_id("pr-repo").fill("acme/demo") + + page.get_by_test_id("tab-settings").click() + page.get_by_test_id("settings-form").wait_for() + assert "ada" in page.get_by_test_id("scm-github").inner_text().lower() or "token saved" in page.get_by_test_id("scm-github").inner_text().lower() + page.get_by_test_id("btn-github-disconnect").click() + page.get_by_test_id("btn-github-login").wait_for() + page.get_by_test_id("btn-github-login").click() + page.get_by_test_id("github-user-code").wait_for() + assert "WXYZ-9876" in page.get_by_test_id("github-user-code").inner_text() diff --git a/tests/unit/test_providers_and_api.py b/tests/unit/test_providers_and_api.py index b11200c..4900c8a 100644 --- a/tests/unit/test_providers_and_api.py +++ b/tests/unit/test_providers_and_api.py @@ -105,3 +105,116 @@ def test_github_rejects_unsafe_repo_slug(): gh = GitHubProvider("tok") with pytest.raises(ValueError): gh.list_pull_requests("../etc/passwd") + + +def test_parse_remote_url_github_and_bitbucket(): + from loadpath.providers.scm import parse_remote_url + + assert parse_remote_url("git@github.com:Acme/Demo.git") == ("github", "Acme/Demo") + assert parse_remote_url("https://github.com/Acme/Demo") == ("github", "Acme/Demo") + assert parse_remote_url("https://x-access-token:tok@github.com/acme/demo.git") == ("github", "acme/demo") + assert parse_remote_url("https://bitbucket.org/acme/demo.git") == ("bitbucket", "acme/demo") + assert parse_remote_url("git@bitbucket.org:acme/demo.git") == ("bitbucket", "acme/demo") + assert parse_remote_url("https://gitlab.com/acme/demo.git") is None + + +def test_github_lists_repositories_across_pages(): + import httpx + + def handler(request: httpx.Request) -> httpx.Response: + if request.url.path == "/user": + return httpx.Response(200, json={"login": "ada", "html_url": "https://github.com/ada"}) + page = int(request.url.params.get("page") or "1") + if page == 1: + return httpx.Response( + 200, + json=[ + { + "full_name": "acme/demo", + "html_url": "https://github.com/acme/demo", + "private": True, + "default_branch": "main", + "updated_at": "2026-08-14T00:00:00Z", + "description": "billing", + } + ] + + [ + { + "full_name": f"acme/r{i}", + "html_url": f"https://github.com/acme/r{i}", + "private": False, + "default_branch": "main", + "updated_at": "2026-08-14T00:00:00Z", + "description": "", + } + for i in range(99) + ], + ) + return httpx.Response( + 200, + json=[ + { + "full_name": "acme/extra", + "html_url": "https://github.com/acme/extra", + "private": False, + "default_branch": "main", + "updated_at": "2026-08-14T00:00:00Z", + "description": "", + } + ], + ) + + client = httpx.Client(transport=httpx.MockTransport(handler)) + gh = GitHubProvider("tok", client=client) + assert gh.current_user()["login"] == "ada" + repos = gh.list_repositories(limit=120) + slugs = {r.slug for r in repos} + assert "acme/demo" in slugs + assert "acme/extra" in slugs + assert len(repos) == 101 + + +def test_bitbucket_lists_repositories_via_next(): + import httpx + + def handler(request: httpx.Request) -> httpx.Response: + if request.url.path == "/2.0/user": + return httpx.Response(200, json={"username": "bob", "display_name": "Bob"}) + if "after=" in str(request.url): + return httpx.Response( + 200, + json={ + "values": [ + { + "full_name": "acme/ledger", + "links": {"html": {"href": "https://bitbucket.org/acme/ledger"}}, + "is_private": True, + "mainbranch": {"name": "main"}, + "updated_on": "2026-08-14T00:00:00Z", + "description": "", + } + ] + }, + ) + return httpx.Response( + 200, + json={ + "values": [ + { + "full_name": "acme/demo", + "links": {"html": {"href": "https://bitbucket.org/acme/demo"}}, + "is_private": False, + "mainbranch": {"name": "main"}, + "updated_on": "2026-08-14T00:00:00Z", + "description": "app", + } + ], + "next": "https://api.bitbucket.org/2.0/repositories?role=member&pagelen=50&after=token", + }, + ) + + client = httpx.Client(transport=httpx.MockTransport(handler)) + bb = BitbucketProvider("tok", client=client) + assert bb.current_user()["login"] == "bob" + repos = bb.list_repositories() + assert [r.slug for r in repos] == ["acme/demo", "acme/ledger"] diff --git a/tests/unit/test_scm_oauth.py b/tests/unit/test_scm_oauth.py new file mode 100644 index 0000000..d73b6b1 --- /dev/null +++ b/tests/unit/test_scm_oauth.py @@ -0,0 +1,286 @@ +from __future__ import annotations + +import httpx +import respx +from fastapi.testclient import TestClient + +from loadpath.providers.oauth import GITHUB_DEVICE_CODE_URL, GITHUB_TOKEN_URL +from loadpath.providers.scm import attach_local_paths, parse_remote_url +from loadpath.server.app import create_app +from loadpath.settings import AppSettings + + +def _client(tmp_path, monkeypatch) -> TestClient: + monkeypatch.setenv("HOME", str(tmp_path / "home")) + (tmp_path / "home").mkdir(parents=True, exist_ok=True) + monkeypatch.delenv("LOADPATH_GITHUB_CLIENT_ID", raising=False) + monkeypatch.delenv("LOADPATH_BITBUCKET_CLIENT_ID", raising=False) + monkeypatch.delenv("LOADPATH_BITBUCKET_CLIENT_SECRET", raising=False) + return TestClient(create_app()) + + +def test_attach_local_paths_from_git_remote(tmp_path): + repo = tmp_path / "demo" + repo.mkdir() + import subprocess + + subprocess.check_call(["git", "init"], cwd=repo, stdout=subprocess.DEVNULL) + subprocess.check_call( + ["git", "-C", str(repo), "remote", "add", "origin", "git@github.com:acme/demo.git"], + stdout=subprocess.DEVNULL, + ) + from loadpath.providers.scm import RemoteRepo + + repos = [ + RemoteRepo(provider="github", slug="acme/demo", name="demo", owner="acme", url="https://github.com/acme/demo"), + RemoteRepo(provider="github", slug="other/app", name="app", owner="other", url="https://github.com/other/app"), + ] + attach_local_paths(repos, [str(repo)]) + assert repos[0].local_path == str(repo.resolve()) + assert repos[1].local_path is None + assert parse_remote_url("git@github.com:acme/demo.git") == ("github", "acme/demo") + + +def test_oauth_status_and_client_id_settings(tmp_path, monkeypatch): + client = _client(tmp_path, monkeypatch) + status = client.get("/api/oauth/status").json() + assert status["github"]["oauth_ready"] is False + assert status["github"]["connected"] is False + saved = client.put( + "/api/settings", + json={ + "github_oauth_client_id": "Ov23test", + "bitbucket_oauth_client_id": "bbkey", + "bitbucket_oauth_client_secret": "bbsecret", + }, + ) + body = saved.json() + assert body["github_oauth_ready"] is True + assert body["bitbucket_oauth_ready"] is True + assert "bbsecret" not in body["bitbucket_oauth_client_secret"] + kept = client.put("/api/settings", json={"bitbucket_oauth_client_secret": ""}) + assert kept.json()["bitbucket_oauth_ready"] is True + + +@respx.mock +def test_github_device_flow_saves_token_and_lists_repos(tmp_path, monkeypatch): + client = _client(tmp_path, monkeypatch) + client.put("/api/settings", json={"github_oauth_client_id": "Ov23test"}) + respx.post(GITHUB_DEVICE_CODE_URL).mock( + return_value=httpx.Response( + 200, + json={ + "device_code": "dev-1", + "user_code": "ABCD-1234", + "verification_uri": "https://github.com/login/device", + "verification_uri_complete": "https://github.com/login/device?user_code=ABCD-1234", + "expires_in": 900, + "interval": 5, + }, + ) + ) + started = client.post("/api/oauth/github/start") + assert started.status_code == 200, started.text + flow = started.json() + assert flow["user_code"] == "ABCD-1234" + assert flow["flow_id"] + + token_replies = iter( + [ + httpx.Response(200, json={"error": "authorization_pending"}), + httpx.Response(200, json={"access_token": "gho_oauth_token", "token_type": "bearer"}), + ] + ) + respx.post(GITHUB_TOKEN_URL).mock(side_effect=lambda _request: next(token_replies)) + pending = client.post("/api/oauth/github/poll", json={"flow_id": flow["flow_id"]}) + assert pending.json()["status"] == "pending" + respx.get("https://api.github.com/user").mock( + return_value=httpx.Response(200, json={"login": "ada", "html_url": "https://github.com/ada"}) + ) + done = client.post("/api/oauth/github/poll", json={"flow_id": flow["flow_id"]}) + assert done.status_code == 200, done.text + assert done.json()["status"] == "complete" + assert done.json()["user"] == "ada" + settings = AppSettings.load() + assert settings.github_token == "gho_oauth_token" + assert settings.github_user == "ada" + + respx.get("https://api.github.com/user/repos").mock( + return_value=httpx.Response( + 200, + json=[ + { + "full_name": "acme/demo", + "html_url": "https://github.com/acme/demo", + "private": True, + "default_branch": "main", + "updated_at": "2026-08-14T00:00:00Z", + "description": "", + } + ], + ) + ) + listed = client.get("/api/scm/repos", params={"provider": "github"}) + assert listed.status_code == 200, listed.text + assert listed.json()["repos"][0]["slug"] == "acme/demo" + assert listed.json()["user"]["login"] == "ada" + + disconnected = client.post("/api/oauth/disconnect", json={"provider": "github"}) + assert disconnected.json()["github_token_set"] is False + + +@respx.mock +def test_bitbucket_oauth_callback_lists_all_repos(tmp_path, monkeypatch): + client = _client(tmp_path, monkeypatch) + client.put( + "/api/settings", + json={"bitbucket_oauth_client_id": "bbkey", "bitbucket_oauth_client_secret": "bbsecret"}, + ) + started = client.get("/api/oauth/bitbucket/start") + assert started.status_code == 200, started.text + flow = started.json() + assert "client_id=bbkey" in flow["authorize_url"] + assert flow["flow_id"] + + respx.post("https://bitbucket.org/site/oauth2/access_token").mock( + return_value=httpx.Response( + 200, + json={"access_token": "bb_oauth", "refresh_token": "bb_refresh", "token_type": "bearer"}, + ) + ) + respx.get("https://api.bitbucket.org/2.0/user").mock( + return_value=httpx.Response(200, json={"username": "bob", "display_name": "Bob"}) + ) + callback = client.get( + "/api/oauth/bitbucket/callback", + params={"code": "auth-code", "state": flow["flow_id"]}, + ) + assert callback.status_code == 200, callback.text + assert "Connected to Bitbucket" in callback.text + settings = AppSettings.load() + assert settings.bitbucket_token == "bb_oauth" + assert settings.bitbucket_refresh_token == "bb_refresh" + assert settings.bitbucket_user == "bob" + assert settings.bitbucket_username == "" + + respx.get("https://api.bitbucket.org/2.0/repositories").mock( + return_value=httpx.Response( + 200, + json={ + "values": [ + { + "full_name": "acme/demo", + "links": {"html": {"href": "https://bitbucket.org/acme/demo"}}, + "is_private": True, + "mainbranch": {"name": "main"}, + "updated_on": "2026-08-14T00:00:00Z", + } + ] + }, + ) + ) + listed = client.get("/api/scm/repos", params={"provider": "bitbucket"}) + assert listed.status_code == 200, listed.text + assert listed.json()["repos"][0]["slug"] == "acme/demo" + + +@respx.mock +def test_bitbucket_refreshes_expired_oauth_token(tmp_path, monkeypatch): + client = _client(tmp_path, monkeypatch) + seeded = AppSettings( + bitbucket_token="expired", + bitbucket_refresh_token="bb_refresh", + bitbucket_oauth_client_id="bbkey", + bitbucket_oauth_client_secret="bbsecret", + ) + seeded.save() + calls = {"repos": 0} + + def repos_handler(request: httpx.Request) -> httpx.Response: + calls["repos"] += 1 + auth = request.headers.get("authorization") or "" + if auth.endswith("fresh_token"): + return httpx.Response( + 200, + json={ + "values": [ + { + "full_name": "acme/demo", + "links": {"html": {"href": "https://bitbucket.org/acme/demo"}}, + "is_private": False, + "mainbranch": {"name": "main"}, + "updated_on": "2026-08-14T00:00:00Z", + } + ] + }, + ) + return httpx.Response(401, json={"error": "unauthorized"}) + + respx.get("https://api.bitbucket.org/2.0/repositories").mock(side_effect=repos_handler) + respx.get("https://api.bitbucket.org/2.0/user").mock( + return_value=httpx.Response(200, json={"username": "bob", "display_name": "Bob"}) + ) + respx.post("https://bitbucket.org/site/oauth2/access_token").mock( + return_value=httpx.Response(200, json={"access_token": "fresh_token", "refresh_token": "bb_refresh2"}) + ) + listed = client.get("/api/scm/repos", params={"provider": "bitbucket"}) + assert listed.status_code == 200, listed.text + assert listed.json()["repos"][0]["slug"] == "acme/demo" + assert AppSettings.load().bitbucket_token == "fresh_token" + + +def test_github_oauth_start_requires_client_id(tmp_path, monkeypatch): + client = _client(tmp_path, monkeypatch) + res = client.post("/api/oauth/github/start") + assert res.status_code == 400 + assert "client ID" in res.json()["detail"] + + +def test_scm_routes_reject_cross_origin(tmp_path, monkeypatch): + client = _client(tmp_path, monkeypatch) + headers = {"Origin": "https://evil.example"} + assert client.get("/api/scm/repos", params={"provider": "github"}, headers=headers).status_code == 403 + assert client.get("/api/oauth/status", headers=headers).status_code == 403 + assert client.post("/api/oauth/github/start", headers=headers).status_code == 403 + assert client.post("/api/oauth/disconnect", json={"provider": "github"}, headers=headers).status_code == 403 + + +def test_loopback_request_helper(): + from loadpath.providers.oauth import is_loopback_request + + assert is_loopback_request("127.0.0.1:7345", "") + assert is_loopback_request("testserver", "") + assert is_loopback_request("example.com", "http://127.0.0.1:7345") + assert not is_loopback_request("example.com", "https://evil.example") + assert not is_loopback_request("tunnel.example", "") + + +def test_github_device_rejects_unexpected_verification_url(): + import pytest + + from loadpath.providers.oauth import github_device_urls + + with pytest.raises(ValueError, match="unexpected verification URL"): + github_device_urls({"verification_uri": "https://evil.example/phish"}, "ABCD-1234") + with pytest.raises(ValueError, match="unexpected verification URL"): + github_device_urls({"verification_uri": "https://github.com.evil.example/login/device"}, "ABCD-1234") + url, complete = github_device_urls( + { + "verification_uri": "https://github.com/login/device", + "verification_uri_complete": "https://evil.example/?user_code=ABCD-1234", + }, + "ABCD-1234", + ) + assert url == "https://github.com/login/device" + assert complete == "https://github.com/login/device?user_code=ABCD-1234" + + +def test_disconnect_keeps_bitbucket_username(tmp_path, monkeypatch): + client = _client(tmp_path, monkeypatch) + AppSettings(bitbucket_token="tok", bitbucket_username="bob", bitbucket_user="bob").save() + gone = client.post("/api/oauth/disconnect", json={"provider": "bitbucket"}) + assert gone.status_code == 200, gone.text + settings = AppSettings.load() + assert settings.bitbucket_token == "" + assert settings.bitbucket_user == "" + assert settings.bitbucket_username == "bob" diff --git a/ui/src/App.tsx b/ui/src/App.tsx index 485e2dd..c087e15 100644 --- a/ui/src/App.tsx +++ b/ui/src/App.tsx @@ -6,7 +6,7 @@ import { ImpactGraph } from "./ImpactGraph"; import { RefCombobox } from "./RefCombobox"; import { RepoExplorer } from "./RepoExplorer"; import { THEMES, applyTheme, readTheme, type ThemeId } from "./themes"; -import type { ArchitectureReport, DeepeningCandidate, GitRefs, IndexedRepo, PullRequest, Review } from "./types"; +import type { ArchitectureReport, DeepeningCandidate, GitRefs, IndexedRepo, PullRequest, RemoteRepo, Review } from "./types"; type Tab = "review" | "architecture" | "graph" | "prs" | "settings"; type GraphMode = "review" | "architecture"; @@ -19,6 +19,20 @@ const TABS: { id: Tab; label: string; testId: string; shortcut: string; icon: ty { id: "settings", label: "Settings", testId: "tab-settings", shortcut: "5", icon: IconSettings }, ]; +function openOAuthUrl(url: string, host: string, pathPrefix: string) { + let parsed: URL; + try { + parsed = new URL(url); + } catch { + return; + } + if (parsed.protocol !== "https:" || parsed.username || parsed.password) return; + const hostname = parsed.hostname.toLowerCase(); + if (hostname !== host && !hostname.endsWith(`.${host}`)) return; + if (!parsed.pathname.startsWith(pathPrefix)) return; + window.open(parsed.toString(), "_blank", "noopener,noreferrer"); +} + export function App() { const [tab, setTab] = useState("review"); const [repo, setRepo] = useState(localStorage.getItem("loadpath.repo") || ""); @@ -33,6 +47,7 @@ export function App() { const [copied, setCopied] = useState(""); const [settings, setSettings] = useState>({}); const [prs, setPrs] = useState([]); + const [remoteRepos, setRemoteRepos] = useState([]); const [scmRepo, setScmRepo] = useState(localStorage.getItem("loadpath.scmRepo") || ""); const [provider, setProvider] = useState(localStorage.getItem("loadpath.provider") || "github"); const [prNumber, setPrNumber] = useState(localStorage.getItem("loadpath.prNumber") || ""); @@ -41,6 +56,13 @@ export function App() { const [settingsReady, setSettingsReady] = useState(false); const [explorerOpen, setExplorerOpen] = useState(false); const [gitRefs, setGitRefs] = useState(null); + const [githubFlow, setGithubFlow] = useState<{ + flow_id: string; + user_code: string; + verification_uri_complete: string; + interval: number; + } | null>(null); + const [bitbucketWaiting, setBitbucketWaiting] = useState(false); const repoRef = useRef(repo); repoRef.current = repo; const explorerOpenRef = useRef(false); @@ -134,6 +156,108 @@ export function App() { } }; + const tokenSetFor = (name: string) => + name === "github" ? Boolean(settings.github_token_set) : Boolean(settings.bitbucket_token_set); + + const loadRemoteRepos = useCallback(async (name = provider) => { + try { + const listed = await api.scmRepos(name); + setRemoteRepos(listed.repos); + if (listed.user?.login) { + setSettings((current) => ({ + ...current, + ...(name === "github" ? { github_user: listed.user.login } : { bitbucket_user: listed.user.login }), + })); + } + } catch { + setRemoteRepos([]); + } + }, [provider]); + + useEffect(() => { + if (tab !== "prs") return; + let cancelled = false; + loadRemoteRepos(provider).catch(() => { + if (!cancelled) setRemoteRepos([]); + }); + return () => { + cancelled = true; + }; + }, [tab, provider, loadRemoteRepos]); + + useEffect(() => { + if (!githubFlow) return; + let cancelled = false; + let timer = 0; + const tick = async () => { + try { + const result = await api.githubOAuthPoll(githubFlow.flow_id); + if (cancelled) return; + if (result.status === "complete") { + setGithubFlow(null); + const next = await api.settings(); + setSettings(next); + setCopied(result.user ? `Signed in to GitHub as ${result.user}` : "Signed in to GitHub"); + void loadRemoteRepos("github"); + return; + } + if (result.status === "pending" || result.status === "slow_down") { + timer = window.setTimeout(tick, Math.max(result.interval || githubFlow.interval, 5) * 1000); + return; + } + setGithubFlow(null); + setError(result.status === "denied" ? "GitHub sign-in was denied." : "GitHub sign-in expired. Try again."); + } catch (e) { + if (cancelled) return; + setGithubFlow(null); + setError(e instanceof Error ? e.message : String(e)); + } + }; + timer = window.setTimeout(tick, Math.max(githubFlow.interval, 5) * 1000); + return () => { + cancelled = true; + window.clearTimeout(timer); + }; + }, [githubFlow, loadRemoteRepos]); + + useEffect(() => { + if (!bitbucketWaiting) return; + let cancelled = false; + let timer = 0; + const started = Date.now(); + const tick = async () => { + try { + const status = await api.oauthStatus(); + if (cancelled) return; + if (status.bitbucket.connected) { + setBitbucketWaiting(false); + const next = await api.settings(); + setSettings(next); + setCopied( + status.bitbucket.user ? `Signed in to Bitbucket as ${status.bitbucket.user}` : "Signed in to Bitbucket", + ); + void loadRemoteRepos("bitbucket"); + return; + } + if (Date.now() - started > 180_000) { + setBitbucketWaiting(false); + setError("Bitbucket sign-in timed out. Finish in the browser, or try again."); + return; + } + timer = window.setTimeout(tick, 1500); + } catch (e) { + if (cancelled) return; + setBitbucketWaiting(false); + setError(e instanceof Error ? e.message : String(e)); + } + }; + timer = window.setTimeout(tick, 1500); + return () => { + cancelled = true; + window.clearTimeout(timer); + }; + }, [bitbucketWaiting, loadRemoteRepos]); + const loadArchitecture = async (path = repo) => { if (!path.trim()) return null; const report = await api.architecture(path); @@ -237,6 +361,8 @@ export function App() { try { const r = await api.prs(provider, scmRepo); setPrs(r.pull_requests); + const match = remoteRepos.find((item) => item.slug.toLowerCase() === scmRepo.trim().toLowerCase()); + if (match?.local_path) persistRepo(match.local_path); } catch (e) { setError(e instanceof Error ? e.message : String(e)); } finally { @@ -244,13 +370,50 @@ export function App() { } }; + const startGithubLogin = async () => { + setError(""); + try { + const flow = await api.githubOAuthStart(); + setGithubFlow(flow); + openOAuthUrl(flow.verification_uri_complete, "github.com", "/login/device"); + } catch (e) { + setError(e instanceof Error ? e.message : String(e)); + } + }; + + const startBitbucketLogin = async () => { + setError(""); + try { + const flow = await api.bitbucketOAuthStart(); + setBitbucketWaiting(true); + openOAuthUrl(flow.authorize_url, "bitbucket.org", "/site/oauth2/authorize"); + } catch (e) { + setBitbucketWaiting(false); + setError(e instanceof Error ? e.message : String(e)); + } + }; + + const disconnectProvider = async (name: string) => { + setError(""); + try { + setSettings(await api.oauthDisconnect(name)); + if (provider === name) setRemoteRepos([]); + setCopied(`Disconnected ${name}`); + } catch (e) { + setError(e instanceof Error ? e.message : String(e)); + } + }; + const saveSettings = async (evt: FormEvent) => { evt.preventDefault(); const fd = new FormData(evt.currentTarget); const body = { github_token: String(fd.get("github_token") || ""), + github_oauth_client_id: String(fd.get("github_oauth_client_id") || ""), bitbucket_token: String(fd.get("bitbucket_token") || ""), bitbucket_username: String(fd.get("bitbucket_username") || ""), + bitbucket_oauth_client_id: String(fd.get("bitbucket_oauth_client_id") || ""), + bitbucket_oauth_client_secret: String(fd.get("bitbucket_oauth_client_secret") || ""), ai_provider: String(fd.get("ai_provider") || "none"), ai_api_key: String(fd.get("ai_api_key") || ""), ai_model: String(fd.get("ai_model") || ""), @@ -643,20 +806,50 @@ export function App() { Repository persistPr(provider, e.target.value, prNumber)} + list="scm-repos" spellCheck={false} /> + + {remoteRepos.map((item) => ( + + ))} + + + {remoteRepos.length > 0 ? ( +

+ {remoteRepos.length} {provider} repositor{remoteRepos.length === 1 ? "y" : "ies"} + {provider === "github" && settings.github_user ? ` · @${String(settings.github_user)}` : ""} + {provider === "bitbucket" && settings.bitbucket_user ? ` · ${String(settings.bitbucket_user)}` : ""} +

+ ) : null} {prs.length === 0 ? (

No pull requests loaded

-

Enter an owner/repo, then list open PRs. Reviewing a PR fills base and head from its SHAs.

+

+ Sign in under Settings (or paste a token), load your repositories, then list open PRs. Reviewing a + PR fills base and head from its SHAs. +

) : ( prs.map((p) => ( @@ -682,6 +875,8 @@ export function App() { onClick={() => { persistRefs(p.base_sha || p.target_branch, p.head_sha || p.source_branch); persistPr(p.provider, p.repo, String(p.number)); + const match = remoteRepos.find((item) => item.slug.toLowerCase() === p.repo.toLowerCase()); + if (match?.local_path) persistRepo(match.local_path); setTab("review"); }} > @@ -725,9 +920,117 @@ export function App() {

Source control

- +

+ Sign in with OAuth to list every repository the account can access. Tokens stay in + ~/.loadpath/settings.json. A classic PAT still works if you prefer not to register an OAuth app. +

+
+
+ GitHub +

+ {settings.github_token_set + ? settings.github_user + ? `Signed in as @${String(settings.github_user)}` + : "Token saved on this machine" + : "Not connected"} +

+
+
+ {settings.github_token_set ? ( + + ) : ( + + )} +
+
+ {githubFlow ? ( +

+ Enter {githubFlow.user_code} at GitHub if the browser did not fill it in. +

+ ) : null} + {!settings.github_oauth_ready ? ( +

+ Sign-in needs a GitHub OAuth App with Device Flow enabled. Set LOADPATH_GITHUB_CLIENT_ID or paste + the client ID below. +

+ ) : null} + + + - +
+
+ Bitbucket +

+ {settings.bitbucket_token_set + ? settings.bitbucket_user + ? `Signed in as ${String(settings.bitbucket_user)}` + : "Token saved on this machine" + : "Not connected"} +

+
+
+ {settings.bitbucket_token_set ? ( + + ) : ( + + )} +
+
+ {!settings.bitbucket_oauth_ready ? ( +

+ Sign-in needs a Bitbucket OAuth consumer (key + secret). Callback URL:{" "} + /api/oauth/bitbucket/callback on this app origin. +

+ ) : null} + + + + + (path: string, init?: RequestInit): Promise { return res.json() as Promise; } -const BLANK_SETTINGS_KEYS = ["github_token", "bitbucket_token", "ai_api_key", "ai_model", "ai_base_url"]; +const BLANK_SETTINGS_KEYS = [ + "github_token", + "bitbucket_token", + "bitbucket_oauth_client_secret", + "ai_api_key", + "ai_model", + "ai_base_url", +]; export const api = { health: () => req<{ status: string; version: string }>("/api/health"), @@ -87,6 +94,36 @@ export const api = { method: "POST", body: JSON.stringify({ provider, repo, state }), }), + scmRepos: (provider: string) => + req<{ provider: string; user: { login: string; name: string; url: string }; repos: RemoteRepo[] }>( + `/api/scm/repos?provider=${encodeURIComponent(provider)}`, + ), + oauthStatus: () => + req<{ + github: { connected: boolean; user: string; token_set: boolean; oauth_ready: boolean }; + bitbucket: { connected: boolean; user: string; token_set: boolean; oauth_ready: boolean }; + }>("/api/oauth/status"), + githubOAuthStart: () => + req<{ + flow_id: string; + user_code: string; + verification_uri: string; + verification_uri_complete: string; + interval: number; + expires_in: number; + }>("/api/oauth/github/start", { method: "POST", body: "{}" }), + githubOAuthPoll: (flow_id: string) => + req<{ status: string; interval?: number; user?: string; connected?: boolean }>("/api/oauth/github/poll", { + method: "POST", + body: JSON.stringify({ flow_id }), + }), + bitbucketOAuthStart: () => + req<{ flow_id: string; authorize_url: string }>("/api/oauth/bitbucket/start"), + oauthDisconnect: (provider: string) => + req>("/api/oauth/disconnect", { + method: "POST", + body: JSON.stringify({ provider }), + }), residual: (review: Review) => req<{ note: string }>("/api/ai/residual", { method: "POST", diff --git a/ui/src/styles.css b/ui/src/styles.css index f981634..a377e9f 100644 --- a/ui/src/styles.css +++ b/ui/src/styles.css @@ -1384,6 +1384,26 @@ h2 { font-size: 13px; margin: 0; font-weight: 600; } } .pr-toolbar .field { flex: 1; } .pr-toolbar .field.provider { flex: 0 0 140px; } +.scm-count { margin: 0 0 12px; font-size: 12px; } +.scm-login { + display: flex; + justify-content: space-between; + gap: 12px; + align-items: center; + padding: 10px 0; + border-top: 1px solid var(--line); +} +.scm-login:first-of-type { border-top: 0; padding-top: 0; } +.scm-login .btn-row { margin-top: 0; } +.scm-login p { margin: 2px 0 0; } +.oauth-code { + font-size: 13px; + margin: 0; +} +.oauth-code code { + font-size: 14px; + letter-spacing: 0.08em; +} .pr { border: 1px solid var(--line); background: var(--surface); diff --git a/ui/src/types.ts b/ui/src/types.ts index 0afda9c..b2a30e1 100644 --- a/ui/src/types.ts +++ b/ui/src/types.ts @@ -162,6 +162,19 @@ export type PullRequest = { base_sha?: string; }; +export type RemoteRepo = { + provider: string; + slug: string; + name: string; + owner: string; + url: string; + private: boolean; + default_branch?: string; + updated_at?: string; + description?: string; + local_path?: string | null; +}; + export type FsEntry = { name: string; path: string;