@ashrlabs/ashr 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/main.ts", "../package.json", "../src/agent/models.ts", "../src/args.ts", "../src/platform/credentials.ts", "../src/paths.ts", "../src/permissions/settings.ts", "../src/platform/manifold.ts", "../src/print.ts", "../src/agent/session.ts", "../../operator/src/context-budget.mjs", "../../operator/src/tools/bash.mjs", "../src/permissions/gate.ts", "../src/permissions/paths.ts", "../src/permissions/rules.ts", "../src/agent/events.ts", "../src/permissions/trust.ts", "../src/ui/app.ts", "../src/agent/snapshots.ts", "../src/sessions/store.ts", "../src/ui/commands.ts", "../src/ui/components/approval.ts", "../src/ui/components/layout.ts", "../src/ui/components/header.ts", "../src/ui/components/input-box.ts", "../src/ui/theme.ts", "../src/ui/components/panels.ts", "../src/ui/components/slash-menu.ts", "../src/ui/components/status-line.ts", "../src/ui/components/tool-row.ts", "../src/ui/components/turns.ts", "../src/ui/route.ts", "../src/hosted/entry.ts", "../src/platform/terminal-login.ts", "../src/hosted/client.ts", "../src/hosted/app.ts", "../src/hosted/workspace.ts", "../src/hosted/render.ts", "sdk-markdown:/Users/kapavarapu/Desktop/ashr-manifold/.worktrees/cli-scoped-name/docs/sdk.md", "../src/hosted/sdk-reference.ts", "../src/hosted/dashboard-sample.ts", "../src/hosted/dashboard.ts", "../src/hosted/dashboard-files.ts"],
4
+ "sourcesContent": ["import { existsSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { ProcessTerminal } from \"@earendil-works/pi-tui\";\nimport pkg from \"../package.json\" with { type: \"json\" };\nimport { PROVIDER_KEYS } from \"./agent/models.js\";\nimport { parseArgs, USAGE, UsageError } from \"./args.js\";\nimport { applyProviderKeys, readCredentials, writeCredentials } from \"./platform/credentials.js\";\nimport { DEFAULT_API_URL, validateKey } from \"./platform/manifold.js\";\nimport { runPrint } from \"./print.js\";\nimport { runApp } from \"./ui/app.js\";\nimport { runHostedEntry, runLogin } from \"./hosted/entry.js\";\n\n/** The nearest folder above `cwd` that holds a .git, else `cwd` itself. */\nfunction findRepoRoot(cwd: string): string {\n let dir = resolve(cwd);\n for (;;) {\n if (existsSync(join(dir, \".git\"))) return dir;\n const up = dirname(dir);\n if (up === dir) return resolve(cwd);\n dir = up;\n }\n}\n\n/** Read a secret from the terminal without echoing it. */\nfunction hiddenPrompt(question: string): Promise<string> {\n return new Promise((done, fail) => {\n const stdin = process.stdin;\n if (!stdin.isTTY) {\n fail(new Error(\"No terminal to read the key from. Pass it with --key.\"));\n return;\n }\n process.stdout.write(question);\n let value = \"\";\n stdin.setRawMode(true);\n stdin.resume();\n const onData = (buf: Buffer) => {\n for (const ch of buf.toString(\"utf8\")) {\n if (ch === \"\\r\" || ch === \"\\n\") {\n stdin.setRawMode(false);\n stdin.pause();\n stdin.off(\"data\", onData);\n process.stdout.write(\"\\n\");\n done(value.trim());\n return;\n }\n if (ch === \"\\u0003\") {\n stdin.setRawMode(false);\n process.stdout.write(\"\\n\");\n process.exit(130);\n }\n if (ch === \"\\u007f\") value = value.slice(0, -1);\n else value += ch;\n }\n };\n stdin.on(\"data\", onData);\n });\n}\n\nasync function login(args: ReturnType<typeof parseArgs>): Promise<number> {\n const creds = readCredentials();\n if (args.provider) {\n const names = PROVIDER_KEYS[args.provider];\n if (!names) throw new UsageError(`Unknown provider \"${args.provider}\". Known: ${Object.keys(PROVIDER_KEYS).join(\", \")}.`);\n const key = args.key ?? (await hiddenPrompt(`${args.provider} API key: `));\n if (!key) throw new Error(\"No key entered.\");\n creds.providers[args.provider] = key;\n writeCredentials(creds);\n process.stdout.write(`Saved your ${args.provider} key. ashr uses it when ${names[0]} is not set in your shell.\\n`);\n return 0;\n }\n if (!args.key && !args.service) return runLogin(args, creds);\n const apiUrl = args.apiUrl ?? DEFAULT_API_URL;\n const key = args.key ?? (await hiddenPrompt(\"Manifold API key (ask_\u2026): \"));\n if (!key) throw new Error(\"No key entered.\");\n await validateKey(apiUrl, key);\n writeCredentials({ ...creds, manifold: { apiUrl, key, profile: creds.manifold?.profile ?? \"default\" } });\n process.stdout.write(`Signed in to ${apiUrl}.\\n`);\n return 0;\n}\n\nfunction logout(args: ReturnType<typeof parseArgs>): number {\n const creds = readCredentials();\n if (args.provider) {\n delete creds.providers[args.provider];\n process.stdout.write(`Removed the stored ${args.provider} key.\\n`);\n } else {\n delete creds.manifold;\n process.stdout.write(\"Signed out of Manifold.\\n\");\n }\n writeCredentials(creds);\n return 0;\n}\n\nasync function main(argv: string[]): Promise<number> {\n const args = parseArgs(argv);\n if (args.command === \"help\") {\n process.stdout.write(`ashr ${pkg.version} \u2014 the Ashr terminal agent\\n\\n${USAGE}\\n`);\n return 0;\n }\n if (args.command === \"version\") {\n process.stdout.write(`${pkg.version}\\n`);\n return 0;\n }\n if (args.command === \"login\") return login(args);\n if (args.command === \"logout\") return logout(args);\n\n const creds = readCredentials();\n if (args.runtime === \"hosted\") return runHostedEntry(args, creds);\n applyProviderKeys(creds, process.env);\n const repoRoot = findRepoRoot(process.cwd());\n const org = creds.manifold?.profile ?? \"default\";\n if (args.print !== undefined) {\n return runPrint({ repoRoot, prompt: args.print, mode: args.mode, allow: args.allow, output: args.output, env: process.env, model: args.model, org });\n }\n return runApp({ repoRoot, terminal: new ProcessTerminal(), env: process.env, org, model: args.model, continueLatest: args.continue, resumePicker: args.resume });\n}\n\nmain(process.argv.slice(2)).then(\n (code) => process.exit(code),\n (err: unknown) => {\n process.stderr.write(`${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(err instanceof UsageError ? 2 : 1);\n },\n);\n", "{\n \"name\": \"@ashrlabs/ashr\",\n \"version\": \"0.1.0\",\n \"description\": \"Ashr terminal agent for post-training models\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/ashrlabs/manifold.git\",\n \"directory\": \"cli\"\n },\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=22.19.0\"\n },\n \"bin\": {\n \"ashr\": \"dist/ashr.js\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"build\": \"node scripts/build.mjs\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n \"test\": \"vitest --run\",\n \"test:parity\": \"vitest --run --config vitest.parity.config.ts\",\n \"test:parity:browser\": \"node scripts/test-parity-browser.mjs\"\n },\n \"dependencies\": {\n \"@earendil-works/pi-agent-core\": \"0.87.1\",\n \"@earendil-works/pi-ai\": \"0.87.1\",\n \"@earendil-works/pi-coding-agent\": \"0.87.1\",\n \"@earendil-works/pi-tui\": \"0.87.1\",\n \"js-tiktoken\": \"1.0.21\",\n \"picomatch\": \"4.0.7\",\n \"shell-quote\": \"1.12.0\"\n },\n \"devDependencies\": {\n \"@types/node\": \"22.19.19\",\n \"@types/picomatch\": \"4.0.3\",\n \"@types/shell-quote\": \"1.7.5\",\n \"@xterm/headless\": \"6.0.0\",\n \"esbuild\": \"0.28.2\",\n \"typescript\": \"7.0.2\",\n \"vitest\": \"4.1.9\"\n }\n}\n", "import type { Api, Model } from \"@earendil-works/pi-ai\";\nimport { findEnvKeys, getProviders } from \"@earendil-works/pi-ai/compat\";\nimport type { ModelRuntime } from \"@earendil-works/pi-coding-agent\";\n\n/** Environment variables that hold each provider's key, in the order pi reads them. */\nexport const PROVIDER_KEYS: Record<string, string[]> = {\n anthropic: [\"ANTHROPIC_API_KEY\", \"ANTHROPIC_OAUTH_TOKEN\"],\n openai: [\"OPENAI_API_KEY\"],\n google: [\"GEMINI_API_KEY\", \"GOOGLE_API_KEY\"],\n openrouter: [\"OPENROUTER_API_KEY\"],\n xai: [\"XAI_API_KEY\"],\n groq: [\"GROQ_API_KEY\"],\n mistral: [\"MISTRAL_API_KEY\"],\n cerebras: [\"CEREBRAS_API_KEY\"],\n};\n\n/** Every variable pi reads a provider key from, asked of pi itself by offering it all of them. */\nfunction piProviderKeys(): string[] {\n const everything = new Proxy({}, { get: () => \"set\", has: () => true });\n return getProviders().flatMap((provider) => findEnvKeys(provider, everything) ?? []);\n}\n\n/** General credentials pi can also use, left to the engineer's own commands in the shell. */\nconst SHELL_CREDENTIALS = new Set([\"HF_TOKEN\"]);\n\n/** Never visible to the agent's shell: every provider key, plus the Manifold key. */\nexport const SECRET_NAMES = [...new Set([...Object.values(PROVIDER_KEYS).flat(), ...piProviderKeys(), \"ASHR_API_KEY\"])].filter((name) => !SHELL_CREDENTIALS.has(name));\n\n/** Defaults, most capable first; the first one with a configured key and a known id wins. */\nconst PREFERRED = [\n \"anthropic/claude-opus-5-5\",\n \"anthropic/claude-fable-5-1\",\n \"anthropic/claude-sonnet-5-5\",\n \"anthropic/claude-opus-5\",\n \"openai/gpt-5\",\n \"google/gemini-3.1-pro-preview\",\n];\n\nexport class ModelError extends Error {}\n\nexport function hasKey(provider: string, env: NodeJS.ProcessEnv): boolean {\n return (PROVIDER_KEYS[provider] ?? []).some((name) => Boolean(env[name]));\n}\n\nfunction parse(model: string): { provider: string; id: string } {\n const slash = model.indexOf(\"/\");\n if (slash <= 0 || slash === model.length - 1) throw new ModelError(`\"${model}\" is not a model name. Use provider/model, for example anthropic/claude-opus-5-5.`);\n return { provider: model.slice(0, slash), id: model.slice(slash + 1) };\n}\n\nexport function pickModel(runtime: ModelRuntime, opts: { requested?: string; env?: NodeJS.ProcessEnv }): { model: Model<Api>; label: string } {\n const env = opts.env ?? process.env;\n if (opts.requested) {\n const { provider, id } = parse(opts.requested);\n const model = runtime.getModel(provider, id);\n if (model) return { model, label: opts.requested };\n const known = runtime.getModels(provider).slice(0, 8).map((m) => `${m.provider}/${m.id}`);\n const choices = known.length ? ` Some ${provider} models: ${known.join(\", \")}.` : \"\";\n throw new ModelError(`Unknown model \"${opts.requested}\". Pick one with /model or --model.${choices}`);\n }\n for (const label of PREFERRED) {\n const { provider, id } = parse(label);\n if (!hasKey(provider, env)) continue;\n const model = runtime.getModel(provider, id);\n if (model) return { model, label };\n }\n throw new ModelError(\"No model provider key found. Set ANTHROPIC_API_KEY (or OPENAI_API_KEY, GEMINI_API_KEY), or run: ashr login --provider anthropic\");\n}\n", "import type { Mode } from \"./permissions/rules.js\";\n\nexport const USAGE = `Usage:\n ashr open your hosted Manifold workspace\n ashr --local start a local agent in this repo\n ashr --task <name> select a hosted task\n ashr --chat <id> open an existing hosted chat\n ashr --service require a Manifold service key (never opens a browser)\n --api-url <url> select the API deployment\n --dashboard-url <url> select the dashboard used for browser sign-in\n ashr -c, --continue continue the latest session here\n ashr -r, --resume pick a session to resume\n ashr -p \"<prompt>\" run one turn and print the answer\n --mode ask|edit|auto local permission mode (default from settings, else auto)\n --allow \"<rule>\" allow one more rule for this run (repeatable)\n --output text|json how to print the result\n ashr --local --model provider/id use this local model (hosted: /model)\n ashr login [--key ask_\u2026] [--api-url <url>] sign in (browser, or a service key)\n ashr login --provider anthropic [--key sk-\u2026] store a model provider key\n ashr logout [--provider <name>]\n ashr --version | --help`;\n\nexport class UsageError extends Error {\n constructor(message: string) {\n super(`${message}\\n\\n${USAGE}`);\n }\n}\n\nexport interface Args {\n command: \"run\" | \"login\" | \"logout\" | \"help\" | \"version\";\n runtime: \"hosted\" | \"local\";\n service: boolean;\n task?: string;\n chat?: string;\n dashboardUrl?: string;\n print?: string;\n continue: boolean;\n resume: boolean;\n model?: string;\n mode?: Mode;\n allow: string[];\n output: \"text\" | \"json\";\n provider?: string;\n key?: string;\n apiUrl?: string;\n}\n\nexport function parseArgs(argv: string[]): Args {\n const a: Args = { command: \"run\", runtime: \"hosted\", service: false, continue: false, resume: false, allow: [], output: \"text\" };\n let runtime: Args[\"runtime\"] | undefined;\n const rest = [...argv];\n if (rest[0] === \"login\" || rest[0] === \"logout\") a.command = rest.shift() as \"login\" | \"logout\";\n const value = (flag: string) => {\n const v = rest.shift();\n if (v === undefined || (v.startsWith(\"-\") && v.length > 1)) throw new UsageError(`${flag} needs a value.`);\n return v;\n };\n while (rest.length) {\n const flag = rest.shift()!;\n switch (flag) {\n case \"--local\": case \"--hosted\": {\n const selected = flag === \"--local\" ? \"local\" : \"hosted\";\n if (runtime && runtime !== selected) throw new UsageError(\"Choose either --local or --hosted.\");\n runtime = selected;\n break;\n }\n case \"--service\": a.service = true; break;\n case \"--task\": a.task = value(flag); break;\n case \"--chat\": a.chat = value(flag); break;\n case \"--dashboard-url\": a.dashboardUrl = value(flag); break;\n case \"-h\": case \"--help\": a.command = \"help\"; break;\n case \"-v\": case \"--version\": a.command = \"version\"; break;\n case \"-c\": case \"--continue\": a.continue = true; break;\n case \"-r\": case \"--resume\": a.resume = true; break;\n case \"-p\": case \"--print\": a.print = value(flag); break;\n case \"--model\": a.model = value(flag); break;\n case \"--allow\": a.allow.push(value(flag)); break;\n case \"--key\": a.key = value(flag); break;\n case \"--api-url\": a.apiUrl = value(flag); break;\n case \"--provider\": a.provider = value(flag); break;\n case \"--mode\": {\n const m = value(flag);\n if (m !== \"ask\" && m !== \"edit\" && m !== \"auto\") throw new UsageError(`--mode must be ask, edit or auto, not \"${m}\".`);\n a.mode = m;\n break;\n }\n case \"--output\": {\n const o = value(flag);\n if (o !== \"text\" && o !== \"json\") throw new UsageError(`--output must be text or json, not \"${o}\".`);\n a.output = o;\n break;\n }\n default:\n throw new UsageError(`Unknown option ${flag}.`);\n }\n }\n // These existing switches explicitly select the local session workflow.\n const localOptions = a.print !== undefined || a.continue || a.resume || a.model !== undefined || a.mode !== undefined || a.allow.length > 0;\n a.runtime = runtime ?? (localOptions ? \"local\" : \"hosted\");\n if (a.command === \"run\") {\n if (a.runtime === \"hosted\" && localOptions) throw new UsageError(\"Print, resume, model and permission flags apply to --local sessions only. Use /model within hosted chats.\");\n if (a.runtime === \"local\" && (a.task || a.chat || a.service)) throw new UsageError(\"Task, chat and service selection apply to hosted sessions only.\");\n }\n return a;\n}\n", "import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport { PROVIDER_KEYS } from \"../agent/models.js\";\nimport { ashrPaths } from \"../paths.js\";\nimport { readJson } from \"../permissions/settings.js\";\n\nexport interface Credentials {\n /** `email`/`organization` are set when the terminal signed in through the dashboard. */\n manifold?: { apiUrl: string; key: string; profile: string; email?: string; organization?: string };\n providers: Record<string, string>;\n}\n\nexport function readCredentials(env: NodeJS.ProcessEnv = process.env): Credentials {\n const c = readJson<Partial<Credentials>>(ashrPaths(env).credentials) ?? {};\n return { ...(c.manifold ? { manifold: c.manifold } : {}), providers: c.providers ?? {} };\n}\n\n/** Saved readable only by this user. */\nexport function writeCredentials(c: Credentials, env: NodeJS.ProcessEnv = process.env): void {\n const path = ashrPaths(env).credentials;\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(c, null, 2)}\\n`, { mode: 0o600 });\n}\n\n/** Stored provider keys fill in for variables the shell did not set; a key from the shell always wins. */\nexport function applyProviderKeys(c: Credentials, env: NodeJS.ProcessEnv): void {\n for (const [provider, key] of Object.entries(c.providers)) {\n const names = PROVIDER_KEYS[provider];\n if (!names?.length || names.some((n) => env[n])) continue;\n env[names[0]!] = key;\n }\n}\n", "import { createHash } from \"node:crypto\";\nimport { homedir } from \"node:os\";\nimport { basename, join, resolve } from \"node:path\";\n\n/** Where ashr keeps its state. `ASHR_HOME` overrides it (tests, multiple installs). */\nexport function ashrHome(env: NodeJS.ProcessEnv = process.env): string {\n return env.ASHR_HOME ? resolve(env.ASHR_HOME) : join(homedir(), \".ashr\");\n}\n\n/** A readable, collision-free directory name for a repo: its folder name plus a hash of its absolute path. */\nexport function repoSlug(repo: string): string {\n const abs = resolve(repo);\n const name = basename(abs).replace(/[^A-Za-z0-9._-]/g, \"_\") || \"root\";\n return `${name}-${createHash(\"sha256\").update(abs).digest(\"hex\").slice(0, 8)}`;\n}\n\nexport function ashrPaths(env: NodeJS.ProcessEnv = process.env) {\n const home = ashrHome(env);\n return {\n home,\n credentials: join(home, \"credentials.json\"),\n settings: join(home, \"settings.json\"),\n trust: join(home, \"trust.json\"),\n agentDir: join(home, \"agent\"),\n memory: join(home, \"memory.md\"),\n sessions: (org: string, repo: string) => join(home, \"sessions\", org, repoSlug(repo)),\n };\n}\n", "import { execFileSync } from \"node:child_process\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { ashrPaths } from \"../paths.js\";\nimport type { Mode, Rule, RuleSet } from \"./rules.js\";\n\ninterface SettingsFile {\n defaultMode?: Mode;\n model?: string;\n permissions?: { allow?: string[]; deny?: string[] };\n}\n\nexport interface LoadedSettings {\n rules: RuleSet;\n defaultMode: Mode;\n model?: string;\n /** Committed allow rules that are not applied because the repo is not trusted yet. */\n ignored: { allow: string[] };\n}\n\nexport function readJson<T>(path: string): T | undefined {\n if (!existsSync(path)) return undefined;\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as T;\n } catch (err) {\n throw new Error(`${path} is not valid JSON (${(err as Error).message}). Fix or delete it.`);\n }\n}\n\nconst MODES = new Set<string>([\"ask\", \"edit\", \"auto\"]);\nconst asMode = (m: unknown): Mode | undefined => (typeof m === \"string\" && MODES.has(m) ? (m as Mode) : undefined);\n\n/** A personal settings file that git tracks was committed by someone else: it is treated like the team file. */\nexport function localIsShared(repoRoot: string): boolean {\n try {\n execFileSync(\"git\", [\"ls-files\", \"--error-unmatch\", \"--\", \".ashr/settings.local.json\"], { cwd: repoRoot, stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Rules from three files: ~/.ashr/settings.json (you), .ashr/settings.json (team, committed) and\n * .ashr/settings.local.json (you, gitignored). Any deny wins. Team allow rules apply only once the\n * repo is trusted, and a team file can never set auto mode. A settings.local.json that git tracks counts as a team file.\n */\nexport function loadSettings(repoRoot: string, opts: { trusted: boolean; env?: NodeJS.ProcessEnv }): LoadedSettings {\n const user = readJson<SettingsFile>(ashrPaths(opts.env).settings) ?? {};\n const team = readJson<SettingsFile>(join(repoRoot, \".ashr\", \"settings.json\")) ?? {};\n const local = readJson<SettingsFile>(join(repoRoot, \".ashr\", \"settings.local.json\")) ?? {};\n const allow: Rule[] = [];\n const deny: Rule[] = [];\n const add = (file: SettingsFile, source: string, withAllow: boolean) => {\n for (const text of file.permissions?.deny ?? []) deny.push({ text, source });\n if (withAllow) for (const text of file.permissions?.allow ?? []) allow.push({ text, source });\n };\n add(user, \"~/.ashr/settings.json\", true);\n add(team, \".ashr/settings.json\", opts.trusted);\n const shared = localIsShared(repoRoot);\n add(local, \".ashr/settings.local.json\", opts.trusted || !shared);\n const teamMode = (m: unknown) => (opts.trusted && asMode(m) !== \"auto\" ? asMode(m) : undefined);\n const localMode = shared ? teamMode(local.defaultMode) : asMode(local.defaultMode);\n const untrusted = [...(team.permissions?.allow ?? []), ...(shared ? (local.permissions?.allow ?? []) : [])];\n return {\n rules: { allow, deny },\n defaultMode: localMode ?? teamMode(team.defaultMode) ?? asMode(user.defaultMode) ?? \"auto\",\n model: local.model ?? user.model,\n ignored: { allow: opts.trusted ? [] : untrusted },\n };\n}\n\n/** Save an \"always allow\" rule to this repo's personal settings file, and keep that file out of git. */\nexport function addLocalRule(repoRoot: string, rule: string): void {\n const dir = join(repoRoot, \".ashr\");\n mkdirSync(dir, { recursive: true });\n const path = join(dir, \"settings.local.json\");\n const current = readJson<SettingsFile>(path) ?? {};\n const allow = new Set(current.permissions?.allow ?? []);\n allow.add(rule);\n const next = { ...current, permissions: { ...current.permissions, allow: [...allow] } };\n writeFileSync(path, `${JSON.stringify(next, null, 2)}\\n`);\n ignoreLocalFiles(repoRoot);\n}\n\n/** Keep this repo's personal settings and data out of git. */\nexport function ignoreLocalFiles(repoRoot: string): void {\n const dir = join(repoRoot, \".ashr\");\n mkdirSync(dir, { recursive: true });\n const ignore = join(dir, \".gitignore\");\n const lines = existsSync(ignore) ? readFileSync(ignore, \"utf8\").split(\"\\n\").filter(Boolean) : [];\n for (const want of [\"settings.local.json\", \"data/\"]) if (!lines.includes(want)) lines.push(want);\n writeFileSync(ignore, `${lines.join(\"\\n\")}\\n`);\n}\n\n/** Remove a rule from this repo's personal settings file. Returns false when it was not there. */\nexport function removeLocalRule(repoRoot: string, rule: string): boolean {\n const path = join(repoRoot, \".ashr\", \"settings.local.json\");\n const current = readJson<SettingsFile>(path);\n const allow = current?.permissions?.allow ?? [];\n if (!current || !allow.includes(rule)) return false;\n const next = { ...current, permissions: { ...current.permissions, allow: allow.filter((r) => r !== rule) } };\n writeFileSync(path, `${JSON.stringify(next, null, 2)}\\n`);\n return true;\n}\n\n", "export const DEFAULT_API_URL = \"https://api.manifold.ashr.io\";\n\n/** A key Manifold answered with an HTTP status; 401 means the key itself is no longer valid. */\nexport class KeyRejectedError extends Error {\n constructor(message: string, readonly status: number) {\n super(message);\n this.name = \"KeyRejectedError\";\n }\n}\n\n/** Checks a Manifold key against a tenant-scoped endpoint; throws a message the user can act on. */\nexport async function validateKey(apiUrl: string, key: string, fetchImpl: typeof fetch = fetch): Promise<void> {\n let res: Response;\n try {\n res = await fetchImpl(`${apiUrl.replace(/\\/$/, \"\")}/v1/tasks`, { headers: { Authorization: `Bearer ${key}` } });\n } catch (err) {\n throw new Error(`Couldn't reach ${apiUrl}: ${(err as Error).message}. Check the address and your connection.`);\n }\n if (res.status === 401 || res.status === 403) throw new KeyRejectedError(`That key was rejected by ${apiUrl}. Create one in the Manifold dashboard under API keys.`, res.status);\n if (!res.ok) throw new KeyRejectedError(`Manifold answered ${res.status} at ${apiUrl}. Try again, or check the address.`, res.status);\n}\n", "import { relative, resolve } from \"node:path\";\nimport type { ModelRuntime } from \"@earendil-works/pi-coding-agent\";\nimport { createAshrSession } from \"./agent/session.js\";\nimport { ashrPaths } from \"./paths.js\";\nimport type { ApprovalRequest } from \"./permissions/gate.js\";\nimport type { Mode } from \"./permissions/rules.js\";\nimport { loadSettings } from \"./permissions/settings.js\";\nimport { repoTrustState } from \"./permissions/trust.js\";\n\nexport interface PrintOptions {\n repoRoot: string;\n prompt: string;\n mode?: Mode;\n allow: string[];\n output: \"text\" | \"json\";\n env: NodeJS.ProcessEnv;\n model?: string;\n modelRuntime?: ModelRuntime;\n org?: string;\n stdout?(s: string): void;\n stderr?(s: string): void;\n}\n\n/** One turn, no UI. Anything that would need an approval is refused, and the run exits 3 naming the rule to add. */\nexport async function runPrint(o: PrintOptions): Promise<number> {\n const out = o.stdout ?? ((s: string) => process.stdout.write(s));\n const err = o.stderr ?? ((s: string) => process.stderr.write(s));\n const trust = repoTrustState(o.repoRoot, o.env);\n const settings = loadSettings(o.repoRoot, { trusted: trust.trusted, env: o.env });\n const rules = { allow: [...settings.rules.allow, ...o.allow.map((text) => ({ text, source: \"--allow\" }))], deny: settings.rules.deny };\n const mode = o.mode ?? settings.defaultMode;\n const needed: ApprovalRequest[] = [];\n let s;\n try {\n s = await createAshrSession({\n repoRoot: o.repoRoot,\n sessionDir: ashrPaths(o.env).sessions(o.org ?? \"default\", o.repoRoot),\n modelRuntime: o.modelRuntime,\n model: o.model,\n env: o.env,\n mode: () => mode,\n rules: () => rules,\n extraDirs: () => [],\n approver: {\n ask: async (req) => {\n needed.push(req);\n return { approve: false, reason: \"This needs approval and print mode cannot ask. Stop and explain what you would do.\" };\n },\n },\n });\n } catch (e) {\n err(`${(e as Error).message}\\n`);\n return 1;\n }\n const tools: Array<{ name: string; subject: string; isError: boolean }> = [];\n const starts = new Map<string, { name: string; subject: string }>();\n let failure: string | undefined;\n s.subscribe((e) => {\n if (e.type === \"tool_start\") {\n const subject = e.name === \"bash\" ? String(e.args.command ?? \"\") : typeof e.args.path === \"string\" ? relative(o.repoRoot, resolve(o.repoRoot, e.args.path)) : \"\";\n starts.set(e.id, { name: e.name, subject });\n }\n if (e.type === \"tool_end\") tools.push({ ...(starts.get(e.id) ?? { name: e.name, subject: \"\" }), isError: e.isError });\n if (e.type === \"error\") failure = e.message;\n });\n try {\n await s.session.prompt(o.prompt);\n } catch (e) {\n failure = (e as Error).message;\n }\n const last = [...s.session.messages].reverse().find((m) => m.role === \"assistant\") as { content?: Array<{ type: string; text?: string }> } | undefined;\n const result = (last?.content ?? []).filter((c) => c.type === \"text\").map((c) => c.text ?? \"\").join(\"\").trim();\n const stats = s.session.getSessionStats();\n await s.dispose();\n if (failure) {\n err(`${failure}\\n`);\n return 1;\n }\n if (needed.length) {\n for (const req of needed) {\n const rules = req.offer ? [req.offer] : (req.partRules ?? []);\n const allow = rules.map((r) => `--allow \"${r}\"`).join(\" \");\n const hint = req.needsPerson ? \"this always needs a person; run ashr interactively\" : `rerun with ${allow ? `${allow} or ` : \"\"}--mode ${req.kind === \"edit\" ? \"edit|auto\" : \"auto\"}`;\n err(`Needs approval in print mode: ${req.title} ${req.subject || req.detail[0] || \"\"}. To allow it, ${hint}.\\n`);\n }\n return 3;\n }\n out(o.output === \"json\" ? `${JSON.stringify({ result, tools, usage: { tokens: stats.tokens.total, cost: stats.cost } })}\\n` : `${result}\\n`);\n return 0;\n}\n", "import { existsSync, mkdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n type AgentSession,\n createAgentSessionFromServices,\n createAgentSessionServices,\n ModelRuntime,\n SessionManager,\n SettingsManager,\n} from \"@earendil-works/pi-coding-agent\";\nimport { ContextBudget } from \"../../../operator/src/context-budget.mjs\";\nimport { createBashTool } from \"../../../operator/src/tools/bash.mjs\";\nimport { ashrPaths } from \"../paths.js\";\nimport { type Approver, createGate } from \"../permissions/gate.js\";\nimport type { Mode, RuleSet } from \"../permissions/rules.js\";\nimport { type AshrEvent, mapEvent } from \"./events.js\";\nimport { pickModel, SECRET_NAMES } from \"./models.js\";\n\nexport const ASHR_SYSTEM_PROMPT = [\n \"You are Ashr, a terminal agent for engineers who post-train models.\",\n \"You work in the user's repository on their machine. You can read, edit and write files and run shell commands; the user approves actions according to their permission mode.\",\n \"Be direct. Before a long or costly action, say what you will do. When the user rejects a tool call, adapt to their reason instead of retrying the same action.\",\n].join(\"\\n\");\n\nexport interface AshrSessionOptions {\n repoRoot: string;\n sessionDir: string;\n sessionFile?: string;\n modelRuntime?: ModelRuntime;\n model?: string;\n mode(): Mode;\n rules(): RuleSet;\n extraDirs(): string[];\n approver: Approver;\n onRuleSaved?(rule: string): void;\n onBeforeWrite?(path: string): void;\n env?: NodeJS.ProcessEnv;\n}\n\nexport interface AshrSession {\n session: AgentSession;\n modelRuntime: ModelRuntime;\n modelLabel: string;\n outputDir: string;\n /** Set when a resumed session's model was unavailable and another was used instead. */\n notice?: string;\n subscribe(fn: (e: AshrEvent) => void): () => void;\n dispose(): Promise<void>;\n}\n\n/** The repo's ASHR.md and the user's ~/.ashr/memory.md, when present, become context files. */\nfunction contextFiles(repoRoot: string, env: NodeJS.ProcessEnv) {\n return [join(repoRoot, \"ASHR.md\"), ashrPaths(env).memory]\n .filter((path) => existsSync(path))\n .map((path) => ({ path, content: readFileSync(path, \"utf8\") }));\n}\n\n/** The model a saved session last used: its latest model change, else its latest assistant reply. */\nfunction recordedModel(file: string, sessionDir: string, repoRoot: string): string | undefined {\n const entries = SessionManager.open(file, sessionDir, repoRoot).getEntries() as Array<{ type: string; provider?: string; modelId?: string; message?: { role?: string; provider?: string; model?: string } }>;\n for (let i = entries.length - 1; i >= 0; i--) {\n const e = entries[i]!;\n if (e.type === \"model_change\" && e.provider && e.modelId) return `${e.provider}/${e.modelId}`;\n if (e.type === \"message\" && e.message?.role === \"assistant\" && e.message.provider && e.message.model) return `${e.message.provider}/${e.message.model}`;\n }\n return undefined;\n}\n\nfunction modelKnown(runtime: ModelRuntime, label: string): boolean {\n const slash = label.indexOf(\"/\");\n return slash > 0 && runtime.getModel(label.slice(0, slash), label.slice(slash + 1)) !== undefined;\n}\n\nexport async function createAshrSession(o: AshrSessionOptions): Promise<AshrSession> {\n const env = o.env ?? process.env;\n const paths = ashrPaths(env);\n const outputDir = join(o.sessionDir, \"outputs\");\n for (const dir of [paths.agentDir, o.sessionDir]) mkdirSync(dir, { recursive: true });\n\n const modelRuntime =\n o.modelRuntime ?? (await ModelRuntime.create({ authPath: join(paths.agentDir, \"auth.json\"), modelsPath: null, refreshOnCreate: false }));\n const recorded = !o.model && o.sessionFile ? recordedModel(o.sessionFile, o.sessionDir, o.repoRoot) : undefined;\n let notice: string | undefined;\n let picked: ReturnType<typeof pickModel>;\n if (recorded && modelKnown(modelRuntime, recorded)) picked = pickModel(modelRuntime, { requested: recorded, env: process.env });\n else {\n picked = pickModel(modelRuntime, { requested: o.model, env: process.env });\n if (recorded) notice = `Model ${recorded} is not available; using ${picked.label}. Change it with /model.`;\n }\n const { model, label } = picked;\n\n const settingsManager = SettingsManager.inMemory({\n compaction: { enabled: true },\n retry: { enabled: true, maxRetries: 3, baseDelayMs: Number(env.ASHR_RETRY_BASE_MS ?? 2000), maxAgentDelayMs: 60_000 },\n });\n const services = await createAgentSessionServices({\n cwd: o.repoRoot,\n agentDir: paths.agentDir,\n settingsManager,\n modelRuntime,\n resourceLoaderOptions: {\n noExtensions: true,\n noThemes: true,\n noContextFiles: true,\n noSkills: true,\n noPromptTemplates: true,\n appendSystemPrompt: [],\n extensionFactories: [\n createGate({\n repoRoot: o.repoRoot,\n getMode: o.mode,\n getRules: o.rules,\n extraDirs: o.extraDirs,\n approver: o.approver,\n onRuleSaved: o.onRuleSaved,\n onBeforeWrite: o.onBeforeWrite,\n }),\n ],\n systemPrompt: ASHR_SYSTEM_PROMPT,\n agentsFilesOverride: () => ({ agentsFiles: contextFiles(o.repoRoot, env) }),\n },\n });\n\n const sessionManager = o.sessionFile\n ? SessionManager.open(o.sessionFile, o.sessionDir, o.repoRoot)\n : SessionManager.create(o.repoRoot, o.sessionDir);\n const bash = createBashTool({ cwd: o.repoRoot, outputDir, budget: new ContextBudget({ hardFraction: 0.9 }), secretNames: SECRET_NAMES });\n const { session } = await createAgentSessionFromServices({\n services,\n sessionManager,\n model,\n tools: [\"bash\", \"read\", \"edit\", \"write\"],\n customTools: [bash],\n });\n\n return {\n session,\n modelRuntime,\n modelLabel: label,\n outputDir,\n ...(notice ? { notice } : {}),\n subscribe: (fn) => session.subscribe((e) => { for (const mapped of mapEvent(e)) fn(mapped); }),\n dispose: async () => session.dispose(),\n };\n}\n", "import { closeSync, mkdirSync, openSync, readSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { Tiktoken } from 'js-tiktoken/lite';\nimport o200k from 'js-tiktoken/ranks/o200k_base';\n\nlet encoder, maxTokenBytes;\n// Pi 1.0.3 renamed the azure-openai-responses provider to azure.\nconst openAIProviders = new Set(['openai', 'openai-codex', 'azure']);\nconst TOKENIZER_CHUNK_SIZE = 1024;\nexport const ESTIMATED_IMAGE_ATTACHMENT_TOKENS = 1_200;\n\nfunction tokenizer(model) {\n if (!openAIProviders.has(model?.provider) || !/^(?:gpt-(?:4o|4\\.[15]|[56](?:[.-]|$))|o[134](?:[.-]|$)|chatgpt-4o)/.test(model.id)) return null;\n if (!encoder) {\n encoder = new Tiktoken(o200k);\n maxTokenBytes = 1;\n for (const bytes of encoder.textMap.values()) maxTokenBytes = Math.max(maxTokenBytes, bytes.length);\n }\n return encoder;\n}\n\nexport function encodeText(text, model = undefined) {\n const encoding = tokenizer(model);\n const chunks = [];\n const append = (text, bpe) => chunks.push({ tokens: bpe ? encoding.encode(text, [], []) : Buffer.from(text, 'utf8'), bpe });\n if (encoding) {\n let pending = '';\n for (const [run] of text.matchAll(/\\s+|\\S+/gu)) {\n if (pending.length + run.length > TOKENIZER_CHUNK_SIZE) {\n if (pending) append(pending, true);\n pending = '';\n }\n if (run.length > TOKENIZER_CHUNK_SIZE) append(run, false);\n else pending += run;\n }\n if (pending) append(pending, true);\n } else append(text, false);\n const length = chunks.reduce((sum, chunk) => sum + chunk.tokens.length, 0);\n return {\n length,\n slice: (start = 0, end = length) => {\n start = start < 0 ? Math.max(0, length + start) : Math.min(start, length);\n end = end < 0 ? Math.max(0, length + end) : Math.min(end, length);\n const pieces = [];\n let offset = 0;\n for (const { tokens, bpe } of chunks) {\n if (offset >= end) break;\n if (offset + tokens.length > start) {\n const slice = tokens.slice(Math.max(0, start - offset), Math.max(0, end - offset));\n pieces.push(bpe ? Buffer.concat(slice.map(token => encoding.textMap.get(token))) : slice);\n }\n offset += tokens.length;\n }\n return trimEnd(trimStart(Buffer.concat(pieces))).toString('utf8');\n },\n };\n}\n\nexport const estimateTokens = (text, model = undefined) => encodeText(text, model).length;\nexport const tokenByteCapacity = (tokens, model = undefined) => Math.floor(tokens) * (tokenizer(model) ? maxTokenBytes : 1);\n\n/**\n * Pi's own floor for the next reply: it sends `max_output_tokens = min(model.maxTokens, window - context - 4096)`,\n * shrinking the reply to fit, so a request needs only this much room, never the model's full `maxTokens`.\n */\nexport const REPLY_FLOOR_TOKENS = 4_096;\n\n/**\n * Room the next reply needs: Pi's 4,096-token floor, or the largest reply this session has actually produced\n * (assistant usage output tokens), whichever is larger. Reserving `model.maxTokens` (128k on GPT-6 Astra) instead\n * left tool results with nothing once a 272k session passed ~117k tokens, long before its handoff point.\n */\nexport function replyReserve(messages = []) {\n let largest = 0;\n for (const message of messages) if (message?.role === 'assistant') largest = Math.max(largest, message.usage?.output ?? 0);\n return Math.max(REPLY_FLOOR_TOKENS, largest);\n}\n\n/**\n * What tool results may still add to the session's context, derived from the live session rather than a constant:\n * the context line the runner stops the session at (`hardFraction` of the model's window), less what the context\n * already holds, less the room the next reply needs (`replyReserve`), less what sibling tool calls in the same turn\n * were already granted but have not yet been appended to the session.\n */\nexport class ContextBudget {\n constructor({ hardFraction }) {\n if (!(hardFraction > 0 && hardFraction <= 1)) throw new Error('ContextBudget needs the session\\'s hard context fraction');\n this.hardFraction = hardFraction;\n this.grants = new Map();\n }\n /** `null` when the session cannot say how full it is (no session context, or no context window). */\n measure(ctx, toolCallId) {\n const usage = ctx?.getContextUsage?.();\n if (!usage || usage.tokens == null || !usage.contextWindow) return null;\n const messages = (ctx.sessionManager?.getBranch?.() || []).filter(e => e.type === 'message').map(e => e.message);\n const appended = new Set(messages.filter(m => m?.role === 'toolResult').map(m => m.toolCallId));\n for (const id of this.grants.keys()) if (appended.has(id)) this.grants.delete(id);\n const pending = [...this.grants].reduce((sum, [id, tokens]) => sum + (id === toolCallId ? 0 : tokens), 0);\n const reserve = replyReserve(messages);\n const limit = Math.floor(this.hardFraction * usage.contextWindow) - reserve;\n return { window: usage.contextWindow, used: usage.tokens, pending, reserve, limit, available: Math.max(0, limit - usage.tokens - pending) };\n }\n register(toolCallId, path) {\n if (!this.grants.has(toolCallId)) this.grant(toolCallId, Buffer.byteLength(compactNotice(path, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER)));\n }\n reserve(toolCallId, ctx, bytes) {\n const measured = this.measure(ctx, toolCallId);\n if (measured) { measured.available = Math.min(measured.available, bytes); this.grant(toolCallId, measured.available); }\n return measured;\n }\n release(toolCallId) { this.grants.delete(toolCallId); }\n grant(toolCallId, tokens) { this.grants.set(toolCallId, tokens); }\n}\n\n/** Exact sizes of a byte buffer: bytes, and lines counted as newline-terminated records plus an unterminated last one. */\nexport function countLines(buffer) {\n let lines = 0;\n for (let i = buffer.indexOf(10); i !== -1; i = buffer.indexOf(10, i + 1)) lines++;\n return lines + (buffer.length && buffer[buffer.length - 1] !== 10 ? 1 : 0);\n}\n\nexport const outputFileName = (toolCallId, ext = 'txt') => `${new Date().toISOString().replace(/[:.]/g, '-')}-${String(toolCallId).replace(/[^A-Za-z0-9_-]/g, '_')}.${ext}`;\n\nconst readRange = (path, start, length) => {\n const buffer = Buffer.alloc(length);\n const fd = openSync(path, 'r');\n try { return buffer.subarray(0, readSync(fd, buffer, 0, length, start)); } finally { closeSync(fd); }\n};\n// Drop a partial UTF-8 sequence at either end so the text never carries a broken character.\nconst trimStart = b => { let i = 0; while (i < b.length && i < 4 && (b[i] & 0xc0) === 0x80) i++; return b.subarray(i); };\nconst trimEnd = b => {\n for (let back = 1; back <= Math.min(4, b.length); back++) {\n const byte = b[b.length - back];\n if ((byte & 0xc0) === 0x80) continue;\n const need = byte >= 0xf0 ? 4 : byte >= 0xe0 ? 3 : byte >= 0xc0 ? 2 : 1;\n return need > back ? b.subarray(0, b.length - back) : b;\n }\n return b;\n};\n\n/**\n * The head and tail of a file that fit `budgetBytes`. The tail gets three quarters: a command's result, final\n * status and errors are at its end, while the start says what ran and how it was configured; the middle of a long\n * output is usually repetitive progress. Both cuts land on line boundaries when a whole line fits.\n */\nexport function headAndTail(path, size, budgetBytes) {\n const headBudget = Math.floor(budgetBytes / 4), tailBudget = budgetBytes - headBudget;\n let head = trimEnd(readRange(path, 0, Math.min(headBudget, size)));\n const headNewline = head.lastIndexOf(10);\n if (headNewline !== -1) head = head.subarray(0, headNewline + 1);\n const tailStart = Math.max(head.length, size - tailBudget);\n let tail = trimStart(readRange(path, tailStart, size - tailStart));\n let tailOffset = size - tail.length;\n const tailNewline = tailOffset > 0 ? tail.indexOf(10) : -1;\n if (tailNewline !== -1 && tailNewline < tail.length - 1) { tail = tail.subarray(tailNewline + 1); tailOffset = size - tail.length; }\n return { head, tail, tailOffset };\n}\n\n/**\n * Deliver a tool's text result: whole when it fits the session's remaining context, otherwise written whole to\n * `dir` and returned as a loud header plus the head and tail that fit, or just a file notice if space is exhausted.\n * Without a session context (a direct call) or with an unknown context size, the text is returned whole.\n */\nexport function deliver({ text, toolCallId, ctx, budget, dir, label = 'result' }) {\n const measured = budget.reserve(toolCallId, ctx, Buffer.byteLength(text));\n const encoded = encodeText(text, ctx?.model);\n const tokens = encoded.length;\n if (!measured || tokens <= measured.available) { budget.grant(toolCallId, tokens); return text; }\n mkdirSync(dir, { recursive: true });\n const path = join(dir, outputFileName(toolCallId, 'json'));\n writeFileSync(path, text, { mode: 0o600 });\n const bytes = Buffer.byteLength(text, 'utf8');\n const shown = renderPartial(path, bytes, countLines(Buffer.from(text, 'utf8')), measured, `This ${label}`, ctx?.model, encoded);\n budget.grant(toolCallId, estimateTokens(shown, ctx?.model));\n return shown;\n}\n\nexport const compactNotice = (path, bytes, lines) => `[NOT SHOWN IN FULL. Full size: ${bytes} bytes, ${lines} lines. Full text: ${path}\\nUse read with offset/limit for the rest.]`;\n\n/** A header-first partial view of a file that does not fit; shared by every tool that spills. */\nexport function renderPartial(path, bytes, lines, measured, subject, model, encoded) {\n const header = (headBytes, headLines, tailBytes, tailLines) => `[${subject.toUpperCase()} DOES NOT FIT THE CONTEXT YOU HAVE LEFT AND IS NOT SHOWN IN FULL. Full size: ${bytes} bytes, ${lines} lines. Full text: ${path}\\n`\n + `Shown below: ${headBytes ? `the first ${headBytes} bytes (lines 1-${headLines})` : 'nothing from the start'} and ${tailBytes ? `the last ${tailBytes} bytes (lines ${lines - tailLines + 1}-${lines})` : 'nothing from the end'}; `\n + `${bytes - headBytes - tailBytes} bytes in between are only in the file. Context: ${measured.used} tokens used of a ${measured.window}-token window; ${measured.available} tokens were available below the session's stop line after reserving ${measured.reserve} for your reply. Use read with offset/limit, grep, or sed on the file for the rest.]`;\n const middle = omitted => `\\n[... ${omitted} bytes omitted; see ${path} ...]\\n`;\n const overhead = Buffer.byteLength(header(bytes, lines, bytes, 1) + '\\n' + middle(bytes));\n if (overhead >= measured.available) return compactNotice(path, bytes, lines);\n const available = measured.available - overhead;\n const headTokens = Math.floor(available / 4), tailTokens = available - headTokens;\n let headText, tailText;\n if (encoded) {\n headText = encoded.slice(0, headTokens);\n tailText = tailTokens ? encoded.slice(-tailTokens) : '';\n } else {\n const candidates = headAndTail(path, bytes, tokenByteCapacity(available, model));\n headText = encodeText(candidates.head.toString('utf8'), model).slice(0, headTokens);\n tailText = tailTokens ? encodeText(candidates.tail.toString('utf8'), model).slice(-tailTokens) : '';\n }\n const headNewline = headText.lastIndexOf('\\n'), tailNewline = tailText.indexOf('\\n');\n if (headNewline !== -1) headText = headText.slice(0, headNewline + 1);\n if (tailNewline !== -1 && tailNewline < tailText.length - 1) tailText = tailText.slice(tailNewline + 1);\n const head = Buffer.from(headText), tail = Buffer.from(tailText);\n const omitted = bytes - head.length - tail.length;\n return `${header(head.length, countLines(head), tail.length, countLines(tail))}\\n${headText}${omitted > 0 ? middle(omitted) : ''}${tailText}`;\n}\n", "import { openSync, writeSync, closeSync, mkdirSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { createBashToolDefinition, createLocalBashOperations, defineTool } from '@earendil-works/pi-coding-agent';\nimport { tokenByteCapacity, estimateTokens, encodeText, outputFileName, renderPartial } from '../context-budget.mjs';\n\n/**\n * Pi's bash, with its output handling replaced. Pi keeps the last 2000 lines / 50 KB inline and spills the rest to\n * an ephemeral os.tmpdir() file. Here every command's complete output is written to `outputDir` in the workspace,\n * and the inline result is the whole output whenever it fits the context the session has left (`budget`);\n * otherwise a loud header with the exact byte and line counts and the file path, then the head and tail that fit.\n * Pi still spawns the shell (environment, session variables, timeout, abort and exit-code semantics); its own\n * accumulator never sees the output, so it neither truncates nor writes a second temp copy.\n *\n * The shell never inherits the operator's platform credential: the variables in SECRET_ENVIRONMENT are removed\n * from the environment of every command, whatever the process environment holds.\n */\n\n/** Operator-process variables that name or hold a tenant credential; never visible to the agent's shell. */\nexport const SECRET_ENVIRONMENT = ['ASHR_API_KEY', 'MANIFOLD_PLATFORM_CONFIG'];\n\nexport function scrubbedEnvironment(env = process.env, extra = []) {\n const clean = { ...env };\n for (const name of [...SECRET_ENVIRONMENT, ...extra]) delete clean[name];\n return clean;\n}\n\n/** Remove the secret variables from this process, once their values are held in memory. */\nexport function scrubProcessEnvironment() {\n for (const name of SECRET_ENVIRONMENT) delete process.env[name];\n}\n\nexport function createBashTool({ cwd, outputDir, budget, secretNames = [] }) {\n const pi = createBashToolDefinition(cwd);\n return defineTool({\n name: 'bash',\n label: 'bash',\n description: `Execute a bash command in the current working directory. Returns stdout and stderr. The complete output of every command is saved to a file under ${outputDir}. The whole output is returned inline whenever it fits the context you have left; when it does not, the result starts with the exact byte and line counts and the file path, followed by the start and end of the output that fit. Optionally provide a timeout in seconds (no default timeout).`,\n promptSnippet: pi.promptSnippet,\n promptGuidelines: pi.promptGuidelines,\n parameters: pi.parameters,\n async execute(toolCallId, params, signal, _onUpdate, ctx) {\n mkdirSync(outputDir, { recursive: true });\n const path = join(outputDir, outputFileName(toolCallId, 'log'));\n budget.register(toolCallId, path);\n const controller = new AbortController();\n const executionSignal = signal ? AbortSignal.any([signal, controller.signal]) : controller.signal;\n let fd;\n let persistenceFailure = null;\n let bytes = 0, lines = 0, last = 10;\n const local = createLocalBashOperations();\n const operations = { exec: (command, dir, options) => local.exec(command, dir, { ...options, env: scrubbedEnvironment(options.env, secretNames), onData: chunk => {\n if (persistenceFailure) return;\n try {\n for (let offset = 0; offset < chunk.length;) {\n const written = writeSync(fd, chunk, offset, chunk.length - offset);\n if (written === 0) throw new Error('Output write made no progress');\n offset += written;\n }\n bytes += chunk.length; last = chunk[chunk.length - 1] ?? last;\n for (let i = chunk.indexOf(10); i !== -1; i = chunk.indexOf(10, i + 1)) lines++;\n } catch (error) { persistenceFailure = error; controller.abort(); }\n } }) };\n let failure = null;\n let outcome;\n try {\n try { fd = openSync(path, 'w', 0o600); }\n catch (error) { persistenceFailure = error; throw error; }\n outcome = await createBashToolDefinition(cwd, { operations }).execute(toolCallId, params, executionSignal, undefined, ctx);\n }\n catch (error) { failure = error; }\n finally {\n if (fd !== undefined) {\n try { closeSync(fd); } catch (error) { persistenceFailure ??= error; }\n }\n }\n if (persistenceFailure) {\n const message = `Could not persist complete command output to ${path}: ${persistenceFailure.message}. The command was stopped; the output file may be incomplete or missing.`;\n budget.grant(toolCallId, estimateTokens(message, ctx?.model));\n throw new Error(message);\n }\n if (bytes && last !== 10) lines++;\n // Pi formats a failure as \"<output>\\n\\n<status>\"; its output part is empty, or \"(no output)\" for a nonzero\n // exit, because it never saw any. A nonzero exit comes back as an isError result (Pi 0.99+); a shell that\n // could not run or ended without an exit code is still thrown.\n const piText = failure ? String(failure.message ?? failure) : outcome?.isError ? outcome.content.map(part => part.text ?? '').join('') : '';\n const status = piText.replace(/^\\(no output\\)\\n\\n/, '').trim();\n const measured = budget.reserve(toolCallId, ctx, bytes + Buffer.byteLength(status ? `\\n\\n${status}` : '(no output)'));\n let text;\n if (bytes === 0) text = status ? '' : '(no output)';\n else {\n const statusTokens = status ? estimateTokens(`\\n\\n${status}`, ctx?.model) : 0;\n const available = measured ? Math.max(0, measured.available - statusTokens) : Infinity;\n if (!measured || bytes <= tokenByteCapacity(available, ctx?.model)) text = readFileSync(path, 'utf8');\n const encoded = text === undefined ? undefined : encodeText(text, ctx?.model);\n if (measured && (!encoded || encoded.length > available)) text = renderPartial(path, bytes, lines, { ...measured, available }, 'This command\\'s output', ctx?.model, encoded);\n }\n const result = status ? `${text ? `${text}\\n\\n` : ''}${status}` : text;\n budget.grant(toolCallId, estimateTokens(result, ctx?.model));\n if (failure) throw new Error(result);\n return { content: [{ type: 'text', text: result }], details: { fullOutputPath: path, bytes, lines }, ...(outcome?.isError ? { isError: true } : {}) };\n },\n });\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport type { InlineExtension } from \"@earendil-works/pi-coding-agent\";\nimport { canonical, expandToolPath } from \"./paths.js\";\nimport { type Action, type Decision, decide, type Mode, type RuleSet } from \"./rules.js\";\nimport { addLocalRule } from \"./settings.js\";\n\nexport interface ApprovalRequest {\n id: string;\n kind: \"edit\" | \"shell\" | \"mcp\" | \"outside\" | \"spend\";\n title: string;\n subject: string;\n detail: string[];\n flags: string[];\n /** The rule \"always allow\" would save, or null when no single rule covers this action. */\n offer: string | null;\n /** For a compound command no single rule covers: one rule per part that still needs one. */\n partRules?: string[];\n /** No rule can ever allow this; only a person can. */\n needsPerson?: boolean;\n}\nexport interface ApprovalAnswer { approve: boolean; always?: boolean; reason?: string }\nexport interface Approver { ask(req: ApprovalRequest, signal?: AbortSignal): Promise<ApprovalAnswer> }\nexport interface GateOptions {\n repoRoot: string;\n getMode(): Mode;\n getRules(): RuleSet;\n extraDirs(): string[];\n approver: Approver;\n onRuleSaved?(rule: string): void;\n /** Called just before an allowed edit or write runs, with the absolute path it will change. */\n onBeforeWrite?(path: string): void;\n}\n\n/** Exactly the file a tool call will touch, with ~, @, file:// and symlinks resolved. */\nconst absolute = (p: unknown, root: string) => canonical(expandToolPath(String(p ?? \"\"), root));\n\nexport function classify(toolName: string, input: Record<string, unknown>, repoRoot: string): Action {\n if (toolName === \"bash\") return { kind: \"shell\", command: String(input.command ?? \"\") };\n if (toolName === \"edit\" || toolName === \"write\") return { kind: \"edit\", path: absolute(input.path, repoRoot) };\n if ([\"read\", \"grep\", \"find\", \"ls\"].includes(toolName)) return { kind: \"read\", path: absolute(input.path ?? \".\", repoRoot) };\n const mcp = /^mcp__(.+?)__(.+)$/.exec(toolName);\n if (mcp) return { kind: \"mcp\", server: mcp[1]!, tool: mcp[2]! };\n return { kind: \"mcp\", server: \"ashr\", tool: toolName };\n}\n\nfunction editPreview(input: Record<string, unknown>): string[] {\n if (Array.isArray(input.edits)) {\n const out: string[] = [];\n for (const e of input.edits as Array<{ oldText?: string; newText?: string }>) {\n for (const l of String(e.oldText ?? \"\").split(\"\\n\")) out.push(`- ${l}`);\n for (const l of String(e.newText ?? \"\").split(\"\\n\")) out.push(`+ ${l}`);\n }\n return out;\n }\n return String(input.content ?? \"\").split(\"\\n\").map((l) => `+ ${l}`);\n}\n\nexport function describeAction(action: Action, input: Record<string, unknown>, d: Decision, repoRoot: string): Omit<ApprovalRequest, \"id\"> {\n return { ...card(action, input, d, repoRoot), partRules: d.partRules ?? [], needsPerson: d.needsPerson ?? false };\n}\n\nfunction card(action: Action, input: Record<string, unknown>, d: Decision, repoRoot: string): Omit<ApprovalRequest, \"id\"> {\n const shown = (p: string) => {\n const r = relative(canonical(repoRoot), p);\n return r.startsWith(\"..\") || isAbsolute(r) ? p : r;\n };\n switch (action.kind) {\n case \"edit\": {\n const outside = d.flags.includes(\"outside repo\");\n return { kind: outside ? \"outside\" : \"edit\", title: outside ? \"Write outside the repo\" : \"Edit\", subject: shown(action.path), detail: editPreview(input), flags: d.flags, offer: d.offer };\n }\n case \"read\":\n return { kind: \"outside\", title: \"Read outside the repo\", subject: action.path, detail: [], flags: d.flags, offer: null };\n case \"shell\": {\n const lines = action.command.split(/\\r?\\n/);\n const long = lines.length > 1 || action.command.length > 60;\n return { kind: \"shell\", title: \"Shell\", subject: long ? \"\" : action.command, detail: long ? lines : [], flags: d.flags, offer: d.offer };\n }\n case \"mcp\":\n return { kind: \"mcp\", title: `${action.server} \u00B7 ${action.tool}`, subject: JSON.stringify(input), detail: [], flags: d.flags, offer: d.offer };\n case \"spend\":\n return { kind: \"spend\", title: action.what, subject: \"\", detail: [], flags: [], offer: null };\n }\n}\n\n/** Every tool call passes here before it runs: allowed, denied, or put to the user as an approval card. */\nexport function createGate(opts: GateOptions): InlineExtension {\n return {\n name: \"ashr-gate\",\n hidden: true,\n factory: (pi) => {\n pi.on(\"tool_call\", async (event, ctx) => {\n const input = event.input as Record<string, unknown>;\n const action = classify(event.toolName, input, opts.repoRoot);\n const d = decide(action, { mode: opts.getMode(), rules: opts.getRules(), repoRoot: opts.repoRoot, extraDirs: opts.extraDirs() });\n if (d.verdict === \"deny\") return { block: true, reason: `Not allowed: ${d.reason}.` };\n if (d.verdict === \"ask\") {\n const answer = await opts.approver.ask({ id: event.toolCallId || randomUUID(), ...describeAction(action, input, d, opts.repoRoot) }, ctx.signal);\n if (!answer.approve) {\n return { block: true, reason: answer.reason ? `The user rejected this: ${answer.reason}` : \"The user rejected this action.\" };\n }\n if (answer.always && d.offer) {\n addLocalRule(opts.repoRoot, d.offer);\n opts.onRuleSaved?.(d.offer);\n }\n }\n if (action.kind === \"edit\") opts.onBeforeWrite?.(action.path);\n return undefined;\n });\n },\n };\n}\n", "import { lstatSync, readlinkSync, realpathSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { basename, dirname, isAbsolute, join, relative, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/** The path a file tool will actually touch: the tools strip a leading @, expand ~ and accept file:// URLs. */\nexport function expandToolPath(path: string, base: string): string {\n let p = path.trim();\n if (p.startsWith(\"@\")) p = p.slice(1);\n if (p.startsWith(\"file://\")) p = fileURLToPath(p);\n if (p === \"~\") p = homedir();\n else if (p.startsWith(\"~/\")) p = join(homedir(), p.slice(2));\n return isAbsolute(p) ? resolve(p) : resolve(base, p);\n}\n\nconst exists = (p: string) => {\n try {\n lstatSync(p);\n return true;\n } catch {\n return false;\n }\n};\n\n/** Resolve symlinks through the deepest part of `path` that exists, so a link cannot smuggle a path out of a directory. */\nexport function canonical(path: string): string {\n let cur = resolve(path);\n const rest: string[] = [];\n while (!exists(cur)) {\n const up = dirname(cur);\n if (up === cur) break;\n rest.unshift(basename(cur));\n cur = up;\n }\n try {\n cur = realpathSync(cur);\n } catch {\n // A dangling link: judge it by where it points.\n try {\n cur = resolve(dirname(cur), readlinkSync(cur));\n } catch {\n // Unreadable: keep it as written.\n }\n }\n return join(cur, ...rest);\n}\n\nexport function isInside(path: string, dir: string): boolean {\n const rel = relative(canonical(dir), canonical(path));\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n}\n", "import { relative, sep } from \"node:path\";\nimport picomatch from \"picomatch\";\nimport { parse } from \"shell-quote\";\nimport { canonical, expandToolPath, isInside } from \"./paths.js\";\n\n/**\n * Permission rules. These are guardrails against an honest agent's mistakes, not a security boundary:\n * in Auto the agent can run any program, so the checks read commands as written and stay simple.\n */\n\nexport type Mode = \"ask\" | \"edit\" | \"auto\";\nexport type Action =\n | { kind: \"read\"; path: string }\n | { kind: \"edit\"; path: string }\n | { kind: \"shell\"; command: string }\n | { kind: \"mcp\"; server: string; tool: string }\n | { kind: \"spend\"; what: string };\nexport interface Rule { text: string; source: string }\nexport interface RuleSet { allow: Rule[]; deny: Rule[] }\nexport interface Decision {\n verdict: \"allow\" | \"ask\" | \"deny\";\n reason: string;\n /** The rule \"always allow\" would save, or null. */\n offer: string | null;\n flags: string[];\n /** Asks in every mode and can't be covered by a rule (spend, outside the repo, dangerous). */\n needsPerson?: boolean;\n /** For a compound command no single rule covers: one rule per part that would. */\n partRules?: string[];\n}\n\nconst SEPARATORS = new Set([\"&&\", \"||\", \";\", \"|\", \"&\", \"|&\", \";;\"]);\nconst REDIRECTS = new Set([\">\", \">>\", \">|\", \"&>\", \"&>>\", \">&\"]);\n\n/** The simple commands in a shell line (newlines separate commands too), and the files `>` writes to. */\nexport function splitShell(command: string): { parts: string[]; complex: boolean; redirects: string[] } {\n const complex = /\\$\\(|`|<\\(|>\\(/.test(command);\n const parts: string[] = [];\n const redirects: string[] = [];\n for (const line of command.split(/\\r?\\n/)) {\n let words: string[] = [];\n let redirectNext = false;\n const flush = () => {\n if (words.length) parts.push(words.join(\" \"));\n words = [];\n };\n for (const tok of parse(line, (name) => `$${name}`)) {\n if (typeof tok === \"string\" || (\"op\" in tok && tok.op === \"glob\")) {\n const word = typeof tok === \"string\" ? tok : (tok as { pattern: string }).pattern;\n if (redirectNext) redirects.push(word);\n else words.push(word);\n redirectNext = false;\n } else if (\"op\" in tok && SEPARATORS.has(tok.op)) flush();\n else if (\"op\" in tok && REDIRECTS.has(tok.op)) redirectNext = true;\n else if (\"op\" in tok) words.push(tok.op);\n }\n flush();\n }\n return { parts, complex, redirects };\n}\n\n/** The program a part runs: leading `NAME=value` assignments skipped, a path reduced to its name. */\nfunction program(part: string): string[] {\n const words = part.split(\" \");\n while (words.length && /^[A-Za-z_][A-Za-z0-9_]*=/.test(words[0]!)) words.shift();\n if (words[0]?.includes(\"/\")) words[0] = words[0].slice(words[0].lastIndexOf(\"/\") + 1);\n return words;\n}\n\n/** `dangerous` asks in every mode; `notes` are shown on the approval card. */\nexport function shellFlags(command: string): { dangerous: string[]; notes: string[] } {\n const dangerous = new Set<string>();\n const notes = new Set<string>();\n const { parts, complex } = splitShell(command);\n const downloads = parts.some((p) => /\\b(curl|wget)\\b/.test(p));\n const runsShell = parts.some((p) => /^(sh|bash|zsh|source|\\.)$/.test(program(p)[0] ?? \"\"));\n if (/\\b(curl|wget)\\b[^|]*\\|\\s*(sudo\\s+)?(sh|bash|zsh|python3?)\\b/.test(command) || (downloads && (runsShell || complex))) dangerous.add(\"download into shell\");\n for (const part of parts) {\n const [cmd = \"\", ...args] = program(part);\n if (cmd === \"sudo\" || cmd === \"doas\") dangerous.add(\"sudo\");\n if (cmd === \"git\" && args.includes(\"push\")) dangerous.add(\"git push\");\n if (cmd === \"git\" && args.some((a) => /^(--force|-f|--force-with-lease|--hard)$/.test(a))) dangerous.add(\"force\");\n if (/\\b(curl|wget|ssh|scp|rsync|nc)\\b|\\bgit\\s+clone\\b/.test(part)) notes.add(\"network\");\n if (/^(rm|rmdir|shred)$/.test(cmd)) notes.add(\"deletes\");\n if (/\\b(pip3?|npm|pnpm|yarn|brew|apt-get|apt)\\s+(install|add|i)\\b|\\buv\\s+pip\\s+install\\b/.test(part)) notes.add(\"package install\");\n }\n return { dangerous: [...dangerous], notes: [...notes] };\n}\n\n/** A word that is a path or carries one (`--out=/x`). */\nfunction pathsIn(word: string): string[] {\n const value = /^--?[A-Za-z0-9-]+=(.+)$/.exec(word)?.[1] ?? word;\n return /^(\\/|~|\\.\\.(\\/|$))|\\/\\.\\.(\\/|$)/.test(value) ? [value] : [];\n}\n\n/** Paths a shell command names (arguments and redirect targets) that are outside the repo and granted dirs. */\nfunction outsidePaths(command: string, repoRoot: string, extraDirs: string[]): string[] {\n const { parts, redirects } = splitShell(command);\n const named = [...parts.flatMap((p) => p.split(\" \").slice(1).flatMap(pathsIn)), ...redirects.flatMap(pathsIn)];\n return named.filter((p) => {\n const path = expandToolPath(p, repoRoot);\n if (canonical(path).startsWith(`${sep}dev${sep}`)) return false;\n return ![repoRoot, ...extraDirs].some((d) => isInside(path, d));\n });\n}\n\nconst READ_ONLY = new Set([\n \"ls\", \"cat\", \"head\", \"tail\", \"wc\", \"pwd\", \"echo\", \"printf\", \"which\", \"file\", \"stat\", \"tree\", \"du\", \"df\", \"uname\",\n \"whoami\", \"date\", \"grep\", \"egrep\", \"fgrep\", \"rg\", \"cut\", \"tr\", \"nl\", \"diff\", \"cmp\", \"basename\", \"dirname\",\n \"realpath\", \"readlink\", \"jq\", \"true\", \"false\", \"test\",\n]);\nconst GIT_READ_ONLY = new Set([\"status\", \"log\", \"diff\", \"show\", \"rev-parse\", \"ls-files\", \"blame\", \"describe\", \"shortlog\"]);\n\nfunction readOnlyPart(part: string): boolean {\n const [cmd = \"\", ...args] = part.split(\" \");\n if (READ_ONLY.has(cmd)) return !(cmd === \"rg\" && args.some((a) => a.startsWith(\"--pre\")));\n if (cmd === \"find\") return !args.some((a) => /^-(exec|execdir|ok|okdir|delete|fprint\\w*|fls)$/.test(a));\n if (cmd === \"git\") return GIT_READ_ONLY.has(args[0] ?? \"\") && !args.some((a) => a.startsWith(\"--output\"));\n return /^(python3?|node|pip3?|uv|npm)$/.test(cmd) && args.length === 1 && /^(--version|-V)$/.test(args[0]!);\n}\n\n/** Only reads: every part a known read-only command, nothing redirected to a file, no substitutions. */\nfunction readOnlyShell(command: string): boolean {\n const { parts, complex, redirects } = splitShell(command);\n return !complex && parts.length > 0 && redirects.every((t) => t.startsWith(\"/dev/\") || /^&?\\d$/.test(t)) && parts.every(readOnlyPart);\n}\n\nfunction ruleParts(text: string): { kind: string; body: string } {\n const i = text.indexOf(\":\");\n return i < 0 ? { kind: \"\", body: text } : { kind: text.slice(0, i), body: text.slice(i + 1) };\n}\n\nfunction shellRuleMatches(body: string, part: string): boolean {\n if (body === \"*\") return true;\n if (body.endsWith(\" *\")) {\n const prefix = body.slice(0, -2);\n return part === prefix || part.startsWith(`${prefix} `);\n }\n return part === body;\n}\n\nfunction matches(rule: Rule, action: Action, repoRoot: string): boolean {\n const { kind, body } = ruleParts(rule.text);\n switch (action.kind) {\n case \"shell\":\n return kind === \"shell\" && shellRuleMatches(body, action.command);\n case \"edit\":\n return kind === \"edit\" && picomatch(body, { dot: true })(relative(canonical(repoRoot), canonical(action.path)));\n case \"read\":\n return (kind === \"read\" || kind === \"edit\") && picomatch(body, { dot: true })(relative(canonical(repoRoot), canonical(action.path)));\n case \"mcp\": {\n const [server, tool = \"*\"] = body.split(\":\");\n return kind === \"mcp\" && server === action.server && picomatch(tool)(action.tool);\n }\n case \"spend\":\n return false;\n }\n}\n\n/** Tools whose second word picks what they do, so a rule names both (`git commit *`, `npm run *`). */\nconst SUBCOMMANDS = new Set([\"git\", \"npm\", \"pnpm\", \"yarn\", \"uv\", \"pip\", \"pip3\", \"docker\", \"kubectl\", \"cargo\", \"go\", \"model-ops\", \"make\"]);\n\nfunction offerForPart(part: string): string | null {\n const words = part.split(\" \");\n const [cmd = \"\"] = words;\n if (!cmd || /^[A-Za-z_][A-Za-z0-9_]*=/.test(cmd) || /^(env|time|xargs|nohup|nice|timeout|sudo|sh|bash|zsh|eval|exec)$/.test(cmd)) return null;\n const sub = words[1];\n return SUBCOMMANDS.has(cmd) && sub && !sub.startsWith(\"-\") ? `shell:${cmd} ${sub} *` : `shell:${cmd} *`;\n}\n\nfunction offerFor(action: Action, repoRoot: string): string | null {\n switch (action.kind) {\n case \"edit\":\n return `edit:${relative(canonical(repoRoot), canonical(action.path))}`;\n case \"shell\": {\n const { parts, complex } = splitShell(action.command);\n return !complex && parts.length === 1 ? offerForPart(parts[0]!) : null;\n }\n case \"mcp\":\n return `mcp:${action.server}:${action.tool}`;\n default:\n return null;\n }\n}\n\nconst isUnderGit = (path: string, repoRoot: string) => relative(canonical(repoRoot), canonical(path)).split(sep)[0]?.toLowerCase() === \".git\";\n\n/** Order: deny rules, spend, outside the repo, dangerous, .git in ask/edit, read-only, mode, allow rules, ask. */\nexport function decide(action: Action, ctx: { mode: Mode; rules: RuleSet; repoRoot: string; extraDirs: string[] }): Decision {\n const { mode, rules, repoRoot, extraDirs } = ctx;\n const ask = (reason: string, flags: string[] = []): Decision => ({ verdict: \"ask\", reason, offer: null, flags, needsPerson: true });\n\n const parts = action.kind === \"shell\" ? splitShell(action.command).parts : [];\n const deny = rules.deny.find((r) => (action.kind === \"shell\" ? parts.some((p) => matches(r, { kind: \"shell\", command: p }, repoRoot)) : matches(r, action, repoRoot)));\n if (deny) return { verdict: \"deny\", reason: `blocked by rule ${deny.text} (${deny.source})`, offer: null, flags: [] };\n\n if (action.kind === \"spend\") return ask(\"spends money on Manifold\");\n if ((action.kind === \"read\" || action.kind === \"edit\") && ![repoRoot, ...extraDirs].some((d) => isInside(action.path, d))) {\n return ask(\"outside the repo\", [\"outside repo\"]);\n }\n\n let flags: string[] = [];\n if (action.kind === \"shell\") {\n const f = shellFlags(action.command);\n flags = [...f.dangerous, ...f.notes];\n if (f.dangerous.length) return ask(`dangerous: ${f.dangerous.join(\", \")}`, flags);\n const outside = outsidePaths(action.command, repoRoot, extraDirs);\n if (outside.length) return ask(`outside the repo: ${outside.join(\", \")}`, [...flags, \"outside repo\"]);\n }\n if (action.kind === \"edit\" && mode !== \"auto\" && isUnderGit(action.path, repoRoot)) return ask(\"changes git's own files\", [\"git config\"]);\n\n if (action.kind === \"read\") return { verdict: \"allow\", reason: \"read inside the repo\", offer: null, flags };\n if (action.kind === \"shell\" && readOnlyShell(action.command)) return { verdict: \"allow\", reason: \"reads only, inside the repo\", offer: null, flags };\n if (mode === \"auto\") return { verdict: \"allow\", reason: \"auto mode\", offer: null, flags };\n if (mode === \"edit\" && action.kind === \"edit\") return { verdict: \"allow\", reason: \"edit mode\", offer: null, flags };\n\n if (action.kind === \"shell\") {\n const complex = splitShell(action.command).complex;\n const used = complex ? [] : parts.map((p) => rules.allow.find((r) => matches(r, { kind: \"shell\", command: p }, repoRoot)));\n if (used.length && used.every(Boolean)) return { verdict: \"allow\", reason: `allowed by ${[...new Set(used.map((r) => r!.text))].join(\", \")}`, offer: null, flags };\n const offer = offerFor(action, repoRoot);\n if (offer) return { verdict: \"ask\", reason: `${mode} mode`, offer, flags };\n const partRules = complex ? [] : parts.map(offerForPart).filter((r): r is string => r !== null);\n return { verdict: \"ask\", reason: `${mode} mode`, offer: null, flags, ...(partRules.length === parts.length ? { partRules } : {}) };\n }\n const allow = rules.allow.find((r) => matches(r, action, repoRoot));\n if (allow) return { verdict: \"allow\", reason: `allowed by ${allow.text} (${allow.source})`, offer: null, flags };\n return { verdict: \"ask\", reason: `${mode} mode`, offer: offerFor(action, repoRoot), flags };\n}\n", "import type { AgentSessionEvent } from \"@earendil-works/pi-coding-agent\";\n\n/** What the UI needs from a session, in our own terms; the UI never imports pi's event types. */\nexport type AshrEvent =\n | { type: \"text\"; delta: string }\n | { type: \"thinking\" }\n | { type: \"tool_start\"; id: string; name: string; args: Record<string, unknown> }\n | { type: \"tool_end\"; id: string; name: string; isError: boolean; summary: string; output: string }\n | { type: \"turn_end\" }\n | { type: \"settled\" }\n | { type: \"queue\"; steering: string[]; followUp: string[] }\n | { type: \"compaction\"; phase: \"start\" | \"end\"; error?: string }\n | { type: \"retry\"; attempt: number; max: number; error: string }\n | { type: \"error\"; message: string };\n\nfunction resultText(result: unknown): string {\n const content = (result as { content?: Array<{ type?: string; text?: string }> } | undefined)?.content;\n if (!Array.isArray(content)) return \"\";\n return content.map((c) => (c.type === \"text\" ? (c.text ?? \"\") : \"\")).join(\"\");\n}\n\nexport function mapEvent(e: AgentSessionEvent): AshrEvent[] {\n switch (e.type) {\n case \"message_update\": {\n const ev = e.assistantMessageEvent;\n if (ev.type === \"text_delta\") return [{ type: \"text\", delta: ev.delta }];\n if (ev.type === \"thinking_delta\") return [{ type: \"thinking\" }];\n return [];\n }\n case \"tool_execution_start\":\n return [{ type: \"tool_start\", id: e.toolCallId, name: e.toolName, args: (e.args ?? {}) as Record<string, unknown> }];\n case \"tool_execution_end\": {\n const text = resultText(e.result).trim();\n return [{ type: \"tool_end\", id: e.toolCallId, name: e.toolName, isError: e.isError, summary: text.split(\"\\n\")[0] ?? \"\", output: text }];\n }\n case \"turn_end\":\n return [{ type: \"turn_end\" }];\n case \"agent_settled\":\n return [{ type: \"settled\" }];\n case \"queue_update\":\n return [{ type: \"queue\", steering: [...e.steering], followUp: [...e.followUp] }];\n case \"compaction_start\":\n return [{ type: \"compaction\", phase: \"start\" }];\n case \"compaction_end\":\n return [{ type: \"compaction\", phase: \"end\", ...(e.errorMessage ? { error: e.errorMessage } : {}) }];\n case \"auto_retry_start\":\n return [{ type: \"retry\", attempt: e.attempt, max: e.maxAttempts, error: e.errorMessage }];\n case \"agent_end\": {\n const last = [...e.messages].reverse().find((m) => (m as { role?: string }).role === \"assistant\") as\n | { stopReason?: string; errorMessage?: string }\n | undefined;\n if (last?.stopReason === \"error\" && !e.willRetry) return [{ type: \"error\", message: last.errorMessage ?? \"The model request failed.\" }];\n return [];\n }\n default:\n return [];\n }\n}\n", "import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { ashrPaths } from \"../paths.js\";\nimport { ignoreLocalFiles, localIsShared, readJson } from \"./settings.js\";\n\nconst read = (path: string) => (existsSync(path) ? readFileSync(path, \"utf8\") : \"\");\n\ninterface SettingsFile { defaultMode?: string; permissions?: { allow?: string[] } }\ninterface McpFile { mcpServers?: Record<string, { command?: string; args?: string[]; url?: string }> }\n\n/**\n * A repo's committed allow rules and connectors run code on this machine, so they apply only after the\n * user trusts them. Trust is tied to the exact content: any change to either file asks again. A\n * settings.local.json that git tracks was committed too, so it is part of what is trusted.\n */\nexport function repoTrustState(repoRoot: string, env: NodeJS.ProcessEnv = process.env) {\n const settingsPath = join(repoRoot, \".ashr\", \"settings.json\");\n const mcpPath = join(repoRoot, \".ashr\", \"mcp.json\");\n const localPath = join(repoRoot, \".ashr\", \"settings.local.json\");\n const shared = localIsShared(repoRoot);\n const content = [read(settingsPath), read(mcpPath), ...(shared ? [read(localPath)] : [])];\n const hash = createHash(\"sha256\").update(content.join(\"\\0\")).digest(\"hex\");\n const files = [settingsPath, ...(shared ? [localPath] : [])].map((p) => readJson<SettingsFile>(p) ?? {});\n const mcp = readJson<McpFile>(mcpPath) ?? {};\n const allow = files.flatMap((f) => f.permissions?.allow ?? []);\n const servers = Object.entries(mcp.mcpServers ?? {}).map(([name, s]) => ({\n name,\n command: s.url ?? [s.command, ...(s.args ?? [])].filter(Boolean).join(\" \"),\n }));\n const needed = allow.length > 0 || servers.length > 0 || files.some((f) => f.defaultMode !== undefined);\n const store = readJson<Record<string, string>>(ashrPaths(env).trust) ?? {};\n return { needed, trusted: !needed || store[resolve(repoRoot)] === hash, hash, allow, servers };\n}\n\nexport function trustRepo(repoRoot: string, hash: string, env: NodeJS.ProcessEnv = process.env): void {\n const path = ashrPaths(env).trust;\n const store = readJson<Record<string, string>>(path) ?? {};\n store[resolve(repoRoot)] = hash;\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(store, null, 2)}\\n`, { mode: 0o600 });\n ignoreLocalFiles(repoRoot);\n}\n", "import { existsSync, statSync } from \"node:fs\";\nimport { isAbsolute, relative, resolve } from \"node:path\";\nimport { type Component, Container, matchesKey, SelectList, Spacer, type Terminal, TuiMainScreen } from \"@earendil-works/pi-tui\";\nimport type { ModelRuntime } from \"@earendil-works/pi-coding-agent\";\nimport { hasKey, pickModel } from \"../agent/models.js\";\nimport { type AshrSession, createAshrSession } from \"../agent/session.js\";\nimport type { AshrEvent } from \"../agent/events.js\";\nimport { restore, snapshotBefore, snapshotsAfter } from \"../agent/snapshots.js\";\nimport { ashrPaths } from \"../paths.js\";\nimport type { ApprovalAnswer, ApprovalRequest, Approver } from \"../permissions/gate.js\";\nimport { canonical, expandToolPath } from \"../permissions/paths.js\";\nimport type { Mode } from \"../permissions/rules.js\";\nimport { type LoadedSettings, loadSettings, localIsShared, removeLocalRule } from \"../permissions/settings.js\";\nimport { repoTrustState, trustRepo } from \"../permissions/trust.js\";\nimport { acquireLock, lastRecordedMode, latestSession, listSessions, lockHolder, recordMode, restoredMode } from \"../sessions/store.js\";\nimport type { AppApi } from \"./app-api.js\";\nimport { COMMANDS, menuGroups } from \"./commands.js\";\nimport { ApprovalCard } from \"./components/approval.js\";\nimport { Header } from \"./components/header.js\";\nimport { InputBox } from \"./components/input-box.js\";\nimport { Block, formatTokens } from \"./components/layout.js\";\nimport { PermissionsPanel, UsagePanel } from \"./components/panels.js\";\nimport { SlashMenu } from \"./components/slash-menu.js\";\nimport { StatusLine } from \"./components/status-line.js\";\nimport { ToolRow } from \"./components/tool-row.js\";\nimport { AssistantTurn, UserTurn } from \"./components/turns.js\";\nimport { route } from \"./route.js\";\nimport { colorMode, createTheme, detectBackground, editorTheme, type Role, type Theme } from \"./theme.js\";\n\nexport interface AppHandle {\n session(): AshrSession;\n app: AppApi;\n}\n\nexport interface RunAppOptions {\n repoRoot: string;\n terminal: Terminal;\n env: NodeJS.ProcessEnv;\n org?: string;\n sessionFile?: string;\n continueLatest?: boolean;\n resumePicker?: boolean;\n modelRuntime?: ModelRuntime;\n model?: string;\n theme?: Theme;\n onReady?(handle: AppHandle): void;\n}\n\n/** One line in the transcript, coloured by meaning. */\nclass Note extends Block {\n constructor(private t: Theme, private text: string, private role: Role = \"soft\") {\n super();\n }\n protected draw(): string[] {\n return this.text.split(\"\\n\").map((l) => ` ${this.t.fg(this.role, l)}`);\n }\n}\n\nclass Lines extends Block {\n constructor(private lines: string[]) {\n super();\n }\n protected draw(): string[] {\n return this.lines;\n }\n}\n\nclass QueueStrip extends Block {\n items: Array<{ kind: \"steer\" | \"next\"; text: string }> = [];\n constructor(private t: Theme) {\n super();\n }\n set(items: Array<{ kind: \"steer\" | \"next\"; text: string }>) {\n this.items = items;\n this.changed();\n }\n protected draw(): string[] {\n const { t } = this;\n return this.items.map((q, i) => ` ${t.fg(\"soft\", i === 0 ? \"QUEUED\" : \" \")} ${q.kind === \"steer\" ? t.fg(\"accent\", \"steer\") : t.fg(\"soft\", \"next \")} ${t.fg(\"text\", q.text.replace(/\\n/g, \" \"))}`);\n }\n}\n\nclass TrustPrompt extends Block {\n constructor(private t: Theme, private state: ReturnType<typeof repoTrustState>) {\n super();\n }\n protected draw(): string[] {\n const { t, state } = this;\n return [\n ` ${t.fg(\"text\", \"This repo has team settings you haven't trusted yet.\")}`,\n \"\",\n ...state.allow.map((r) => ` ${t.fg(\"ok\", \"ALLOW \")} ${t.fg(\"text\", r)}`),\n ...state.servers.map((s) => ` ${t.fg(\"accent\", \"MCP \")} ${t.fg(\"text\", s.name)} ${t.fg(\"soft\", s.command)}`),\n \"\",\n ` ${t.bold(t.fg(\"accent\", \"\u23CE\"))} ${t.bold(t.fg(\"text\", \"trust and use\"))} ${t.fg(\"accent\", \"n\")} ${t.fg(\"soft\", \"continue without\")} ${t.fg(\"accent\", \"e\")} ${t.fg(\"soft\", \"show the file\")}`,\n ];\n }\n}\n\nfunction messageText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content.map((c: { type?: string; text?: string }) => (c.type === \"text\" ? (c.text ?? \"\") : \"\")).join(\"\");\n}\n\nclass App implements AppApi, Approver {\n readonly t: Theme;\n readonly tui: TuiMainScreen;\n private readonly transcript = new Container();\n private readonly live = new Container();\n private readonly approvalHost = new Container();\n private readonly panelHost = new Container();\n private readonly menuHost = new Container();\n private readonly queue: QueueStrip;\n private readonly input: InputBox;\n private readonly status: StatusLine;\n private readonly menu: SlashMenu;\n private readonly header: Header;\n private ashr!: AshrSession;\n private unsubscribe: () => void = () => {};\n private releaseLock: () => void = () => {};\n private settings: LoadedSettings;\n private trust: ReturnType<typeof repoTrustState>;\n private mode: Mode;\n private extraDirs: string[] = [];\n private streaming = false;\n private seq = 0;\n private currentTurn: AssistantTurn | undefined;\n private rows = new Map<string, { row: ToolRow; started: number }>();\n private lastFinished: ToolRow | undefined;\n private queued: Array<{ kind: \"steer\" | \"next\"; text: string }> = [];\n private pending: { card: ApprovalCard; resolve: (a: ApprovalAnswer) => void } | undefined;\n private picker: SelectList | undefined;\n private trustPrompt: TrustPrompt | undefined;\n private autoExplained = false;\n private lastCtrlC = 0;\n private lastView: string | undefined;\n private ticker: NodeJS.Timeout | undefined;\n private finish!: (code: number) => void;\n readonly done: Promise<number>;\n private readonly org: string;\n private readonly sessionDir: string;\n\n constructor(private o: RunAppOptions) {\n this.t = o.theme ?? createTheme({ background: detectBackground(o.env), mode: colorMode(o.env) });\n this.tui = new TuiMainScreen(o.terminal);\n this.queue = new QueueStrip(this.t);\n this.input = new InputBox(this.tui, this.t);\n this.status = new StatusLine(this.t);\n this.menu = new SlashMenu(this.t, menuGroups(COMMANDS, {}));\n this.org = o.org ?? \"default\";\n this.sessionDir = ashrPaths(o.env).sessions(this.org, o.repoRoot);\n this.trust = repoTrustState(o.repoRoot, o.env);\n this.settings = loadSettings(o.repoRoot, { trusted: this.trust.trusted, env: o.env });\n this.mode = this.settings.defaultMode;\n this.header = new Header(this.t, { org: this.org, model: \"\" });\n this.done = new Promise((r) => { this.finish = r; });\n for (const c of [this.approvalHost, new Spacer(1), this.queue, this.panelHost, this.input, this.menuHost, this.status]) this.live.addChild(c);\n this.tui.addChild(this.transcript);\n this.tui.addChild(this.live);\n }\n\n // \u2500\u2500 lifecycle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n async start(): Promise<void> {\n let file = this.o.sessionFile;\n if (!file && this.o.continueLatest) file = (await latestSession(this.o.repoRoot, this.sessionDir))?.file;\n await this.open(file, this.o.model);\n this.input.onSubmit = (text) => void this.submit(text);\n this.input.editor.onChange = () => this.updateMenu();\n this.tui.addInputListener((data) => this.onKey(data));\n if (this.trust.needed && !this.trust.trusted) {\n this.trustPrompt = new TrustPrompt(this.t, this.trust);\n this.panelHost.addChild(this.trustPrompt);\n }\n this.tui.setFocus(this.input);\n this.tui.start();\n await this.matchTerminalBackground();\n this.ticker = setInterval(() => this.tick(), 1000);\n this.refreshStatus();\n if (this.o.resumePicker) await this.pickResume();\n this.o.onReady?.({ session: () => this.ashr, app: this });\n }\n\n /** Ask the terminal for its background colour and switch to the light palette on a light terminal. */\n private async matchTerminalBackground(): Promise<void> {\n if (this.o.theme || this.o.env.ASHR_THEME || this.t.mode === \"none\") return;\n const rgb = await this.tui.queryTerminalBackgroundColor({ timeoutMs: 150 }).catch(() => undefined);\n if (!rgb || detectBackground(this.o.env, rgb) === this.t.background) return;\n Object.assign(this.t, createTheme({ background: detectBackground(this.o.env, rgb), mode: this.t.mode }));\n this.tui.invalidate();\n this.tui.requestRender(true);\n }\n\n private async open(file: string | undefined, model: string | undefined): Promise<void> {\n if (file) {\n const lock = acquireLock(file);\n if (\"heldBy\" in lock) throw new Error(`That session is open in another terminal (pid ${lock.heldBy}). Close it there, or start a new session.`);\n this.releaseLock = lock.release;\n }\n this.ashr = await createAshrSession({\n repoRoot: this.o.repoRoot,\n sessionDir: this.sessionDir,\n sessionFile: file,\n modelRuntime: this.o.modelRuntime,\n model,\n env: this.o.env,\n mode: () => this.mode,\n rules: () => this.settings.rules,\n extraDirs: () => this.extraDirs,\n approver: this,\n onRuleSaved: (rule) => {\n this.reloadSettings();\n const shared = localIsShared(this.o.repoRoot) ? \". Git tracks that file, so the rule is shared with your team and this repo will need trusting again\" : \"\";\n this.note(`Saved ${rule} to .ashr/settings.local.json${shared}`);\n },\n onBeforeWrite: (path) => {\n const leaf = this.ashr.session.sessionManager.getLeafId();\n if (leaf) snapshotBefore(this.sessionDir, this.ashr.session.sessionId, leaf, path);\n },\n });\n if (!file) this.releaseLock = (() => {\n const f = this.ashr.session.sessionFile;\n if (!f) return () => {};\n const lock = acquireLock(f);\n return \"release\" in lock ? lock.release : () => {};\n })();\n this.unsubscribe = this.ashr.subscribe((e) => this.onEvent(e));\n this.header.set({ org: this.org, model: this.ashr.modelLabel });\n this.transcript.addChild(this.header);\n if (file) {\n this.replay();\n this.note(`Resumed. ${this.ashr.session.messages.length} messages.`);\n this.mode = restoredMode(lastRecordedMode(this.ashr.session.sessionManager), this.settings.defaultMode);\n }\n if (this.ashr.notice) this.note(this.ashr.notice, \"warn\");\n this.updateMenuValues();\n }\n\n private async close(): Promise<void> {\n this.unsubscribe();\n if (this.streaming) await this.ashr.session.abort().catch(() => {});\n await this.ashr.dispose();\n this.releaseLock();\n }\n\n async quit(): Promise<void> {\n if (this.ticker) clearInterval(this.ticker);\n await this.close();\n this.tui.stop();\n this.finish(0);\n }\n\n // \u2500\u2500 transcript \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private add(c: Component) {\n this.transcript.addChild(c);\n this.tui.requestRender();\n }\n\n note(text: string, role: Role = \"soft\") {\n this.add(new Note(this.t, text, role));\n }\n\n private replay() {\n const results = new Map<string, boolean>();\n for (const m of this.ashr.session.messages as Array<{ role: string; toolCallId?: string; isError?: boolean }>) {\n if (m.role === \"toolResult\" && m.toolCallId) results.set(m.toolCallId, Boolean(m.isError));\n }\n for (const m of this.ashr.session.messages as Array<{ role: string; content: unknown }>) {\n if (m.role === \"user\") this.transcript.addChild(new UserTurn(this.t, messageText(m.content)));\n if (m.role !== \"assistant\" || !Array.isArray(m.content)) continue;\n for (const part of m.content as Array<{ type: string; text?: string; id?: string; name?: string; arguments?: Record<string, unknown> }>) {\n if (part.type === \"text\" && part.text?.trim()) {\n const turn = new AssistantTurn(this.t);\n turn.append(part.text);\n this.transcript.addChild(turn);\n }\n if (part.type === \"toolCall\") {\n const row = new ToolRow(this.t, { seq: ++this.seq, name: part.name ?? \"tool\", subject: this.subject(part.name ?? \"\", part.arguments ?? {}) });\n row.finish({ isError: results.get(part.id ?? \"\") ?? false, summary: \"\" });\n this.transcript.addChild(row);\n }\n }\n }\n }\n\n private subject(name: string, args: Record<string, unknown>): string {\n if (name === \"bash\") return String(args.command ?? \"\");\n if (typeof args.path === \"string\") {\n const rel = relative(canonical(this.o.repoRoot), canonical(expandToolPath(args.path, this.o.repoRoot)));\n return rel.startsWith(\"..\") || isAbsolute(rel) ? args.path : rel;\n }\n return JSON.stringify(args);\n }\n\n // \u2500\u2500 agent events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private onEvent(e: AshrEvent) {\n switch (e.type) {\n case \"text\":\n if (!this.currentTurn) {\n this.currentTurn = new AssistantTurn(this.t);\n this.transcript.addChild(this.currentTurn);\n }\n this.currentTurn.append(e.delta);\n break;\n case \"tool_start\": {\n this.currentTurn = undefined;\n const row = new ToolRow(this.t, { seq: ++this.seq, name: e.name, subject: this.subject(e.name, e.args) });\n this.rows.set(e.id, { row, started: Date.now() });\n this.transcript.addChild(row);\n break;\n }\n case \"tool_end\": {\n const r = this.rows.get(e.id);\n r?.row.finish({ isError: e.isError, summary: e.summary, output: e.output });\n if (r) this.lastFinished = r.row;\n this.rows.delete(e.id);\n this.refreshStatus();\n break;\n }\n case \"queue\": {\n const still = new Set([...e.steering, ...e.followUp]);\n for (const q of this.queued) if (!still.has(q.text)) this.transcript.addChild(new UserTurn(this.t, q.text));\n this.queued = this.queued.filter((q) => still.has(q.text));\n this.queue.set(this.queued);\n if (still.size) this.currentTurn = undefined;\n break;\n }\n case \"settled\":\n this.streaming = false;\n this.currentTurn = undefined;\n this.refreshStatus();\n break;\n case \"error\":\n this.note(`\u2717 ${e.message}`, \"bad\");\n break;\n case \"compaction\":\n this.note(e.phase === \"start\" ? \"Compacting the conversation to free context\u2026\" : e.error ? `\u2717 Compaction failed: ${e.error}` : \"Compacted. Earlier turns are summarised; the full history stays in the session file.\", e.error ? \"bad\" : \"soft\");\n break;\n case \"retry\":\n this.note(`Retrying (${e.attempt}/${e.max}): ${e.error}`, \"warn\");\n break;\n default:\n break;\n }\n this.tui.requestRender();\n }\n\n private tick() {\n const now = Date.now();\n for (const { row, started } of this.rows.values()) row.setRunning(now - started);\n if (this.rows.size) this.tui.requestRender();\n }\n\n private refreshStatus() {\n if (!this.ashr) return;\n const stats = this.ashr.session.getSessionStats();\n const usage = this.ashr.session.getContextUsage();\n this.status.set({ mode: this.mode, tokens: stats.tokens.total, cost: stats.cost, contextPercent: usage?.percent ?? null, streaming: this.streaming });\n this.tui.requestRender();\n }\n\n // \u2500\u2500 input \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private async submit(raw: string) {\n this.input.setText(\"\");\n this.hideMenu();\n const routed = route(raw, COMMANDS);\n if (routed.kind === \"unknown\") {\n this.note(`${routed.name} is not a command. Did you mean ${routed.suggestions.join(\" or \")}?`, \"warn\");\n return;\n }\n if (routed.kind === \"command\") {\n try {\n await routed.spec.run(this, routed.args);\n } catch (err) {\n this.note(`\u2717 ${(err as Error).message}`, \"bad\");\n }\n return;\n }\n if (!routed.text) return;\n this.closePanel();\n if (this.streaming) {\n this.queued.push({ kind: \"steer\", text: routed.text });\n this.queue.set(this.queued);\n await this.ashr.session.steer(routed.text);\n this.tui.requestRender();\n return;\n }\n this.startTurn(routed.text);\n }\n\n private startTurn(text: string) {\n this.add(new UserTurn(this.t, text));\n this.currentTurn = undefined;\n this.streaming = true;\n this.refreshStatus();\n const withView = this.lastView ? `${text}\\n\\n[What the user was just looking at in the terminal]\\n${this.lastView}` : text;\n this.lastView = undefined;\n this.ashr.session.prompt(withView).catch((err: unknown) => {\n this.streaming = false;\n this.note(`\u2717 ${err instanceof Error ? err.message : String(err)}`, \"bad\");\n this.refreshStatus();\n });\n }\n\n private async abortTurn() {\n const unsent = this.queued.map((q) => q.text);\n this.queued = [];\n this.queue.set([]);\n this.ashr.session.clearQueue();\n if (this.pending) this.answer({ approve: false, reason: \"The user stopped the turn.\" });\n await this.ashr.session.abort().catch(() => {});\n if (this.currentTurn) this.currentTurn.setNote(\"stopped by you\");\n else this.note(\"stopped by you\");\n this.currentTurn = undefined;\n for (const { row } of this.rows.values()) row.finish({ isError: true, summary: \"stopped\" });\n this.rows.clear();\n this.streaming = false;\n if (unsent.length) this.input.setText(unsent.join(\"\\n\"));\n this.refreshStatus();\n }\n\n private onKey(data: string): { consume?: boolean } | undefined {\n const consume = { consume: true };\n if (matchesKey(data, \"ctrl+c\")) {\n if (this.streaming) void this.abortTurn();\n else if (Date.now() - this.lastCtrlC < 2000) void this.quit();\n else {\n this.lastCtrlC = Date.now();\n this.note(\"Press Ctrl-C again to quit.\");\n }\n return consume;\n }\n if (this.trustPrompt) {\n if (matchesKey(data, \"enter\")) {\n trustRepo(this.o.repoRoot, this.trust.hash, this.o.env);\n this.trust = repoTrustState(this.o.repoRoot, this.o.env);\n this.reloadSettings();\n this.endTrustPrompt(\"Trusted. The team's rules and connectors now apply in this repo.\");\n } else if (data === \"n\") this.endTrustPrompt(\"Continuing without the team's rules and connectors. They stay ignored until you trust them.\");\n else if (data === \"e\") this.note(`Team settings: ${resolve(this.o.repoRoot, \".ashr/settings.json\")}`);\n return consume;\n }\n if (this.picker) {\n this.picker.handleInput(data);\n this.tui.requestRender();\n return consume;\n }\n if (this.pending) {\n const { card } = this.pending;\n if (matchesKey(data, \"tab\")) {\n card.setFocused(!card.focused);\n this.tui.requestRender();\n return consume;\n }\n if (card.focused) {\n if (data === \"a\") this.answer({ approve: true });\n else if (data === \"r\") this.answer({ approve: false });\n else if (data === \"A\" && card.req.offer) this.answer({ approve: true, always: true });\n else if (data === \"e\") card.toggle();\n else if (!matchesKey(data, \"escape\") && !matchesKey(data, \"shift+tab\")) return consume;\n if (!matchesKey(data, \"escape\") && !matchesKey(data, \"shift+tab\")) {\n this.tui.requestRender();\n return consume;\n }\n }\n }\n if (matchesKey(data, \"ctrl+o\")) {\n this.lastFinished?.toggle();\n this.tui.requestRender();\n return consume;\n }\n if (this.menuHost.children.length) {\n if (matchesKey(data, \"up\")) { this.menu.move(-1, 0); this.tui.requestRender(); return consume; }\n if (matchesKey(data, \"down\")) { this.menu.move(1, 0); this.tui.requestRender(); return consume; }\n if (matchesKey(data, \"tab\")) {\n const sel = this.menu.selected();\n if (sel) this.input.setText(`${sel.name} `);\n this.updateMenu();\n return consume;\n }\n if (matchesKey(data, \"enter\")) {\n const sel = this.menu.selected();\n const typed = this.input.getText().trim();\n if (sel && !COMMANDS.some((c) => c.name === typed)) {\n void this.submit(sel.name);\n return consume;\n }\n }\n }\n if (matchesKey(data, \"escape\")) {\n if (this.streaming) { void this.abortTurn(); return consume; }\n if (this.panelHost.children.length) { this.closePanel(); return consume; }\n if (this.menuHost.children.length) { this.input.setText(\"\"); this.hideMenu(); return consume; }\n }\n if (matchesKey(data, \"shift+tab\")) {\n this.cycleMode();\n return consume;\n }\n if (matchesKey(data, \"alt+enter\") && this.streaming) {\n const text = this.input.getText().trim();\n if (text) {\n this.input.setText(\"\");\n this.queued.push({ kind: \"next\", text });\n this.queue.set(this.queued);\n void this.ashr.session.followUp(text);\n this.tui.requestRender();\n }\n return consume;\n }\n return undefined;\n }\n\n // \u2500\u2500 slash menu \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private updateMenuValues() {\n const short = this.ashr ? (this.ashr.modelLabel.split(\"/\")[1] ?? this.ashr.modelLabel).replace(/^claude-/, \"\") : \"\";\n this.menu.setGroups(menuGroups(COMMANDS, { \"/model\": short, \"/mode\": this.mode }));\n }\n\n private updateMenu() {\n const text = this.input.getText();\n if (/^\\/\\S*$/.test(text)) {\n this.menu.filter(text);\n if (!this.menuHost.children.length) this.menuHost.addChild(this.menu);\n } else this.hideMenu();\n this.tui.requestRender();\n }\n\n private hideMenu() {\n this.menuHost.clear();\n }\n\n // \u2500\u2500 approvals \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n ask(req: ApprovalRequest, signal?: AbortSignal): Promise<ApprovalAnswer> {\n return new Promise((resolveAnswer) => {\n const card = new ApprovalCard(this.t, req);\n this.pending = { card, resolve: resolveAnswer };\n const row = this.rows.get(req.id);\n if (row) {\n row.row.setWaiting(true);\n card.attached = true;\n }\n this.approvalHost.clear();\n this.approvalHost.addChild(card);\n if (req.kind === \"spend\") this.o.terminal.write(\"\\x07\");\n signal?.addEventListener(\"abort\", () => { if (this.pending?.card === card) this.answer({ approve: false }); }, { once: true });\n this.tui.requestRender();\n });\n }\n\n private answer(a: ApprovalAnswer) {\n const p = this.pending;\n if (!p) return;\n this.pending = undefined;\n this.approvalHost.clear();\n const waiting = this.rows.get(p.card.req.id);\n if (waiting) {\n waiting.row.setWaiting(false);\n waiting.started = Date.now();\n }\n // An attached card's row shows the outcome itself; only an always-allow is worth a line.\n const what = `${p.card.req.title} ${p.card.req.subject}`.trim();\n if (!p.card.attached) this.note(a.approve ? `approved ${what}${a.always ? \" \u00B7 always\" : \"\"}` : `rejected ${what}`, a.approve ? \"soft\" : \"warn\");\n p.resolve(a);\n this.tui.requestRender();\n }\n\n // \u2500\u2500 panels and pickers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n private openPanel(c: Component, summary?: string) {\n this.panelHost.clear();\n this.panelHost.addChild(c);\n this.lastView = summary;\n this.tui.requestRender();\n }\n\n private closePanel() {\n if (this.picker) this.picker = undefined;\n this.panelHost.clear();\n this.tui.requestRender();\n }\n\n private endTrustPrompt(message: string) {\n this.trustPrompt = undefined;\n this.panelHost.clear();\n this.note(message);\n }\n\n private openPicker(items: Array<{ value: string; label: string; description?: string }>, onSelect: (value: string) => void, footnote?: string) {\n if (!items.length) {\n this.note(\"Nothing to pick from yet.\");\n return;\n }\n const list = new SelectList(items, 10, editorTheme(this.t).selectList);\n list.onSelect = (item) => { this.closePanel(); onSelect(item.value); };\n list.onCancel = () => this.closePanel();\n this.picker = list;\n this.panelHost.clear();\n this.panelHost.addChild(list);\n if (footnote) this.panelHost.addChild(new Note(this.t, footnote));\n this.tui.requestRender();\n }\n\n showUsage(): void {\n const stats = this.ashr.session.getSessionStats();\n const usage = this.ashr.session.getContextUsage();\n const created = this.ashr.session.sessionManager.getHeader()?.timestamp;\n const elapsedMs = created ? Date.now() - new Date(created).getTime() : 0;\n const panel = new UsagePanel(this.t, {\n model: this.ashr.modelLabel,\n tokens: { input: stats.tokens.input, output: stats.tokens.output, cacheRead: stats.tokens.cacheRead, total: stats.tokens.total },\n contextPercent: usage?.percent ?? null,\n contextWindow: usage?.contextWindow ?? 0,\n cost: stats.cost,\n turns: stats.userMessages,\n toolCalls: stats.toolCalls,\n elapsedMs,\n });\n this.openPanel(panel, `Usage: ${formatTokens(stats.tokens.total)} tokens, $${stats.cost.toFixed(2)}, context ${usage?.percent ?? \"unknown\"}%.`);\n }\n\n showPermissions(args: string): void {\n const remove = /^remove\\s+(.+)$/.exec(args.trim());\n if (remove) {\n const rule = remove[1]!.trim();\n if (removeLocalRule(this.o.repoRoot, rule)) {\n this.reloadSettings();\n this.note(`Removed ${rule} from .ashr/settings.local.json`);\n } else this.note(`${rule} is not in .ashr/settings.local.json. Team and user rules are edited in their own files.`, \"warn\");\n return;\n }\n const v = { mode: this.mode, allow: this.settings.rules.allow, deny: this.settings.rules.deny, ignored: this.settings.ignored.allow };\n this.openPanel(new PermissionsPanel(this.t, v), `Permission mode ${this.mode}. Allow: ${v.allow.map((r) => r.text).join(\", \") || \"none\"}. Deny: ${v.deny.map((r) => r.text).join(\", \") || \"none\"}.`);\n }\n\n showHelp(): void {\n const { t } = this;\n const lines = [\n ` ${t.bold(t.fg(\"text\", \"Commands\"))}`,\n ...COMMANDS.map((c) => ` ${t.fg(\"accent\", c.name.padEnd(13))}${t.fg(\"soft\", c.description)}`),\n \"\",\n ` ${t.bold(t.fg(\"text\", \"Keys\"))}`,\n ` ${t.fg(\"accent\", \"\u23CE\".padEnd(13))}${t.fg(\"soft\", \"send; while the agent works, steer it\")}`,\n ` ${t.fg(\"accent\", \"\u2325\u23CE\".padEnd(13))}${t.fg(\"soft\", \"queue a message for when the agent finishes\")}`,\n ` ${t.fg(\"accent\", \"esc\".padEnd(13))}${t.fg(\"soft\", \"stop the agent\")}`,\n ` ${t.fg(\"accent\", \"\u21E7\u21E5\".padEnd(13))}${t.fg(\"soft\", \"permission mode: ask \u2192 edit \u2192 auto\")}`,\n ` ${t.fg(\"accent\", \"tab\".padEnd(13))}${t.fg(\"soft\", \"while an approval waits: switch between answering it and typing\")}`,\n ` ${t.fg(\"accent\", \"ctrl-o\".padEnd(13))}${t.fg(\"soft\", \"show or hide the full output of the last tool\")}`,\n ` ${t.fg(\"accent\", \"ctrl-c \u00D72\".padEnd(13))}${t.fg(\"soft\", \"quit\")}`,\n ];\n this.openPanel(new Lines(lines));\n }\n\n async pickResume(): Promise<void> {\n const sessions = await listSessions(this.o.repoRoot, this.sessionDir);\n const current = this.ashr.session.sessionFile;\n this.openPicker(\n sessions.filter((s) => s.file !== current).map((s) => ({ value: s.file, label: s.name || \"(empty)\", description: `${new Date(s.updatedAt).toLocaleString()} \u00B7 ${s.messages} messages` })),\n (file) => void this.switchSession(file),\n );\n }\n\n private userMessages() {\n return this.ashr.session.getUserMessagesForForking().slice().reverse().map((m) => ({ value: m.entryId, label: m.text.split(\"\\n\")[0] ?? \"\" }));\n }\n\n /** The agent's file changes made at or after `entryId` on the current branch. */\n private changesSince(entryId: string) {\n const branch = this.ashr.session.sessionManager.getBranch();\n const at = branch.findIndex((e) => e.id === entryId);\n return at < 0 ? [] : snapshotsAfter(this.sessionDir, this.ashr.session.sessionId, branch.slice(at).map((e) => e.id));\n }\n\n private offerRestore(snaps: ReturnType<typeof snapshotsAfter>) {\n if (!snaps.length) return;\n const shown = snaps.map((s) => this.subject(\"read\", { path: s.path }));\n this.openPicker(\n [\n { value: \"yes\", label: `Restore ${snaps.length} file${snaps.length === 1 ? \"\" : \"s\"}`, description: shown.join(\", \") },\n { value: \"no\", label: \"Keep files as they are\" },\n ],\n (v) => {\n if (v !== \"yes\") return;\n restore(snaps);\n this.note(`Restored ${shown.join(\", \")}`);\n },\n \"Restores the agent's file edits only. Shell side effects and your own edits are not restored.\",\n );\n }\n\n async pickRewind(): Promise<void> {\n this.openPicker(this.userMessages(), (entryId) => void this.rewindTo(entryId), \"Go back to before this message in this session.\");\n }\n\n private async rewindTo(entryId: string) {\n const snaps = this.changesSince(entryId);\n const result = await this.ashr.session.navigateTree(entryId);\n this.transcript.clear();\n this.seq = 0;\n this.transcript.addChild(this.header);\n this.replay();\n this.note(\"Rewound. Edit the message and send it, or ask something else.\");\n this.input.setText(result.editorText ?? \"\");\n this.offerRestore(snaps);\n this.refreshStatus();\n }\n\n async pickFork(): Promise<void> {\n this.openPicker(this.userMessages(), (entryId) => void this.forkAt(entryId), \"Start a new session from before this message. This session stays as it is.\");\n }\n\n private async forkAt(entryId: string) {\n const sm = this.ashr.session.sessionManager;\n const entry = sm.getEntries().find((e) => e.id === entryId) as { parentId: string | null; message?: { content?: unknown } } | undefined;\n const text = messageText(entry?.message?.content);\n const snaps = this.changesSince(entryId);\n const file = entry?.parentId ? sm.createBranchedSession(entry.parentId) : undefined;\n await this.switchSession(file);\n this.note(\"Forked into a new session. The original is unchanged.\");\n this.input.setText(text);\n this.offerRestore(snaps);\n }\n\n private async switchSession(file: string | undefined) {\n const holder = file ? lockHolder(file) : undefined;\n if (holder) {\n this.note(`That session is open in another terminal (pid ${holder}). Close it there, or /fork it to continue here.`, \"warn\");\n return;\n }\n await this.close();\n this.transcript.clear();\n this.seq = 0;\n try {\n await this.open(file, undefined);\n } catch (err) {\n this.note(`\u2717 ${(err as Error).message}`, \"bad\");\n await this.open(undefined, undefined);\n }\n this.refreshStatus();\n }\n\n async compact(): Promise<void> {\n await this.ashr.session.compact();\n this.refreshStatus();\n }\n\n async setModel(arg: string): Promise<void> {\n const runtime = this.ashr.modelRuntime;\n if (!arg) {\n const models = runtime.getModels().filter((m) => hasKey(m.provider, process.env) || m.provider === this.ashr.session.model?.provider);\n this.openPicker(models.map((m) => ({ value: `${m.provider}/${m.id}`, label: `${m.provider}/${m.id}` })), (v) => void this.setModel(v));\n return;\n }\n try {\n const { model, label } = pickModel(runtime, { requested: arg, env: process.env });\n await this.ashr.session.setModel(model);\n this.ashr.modelLabel = label;\n this.header.set({ org: this.org, model: label });\n this.updateMenuValues();\n this.note(`Model ${label}`);\n } catch (err) {\n this.note(`\u2717 ${(err as Error).message}`, \"bad\");\n }\n }\n\n setMode(arg: string): void {\n const m = arg.trim() as Mode;\n if (![\"ask\", \"edit\", \"auto\"].includes(m)) {\n this.note(`Mode is ${this.mode}. Use /mode ask, /mode edit or /mode auto.`);\n return;\n }\n this.mode = m;\n recordMode(this.ashr.session.sessionManager, m);\n if (m === \"auto\" && !this.autoExplained) {\n this.autoExplained = true;\n this.note(\"Auto mode: everything inside the repo runs without asking. Spend, outside-repo and dangerous commands still ask.\", \"warn\");\n }\n this.updateMenuValues();\n this.refreshStatus();\n }\n\n private cycleMode() {\n this.setMode(this.mode === \"ask\" ? \"edit\" : this.mode === \"edit\" ? \"auto\" : \"ask\");\n }\n\n addDir(path: string): void {\n if (!path) {\n this.note(\"Usage: /add-dir <path>\");\n return;\n }\n const abs = resolve(this.o.repoRoot, path);\n if (!existsSync(abs) || !statSync(abs).isDirectory()) {\n this.note(`\u2717 ${abs} is not a directory.`, \"bad\");\n return;\n }\n this.extraDirs.push(abs);\n this.note(`The agent may use ${abs} for this session.`);\n }\n\n reloadSettings() {\n this.settings = loadSettings(this.o.repoRoot, { trusted: this.trust.trusted, env: this.o.env });\n }\n}\n\n/** Run the interactive app until the user quits. Resolves with the process exit code. */\nexport async function runApp(o: RunAppOptions): Promise<number> {\n const app = new App(o);\n try {\n await app.start();\n } catch (err) {\n app.tui.stop();\n throw err;\n }\n return app.done;\n}\n", "import { createHash } from \"node:crypto\";\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\n\n/**\n * Before the agent changes a file, its previous content is saved under the session entry that changed it,\n * so /fork and /rewind can put the agent's edits back. Only the agent's own edits and writes are covered.\n */\ninterface Snapshot { path: string; existed: boolean; content?: string }\n\nconst root = (dir: string, sessionId: string) => join(dir, sessionId, \"snapshots\");\nconst key = (path: string) => createHash(\"sha256\").update(path).digest(\"hex\").slice(0, 16);\n\nexport function snapshotBefore(dir: string, sessionId: string, entryId: string, path: string): void {\n const file = join(root(dir, sessionId), entryId, `${key(path)}.json`);\n if (existsSync(file)) return;\n mkdirSync(dirname(file), { recursive: true });\n const snap: Snapshot = existsSync(path) ? { path, existed: true, content: readFileSync(path).toString(\"base64\") } : { path, existed: false };\n writeFileSync(file, JSON.stringify(snap));\n}\n\n/** For each file the agent changed in `entryIds` (oldest first), its content before the first of those changes. */\nexport function snapshotsAfter(dir: string, sessionId: string, entryIds: string[]): Array<{ path: string; existed: boolean; content?: Buffer; entryId: string }> {\n const seen = new Map<string, { path: string; existed: boolean; content?: Buffer; entryId: string }>();\n for (const entryId of entryIds) {\n const d = join(root(dir, sessionId), entryId);\n if (!existsSync(d)) continue;\n for (const name of readdirSync(d)) {\n const snap = JSON.parse(readFileSync(join(d, name), \"utf8\")) as Snapshot;\n if (seen.has(snap.path)) continue;\n seen.set(snap.path, { path: snap.path, existed: snap.existed, entryId, ...(snap.content !== undefined ? { content: Buffer.from(snap.content, \"base64\") } : {}) });\n }\n }\n return [...seen.values()];\n}\n\nexport function restore(snaps: ReturnType<typeof snapshotsAfter>): { restored: string[] } {\n for (const s of snaps) {\n if (s.existed) {\n mkdirSync(dirname(s.path), { recursive: true });\n writeFileSync(s.path, s.content ?? Buffer.alloc(0));\n } else rmSync(s.path, { force: true });\n }\n return { restored: snaps.map((s) => s.path) };\n}\n", "import { existsSync, linkSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync } from \"node:fs\";\nimport { SessionManager } from \"@earendil-works/pi-coding-agent\";\nimport type { Mode } from \"../permissions/rules.js\";\n\nexport interface SessionMeta { file: string; id: string; name: string; updatedAt: number; messages: number }\n\nconst MODE_ENTRY = \"ashr-mode\";\n\n/** Sessions for this repo, newest first. A session's name is its first message unless it was renamed. */\nexport async function listSessions(repoRoot: string, dir: string): Promise<SessionMeta[]> {\n if (!existsSync(dir)) return [];\n const infos = await SessionManager.list(repoRoot, dir);\n return infos\n .map((s) => ({ file: s.path, id: s.id, name: s.name ?? s.firstMessage.split(\"\\n\")[0] ?? \"\", updatedAt: s.modified.getTime(), messages: s.messageCount }))\n .sort((a, b) => b.updatedAt - a.updatedAt);\n}\n\nexport async function latestSession(repoRoot: string, dir: string): Promise<SessionMeta | undefined> {\n return (await listSessions(repoRoot, dir))[0];\n}\n\nfunction alive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\n/** The pid holding a session's lock, if a live process holds it. */\nexport function lockHolder(file: string): number | undefined {\n const lock = `${file}.lock`;\n if (!existsSync(lock)) return undefined;\n const pid = Number(readFileSync(lock, \"utf8\").trim());\n return Number.isInteger(pid) && pid > 0 && pid !== process.pid && alive(pid) ? pid : undefined;\n}\n\n/** One terminal per session: a `<file>.lock` holding the owner's pid. A lock whose process is gone is taken over. */\nexport function acquireLock(file: string): { release(): void } | { heldBy: number } {\n const lock = `${file}.lock`;\n for (let attempt = 0; attempt < 3; attempt++) {\n if (createLock(lock)) return { release: () => releaseLock(lock) };\n const holder = livePid(lock);\n if (holder !== undefined) return { heldBy: holder };\n if (justCreated(lock)) continue;\n const stale = `${lock}.${process.pid}.stale`;\n try {\n renameSync(lock, stale);\n } catch {\n continue;\n }\n const taken = livePid(stale);\n if (taken !== undefined) {\n try {\n linkSync(stale, lock);\n } catch {\n // Someone else holds it now; the next attempt sees them.\n }\n unlinkSync(stale);\n return { heldBy: taken };\n }\n unlinkSync(stale);\n }\n throw new Error(`Could not lock ${file}: another process keeps taking it.`);\n}\n\n/** Put a lock holding our pid in place in one step, so it is never seen empty. False when one exists. */\nfunction createLock(lock: string): boolean {\n const tmp = `${lock}.${process.pid}.tmp`;\n writeFileSync(tmp, String(process.pid));\n try {\n linkSync(tmp, lock);\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== \"EEXIST\") throw err;\n return false;\n } finally {\n unlinkSync(tmp);\n }\n}\n\n/** An empty lock younger than a few seconds may still be being written by an older ashr. */\nfunction justCreated(lock: string): boolean {\n try {\n return readFileSync(lock, \"utf8\").trim() === \"\" && Date.now() - statSync(lock).mtimeMs < 5_000;\n } catch {\n return false;\n }\n}\n\n/** The live pid recorded in a lock file; an unreadable lock, a dead pid or an old empty lock counts as stale. */\nfunction livePid(path: string): number | undefined {\n let pid: number;\n try {\n pid = Number(readFileSync(path, \"utf8\").trim());\n } catch {\n return undefined;\n }\n return Number.isInteger(pid) && pid > 0 && alive(pid) ? pid : undefined;\n}\n\nfunction releaseLock(lock: string): void {\n try {\n if (readFileSync(lock, \"utf8\").trim() === String(process.pid)) unlinkSync(lock);\n } catch {\n // Already gone.\n }\n}\n\n/** A resumed session comes back in the mode it was left in, or the configured default. */\nexport function restoredMode(saved: Mode | undefined, fallback: Mode): Mode {\n return saved === \"ask\" || saved === \"edit\" || saved === \"auto\" ? saved : fallback;\n}\n\nexport function recordMode(sm: SessionManager, mode: Mode): void {\n sm.appendCustomEntry(MODE_ENTRY, { mode });\n}\n\nexport function lastRecordedMode(sm: SessionManager): Mode | undefined {\n const entries = sm.getEntries();\n for (let i = entries.length - 1; i >= 0; i--) {\n const e = entries[i] as { type?: string; customType?: string; data?: { mode?: Mode } };\n if (e.type === \"custom\" && e.customType === MODE_ENTRY) return e.data?.mode;\n }\n return undefined;\n}\n", "import type { AppApi } from \"./app-api.js\";\nimport type { MenuGroup } from \"./components/slash-menu.js\";\n\nexport type Group = \"TRAINING\" | \"VIEWS\" | \"SESSION\" | \"SETTINGS\";\n\nexport interface CommandSpec {\n name: string;\n group: Group;\n description: string;\n /** local: changes CLI state; view: shows state without a model call; agent: sends the agent an instruction. */\n kind: \"local\" | \"view\" | \"agent\";\n run(app: AppApi, args: string): Promise<void> | void;\n}\n\nexport const COMMANDS: CommandSpec[] = [\n { name: \"/usage\", group: \"VIEWS\", kind: \"view\", description: \"tokens, context and cost for this session\", run: (app) => app.showUsage() },\n { name: \"/permissions\", group: \"VIEWS\", kind: \"view\", description: \"permission rules; /permissions remove <rule> deletes one of yours\", run: (app, args) => app.showPermissions(args) },\n { name: \"/resume\", group: \"SESSION\", kind: \"local\", description: \"open an earlier session in this repo\", run: (app) => app.pickResume() },\n { name: \"/fork\", group: \"SESSION\", kind: \"local\", description: \"branch a new session from an earlier message\", run: (app) => app.pickFork() },\n { name: \"/rewind\", group: \"SESSION\", kind: \"local\", description: \"go back to an earlier message, optionally restoring files\", run: (app) => app.pickRewind() },\n { name: \"/compact\", group: \"SESSION\", kind: \"local\", description: \"summarise the conversation to free context\", run: (app) => app.compact() },\n { name: \"/model\", group: \"SETTINGS\", kind: \"local\", description: \"switch the model\", run: (app, args) => app.setModel(args) },\n { name: \"/mode\", group: \"SETTINGS\", kind: \"local\", description: \"ask, edit or auto\", run: (app, args) => app.setMode(args) },\n { name: \"/add-dir\", group: \"SETTINGS\", kind: \"local\", description: \"let the agent use another directory this session\", run: (app, args) => app.addDir(args) },\n { name: \"/help\", group: \"SETTINGS\", kind: \"view\", description: \"commands and keys\", run: (app) => app.showHelp() },\n { name: \"/quit\", group: \"SETTINGS\", kind: \"local\", description: \"leave ashr\", run: (app) => app.quit() },\n];\n\nconst ORDER: Group[] = [\"TRAINING\", \"VIEWS\", \"SESSION\", \"SETTINGS\"];\n\n/** The slash menu's rows, with current values (model, mode) shown beside their commands. */\nexport function menuGroups(commands: CommandSpec[], values: Record<string, string>): MenuGroup[] {\n return ORDER.map((label) => ({\n label,\n commands: commands.filter((c) => c.group === label).map((c) => ({ name: c.name, description: c.description, ...(values[c.name] ? { value: values[c.name] } : {}) })),\n })).filter((g) => g.commands.length > 0);\n}\n", "import { wrapTextWithAnsi } from \"@earendil-works/pi-tui\";\nimport type { ApprovalRequest } from \"../../permissions/gate.js\";\nimport type { Theme } from \"../theme.js\";\nimport { Block, line } from \"./layout.js\";\n\nconst COLLAPSED_DETAIL = 12;\n\n/** An approval in the transcript: a violet rail, what will happen, and single-key answers. */\nexport class ApprovalCard extends Block {\n expanded = false;\n /** While focused, a/r/A/e answer the card; Tab hands the keyboard to the input box. */\n focused = true;\n /** Drawn under its tool row: the row already names the tool and what it touches, so the title is left out. */\n attached = false;\n constructor(private t: Theme, readonly req: ApprovalRequest) {\n super();\n }\n toggle() {\n this.expanded = !this.expanded;\n this.changed();\n }\n setFocused(focused: boolean) {\n this.focused = focused;\n this.changed();\n }\n protected draw(width: number): string[] {\n const { t, req } = this;\n // Attached cards sit under their tool row, lined up with the tool name.\n const rail = `${this.attached ? \" \" : \"\"}${t.fg(\"accent\", \"\u2503\")}`;\n const indent = this.attached ? 6 : 4;\n const label = req.kind === \"spend\" ? t.fg(\"warn\", \"SPEND\") : t.fg(\"soft\", \"APPROVAL\");\n const lines: string[] = [];\n if (!this.attached) lines.push(line(`${rail} ${t.bold(t.fg(\"text\", req.title))} ${t.fg(\"text\", req.subject)}`, label, width));\n const detail = this.expanded ? req.detail : req.detail.slice(0, COLLAPSED_DETAIL);\n for (const d of detail) {\n const colour = d.startsWith(\"- \") ? \"bad\" : d.startsWith(\"+ \") ? \"ok\" : \"text\";\n for (const part of wrapTextWithAnsi(d, Math.max(1, width - indent))) lines.push(`${rail} ${t.fg(colour, part)}`);\n }\n if (detail.length < req.detail.length) lines.push(`${rail} ${t.fg(\"soft\", `${req.detail.length - detail.length} more lines`)}`);\n if (req.flags.length) lines.push(`${rail} ${t.fg(\"soft\", req.flags.join(\" \u00B7 \"))}`);\n const keys = [`${t.bold(t.fg(\"accent\", \"a\"))} ${t.bold(t.fg(\"text\", \"approve\"))}`, `${t.fg(\"accent\", \"r\")} ${t.fg(\"soft\", \"reject\")}`];\n if (req.offer) keys.push(`${t.fg(\"accent\", \"A\")} ${t.fg(\"soft\", `always allow ${req.offer}`)}`);\n if (req.detail.length > COLLAPSED_DETAIL) keys.push(`${t.fg(\"accent\", \"e\")} ${t.fg(\"soft\", this.expanded ? \"collapse\" : \"expand\")}`);\n keys.push(t.fg(\"soft\", this.focused ? \"tab to type\" : \"tab to answer\"));\n lines.push(this.attached ? line(`${rail} ${keys.join(\" \")}`, label, width) : `${rail} ${keys.join(\" \")}`);\n return lines;\n }\n}\n", "import { type Component, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\n\n/** A component that re-draws only when its content or the width changes. */\nexport abstract class Block implements Component {\n private cachedWidth = -1;\n private cachedLines: string[] = [];\n render(width: number): string[] {\n if (width !== this.cachedWidth) {\n this.cachedLines = this.draw(width).map((l) => fit(l, width));\n this.cachedWidth = width;\n }\n return this.cachedLines;\n }\n invalidate(): void {\n this.cachedWidth = -1;\n }\n protected changed(): void {\n this.cachedWidth = -1;\n }\n protected abstract draw(width: number): string[];\n}\n\nexport function fit(s: string, width: number): string {\n return visibleWidth(s) > width ? truncateToWidth(s, Math.max(0, width - 1), \"\u2026\") : s;\n}\n\n/** `left` and `right` on one line, right-aligned; the left side is cut first when they do not fit. */\nexport function line(left: string, right: string, width: number): string {\n const r = visibleWidth(right) > width - 2 ? fit(right, Math.max(0, width - 2)) : right;\n const room = width - visibleWidth(r) - 1;\n const l = visibleWidth(left) > room ? fit(left, Math.max(0, room)) : left;\n return l + \" \".repeat(Math.max(1, width - visibleWidth(l) - visibleWidth(r))) + r;\n}\n\nexport function pad(s: string, width: number): string {\n return s + \" \".repeat(Math.max(0, width - visibleWidth(s)));\n}\n\nexport function formatTokens(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${Math.round(n / 1_000)}k`;\n return String(n);\n}\n\nexport function formatDuration(ms: number): string {\n const s = Math.floor(ms / 1000);\n const h = Math.floor(s / 3600);\n const m = Math.floor((s % 3600) / 60);\n if (h > 0) return `${h}h${String(m).padStart(2, \"0\")}m`;\n if (m > 0) return `${m}m${String(s % 60).padStart(2, \"0\")}s`;\n return `${s}s`;\n}\n\nexport function clock(ms: number): string {\n const s = Math.floor(ms / 1000);\n return `${Math.floor(s / 60)}:${String(s % 60).padStart(2, \"0\")}`;\n}\n", "import type { Theme } from \"../theme.js\";\nimport { Block, line } from \"./layout.js\";\n\nexport class Header extends Block {\n constructor(private t: Theme, private info: { org: string; task?: string; model: string }) {\n super();\n }\n set(info: { org: string; task?: string; model: string }) {\n this.info = info;\n this.changed();\n }\n protected draw(width: number): string[] {\n const { t, info } = this;\n const where = [info.org, info.task, info.model].filter(Boolean).join(\" \u00B7 \");\n return [line(` ${t.bold(t.fg(\"text\", \"ashr\"))} ${t.fg(\"accent\", \"labs\")}`, t.fg(\"soft\", where), width), ` ${t.fg(\"hair\", \"\u2500\".repeat(Math.max(0, width - 1)))}`];\n }\n}\n", "import { type Component, Editor, type Focusable, type TUI, truncateToWidth, visibleWidth } from \"@earendil-works/pi-tui\";\nimport { editorTheme, type Theme } from \"../theme.js\";\n\nconst PLACEHOLDER = \"Ask, build, or steer the agent\u2026\";\n\n/** pi-tui's editor inside a square frame with the violet prompt mark. */\nexport class InputBox implements Component, Focusable {\n readonly editor: Editor;\n constructor(tui: TUI, private t: Theme) {\n this.editor = new Editor(tui, editorTheme(t), { paddingX: 1 });\n }\n get focused(): boolean {\n return (this.editor as unknown as Focusable).focused;\n }\n set focused(v: boolean) {\n (this.editor as unknown as Focusable).focused = v;\n }\n set onSubmit(fn: ((text: string) => void) | undefined) {\n this.editor.onSubmit = fn;\n }\n getText(): string {\n return this.editor.getText();\n }\n setText(text: string): void {\n this.editor.setText(text);\n }\n handleInput(data: string): void {\n this.editor.handleInput(data);\n }\n invalidate(): void {\n this.editor.invalidate();\n }\n render(width: number): string[] {\n const { t } = this;\n const inner = Math.max(4, width - 3);\n const rendered = this.editor.render(inner);\n // The editor draws a rule above and below its text; anything after the second rule is its autocomplete list.\n const bottom = rendered.findIndex((l, i) => i > 0 && /^[\u2500\\s]*$/.test(l.replace(/\\x1b\\[[0-9;]*m/g, \"\")) && l.includes(\"\u2500\"));\n const content = rendered.slice(1, bottom > 0 ? bottom : rendered.length);\n const below = bottom > 0 ? rendered.slice(bottom + 1) : [];\n const bar = t.fg(\"hair\", \"\u2502\");\n const empty = this.getText() === \"\";\n const body = content.map((l, i) => {\n let text = l;\n if (empty && i === 0) {\n const cursor = l.match(/^\\s*\\x1b\\[7m.\\x1b\\[0m/)?.[0] ?? \" \";\n text = truncateToWidth(`${cursor}${t.fg(\"soft\", PLACEHOLDER)}`, inner, \"\u2026\");\n }\n const padded = text + \" \".repeat(Math.max(0, inner - visibleWidth(text)));\n return `${bar}${i === 0 ? t.fg(\"accent\", \"\u203A\") : \" \"}${truncateToWidth(padded, inner, \"\")}${bar}`;\n });\n return [\n t.fg(\"hair\", `\u250C${\"\u2500\".repeat(width - 2)}\u2510`),\n ...body,\n t.fg(\"hair\", `\u2514${\"\u2500\".repeat(width - 2)}\u2518`),\n ...below.map((l) => truncateToWidth(l, width, \"\")),\n ];\n }\n}\n", "import type { EditorTheme, MarkdownTheme } from \"@earendil-works/pi-tui\";\n\nexport type Role = \"text\" | \"soft\" | \"hair\" | \"accent\" | \"ok\" | \"bad\" | \"warn\";\nexport type Background = \"light\" | \"dark\";\nexport type ColorMode = \"truecolor\" | \"256\" | \"none\";\n\n/** The Ashr palette, from the dashboard's tokens: paper, ink, violet; muted rust/amber/emerald for status. */\nconst PALETTES: Record<Background, Record<Role, string>> = {\n dark: { text: \"#f3f0e8\", soft: \"#a8a49a\", hair: \"#4a473f\", accent: \"#867afe\", ok: \"#34c38f\", bad: \"#e07a5f\", warn: \"#d4a24c\" },\n light: { text: \"#141310\", soft: \"#57544c\", hair: \"#a29c90\", accent: \"#4d41d0\", ok: \"#0f8f62\", bad: \"#b3452b\", warn: \"#8f5f10\" },\n};\n\nexport interface Theme {\n background: Background;\n mode: ColorMode;\n fg(role: Role, s: string): string;\n bold(s: string): string;\n dim(s: string): string;\n italic(s: string): string;\n}\n\ntype Rgb = [number, number, number];\nconst rgb = (hex: string): Rgb => [1, 3, 5].map((i) => parseInt(hex.slice(i, i + 2), 16)) as Rgb;\n\n/** Nearest xterm-256 colour: the 6x6x6 cube or the grey ramp, whichever is closer. */\nfunction to256([r, g, b]: Rgb): number {\n const step = (v: number) => (v < 48 ? 0 : v < 115 ? 1 : Math.min(5, Math.round((v - 35) / 40)));\n const level = (i: number) => (i === 0 ? 0 : 55 + i * 40);\n const [qr, qg, qb] = [step(r), step(g), step(b)];\n const cube = 16 + 36 * qr + 6 * qg + qb;\n const avg = Math.round((r + g + b) / 3);\n const greyIndex = avg > 238 ? 255 : avg < 8 ? 232 : 232 + Math.round((avg - 8) / 10);\n const greyLevel = 8 + (greyIndex - 232) * 10;\n const dist = (c: number[]) => (c[0]! - r) ** 2 + (c[1]! - g) ** 2 + (c[2]! - b) ** 2;\n return dist([level(qr), level(qg), level(qb)]) <= dist([greyLevel, greyLevel, greyLevel]) ? cube : greyIndex;\n}\n\nexport function colorMode(env: NodeJS.ProcessEnv = process.env): ColorMode {\n if (env.NO_COLOR !== undefined && env.NO_COLOR !== \"\") return \"none\";\n if (/truecolor|24bit/i.test(env.COLORTERM ?? \"\")) return \"truecolor\";\n return \"256\";\n}\n\n/** Light or dark palette: `ASHR_THEME` wins, then the terminal's reported background, then dark. */\nexport function detectBackground(env: NodeJS.ProcessEnv = process.env, color?: { r: number; g: number; b: number }): Background {\n if (env.ASHR_THEME === \"light\" || env.ASHR_THEME === \"dark\") return env.ASHR_THEME;\n if (color) return (0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b) / 255 > 0.5 ? \"light\" : \"dark\";\n return \"dark\";\n}\n\nexport function createTheme({ background, mode }: { background: Background; mode: ColorMode }): Theme {\n const palette = PALETTES[background];\n const wrap = (open: string, close: string) => (s: string) => (mode === \"none\" ? s : `${open}${s}${close}`);\n return {\n background,\n mode,\n fg(role, s) {\n if (mode === \"none\") return s;\n const c = rgb(palette[role]);\n const open = mode === \"truecolor\" ? `\\x1b[38;2;${c[0]};${c[1]};${c[2]}m` : `\\x1b[38;5;${to256(c)}m`;\n return `${open}${s}\\x1b[39m`;\n },\n bold: wrap(\"\\x1b[1m\", \"\\x1b[22m\"),\n dim: wrap(\"\\x1b[2m\", \"\\x1b[22m\"),\n italic: wrap(\"\\x1b[3m\", \"\\x1b[23m\"),\n };\n}\n\nexport function markdownTheme(t: Theme): MarkdownTheme {\n const f = (role: Role) => (s: string) => t.fg(role, s);\n return {\n heading: (s) => t.bold(t.fg(\"text\", s)),\n link: f(\"accent\"),\n linkUrl: f(\"soft\"),\n code: f(\"accent\"),\n codeBlock: f(\"text\"),\n codeBlockBorder: f(\"hair\"),\n quote: f(\"soft\"),\n quoteBorder: f(\"hair\"),\n hr: f(\"hair\"),\n listBullet: f(\"soft\"),\n bold: t.bold,\n italic: t.italic,\n strikethrough: (s) => s,\n underline: (s) => s,\n };\n}\n\nexport function editorTheme(t: Theme): EditorTheme {\n return {\n borderColor: (s) => t.fg(\"hair\", s),\n selectList: {\n selectedPrefix: (s) => t.fg(\"accent\", s),\n selectedText: (s) => t.bold(t.fg(\"accent\", s)),\n description: (s) => t.fg(\"soft\", s),\n scrollInfo: (s) => t.fg(\"soft\", s),\n noMatch: (s) => t.fg(\"soft\", s),\n },\n };\n}\n", "import type { Mode, Rule } from \"../../permissions/rules.js\";\nimport type { Theme } from \"../theme.js\";\nimport { Block, formatDuration, formatTokens, line } from \"./layout.js\";\n\nexport interface UsageStats {\n model: string;\n tokens: { input: number; output: number; cacheRead: number; total: number };\n contextPercent: number | null;\n contextWindow: number;\n cost: number;\n turns: number;\n toolCalls: number;\n elapsedMs: number;\n}\n\nfunction heading(t: Theme, title: string, sub: string, width: number): string[] {\n return [line(` ${t.bold(t.fg(\"text\", title))} ${t.fg(\"soft\", sub)}`, t.fg(\"soft\", \"esc close\"), width), ` ${t.fg(\"hair\", \"\u2500\".repeat(Math.max(0, width - 1)))}`];\n}\n\nexport class UsagePanel extends Block {\n constructor(private t: Theme, private s: UsageStats) {\n super();\n }\n protected draw(width: number): string[] {\n const { t, s } = this;\n const row = (label: string, value: string) => ` ${t.fg(\"soft\", label.padEnd(12))}${value}`;\n const pct = s.contextPercent;\n const filled = pct === null ? 0 : Math.max(0, Math.min(20, Math.round(pct / 5)));\n const cached = s.tokens.input ? Math.round((100 * s.tokens.cacheRead) / (s.tokens.input + s.tokens.cacheRead)) : 0;\n return [\n ...heading(t, \"Usage\", \"this session\", width),\n row(\"MODEL\", t.fg(\"text\", s.model)),\n row(\"TOKENS\", `${t.fg(\"text\", s.tokens.total.toLocaleString(\"en-US\"))} ${t.fg(\"soft\", `in ${s.tokens.input.toLocaleString(\"en-US\")} \u00B7 out ${s.tokens.output.toLocaleString(\"en-US\")} \u00B7 ${cached}% cached`)}`),\n row(\"CONTEXT\", `${t.fg(\"accent\", \"\u25AE\".repeat(filled))}${t.fg(\"hair\", \"\u25AE\".repeat(20 - filled))} ${t.fg(\"text\", pct === null ? \"\u2014\" : `${Math.round(pct)}%`)} ${t.fg(\"soft\", `of ${formatTokens(s.contextWindow)} \u00B7 compacts automatically near the limit`)}`),\n row(\"MODEL COST\", t.fg(\"text\", `$${s.cost.toFixed(2)}`)),\n row(\"SESSION\", `${t.fg(\"text\", formatDuration(s.elapsedMs))} ${t.fg(\"soft\", `\u00B7 ${s.turns} turns \u00B7 ${s.toolCalls} tool calls`)}`),\n ];\n }\n}\n\nexport interface PermissionsView { mode: Mode; allow: Rule[]; deny: Rule[]; ignored: string[] }\n\nexport class PermissionsPanel extends Block {\n constructor(private t: Theme, private v: PermissionsView) {\n super();\n }\n protected draw(width: number): string[] {\n const { t, v } = this;\n const longest = Math.max(10, ...[...v.allow, ...v.deny].map((r) => r.text.length), ...v.ignored.map((r) => r.length));\n const rows = [\n ...v.deny.map((r) => ` ${t.fg(\"bad\", \"DENY \")} ${t.fg(\"text\", r.text.padEnd(longest))} ${t.fg(\"soft\", r.source)}`),\n ...v.allow.map((r) => ` ${t.fg(\"ok\", \"ALLOW\")} ${t.fg(\"text\", r.text.padEnd(longest))} ${t.fg(\"soft\", r.source)}`),\n ...v.ignored.map((r) => ` ${t.fg(\"hair\", \"ALLOW\")} ${t.fg(\"soft\", r.padEnd(longest))} ${t.fg(\"warn\", \"not trusted \u00B7 .ashr/settings.json\")}`),\n ];\n return [\n ...heading(t, \"Permissions\", `mode ${v.mode}`, width),\n ...(rows.length ? rows : [` ${t.fg(\"soft\", \"No rules yet. Answer A on an approval to save one.\")}`]),\n \"\",\n ` ${t.fg(\"soft\", \"Rules live in ~/.ashr/settings.json, .ashr/settings.json (team) and .ashr/settings.local.json (you).\")}`,\n ];\n }\n}\n", "import type { Theme } from \"../theme.js\";\nimport { Block } from \"./layout.js\";\n\nexport interface MenuCommand { name: string; description: string; value?: string }\nexport interface MenuGroup { label: string; commands: MenuCommand[] }\n\n/** The `/` menu: one row per kind of command, the highlighted one described underneath. */\nexport class SlashMenu extends Block {\n private prefix = \"/\";\n private index = 0;\n constructor(private t: Theme, private groups: MenuGroup[]) {\n super();\n }\n private visible(): MenuGroup[] {\n return this.groups\n .map((g) => ({ label: g.label, commands: g.commands.filter((c) => c.name.startsWith(this.prefix)) }))\n .filter((g) => g.commands.length > 0);\n }\n private flat(): MenuCommand[] {\n return this.visible().flatMap((g) => g.commands);\n }\n setGroups(groups: MenuGroup[]) {\n this.groups = groups;\n this.changed();\n }\n filter(prefix: string) {\n this.prefix = prefix || \"/\";\n this.index = 0;\n this.changed();\n }\n isEmpty(): boolean {\n return this.flat().length === 0;\n }\n selected(): MenuCommand | undefined {\n return this.flat()[this.index];\n }\n /** dx moves along the list; dy jumps to the first command of the next or previous group. */\n move(dx: number, dy: number) {\n const flat = this.flat();\n if (!flat.length) return;\n if (dx) this.index = (this.index + dx + flat.length) % flat.length;\n if (dy) {\n const groups = this.visible();\n const current = groups.findIndex((g) => g.commands.includes(flat[this.index]!));\n const target = groups[(current + dy + groups.length) % groups.length]!;\n this.index = flat.indexOf(target.commands[0]!);\n }\n this.changed();\n }\n protected draw(): string[] {\n const { t } = this;\n const sel = this.selected();\n const rows = this.visible().map((g) => {\n const items = g.commands.map((c) => {\n const name = c === sel ? t.bold(t.fg(\"accent\", c.name)) : t.fg(\"text\", c.name);\n return c.value ? `${name} ${t.fg(\"soft\", c.value)}` : name;\n });\n return ` ${t.fg(\"soft\", g.label.padEnd(10))}${items.join(\" \")}`;\n });\n if (!sel) return [` ${t.fg(\"soft\", \"No command starts with that. Enter sends it to the agent.\")}`];\n return [...rows, \"\", ` ${t.fg(\"accent\", sel.name)} ${t.fg(\"soft\", sel.description)}`];\n }\n}\n", "import type { Mode } from \"../../permissions/rules.js\";\nimport type { Theme } from \"../theme.js\";\nimport { Block, formatTokens, line } from \"./layout.js\";\n\nexport interface StatusInfo {\n mode: Mode;\n tokens: number;\n cost: number;\n contextPercent: number | null;\n /** Live background runs, already formatted, e.g. \"trained 6h12m $41.20\". */\n runs: string[];\n streaming: boolean;\n hint?: string;\n}\n\nconst MODE_COLOUR = { ask: \"text\", edit: \"text\", auto: \"accent\" } as const;\n\n/** Mode \u00B7 live runs \u00B7 context bar \u00B7 tokens \u00B7 cost, with `esc stop` while the agent works. */\nexport class StatusLine extends Block {\n private info: StatusInfo = { mode: \"ask\", tokens: 0, cost: 0, contextPercent: null, runs: [], streaming: false };\n constructor(private t: Theme) {\n super();\n }\n set(info: Partial<StatusInfo>) {\n this.info = { ...this.info, ...info };\n this.changed();\n }\n get current(): StatusInfo {\n return this.info;\n }\n protected draw(width: number): string[] {\n const { t, info } = this;\n const dot = t.fg(\"soft\", \" \u00B7 \");\n const pct = info.contextPercent;\n const filled = pct === null ? 0 : Math.max(0, Math.min(10, Math.round(pct / 10)));\n const bar = `${t.fg(\"accent\", \"\u25AE\".repeat(filled))}${t.fg(\"hair\", \"\u25AE\".repeat(10 - filled))} ${t.fg(\"soft\", pct === null ? \"\u2014\" : `${Math.round(pct)}%`)}`;\n const parts = [t.fg(MODE_COLOUR[info.mode], info.mode), ...info.runs.map((r) => `${t.fg(\"warn\", \"\u25D0\")} ${t.fg(\"text\", r)}`), bar, t.fg(\"soft\", formatTokens(info.tokens)), t.fg(\"soft\", `$${info.cost.toFixed(2)}`)];\n const right = info.streaming ? t.fg(\"soft\", \"esc stop\") : t.fg(\"soft\", info.hint ?? \"\");\n return [line(` ${parts.join(dot)}`, right, width)];\n }\n}\n", "import type { Theme } from \"../theme.js\";\nimport { Block, clock, line } from \"./layout.js\";\n\ntype State = { kind: \"running\"; elapsedMs: number } | { kind: \"done\"; summary: string; output: string } | { kind: \"failed\"; summary: string; output: string };\n\n/** One tool call: a violet sequence number, the tool, what it touched, and a lowercase status. */\nexport class ToolRow extends Block {\n private state: State = { kind: \"running\", elapsedMs: 0 };\n expanded = false;\n private waiting = false;\n constructor(private t: Theme, readonly info: { seq: number; name: string; subject: string }) {\n super();\n }\n /** While its approval card waits, the row says so instead of counting up. */\n setWaiting(waiting: boolean) {\n this.waiting = waiting;\n this.changed();\n }\n setRunning(elapsedMs: number) {\n this.state = { kind: \"running\", elapsedMs };\n this.changed();\n }\n finish(r: { isError: boolean; summary: string; output?: string }) {\n const output = r.output ?? r.summary;\n this.state = r.isError ? { kind: \"failed\", summary: r.summary, output } : { kind: \"done\", summary: r.summary, output };\n this.changed();\n }\n toggle() {\n this.expanded = !this.expanded;\n this.changed();\n }\n get finished(): boolean {\n return this.state.kind !== \"running\";\n }\n protected draw(width: number): string[] {\n const { t, info, state } = this;\n const left = ` ${t.fg(\"soft\", info.name.padEnd(5))} ${t.fg(\"text\", info.subject.replace(/\\s*\\n\\s*/g, \" \"))}`;\n const status =\n state.kind === \"running\" ? t.fg(\"warn\", this.waiting ? \"needs approval\" : `running ${clock(state.elapsedMs)}`) : state.kind === \"done\" ? t.fg(\"ok\", \"done\") : t.fg(\"bad\", \"failed\");\n const lines = [line(left, status, width)];\n if (state.kind === \"running\") return lines;\n if (this.expanded) {\n for (const l of state.output.split(\"\\n\")) lines.push(` ${t.fg(state.kind === \"failed\" ? \"bad\" : \"soft\", l)}`);\n } else if (state.kind === \"failed\" && state.summary) {\n lines.push(` ${t.fg(\"bad\", state.summary)}`);\n }\n return lines;\n }\n}\n", "import { Markdown } from \"@earendil-works/pi-tui\";\nimport { markdownTheme, type Theme } from \"../theme.js\";\nimport { Block } from \"./layout.js\";\n\nconst INDENT = 7;\n\nexport class UserTurn extends Block {\n constructor(private t: Theme, private text: string) {\n super();\n }\n protected draw(): string[] {\n const [first = \"\", ...rest] = this.text.split(\"\\n\");\n return [\"\", ` ${this.t.fg(\"accent\", \"\u203A\")} ${this.t.fg(\"text\", first)}`, ...rest.map((l) => ` ${this.t.fg(\"text\", l)}`)];\n }\n}\n\n/** The agent's reply: an `Ashr` label, then markdown streamed in as it arrives. */\nexport class AssistantTurn extends Block {\n private text = \"\";\n private note: string | undefined;\n private readonly md: Markdown;\n constructor(private t: Theme) {\n super();\n this.md = new Markdown(\"\", 0, 0, markdownTheme(t));\n }\n append(delta: string) {\n this.text += delta;\n this.md.setText(this.text);\n this.changed();\n }\n hasText(): boolean {\n return this.text.trim().length > 0;\n }\n /** A soft trailing line, e.g. \"stopped by you\". */\n setNote(note: string) {\n this.note = note;\n this.changed();\n }\n protected draw(width: number): string[] {\n const { t } = this;\n const body = this.text ? this.md.render(Math.max(10, width - INDENT)) : [\"\"];\n const label = ` ${t.bold(t.fg(\"accent\", \"Ashr\"))} `;\n const lines = [\"\", ...body.map((l, i) => (i === 0 ? label : \" \".repeat(INDENT)) + l)];\n if (this.note) lines.push(`${\" \".repeat(INDENT)}${t.fg(\"soft\", this.note)}`);\n return lines;\n }\n}\n", "import type { CommandSpec } from \"./commands.js\";\n\nexport type Routed =\n | { kind: \"command\"; spec: CommandSpec; args: string }\n | { kind: \"prompt\"; text: string }\n | { kind: \"unknown\"; name: string; suggestions: string[] };\n\nfunction distance(a: string, b: string): number {\n const row = Array.from({ length: b.length + 1 }, (_, i) => i);\n for (let i = 1; i <= a.length; i++) {\n let prev = row[0]!;\n row[0] = i;\n for (let j = 1; j <= b.length; j++) {\n const cur = row[j]!;\n row[j] = Math.min(row[j]! + 1, row[j - 1]! + 1, prev + (a[i - 1] === b[j - 1] ? 0 : 1));\n prev = cur;\n }\n }\n return row[b.length]!;\n}\n\n/**\n * A line is a command only when its first word is a registered command. A near-miss like `/mdoel` is\n * caught rather than sent to the model; anything else, including paths that start with `/`, is a prompt.\n */\nexport function route(input: string, commands: CommandSpec[]): Routed {\n const text = input.trim();\n const first = text.split(/\\s/, 1)[0] ?? \"\";\n const spec = commands.find((c) => c.name === first);\n if (spec) return { kind: \"command\", spec, args: text.slice(first.length).trim() };\n if (/^\\/[a-z-]+$/.test(first)) {\n const suggestions = commands.map((c) => c.name).filter((n) => distance(n, first) <= 2);\n if (suggestions.length) return { kind: \"unknown\", name: first, suggestions };\n }\n return { kind: \"prompt\", text };\n}\n", "import { spawn } from \"node:child_process\";\nimport { hostname } from \"node:os\";\nimport { ProcessTerminal, type Terminal } from \"@earendil-works/pi-tui\";\nimport type { Args } from \"../args.js\";\nimport { writeCredentials, type Credentials } from \"../platform/credentials.js\";\nimport { DEFAULT_API_URL, KeyRejectedError, validateKey } from \"../platform/manifold.js\";\nimport { startTerminalLogin } from \"../platform/terminal-login.js\";\nimport { ManifoldClient } from \"./client.js\";\nimport { runHostedApp, type HostedAppHandle, type RunHostedAppOptions } from \"./app.js\";\nimport { dashboardHelpLines, runDashboardCommand } from \"./dashboard.js\";\nimport { terminalText } from \"./workspace.js\";\n\nconst DEFAULT_DASHBOARD_URL = \"https://manifold.ashr.io\";\n\nconst accountHelp = [\n \"/account who this terminal is signed in as\",\n \"/org open organization settings in the dashboard\",\n \"/login sign in again, e.g. to switch organization\",\n \"/logout sign this terminal out\",\n];\n\ninterface EntryOptions {\n env?: NodeJS.ProcessEnv;\n terminal?: Terminal;\n startLogin?: typeof startTerminalLogin;\n validate?: typeof validateKey;\n saveCredentials?: (credentials: Credentials) => void;\n run?: (options: RunHostedAppOptions) => Promise<number>;\n fetch?: typeof fetch;\n write?: (text: string) => void;\n openBrowser?: (url: string) => Promise<void>;\n interactive?: boolean;\n}\n\nfunction openBrowser(url: string): Promise<void> {\n const program = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"explorer.exe\" : \"xdg-open\";\n const child = spawn(program, [url], { stdio: \"ignore\", detached: true });\n child.unref();\n return new Promise((resolve, reject) => {\n child.once(\"error\", reject);\n child.once(\"exit\", (code) => code === 0 ? resolve() : reject(Error(\"Browser could not open\")));\n });\n}\n\nconst color = (on: boolean) => {\n const wrap = (code: string) => (text: string) => on ? `\\x1b[${code}m${text}\\x1b[0m` : text;\n return { bold: wrap(\"1\"), dim: wrap(\"2\"), accent: wrap(\"38;2;134;122;254\"), green: wrap(\"32\"), red: wrap(\"31\") };\n};\n\n/** Sign in through the dashboard and return saved credentials. */\nasync function signIn(apiUrl: string, dashboardUrl: string, credentials: Credentials, options: EntryOptions, reason?: string): Promise<Credentials[\"manifold\"]> {\n const write = options.write ?? ((text: string) => process.stdout.write(text));\n const tty = options.interactive ?? !!process.stdout.isTTY;\n const c = color(tty);\n const abort = new AbortController();\n const onInterrupt = () => abort.abort();\n process.once(\"SIGINT\", onInterrupt);\n const frames = [\"\u280B\", \"\u2819\", \"\u2839\", \"\u2838\", \"\u283C\", \"\u2834\", \"\u2826\", \"\u2827\", \"\u2807\", \"\u280F\"];\n let spinner: ReturnType<typeof setInterval> | undefined;\n try {\n write(`\\n ${c.bold(\"ashr\")} ${c.dim(\"\u00B7 Manifold\")}\\n\\n`);\n if (reason) write(` ${reason}\\n\\n`);\n const login = await (options.startLogin ?? startTerminalLogin)({\n dashboardUrl, device: hostname().replace(/\\.local$/, \"\"), signal: abort.signal,\n onUrl: (url) => {\n write(` Sign in to continue. Opening your browser\u2026\\n ${c.dim(\"If it doesn't open, visit:\")}\\n ${c.accent(url)}\\n\\n`);\n void (options.openBrowser ?? openBrowser)(url).catch(() => {});\n if (tty) {\n let frame = 0;\n const line = () => `\\r ${c.accent(frames[frame++ % frames.length]!)} Waiting for you to approve in the browser ${c.dim(\"\u00B7 Ctrl+C to cancel\")}`;\n write(line());\n spinner = setInterval(() => write(line()), 80);\n } else write(\" Waiting for you to approve in the browser\u2026\\n\");\n },\n });\n if (spinner) { clearInterval(spinner); spinner = undefined; write(\"\\r\\x1b[2K\"); }\n await (options.validate ?? validateKey)(apiUrl, login.key, options.fetch);\n const saved = { apiUrl, key: login.key, profile: credentials.manifold?.profile ?? \"default\", email: login.email, organization: login.organization };\n (options.saveCredentials ?? writeCredentials)({ ...credentials, manifold: saved });\n const who = [login.email, login.organization].filter(Boolean).map((v) => terminalText(v)).join(c.dim(\" \u00B7 \"));\n write(` ${c.green(\"\u2713\")} Signed in${who ? ` as ${c.bold(who)}` : \"\"}\\n\\n`);\n return saved;\n } catch (error) {\n if (spinner) { clearInterval(spinner); write(\"\\r\\x1b[2K\"); }\n if (abort.signal.aborted) { write(` Sign-in cancelled.\\n`); return undefined; }\n write(` ${c.red(\"\u2717\")} ${terminalText((error as Error).message)}\\n`);\n throw error;\n } finally {\n process.removeListener(\"SIGINT\", onInterrupt);\n }\n}\n\n/** `ashr login`: sign in through the browser and exit. */\nexport async function runLogin(args: Args, credentials: Credentials, options: EntryOptions = {}): Promise<number> {\n const env = options.env ?? process.env;\n const apiUrl = args.apiUrl ?? env.MANIFOLD_API_URL ?? DEFAULT_API_URL;\n const dashboardUrl = args.dashboardUrl ?? env.MANIFOLD_DASHBOARD_URL ?? DEFAULT_DASHBOARD_URL;\n return await signIn(apiUrl, dashboardUrl, credentials, options) ? 0 : 130;\n}\n\nexport async function runHostedEntry(args: Args, credentials: Credentials, options: EntryOptions = {}): Promise<number> {\n const env = options.env ?? process.env;\n const write = options.write ?? ((text: string) => process.stdout.write(text));\n const apiUrl = args.apiUrl ?? env.MANIFOLD_API_URL ?? credentials.manifold?.apiUrl ?? DEFAULT_API_URL;\n const dashboardUrl = args.dashboardUrl ?? env.MANIFOLD_DASHBOARD_URL ?? DEFAULT_DASHBOARD_URL;\n const explicit = args.key ?? env.MANIFOLD_API_KEY;\n const save = options.saveCredentials ?? writeCredentials;\n let saved = !explicit && credentials.manifold && credentials.manifold.apiUrl === apiUrl ? credentials.manifold : undefined;\n let token = explicit;\n\n if (!token && args.service) throw Error(\"No Manifold service key. Set MANIFOLD_API_KEY or run ashr login --key <key>.\");\n if (!token && saved) {\n try {\n await (options.validate ?? validateKey)(apiUrl, saved.key, options.fetch);\n token = saved.key;\n } catch (error) {\n // A revoked key needs a fresh sign-in; anything else (offline, outage) is reported as-is.\n if (!(error instanceof KeyRejectedError && error.status === 401)) throw error;\n const { manifold: _revoked, ...rest } = credentials;\n credentials = rest;\n save(credentials);\n saved = await signIn(apiUrl, dashboardUrl, credentials, options, \"This terminal's sign-in was revoked. Sign in again.\");\n if (!saved) return 130;\n credentials = { ...credentials, manifold: saved };\n token = saved.key;\n }\n }\n if (!token) {\n saved = await signIn(apiUrl, dashboardUrl, credentials, options);\n if (!saved) return 130;\n credentials = { ...credentials, manifold: saved };\n token = saved.key;\n }\n\n const current = { token: token! };\n const client = new ManifoldClient({ apiUrl, getToken: () => Promise.resolve(current.token), fetch: options.fetch });\n let task = args.task, chat = args.chat;\n for (;;) {\n let handle: HostedAppHandle | undefined;\n let next: \"login\" | \"logout\" | undefined;\n const result = await (options.run ?? runHostedApp)({\n client, terminal: options.terminal ?? new ProcessTerminal(), task, chat, env,\n onReady: (value) => { handle = value; },\n runDashboardCommand: async (input, context) => {\n if (input === \"/help\") {\n context.show(\"Dashboard commands\", dashboardHelpLines.join(\"\\n\"));\n context.show(\"Account\", accountHelp.join(\"\\n\"));\n return false;\n }\n if (input === \"/login\" || input === \"/logout\") {\n if (explicit) throw Error(\"This session uses MANIFOLD_API_KEY or --key; unset it to sign in through the browser.\");\n next = input === \"/login\" ? \"login\" : \"logout\";\n handle?.quit();\n return true;\n }\n if (input === \"/account\") {\n context.show(\"Account\", saved\n ? [`Signed in as ${saved.email ?? \"unknown account\"}`, `Organization: ${saved.organization ?? \"\u2014\"}`, `API: ${apiUrl}`, `Key: ${saved.key.slice(0, 12)}\u2026`].join(\"\\n\")\n : `Using a service key (${current.token.slice(0, 12)}\u2026) against ${apiUrl}.`);\n return true;\n }\n if (input === \"/account settings\" || /^\\/org(?:\\s|$)/.test(input)) {\n const url = new URL(\"/?view=organization\", dashboardUrl).toString();\n void (options.openBrowser ?? openBrowser)(url).catch(() => {});\n context.show(\"Opened in your browser\", url);\n return true;\n }\n return runDashboardCommand(input, context);\n },\n });\n if (!next) return result;\n const { manifold: _signedOut, ...rest } = credentials;\n credentials = rest;\n save(credentials);\n if (next === \"logout\") {\n write(\"Signed out. The terminal key stays listed under API keys in Manifold until an admin revokes it.\\n\");\n return 0;\n }\n saved = await signIn(apiUrl, dashboardUrl, credentials, options);\n if (!saved) return 130;\n credentials = { ...credentials, manifold: saved };\n current.token = saved.key;\n task = undefined; chat = undefined;\n }\n}\n", "import { createServer, type IncomingMessage, type ServerResponse } from \"node:http\";\nimport { randomBytes, timingSafeEqual } from \"node:crypto\";\n\nexport interface TerminalLogin {\n key: string;\n email?: string;\n organization?: string;\n}\n\nconst same = (a: string, b: string): boolean =>\n Buffer.byteLength(a) === Buffer.byteLength(b) && timingSafeEqual(Buffer.from(a), Buffer.from(b));\n\nasync function readForm(request: IncomingMessage): Promise<URLSearchParams> {\n let length = 0;\n const chunks: Buffer[] = [];\n for await (const chunk of request) {\n length += chunk.length;\n if (length > 16384) throw Error(\"Too large\");\n chunks.push(chunk);\n }\n return new URLSearchParams(Buffer.concat(chunks).toString());\n}\n\n/**\n * Sign this terminal in through the Manifold dashboard. The dashboard mints the\n * terminal's own key and posts it back once to a loopback listener; after that\n * the browser tab can close. The listener stops after one valid answer.\n */\nexport async function startTerminalLogin(options: {\n dashboardUrl: string;\n device: string;\n onUrl: (url: string) => void;\n signal?: AbortSignal;\n}): Promise<TerminalLogin> {\n const dashboard = new URL(options.dashboardUrl);\n if (dashboard.protocol !== \"https:\" && !(dashboard.protocol === \"http:\" && [\"127.0.0.1\", \"localhost\"].includes(dashboard.hostname)))\n throw Error(\"Dashboard must use HTTPS (or explicitly configured local development).\");\n if (dashboard.username || dashboard.password) throw Error(\"Dashboard URL cannot contain credentials.\");\n if (options.signal?.aborted) throw Error(\"Sign-in cancelled.\");\n const state = randomBytes(32).toString(\"hex\");\n let host = \"\";\n let settle: { resolve: (login: TerminalLogin) => void; reject: (error: Error) => void } | undefined;\n const result = new Promise<TerminalLogin>((resolve, reject) => { settle = { resolve, reject }; });\n\n const page = (response: ServerResponse, status: number, title: string, detail: string) => {\n response.writeHead(status, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Content-Security-Policy\": \"default-src 'none'; style-src 'unsafe-inline'; frame-ancestors 'none'\",\n });\n response.end(resultPage(title, detail));\n };\n const server = createServer(async (request, response) => {\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Referrer-Policy\", \"no-referrer\");\n response.setHeader(\"X-Content-Type-Options\", \"nosniff\");\n if (request.headers.host !== host || request.method !== \"POST\" || request.url !== \"/callback\" ||\n (request.headers.origin !== undefined && request.headers.origin !== \"null\" && request.headers.origin !== dashboard.origin)) {\n page(response, 403, \"This link doesn't belong to this terminal.\", \"Run ashr again to start a new sign-in.\");\n return;\n }\n let form: URLSearchParams;\n try { form = await readForm(request); }\n catch { page(response, 400, \"Sign-in failed.\", \"Run ashr again to start a new sign-in.\"); return; }\n if (!same(form.get(\"state\") ?? \"\", state)) {\n page(response, 403, \"This link doesn't belong to this terminal.\", \"Run ashr again to start a new sign-in.\");\n return;\n }\n if (form.get(\"error\")) {\n page(response, 200, \"Sign-in cancelled.\", \"Nothing was shared. You can close this tab.\");\n finish(Error(\"Sign-in was cancelled in the browser.\"));\n return;\n }\n const key = form.get(\"key\") ?? \"\";\n if (!/^ask_[A-Za-z0-9]{8,200}$/.test(key)) {\n page(response, 400, \"Sign-in failed.\", \"Manifold didn't return a usable key. Run ashr again.\");\n finish(Error(\"The dashboard returned no usable key.\"));\n return;\n }\n page(response, 200, \"You're signed in.\", \"Return to your terminal. You can close this tab.\");\n finish(undefined, { key, email: form.get(\"email\") || undefined, organization: form.get(\"organization\") || undefined });\n });\n server.requestTimeout = 10000;\n server.headersTimeout = 10000;\n // Ten minutes is long enough to sign in with SSO and MFA.\n const timer = setTimeout(() => finish(Error(\"Sign-in timed out. Run ashr again.\")), 600000);\n const abort = () => finish(Error(\"Sign-in cancelled.\"));\n function finish(error?: Error, login?: TerminalLogin) {\n if (!settle) return;\n const { resolve, reject } = settle;\n settle = undefined;\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", abort);\n // Let the result page reach the browser before the listener goes away.\n setTimeout(() => { server.close(); server.closeAllConnections(); }, 250).unref();\n if (error) reject(error); else resolve(login!);\n }\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(0, \"127.0.0.1\", resolve);\n });\n const address = server.address();\n if (!address || typeof address === \"string\") { finish(Error(\"Loopback listener failed.\")); return result; }\n host = `127.0.0.1:${address.port}`;\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n const url = new URL(\"/terminal\", dashboard);\n url.search = new URLSearchParams({ port: String(address.port), state, device: options.device }).toString();\n options.onUrl(url.toString());\n return result;\n}\n\nfunction resultPage(title: string, detail: string): string {\n const escape = (text: string) => text.replace(/[&<>\"]/g, (c) => `&#${c.charCodeAt(0)};`);\n return `<!doctype html><html lang=\"en\"><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><title>${escape(title)} \u00B7 Ashr</title><style>\n:root{--paper:#faf8f4;--raised:#fffdf9;--ink:#141310;--soft:#57544c;--line:#dcd8ce;--accent:#4d41d0}\n@media (prefers-color-scheme:dark){:root{--paper:#141310;--raised:#1c1b17;--ink:#f4f1e9;--soft:#a9a49a;--line:#34322c;--accent:#a49bff}}\n*{box-sizing:border-box}body{margin:0;min-height:100vh;display:grid;place-items:center;padding:3rem 1.25rem;background:linear-gradient(var(--line) 1px,transparent 1px),linear-gradient(90deg,var(--line) 1px,transparent 1px),var(--paper);background-size:2.5rem 2.5rem;color:var(--ink);font:15px/1.55 \"Helvetica Neue\",system-ui,sans-serif}\nmain{width:min(28rem,100%);padding:2.5rem;background:var(--raised);border:1px solid var(--line);box-shadow:0 18px 40px -18px rgba(20,19,16,.25)}\np.e{margin:0 0 .8rem;color:var(--accent);font:500 .68rem ui-monospace,monospace;letter-spacing:.18em}\nh1{margin:0 0 .6rem;font-size:2rem;font-weight:650;letter-spacing:-.035em;line-height:1.05}p{margin:0;color:var(--soft)}\n</style></head><body><main><p class=\"e\">ASHR TERMINAL</p><h1>${escape(title)}</h1><p>${escape(detail)}</p></main></body></html>`;\n}\n", "export interface ManifoldClientOptions {\n apiUrl: string;\n getToken: () => Promise<string>;\n fetch?: typeof fetch;\n}\nexport class ManifoldHttpError extends Error {\n constructor(\n readonly status: number,\n message: string,\n ) {\n super(`HTTP ${status}: ${message}`);\n }\n}\nexport class ManifoldClient {\n private readonly base: URL;\n constructor(private readonly options: ManifoldClientOptions) {\n this.base = new URL(options.apiUrl);\n if (\n ![\"http:\", \"https:\"].includes(this.base.protocol) ||\n this.base.username ||\n this.base.password ||\n this.base.search ||\n this.base.hash ||\n (this.base.protocol === \"http:\" &&\n ![\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(this.base.hostname))\n )\n throw new Error(\n \"Use HTTPS or a loopback HTTP API URL without credentials\",\n );\n }\n get apiOrigin(): string { return this.base.origin; }\n async request<T>(path: string, init: RequestInit = {}): Promise<T> {\n const response = await this.requestResponse(path, init, \"application/json\");\n if (response.status === 204) return undefined as T;\n return (await response.json()) as T;\n }\n async requestStream(path: string, init: RequestInit = {}): Promise<Response> {\n return this.requestResponse(path, init, \"text/event-stream\");\n }\n private async requestResponse(path: string, init: RequestInit, accept: string): Promise<Response> {\n const decoded = decodeURIComponent(path.split(\"?\")[0]!);\n if (\n !decoded.startsWith(\"/v1/\") ||\n decoded.includes(\"\\\\\") ||\n decoded.split(\"/\").some((p) => p === \"..\" || p === \".\") ||\n /[\\x00-\\x1f#]/.test(decoded) ||\n /[\\x00-\\x20#]/.test(path.split(\"?\")[0]!) ||\n /%2f|%5c/i.test(path.split(\"?\")[0]!)\n )\n throw new Error(\"Invalid API path\");\n const url = new URL(path, this.base);\n if (url.origin !== this.base.origin || !url.pathname.startsWith(\"/v1/\"))\n throw new Error(\"Invalid API path\");\n init.signal?.throwIfAborted();\n const signal = init.signal;\n const token = signal\n ? await new Promise<string>((resolve, reject) => {\n const cancel = () => {\n signal.removeEventListener(\"abort\", cancel);\n reject(\n signal.reason ??\n new DOMException(\"Local request paused\", \"AbortError\"),\n );\n };\n signal.addEventListener(\"abort\", cancel, { once: true });\n void Promise.resolve()\n .then(() => this.options.getToken())\n .then(\n (value) => {\n signal.removeEventListener(\"abort\", cancel);\n resolve(value);\n },\n (error) => {\n signal.removeEventListener(\"abort\", cancel);\n reject(error);\n },\n );\n })\n : await this.options.getToken();\n init.signal?.throwIfAborted();\n if (!token) throw new ManifoldHttpError(401, \"Authentication required\");\n const headers = new Headers(init.headers);\n if (!headers.has(\"authorization\"))\n headers.set(\"authorization\", `Bearer ${token}`);\n headers.set(\"accept\", accept);\n if (init.body && !headers.has(\"content-type\"))\n headers.set(\"content-type\", \"application/json\");\n let response: Response;\n try {\n response = await (this.options.fetch ?? fetch)(url, {\n ...init,\n headers,\n redirect: \"manual\",\n });\n } catch {\n if (init.signal?.aborted)\n throw (\n init.signal.reason ??\n new DOMException(\"Local request paused\", \"AbortError\")\n );\n throw new Error(\n \"Connection failed. The request may have been accepted; retry with the same request ID.\",\n );\n }\n if (response.status >= 300 && response.status < 400)\n throw new Error(\"API redirect refused\");\n if (!response.ok) {\n let detail = \"Request failed\";\n try {\n const body = (await response.json()) as { detail?: unknown };\n detail =\n typeof body.detail === \"string\"\n ? body.detail\n : JSON.stringify(body.detail ?? detail);\n } catch {}\n throw new ManifoldHttpError(\n response.status,\n [token, headers.get(\"authorization\")?.replace(/^Bearer /, \"\") ?? \"\"]\n .filter(Boolean)\n .reduce(\n (value, secret) => value.split(secret).join(\"[credential]\"),\n detail,\n ),\n );\n }\n return response;\n }\n}\n", "import {\n type Component,\n type Terminal,\n TuiMainScreen,\n matchesKey,\n wrapTextWithAnsi,\n} from \"@earendil-works/pi-tui\";\nimport { parse } from \"shell-quote\";\nimport { ManifoldClient, ManifoldHttpError } from \"./client.js\";\nimport {\n HostedWorkspace,\n terminalText,\n importSkill,\n normalizeHostedTask,\n writeExclusive,\n} from \"./workspace.js\";\nimport { InputBox } from \"../ui/components/input-box.js\";\nimport { createTheme, colorMode, detectBackground } from \"../ui/theme.js\";\nimport type { CommandKind } from \"./types.js\";\nimport { renderHostedEvent, type SubagentInfo } from \"./render.js\";\nexport interface HostedCommandContext {\n signal?: AbortSignal;\n client: ManifoldClient;\n task?: string;\n show(title: string, value: unknown): void;\n}\nexport interface HostedAppHandle {\n workspace: HostedWorkspace;\n submit(input: string): Promise<void>;\n quit(): void;\n}\nexport interface RunHostedAppOptions {\n client: ManifoldClient;\n terminal: Terminal;\n task?: string;\n chat?: string;\n env?: NodeJS.ProcessEnv;\n onReady?(handle: HostedAppHandle): void;\n runDashboardCommand?(\n input: string,\n context: HostedCommandContext,\n ): Promise<boolean>;\n}\nexport const hostedHelpLines = [\n \"HOSTED execution \u2014 same chats, files, queues and approvals as the browser.\",\n \"/tasks | /task NAME | /task create NAME | /task all\",\n \"/chats [SEARCH] | /open ID | /new NAME | /rename NAME | /fork NAME [SEQ]\",\n \"/model PROVIDER/MODEL | /thinking LEVEL | /compact | /reload\",\n \"/steer TEXT | /next TEXT | /stop | /approve ID | /reject ID\",\n \"/queue | /queue edit ID TEXT | /queue remove ID | /retry [REQUEST_ID] | /pending\",\n \"/files | /view PATH | /diff PATH | /download PATH LOCAL_DESTINATION\",\n \"/skills | /skill import LOCAL_PATH | /skill view NAME [PATH] | /skill toggle NAME | /skill invoke NAME [TEXT] | /skill reload\",\n \"/memory [QUERY] | /memory page OFFSET [QUERY] | /memory delete ID\",\n \"/history [FIRST_SEQUENCE] | PageUp/PageDown scroll output | /export LOCAL_DESTINATION\",\n \"!COMMAND runs in hosted workspace; !!COMMAND excludes shell output from model context.\",\n \"Escape pauses local dashboard transfers or stops active hosted work. Ctrl-C stops active work, otherwise disconnects. /quit disconnects without stopping jobs.\",\n \"/help | /quit\",\n];\nclass HostedScreen implements Component {\n offset = 0;\n lines: string[] = [];\n constructor(\n private readonly terminal: Terminal,\n private readonly header: () => string,\n ) {}\n invalidate() {}\n render(width: number) {\n const lines = this.lines.flatMap((l) =>\n wrapTextWithAnsi(terminalText(l), Math.max(width, 1)),\n );\n const count = Math.max(3, this.terminal.rows - 9);\n const end = Math.max(0, lines.length - this.offset);\n return [\n terminalText(this.header()),\n \"\",\n ...lines.slice(Math.max(0, end - count), end),\n this.offset ? \"[Viewing history \u2014 PageDown returns to live output]\" : \"\",\n ];\n }\n}\nexport async function runHostedApp(\n options: RunHostedAppOptions,\n): Promise<number> {\n const workspace = new HostedWorkspace(options.client, options.task);\n const env = options.env ?? process.env;\n const tui = new TuiMainScreen(options.terminal);\n const input = new InputBox(\n tui,\n createTheme({ background: detectBackground(env), mode: colorMode(env) }),\n );\n const screen = new HostedScreen(\n options.terminal,\n () =>\n `HOSTED \u00B7 ${workspace.task ?? \"All tasks\"} \u00B7 ${workspace.detail?.name ?? \"No hosted chat\"} ${workspace.chat ?? \"\"} \u00B7 ${workspace.detail?.status ?? \"idle\"} \u00B7 ${workspace.connection}`,\n );\n let done = false,\n finish: (code: number) => void = () => {},\n timer: ReturnType<typeof setTimeout> | undefined,\n failures = 0,\n seenGeneration = -1,\n seenCount = 0;\n const result = new Promise<number>((resolve) => (finish = resolve));\n const streams = new Map<string, number>();\n const subagents = new Map<string, SubagentInfo>();\n let dashboardAbort: AbortController | undefined;\n let uncertainComposer:\n | { raw: string; chat: string; request_id: string }\n | undefined;\n function show(title: string, value: unknown) {\n screen.lines.push(`${title}:`, terminalText(value));\n tui.requestRender();\n }\n function redraw() {\n if (seenGeneration !== workspace.generation) {\n seenGeneration = workspace.generation;\n seenCount = 0;\n screen.lines = [];\n screen.offset = 0;\n streams.clear();\n subagents.clear();\n }\n for (const event of workspace.events.slice(seenCount))\n renderHostedEvent(screen.lines, event, streams, subagents);\n seenCount = workspace.events.length;\n tui.requestRender();\n }\n function quit() {\n dashboardAbort?.abort();\n if (done) return;\n done = true;\n if (timer) clearTimeout(timer);\n workspace.setTask(workspace.task);\n tui.stop();\n finish(0);\n }\n async function poll() {\n if (done) return;\n try {\n await workspace.poll();\n if (workspace.chat) await workspace.refresh();\n failures = 0;\n redraw();\n } catch (e) {\n failures++;\n if (failures === 1 || failures === 5)\n show(\"Connection\", e instanceof Error ? e.message : String(e));\n if (e instanceof ManifoldHttpError && [401, 403].includes(e.status)) {\n failures = 5;\n }\n }\n if (!done && failures < 5)\n timer = setTimeout(\n () => void poll(),\n Math.min(10000, 500 * 2 ** failures),\n );\n else if (!done)\n show(\n \"Connection\",\n \"Polling paused after 5 failures. /reconnect resumes; uncertain commands remain under /pending.\",\n );\n }\n function reconnect() {\n failures = 0;\n if (timer) clearTimeout(timer);\n void poll();\n }\n function requireArg(value: string | undefined, message: string): string {\n if (!value?.trim()) throw Error(message);\n return value;\n }\n async function execute(raw: string) {\n const text = raw.trim();\n if (!text) return;\n if (text === \"/quit\" || text === \"/exit\") {\n quit();\n return;\n }\n if (!text.startsWith(\"/\")) {\n const shell = text.startsWith(\"!\");\n const kind = shell ? \"shell\" : workspace.busy ? \"steer\" : \"prompt\";\n const content = shell ? text.replace(/^!!?/, \"\").trim() : text;\n const commandOptions = shell\n ? { excludeFromContext: text.startsWith(\"!!\") }\n : {};\n const prior = uncertainComposer;\n if (\n prior &&\n prior.raw === text &&\n prior.chat === workspace.chat &&\n workspace.pending.has(prior.request_id)\n ) {\n await workspace.retry(prior.request_id);\n } else {\n try {\n await workspace.send(kind, content, commandOptions);\n } catch (error) {\n const pending = [...workspace.pending.values()].find(\n (p) =>\n p.chat === workspace.chat &&\n p.body.kind === kind &&\n p.body.text === content &&\n JSON.stringify(p.body.options) === JSON.stringify(commandOptions),\n );\n if (pending)\n uncertainComposer = {\n raw: text,\n chat: pending.chat,\n request_id: pending.body.request_id,\n };\n throw error;\n }\n }\n uncertainComposer = undefined;\n show(\"Accepted\", shell ? \"Hosted shell command\" : text);\n return;\n }\n const match = /^\\/(\\S+)(?:\\s+([\\s\\S]*))?$/.exec(text)!;\n const cmd = match[1]!,\n rest = match[2] ?? \"\";\n const tokens = parse(rest);\n if (tokens.some((t) => typeof t !== \"string\"))\n throw Error(\n \"Use plain arguments; shell operators are supported only with !\",\n );\n const args = tokens as string[];\n if (options.runDashboardCommand) {\n dashboardAbort = new AbortController();\n try {\n const handled = await options.runDashboardCommand(text, {\n client: options.client,\n task: workspace.task,\n show,\n signal: dashboardAbort.signal,\n });\n dashboardAbort.signal.throwIfAborted();\n if (handled) return;\n } finally {\n dashboardAbort = undefined;\n }\n }\n switch (cmd) {\n case \"help\":\n show(\"Commands\", hostedHelpLines.join(\"\\n\"));\n break;\n case \"reconnect\":\n reconnect();\n break;\n case \"tasks\":\n show(\"Tasks\", await options.client.request(\"/v1/tasks\"));\n break;\n case \"task\":\n if (args[0] === \"create\") {\n const task = await options.client.request<{ name: string }>(\n \"/v1/tasks\",\n {\n method: \"POST\",\n body: JSON.stringify({\n name: requireArg(args.slice(1).join(\" \"), \"Enter task name\"),\n }),\n },\n );\n workspace.setTask(task.name);\n } else {\n const value = requireArg(rest, \"Use /task NAME or /task all\");\n const name = value === \"all\" ? value : normalizeHostedTask(value);\n if (name !== \"all\") {\n const tasks =\n await options.client.request<Array<{ name: string }>>(\n \"/v1/tasks\",\n );\n if (!tasks.some((t) => t.name === name))\n throw Error(\"Task not found; use /tasks or /task create NAME\");\n }\n workspace.setTask(name === \"all\" ? undefined : name);\n }\n redraw();\n show(\"Chats\", await workspace.list());\n break;\n case \"chats\":\n show(\"Chats\", await workspace.list(rest));\n break;\n case \"open\":\n await workspace.open(requireArg(args[0], \"Enter chat ID\"));\n await workspace.poll();\n redraw();\n break;\n case \"new\":\n await workspace.create(rest || \"New chat\");\n await workspace.poll();\n redraw();\n break;\n case \"rename\":\n await workspace.rename(requireArg(rest, \"Enter chat name\"));\n break;\n case \"fork\": {\n const seq = args.at(-1);\n const through = seq && /^\\d+$/.test(seq) ? Number(seq) : undefined;\n await workspace.fork(\n requireArg(\n through === undefined ? rest : args.slice(0, -1).join(\" \"),\n \"Enter fork name\",\n ),\n through,\n );\n await workspace.poll();\n redraw();\n break;\n }\n case \"model\":\n case \"thinking\":\n if (\n cmd === \"thinking\" &&\n ![\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\"].includes(rest)\n )\n throw Error(\"Thinking level: off, minimal, low, medium, high, xhigh\");\n await workspace.send(cmd, requireArg(rest, `Enter ${cmd}`));\n break;\n case \"compact\":\n case \"reload\":\n case \"stop\":\n await workspace.send(cmd);\n break;\n case \"approve\":\n case \"reject\":\n await workspace.send(cmd, requireArg(rest, \"Enter approval ID\"));\n break;\n case \"steer\":\n case \"next\":\n await workspace.send(\n cmd === \"next\" ? \"follow_up\" : \"steer\",\n requireArg(rest, \"Enter a message\"),\n );\n break;\n case \"retry\":\n await workspace.retry(args[0]);\n break;\n case \"pending\":\n show(\n \"Uncertain commands\",\n [...workspace.pending.values()].filter(\n (p) => p.chat === workspace.chat,\n ),\n );\n break;\n case \"queue\":\n if (args[0] === \"edit\")\n await workspace.editQueue(\n requireArg(args[1], \"Enter command ID\"),\n requireArg(args.slice(2).join(\" \"), \"Enter replacement text\"),\n );\n else if (args[0] === \"remove\") {\n await workspace.send(\n \"cancel\",\n requireArg(args[1], \"Enter command ID\"),\n );\n await workspace.refresh();\n } else if (args.length)\n throw Error(\"Use /queue, /queue edit ID TEXT, or /queue remove ID\");\n else {\n await workspace.refresh();\n show(\"Queue\", workspace.detail?.commands ?? []);\n }\n break;\n case \"files\":\n await workspace.refresh();\n show(\"Files\", Object.keys(workspace.detail?.files ?? {}));\n break;\n case \"view\":\n case \"diff\":\n case \"download\": {\n await workspace.refresh();\n const path = requireArg(args[0], \"Enter hosted file path\");\n const file = workspace.detail?.files[path];\n if (!file) throw Error(\"File not found\");\n if (cmd === \"download\") {\n const destination = requireArg(\n args[1],\n \"Enter an explicit local destination\",\n );\n await writeExclusive(destination, file.content);\n show(\"Saved\", destination);\n } else\n show(\n path,\n cmd === \"diff\"\n ? `BEFORE\\n${file.before ?? \"(no previous content)\"}\\nAFTER\\n${file.content}`\n : file.content,\n );\n break;\n }\n case \"skills\":\n await workspace.refresh();\n show(\"Skills\", workspace.detail?.skills ?? []);\n break;\n case \"skill\": {\n const action = args[0];\n if (action === \"import\") {\n const skill = await importSkill(\n requireArg(args[1], \"Enter local skill file or folder\"),\n );\n await workspace.skill(skill);\n show(\"Imported\", skill.name);\n } else if (action === \"reload\") await workspace.send(\"reload\");\n else {\n await workspace.refresh();\n const skill = workspace.detail?.skills.find(\n (s) => s.name === args[1],\n );\n if (!skill) throw Error(\"Skill not found\");\n if (action === \"view\")\n show(\n skill.name,\n skill.files[args[2] ?? \"SKILL.md\"] ??\n (() => {\n throw Error(\"Skill file not found\");\n })(),\n );\n else if (action === \"toggle\")\n await workspace.skill({ ...skill, enabled: !skill.enabled });\n else if (action === \"invoke\") {\n if (!skill.enabled)\n throw Error(\"Enable the skill before invoking it\");\n await workspace.send(\n workspace.busy ? \"steer\" : \"prompt\",\n `/skill:${skill.name} ${args.slice(2).join(\" \")}`.trim(),\n );\n } else\n throw Error(\"Use /skill import, view, toggle, invoke, or reload\");\n }\n break;\n }\n case \"memory\":\n if (args[0] === \"delete\")\n show(\n \"Deleted note\",\n await options.client.request(\n `/v1/agent/notes/${encodeURIComponent(requireArg(args[1], \"Enter note ID\"))}`,\n { method: \"DELETE\" },\n ),\n );\n else {\n const offset = args[0] === \"page\" ? Number(args[1]) : 0;\n if (!Number.isSafeInteger(offset) || offset < 0)\n throw Error(\"Page offset must be a nonnegative integer\");\n const query = args[0] === \"page\" ? args.slice(2).join(\" \") : rest;\n show(\n \"Memory\",\n await options.client.request(\n `/v1/agent/notes?limit=100&offset=${offset}&query=${encodeURIComponent(query)}`,\n ),\n );\n }\n break;\n case \"history\": {\n const from = rest ? Number(rest) : 0;\n if (!Number.isSafeInteger(from) || from < 0)\n throw Error(\"Enter a nonnegative sequence\");\n show(\n \"History\",\n workspace.events.filter((e) => e.seq >= from),\n );\n break;\n }\n case \"export\":\n await writeExclusive(\n requireArg(args[0], \"Enter an explicit local export destination\"),\n JSON.stringify(await workspace.export(), null, 2) + \"\\n\",\n );\n show(\"Exported\", args[0]);\n break;\n default:\n throw Error(`Unknown command /${cmd}. Use /help.`);\n }\n tui.requestRender();\n }\n let submitting = false;\n let ready = false;\n async function submit(text: string) {\n const generation = workspace.generation;\n if (!ready || submitting) {\n input.setText(text);\n show(\n !ready ? \"Hosted workspace loading\" : \"Busy\",\n !ready\n ? \"Wait for the selected chat to load. Your draft is preserved.\"\n : \"Wait for the current request to finish. Your draft is preserved.\",\n );\n return;\n }\n submitting = true;\n show(\n \"Loading\",\n text.startsWith(\"/\") ? text.split(\" \")[0] : \"Submitting hosted command\",\n );\n try {\n await execute(text);\n if (input.getText() === text) input.setText(\"\");\n } catch (e) {\n if (!done) {\n // Apply a failed selection's generation reset before retaining its error.\n // Otherwise the next poll clears the error as if it were old chat output.\n redraw();\n if (generation === workspace.generation && !input.getText())\n input.setText(text);\n show(\n e instanceof Error && e.name === \"AbortError\"\n ? \"Transfer paused\"\n : \"Error\",\n e instanceof Error && e.name === \"AbortError\"\n ? \"Local request interrupted. Upload receipts are preserved; use /uploads retry to resume. Hosted jobs continue.\"\n : e instanceof Error\n ? e.message\n : String(e),\n );\n }\n } finally {\n submitting = false;\n if (\n generation !== workspace.generation &&\n !/^\\/(task|open|new|fork|quit|exit)(?:\\s|$)/.test(text)\n ) {\n screen.lines = [];\n seenGeneration = workspace.generation;\n seenCount = 0;\n screen.offset = 0;\n streams.clear();\n }\n tui.requestRender();\n }\n }\n tui.addChild(screen);\n tui.addChild(input);\n input.onSubmit = (text) => void submit(text);\n tui.addInputListener((data) => {\n if (matchesKey(data, \"escape\") && dashboardAbort) {\n dashboardAbort.abort();\n show(\n \"Transfer paused\",\n \"Interrupting the local dashboard request; upload receipts are preserved.\",\n );\n return { consume: true };\n }\n if (\n ready &&\n !dashboardAbort &&\n workspace.busy &&\n (matchesKey(data, \"escape\") || matchesKey(data, \"ctrl+c\"))\n ) {\n void workspace.send(\"stop\").then(\n () =>\n show(\n \"Stop requested\",\n \"Stopping hosted work; the chat remains open.\",\n ),\n (error) =>\n show(\n \"Stop failed\",\n error instanceof Error ? error.message : String(error),\n ),\n );\n return { consume: true };\n }\n if (matchesKey(data, \"ctrl+c\")) {\n quit();\n return { consume: true };\n }\n if (matchesKey(data, \"pageUp\") || matchesKey(data, \"pageDown\")) {\n screen.offset = Math.max(\n 0,\n Math.min(\n screen.lines.length,\n screen.offset + (matchesKey(data, \"pageUp\") ? 10 : -10),\n ),\n );\n tui.requestRender();\n return { consume: true };\n }\n return undefined;\n });\n tui.setFocus(input);\n tui.start();\n show(\n \"Ready\",\n \"Use /help for hosted commands. No hosted chat selected; /chats, /open ID or /new NAME.\",\n );\n if (options.chat)\n try {\n await workspace.open(options.chat);\n await workspace.poll();\n redraw();\n } catch (e) {\n show(\"Error\", e instanceof Error ? e.message : String(e));\n }\n ready = true;\n options.onReady?.({ workspace, submit, quit });\n void poll();\n return await result;\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { lstat, readFile, readdir, open } from \"node:fs/promises\";\nimport { basename, join, resolve } from \"node:path\";\nimport { ManifoldClient, ManifoldHttpError } from \"./client.js\";\nimport type {\n Chat,\n ChatDetail,\n CommandKind,\n CommandRequest,\n HostedCommand,\n HostedEvent,\n EventPage,\n Skill,\n} from \"./types.js\";\nexport function terminalText(value: unknown): string {\n const text =\n typeof value === \"string\"\n ? value\n : (JSON.stringify(value, null, 2) ?? String(value));\n return text\n .replace(/\\x1b\\][^\\x07]*(?:\\x07|\\x1b\\\\)/g, \"\")\n .replace(/\\x1b\\[[0-?]*[ -/]*[@-~]/g, \"\")\n .replace(/[\\x00-\\x08\\x0b-\\x1f\\x7f-\\x9f]/g, \"\");\n}\nexport function safeWorkspacePath(path: string): string {\n if (\n !path ||\n path.length > 300 ||\n path.includes(\"\\\\\") ||\n path.startsWith(\"/\") ||\n path\n .split(\"/\")\n .some((p) => !p || p === \".\" || p === \"..\" || p.startsWith(\".\")) ||\n /[\\x00-\\x1f]/.test(path)\n )\n throw Error(\"Use a safe relative skill path\");\n return path;\n}\nexport async function writeExclusive(\n destination: string,\n content: string,\n): Promise<void> {\n const file = await open(resolve(destination), \"wx\", 0o600);\n try {\n await file.writeFile(content);\n } finally {\n await file.close();\n }\n}\nexport async function importSkill(path: string): Promise<Skill> {\n const root = resolve(path);\n const stat = await lstat(root);\n if (stat.isSymbolicLink())\n throw Error(\"Skill paths cannot be symbolic links\");\n const files: Record<string, string> = {};\n let bytes = 0;\n async function read(file: string, name: string) {\n safeWorkspacePath(name);\n const info = await lstat(file);\n if (info.isSymbolicLink() || !info.isFile())\n throw Error(\"Skill paths must be regular files\");\n if (info.size > 1000000) throw Error(\"Skill exceeds 1 MB\");\n const value = await readFile(file, \"utf8\");\n bytes += Buffer.byteLength(value);\n if (bytes > 1000000 || Object.keys(files).length >= 100)\n throw Error(\"Import at most 100 files totaling 1 MB\");\n files[name] = value;\n }\n async function walk(dir: string, prefix = \"\") {\n for (const entry of await readdir(dir, { withFileTypes: true })) {\n const name = prefix + entry.name;\n safeWorkspacePath(name);\n if (entry.isSymbolicLink())\n throw Error(\"Skill paths cannot be symbolic links\");\n if (entry.isDirectory()) await walk(join(dir, entry.name), name + \"/\");\n else await read(join(dir, entry.name), name);\n }\n }\n if (stat.isDirectory()) await walk(root);\n else {\n if (basename(root) !== \"SKILL.md\")\n throw Error(\"Import a SKILL.md file or skill folder\");\n await read(root, \"SKILL.md\");\n }\n const source = files[\"SKILL.md\"] ?? \"\";\n const name = /^name:\\s*([a-z0-9]+(?:-[a-z0-9]+)*)\\s*$/m.exec(source)?.[1];\n if (\n (!source.startsWith(\"---\\n\") && !source.startsWith(\"---\\r\\n\")) ||\n !name ||\n name.length > 64 ||\n !/^description:\\s*\\S/m.test(source)\n )\n throw Error(\"SKILL.md needs name and description frontmatter\");\n return { name, files, enabled: true };\n}\n/** Match backend models.normalize_task so aliases refer to the same shared task. */\nexport function normalizeHostedTask(value: string): string {\n const canonical = value\n .trim()\n .toLowerCase()\n .replace(/[\\s-]+/g, \"_\");\n if (!/^[a-z0-9_]+$/.test(canonical) || canonical.length > 200)\n throw Error(\"Enter a valid task name\");\n return canonical;\n}\nexport class HostedWorkspace {\n detail?: ChatDetail;\n events: HostedEvent[] = [];\n cursor = 0;\n connection = \"Disconnected\";\n generation = 0;\n readonly pending = new Map<string, { chat: string; body: CommandRequest }>();\n private scope?: string;\n private pollInFlight?: Promise<void>;\n constructor(\n readonly client: ManifoldClient,\n task?: string,\n ) {\n this.scope = task === undefined ? undefined : normalizeHostedTask(task);\n }\n get task() {\n return this.scope;\n }\n get chat() {\n return this.detail?.id;\n }\n get busy() {\n return [\"working\", \"queued\", \"stopping\"].includes(\n this.detail?.status ?? \"\",\n );\n }\n private path(id = this.chat) {\n if (!id) throw Error(\"Open or create a hosted chat first\");\n return `/v1/agent/chats/${encodeURIComponent(id)}`;\n }\n async list(search = \"\") {\n const result = await this.client.request<{ chats: Chat[] }>(\n `/v1/agent/chats${this.scope ? \"?task=\" + encodeURIComponent(this.scope) : \"\"}`,\n );\n return result.chats.filter(\n (c) =>\n c.name.toLowerCase().includes(search.toLowerCase()) ||\n c.id.includes(search),\n );\n }\n setTask(task?: string) {\n this.scope = task === undefined ? undefined : normalizeHostedTask(task);\n this.generation++;\n this.detail = undefined;\n this.events = [];\n this.cursor = 0;\n this.connection = \"Disconnected\";\n }\n async open(id: string) {\n const gen = ++this.generation;\n this.detail = undefined;\n this.events = [];\n this.cursor = 0;\n this.connection = \"Connecting\";\n try {\n const detail = await this.client.request<ChatDetail>(this.path(id));\n if (gen !== this.generation) return;\n if (this.scope && detail.task !== this.scope)\n throw Error(\"Chat belongs to a different task\");\n this.detail = detail;\n } catch (error) {\n if (gen === this.generation) this.connection = \"Open failed\";\n throw error;\n }\n }\n async create(name = \"New chat\") {\n const gen = this.generation;\n const chat = await this.client.request<Chat>(\"/v1/agent/chats\", {\n method: \"POST\",\n body: JSON.stringify({ name, task: this.scope ?? null }),\n });\n if (gen === this.generation) await this.open(chat.id);\n return chat;\n }\n async refresh() {\n const gen = this.generation,\n id = this.chat;\n if (!id) return;\n const detail = await this.client.request<ChatDetail>(this.path(id));\n if (gen === this.generation) this.detail = detail;\n }\n async rename(name: string) {\n if (!name.trim() || name.length > 120)\n throw Error(\"Name must be 1\u2013120 characters\");\n const gen = this.generation;\n const updated = await this.client.request<Chat>(this.path(), {\n method: \"PATCH\",\n body: JSON.stringify({ name }),\n });\n if (gen === this.generation && this.detail)\n this.detail = { ...this.detail, ...updated };\n }\n async fork(name: string, through?: number) {\n const gen = this.generation;\n const chat = await this.client.request<Chat>(this.path() + \"/fork\", {\n method: \"POST\",\n body: JSON.stringify({\n name,\n ...(through === undefined ? {} : { through }),\n }),\n });\n if (gen === this.generation) await this.open(chat.id);\n return chat;\n }\n poll(): Promise<void> {\n if (this.pollInFlight) return this.pollInFlight;\n const pending = this.pollPage();\n this.pollInFlight = pending;\n void pending\n .finally(() => {\n if (this.pollInFlight === pending) this.pollInFlight = undefined;\n })\n .catch(() => {});\n return pending;\n }\n private async pollPage() {\n if (!this.chat) return;\n const gen = this.generation,\n id = this.chat;\n try {\n const page = await this.client.request<EventPage>(\n this.path(id) + `/events?after=${this.cursor}&limit=500`,\n );\n if (gen !== this.generation) return;\n const seen = new Set(this.events.map((e) => e.seq));\n for (const e of page.events) {\n if (!Number.isSafeInteger(e.seq) || e.seq <= 0)\n throw Error(\"Invalid event cursor\");\n if (!seen.has(e.seq)) {\n this.events.push(e);\n seen.add(e.seq);\n if (e.kind === \"status\" && this.detail)\n this.detail.status = String(e.data.status);\n }\n }\n this.events.sort((a, b) => a.seq - b.seq);\n if (!Number.isSafeInteger(page.cursor) || page.cursor < this.cursor)\n throw Error(\"Invalid event cursor\");\n this.cursor = page.cursor;\n this.connection = \"Connected\";\n } catch (error) {\n if (gen === this.generation)\n this.connection =\n error instanceof ManifoldHttpError &&\n [401, 403].includes(error.status)\n ? \"Authentication required\"\n : \"Disconnected\";\n throw error;\n }\n }\n async send(\n kind: CommandKind,\n text = \"\",\n options: Record<string, unknown> = {},\n ) {\n if (\n [\"prompt\", \"steer\", \"follow_up\", \"shell\"].includes(kind) &&\n !text.trim()\n )\n throw Error(\"Enter a message or command\");\n if (text.length > 100000) throw Error(\"Command exceeds 100000 characters\");\n const chat = this.chat;\n this.path(chat);\n const old = [...this.pending.values()].find(\n (p) =>\n p.chat === chat &&\n p.body.kind === kind &&\n p.body.text === text &&\n JSON.stringify(p.body.options) === JSON.stringify(options),\n );\n const attempt = old ?? {\n chat: chat!,\n body: { request_id: randomUUID(), kind, text, options },\n };\n this.pending.set(attempt.body.request_id, attempt);\n return this.deliver(attempt);\n }\n private async deliver(attempt: { chat: string; body: CommandRequest }) {\n const result = await this.client.request<HostedCommand>(\n this.path(attempt.chat) + \"/commands\",\n { method: \"POST\", body: JSON.stringify(attempt.body) },\n );\n this.pending.delete(attempt.body.request_id);\n if (this.detail?.id === attempt.chat) {\n if (attempt.body.kind === \"stop\") this.detail.status = \"stopping\";\n else if (\n ![\"cancel\", \"approve\", \"reject\"].includes(attempt.body.kind) &&\n [\"idle\", \"failed\", \"stopped\"].includes(this.detail.status)\n )\n this.detail.status = \"queued\";\n }\n return result;\n }\n async retry(id?: string) {\n const attempts = [...this.pending.values()].filter(\n (p) => p.chat === this.chat,\n );\n const attempt = id ? this.pending.get(id) : attempts.at(-1);\n if (!attempt || attempt.chat !== this.chat)\n throw Error(\"No uncertain command in this chat\");\n return this.deliver(attempt);\n }\n async editQueue(id: string, text: string) {\n const gen = this.generation;\n await this.refresh();\n if (gen !== this.generation) throw Error(\"Chat changed during queue edit\");\n const item = this.detail?.commands.find((c) => c.id === id);\n if (!item || ![\"accepted\", \"held\"].includes(item.status))\n throw Error(\"That command has already been delivered\");\n if (!text.trim()) throw Error(\"Enter replacement text\");\n await this.send(\"cancel\", id);\n if (gen !== this.generation)\n throw Error(\n \"Chat changed after cancellation; original cancelled, replacement not sent\",\n );\n await this.send(item.kind as CommandKind, text, item.options);\n await this.refresh();\n }\n async skill(skill: Skill) {\n const gen = this.generation,\n id = this.chat;\n await this.client.request(this.path(id) + \"/skills\", {\n method: \"POST\",\n body: JSON.stringify({\n name: skill.name,\n files: skill.files,\n enabled: skill.enabled,\n }),\n });\n if (gen === this.generation) {\n await this.refresh();\n await this.send(\"reload\");\n }\n }\n async export() {\n const gen = this.generation;\n await this.pollInFlight;\n if (gen !== this.generation) throw Error(\"Chat changed during export\");\n await this.refresh();\n do {\n const before = this.events.length;\n await this.poll();\n if (gen !== this.generation) throw Error(\"Chat changed during export\");\n if (this.events.length - before < 500) break;\n } while (true);\n if (gen !== this.generation) throw Error(\"Chat changed during export\");\n return {\n format: \"ashr-chat-v1\",\n name: this.detail?.name,\n files: this.detail?.files,\n skills: this.detail?.skills,\n events: this.events.filter((e) => e.kind !== \"delta\"),\n };\n }\n}\n", "import type { HostedEvent } from \"./types.js\";\nimport { terminalText } from \"./workspace.js\";\nexport interface SubagentInfo {\n name: string;\n status: string;\n cap_usd?: number;\n model?: string;\n}\nconst str = (v: unknown) => (typeof v === \"string\" && v ? v : undefined);\n/** The one-line status for a `subagent` event, or undefined when its shape is unexpected. */\nfunction subagentEvent(data: Record<string, unknown>, subagents: Map<string, SubagentInfo>): string | undefined {\n const id = str(data.subagent_id);\n const name = str(data.name);\n const status = str(data.status);\n if (!id || !name || !status) return undefined;\n const prev = subagents.get(id);\n const cap = typeof data.cap_usd === \"number\" && Number.isFinite(data.cap_usd) ? data.cap_usd : prev?.cap_usd;\n const model = str(data.model) ?? prev?.model;\n subagents.set(id, { name, status, ...(cap === undefined ? {} : { cap_usd: cap }), ...(model ? { model } : {}) });\n if (status === \"running\" && !prev) return `subagent ${name} started${model ? ` on ${model}` : \"\"}${cap === undefined ? \"\" : `, cap $${cap.toFixed(2)}`}`;\n return prev?.status === status ? undefined : `subagent ${name} ${status}`;\n}\n/** Keep one visible assistant block per message while preserving complete tool output. */\nexport function renderHostedEvent(\n lines: string[],\n event: HostedEvent,\n streams: Map<string, number>,\n subagents: Map<string, SubagentInfo> = new Map(),\n): void {\n const data = event.data;\n if (event.kind === \"subagent\") {\n const line = subagentEvent(data, subagents);\n if (line) lines.push(`[${event.seq}] ${terminalText(line)}`, \"\");\n return;\n }\n // A running command's partial output; its tool_end carries all of it.\n if (event.kind === \"tool_update\") return;\n if (event.kind === \"delta\" || event.kind === \"assistant\") {\n if (!data.text) return;\n const id = String(data.message_id ?? \"current\");\n let index = streams.get(id);\n if (index === undefined) {\n index = lines.length;\n lines.push(\"\", \"\");\n streams.set(id, index);\n }\n lines[index] =\n `[${event.seq}] assistant${event.kind === \"delta\" ? \" \u00B7 streaming\" : \"\"}`;\n lines[index + 1] =\n event.kind === \"delta\"\n ? (lines[index + 1] ?? \"\") + terminalText(data.text ?? \"\")\n : terminalText(data.text ?? \"\");\n if (event.kind === \"assistant\") streams.delete(id);\n return;\n }\n const sid = str(data.subagent_id);\n const who = sid ? subagents.get(sid)?.name ?? sid : undefined;\n lines.push(\n `[${event.seq}] ${who ? terminalText(who) + \" \u25B8 \" : \"\"}${terminalText(event.kind)}${data.tool ? \" \" + terminalText(data.tool) : \"\"}`,\n terminalText(data.text ?? data),\n );\n}\n", "# Manifold Python SDK\n\n## Quickstart\n\nCapture calls, train candidates, and serve promoted models. Reviewed against repository code on September 15, 2026; deployed API/worker and installed SDK versions may differ.\n\n### Install\n\n```bash\npip install ashr-manifold # Python 3.10+; from a checkout: pip install ./sdk\nexport ASHR_BASE_URL=\"https://api.manifold.ashr.io\"\nexport ASHR_API_KEY=\"ask_...\"\n```\n\nCreate a service key in the platform\u2019s API keys page. The platform renders this guide under SDK docs.\n\n```python\nfrom ashr_sdk import AshrClient\nashr = AshrClient() # reads both environment variables\n```\n\nExamples use placeholder IDs. Replace them with objects in your tenant; keep one client open and close it when finished.\n\n### Serve a promoted model\n\nCall a promoted model with the Anthropic- or OpenAI-style client, pointed at\nManifold's base URL with the task name as `model`. The capture ID comes back in\nthe `X-Manifold-Interaction-Id` response header:\n\n```python\nimport os\nfrom anthropic import Anthropic\n\nmodel_client = Anthropic(\n api_key=os.environ[\"ASHR_API_KEY\"],\n base_url=os.environ[\"ASHR_BASE_URL\"].rstrip(\"/\"),\n)\nserved = model_client.messages.with_raw_response.create(\n model=\"game_generation\", # a promoted task; add \"@alias\" to pin one\n max_tokens=1024,\n messages=[{\"role\": \"user\", \"content\": \"Build an ice cavern.\"}],\n)\nmessage = served.parse()\ninteraction_id = served.headers.get(\"x-manifold-interaction-id\")\nprint(message.content[0].text, interaction_id)\n```\n\nRequires a promoted, loadable artifact. Manifold captures served completions\nautomatically when telemetry succeeds. See Host a trained model for the OpenAI\nclient, tools, streaming, and limits.\n\n### Wrap an existing client\n\nFor models served elsewhere, install the provider package and wrap its client:\n\n```python\nimport anthropic\nimport ashr_sdk as capture\n\ncapture.init(task=\"game_generation\")\nclient = capture.wrap(anthropic.Anthropic()) # your provider credentials\nresponse = client.messages.create(\n model=\"claude-sonnet-4-5\", max_tokens=512,\n messages=[{\"role\": \"user\", \"content\": \"Design a level.\"}],\n)\ncapture.flush()\n```\n\nSupports OpenAI and Anthropic sync, async, and streaming calls. Capture failures warn without failing the provider call. Flush before short-lived processes exit.\n\n## Capture production behavior\n\nProduction shows captured calls, model lineage, review coverage, latency, and cost. Use the SDK to capture calls and record feedback.\n\n### Group calls with a trace\n\n```python\nwith ashr.trace(\"support_routing\", client_ref=\"ticket-4821\"):\n interaction_id = ashr.log(\n task=\"support_routing\", model_id=\"m_router\",\n input={\"subject\": \"Cannot reset password\"},\n output={\"queue\": \"identity\"}, latency_ms=210,\n input_tokens=86, output_tokens=18,\n decisions=[{\n \"field_path\": \"queue\", \"value\": \"identity\", \"confidence\": 0.91,\n \"alternatives\": [{\"value\": \"billing\", \"probability\": 0.07}],\n \"source_citation\": \"ticket subject\",\n }],\n )\n```\n\n`log()` requires a registered `model_id`. The wrapper and `log_batch()` also support model-name auto-registration. `client_ref` is your request ID; use dotted `field_path` values for nested decisions.\n\n### Attach artifacts\n\n```python\nartifact = ashr.artifacts.register(\n name=\"ticket attachment\", kind=\"document\",\n bucket=\"my-evidence\", object_key=\"tickets/4821.pdf\",\n)\ninteraction_id = ashr.log(\n \"support_routing\", \"m_router\", {\"ticket\": \"4821\"}, {\"queue\": \"identity\"},\n artifacts=[artifact[\"id\"]],\n)\nurl = ashr.artifacts.access_url(artifact[\"id\"], expires_in=900)\n```\n\n`artifacts.list()` and `get(id)` read registered evidence. These are object-store artifacts; discovered training weights use the download API under Run model experiments.\n\n## Build feedback and evidence\n\n### Record human feedback\n\n```python\nashr.feedback(\n interaction_id, \"corrected\", corrected_output={\"queue\": \"account_recovery\"},\n diff={\"queue\": [\"identity\", \"account_recovery\"]},\n by=\"reviewer-142\", reason=\"routing_error\",\n)\n```\n\nUse `confirmed` for correct output, `corrected` with the complete desired output, or `rejected`. Rejected output is never a positive target; it can supply a DPO negative.\n\n### Report validator checks\n\n```python\nashr.checks([{\n \"interaction_id\": interaction_id,\n \"checks\": {\"schema_valid\": True, \"correct_queue\": False},\n \"details\": {\"correct_queue\": \"expected account_recovery\"},\n}], reviewer=\"routing-validator\")\n```\n\nAll checks passing confirms the observation; any failure rejects it. Report measured results only.\n\n### Import labeled data\n\n```python\nresult = ashr.datasets.import_examples(\n task=\"support_routing\", model_id=\"m_router\",\n examples=[{\"subject\": \"Reset password\", \"queue\": \"identity\"}],\n input_fn=lambda row: {\"subject\": row[\"subject\"]},\n output_fn=lambda row: {\"queue\": row[\"queue\"]},\n metadata_fn=lambda row: {\"source\": \"reviewed_tickets\"},\n batch_size=25, freeze=False,\n)\n```\n\nAccepts any iterable, including a Hugging Face Dataset. Batches allow 1\u2013500 rows; use 25\u201350 for large payloads. `log_batch()` accepts `interaction` plus optional `feedback`; `interaction.model` can register by name.\n\n`input.source` is reserved for `manifold.source/v1`; put ordinary provenance in `input.metadata`. The batch API accepts historical `created_at` values from 2020 through now and normalizes aware timestamps to UTC.\n\n### Freeze and resume safely\n\n```python\ndataset = ashr.datasets.freeze(\"support_routing\", holdout_fraction=0.1)\ndataset_id = dataset[\"id\"]\nversions = ashr.datasets.list()\n```\n\nFreeze records immutable membership and holdout splits. Alternatively, set `freeze=True` on import and use `result[\"dataset\"][\"id\"]`; do not freeze again without new labeled data (400). After an import failure, inspect `failed_index`/`completed` in the API error. The SDK exposes that detail as `AshrError` text, not a cross-batch resume cursor. Track your batches. After an ambiguous import or freeze timeout, reconcile accepted rows or dataset versions before retrying; a concurrent freeze returns 409.\n\n## Run model experiments\n\nExperiments trains candidates on the same frozen dataset and compares their evaluation evidence. Use the SDK for training configuration, cancellation, retries, and deployment rollback.\n\n### Create an experiment\n\n```python\nexperiment = ashr.experiments.create(\n name=\"support-router-v5\", task=\"support_routing\", dataset=\"ds_support_v5\",\n models=[\"org/router-small\", {\n \"model_ref\": \"org/router-large\", \"revision\": \"PINNED_REVISION\",\n \"recipe\": \"dpo_lora\", \"config\": {\"gpu\": \"L40S\", \"dpo_beta\": 0.1},\n }],\n training_config={\"epochs\": 1, \"eval_batch_size\": 8, \"eval_max_tokens\": 256},\n primary_metric=\"field_f1\", gates={\"field_f1\": 0.8, \"schema_validity\": 0.95},\n evaluator_config={\"required_fields\": [\"queue\"]},\n)\nprint(experiment.id, experiment.estimate())\nexperiment.start(idempotency_key=\"support-router-v5-start\")\nexperiment.wait(timeout=21600, poll_interval=10)\nresults = experiment.comparison()\nprint(experiment.failures())\n```\n\nPin each model revision. Candidate settings override experiment defaults. SFT uses positive targets; DPO needs chosen/rejected pairs. Gates require measured metrics and cannot lower platform floors. An estimate is directional, not a bill.\n\n### Track runs and recover failures\n\n```python\nexperiment.refresh()\nfor candidate in experiment.candidates:\n for run in candidate[\"runs\"]:\n current = ashr.training_runs.get(run[\"id\"])\n print(current[\"status\"], current.get(\"error\"))\nstale_runs = ashr.training_runs.stale(minutes=15)\n# After inspecting a specific run:\n# ashr.training_runs.cancel(run_id)\n# retried = ashr.training_runs.retry(run_id)\n```\n\n`wait()` includes failed/cancelled terminal states; inspect errors and gates. Save the experiment ID before starting. Retry `start()` on `experiments.get(id)` with the same key. Repeating `experiments.run()` creates a new experiment. `experiments.list()` lists existing experiments.\n\nThe worker enables gradient checkpointing by default. For OOM, reduce `max_length` or choose a supported larger GPU. `retain_failed_artifacts=True` retains a written final artifact after a gate miss; it cannot recover unwritten weights.\n\n### Own the weights\n\n```python\nresume = ashr.training_runs.weights_url(run_id)\nadapter = ashr.training_runs.weights_url(run_id, format=\"adapter\")\nexact = ashr.training_runs.weights_url(run_id, checkpoint=600)\nfinal = ashr.training_runs.weights_url(run_id, checkpoint=None, format=\"adapter\")\nprint(resume[\"url\"])\n```\n\nSigned downloads expire after one hour by default. `latest` resolves at download time; numbered steps pin selection. Resume archives include weights, optimizer, scheduler, RNG, and trainer state; adapter archives are for inference. A URL can be issued before files exist; the download may return 409 before the first save. Defaults: `save_steps=100`, `save_total_limit=2`. Download needed steps before pruning.\n\n```python\nimport os\nashr.training_runs.export_to_huggingface(\n run_id, repo_id=\"acme/support-router-v5\", hf_token=os.environ[\"HF_TOKEN\"],\n)\n```\n\nThe token is forwarded for upload, not stored. The response means queued, not uploaded. Load adapter files with PEFT and the matching base model.\n\n### Discovered artifacts\n\nArtifacts lists checkpoints/adapters from Modal volumes, including failed runs. Filter for weights; inspect written time, adoption status, and download size, which includes nested files. Discovery does not mean evaluated, registered, or promoted.\n\nFor a row\u2019s exact `volume` and `path`, use its download button/API command or `POST /v1/modal-artifacts/download-url` with `format=\"resume\"` or `\"adapter\"`. Your session or service key authorizes the grant; no Modal token is needed. The SDK has no dedicated helper for this endpoint.\n\n## Run the full learning cycle\n\n### Run a cycle\n\n```python\nreport = ashr.learning_loops.run(\n task=\"support_routing\",\n candidates=[{\"model_source_id\": \"src_router\", \"recipe\": \"sft_lora\"}],\n eval_config={\"primary_metric\": \"field_f1\"},\n halving={\"metric\": \"proxy_score\", \"at_progress\": 0.5, \"kill_fraction\": 0.5},\n alias=\"production\", timeout_seconds=300,\n)\nprint(report[\"killed\"], report[\"winner\"], report[\"promoted\"], report[\"reason\"])\n```\n\nUses registered model-source IDs. Freezes/reuses evidence, builds an environment, trains, halves, evaluates, and promotes only a passing winner that beats the incumbent. Halving is recorded before launch. This synchronous request needs sufficient client/gateway time; inspect runs after a timeout before starting another cycle.\n\n### Test without GPUs\n\nUse `MANIFOLD_TRAINING_BACKEND=mock` on a local test API. It exercises callbacks, gates, lineage, and cancellation with simulated training. `backend/scripts/learning_loop_demo.py` runs the local example. Mock scores do not establish model quality.\n\n## Continuous learning configuration\n\n### Build an environment\n\n```python\nenvironment = ashr.environments.build(\n task=\"support_routing\", dataset_id=\"ds_support_v5\",\n reward_spec={\"resolved\": 1, \"policy_violation\": -5},\n)\nashr.learning_loops.configure(\n task=\"support_routing\", environment_id=environment[\"id\"],\n config={\"trigger_after_reviewed\": 500, \"trigger_every_days\": 7,\n \"benchmark_incumbent\": True, \"auto_train\": True},\n)\n```\n\nThese calls store environment and retraining configuration. Trigger scheduling remains in progress. Read configurations with `environments.list()` and `learning_loops.list()`.\n\n### Application-side routing\n\n```python\nashr.router.configure(\n task=\"support_routing\", incumbent_model_id=\"m_current\",\n challenger_model_id=\"m_candidate\", traffic_percent=5,\n)\nassignment = ashr.router.decide(task=\"support_routing\", request_key=\"ticket-4821\")\n# Your application serves assignment[\"model_id\"], then records the actual result:\nashr.router.outcome(assignment[\"id\"], {\"resolved\": True, \"reward\": 1})\nashr.router.set_traffic(\"support_routing\", 0)\n```\n\nAssignment is deterministic per policy/key. For managed serving, also promote the challenger to `canary` as described below.\n\n## Host a trained model\n\nRequires a promoted task alias backed by a loadable trained artifact. Installing the SDK or finding weights does not create a deployment.\n\n### Choose a client\n\nOpenAI uses the API root plus `/v1`; Anthropic and `AshrClient` use the API root. Install provider packages separately.\n\n```python\nimport os\nfrom openai import OpenAI\n\nclient = OpenAI(api_key=os.environ[\"ASHR_API_KEY\"],\n base_url=os.environ[\"ASHR_BASE_URL\"].rstrip(\"/\") + \"/v1\")\nresponse = client.chat.completions.create(\n model=\"game_generation\", max_completion_tokens=1024,\n messages=[{\"role\": \"user\", \"content\": \"Build an ice cavern.\"}],\n)\nprint(response.choices[0].message.content)\n```\n\n```python\nfrom anthropic import Anthropic\n\nclient = Anthropic(api_key=os.environ[\"ASHR_API_KEY\"],\n base_url=os.environ[\"ASHR_BASE_URL\"].rstrip(\"/\"))\nmessage = client.messages.create(\n model=\"game_generation\", max_tokens=1024,\n system=\"Return a concise level design.\",\n messages=[{\"role\": \"user\", \"content\": \"Build an ice cavern.\"}],\n)\nprint(message.content[0].text)\n```\n\nTools and streaming work on either client. From OpenAI, declare `tools` and stream with `stream=True`:\n\n```python\nopenai_client = OpenAI(api_key=os.environ[\"ASHR_API_KEY\"],\n base_url=os.environ[\"ASHR_BASE_URL\"].rstrip(\"/\") + \"/v1\")\nstream = openai_client.chat.completions.create(\n model=\"game_generation\", stream=True,\n messages=[{\"role\": \"user\", \"content\": \"Design a level, then call the tool.\"}],\n tools=[{\"type\": \"function\", \"function\": {\n \"name\": \"save_level\",\n \"parameters\": {\"type\": \"object\", \"properties\": {\"name\": {\"type\": \"string\"}}}}}],\n)\nstream_text = \"\".join(\n chunk.choices[0].delta.content or \"\" for chunk in stream)\n```\n\nA non-streaming tools call returns `tool_calls` on the message with `finish_reason=\"tool_calls\"`; send each result back as a `{\"role\": \"tool\", \"tool_call_id\": ..., \"content\": ...}` message. The Anthropic client uses `tools` with `input_schema` and receives `tool_use` content blocks.\n\nNative SDK: `ashr.infer(task, input, alias=\"production\", max_new_tokens=1024)` returns the parsed `output`, per-field `decisions`, `usage`, `deployment`, and `interaction_id`. Read `deployment.alias` for the actual selection; the top-level alias is the requested one.\n\n`ashr.infer` (and `POST /v1/inference/{task}`) is **deprecated for chat and agentic models** \u2014 use the Anthropic or OpenAI client shown above, which serve the hosted model directly with tools and streaming. It remains supported, and is the right choice, for structured-output tasks (e.g. classification) that need the per-field `decisions` capture the transparent surfaces don't produce. It is not being removed.\n\n### Supported requests and generation limits\n\n- Model: `task` or `task@alias`; default alias is `production`.\n- Both surfaces are served by the same hosted model \u2014 OpenAI (`/v1/chat/completions`) is translated to Anthropic Messages at the edge \u2014 so the same model key works from either SDK. `system`/`user`/`assistant`/`tool` roles, `temperature`, `top_p`, and `stop` are supported; `max_completion_tokens` takes precedence over `max_tokens`.\n- **Tools and streaming are supported on both surfaces.** OpenAI `tools` come back as `tool_calls` (with `finish_reason: \"tool_calls\"`), `tool` messages carry results back, and `stream: true` yields `chat.completion.chunk` events including tool-call deltas and final usage. The Anthropic surface forwards request and response bodies unchanged \u2014 tools, thinking, and streams \u2014 subject to the hosted model\u2019s capabilities.\n- OpenAI multimodal (image) content is not supported; a message whose content is not text is rejected. Older API deployments support only text and reject streaming; verify your deployed revision.\n- Token limits must be positive. Omitted limits use remaining model context; the Anthropic Python client requires `max_tokens`. Configure client timeouts for your budget.\n- Platform keys (`ask_`) support platform operations. Model keys (`msk_`) grant inference for one task; use a platform key for feedback and training.\n\n### Completion evidence and feedback\n\nNo capture wrapper is needed for hosted calls. OpenAI responses add `manifold` metadata:\n\n```python\nmetadata = response.model_dump()[\"manifold\"]\ninteraction_id = metadata[\"interaction_id\"]\n# After actual review, and only if interaction_id is not None:\n# ashr.feedback(interaction_id, \"confirmed\", by=\"reviewer-142\")\n```\n\nIncludes task, actual alias, and deployment ID. Both surfaces return the capture ID in the `X-Manifold-Interaction-Id` header on non-streaming responses (read it via each client\u2019s raw-response interface); the OpenAI non-streaming body also carries it in the `manifold` block above. Streams return no capture ID; their capture retains text deltas, not tool/thinking deltas, even though those events reach the caller. Capture failure returns a null interaction ID without failing a completed answer. Do not attach feedback to a missing ID.\n\nOpenAI finish reasons: `stop`/`length`/`tool_calls`; null means missing/unrecognized worker evidence. Anthropic stop reasons are passed through from the hosted model. Inspect truncated output. Literal text is retained in `sampling_params.raw_text` when available; retained context is not automatically supervised training data.\n\n### Canary rollout and rollback\n\n```python\nincumbent = ashr.deployments.resolve(\"support_routing\", alias=\"production\")\ncanary = experiment.promote(candidate_id, alias=\"canary\")\nashr.router.configure(\n task=\"support_routing\", incumbent_model_id=incumbent[\"model_id\"],\n challenger_model_id=canary[\"model_id\"], traffic_percent=5,\n)\nashr.router.set_traffic(\"support_routing\", 0) # stop automatic canary selection\n```\n\nUse a passing candidate ID. Production requests participate in the split; explicit `@canary` bypasses it, even at zero traffic. OpenAI `user` or Anthropic `metadata.user_id` makes assignment sticky; without a key it is per request. Native `infer()` has no request-key parameter.\n\nAutomatic routing falls back to production if canary is absent, unavailable, or mismatched. Check returned deployment metadata. Alias-history rollback is separate: `deployments.rollback(deployment_id)`.\n\n### Hosting failures and separate endpoints\n\n- 401: invalid key/environment. 409: alias lacks a loadable artifact.\n- 400/422: local request validation failed. Anthropic upstream failures become 502, or an error event after a stream opens. 502 also indicates inference gateway failure.\n- Timeout: completion may be unknown; a retry can duplicate work.\n\nVerify an authenticated request through the intended alias; health and alias existence do not prove GPU readiness. The standalone `ashr-model-api` uses its own fixed model and endpoint key, without Manifold tenant lookup or billing. Obtain its details from the operator; do not assume those calls appear in Production.\n\n## Deploy and monitor\n\n### Promote and resolve\n\nAfter reviewing metrics and gates, select a passing candidate:\n\n```python\ndeployment = experiment.promote(candidate_id, alias=\"production\")\nproduction = ashr.deployments.resolve(\"support_routing\")\n# To restore the previous revision:\n# ashr.deployments.rollback(deployment[\"id\"])\n```\n\n`deployments.list(task=...)` lists aliases; `get(id)` reads deployment details. Training completion is not serving readiness or evidence of quality.\n\n### Read production metrics\n\n```python\nhealth = ashr.monitoring.model(\"m_router\", days=30)\ndaily = ashr.monitoring.timeseries(\"m_router\", days=30)\ncomparison = ashr.monitoring.compare(\"m_previous\", \"m_router\", days=30)\ndrift = ashr.monitoring.drift(\"m_router\", days=30, minimum_reviewed=20)\n```\n\nInspect volume, review coverage, correction rate, and latency. Reviewer rates use reviewed observations; pending output is not counted as correct.\n\n### Create an alert\n\n```python\npolicy = ashr.monitoring.create_alert(\n name=\"Routing correction rate\", model_id=\"m_router\",\n metric=\"correction_rate\", operator=\"gte\", threshold=0.08,\n window_days=7, minimum_observations=50,\n)\npolicies = ashr.monitoring.alert_policies()\nalerts = ashr.monitoring.alerts(limit=100)\n```\n\n`evaluate_alerts()` evaluates policies now. Scheduled checks depend on the deployed monitoring worker.\n\n## Pipelines and progress\n\nPipeline shows stage evidence; Data sources shows owned/shared source access. Use an ID from `pipelines.list()`; `manifold_loop` exists only after it has been seeded.\n\n### Reading progress\n\n```python\npipelines = ashr.pipelines.list()\nstatus = ashr.pipelines.status(\"manifold_loop\", task=\"document_parsing\")\nprint(status.progress, status.stage(\"capture\"))\nfresh = status.refresh(task=\"document_parsing\")\n```\n\n- `progress.unbroken`: completed prefix; `complete`: all completed stages, including those past a gap.\n- `next` and `startable`: next gap and stages whose dependencies permit running.\n- `status.complete`, `blocked`, `failed`, `unknown`, `stale`, `startable`, and `gates`: filtered stage lists. `state(id)` reads one state.\n- `unknown`: probe could not run, not pending. Freshness uses `observedAt`, `ageSeconds`, `stale`, and each probe\u2019s TTL. `refresh=True` re-probes.\n\n### Writing a definition\n\n```python\nashr.pipelines.put({\n \"schemaVersion\": 1, \"id\": \"my_pipeline\", \"label\": \"My pipeline\",\n \"phases\": [{\"id\": \"acquire\", \"label\": \"Acquire\", \"stages\": [{\n \"id\": \"reachable\", \"title\": \"Data is reachable\",\n \"probe\": {\n \"kind\": \"object_store\", \"storeRef\": \"corpus\", \"prefix\": \"sessions/\",\n \"maxObjects\": 10000,\n \"extract\": {\"objects\": {\"path\": \"$.Contents[*]\", \"agg\": \"count\"}},\n \"complete\": {\"gte\": [\"objects\", 1]},\n \"detail\": \"{objects} objects reachable\", \"ttlSeconds\": 3600,\n },\n }]}],\n})\n```\n\n`put()` validates tenant-safe probes and invalidates cached readings. `get(id)`, `delete(id)`, and `registries()` manage definitions and allowed probe/query names. Full schema: `docs/pipelines.md`.\n\n### Data sources\n\n```python\nashr.pipelines.data_sources.put(\n \"corpus\", provider=\"s3_compatible\", bucket=\"my-corpus\",\n endpoint=\"https://nyc3.digitaloceanspaces.com\", allowed_prefixes=[\"sessions/\"],\n credential_ref=\"awssm://YOUR_SECRET_REFERENCE\",\n)\nsources = ashr.pipelines.data_sources.list()\naccess = ashr.pipelines.data_sources.check(\"corpus\")\nprint(access)\n```\n\nSupply either a secret reference or `credentials={\"access_key_id\": ..., \"secret_access_key\": ...}`. Credentials are accepted once and never returned. Empty `allowed_prefixes` grants no access; probes name the source alias.\n\nFor shared data, set `shared_from` and optionally `shared_from_tenant_id`; resolved `sharing.from_tenant` takes precedence over the label. `credential.name` is a pointer, not secret material. `delete(alias)` removes a source.\n\nA configured credential does not prove access. Inspect `reachable`, `error`, and `truncated`; a capped listing is a lower bound. S3-compatible checks list metadata only. GCS, Azure Blob, and HTTPS can be registered but report unsupported listing, so their probes read `unknown`.\n\n## Reliability and lifecycle\n\n### Handle errors\n\n```python\nfrom ashr_sdk import AshrClient, AshrError\n\ntry:\n with AshrClient(timeout=180) as ashr:\n health = ashr.monitoring.model(\"m_router\")\nexcept AshrError as error:\n print(error.status_code, error.request_id, str(error))\n```\n\nInclude request IDs when reporting failures. API errors and transport failures raise `AshrError`; transport failures may have no status or request ID. Reconcile timed-out writes before retrying.\n\n### Manage the client\n\nUse a context manager for scripts, or reuse one `AshrClient` and call `close()` at shutdown. Module-level capture uses `flush()` before exit. Never place service keys in browser code; the platform uses Clerk through its same-origin API.\n", "/// <reference path=\"./sdk-markdown.d.ts\" />\nimport sdkMarkdown from \"../../../docs/sdk.md?raw\";\n\nexport interface SdkReference {\n title: string;\n content: string;\n}\nconst documentTitle =\n /^# (.+)$/m.exec(sdkMarkdown)?.[1] ?? \"Manifold Python SDK\";\nconst sections: Array<{\n title: string;\n slug: string;\n start: number;\n end: number;\n}> = [];\nlet offset = 0,\n fenced = false;\nfor (const line of sdkMarkdown.split(/(?<=\\n)/)) {\n if (line.startsWith(\"```\")) fenced = !fenced;\n const heading = !fenced ? /^## ([^\\r\\n]+)\\r?\\n?$/.exec(line) : null;\n if (heading) {\n const previous = sections.at(-1);\n if (previous) previous.end = offset;\n const title = heading[1]!;\n // Same section slugs as dashboard/app/sdk/sdk-page.tsx.\n const slug = title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\");\n sections.push({ title, slug, start: offset, end: sdkMarkdown.length });\n }\n offset += line.length;\n}\n\n/** Read the browser's actual checked-in guide, retaining complete prose and code. */\nexport function sdkReference(topic?: string): SdkReference {\n const selected = topic || \"quickstart\";\n if (selected === \"all\") return { title: documentTitle, content: sdkMarkdown };\n if (selected === \"index\")\n return {\n title: documentTitle,\n content:\n sections\n .map((section) => `- ${section.title}: /sdk ${section.slug}`)\n .join(\"\\n\") +\n \"\\n\\n/sdk all reads the complete guide. /sdk defaults to Quickstart.\",\n };\n const section = sections.find((candidate) => candidate.slug === selected);\n if (!section) throw Error(`Unknown SDK topic '${selected}'. Use /sdk index.`);\n return {\n title: section.title,\n content: sdkMarkdown.slice(section.start, section.end),\n };\n}\n", "import {open,readFile,rename,unlink} from 'node:fs/promises';\nimport {randomUUID} from 'node:crypto';\nimport type {DashboardContext} from './dashboard.js';\ntype Message={role:'user'|'assistant';content:string};\ntype Conversation={version:1;task:string;api_origin?:string;messages:Message[];turns:{events:unknown[];status:'streaming'|'complete'|'interrupted'}[]};\n/** Samples with the terminal's own credential. Conversations hold messages and stream events, never a key. */\nexport async function sampleModel(context:DashboardContext,model:string,prompt:string,maxTokens:number,temperature:number,file:string|undefined,show:(title:string,value:unknown)=>void) {\n const stream=context.client.requestStream;\n if(!stream)throw Error('This client does not support streaming samples');\n let conversation:Conversation={version:1,task:model,api_origin:context.client.apiOrigin,messages:[],turns:[]};\n let resumed=false;\n if(file){\n if(!context.client.apiOrigin)throw Error('Conversation requires a client with a verified API origin');\n try{conversation=JSON.parse(await readFile(file,'utf8')) as Conversation;resumed=true;}\n catch(error){if((error as NodeJS.ErrnoException).code!=='ENOENT')throw Error('Conversation must be a readable terminal sample JSON file');const handle=await open(file,'wx',0o600);await handle.close();}\n if(conversation.version!==1||conversation.task!==model||!Array.isArray(conversation.messages)||!Array.isArray(conversation.turns)||conversation.messages.some(m=>!m||!['user','assistant'].includes(m.role)||typeof m.content!=='string'))throw Error('Conversation task or format does not match this sample');\n if(resumed){\n if(conversation.api_origin!==context.client.apiOrigin)throw Error('Conversation API origin does not match; no history was sent');\n }\n }\n const persist=async()=>{\n if(!file)return;\n const temp=`${file}.${randomUUID()}.tmp`;const handle=await open(temp,'wx',0o600);\n try{await handle.writeFile(JSON.stringify(conversation,null,2)+'\\n');await handle.sync();await handle.close();await rename(temp,file);}catch(error){await handle.close().catch(()=>{});await unlink(temp).catch(()=>{});throw error;}\n };\n context.signal?.throwIfAborted();\n conversation.messages.push({role:'user',content:prompt});\n const messages=[...conversation.messages];const assistant:Message={role:'assistant',content:''};\n conversation.messages.push(assistant);const turn:Conversation['turns'][number]={events:[],status:'streaming'};conversation.turns.push(turn);\n await persist();\n try{\n const response=await stream.call(context.client,'/v1/messages',{method:'POST',signal:context.signal,body:JSON.stringify({model,max_tokens:maxTokens,temperature,stream:true,messages})});\n if(!response.body)throw Error('Sample response has no stream');\n const reader=response.body.getReader();const decoder=new TextDecoder();let buffer='';let complete=false;\n const cancel=()=>{void reader.cancel(context.signal?.reason);};context.signal?.addEventListener('abort',cancel,{once:true});\n const event=async(block:string)=>{\n const data=block.split('\\n').filter(line=>line.startsWith('data:')).map(line=>line.slice(5).trimStart()).join('\\n');if(!data)return;\n if(data==='[DONE]'){complete=true;return;}\n const value=JSON.parse(data);turn.events.push(value);\n if(value.type==='error'||value.error)throw Error('Model stream error: '+JSON.stringify(value.error??value));\n const text=value.type==='content_block_delta'&&value.delta?.type==='text_delta' ? value.delta.text : value.type==='content_block_start' ? value.content_block?.text : value.choices?.[0]?.delta?.content;\n if(typeof text==='string'&&text){assistant.content+=text;show('Sample text',text);}\n if(value.type==='message_stop')complete=true;\n await persist();\n };\n try{while(true){context.signal?.throwIfAborted();const part=await reader.read();buffer+=decoder.decode(part.value,{stream:!part.done});buffer=buffer.replace(/\\r\\n/g,'\\n');let split;while((split=buffer.indexOf('\\n\\n'))>=0){await event(buffer.slice(0,split));buffer=buffer.slice(split+2);}if(part.done)break;}context.signal?.throwIfAborted();if(buffer.trim())await event(buffer);if(!complete)throw Error('Model stream incomplete; partial conversation retained. A new sample is a new paid request.');}\n finally{context.signal?.removeEventListener('abort',cancel);await reader.cancel().catch(()=>{});}\n turn.status='complete';await persist();show('Model sample',{task:model,message:assistant,events:turn.events,conversation:file??null});\n }catch(error){turn.status='interrupted';if(!assistant.content)conversation.messages.pop();await persist();const message=error instanceof Error?error.message:String(error);throw Error(message);}\n}\n", "import { sdkReference } from \"./sdk-reference.js\";\nimport { sampleModel } from \"./dashboard-sample.js\";\nimport { parse } from \"shell-quote\";\nimport { readFile } from \"node:fs/promises\";\nimport { downloadArtifact, uploadFile } from \"./dashboard-files.js\";\n\n/** Structural contract shared with ManifoldClient. Authentication stays in the client/server. */\nexport interface DashboardClient { readonly apiOrigin?: string; request<T>(path: string, init?: RequestInit): Promise<T>; requestStream?(path: string, init?: RequestInit): Promise<Response> }\nexport interface DashboardContext { client: DashboardClient; task?: string; signal?: AbortSignal; show(title: string, value: unknown): void }\ntype Args = { values: string[]; options: Record<string, string>; confirm: boolean };\ntype Operation = { path: string; method?: string; body?: unknown };\nconst enc = encodeURIComponent;\n\nexport const dashboardHelpLines = [\n '/dashboard help \u2014 commands use shell-quoted arguments; writes require repeating with --confirm',\n '/pipelines list | show ID | status ID | task [TASK]',\n '/runs list [--app-name NAME --limit N] | show ID [--logs true|false] | claims',\n '/runs sync --confirm | explain ID [--regenerate true|false] --confirm (paid log explanation)',\n '/sources list | check ALIAS --confirm',\n '/sources objects ALIAS --limit N [--prefix PREFIX]',\n '/sources connect ALIAS --config FILE --confirm | disconnect ALIAS --confirm',\n '/datasets list [--task TASK]; /evals list [--limit N --after CURSOR --pipeline-id ID] | show ID | report ID',\n '/evals results ID --model-run-id ID [--limit N --after CURSOR]',\n '/benchmarks list [--task TASK --benchmark NAME --status STATUS --limit N --offset N] | show EXPERIMENT',\n '/benchmarks events TRAINING_RUN [--limit N --after CURSOR --kind KIND,KIND --query TEXT --problems-only true|false]',\n '/experiments list [--task TASK] | show ID | comparison ID | estimate ID',\n '/models list; /monitoring summary MODEL | series MODEL | drift MODEL [--days N]',\n '/monitoring compare BASELINE CANDIDATE [--days N]',\n '/interactions list [--task TASK --model-id ID --feedback-status STATUS --limit N --offset N] | show ID',\n '/uploads list | status ID --key KEY | cancel ID --key KEY --confirm',\n '/uploads send FILE --receipt FILE --confirm | retry RECEIPT --confirm (server parts are resume authority)',\n '/artifacts list [--kind KIND --limit N --has-weights true|false] | records [--kind KIND] | show ID',\n '/artifacts download VOLUME PATH --output FILE [--format resume|adapter] --confirm',\n '/artifacts download-record ID --output FILE --confirm (never overwrites)',\n '/serving list | pools | show ID',\n '/serving promote EXPERIMENT CANDIDATE [--alias production] --confirm',\n '/serving sample \"PROMPT\" [--task TASK --max-tokens N --temperature N --conversation FILE] --confirm',\n '/sdk [TOPIC|index|all] \u2014 read the shared SDK guide; index lists browser section names',\n];\n\nfunction argumentsFor(tokens: string[]): Args {\n const values: string[] = []; const options: Record<string, string> = {}; let confirm = false;\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]!;\n if (token === '--confirm') { if (confirm) throw Error('Duplicate --confirm'); confirm = true; }\n else if (token.startsWith('--')) {\n const key = token.slice(2); const value = tokens[++i];\n if (!key || value === undefined || value.startsWith('--') || Object.hasOwn(options, key)) throw Error(`Expected one value for ${token}`);\n options[key] = value;\n } else values.push(token);\n }\n return {values, options, confirm};\n}\nfunction validate(a: Args, min: number, max: number, allowed: string[] = []) {\n if (a.values.length < min || a.values.length > max) throw Error(`Expected ${min === max ? min : `${min}\u2013${max}`} positional arguments; see /dashboard help`);\n for (const key of Object.keys(a.options)) if (!allowed.includes(key)) throw Error(`Unknown option --${key}`);\n}\nfunction required(a: Args, key: string) {const value = a.options[key]; if (!value) throw Error(`Required --${key}`); return value;}\nfunction task(a: Args, context: DashboardContext) {const value = a.options.task ?? context.task; if (!value) throw Error('Select a task or pass --task TASK'); return value;}\nfunction query(path: string, a: Args, keys: string[], defaults: Record<string,string> = {}) {\n const params = new URLSearchParams();\n for (const key of keys) if (a.options[key] !== undefined) params.set(key.replaceAll('-', '_'), a.options[key]!);\n for (const [key,value] of Object.entries(defaults)) if (!params.has(key)) params.set(key,value);\n return path + (params.size ? `?${params}` : '');\n}\nfunction clean(value: unknown): unknown {\n // JSON rendering preserves the data while escaping strings that could control the terminal.\n if (typeof value === 'string') return value.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, c => `\\\\u${c.charCodeAt(0).toString(16).padStart(4,'0')}`);\n if (Array.isArray(value)) return value.map(clean);\n if (value && typeof value === 'object') return Object.fromEntries(Object.entries(value).map(([k,v]) => [String(clean(k)),clean(v)]));\n return value;\n}\nfunction confirmation(context: DashboardContext, a: Args, title: string, target: unknown): boolean {\n if (a.confirm) return true;\n context.show('Confirmation required', clean({action:title,target, instruction:'Repeat the exact command with --confirm. No write was sent.'})); return false;\n}\n\nfunction currentBenchmarkStatus(row: Record<string,unknown>): unknown {\n const candidates=Array.isArray(row.candidates) ? row.candidates as Record<string,unknown>[] : [];\n const base=candidates.find(candidate => candidate.recipe==='external_ptb' && (candidate.config as Record<string,unknown>|undefined)?.ptb_role==='base');\n const runs=Array.isArray(base?.runs) ? base.runs as Record<string,unknown>[] : [];\n const stamp=(run:Record<string,unknown>) => {const value=Date.parse(String(run.started_at??run.created_at??''));return Number.isNaN(value) ? -Infinity : value;};\n const latest=[...runs].sort((a,b)=>stamp(a)-stamp(b)).at(-1);\n return latest?.status ?? null;\n}\n\nexport async function runDashboardCommand(input: string, context: DashboardContext): Promise<boolean> {\n const family = input.trim().split(/\\s/)[0]?.slice(1);\n if (!input.trim().startsWith('/') || !['dashboard','pipelines','runs','sources','datasets','evals','benchmarks','experiments','models','monitoring','interactions','uploads','artifacts','serving','sdk'].includes(family ?? '')) return false;\n const sensitiveValues: string[] = [];\n const redact = (value: unknown): unknown => {\n if (typeof value === 'string') return sensitiveValues.reduce((text,secret) => text.split(secret).join('[credential]'),value);\n if (Array.isArray(value)) return value.map(redact);\n if (value && typeof value === 'object') return Object.fromEntries(Object.entries(value).map(([key,item]) => [key,redact(item)]));\n return value;\n };\n const show = (title: string, value: unknown) => context.show(title, clean(redact(value)));\n const client: DashboardClient = {request: <T>(path: string, init?: RequestInit) => context.client.request<T>(path,context.signal ? {...init,signal:context.signal} : init)};\n try {\n // Disable environment expansion, command substitution, and shell operators.\n const parsed = parse(input, () => { throw Error('Environment expansion is unavailable; use literal quoted values'); });\n if (parsed.some(token => typeof token !== 'string')) throw Error('Shell operators and comments are unavailable');\n const tokens = parsed as string[]; tokens.shift();\n const action = tokens.shift() ?? (family === 'sdk' ? '' : 'list');\n const a = argumentsFor(tokens); const v = a.values;\n if (family === 'dashboard' || action === 'help') {show('Hosted dashboard commands',dashboardHelpLines);return true;}\n if (family === 'sdk') {\n validate(a,0,0); const topic = action;\n const reference=sdkReference(topic);\n // Trusted checked-in prose keeps line breaks; HostedScreen escapes terminal controls.\n context.show(reference.title,reference.content); return true;\n }\n if (family === 'benchmarks') {\n if (action === 'show') {validate(a,1,1);show('Benchmark experiment',await client.request(`/v1/experiments/${enc(v[0]!)}`));return true;}\n if (action === 'events') {\n validate(a,1,1,['limit','after','kind','query','problems-only']);\n const limit=Number(a.options.limit ?? 200);if(!Number.isInteger(limit)||limit<1||limit>500)throw Error('Event limit must be 1\u2013500');\n if(a.options['problems-only'] && !['true','false'].includes(a.options['problems-only']))throw Error('problems-only must be true or false');\n const path=query(`/v1/training-runs/${enc(v[0]!)}`,a,['after','limit'],{limit:String(limit)});\n const page=await client.request<Record<string,unknown> & {events?:Record<string,unknown>[]}>(path);\n const events=page.events ?? [],kinds=a.options.kind ? new Set(a.options.kind.split(',')) : undefined,needle=(a.options.query??'').trim().toLowerCase();\n const filtered=events.filter(event => (!kinds || kinds.has(String(event.event))) && (a.options['problems-only']!=='true' || ['warning','warn','error','critical'].includes(String(event.level??'').toLowerCase()) || ['integrity_flag','stopped'].includes(String(event.event))) && (!needle || `${event.event} ${event.message??''} ${JSON.stringify(Object.fromEntries(Object.entries((event.metadata as Record<string,unknown>)??{}).filter(([key])=>key!=='event_key')))}`.toLowerCase().includes(needle))).reverse();\n show('Benchmark event page',{...page,events:filtered,page_event_count:events.length,filtered_event_count:filtered.length,filters_apply_to:'this event page; use next_after to read the next page'});return true;\n }\n if (action !== 'list') throw Error('Use /benchmarks list, show or events');\n validate(a,0,0,['task','benchmark','status','limit','offset']);\n const rows = await client.request<Record<string,unknown>[]>('/v1/experiments');\n const selectedTask = a.options.task ?? context.task;\n const normalize = (t:unknown) => String(t??'').trim().toLowerCase().replace(/[\\s-]+/g,'_');\n const filtered = rows.filter(row => {\n const cfg = row.eval_config as Record<string,unknown> | undefined;\n return cfg?.kind === 'ptb_benchmark_run' && (!selectedTask || normalize(row.task) === normalize(selectedTask)) && (!a.options.benchmark || cfg.benchmark === a.options.benchmark) && (!a.options.status || currentBenchmarkStatus(row) === a.options.status);\n });\n const limit = Number(a.options.limit ?? 25), offset = Number(a.options.offset ?? 0);\n if (!Number.isInteger(limit) || limit < 1 || limit > 200 || !Number.isInteger(offset) || offset < 0) throw Error('limit must be 1\u2013200; offset must be nonnegative');\n show('Benchmark runs', {items:filtered.slice(offset,offset+limit),total:filtered.length,limit,offset,next_offset:offset+limit < filtered.length ? offset+limit : null, pagination:'client-side; backend experiment list is not paginated'});return true;\n }\n if (family === 'uploads' && ['send','retry'].includes(action)) {\n validate(a,1,1,action === 'send' ? ['receipt'] : []);\n if (action === 'send') required(a,'receipt');\n if (confirmation(context,a,`Upload ${action}`,{file:v[0],receipt:a.options.receipt})) await uploadFile(action,v[0]!,a.options.receipt,client,show,context.signal);\n return true;\n }\n if (family === 'artifacts' && ['download','download-record'].includes(action)) {\n validate(a,action === 'download' ? 2 : 1,action === 'download' ? 2 : 1,action === 'download' ? ['output','format'] : ['output']);\n required(a,'output'); const format = a.options.format ?? 'resume'; if (!['resume','adapter'].includes(format)) throw Error('format must be resume or adapter');\n if (confirmation(context,a,'Download artifact',{source:v,output:a.options.output,format})) {\n const path = action === 'download' ? '/v1/modal-artifacts/download-url' : `/v1/artifacts/${enc(v[0]!)}/access-url`;\n const body = action === 'download' ? {volume:v[0],path:v[1],format} : {expires_in:300};\n await downloadArtifact(client,path,body,a.options.output!,show,context.signal);\n }\n return true;\n }\n if (family === 'serving' && action === 'sample') {\n validate(a,1,1,['task','max-tokens','temperature','conversation']); const model = task(a,context);\n const maxTokens = Number(a.options['max-tokens'] ?? 256), temperature = Number(a.options.temperature ?? 0.7);\n if (!Number.isInteger(maxTokens) || maxTokens < 1 || maxTokens > 8192 || !Number.isFinite(temperature) || temperature < 0 || temperature > 2) throw Error('max-tokens must be 1\u20138192; temperature must be 0\u20132');\n if (!confirmation(context,a,'Sample model (inference spend)',{task:model,prompt:v[0],max_tokens:maxTokens,temperature,conversation:a.options.conversation})) return true;\n await sampleModel(context,model,v[0]!,maxTokens,temperature,a.options.conversation,show);\n\n return true;\n }\n let op: Operation | undefined;\n const read = (path:string,min=0,max=min,opts:string[]=[]) => {validate(a,min,max,opts);op={path};};\n const write = (path:string,method:string,body:unknown,min:number,max=min,opts:string[]=[]) => {validate(a,min,max,opts);op={path,method,body};};\n if (family === 'pipelines') {\n if (action === 'list') read('/v1/pipelines');\n if (action === 'show' || action === 'status') read(`/v1/pipelines/${enc(v[0]??'')}${action === 'status' ? '/status' : ''}`,1);\n if (action === 'task') {validate(a,0,1);const selected = v[0] ?? context.task;if (!selected) throw Error('Select a task or provide TASK');op={path:`/v1/tasks/${enc(selected)}/pipeline`};}\n } else if (family === 'runs') {\n if (action === 'list') read(query('/v1/modal-runs',a,['app-name','limit']),0,0,['app-name','limit']);\n if (action === 'show') read(query(`/v1/modal-runs/${enc(v[0]??'')}`,a,['logs']),1,1,['logs']);\n if (action === 'claims') read('/v1/modal-run-claims');\n if (action === 'sync') write('/v1/modal-runs/sync','POST',undefined,0);\n if (action === 'explain') write(query(`/v1/modal-runs/${enc(v[0]??'')}/explain`,a,['regenerate']),'POST',undefined,1,1,['regenerate']);\n } else if (family === 'sources') {\n if (action === 'list') read('/v1/pipeline-data-sources');\n if (action === 'objects') {required(a,'limit');read(query(`/v1/pipeline-data-sources/${enc(v[0]??'')}/objects`,a,['limit','prefix']),1,1,['limit','prefix']);}\n if (action === 'check') write(`/v1/pipeline-data-sources/${enc(v[0]??'')}/check`,'POST',undefined,1);\n if (action === 'disconnect') write(`/v1/pipeline-data-sources/${enc(v[0]??'')}`,'DELETE',undefined,1);\n if (action === 'connect') {validate(a,1,1,['config']);const config = required(a,'config');if (!confirmation(context,a,'Connect data source',{alias:v[0],config})) return true;let body: Record<string,unknown>;\n try {body = JSON.parse(await readFile(config,'utf8')) as Record<string,unknown>;} catch {throw Error('Source config must be a readable JSON object');}\n if (!body || typeof body !== 'object' || Array.isArray(body)) throw Error('Source config must be a JSON object');\n if (body.credentials && typeof body.credentials === 'object') for (const value of Object.values(body.credentials)) if (typeof value === 'string' && value) sensitiveValues.push(value);\n if (typeof body.credential_ref === 'string' && body.credential_ref) sensitiveValues.push(body.credential_ref);\n op={path:`/v1/pipeline-data-sources/${enc(v[0]!)}`,method:'PUT',body};}\n } else if (family === 'datasets' || family === 'models') {if (action === 'list') read(`/v1/${family}`,0,0,family === 'datasets' ? ['task'] : []);}\n else if (family === 'evals') {\n const path = `/v1/evaluation-runs/${enc(v[0]??'')}`;\n if (action === 'list') read(query('/v1/evaluation-runs',a,['limit','after']),0,0,['limit','after','pipeline-id']);\n if (action === 'show' || action === 'report') read(path+(action === 'report' ? '/report' : ''),1);\n if (action === 'results') {required(a,'model-run-id');read(query(`${path}/task-results`,a,['model-run-id','after','limit']),1,1,['model-run-id','after','limit']);}\n } else if (family === 'experiments') {\n if (action === 'list') read('/v1/experiments',0,0,['task']);\n if (['show','comparison','estimate'].includes(action)) read(`/v1/experiments/${enc(v[0]??'')}${action === 'show' ? '' : '/'+action}`,1);\n } else if (family === 'monitoring') {\n if (['summary','series','drift'].includes(action)) read(query(`/v1/models/${enc(v[0]??'')}/monitoring${action === 'summary' ? '' : action === 'series' ? '/timeseries' : '/drift'}`,a,['days','minimum-reviewed']),1,1,action === 'drift' ? ['days','minimum-reviewed'] : ['days']);\n if (action === 'compare') read(query('/v1/monitoring/compare',a,['days'],{baseline_model_id:v[0]??'',candidate_model_id:v[1]??''}),2,2,['days']);\n } else if (family === 'interactions') {\n if (action === 'list') read(query('/v1/interactions',a,['limit','offset','feedback-status','model-id','task'],context.task ? {task:context.task} : {}),0,0,['task','model-id','feedback-status','limit','offset']);\n if (action === 'show') read(`/v1/interactions/${enc(v[0]??'')}`,1);\n } else if (family === 'uploads') {\n if (action === 'list') read('/v1/uploads');\n if (action === 'status' || action === 'cancel') {required(a,'key');validate(a,1,1,['key']);op={path:query(`/v1/uploads/${enc(v[0]!)}/${action === 'status' ? 'status' : 'abort'}`,a,['key']),method:action === 'cancel' ? 'POST' : undefined};}\n } else if (family === 'artifacts') {\n if (action === 'list') read(query('/v1/modal-artifacts',a,['kind','limit']),0,0,['kind','limit','has-weights']);\n if (action === 'records') read(query('/v1/artifacts',a,['kind']),0,0,['kind']);\n if (action === 'show') read(`/v1/artifacts/${enc(v[0]??'')}`,1);\n } else if (family === 'serving') {\n if (action === 'list') read('/v1/deployments');\n if (action === 'pools') read('/v1/serving/pools');\n if (action === 'show') read(`/v1/deployments/${enc(v[0]??'')}`,1);\n if (action === 'promote') write(`/v1/experiments/${enc(v[0]??'')}/promote`,'POST',{candidate_id:v[1],alias:a.options.alias??'production'},2,2,['alias']);\n }\n if (!op) throw Error(`Unknown ${family} action '${action}'; see /dashboard help`);\n if (op.method && !confirmation(context,a,`${family} ${action}`,{method:op.method,path:op.path,...(family === 'sources' && action === 'connect' ? {config:a.options.config} : {body:op.body,...(a.options.output ? {output:a.options.output} : {})})})) return true;\n const init = op.method ? {method:op.method,...(op.body === undefined ? {} : {body:JSON.stringify(op.body)})} : undefined;\n let result = await client.request<unknown>(op.path,init);\n if (family === 'evals' && action === 'list' && a.options['pipeline-id']) {\n const page=result as {items?:Record<string,unknown>[]};\n if(Array.isArray(page.items))result={...page,items:page.items.filter(row=>row.pipeline_id===a.options['pipeline-id']),filters_apply_to:'this page; use next_cursor for the next page'};\n }\n if (family === 'artifacts' && action === 'list' && a.options['has-weights']) {\n if(!['true','false'].includes(a.options['has-weights']))throw Error('has-weights must be true or false');\n const page=result as {artifacts?:Record<string,unknown>[]};\n if(Array.isArray(page.artifacts))result={...page,artifacts:page.artifacts.filter(row=>row.has_weights===(a.options['has-weights']==='true'))};\n }\n const selectedTask = a.options.task ?? context.task;\n if (selectedTask && action === 'list' && ['datasets','experiments'].includes(family!) && Array.isArray(result)) result=result.filter(row => row?.task === selectedTask);\n show(`${family} ${action}`,result);\n } catch (error) {show('Dashboard command failed', error instanceof Error ? error.message : String(error));}\n return true;\n}\n", "import { createHash } from 'node:crypto';\nimport { createReadStream } from 'node:fs';\nimport { open, readFile, rename, stat, unlink, writeFile } from 'node:fs/promises';\nimport { basename, resolve } from 'node:path';\nimport { Readable } from 'node:stream';\nimport { pipeline } from 'node:stream/promises';\nimport type { DashboardClient } from './dashboard.js';\ntype Show = (title:string,value:unknown) => void;\ntype Part = {part_number:number;etag:string;size?:number};\ntype Receipt = {version:1;file:string;size:number;sha256:string;state:'creating'|'uploading'|'completing'|'complete';upload_id?:string;key?:string;part_size?:number;part_count?:number};\nfunction transferUrl(value:string): string {\n const url = new URL(value);\n if (url.username || url.password || !(url.protocol === 'https:' || (url.protocol === 'http:' && ['127.0.0.1','localhost','[::1]'].includes(url.hostname)))) throw Error('Transfer URL must use HTTPS (or loopback for local fixtures)');\n return url.href;\n}\nexport async function downloadArtifact(client:DashboardClient,path:string,body:unknown,output:string,show:Show,signal?:AbortSignal) {\n // Exclusive local destination selected by the user; Content-Disposition is never used.\n signal?.throwIfAborted();const destination=resolve(output); const handle=await open(destination,'wx',0o600);\n try {\n const grant=await client.request<{url:string}>(path,{method:'POST',body:JSON.stringify(body),...(signal ? {signal} : {})});\n const response=await fetch(transferUrl(grant.url),{redirect:'error',signal});\n if (!response.ok || !response.body) throw Error(`Artifact download failed (${response.status})`);\n await pipeline(Readable.fromWeb(response.body as import('node:stream/web').ReadableStream),handle.createWriteStream(),{signal});\n show('Artifact downloaded',{output:destination,bytes:(await stat(destination)).size});\n } catch(error) {await handle.close().catch(()=>{});await unlink(destination).catch(()=>{});throw error;}\n finally {await handle.close().catch(()=>{});}\n}\nasync function fingerprint(file:string,signal?:AbortSignal) {\n const info=await stat(file);if(!info.isFile() || info.size < 1)throw Error('Upload requires a nonempty regular file');\n const hash=createHash('sha256');for await(const chunk of createReadStream(file,{signal})){signal?.throwIfAborted();hash.update(chunk);}\n return {size:info.size,sha256:hash.digest('hex')};\n}\nasync function save(path:string,receipt:Receipt) {\n const temporary=path+'.tmp'; await writeFile(temporary,JSON.stringify(receipt,null,2)+'\\n',{flag:'wx',mode:0o600});\n try{await rename(temporary,path);}catch(error){await unlink(temporary).catch(()=>{});throw error;}\n}\nexport async function uploadFile(action:string,input:string,receiptPath:string|undefined,client:DashboardClient,show:Show,signal?:AbortSignal) {\n signal?.throwIfAborted();const path=resolve(action === 'retry' ? input : receiptPath!);let receipt:Receipt;\n if(action === 'retry') {\n receipt=JSON.parse(await readFile(path,'utf8')) as Receipt;\n if(receipt.version!==1 || !receipt.file || !Number.isInteger(receipt.size) || !/^[a-f0-9]{64}$/.test(receipt.sha256))throw Error('Invalid upload receipt');\n if(receipt.state==='complete'){show('Upload already complete',{receipt:path,key:receipt.key});return;}\n if(receipt.state !== 'uploading')throw Error(`Upload is ${receipt.state}; last response is uncertain. Inspect upload status before retrying; creation/completion will not be repeated.`);\n const identity=await fingerprint(receipt.file,signal);if(identity.size!==receipt.size || identity.sha256!==receipt.sha256)throw Error('Source file changed; refusing to resume');\n } else {\n const file=resolve(input),identity=await fingerprint(file,signal);receipt={version:1,file,...identity,state:'creating'};\n // Record the intent before a non-idempotent create. A lost response is not automatically repeated.\n await writeFile(path,JSON.stringify(receipt,null,2)+'\\n',{flag:'wx',mode:0o600});\n show('Upload opening',{receipt:path,file,bytes:identity.size});\n signal?.throwIfAborted();const plan=await client.request<{upload_id:string;key:string;part_size:number;part_count:number}>('/v1/uploads/create',{method:'POST',body:JSON.stringify({filename:basename(file),size:identity.size,content_type:'application/octet-stream'}),...(signal ? {signal} : {})});\n receipt={...receipt,upload_id:plan.upload_id,key:plan.key,part_size:plan.part_size,part_count:plan.part_count,state:'uploading'};\n try {await save(path,receipt);} catch(error) {show('Upload receipt write failed',{receipt:path,upload_id:receipt.upload_id,key:receipt.key,action:'Keep these identifiers; creation must not be repeated.'});throw error;}\n }\n if(!receipt.upload_id || !receipt.key || !Number.isInteger(receipt.part_size) || receipt.part_size! < 1 || !Number.isInteger(receipt.part_count) || receipt.part_count! < 1 || receipt.part_count! > 10000 || Math.ceil(receipt.size/receipt.part_size!)!==receipt.part_count)throw Error('Invalid multipart upload plan; receipt preserved');\n const base=`/v1/uploads/${encodeURIComponent(receipt.upload_id)}`;\n const state=await client.request<{uploaded_parts:Part[]}>(`${base}/status?${new URLSearchParams({key:receipt.key})}`,signal ? {signal} : undefined);\n const parts:Part[]=[...state.uploaded_parts];const stored=new Set(parts.map(p=>p.part_number));\n const handle=await open(receipt.file,'r');\n try {\n for(let n=1;n<=receipt.part_count!;n++) {\n signal?.throwIfAborted();if(stored.has(n))continue;\n const signed=await client.request<{urls:Record<string,string>}>(base+'/sign',{method:'POST',body:JSON.stringify({key:receipt.key,part_numbers:[n]}),...(signal ? {signal} : {})});\n signal?.throwIfAborted();const offset=(n-1)*receipt.part_size!,length=Math.min(receipt.part_size!,receipt.size-offset),bytes=Buffer.alloc(length);\n const read=await handle.read(bytes,0,length,offset);if(read.bytesRead!==length)throw Error('Source file changed while uploading');\n const response=await fetch(transferUrl(signed.urls[String(n)]!),{method:'PUT',body:bytes,redirect:'error',signal});\n if(!response.ok)throw Error(`Upload part ${n} failed (${response.status}); resume with /uploads retry '${path}' --confirm`);\n const etag=response.headers.get('etag');if(!etag)throw Error(`Upload part ${n} returned no ETag; resume from server status`);\n parts.push({part_number:n,etag});show('Upload progress',{receipt:path,uploaded_parts:parts.length,total_parts:receipt.part_count});\n }\n } finally {await handle.close();}\n const finalIdentity=await fingerprint(receipt.file,signal);if(finalIdentity.size!==receipt.size || finalIdentity.sha256!==receipt.sha256)throw Error('Source file changed while uploading; refusing completion; receipt preserved');\n // Completion may succeed while its response is lost; never auto-repeat it.\n signal?.throwIfAborted();receipt.state='completing';await save(path,receipt);\n const result=await client.request(base+'/complete',{method:'POST',body:JSON.stringify({key:receipt.key,parts:parts.map(({part_number,etag})=>({part_number,etag})).sort((a,b)=>a.part_number-b.part_number)}),...(signal ? {signal} : {})});\n receipt.state='complete';await save(path,receipt);show('Upload complete',{receipt:path,result});\n}\n"],
5
+ "mappings": ";;;AAAA,SAAS,cAAAA,mBAAkB;AAC3B,SAAS,WAAAC,UAAS,QAAAC,OAAM,WAAAC,gBAAe;AACvC,SAAS,mBAAAC,wBAAuB;;;ACFhC;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,EACR,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,KAAO;AAAA,IACL,MAAQ;AAAA,EACV;AAAA,EACA,OAAS;AAAA,IACP;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,eAAe;AAAA,IACf,uBAAuB;AAAA,EACzB;AAAA,EACA,cAAgB;AAAA,IACd,iCAAiC;AAAA,IACjC,yBAAyB;AAAA,IACzB,mCAAmC;AAAA,IACnC,0BAA0B;AAAA,IAC1B,eAAe;AAAA,IACf,WAAa;AAAA,IACb,eAAe;AAAA,EACjB;AAAA,EACA,iBAAmB;AAAA,IACjB,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,IACtB,mBAAmB;AAAA,IACnB,SAAW;AAAA,IACX,YAAc;AAAA,IACd,QAAU;AAAA,EACZ;AACF;;;AC3CA,SAAS,aAAa,oBAAoB;AAInC,IAAM,gBAA0C;AAAA,EACrD,WAAW,CAAC,qBAAqB,uBAAuB;AAAA,EACxD,QAAQ,CAAC,gBAAgB;AAAA,EACzB,QAAQ,CAAC,kBAAkB,gBAAgB;AAAA,EAC3C,YAAY,CAAC,oBAAoB;AAAA,EACjC,KAAK,CAAC,aAAa;AAAA,EACnB,MAAM,CAAC,cAAc;AAAA,EACrB,SAAS,CAAC,iBAAiB;AAAA,EAC3B,UAAU,CAAC,kBAAkB;AAC/B;AAGA,SAAS,iBAA2B;AAClC,QAAM,aAAa,IAAI,MAAM,CAAC,GAAG,EAAE,KAAK,MAAM,OAAO,KAAK,MAAM,KAAK,CAAC;AACtE,SAAO,aAAa,EAAE,QAAQ,CAAC,aAAa,YAAY,UAAU,UAAU,KAAK,CAAC,CAAC;AACrF;AAGA,IAAM,oBAAoB,oBAAI,IAAI,CAAC,UAAU,CAAC;AAGvC,IAAM,eAAe,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,OAAO,OAAO,aAAa,EAAE,KAAK,GAAG,GAAG,eAAe,GAAG,cAAc,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,kBAAkB,IAAI,IAAI,CAAC;AAGrK,IAAM,YAAY;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,aAAN,cAAyB,MAAM;AAAC;AAEhC,SAAS,OAAO,UAAkB,KAAiC;AACxE,UAAQ,cAAc,QAAQ,KAAK,CAAC,GAAG,KAAK,CAAC,SAAS,QAAQ,IAAI,IAAI,CAAC,CAAC;AAC1E;AAEA,SAAS,MAAM,OAAiD;AAC9D,QAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,MAAI,SAAS,KAAK,UAAU,MAAM,SAAS,EAAG,OAAM,IAAI,WAAW,IAAI,KAAK,mFAAmF;AAC/J,SAAO,EAAE,UAAU,MAAM,MAAM,GAAG,KAAK,GAAG,IAAI,MAAM,MAAM,QAAQ,CAAC,EAAE;AACvE;AAEO,SAAS,UAAU,SAAuB,MAA6F;AAC5I,QAAM,MAAM,KAAK,OAAO,QAAQ;AAChC,MAAI,KAAK,WAAW;AAClB,UAAM,EAAE,UAAU,GAAG,IAAI,MAAM,KAAK,SAAS;AAC7C,UAAM,QAAQ,QAAQ,SAAS,UAAU,EAAE;AAC3C,QAAI,MAAO,QAAO,EAAE,OAAO,OAAO,KAAK,UAAU;AACjD,UAAM,QAAQ,QAAQ,UAAU,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,QAAQ,IAAI,EAAE,EAAE,EAAE;AACxF,UAAM,UAAU,MAAM,SAAS,SAAS,QAAQ,YAAY,MAAM,KAAK,IAAI,CAAC,MAAM;AAClF,UAAM,IAAI,WAAW,kBAAkB,KAAK,SAAS,sCAAsC,OAAO,EAAE;AAAA,EACtG;AACA,aAAW,SAAS,WAAW;AAC7B,UAAM,EAAE,UAAU,GAAG,IAAI,MAAM,KAAK;AACpC,QAAI,CAAC,OAAO,UAAU,GAAG,EAAG;AAC5B,UAAM,QAAQ,QAAQ,SAAS,UAAU,EAAE;AAC3C,QAAI,MAAO,QAAO,EAAE,OAAO,MAAM;AAAA,EACnC;AACA,QAAM,IAAI,WAAW,iIAAiI;AACxJ;;;ACjEO,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBd,IAAM,aAAN,cAAyB,MAAM;AAAA,EACpC,YAAY,SAAiB;AAC3B,UAAM,GAAG,OAAO;AAAA;AAAA,EAAO,KAAK,EAAE;AAAA,EAChC;AACF;AAqBO,SAAS,UAAU,MAAsB;AAC9C,QAAM,IAAU,EAAE,SAAS,OAAO,SAAS,UAAU,SAAS,OAAO,UAAU,OAAO,QAAQ,OAAO,OAAO,CAAC,GAAG,QAAQ,OAAO;AAC/H,MAAI;AACJ,QAAM,OAAO,CAAC,GAAG,IAAI;AACrB,MAAI,KAAK,CAAC,MAAM,WAAW,KAAK,CAAC,MAAM,SAAU,GAAE,UAAU,KAAK,MAAM;AACxE,QAAM,QAAQ,CAAC,SAAiB;AAC9B,UAAM,IAAI,KAAK,MAAM;AACrB,QAAI,MAAM,UAAc,EAAE,WAAW,GAAG,KAAK,EAAE,SAAS,EAAI,OAAM,IAAI,WAAW,GAAG,IAAI,iBAAiB;AACzG,WAAO;AAAA,EACT;AACA,SAAO,KAAK,QAAQ;AAClB,UAAM,OAAO,KAAK,MAAM;AACxB,YAAQ,MAAM;AAAA,MACZ,KAAK;AAAA,MAAW,KAAK,YAAY;AAC/B,cAAM,WAAW,SAAS,YAAY,UAAU;AAChD,YAAI,WAAW,YAAY,SAAU,OAAM,IAAI,WAAW,oCAAoC;AAC9F,kBAAU;AACV;AAAA,MACF;AAAA,MACA,KAAK;AAAa,UAAE,UAAU;AAAM;AAAA,MACpC,KAAK;AAAU,UAAE,OAAO,MAAM,IAAI;AAAG;AAAA,MACrC,KAAK;AAAU,UAAE,OAAO,MAAM,IAAI;AAAG;AAAA,MACrC,KAAK;AAAmB,UAAE,eAAe,MAAM,IAAI;AAAG;AAAA,MACtD,KAAK;AAAA,MAAM,KAAK;AAAU,UAAE,UAAU;AAAQ;AAAA,MAC9C,KAAK;AAAA,MAAM,KAAK;AAAa,UAAE,UAAU;AAAW;AAAA,MACpD,KAAK;AAAA,MAAM,KAAK;AAAc,UAAE,WAAW;AAAM;AAAA,MACjD,KAAK;AAAA,MAAM,KAAK;AAAY,UAAE,SAAS;AAAM;AAAA,MAC7C,KAAK;AAAA,MAAM,KAAK;AAAW,UAAE,QAAQ,MAAM,IAAI;AAAG;AAAA,MAClD,KAAK;AAAW,UAAE,QAAQ,MAAM,IAAI;AAAG;AAAA,MACvC,KAAK;AAAW,UAAE,MAAM,KAAK,MAAM,IAAI,CAAC;AAAG;AAAA,MAC3C,KAAK;AAAS,UAAE,MAAM,MAAM,IAAI;AAAG;AAAA,MACnC,KAAK;AAAa,UAAE,SAAS,MAAM,IAAI;AAAG;AAAA,MAC1C,KAAK;AAAc,UAAE,WAAW,MAAM,IAAI;AAAG;AAAA,MAC7C,KAAK,UAAU;AACb,cAAM,IAAI,MAAM,IAAI;AACpB,YAAI,MAAM,SAAS,MAAM,UAAU,MAAM,OAAQ,OAAM,IAAI,WAAW,0CAA0C,CAAC,IAAI;AACrH,UAAE,OAAO;AACT;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AACf,cAAM,IAAI,MAAM,IAAI;AACpB,YAAI,MAAM,UAAU,MAAM,OAAQ,OAAM,IAAI,WAAW,uCAAuC,CAAC,IAAI;AACnG,UAAE,SAAS;AACX;AAAA,MACF;AAAA,MACA;AACE,cAAM,IAAI,WAAW,kBAAkB,IAAI,GAAG;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,eAAe,EAAE,UAAU,UAAa,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,UAAa,EAAE,SAAS,UAAa,EAAE,MAAM,SAAS;AAC1I,IAAE,UAAU,YAAY,eAAe,UAAU;AACjD,MAAI,EAAE,YAAY,OAAO;AACvB,QAAI,EAAE,YAAY,YAAY,aAAc,OAAM,IAAI,WAAW,2GAA2G;AAC5K,QAAI,EAAE,YAAY,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAU,OAAM,IAAI,WAAW,iEAAiE;AAAA,EACtJ;AACA,SAAO;AACT;;;ACxGA,SAAS,aAAAC,YAAW,iBAAAC,sBAAqB;AACzC,SAAS,eAAe;;;ACDxB,SAAS,kBAAkB;AAC3B,SAAS,eAAe;AACxB,SAAS,UAAU,MAAM,eAAe;AAGjC,SAAS,SAAS,MAAyB,QAAQ,KAAa;AACrE,SAAO,IAAI,YAAY,QAAQ,IAAI,SAAS,IAAI,KAAK,QAAQ,GAAG,OAAO;AACzE;AAGO,SAAS,SAAS,MAAsB;AAC7C,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,OAAO,SAAS,GAAG,EAAE,QAAQ,oBAAoB,GAAG,KAAK;AAC/D,SAAO,GAAG,IAAI,IAAI,WAAW,QAAQ,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC;AAC9E;AAEO,SAAS,UAAU,MAAyB,QAAQ,KAAK;AAC9D,QAAM,OAAO,SAAS,GAAG;AACzB,SAAO;AAAA,IACL;AAAA,IACA,aAAa,KAAK,MAAM,kBAAkB;AAAA,IAC1C,UAAU,KAAK,MAAM,eAAe;AAAA,IACpC,OAAO,KAAK,MAAM,YAAY;AAAA,IAC9B,UAAU,KAAK,MAAM,OAAO;AAAA,IAC5B,QAAQ,KAAK,MAAM,WAAW;AAAA,IAC9B,UAAU,CAAC,KAAa,SAAiB,KAAK,MAAM,YAAY,KAAK,SAAS,IAAI,CAAC;AAAA,EACrF;AACF;;;AC3BA,SAAS,oBAAoB;AAC7B,SAAS,YAAY,WAAW,cAAc,qBAAqB;AACnE,SAAS,QAAAC,aAAY;AAkBd,SAAS,SAAY,MAA6B;AACvD,MAAI,CAAC,WAAW,IAAI,EAAG,QAAO;AAC9B,MAAI;AACF,WAAO,KAAK,MAAM,aAAa,MAAM,MAAM,CAAC;AAAA,EAC9C,SAAS,KAAK;AACZ,UAAM,IAAI,MAAM,GAAG,IAAI,uBAAwB,IAAc,OAAO,sBAAsB;AAAA,EAC5F;AACF;AAEA,IAAM,QAAQ,oBAAI,IAAY,CAAC,OAAO,QAAQ,MAAM,CAAC;AACrD,IAAM,SAAS,CAAC,MAAkC,OAAO,MAAM,YAAY,MAAM,IAAI,CAAC,IAAK,IAAa;AAGjG,SAAS,cAAc,UAA2B;AACvD,MAAI;AACF,iBAAa,OAAO,CAAC,YAAY,mBAAmB,MAAM,2BAA2B,GAAG,EAAE,KAAK,UAAU,OAAO,SAAS,CAAC;AAC1H,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOO,SAAS,aAAa,UAAkB,MAAqE;AAClH,QAAM,OAAO,SAAuB,UAAU,KAAK,GAAG,EAAE,QAAQ,KAAK,CAAC;AACtE,QAAM,OAAO,SAAuBC,MAAK,UAAU,SAAS,eAAe,CAAC,KAAK,CAAC;AAClF,QAAM,QAAQ,SAAuBA,MAAK,UAAU,SAAS,qBAAqB,CAAC,KAAK,CAAC;AACzF,QAAM,QAAgB,CAAC;AACvB,QAAM,OAAe,CAAC;AACtB,QAAM,MAAM,CAAC,MAAoB,QAAgB,cAAuB;AACtE,eAAW,QAAQ,KAAK,aAAa,QAAQ,CAAC,EAAG,MAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAC3E,QAAI,UAAW,YAAW,QAAQ,KAAK,aAAa,SAAS,CAAC,EAAG,OAAM,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,EAC9F;AACA,MAAI,MAAM,yBAAyB,IAAI;AACvC,MAAI,MAAM,uBAAuB,KAAK,OAAO;AAC7C,QAAM,SAAS,cAAc,QAAQ;AACrC,MAAI,OAAO,6BAA6B,KAAK,WAAW,CAAC,MAAM;AAC/D,QAAM,WAAW,CAAC,MAAgB,KAAK,WAAW,OAAO,CAAC,MAAM,SAAS,OAAO,CAAC,IAAI;AACrF,QAAM,YAAY,SAAS,SAAS,MAAM,WAAW,IAAI,OAAO,MAAM,WAAW;AACjF,QAAM,YAAY,CAAC,GAAI,KAAK,aAAa,SAAS,CAAC,GAAI,GAAI,SAAU,MAAM,aAAa,SAAS,CAAC,IAAK,CAAC,CAAE;AAC1G,SAAO;AAAA,IACL,OAAO,EAAE,OAAO,KAAK;AAAA,IACrB,aAAa,aAAa,SAAS,KAAK,WAAW,KAAK,OAAO,KAAK,WAAW,KAAK;AAAA,IACpF,OAAO,MAAM,SAAS,KAAK;AAAA,IAC3B,SAAS,EAAE,OAAO,KAAK,UAAU,CAAC,IAAI,UAAU;AAAA,EAClD;AACF;AAGO,SAAS,aAAa,UAAkB,MAAoB;AACjE,QAAM,MAAMA,MAAK,UAAU,OAAO;AAClC,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,QAAM,OAAOA,MAAK,KAAK,qBAAqB;AAC5C,QAAM,UAAU,SAAuB,IAAI,KAAK,CAAC;AACjD,QAAM,QAAQ,IAAI,IAAI,QAAQ,aAAa,SAAS,CAAC,CAAC;AACtD,QAAM,IAAI,IAAI;AACd,QAAM,OAAO,EAAE,GAAG,SAAS,aAAa,EAAE,GAAG,QAAQ,aAAa,OAAO,CAAC,GAAG,KAAK,EAAE,EAAE;AACtF,gBAAc,MAAM,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,CAAI;AACxD,mBAAiB,QAAQ;AAC3B;AAGO,SAAS,iBAAiB,UAAwB;AACvD,QAAM,MAAMA,MAAK,UAAU,OAAO;AAClC,YAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,QAAM,SAASA,MAAK,KAAK,YAAY;AACrC,QAAM,QAAQ,WAAW,MAAM,IAAI,aAAa,QAAQ,MAAM,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO,IAAI,CAAC;AAC/F,aAAW,QAAQ,CAAC,uBAAuB,OAAO,EAAG,KAAI,CAAC,MAAM,SAAS,IAAI,EAAG,OAAM,KAAK,IAAI;AAC/F,gBAAc,QAAQ,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,CAAI;AAC/C;AAGO,SAAS,gBAAgB,UAAkB,MAAuB;AACvE,QAAM,OAAOA,MAAK,UAAU,SAAS,qBAAqB;AAC1D,QAAM,UAAU,SAAuB,IAAI;AAC3C,QAAM,QAAQ,SAAS,aAAa,SAAS,CAAC;AAC9C,MAAI,CAAC,WAAW,CAAC,MAAM,SAAS,IAAI,EAAG,QAAO;AAC9C,QAAM,OAAO,EAAE,GAAG,SAAS,aAAa,EAAE,GAAG,QAAQ,aAAa,OAAO,MAAM,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE,EAAE;AAC3G,gBAAc,MAAM,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,CAAI;AACxD,SAAO;AACT;;;AF5FO,SAAS,gBAAgB,MAAyB,QAAQ,KAAkB;AACjF,QAAM,IAAI,SAA+B,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACzE,SAAO,EAAE,GAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,IAAI,CAAC,GAAI,WAAW,EAAE,aAAa,CAAC,EAAE;AACzF;AAGO,SAAS,iBAAiB,GAAgB,MAAyB,QAAQ,KAAW;AAC3F,QAAM,OAAO,UAAU,GAAG,EAAE;AAC5B,EAAAC,WAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,EAAAC,eAAc,MAAM,GAAG,KAAK,UAAU,GAAG,MAAM,CAAC,CAAC;AAAA,GAAM,EAAE,MAAM,IAAM,CAAC;AACxE;AAGO,SAAS,kBAAkB,GAAgB,KAA8B;AAC9E,aAAW,CAAC,UAAUC,IAAG,KAAK,OAAO,QAAQ,EAAE,SAAS,GAAG;AACzD,UAAM,QAAQ,cAAc,QAAQ;AACpC,QAAI,CAAC,OAAO,UAAU,MAAM,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,EAAG;AACjD,QAAI,MAAM,CAAC,CAAE,IAAIA;AAAA,EACnB;AACF;;;AG/BO,IAAM,kBAAkB;AAGxB,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C,YAAY,SAA0B,QAAgB;AACpD,UAAM,OAAO;AADuB;AAEpC,SAAK,OAAO;AAAA,EACd;AAAA,EAHsC;AAIxC;AAGA,eAAsB,YAAY,QAAgBC,MAAa,YAA0B,OAAsB;AAC7G,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,UAAU,GAAG,OAAO,QAAQ,OAAO,EAAE,CAAC,aAAa,EAAE,SAAS,EAAE,eAAe,UAAUA,IAAG,GAAG,EAAE,CAAC;AAAA,EAChH,SAAS,KAAK;AACZ,UAAM,IAAI,MAAM,kBAAkB,MAAM,KAAM,IAAc,OAAO,0CAA0C;AAAA,EAC/G;AACA,MAAI,IAAI,WAAW,OAAO,IAAI,WAAW,IAAK,OAAM,IAAI,iBAAiB,4BAA4B,MAAM,0DAA0D,IAAI,MAAM;AAC/K,MAAI,CAAC,IAAI,GAAI,OAAM,IAAI,iBAAiB,qBAAqB,IAAI,MAAM,OAAO,MAAM,sCAAsC,IAAI,MAAM;AACtI;;;ACpBA,SAAS,YAAAC,WAAU,WAAAC,gBAAe;;;ACAlC,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,qBAAoB;AACpD,SAAS,QAAAC,aAAY;AACrB;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACTP,SAAS,WAAW,aAAAC,YAAW,UAAU,UAAU,iBAAAC,sBAAqB;AAGxE,SAAS,gBAAgB;AACzB,OAAO,WAAW;AAElB,IAAI;AAAJ,IAAa;AAEb,IAAM,kBAAkB,oBAAI,IAAI,CAAC,UAAU,gBAAgB,OAAO,CAAC;AACnE,IAAM,uBAAuB;AAG7B,SAAS,UAAU,OAAO;AACxB,MAAI,CAAC,gBAAgB,IAAI,OAAO,QAAQ,KAAK,CAAC,qEAAqE,KAAK,MAAM,EAAE,EAAG,QAAO;AAC1I,MAAI,CAAC,SAAS;AACZ,cAAU,IAAI,SAAS,KAAK;AAC5B,oBAAgB;AAChB,eAAW,SAAS,QAAQ,QAAQ,OAAO,EAAG,iBAAgB,KAAK,IAAI,eAAe,MAAM,MAAM;AAAA,EACpG;AACA,SAAO;AACT;AAEO,SAAS,WAAW,MAAM,QAAQ,QAAW;AAClD,QAAM,WAAW,UAAU,KAAK;AAChC,QAAM,SAAS,CAAC;AAChB,QAAM,SAAS,CAACC,OAAM,QAAQ,OAAO,KAAK,EAAE,QAAQ,MAAM,SAAS,OAAOA,OAAM,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,KAAKA,OAAM,MAAM,GAAG,IAAI,CAAC;AAC1H,MAAI,UAAU;AACZ,QAAI,UAAU;AACd,eAAW,CAAC,GAAG,KAAK,KAAK,SAAS,WAAW,GAAG;AAC9C,UAAI,QAAQ,SAAS,IAAI,SAAS,sBAAsB;AACtD,YAAI,QAAS,QAAO,SAAS,IAAI;AACjC,kBAAU;AAAA,MACZ;AACA,UAAI,IAAI,SAAS,qBAAsB,QAAO,KAAK,KAAK;AAAA,UACnD,YAAW;AAAA,IAClB;AACA,QAAI,QAAS,QAAO,SAAS,IAAI;AAAA,EACnC,MAAO,QAAO,MAAM,KAAK;AACzB,QAAM,SAAS,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,MAAM,OAAO,QAAQ,CAAC;AACzE,SAAO;AAAA,IACL;AAAA,IACA,OAAO,CAAC,QAAQ,GAAG,MAAM,WAAW;AAClC,cAAQ,QAAQ,IAAI,KAAK,IAAI,GAAG,SAAS,KAAK,IAAI,KAAK,IAAI,OAAO,MAAM;AACxE,YAAM,MAAM,IAAI,KAAK,IAAI,GAAG,SAAS,GAAG,IAAI,KAAK,IAAI,KAAK,MAAM;AAChE,YAAM,SAAS,CAAC;AAChB,UAAIC,UAAS;AACb,iBAAW,EAAE,QAAQ,IAAI,KAAK,QAAQ;AACpC,YAAIA,WAAU,IAAK;AACnB,YAAIA,UAAS,OAAO,SAAS,OAAO;AAClC,gBAAM,QAAQ,OAAO,MAAM,KAAK,IAAI,GAAG,QAAQA,OAAM,GAAG,KAAK,IAAI,GAAG,MAAMA,OAAM,CAAC;AACjF,iBAAO,KAAK,MAAM,OAAO,OAAO,MAAM,IAAI,WAAS,SAAS,QAAQ,IAAI,KAAK,CAAC,CAAC,IAAI,KAAK;AAAA,QAC1F;AACA,QAAAA,WAAU,OAAO;AAAA,MACnB;AACA,aAAO,QAAQ,UAAU,OAAO,OAAO,MAAM,CAAC,CAAC,EAAE,SAAS,MAAM;AAAA,IAClE;AAAA,EACF;AACF;AAEO,IAAM,iBAAiB,CAAC,MAAM,QAAQ,WAAc,WAAW,MAAM,KAAK,EAAE;AAC5E,IAAM,oBAAoB,CAAC,QAAQ,QAAQ,WAAc,KAAK,MAAM,MAAM,KAAK,UAAU,KAAK,IAAI,gBAAgB;AAMlH,IAAM,qBAAqB;AAO3B,SAAS,aAAa,WAAW,CAAC,GAAG;AAC1C,MAAI,UAAU;AACd,aAAW,WAAW,SAAU,KAAI,SAAS,SAAS,YAAa,WAAU,KAAK,IAAI,SAAS,QAAQ,OAAO,UAAU,CAAC;AACzH,SAAO,KAAK,IAAI,oBAAoB,OAAO;AAC7C;AAQO,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAY,EAAE,aAAa,GAAG;AAC5B,QAAI,EAAE,eAAe,KAAK,gBAAgB,GAAI,OAAM,IAAI,MAAM,yDAA0D;AACxH,SAAK,eAAe;AACpB,SAAK,SAAS,oBAAI,IAAI;AAAA,EACxB;AAAA;AAAA,EAEA,QAAQ,KAAK,YAAY;AACvB,UAAM,QAAQ,KAAK,kBAAkB;AACrC,QAAI,CAAC,SAAS,MAAM,UAAU,QAAQ,CAAC,MAAM,cAAe,QAAO;AACnE,UAAM,YAAY,IAAI,gBAAgB,YAAY,KAAK,CAAC,GAAG,OAAO,OAAK,EAAE,SAAS,SAAS,EAAE,IAAI,OAAK,EAAE,OAAO;AAC/G,UAAM,WAAW,IAAI,IAAI,SAAS,OAAO,OAAK,GAAG,SAAS,YAAY,EAAE,IAAI,OAAK,EAAE,UAAU,CAAC;AAC9F,eAAW,MAAM,KAAK,OAAO,KAAK,EAAG,KAAI,SAAS,IAAI,EAAE,EAAG,MAAK,OAAO,OAAO,EAAE;AAChF,UAAM,UAAU,CAAC,GAAG,KAAK,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,MAAM,OAAO,OAAO,aAAa,IAAI,SAAS,CAAC;AACxG,UAAM,UAAU,aAAa,QAAQ;AACrC,UAAM,QAAQ,KAAK,MAAM,KAAK,eAAe,MAAM,aAAa,IAAI;AACpE,WAAO,EAAE,QAAQ,MAAM,eAAe,MAAM,MAAM,QAAQ,SAAS,SAAS,OAAO,WAAW,KAAK,IAAI,GAAG,QAAQ,MAAM,SAAS,OAAO,EAAE;AAAA,EAC5I;AAAA,EACA,SAAS,YAAY,MAAM;AACzB,QAAI,CAAC,KAAK,OAAO,IAAI,UAAU,EAAG,MAAK,MAAM,YAAY,OAAO,WAAW,cAAc,MAAM,OAAO,kBAAkB,OAAO,gBAAgB,CAAC,CAAC;AAAA,EACnJ;AAAA,EACA,QAAQ,YAAY,KAAK,OAAO;AAC9B,UAAM,WAAW,KAAK,QAAQ,KAAK,UAAU;AAC7C,QAAI,UAAU;AAAE,eAAS,YAAY,KAAK,IAAI,SAAS,WAAW,KAAK;AAAG,WAAK,MAAM,YAAY,SAAS,SAAS;AAAA,IAAG;AACtH,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,YAAY;AAAE,SAAK,OAAO,OAAO,UAAU;AAAA,EAAG;AAAA,EACtD,MAAM,YAAY,QAAQ;AAAE,SAAK,OAAO,IAAI,YAAY,MAAM;AAAA,EAAG;AACnE;AAGO,SAAS,WAAW,QAAQ;AACjC,MAAI,QAAQ;AACZ,WAAS,IAAI,OAAO,QAAQ,EAAE,GAAG,MAAM,IAAI,IAAI,OAAO,QAAQ,IAAI,IAAI,CAAC,EAAG;AAC1E,SAAO,SAAS,OAAO,UAAU,OAAO,OAAO,SAAS,CAAC,MAAM,KAAK,IAAI;AAC1E;AAEO,IAAM,iBAAiB,CAAC,YAAY,MAAM,UAAU,IAAG,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG,CAAC,IAAI,OAAO,UAAU,EAAE,QAAQ,mBAAmB,GAAG,CAAC,IAAI,GAAG;AAEzK,IAAM,YAAY,CAAC,MAAM,OAAO,WAAW;AACzC,QAAM,SAAS,OAAO,MAAM,MAAM;AAClC,QAAM,KAAK,SAAS,MAAM,GAAG;AAC7B,MAAI;AAAE,WAAO,OAAO,SAAS,GAAG,SAAS,IAAI,QAAQ,GAAG,QAAQ,KAAK,CAAC;AAAA,EAAG,UAAE;AAAU,cAAU,EAAE;AAAA,EAAG;AACtG;AAEA,IAAM,YAAY,OAAK;AAAE,MAAI,IAAI;AAAG,SAAO,IAAI,EAAE,UAAU,IAAI,MAAM,EAAE,CAAC,IAAI,SAAU,IAAM;AAAK,SAAO,EAAE,SAAS,CAAC;AAAG;AACvH,IAAM,UAAU,OAAK;AACnB,WAAS,OAAO,GAAG,QAAQ,KAAK,IAAI,GAAG,EAAE,MAAM,GAAG,QAAQ;AACxD,UAAM,OAAO,EAAE,EAAE,SAAS,IAAI;AAC9B,SAAK,OAAO,SAAU,IAAM;AAC5B,UAAM,OAAO,QAAQ,MAAO,IAAI,QAAQ,MAAO,IAAI,QAAQ,MAAO,IAAI;AACtE,WAAO,OAAO,OAAO,EAAE,SAAS,GAAG,EAAE,SAAS,IAAI,IAAI;AAAA,EACxD;AACA,SAAO;AACT;AAOO,SAAS,YAAY,MAAM,MAAM,aAAa;AACnD,QAAM,aAAa,KAAK,MAAM,cAAc,CAAC,GAAG,aAAa,cAAc;AAC3E,MAAI,OAAO,QAAQ,UAAU,MAAM,GAAG,KAAK,IAAI,YAAY,IAAI,CAAC,CAAC;AACjE,QAAM,cAAc,KAAK,YAAY,EAAE;AACvC,MAAI,gBAAgB,GAAI,QAAO,KAAK,SAAS,GAAG,cAAc,CAAC;AAC/D,QAAM,YAAY,KAAK,IAAI,KAAK,QAAQ,OAAO,UAAU;AACzD,MAAI,OAAO,UAAU,UAAU,MAAM,WAAW,OAAO,SAAS,CAAC;AACjE,MAAI,aAAa,OAAO,KAAK;AAC7B,QAAM,cAAc,aAAa,IAAI,KAAK,QAAQ,EAAE,IAAI;AACxD,MAAI,gBAAgB,MAAM,cAAc,KAAK,SAAS,GAAG;AAAE,WAAO,KAAK,SAAS,cAAc,CAAC;AAAG,iBAAa,OAAO,KAAK;AAAA,EAAQ;AACnI,SAAO,EAAE,MAAM,MAAM,WAAW;AAClC;AAqBO,IAAM,gBAAgB,CAAC,MAAM,OAAO,UAAU,kCAAkC,KAAK,WAAW,KAAK,sBAAsB,IAAI;AAAA;AAG/H,SAAS,cAAc,MAAM,OAAO,OAAO,UAAU,SAAS,OAAO,SAAS;AACnF,QAAM,SAAS,CAAC,WAAW,WAAW,WAAW,cAAc,IAAI,QAAQ,YAAY,CAAC,gFAAgF,KAAK,WAAW,KAAK,sBAAsB,IAAI;AAAA,eACnM,YAAY,aAAa,SAAS,mBAAmB,SAAS,MAAM,wBAAwB,QAAQ,YAAY,YAAY,SAAS,iBAAiB,QAAQ,YAAY,CAAC,IAAI,KAAK,MAAM,sBAAsB,KAC7N,QAAQ,YAAY,SAAS,oDAAoD,SAAS,IAAI,qBAAqB,SAAS,MAAM,kBAAkB,SAAS,SAAS,wEAAwE,SAAS,OAAO;AACrQ,QAAM,SAAS,CAAAC,aAAW;AAAA,OAAUA,QAAO,uBAAuB,IAAI;AAAA;AACtE,QAAM,WAAW,OAAO,WAAW,OAAO,OAAO,OAAO,OAAO,CAAC,IAAI,OAAO,OAAO,KAAK,CAAC;AACxF,MAAI,YAAY,SAAS,UAAW,QAAO,cAAc,MAAM,OAAO,KAAK;AAC3E,QAAM,YAAY,SAAS,YAAY;AACvC,QAAM,aAAa,KAAK,MAAM,YAAY,CAAC,GAAG,aAAa,YAAY;AACvE,MAAI,UAAU;AACd,MAAI,SAAS;AACX,eAAW,QAAQ,MAAM,GAAG,UAAU;AACtC,eAAW,aAAa,QAAQ,MAAM,CAAC,UAAU,IAAI;AAAA,EACvD,OAAO;AACL,UAAM,aAAa,YAAY,MAAM,OAAO,kBAAkB,WAAW,KAAK,CAAC;AAC/E,eAAW,WAAW,WAAW,KAAK,SAAS,MAAM,GAAG,KAAK,EAAE,MAAM,GAAG,UAAU;AAClF,eAAW,aAAa,WAAW,WAAW,KAAK,SAAS,MAAM,GAAG,KAAK,EAAE,MAAM,CAAC,UAAU,IAAI;AAAA,EACnG;AACA,QAAM,cAAc,SAAS,YAAY,IAAI,GAAG,cAAc,SAAS,QAAQ,IAAI;AACnF,MAAI,gBAAgB,GAAI,YAAW,SAAS,MAAM,GAAG,cAAc,CAAC;AACpE,MAAI,gBAAgB,MAAM,cAAc,SAAS,SAAS,EAAG,YAAW,SAAS,MAAM,cAAc,CAAC;AACtG,QAAM,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,OAAO,KAAK,QAAQ;AAC/D,QAAM,UAAU,QAAQ,KAAK,SAAS,KAAK;AAC3C,SAAO,GAAG,OAAO,KAAK,QAAQ,WAAW,IAAI,GAAG,KAAK,QAAQ,WAAW,IAAI,CAAC,CAAC;AAAA,EAAK,QAAQ,GAAG,UAAU,IAAI,OAAO,OAAO,IAAI,EAAE,GAAG,QAAQ;AAC7I;;;AC7MA,SAAS,YAAAC,WAAU,WAAW,aAAAC,YAAW,aAAAC,YAAW,gBAAAC,qBAAoB;AACxE,SAAS,QAAAC,aAAY;AACrB,SAAS,0BAA0B,2BAA2B,kBAAkB;AAgBzE,IAAM,qBAAqB,CAAC,gBAAgB,0BAA0B;AAEtE,SAAS,oBAAoB,MAAM,QAAQ,KAAK,QAAQ,CAAC,GAAG;AACjE,QAAMC,SAAQ,EAAE,GAAG,IAAI;AACvB,aAAW,QAAQ,CAAC,GAAG,oBAAoB,GAAG,KAAK,EAAG,QAAOA,OAAM,IAAI;AACvE,SAAOA;AACT;AAOO,SAAS,eAAe,EAAE,KAAK,WAAW,QAAQ,cAAc,CAAC,EAAE,GAAG;AAC3E,QAAM,KAAK,yBAAyB,GAAG;AACvC,SAAO,WAAW;AAAA,IAChB,MAAM;AAAA,IACN,OAAO;AAAA,IACP,aAAa,qJAAqJ,SAAS;AAAA,IAC3K,eAAe,GAAG;AAAA,IAClB,kBAAkB,GAAG;AAAA,IACrB,YAAY,GAAG;AAAA,IACf,MAAM,QAAQ,YAAY,QAAQ,QAAQ,WAAW,KAAK;AACxD,MAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,YAAM,OAAOC,MAAK,WAAW,eAAe,YAAY,KAAK,CAAC;AAC9D,aAAO,SAAS,YAAY,IAAI;AAChC,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,kBAAkB,SAAS,YAAY,IAAI,CAAC,QAAQ,WAAW,MAAM,CAAC,IAAI,WAAW;AAC3F,UAAI;AACJ,UAAI,qBAAqB;AACzB,UAAI,QAAQ,GAAG,QAAQ,GAAG,OAAO;AACjC,YAAM,QAAQ,0BAA0B;AACxC,YAAM,aAAa,EAAE,MAAM,CAAC,SAAS,KAAK,YAAY,MAAM,KAAK,SAAS,KAAK,EAAE,GAAG,SAAS,KAAK,oBAAoB,QAAQ,KAAK,WAAW,GAAG,QAAQ,WAAS;AAChK,YAAI,mBAAoB;AACxB,YAAI;AACF,mBAASC,UAAS,GAAGA,UAAS,MAAM,UAAS;AAC3C,kBAAM,UAAU,UAAU,IAAI,OAAOA,SAAQ,MAAM,SAASA,OAAM;AAClE,gBAAI,YAAY,EAAG,OAAM,IAAI,MAAM,+BAA+B;AAClE,YAAAA,WAAU;AAAA,UACZ;AACA,mBAAS,MAAM;AAAQ,iBAAO,MAAM,MAAM,SAAS,CAAC,KAAK;AACzD,mBAAS,IAAI,MAAM,QAAQ,EAAE,GAAG,MAAM,IAAI,IAAI,MAAM,QAAQ,IAAI,IAAI,CAAC,EAAG;AAAA,QAC1E,SAAS,OAAO;AAAE,+BAAqB;AAAO,qBAAW,MAAM;AAAA,QAAG;AAAA,MACpE,EAAE,CAAC,EAAE;AACL,UAAI,UAAU;AACd,UAAI;AACJ,UAAI;AACF,YAAI;AAAE,eAAKC,UAAS,MAAM,KAAK,GAAK;AAAA,QAAG,SAChC,OAAO;AAAE,+BAAqB;AAAO,gBAAM;AAAA,QAAO;AACzD,kBAAU,MAAM,yBAAyB,KAAK,EAAE,WAAW,CAAC,EAAE,QAAQ,YAAY,QAAQ,iBAAiB,QAAW,GAAG;AAAA,MAC3H,SACO,OAAO;AAAE,kBAAU;AAAA,MAAO,UACjC;AACE,YAAI,OAAO,QAAW;AACpB,cAAI;AAAE,YAAAC,WAAU,EAAE;AAAA,UAAG,SAAS,OAAO;AAAE,mCAAuB;AAAA,UAAO;AAAA,QACvE;AAAA,MACF;AACA,UAAI,oBAAoB;AACtB,cAAM,UAAU,gDAAgD,IAAI,KAAK,mBAAmB,OAAO;AACnG,eAAO,MAAM,YAAY,eAAe,SAAS,KAAK,KAAK,CAAC;AAC5D,cAAM,IAAI,MAAM,OAAO;AAAA,MACzB;AACA,UAAI,SAAS,SAAS,GAAI;AAI1B,YAAM,SAAS,UAAU,OAAO,QAAQ,WAAW,OAAO,IAAI,SAAS,UAAU,QAAQ,QAAQ,IAAI,UAAQ,KAAK,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI;AACzI,YAAM,SAAS,OAAO,QAAQ,sBAAsB,EAAE,EAAE,KAAK;AAC7D,YAAM,WAAW,OAAO,QAAQ,YAAY,KAAK,QAAQ,OAAO,WAAW,SAAS;AAAA;AAAA,EAAO,MAAM,KAAK,aAAa,CAAC;AACpH,UAAI;AACJ,UAAI,UAAU,EAAG,QAAO,SAAS,KAAK;AAAA,WACjC;AACH,cAAM,eAAe,SAAS,eAAe;AAAA;AAAA,EAAO,MAAM,IAAI,KAAK,KAAK,IAAI;AAC5E,cAAM,YAAY,WAAW,KAAK,IAAI,GAAG,SAAS,YAAY,YAAY,IAAI;AAC9E,YAAI,CAAC,YAAY,SAAS,kBAAkB,WAAW,KAAK,KAAK,EAAG,QAAOC,cAAa,MAAM,MAAM;AACpG,cAAM,UAAU,SAAS,SAAY,SAAY,WAAW,MAAM,KAAK,KAAK;AAC5E,YAAI,aAAa,CAAC,WAAW,QAAQ,SAAS,WAAY,QAAO,cAAc,MAAM,OAAO,OAAO,EAAE,GAAG,UAAU,UAAU,GAAG,yBAA0B,KAAK,OAAO,OAAO;AAAA,MAC9K;AACA,YAAM,SAAS,SAAS,GAAG,OAAO,GAAG,IAAI;AAAA;AAAA,IAAS,EAAE,GAAG,MAAM,KAAK;AAClE,aAAO,MAAM,YAAY,eAAe,QAAQ,KAAK,KAAK,CAAC;AAC3D,UAAI,QAAS,OAAM,IAAI,MAAM,MAAM;AACnC,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC,GAAG,SAAS,EAAE,gBAAgB,MAAM,OAAO,MAAM,GAAG,GAAI,SAAS,UAAU,EAAE,SAAS,KAAK,IAAI,CAAC,EAAG;AAAA,IACtJ;AAAA,EACF,CAAC;AACH;;;ACtGA,SAAS,kBAAkB;AAC3B,SAAS,cAAAC,aAAY,YAAAC,iBAAyB;;;ACD9C,SAAS,WAAW,cAAc,oBAAoB;AACtD,SAAS,WAAAC,gBAAe;AACxB,SAAS,YAAAC,WAAU,WAAAC,UAAS,YAAY,QAAAC,OAAM,UAAU,WAAAC,gBAAe;AACvE,SAAS,qBAAqB;AAGvB,SAAS,eAAe,MAAc,MAAsB;AACjE,MAAI,IAAI,KAAK,KAAK;AAClB,MAAI,EAAE,WAAW,GAAG,EAAG,KAAI,EAAE,MAAM,CAAC;AACpC,MAAI,EAAE,WAAW,SAAS,EAAG,KAAI,cAAc,CAAC;AAChD,MAAI,MAAM,IAAK,KAAIJ,SAAQ;AAAA,WAClB,EAAE,WAAW,IAAI,EAAG,KAAIG,MAAKH,SAAQ,GAAG,EAAE,MAAM,CAAC,CAAC;AAC3D,SAAO,WAAW,CAAC,IAAII,SAAQ,CAAC,IAAIA,SAAQ,MAAM,CAAC;AACrD;AAEA,IAAM,SAAS,CAAC,MAAc;AAC5B,MAAI;AACF,cAAU,CAAC;AACX,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,UAAU,MAAsB;AAC9C,MAAI,MAAMA,SAAQ,IAAI;AACtB,QAAM,OAAiB,CAAC;AACxB,SAAO,CAAC,OAAO,GAAG,GAAG;AACnB,UAAM,KAAKF,SAAQ,GAAG;AACtB,QAAI,OAAO,IAAK;AAChB,SAAK,QAAQD,UAAS,GAAG,CAAC;AAC1B,UAAM;AAAA,EACR;AACA,MAAI;AACF,UAAM,aAAa,GAAG;AAAA,EACxB,QAAQ;AAEN,QAAI;AACF,YAAMG,SAAQF,SAAQ,GAAG,GAAG,aAAa,GAAG,CAAC;AAAA,IAC/C,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAOC,MAAK,KAAK,GAAG,IAAI;AAC1B;AAEO,SAAS,SAAS,MAAc,KAAsB;AAC3D,QAAM,MAAM,SAAS,UAAU,GAAG,GAAG,UAAU,IAAI,CAAC;AACpD,SAAO,QAAQ,MAAO,CAAC,IAAI,WAAW,IAAI,KAAK,CAAC,WAAW,GAAG;AAChE;;;AClDA,SAAS,YAAAE,WAAU,WAAW;AAC9B,OAAO,eAAe;AACtB,SAAS,SAAAC,cAAa;AA6BtB,IAAM,aAAa,oBAAI,IAAI,CAAC,MAAM,MAAM,KAAK,KAAK,KAAK,MAAM,IAAI,CAAC;AAClE,IAAM,YAAY,oBAAI,IAAI,CAAC,KAAK,MAAM,MAAM,MAAM,OAAO,IAAI,CAAC;AAGvD,SAAS,WAAW,SAA6E;AACtG,QAAM,UAAU,iBAAiB,KAAK,OAAO;AAC7C,QAAM,QAAkB,CAAC;AACzB,QAAM,YAAsB,CAAC;AAC7B,aAAWC,SAAQ,QAAQ,MAAM,OAAO,GAAG;AACzC,QAAI,QAAkB,CAAC;AACvB,QAAI,eAAe;AACnB,UAAM,QAAQ,MAAM;AAClB,UAAI,MAAM,OAAQ,OAAM,KAAK,MAAM,KAAK,GAAG,CAAC;AAC5C,cAAQ,CAAC;AAAA,IACX;AACA,eAAW,OAAOC,OAAMD,OAAM,CAAC,SAAS,IAAI,IAAI,EAAE,GAAG;AACnD,UAAI,OAAO,QAAQ,YAAa,QAAQ,OAAO,IAAI,OAAO,QAAS;AACjE,cAAM,OAAO,OAAO,QAAQ,WAAW,MAAO,IAA4B;AAC1E,YAAI,aAAc,WAAU,KAAK,IAAI;AAAA,YAChC,OAAM,KAAK,IAAI;AACpB,uBAAe;AAAA,MACjB,WAAW,QAAQ,OAAO,WAAW,IAAI,IAAI,EAAE,EAAG,OAAM;AAAA,eAC/C,QAAQ,OAAO,UAAU,IAAI,IAAI,EAAE,EAAG,gBAAe;AAAA,eACrD,QAAQ,IAAK,OAAM,KAAK,IAAI,EAAE;AAAA,IACzC;AACA,UAAM;AAAA,EACR;AACA,SAAO,EAAE,OAAO,SAAS,UAAU;AACrC;AAGA,SAAS,QAAQ,MAAwB;AACvC,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,SAAO,MAAM,UAAU,2BAA2B,KAAK,MAAM,CAAC,CAAE,EAAG,OAAM,MAAM;AAC/E,MAAI,MAAM,CAAC,GAAG,SAAS,GAAG,EAAG,OAAM,CAAC,IAAI,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;AACpF,SAAO;AACT;AAGO,SAAS,WAAW,SAA2D;AACpF,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,QAAQ,oBAAI,IAAY;AAC9B,QAAM,EAAE,OAAO,QAAQ,IAAI,WAAW,OAAO;AAC7C,QAAM,YAAY,MAAM,KAAK,CAAC,MAAM,kBAAkB,KAAK,CAAC,CAAC;AAC7D,QAAM,YAAY,MAAM,KAAK,CAAC,MAAM,4BAA4B,KAAK,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;AACzF,MAAI,8DAA8D,KAAK,OAAO,KAAM,cAAc,aAAa,SAAW,WAAU,IAAI,qBAAqB;AAC7J,aAAW,QAAQ,OAAO;AACxB,UAAM,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,QAAQ,IAAI;AACxC,QAAI,QAAQ,UAAU,QAAQ,OAAQ,WAAU,IAAI,MAAM;AAC1D,QAAI,QAAQ,SAAS,KAAK,SAAS,MAAM,EAAG,WAAU,IAAI,UAAU;AACpE,QAAI,QAAQ,SAAS,KAAK,KAAK,CAAC,MAAM,2CAA2C,KAAK,CAAC,CAAC,EAAG,WAAU,IAAI,OAAO;AAChH,QAAI,mDAAmD,KAAK,IAAI,EAAG,OAAM,IAAI,SAAS;AACtF,QAAI,qBAAqB,KAAK,GAAG,EAAG,OAAM,IAAI,SAAS;AACvD,QAAI,sFAAsF,KAAK,IAAI,EAAG,OAAM,IAAI,iBAAiB;AAAA,EACnI;AACA,SAAO,EAAE,WAAW,CAAC,GAAG,SAAS,GAAG,OAAO,CAAC,GAAG,KAAK,EAAE;AACxD;AAGA,SAAS,QAAQ,MAAwB;AACvC,QAAM,QAAQ,0BAA0B,KAAK,IAAI,IAAI,CAAC,KAAK;AAC3D,SAAO,kCAAkC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC;AACpE;AAGA,SAAS,aAAa,SAAiB,UAAkB,WAA+B;AACtF,QAAM,EAAE,OAAO,UAAU,IAAI,WAAW,OAAO;AAC/C,QAAM,QAAQ,CAAC,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,QAAQ,OAAO,CAAC,GAAG,GAAG,UAAU,QAAQ,OAAO,CAAC;AAC7G,SAAO,MAAM,OAAO,CAAC,MAAM;AACzB,UAAM,OAAO,eAAe,GAAG,QAAQ;AACvC,QAAI,UAAU,IAAI,EAAE,WAAW,GAAG,GAAG,MAAM,GAAG,EAAE,EAAG,QAAO;AAC1D,WAAO,CAAC,CAAC,UAAU,GAAG,SAAS,EAAE,KAAK,CAAC,MAAM,SAAS,MAAM,CAAC,CAAC;AAAA,EAChE,CAAC;AACH;AAEA,IAAM,YAAY,oBAAI,IAAI;AAAA,EACxB;AAAA,EAAM;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAM;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAM;AAAA,EAAM;AAAA,EACzG;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAS;AAAA,EAAM;AAAA,EAAO;AAAA,EAAM;AAAA,EAAM;AAAA,EAAQ;AAAA,EAAO;AAAA,EAAY;AAAA,EAChG;AAAA,EAAY;AAAA,EAAY;AAAA,EAAM;AAAA,EAAQ;AAAA,EAAS;AACjD,CAAC;AACD,IAAM,gBAAgB,oBAAI,IAAI,CAAC,UAAU,OAAO,QAAQ,QAAQ,aAAa,YAAY,SAAS,YAAY,UAAU,CAAC;AAEzH,SAAS,aAAa,MAAuB;AAC3C,QAAM,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,KAAK,MAAM,GAAG;AAC1C,MAAI,UAAU,IAAI,GAAG,EAAG,QAAO,EAAE,QAAQ,QAAQ,KAAK,KAAK,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC;AACvF,MAAI,QAAQ,OAAQ,QAAO,CAAC,KAAK,KAAK,CAAC,MAAM,kDAAkD,KAAK,CAAC,CAAC;AACtG,MAAI,QAAQ,MAAO,QAAO,cAAc,IAAI,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE,WAAW,UAAU,CAAC;AACxG,SAAO,iCAAiC,KAAK,GAAG,KAAK,KAAK,WAAW,KAAK,mBAAmB,KAAK,KAAK,CAAC,CAAE;AAC5G;AAGA,SAAS,cAAc,SAA0B;AAC/C,QAAM,EAAE,OAAO,SAAS,UAAU,IAAI,WAAW,OAAO;AACxD,SAAO,CAAC,WAAW,MAAM,SAAS,KAAK,UAAU,MAAM,CAAC,MAAM,EAAE,WAAW,OAAO,KAAK,SAAS,KAAK,CAAC,CAAC,KAAK,MAAM,MAAM,YAAY;AACtI;AAEA,SAAS,UAAU,MAA8C;AAC/D,QAAM,IAAI,KAAK,QAAQ,GAAG;AAC1B,SAAO,IAAI,IAAI,EAAE,MAAM,IAAI,MAAM,KAAK,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,CAAC,GAAG,MAAM,KAAK,MAAM,IAAI,CAAC,EAAE;AAC9F;AAEA,SAAS,iBAAiB,MAAc,MAAuB;AAC7D,MAAI,SAAS,IAAK,QAAO;AACzB,MAAI,KAAK,SAAS,IAAI,GAAG;AACvB,UAAM,SAAS,KAAK,MAAM,GAAG,EAAE;AAC/B,WAAO,SAAS,UAAU,KAAK,WAAW,GAAG,MAAM,GAAG;AAAA,EACxD;AACA,SAAO,SAAS;AAClB;AAEA,SAAS,QAAQ,MAAY,QAAgB,UAA2B;AACtE,QAAM,EAAE,MAAM,KAAK,IAAI,UAAU,KAAK,IAAI;AAC1C,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,SAAS,WAAW,iBAAiB,MAAM,OAAO,OAAO;AAAA,IAClE,KAAK;AACH,aAAO,SAAS,UAAU,UAAU,MAAM,EAAE,KAAK,KAAK,CAAC,EAAEE,UAAS,UAAU,QAAQ,GAAG,UAAU,OAAO,IAAI,CAAC,CAAC;AAAA,IAChH,KAAK;AACH,cAAQ,SAAS,UAAU,SAAS,WAAW,UAAU,MAAM,EAAE,KAAK,KAAK,CAAC,EAAEA,UAAS,UAAU,QAAQ,GAAG,UAAU,OAAO,IAAI,CAAC,CAAC;AAAA,IACrI,KAAK,OAAO;AACV,YAAM,CAAC,QAAQ,OAAO,GAAG,IAAI,KAAK,MAAM,GAAG;AAC3C,aAAO,SAAS,SAAS,WAAW,OAAO,UAAU,UAAU,IAAI,EAAE,OAAO,IAAI;AAAA,IAClF;AAAA,IACA,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAGA,IAAM,cAAc,oBAAI,IAAI,CAAC,OAAO,OAAO,QAAQ,QAAQ,MAAM,OAAO,QAAQ,UAAU,WAAW,SAAS,MAAM,aAAa,MAAM,CAAC;AAExI,SAAS,aAAa,MAA6B;AACjD,QAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,QAAM,CAAC,MAAM,EAAE,IAAI;AACnB,MAAI,CAAC,OAAO,2BAA2B,KAAK,GAAG,KAAK,mEAAmE,KAAK,GAAG,EAAG,QAAO;AACzI,QAAM,MAAM,MAAM,CAAC;AACnB,SAAO,YAAY,IAAI,GAAG,KAAK,OAAO,CAAC,IAAI,WAAW,GAAG,IAAI,SAAS,GAAG,IAAI,GAAG,OAAO,SAAS,GAAG;AACrG;AAEA,SAAS,SAAS,QAAgB,UAAiC;AACjE,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,QAAQA,UAAS,UAAU,QAAQ,GAAG,UAAU,OAAO,IAAI,CAAC,CAAC;AAAA,IACtE,KAAK,SAAS;AACZ,YAAM,EAAE,OAAO,QAAQ,IAAI,WAAW,OAAO,OAAO;AACpD,aAAO,CAAC,WAAW,MAAM,WAAW,IAAI,aAAa,MAAM,CAAC,CAAE,IAAI;AAAA,IACpE;AAAA,IACA,KAAK;AACH,aAAO,OAAO,OAAO,MAAM,IAAI,OAAO,IAAI;AAAA,IAC5C;AACE,aAAO;AAAA,EACX;AACF;AAEA,IAAM,aAAa,CAAC,MAAc,aAAqBA,UAAS,UAAU,QAAQ,GAAG,UAAU,IAAI,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,YAAY,MAAM;AAGhI,SAAS,OAAO,QAAgB,KAAsF;AAC3H,QAAM,EAAE,MAAM,OAAO,UAAU,UAAU,IAAI;AAC7C,QAAM,MAAM,CAAC,QAAgBC,SAAkB,CAAC,OAAiB,EAAE,SAAS,OAAO,QAAQ,OAAO,MAAM,OAAAA,QAAO,aAAa,KAAK;AAEjI,QAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,OAAO,OAAO,EAAE,QAAQ,CAAC;AAC5E,QAAM,OAAO,MAAM,KAAK,KAAK,CAAC,MAAO,OAAO,SAAS,UAAU,MAAM,KAAK,CAAC,MAAM,QAAQ,GAAG,EAAE,MAAM,SAAS,SAAS,EAAE,GAAG,QAAQ,CAAC,IAAI,QAAQ,GAAG,QAAQ,QAAQ,CAAE;AACrK,MAAI,KAAM,QAAO,EAAE,SAAS,QAAQ,QAAQ,mBAAmB,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,OAAO,MAAM,OAAO,CAAC,EAAE;AAEpH,MAAI,OAAO,SAAS,QAAS,QAAO,IAAI,0BAA0B;AAClE,OAAK,OAAO,SAAS,UAAU,OAAO,SAAS,WAAW,CAAC,CAAC,UAAU,GAAG,SAAS,EAAE,KAAK,CAAC,MAAM,SAAS,OAAO,MAAM,CAAC,CAAC,GAAG;AACzH,WAAO,IAAI,oBAAoB,CAAC,cAAc,CAAC;AAAA,EACjD;AAEA,MAAI,QAAkB,CAAC;AACvB,MAAI,OAAO,SAAS,SAAS;AAC3B,UAAM,IAAI,WAAW,OAAO,OAAO;AACnC,YAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,EAAE,KAAK;AACnC,QAAI,EAAE,UAAU,OAAQ,QAAO,IAAI,cAAc,EAAE,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK;AAChF,UAAM,UAAU,aAAa,OAAO,SAAS,UAAU,SAAS;AAChE,QAAI,QAAQ,OAAQ,QAAO,IAAI,qBAAqB,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,cAAc,CAAC;AAAA,EACtG;AACA,MAAI,OAAO,SAAS,UAAU,SAAS,UAAU,WAAW,OAAO,MAAM,QAAQ,EAAG,QAAO,IAAI,2BAA2B,CAAC,YAAY,CAAC;AAExI,MAAI,OAAO,SAAS,OAAQ,QAAO,EAAE,SAAS,SAAS,QAAQ,wBAAwB,OAAO,MAAM,MAAM;AAC1G,MAAI,OAAO,SAAS,WAAW,cAAc,OAAO,OAAO,EAAG,QAAO,EAAE,SAAS,SAAS,QAAQ,+BAA+B,OAAO,MAAM,MAAM;AACnJ,MAAI,SAAS,OAAQ,QAAO,EAAE,SAAS,SAAS,QAAQ,aAAa,OAAO,MAAM,MAAM;AACxF,MAAI,SAAS,UAAU,OAAO,SAAS,OAAQ,QAAO,EAAE,SAAS,SAAS,QAAQ,aAAa,OAAO,MAAM,MAAM;AAElH,MAAI,OAAO,SAAS,SAAS;AAC3B,UAAM,UAAU,WAAW,OAAO,OAAO,EAAE;AAC3C,UAAM,OAAO,UAAU,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,MAAM,MAAM,KAAK,CAAC,MAAM,QAAQ,GAAG,EAAE,MAAM,SAAS,SAAS,EAAE,GAAG,QAAQ,CAAC,CAAC;AACzH,QAAI,KAAK,UAAU,KAAK,MAAM,OAAO,EAAG,QAAO,EAAE,SAAS,SAAS,QAAQ,cAAc,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAG,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,OAAO,MAAM,MAAM;AACjK,UAAM,QAAQ,SAAS,QAAQ,QAAQ;AACvC,QAAI,MAAO,QAAO,EAAE,SAAS,OAAO,QAAQ,GAAG,IAAI,SAAS,OAAO,MAAM;AACzE,UAAM,YAAY,UAAU,CAAC,IAAI,MAAM,IAAI,YAAY,EAAE,OAAO,CAAC,MAAmB,MAAM,IAAI;AAC9F,WAAO,EAAE,SAAS,OAAO,QAAQ,GAAG,IAAI,SAAS,OAAO,MAAM,OAAO,GAAI,UAAU,WAAW,MAAM,SAAS,EAAE,UAAU,IAAI,CAAC,EAAG;AAAA,EACnI;AACA,QAAM,QAAQ,MAAM,MAAM,KAAK,CAAC,MAAM,QAAQ,GAAG,QAAQ,QAAQ,CAAC;AAClE,MAAI,MAAO,QAAO,EAAE,SAAS,SAAS,QAAQ,cAAc,MAAM,IAAI,KAAK,MAAM,MAAM,KAAK,OAAO,MAAM,MAAM;AAC/G,SAAO,EAAE,SAAS,OAAO,QAAQ,GAAG,IAAI,SAAS,OAAO,SAAS,QAAQ,QAAQ,GAAG,MAAM;AAC5F;;;AFjMA,IAAM,WAAW,CAAC,GAAYC,UAAiB,UAAU,eAAe,OAAO,KAAK,EAAE,GAAGA,KAAI,CAAC;AAEvF,SAAS,SAAS,UAAkB,OAAgC,UAA0B;AACnG,MAAI,aAAa,OAAQ,QAAO,EAAE,MAAM,SAAS,SAAS,OAAO,MAAM,WAAW,EAAE,EAAE;AACtF,MAAI,aAAa,UAAU,aAAa,QAAS,QAAO,EAAE,MAAM,QAAQ,MAAM,SAAS,MAAM,MAAM,QAAQ,EAAE;AAC7G,MAAI,CAAC,QAAQ,QAAQ,QAAQ,IAAI,EAAE,SAAS,QAAQ,EAAG,QAAO,EAAE,MAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ,KAAK,QAAQ,EAAE;AAC1H,QAAM,MAAM,qBAAqB,KAAK,QAAQ;AAC9C,MAAI,IAAK,QAAO,EAAE,MAAM,OAAO,QAAQ,IAAI,CAAC,GAAI,MAAM,IAAI,CAAC,EAAG;AAC9D,SAAO,EAAE,MAAM,OAAO,QAAQ,QAAQ,MAAM,SAAS;AACvD;AAEA,SAAS,YAAY,OAA0C;AAC7D,MAAI,MAAM,QAAQ,MAAM,KAAK,GAAG;AAC9B,UAAM,MAAgB,CAAC;AACvB,eAAW,KAAK,MAAM,OAAwD;AAC5E,iBAAW,KAAK,OAAO,EAAE,WAAW,EAAE,EAAE,MAAM,IAAI,EAAG,KAAI,KAAK,KAAK,CAAC,EAAE;AACtE,iBAAW,KAAK,OAAO,EAAE,WAAW,EAAE,EAAE,MAAM,IAAI,EAAG,KAAI,KAAK,KAAK,CAAC,EAAE;AAAA,IACxE;AACA,WAAO;AAAA,EACT;AACA,SAAO,OAAO,MAAM,WAAW,EAAE,EAAE,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AACpE;AAEO,SAAS,eAAe,QAAgB,OAAgC,GAAa,UAA+C;AACzI,SAAO,EAAE,GAAG,KAAK,QAAQ,OAAO,GAAG,QAAQ,GAAG,WAAW,EAAE,aAAa,CAAC,GAAG,aAAa,EAAE,eAAe,MAAM;AAClH;AAEA,SAAS,KAAK,QAAgB,OAAgC,GAAa,UAA+C;AACxH,QAAM,QAAQ,CAAC,MAAc;AAC3B,UAAM,IAAIC,UAAS,UAAU,QAAQ,GAAG,CAAC;AACzC,WAAO,EAAE,WAAW,IAAI,KAAKC,YAAW,CAAC,IAAI,IAAI;AAAA,EACnD;AACA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK,QAAQ;AACX,YAAM,UAAU,EAAE,MAAM,SAAS,cAAc;AAC/C,aAAO,EAAE,MAAM,UAAU,YAAY,QAAQ,OAAO,UAAU,2BAA2B,QAAQ,SAAS,MAAM,OAAO,IAAI,GAAG,QAAQ,YAAY,KAAK,GAAG,OAAO,EAAE,OAAO,OAAO,EAAE,MAAM;AAAA,IAC3L;AAAA,IACA,KAAK;AACH,aAAO,EAAE,MAAM,WAAW,OAAO,yBAAyB,SAAS,OAAO,MAAM,QAAQ,CAAC,GAAG,OAAO,EAAE,OAAO,OAAO,KAAK;AAAA,IAC1H,KAAK,SAAS;AACZ,YAAM,QAAQ,OAAO,QAAQ,MAAM,OAAO;AAC1C,YAAM,OAAO,MAAM,SAAS,KAAK,OAAO,QAAQ,SAAS;AACzD,aAAO,EAAE,MAAM,SAAS,OAAO,SAAS,SAAS,OAAO,KAAK,OAAO,SAAS,QAAQ,OAAO,QAAQ,CAAC,GAAG,OAAO,EAAE,OAAO,OAAO,EAAE,MAAM;AAAA,IACzI;AAAA,IACA,KAAK;AACH,aAAO,EAAE,MAAM,OAAO,OAAO,GAAG,OAAO,MAAM,SAAM,OAAO,IAAI,IAAI,SAAS,KAAK,UAAU,KAAK,GAAG,QAAQ,CAAC,GAAG,OAAO,EAAE,OAAO,OAAO,EAAE,MAAM;AAAA,IAC/I,KAAK;AACH,aAAO,EAAE,MAAM,SAAS,OAAO,OAAO,MAAM,SAAS,IAAI,QAAQ,CAAC,GAAG,OAAO,CAAC,GAAG,OAAO,KAAK;AAAA,EAChG;AACF;AAGO,SAAS,WAAW,MAAoC;AAC7D,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,CAAC,OAAO;AACf,SAAG,GAAG,aAAa,OAAO,OAAO,QAAQ;AACvC,cAAM,QAAQ,MAAM;AACpB,cAAM,SAAS,SAAS,MAAM,UAAU,OAAO,KAAK,QAAQ;AAC5D,cAAM,IAAI,OAAO,QAAQ,EAAE,MAAM,KAAK,QAAQ,GAAG,OAAO,KAAK,SAAS,GAAG,UAAU,KAAK,UAAU,WAAW,KAAK,UAAU,EAAE,CAAC;AAC/H,YAAI,EAAE,YAAY,OAAQ,QAAO,EAAE,OAAO,MAAM,QAAQ,gBAAgB,EAAE,MAAM,IAAI;AACpF,YAAI,EAAE,YAAY,OAAO;AACvB,gBAAM,SAAS,MAAM,KAAK,SAAS,IAAI,EAAE,IAAI,MAAM,cAAc,WAAW,GAAG,GAAG,eAAe,QAAQ,OAAO,GAAG,KAAK,QAAQ,EAAE,GAAG,IAAI,MAAM;AAC/I,cAAI,CAAC,OAAO,SAAS;AACnB,mBAAO,EAAE,OAAO,MAAM,QAAQ,OAAO,SAAS,2BAA2B,OAAO,MAAM,KAAK,iCAAiC;AAAA,UAC9H;AACA,cAAI,OAAO,UAAU,EAAE,OAAO;AAC5B,yBAAa,KAAK,UAAU,EAAE,KAAK;AACnC,iBAAK,cAAc,EAAE,KAAK;AAAA,UAC5B;AAAA,QACF;AACA,YAAI,OAAO,SAAS,OAAQ,MAAK,gBAAgB,OAAO,IAAI;AAC5D,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AGjGA,SAAS,WAAW,QAAyB;AAC3C,QAAM,UAAW,QAA8E;AAC/F,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,SAAO,QAAQ,IAAI,CAAC,MAAO,EAAE,SAAS,SAAU,EAAE,QAAQ,KAAM,EAAG,EAAE,KAAK,EAAE;AAC9E;AAEO,SAAS,SAAS,GAAmC;AAC1D,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK,kBAAkB;AACrB,YAAM,KAAK,EAAE;AACb,UAAI,GAAG,SAAS,aAAc,QAAO,CAAC,EAAE,MAAM,QAAQ,OAAO,GAAG,MAAM,CAAC;AACvE,UAAI,GAAG,SAAS,iBAAkB,QAAO,CAAC,EAAE,MAAM,WAAW,CAAC;AAC9D,aAAO,CAAC;AAAA,IACV;AAAA,IACA,KAAK;AACH,aAAO,CAAC,EAAE,MAAM,cAAc,IAAI,EAAE,YAAY,MAAM,EAAE,UAAU,MAAO,EAAE,QAAQ,CAAC,EAA8B,CAAC;AAAA,IACrH,KAAK,sBAAsB;AACzB,YAAM,OAAO,WAAW,EAAE,MAAM,EAAE,KAAK;AACvC,aAAO,CAAC,EAAE,MAAM,YAAY,IAAI,EAAE,YAAY,MAAM,EAAE,UAAU,SAAS,EAAE,SAAS,SAAS,KAAK,MAAM,IAAI,EAAE,CAAC,KAAK,IAAI,QAAQ,KAAK,CAAC;AAAA,IACxI;AAAA,IACA,KAAK;AACH,aAAO,CAAC,EAAE,MAAM,WAAW,CAAC;AAAA,IAC9B,KAAK;AACH,aAAO,CAAC,EAAE,MAAM,UAAU,CAAC;AAAA,IAC7B,KAAK;AACH,aAAO,CAAC,EAAE,MAAM,SAAS,UAAU,CAAC,GAAG,EAAE,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;AAAA,IACjF,KAAK;AACH,aAAO,CAAC,EAAE,MAAM,cAAc,OAAO,QAAQ,CAAC;AAAA,IAChD,KAAK;AACH,aAAO,CAAC,EAAE,MAAM,cAAc,OAAO,OAAO,GAAI,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,IAAI,CAAC,EAAG,CAAC;AAAA,IACpG,KAAK;AACH,aAAO,CAAC,EAAE,MAAM,SAAS,SAAS,EAAE,SAAS,KAAK,EAAE,aAAa,OAAO,EAAE,aAAa,CAAC;AAAA,IAC1F,KAAK,aAAa;AAChB,YAAM,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAO,EAAwB,SAAS,WAAW;AAGhG,UAAI,MAAM,eAAe,WAAW,CAAC,EAAE,UAAW,QAAO,CAAC,EAAE,MAAM,SAAS,SAAS,KAAK,gBAAgB,4BAA4B,CAAC;AACtI,aAAO,CAAC;AAAA,IACV;AAAA,IACA;AACE,aAAO,CAAC;AAAA,EACZ;AACF;;;ANvCO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AA6BX,SAAS,aAAa,UAAkB,KAAwB;AAC9D,SAAO,CAACC,MAAK,UAAU,SAAS,GAAG,UAAU,GAAG,EAAE,MAAM,EACrD,OAAO,CAAC,SAASC,YAAW,IAAI,CAAC,EACjC,IAAI,CAAC,UAAU,EAAE,MAAM,SAASC,cAAa,MAAM,MAAM,EAAE,EAAE;AAClE;AAGA,SAAS,cAAc,MAAc,YAAoB,UAAsC;AAC7F,QAAM,UAAU,eAAe,KAAK,MAAM,YAAY,QAAQ,EAAE,WAAW;AAC3E,WAAS,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;AAC5C,UAAM,IAAI,QAAQ,CAAC;AACnB,QAAI,EAAE,SAAS,kBAAkB,EAAE,YAAY,EAAE,QAAS,QAAO,GAAG,EAAE,QAAQ,IAAI,EAAE,OAAO;AAC3F,QAAI,EAAE,SAAS,aAAa,EAAE,SAAS,SAAS,eAAe,EAAE,QAAQ,YAAY,EAAE,QAAQ,MAAO,QAAO,GAAG,EAAE,QAAQ,QAAQ,IAAI,EAAE,QAAQ,KAAK;AAAA,EACvJ;AACA,SAAO;AACT;AAEA,SAAS,WAAW,SAAuB,OAAwB;AACjE,QAAM,QAAQ,MAAM,QAAQ,GAAG;AAC/B,SAAO,QAAQ,KAAK,QAAQ,SAAS,MAAM,MAAM,GAAG,KAAK,GAAG,MAAM,MAAM,QAAQ,CAAC,CAAC,MAAM;AAC1F;AAEA,eAAsB,kBAAkB,GAA6C;AACnF,QAAM,MAAM,EAAE,OAAO,QAAQ;AAC7B,QAAM,QAAQ,UAAU,GAAG;AAC3B,QAAM,YAAYF,MAAK,EAAE,YAAY,SAAS;AAC9C,aAAW,OAAO,CAAC,MAAM,UAAU,EAAE,UAAU,EAAG,CAAAG,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAEpF,QAAM,eACJ,EAAE,gBAAiB,MAAM,aAAa,OAAO,EAAE,UAAUH,MAAK,MAAM,UAAU,WAAW,GAAG,YAAY,MAAM,iBAAiB,MAAM,CAAC;AACxI,QAAM,WAAW,CAAC,EAAE,SAAS,EAAE,cAAc,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,IAAI;AACtG,MAAI;AACJ,MAAI;AACJ,MAAI,YAAY,WAAW,cAAc,QAAQ,EAAG,UAAS,UAAU,cAAc,EAAE,WAAW,UAAU,KAAK,QAAQ,IAAI,CAAC;AAAA,OACzH;AACH,aAAS,UAAU,cAAc,EAAE,WAAW,EAAE,OAAO,KAAK,QAAQ,IAAI,CAAC;AACzE,QAAI,SAAU,UAAS,SAAS,QAAQ,4BAA4B,OAAO,KAAK;AAAA,EAClF;AACA,QAAM,EAAE,OAAO,MAAM,IAAI;AAEzB,QAAM,kBAAkB,gBAAgB,SAAS;AAAA,IAC/C,YAAY,EAAE,SAAS,KAAK;AAAA,IAC5B,OAAO,EAAE,SAAS,MAAM,YAAY,GAAG,aAAa,OAAO,IAAI,sBAAsB,GAAI,GAAG,iBAAiB,IAAO;AAAA,EACtH,CAAC;AACD,QAAM,WAAW,MAAM,2BAA2B;AAAA,IAChD,KAAK,EAAE;AAAA,IACP,UAAU,MAAM;AAAA,IAChB;AAAA,IACA;AAAA,IACA,uBAAuB;AAAA,MACrB,cAAc;AAAA,MACd,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,UAAU;AAAA,MACV,mBAAmB;AAAA,MACnB,oBAAoB,CAAC;AAAA,MACrB,oBAAoB;AAAA,QAClB,WAAW;AAAA,UACT,UAAU,EAAE;AAAA,UACZ,SAAS,EAAE;AAAA,UACX,UAAU,EAAE;AAAA,UACZ,WAAW,EAAE;AAAA,UACb,UAAU,EAAE;AAAA,UACZ,aAAa,EAAE;AAAA,UACf,eAAe,EAAE;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,MACA,cAAc;AAAA,MACd,qBAAqB,OAAO,EAAE,aAAa,aAAa,EAAE,UAAU,GAAG,EAAE;AAAA,IAC3E;AAAA,EACF,CAAC;AAED,QAAM,iBAAiB,EAAE,cACrB,eAAe,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,IAC3D,eAAe,OAAO,EAAE,UAAU,EAAE,UAAU;AAClD,QAAM,OAAO,eAAe,EAAE,KAAK,EAAE,UAAU,WAAW,QAAQ,IAAI,cAAc,EAAE,cAAc,IAAI,CAAC,GAAG,aAAa,aAAa,CAAC;AACvI,QAAM,EAAE,QAAQ,IAAI,MAAM,+BAA+B;AAAA,IACvD;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,CAAC,QAAQ,QAAQ,QAAQ,OAAO;AAAA,IACvC,aAAa,CAAC,IAAI;AAAA,EACpB,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC3B,WAAW,CAAC,OAAO,QAAQ,UAAU,CAAC,MAAM;AAAE,iBAAW,UAAU,SAAS,CAAC,EAAG,IAAG,MAAM;AAAA,IAAG,CAAC;AAAA,IAC7F,SAAS,YAAY,QAAQ,QAAQ;AAAA,EACvC;AACF;;;AOhJA,SAAS,cAAAI,mBAAkB;AAC3B,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,UAAS,QAAAC,OAAM,WAAAC,gBAAe;AAIvC,IAAM,OAAO,CAAC,SAAkBC,YAAW,IAAI,IAAIC,cAAa,MAAM,MAAM,IAAI;AAUzE,SAAS,eAAe,UAAkB,MAAyB,QAAQ,KAAK;AACrF,QAAM,eAAeC,MAAK,UAAU,SAAS,eAAe;AAC5D,QAAM,UAAUA,MAAK,UAAU,SAAS,UAAU;AAClD,QAAM,YAAYA,MAAK,UAAU,SAAS,qBAAqB;AAC/D,QAAM,SAAS,cAAc,QAAQ;AACrC,QAAM,UAAU,CAAC,KAAK,YAAY,GAAG,KAAK,OAAO,GAAG,GAAI,SAAS,CAAC,KAAK,SAAS,CAAC,IAAI,CAAC,CAAE;AACxF,QAAM,OAAOC,YAAW,QAAQ,EAAE,OAAO,QAAQ,KAAK,IAAI,CAAC,EAAE,OAAO,KAAK;AACzE,QAAM,QAAQ,CAAC,cAAc,GAAI,SAAS,CAAC,SAAS,IAAI,CAAC,CAAE,EAAE,IAAI,CAAC,MAAM,SAAuB,CAAC,KAAK,CAAC,CAAC;AACvG,QAAM,MAAM,SAAkB,OAAO,KAAK,CAAC;AAC3C,QAAM,QAAQ,MAAM,QAAQ,CAAC,MAAM,EAAE,aAAa,SAAS,CAAC,CAAC;AAC7D,QAAM,UAAU,OAAO,QAAQ,IAAI,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO;AAAA,IACvE;AAAA,IACA,SAAS,EAAE,OAAO,CAAC,EAAE,SAAS,GAAI,EAAE,QAAQ,CAAC,CAAE,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,EAC3E,EAAE;AACF,QAAM,SAAS,MAAM,SAAS,KAAK,QAAQ,SAAS,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,gBAAgB,MAAS;AACtG,QAAM,QAAQ,SAAiC,UAAU,GAAG,EAAE,KAAK,KAAK,CAAC;AACzE,SAAO,EAAE,QAAQ,SAAS,CAAC,UAAU,MAAMC,SAAQ,QAAQ,CAAC,MAAM,MAAM,MAAM,OAAO,QAAQ;AAC/F;AAEO,SAAS,UAAU,UAAkB,MAAc,MAAyB,QAAQ,KAAW;AACpG,QAAM,OAAO,UAAU,GAAG,EAAE;AAC5B,QAAM,QAAQ,SAAiC,IAAI,KAAK,CAAC;AACzD,QAAMA,SAAQ,QAAQ,CAAC,IAAI;AAC3B,EAAAC,WAAUC,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,EAAAC,eAAc,MAAM,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,EAAE,MAAM,IAAM,CAAC;AAC1E,mBAAiB,QAAQ;AAC3B;;;ARlBA,eAAsB,SAAS,GAAkC;AAC/D,QAAM,MAAM,EAAE,WAAW,CAACC,OAAc,QAAQ,OAAO,MAAMA,EAAC;AAC9D,QAAM,MAAM,EAAE,WAAW,CAACA,OAAc,QAAQ,OAAO,MAAMA,EAAC;AAC9D,QAAM,QAAQ,eAAe,EAAE,UAAU,EAAE,GAAG;AAC9C,QAAM,WAAW,aAAa,EAAE,UAAU,EAAE,SAAS,MAAM,SAAS,KAAK,EAAE,IAAI,CAAC;AAChF,QAAM,QAAQ,EAAE,OAAO,CAAC,GAAG,SAAS,MAAM,OAAO,GAAG,EAAE,MAAM,IAAI,CAAC,UAAU,EAAE,MAAM,QAAQ,UAAU,EAAE,CAAC,GAAG,MAAM,SAAS,MAAM,KAAK;AACrI,QAAM,OAAO,EAAE,QAAQ,SAAS;AAChC,QAAM,SAA4B,CAAC;AACnC,MAAI;AACJ,MAAI;AACF,QAAI,MAAM,kBAAkB;AAAA,MAC1B,UAAU,EAAE;AAAA,MACZ,YAAY,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,WAAW,EAAE,QAAQ;AAAA,MACpE,cAAc,EAAE;AAAA,MAChB,OAAO,EAAE;AAAA,MACT,KAAK,EAAE;AAAA,MACP,MAAM,MAAM;AAAA,MACZ,OAAO,MAAM;AAAA,MACb,WAAW,MAAM,CAAC;AAAA,MAClB,UAAU;AAAA,QACR,KAAK,OAAO,QAAQ;AAClB,iBAAO,KAAK,GAAG;AACf,iBAAO,EAAE,SAAS,OAAO,QAAQ,qFAAqF;AAAA,QACxH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,SAAS,GAAG;AACV,QAAI,GAAI,EAAY,OAAO;AAAA,CAAI;AAC/B,WAAO;AAAA,EACT;AACA,QAAM,QAAoE,CAAC;AAC3E,QAAM,SAAS,oBAAI,IAA+C;AAClE,MAAI;AACJ,IAAE,UAAU,CAAC,MAAM;AACjB,QAAI,EAAE,SAAS,cAAc;AAC3B,YAAM,UAAU,EAAE,SAAS,SAAS,OAAO,EAAE,KAAK,WAAW,EAAE,IAAI,OAAO,EAAE,KAAK,SAAS,WAAWC,UAAS,EAAE,UAAUC,SAAQ,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC,IAAI;AAC9J,aAAO,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC5C;AACA,QAAI,EAAE,SAAS,WAAY,OAAM,KAAK,EAAE,GAAI,OAAO,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,GAAI,SAAS,EAAE,QAAQ,CAAC;AACpH,QAAI,EAAE,SAAS,QAAS,WAAU,EAAE;AAAA,EACtC,CAAC;AACD,MAAI;AACF,UAAM,EAAE,QAAQ,OAAO,EAAE,MAAM;AAAA,EACjC,SAAS,GAAG;AACV,cAAW,EAAY;AAAA,EACzB;AACA,QAAM,OAAO,CAAC,GAAG,EAAE,QAAQ,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AACjF,QAAM,UAAU,MAAM,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK;AAC7G,QAAM,QAAQ,EAAE,QAAQ,gBAAgB;AACxC,QAAM,EAAE,QAAQ;AAChB,MAAI,SAAS;AACX,QAAI,GAAG,OAAO;AAAA,CAAI;AAClB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,QAAQ;AACjB,eAAW,OAAO,QAAQ;AACxB,YAAMC,SAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAK,IAAI,aAAa,CAAC;AAC3D,YAAM,QAAQA,OAAM,IAAI,CAAC,MAAM,YAAY,CAAC,GAAG,EAAE,KAAK,GAAG;AACzD,YAAM,OAAO,IAAI,cAAc,uDAAuD,cAAc,QAAQ,GAAG,KAAK,SAAS,EAAE,UAAU,IAAI,SAAS,SAAS,cAAc,MAAM;AACnL,UAAI,iCAAiC,IAAI,KAAK,IAAI,IAAI,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,kBAAkB,IAAI;AAAA,CAAK;AAAA,IACjH;AACA,WAAO;AAAA,EACT;AACA,MAAI,EAAE,WAAW,SAAS,GAAG,KAAK,UAAU,EAAE,QAAQ,OAAO,OAAO,EAAE,QAAQ,MAAM,OAAO,OAAO,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;AAAA,IAAO,GAAG,MAAM;AAAA,CAAI;AAC3I,SAAO;AACT;;;ASzFA,SAAS,cAAAC,aAAY,YAAAC,iBAAgB;AACrC,SAAS,cAAAC,aAAY,YAAAC,WAAU,WAAAC,gBAAe;AAC9C,SAAyB,WAAW,YAAY,YAAY,QAAuB,qBAAqB;;;ACFxG,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,cAAAC,aAAY,aAAAC,YAAW,aAAa,gBAAAC,eAAc,QAAQ,iBAAAC,sBAAqB;AACxF,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAQ9B,IAAM,OAAO,CAAC,KAAa,cAAsBA,MAAK,KAAK,WAAW,WAAW;AACjF,IAAM,MAAM,CAAC,SAAiBN,YAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAElF,SAAS,eAAe,KAAa,WAAmB,SAAiB,MAAoB;AAClG,QAAM,OAAOM,MAAK,KAAK,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI,IAAI,CAAC,OAAO;AACpE,MAAIL,YAAW,IAAI,EAAG;AACtB,EAAAC,WAAUG,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,QAAM,OAAiBJ,YAAW,IAAI,IAAI,EAAE,MAAM,SAAS,MAAM,SAASE,cAAa,IAAI,EAAE,SAAS,QAAQ,EAAE,IAAI,EAAE,MAAM,SAAS,MAAM;AAC3I,EAAAC,eAAc,MAAM,KAAK,UAAU,IAAI,CAAC;AAC1C;AAGO,SAAS,eAAe,KAAa,WAAmB,UAAkG;AAC/J,QAAM,OAAO,oBAAI,IAAmF;AACpG,aAAW,WAAW,UAAU;AAC9B,UAAM,IAAIE,MAAK,KAAK,KAAK,SAAS,GAAG,OAAO;AAC5C,QAAI,CAACL,YAAW,CAAC,EAAG;AACpB,eAAW,QAAQ,YAAY,CAAC,GAAG;AACjC,YAAM,OAAO,KAAK,MAAME,cAAaG,MAAK,GAAG,IAAI,GAAG,MAAM,CAAC;AAC3D,UAAI,KAAK,IAAI,KAAK,IAAI,EAAG;AACzB,WAAK,IAAI,KAAK,MAAM,EAAE,MAAM,KAAK,MAAM,SAAS,KAAK,SAAS,SAAS,GAAI,KAAK,YAAY,SAAY,EAAE,SAAS,OAAO,KAAK,KAAK,SAAS,QAAQ,EAAE,IAAI,CAAC,EAAG,CAAC;AAAA,IAClK;AAAA,EACF;AACA,SAAO,CAAC,GAAG,KAAK,OAAO,CAAC;AAC1B;AAEO,SAAS,QAAQ,OAAkE;AACxF,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS;AACb,MAAAJ,WAAUG,SAAQ,EAAE,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9C,MAAAD,eAAc,EAAE,MAAM,EAAE,WAAW,OAAO,MAAM,CAAC,CAAC;AAAA,IACpD,MAAO,QAAO,EAAE,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,EACvC;AACA,SAAO,EAAE,UAAU,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;AAC9C;;;AC5CA,SAAS,cAAAG,aAAY,UAAU,gBAAAC,eAAc,YAAY,UAAU,YAAY,iBAAAC,sBAAqB;AACpG,SAAS,kBAAAC,uBAAsB;AAK/B,IAAM,aAAa;AAGnB,eAAsB,aAAa,UAAkB,KAAqC;AACxF,MAAI,CAACH,YAAW,GAAG,EAAG,QAAO,CAAC;AAC9B,QAAM,QAAQ,MAAMG,gBAAe,KAAK,UAAU,GAAG;AACrD,SAAO,MACJ,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,MAAM,EAAE,QAAQ,EAAE,aAAa,MAAM,IAAI,EAAE,CAAC,KAAK,IAAI,WAAW,EAAE,SAAS,QAAQ,GAAG,UAAU,EAAE,aAAa,EAAE,EACvJ,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAC7C;AAEA,eAAsB,cAAc,UAAkB,KAA+C;AACnG,UAAQ,MAAM,aAAa,UAAU,GAAG,GAAG,CAAC;AAC9C;AAEA,SAAS,MAAM,KAAsB;AACnC,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,WAAQ,IAA8B,SAAS;AAAA,EACjD;AACF;AAGO,SAAS,WAAW,MAAkC;AAC3D,QAAM,OAAO,GAAG,IAAI;AACpB,MAAI,CAACH,YAAW,IAAI,EAAG,QAAO;AAC9B,QAAM,MAAM,OAAOC,cAAa,MAAM,MAAM,EAAE,KAAK,CAAC;AACpD,SAAO,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,QAAQ,QAAQ,OAAO,MAAM,GAAG,IAAI,MAAM;AACvF;AAGO,SAAS,YAAY,MAAwD;AAClF,QAAM,OAAO,GAAG,IAAI;AACpB,WAAS,UAAU,GAAG,UAAU,GAAG,WAAW;AAC5C,QAAI,WAAW,IAAI,EAAG,QAAO,EAAE,SAAS,MAAM,YAAY,IAAI,EAAE;AAChE,UAAM,SAAS,QAAQ,IAAI;AAC3B,QAAI,WAAW,OAAW,QAAO,EAAE,QAAQ,OAAO;AAClD,QAAI,YAAY,IAAI,EAAG;AACvB,UAAM,QAAQ,GAAG,IAAI,IAAI,QAAQ,GAAG;AACpC,QAAI;AACF,iBAAW,MAAM,KAAK;AAAA,IACxB,QAAQ;AACN;AAAA,IACF;AACA,UAAM,QAAQ,QAAQ,KAAK;AAC3B,QAAI,UAAU,QAAW;AACvB,UAAI;AACF,iBAAS,OAAO,IAAI;AAAA,MACtB,QAAQ;AAAA,MAER;AACA,iBAAW,KAAK;AAChB,aAAO,EAAE,QAAQ,MAAM;AAAA,IACzB;AACA,eAAW,KAAK;AAAA,EAClB;AACA,QAAM,IAAI,MAAM,kBAAkB,IAAI,oCAAoC;AAC5E;AAGA,SAAS,WAAW,MAAuB;AACzC,QAAM,MAAM,GAAG,IAAI,IAAI,QAAQ,GAAG;AAClC,EAAAC,eAAc,KAAK,OAAO,QAAQ,GAAG,CAAC;AACtC,MAAI;AACF,aAAS,KAAK,IAAI;AAClB,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,OAAM;AAC5D,WAAO;AAAA,EACT,UAAE;AACA,eAAW,GAAG;AAAA,EAChB;AACF;AAGA,SAAS,YAAY,MAAuB;AAC1C,MAAI;AACF,WAAOD,cAAa,MAAM,MAAM,EAAE,KAAK,MAAM,MAAM,KAAK,IAAI,IAAI,SAAS,IAAI,EAAE,UAAU;AAAA,EAC3F,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,QAAQ,MAAkC;AACjD,MAAI;AACJ,MAAI;AACF,UAAM,OAAOA,cAAa,MAAM,MAAM,EAAE,KAAK,CAAC;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO,OAAO,UAAU,GAAG,KAAK,MAAM,KAAK,MAAM,GAAG,IAAI,MAAM;AAChE;AAEA,SAAS,YAAY,MAAoB;AACvC,MAAI;AACF,QAAIA,cAAa,MAAM,MAAM,EAAE,KAAK,MAAM,OAAO,QAAQ,GAAG,EAAG,YAAW,IAAI;AAAA,EAChF,QAAQ;AAAA,EAER;AACF;AAGO,SAAS,aAAa,OAAyB,UAAsB;AAC1E,SAAO,UAAU,SAAS,UAAU,UAAU,UAAU,SAAS,QAAQ;AAC3E;AAEO,SAAS,WAAW,IAAoB,MAAkB;AAC/D,KAAG,kBAAkB,YAAY,EAAE,KAAK,CAAC;AAC3C;AAEO,SAAS,iBAAiB,IAAsC;AACrE,QAAM,UAAU,GAAG,WAAW;AAC9B,WAAS,IAAI,QAAQ,SAAS,GAAG,KAAK,GAAG,KAAK;AAC5C,UAAM,IAAI,QAAQ,CAAC;AACnB,QAAI,EAAE,SAAS,YAAY,EAAE,eAAe,WAAY,QAAO,EAAE,MAAM;AAAA,EACzE;AACA,SAAO;AACT;;;AChHO,IAAM,WAA0B;AAAA,EACrC,EAAE,MAAM,UAAU,OAAO,SAAS,MAAM,QAAQ,aAAa,6CAA6C,KAAK,CAAC,QAAQ,IAAI,UAAU,EAAE;AAAA,EACxI,EAAE,MAAM,gBAAgB,OAAO,SAAS,MAAM,QAAQ,aAAa,qEAAqE,KAAK,CAAC,KAAK,SAAS,IAAI,gBAAgB,IAAI,EAAE;AAAA,EACtL,EAAE,MAAM,WAAW,OAAO,WAAW,MAAM,SAAS,aAAa,wCAAwC,KAAK,CAAC,QAAQ,IAAI,WAAW,EAAE;AAAA,EACxI,EAAE,MAAM,SAAS,OAAO,WAAW,MAAM,SAAS,aAAa,gDAAgD,KAAK,CAAC,QAAQ,IAAI,SAAS,EAAE;AAAA,EAC5I,EAAE,MAAM,WAAW,OAAO,WAAW,MAAM,SAAS,aAAa,6DAA6D,KAAK,CAAC,QAAQ,IAAI,WAAW,EAAE;AAAA,EAC7J,EAAE,MAAM,YAAY,OAAO,WAAW,MAAM,SAAS,aAAa,8CAA8C,KAAK,CAAC,QAAQ,IAAI,QAAQ,EAAE;AAAA,EAC5I,EAAE,MAAM,UAAU,OAAO,YAAY,MAAM,SAAS,aAAa,oBAAoB,KAAK,CAAC,KAAK,SAAS,IAAI,SAAS,IAAI,EAAE;AAAA,EAC5H,EAAE,MAAM,SAAS,OAAO,YAAY,MAAM,SAAS,aAAa,qBAAqB,KAAK,CAAC,KAAK,SAAS,IAAI,QAAQ,IAAI,EAAE;AAAA,EAC3H,EAAE,MAAM,YAAY,OAAO,YAAY,MAAM,SAAS,aAAa,oDAAoD,KAAK,CAAC,KAAK,SAAS,IAAI,OAAO,IAAI,EAAE;AAAA,EAC5J,EAAE,MAAM,SAAS,OAAO,YAAY,MAAM,QAAQ,aAAa,qBAAqB,KAAK,CAAC,QAAQ,IAAI,SAAS,EAAE;AAAA,EACjH,EAAE,MAAM,SAAS,OAAO,YAAY,MAAM,SAAS,aAAa,cAAc,KAAK,CAAC,QAAQ,IAAI,KAAK,EAAE;AACzG;AAEA,IAAM,QAAiB,CAAC,YAAY,SAAS,WAAW,UAAU;AAG3D,SAAS,WAAW,UAAyB,QAA6C;AAC/F,SAAO,MAAM,IAAI,CAAC,WAAW;AAAA,IAC3B;AAAA,IACA,UAAU,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,EAAE,aAAa,GAAI,OAAO,EAAE,IAAI,IAAI,EAAE,OAAO,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAG,EAAE;AAAA,EACrK,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,CAAC;AACzC;;;ACpCA,SAAS,wBAAwB;;;ACAjC,SAAyB,iBAAiB,oBAAoB;AAGvD,IAAe,QAAf,MAA0C;AAAA,EACvC,cAAc;AAAA,EACd,cAAwB,CAAC;AAAA,EACjC,OAAO,OAAyB;AAC9B,QAAI,UAAU,KAAK,aAAa;AAC9B,WAAK,cAAc,KAAK,KAAK,KAAK,EAAE,IAAI,CAAC,MAAM,IAAI,GAAG,KAAK,CAAC;AAC5D,WAAK,cAAc;AAAA,IACrB;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EACA,aAAmB;AACjB,SAAK,cAAc;AAAA,EACrB;AAAA,EACU,UAAgB;AACxB,SAAK,cAAc;AAAA,EACrB;AAEF;AAEO,SAAS,IAAI,GAAW,OAAuB;AACpD,SAAO,aAAa,CAAC,IAAI,QAAQ,gBAAgB,GAAG,KAAK,IAAI,GAAG,QAAQ,CAAC,GAAG,QAAG,IAAI;AACrF;AAGO,SAAS,KAAK,MAAc,OAAe,OAAuB;AACvE,QAAM,IAAI,aAAa,KAAK,IAAI,QAAQ,IAAI,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC,IAAI;AACjF,QAAM,OAAO,QAAQ,aAAa,CAAC,IAAI;AACvC,QAAM,IAAI,aAAa,IAAI,IAAI,OAAO,IAAI,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI;AACrE,SAAO,IAAI,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI;AAClF;AAMO,SAAS,aAAa,GAAmB;AAC9C,MAAI,KAAK,IAAW,QAAO,IAAI,IAAI,KAAW,QAAQ,CAAC,CAAC;AACxD,MAAI,KAAK,IAAO,QAAO,GAAG,KAAK,MAAM,IAAI,GAAK,CAAC;AAC/C,SAAO,OAAO,CAAC;AACjB;AAEO,SAAS,eAAe,IAAoB;AACjD,QAAM,IAAI,KAAK,MAAM,KAAK,GAAI;AAC9B,QAAM,IAAI,KAAK,MAAM,IAAI,IAAI;AAC7B,QAAM,IAAI,KAAK,MAAO,IAAI,OAAQ,EAAE;AACpC,MAAI,IAAI,EAAG,QAAO,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AACpD,MAAI,IAAI,EAAG,QAAO,GAAG,CAAC,IAAI,OAAO,IAAI,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AACzD,SAAO,GAAG,CAAC;AACb;AAEO,SAAS,MAAM,IAAoB;AACxC,QAAM,IAAI,KAAK,MAAM,KAAK,GAAI;AAC9B,SAAO,GAAG,KAAK,MAAM,IAAI,EAAE,CAAC,IAAI,OAAO,IAAI,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC;AACjE;;;ADnDA,IAAM,mBAAmB;AAGlB,IAAM,eAAN,cAA2B,MAAM;AAAA,EAMtC,YAAoB,GAAmB,KAAsB;AAC3D,UAAM;AADY;AAAmB;AAAA,EAEvC;AAAA,EAFoB;AAAA,EAAmB;AAAA,EALvC,WAAW;AAAA;AAAA,EAEX,UAAU;AAAA;AAAA,EAEV,WAAW;AAAA,EAIX,SAAS;AACP,SAAK,WAAW,CAAC,KAAK;AACtB,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,WAAW,SAAkB;AAC3B,SAAK,UAAU;AACf,SAAK,QAAQ;AAAA,EACf;AAAA,EACU,KAAK,OAAyB;AACtC,UAAM,EAAE,GAAG,IAAI,IAAI;AAEnB,UAAM,OAAO,GAAG,KAAK,WAAW,QAAQ,EAAE,GAAG,EAAE,GAAG,UAAU,QAAG,CAAC;AAChE,UAAM,SAAS,KAAK,WAAW,IAAI;AACnC,UAAM,QAAQ,IAAI,SAAS,UAAU,EAAE,GAAG,QAAQ,OAAO,IAAI,EAAE,GAAG,QAAQ,UAAU;AACpF,UAAM,QAAkB,CAAC;AACzB,QAAI,CAAC,KAAK,SAAU,OAAM,KAAK,KAAK,GAAG,IAAI,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,GAAG,QAAQ,IAAI,OAAO,CAAC,IAAI,OAAO,KAAK,CAAC;AAC7H,UAAM,SAAS,KAAK,WAAW,IAAI,SAAS,IAAI,OAAO,MAAM,GAAG,gBAAgB;AAChF,eAAW,KAAK,QAAQ;AACtB,YAAM,SAAS,EAAE,WAAW,IAAI,IAAI,QAAQ,EAAE,WAAW,IAAI,IAAI,OAAO;AACxE,iBAAW,QAAQ,iBAAiB,GAAG,KAAK,IAAI,GAAG,QAAQ,MAAM,CAAC,EAAG,OAAM,KAAK,GAAG,IAAI,MAAM,EAAE,GAAG,QAAQ,IAAI,CAAC,EAAE;AAAA,IACnH;AACA,QAAI,OAAO,SAAS,IAAI,OAAO,OAAQ,OAAM,KAAK,GAAG,IAAI,MAAM,EAAE,GAAG,QAAQ,GAAG,IAAI,OAAO,SAAS,OAAO,MAAM,aAAa,CAAC,EAAE;AAChI,QAAI,IAAI,MAAM,OAAQ,OAAM,KAAK,GAAG,IAAI,IAAI,EAAE,GAAG,QAAQ,IAAI,MAAM,KAAK,QAAK,CAAC,CAAC,EAAE;AACjF,UAAM,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,UAAU,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,SAAS,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,QAAQ,QAAQ,CAAC,EAAE;AACrI,QAAI,IAAI,MAAO,MAAK,KAAK,GAAG,EAAE,GAAG,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,QAAQ,gBAAgB,IAAI,KAAK,EAAE,CAAC,EAAE;AAC9F,QAAI,IAAI,OAAO,SAAS,iBAAkB,MAAK,KAAK,GAAG,EAAE,GAAG,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,QAAQ,KAAK,WAAW,aAAa,QAAQ,CAAC,EAAE;AACnI,SAAK,KAAK,EAAE,GAAG,QAAQ,KAAK,UAAU,gBAAgB,eAAe,CAAC;AACtE,UAAM,KAAK,KAAK,WAAW,KAAK,GAAG,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC,IAAI,OAAO,KAAK,IAAI,GAAG,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC,EAAE;AAC7G,WAAO;AAAA,EACT;AACF;;;AE5CO,IAAM,SAAN,cAAqB,MAAM;AAAA,EAChC,YAAoB,GAAkB,MAAqD;AACzF,UAAM;AADY;AAAkB;AAAA,EAEtC;AAAA,EAFoB;AAAA,EAAkB;AAAA,EAGtC,IAAI,MAAqD;AACvD,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACf;AAAA,EACU,KAAK,OAAyB;AACtC,UAAM,EAAE,GAAG,KAAK,IAAI;AACpB,UAAM,QAAQ,CAAC,KAAK,KAAK,KAAK,MAAM,KAAK,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,QAAK;AAC1E,WAAO,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,UAAU,MAAM,CAAC,IAAI,EAAE,GAAG,QAAQ,KAAK,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,QAAQ,SAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AAAA,EAChK;AACF;;;AChBA,SAAyB,QAAkC,mBAAAG,kBAAiB,gBAAAC,qBAAoB;;;ACOhG,IAAM,WAAqD;AAAA,EACzD,MAAM,EAAE,MAAM,WAAW,MAAM,WAAW,MAAM,WAAW,QAAQ,WAAW,IAAI,WAAW,KAAK,WAAW,MAAM,UAAU;AAAA,EAC7H,OAAO,EAAE,MAAM,WAAW,MAAM,WAAW,MAAM,WAAW,QAAQ,WAAW,IAAI,WAAW,KAAK,WAAW,MAAM,UAAU;AAChI;AAYA,IAAM,MAAM,CAAC,QAAqB,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAGxF,SAAS,MAAM,CAAC,GAAG,GAAG,CAAC,GAAgB;AACrC,QAAM,OAAO,CAAC,MAAe,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,MAAM,EAAE,CAAC;AAC7F,QAAM,QAAQ,CAAC,MAAe,MAAM,IAAI,IAAI,KAAK,IAAI;AACrD,QAAM,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AAC/C,QAAM,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK;AACrC,QAAM,MAAM,KAAK,OAAO,IAAI,IAAI,KAAK,CAAC;AACtC,QAAM,YAAY,MAAM,MAAM,MAAM,MAAM,IAAI,MAAM,MAAM,KAAK,OAAO,MAAM,KAAK,EAAE;AACnF,QAAM,YAAY,KAAK,YAAY,OAAO;AAC1C,QAAM,OAAO,CAAC,OAAiB,EAAE,CAAC,IAAK,MAAM,KAAK,EAAE,CAAC,IAAK,MAAM,KAAK,EAAE,CAAC,IAAK,MAAM;AACnF,SAAO,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,WAAW,WAAW,SAAS,CAAC,IAAI,OAAO;AACrG;AAEO,SAAS,UAAU,MAAyB,QAAQ,KAAgB;AACzE,MAAI,IAAI,aAAa,UAAa,IAAI,aAAa,GAAI,QAAO;AAC9D,MAAI,mBAAmB,KAAK,IAAI,aAAa,EAAE,EAAG,QAAO;AACzD,SAAO;AACT;AAGO,SAAS,iBAAiB,MAAyB,QAAQ,KAAKC,QAAyD;AAC9H,MAAI,IAAI,eAAe,WAAW,IAAI,eAAe,OAAQ,QAAO,IAAI;AACxE,MAAIA,OAAO,SAAQ,SAASA,OAAM,IAAI,SAASA,OAAM,IAAI,SAASA,OAAM,KAAK,MAAM,MAAM,UAAU;AACnG,SAAO;AACT;AAEO,SAAS,YAAY,EAAE,YAAY,KAAK,GAAuD;AACpG,QAAM,UAAU,SAAS,UAAU;AACnC,QAAM,OAAO,CAACC,OAAc,UAAkB,CAAC,MAAe,SAAS,SAAS,IAAI,GAAGA,KAAI,GAAG,CAAC,GAAG,KAAK;AACvG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,GAAG,MAAM,GAAG;AACV,UAAI,SAAS,OAAQ,QAAO;AAC5B,YAAM,IAAI,IAAI,QAAQ,IAAI,CAAC;AAC3B,YAAMA,QAAO,SAAS,cAAc,aAAa,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,aAAa,MAAM,CAAC,CAAC;AAChG,aAAO,GAAGA,KAAI,GAAG,CAAC;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,WAAW,UAAU;AAAA,IAChC,KAAK,KAAK,WAAW,UAAU;AAAA,IAC/B,QAAQ,KAAK,WAAW,UAAU;AAAA,EACpC;AACF;AAEO,SAAS,cAAc,GAAyB;AACrD,QAAM,IAAI,CAAC,SAAe,CAAC,MAAc,EAAE,GAAG,MAAM,CAAC;AACrD,SAAO;AAAA,IACL,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC;AAAA,IACtC,MAAM,EAAE,QAAQ;AAAA,IAChB,SAAS,EAAE,MAAM;AAAA,IACjB,MAAM,EAAE,QAAQ;AAAA,IAChB,WAAW,EAAE,MAAM;AAAA,IACnB,iBAAiB,EAAE,MAAM;AAAA,IACzB,OAAO,EAAE,MAAM;AAAA,IACf,aAAa,EAAE,MAAM;AAAA,IACrB,IAAI,EAAE,MAAM;AAAA,IACZ,YAAY,EAAE,MAAM;AAAA,IACpB,MAAM,EAAE;AAAA,IACR,QAAQ,EAAE;AAAA,IACV,eAAe,CAAC,MAAM;AAAA,IACtB,WAAW,CAAC,MAAM;AAAA,EACpB;AACF;AAEO,SAAS,YAAY,GAAuB;AACjD,SAAO;AAAA,IACL,aAAa,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC;AAAA,IAClC,YAAY;AAAA,MACV,gBAAgB,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC;AAAA,MACvC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,CAAC;AAAA,MAC7C,aAAa,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC;AAAA,MAClC,YAAY,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC;AAAA,MACjC,SAAS,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC;AAAA,IAChC;AAAA,EACF;AACF;;;ADhGA,IAAM,cAAc;AAGb,IAAM,WAAN,MAA+C;AAAA,EAEpD,YAAY,KAAkB,GAAU;AAAV;AAC5B,SAAK,SAAS,IAAI,OAAO,KAAK,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC;AAAA,EAC/D;AAAA,EAF8B;AAAA,EADrB;AAAA,EAIT,IAAI,UAAmB;AACrB,WAAQ,KAAK,OAAgC;AAAA,EAC/C;AAAA,EACA,IAAI,QAAQ,GAAY;AACtB,IAAC,KAAK,OAAgC,UAAU;AAAA,EAClD;AAAA,EACA,IAAI,SAAS,IAA0C;AACrD,SAAK,OAAO,WAAW;AAAA,EACzB;AAAA,EACA,UAAkB;AAChB,WAAO,KAAK,OAAO,QAAQ;AAAA,EAC7B;AAAA,EACA,QAAQ,MAAoB;AAC1B,SAAK,OAAO,QAAQ,IAAI;AAAA,EAC1B;AAAA,EACA,YAAY,MAAoB;AAC9B,SAAK,OAAO,YAAY,IAAI;AAAA,EAC9B;AAAA,EACA,aAAmB;AACjB,SAAK,OAAO,WAAW;AAAA,EACzB;AAAA,EACA,OAAO,OAAyB;AAC9B,UAAM,EAAE,EAAE,IAAI;AACd,UAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,CAAC;AACnC,UAAM,WAAW,KAAK,OAAO,OAAO,KAAK;AAEzC,UAAM,SAAS,SAAS,UAAU,CAAC,GAAG,MAAM,IAAI,KAAK,WAAW,KAAK,EAAE,QAAQ,mBAAmB,EAAE,CAAC,KAAK,EAAE,SAAS,QAAG,CAAC;AACzH,UAAM,UAAU,SAAS,MAAM,GAAG,SAAS,IAAI,SAAS,SAAS,MAAM;AACvE,UAAM,QAAQ,SAAS,IAAI,SAAS,MAAM,SAAS,CAAC,IAAI,CAAC;AACzD,UAAM,MAAM,EAAE,GAAG,QAAQ,QAAG;AAC5B,UAAM,QAAQ,KAAK,QAAQ,MAAM;AACjC,UAAM,OAAO,QAAQ,IAAI,CAAC,GAAG,MAAM;AACjC,UAAI,OAAO;AACX,UAAI,SAAS,MAAM,GAAG;AACpB,cAAM,SAAS,EAAE,MAAM,uBAAuB,IAAI,CAAC,KAAK;AACxD,eAAOC,iBAAgB,GAAG,MAAM,GAAG,EAAE,GAAG,QAAQ,WAAW,CAAC,IAAI,OAAO,QAAG;AAAA,MAC5E;AACA,YAAM,SAAS,OAAO,IAAI,OAAO,KAAK,IAAI,GAAG,QAAQC,cAAa,IAAI,CAAC,CAAC;AACxE,aAAO,GAAG,GAAG,GAAG,MAAM,IAAI,EAAE,GAAG,UAAU,QAAG,IAAI,GAAG,GAAGD,iBAAgB,QAAQ,OAAO,EAAE,CAAC,GAAG,GAAG;AAAA,IAChG,CAAC;AACD,WAAO;AAAA,MACL,EAAE,GAAG,QAAQ,SAAI,SAAI,OAAO,QAAQ,CAAC,CAAC,QAAG;AAAA,MACzC,GAAG;AAAA,MACH,EAAE,GAAG,QAAQ,SAAI,SAAI,OAAO,QAAQ,CAAC,CAAC,QAAG;AAAA,MACzC,GAAG,MAAM,IAAI,CAAC,MAAMA,iBAAgB,GAAG,OAAO,EAAE,CAAC;AAAA,IACnD;AAAA,EACF;AACF;;;AE3CA,SAAS,QAAQ,GAAU,OAAe,KAAa,OAAyB;AAC9E,SAAO,CAAC,KAAK,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC,KAAK,EAAE,GAAG,QAAQ,GAAG,CAAC,IAAI,EAAE,GAAG,QAAQ,WAAW,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,QAAQ,SAAI,OAAO,KAAK,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;AACjK;AAEO,IAAM,aAAN,cAAyB,MAAM;AAAA,EACpC,YAAoB,GAAkB,GAAe;AACnD,UAAM;AADY;AAAkB;AAAA,EAEtC;AAAA,EAFoB;AAAA,EAAkB;AAAA,EAG5B,KAAK,OAAyB;AACtC,UAAM,EAAE,GAAG,EAAE,IAAI;AACjB,UAAM,MAAM,CAAC,OAAe,UAAkB,IAAI,EAAE,GAAG,QAAQ,MAAM,OAAO,EAAE,CAAC,CAAC,GAAG,KAAK;AACxF,UAAM,MAAM,EAAE;AACd,UAAM,SAAS,QAAQ,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,MAAM,CAAC,CAAC,CAAC;AAC/E,UAAM,SAAS,EAAE,OAAO,QAAQ,KAAK,MAAO,MAAM,EAAE,OAAO,aAAc,EAAE,OAAO,QAAQ,EAAE,OAAO,UAAU,IAAI;AACjH,WAAO;AAAA,MACL,GAAG,QAAQ,GAAG,SAAS,gBAAgB,KAAK;AAAA,MAC5C,IAAI,SAAS,EAAE,GAAG,QAAQ,EAAE,KAAK,CAAC;AAAA,MAClC,IAAI,UAAU,GAAG,EAAE,GAAG,QAAQ,EAAE,OAAO,MAAM,eAAe,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,QAAQ,MAAM,EAAE,OAAO,MAAM,eAAe,OAAO,CAAC,aAAU,EAAE,OAAO,OAAO,eAAe,OAAO,CAAC,SAAM,MAAM,UAAU,CAAC,EAAE;AAAA,MAC7M,IAAI,WAAW,GAAG,EAAE,GAAG,UAAU,SAAI,OAAO,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,SAAI,OAAO,KAAK,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,QAAQ,QAAQ,OAAO,WAAM,GAAG,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,QAAQ,MAAM,aAAa,EAAE,aAAa,CAAC,6CAA0C,CAAC,EAAE;AAAA,MAC1P,IAAI,cAAc,EAAE,GAAG,QAAQ,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC;AAAA,MACvD,IAAI,WAAW,GAAG,EAAE,GAAG,QAAQ,eAAe,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,GAAG,QAAQ,QAAK,EAAE,KAAK,eAAY,EAAE,SAAS,aAAa,CAAC,EAAE;AAAA,IACjI;AAAA,EACF;AACF;AAIO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C,YAAoB,GAAkB,GAAoB;AACxD,UAAM;AADY;AAAkB;AAAA,EAEtC;AAAA,EAFoB;AAAA,EAAkB;AAAA,EAG5B,KAAK,OAAyB;AACtC,UAAM,EAAE,GAAG,EAAE,IAAI;AACjB,UAAM,UAAU,KAAK,IAAI,IAAI,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,GAAG,GAAG,EAAE,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACpH,UAAM,OAAO;AAAA,MACX,GAAG,EAAE,KAAK,IAAI,CAAC,MAAM,IAAI,EAAE,GAAG,OAAO,OAAO,CAAC,KAAK,EAAE,GAAG,QAAQ,EAAE,KAAK,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,QAAQ,EAAE,MAAM,CAAC,EAAE;AAAA,MACnH,GAAG,EAAE,MAAM,IAAI,CAAC,MAAM,IAAI,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,GAAG,QAAQ,EAAE,KAAK,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,QAAQ,EAAE,MAAM,CAAC,EAAE;AAAA,MACnH,GAAG,EAAE,QAAQ,IAAI,CAAC,MAAM,IAAI,EAAE,GAAG,QAAQ,OAAO,CAAC,KAAK,EAAE,GAAG,QAAQ,EAAE,OAAO,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,QAAQ,sCAAmC,CAAC,EAAE;AAAA,IAC/I;AACA,WAAO;AAAA,MACL,GAAG,QAAQ,GAAG,eAAe,QAAQ,EAAE,IAAI,IAAI,KAAK;AAAA,MACpD,GAAI,KAAK,SAAS,OAAO,CAAC,IAAI,EAAE,GAAG,QAAQ,oDAAoD,CAAC,EAAE;AAAA,MAClG;AAAA,MACA,IAAI,EAAE,GAAG,QAAQ,sGAAsG,CAAC;AAAA,IAC1H;AAAA,EACF;AACF;;;ACtDO,IAAM,YAAN,cAAwB,MAAM;AAAA,EAGnC,YAAoB,GAAkB,QAAqB;AACzD,UAAM;AADY;AAAkB;AAAA,EAEtC;AAAA,EAFoB;AAAA,EAAkB;AAAA,EAF9B,SAAS;AAAA,EACT,QAAQ;AAAA,EAIR,UAAuB;AAC7B,WAAO,KAAK,OACT,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,UAAU,EAAE,SAAS,OAAO,CAAC,MAAM,EAAE,KAAK,WAAW,KAAK,MAAM,CAAC,EAAE,EAAE,EACnG,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS,CAAC;AAAA,EACxC;AAAA,EACQ,OAAsB;AAC5B,WAAO,KAAK,QAAQ,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ;AAAA,EACjD;AAAA,EACA,UAAU,QAAqB;AAC7B,SAAK,SAAS;AACd,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,OAAO,QAAgB;AACrB,SAAK,SAAS,UAAU;AACxB,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,UAAmB;AACjB,WAAO,KAAK,KAAK,EAAE,WAAW;AAAA,EAChC;AAAA,EACA,WAAoC;AAClC,WAAO,KAAK,KAAK,EAAE,KAAK,KAAK;AAAA,EAC/B;AAAA;AAAA,EAEA,KAAK,IAAY,IAAY;AAC3B,UAAM,OAAO,KAAK,KAAK;AACvB,QAAI,CAAC,KAAK,OAAQ;AAClB,QAAI,GAAI,MAAK,SAAS,KAAK,QAAQ,KAAK,KAAK,UAAU,KAAK;AAC5D,QAAI,IAAI;AACN,YAAM,SAAS,KAAK,QAAQ;AAC5B,YAAM,UAAU,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,SAAS,KAAK,KAAK,KAAK,CAAE,CAAC;AAC9E,YAAM,SAAS,QAAQ,UAAU,KAAK,OAAO,UAAU,OAAO,MAAM;AACpE,WAAK,QAAQ,KAAK,QAAQ,OAAO,SAAS,CAAC,CAAE;AAAA,IAC/C;AACA,SAAK,QAAQ;AAAA,EACf;AAAA,EACU,OAAiB;AACzB,UAAM,EAAE,EAAE,IAAI;AACd,UAAM,MAAM,KAAK,SAAS;AAC1B,UAAM,OAAO,KAAK,QAAQ,EAAE,IAAI,CAAC,MAAM;AACrC,YAAM,QAAQ,EAAE,SAAS,IAAI,CAAC,MAAM;AAClC,cAAM,OAAO,MAAM,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,EAAE,IAAI;AAC7E,eAAO,EAAE,QAAQ,GAAG,IAAI,IAAI,EAAE,GAAG,QAAQ,EAAE,KAAK,CAAC,KAAK;AAAA,MACxD,CAAC;AACD,aAAO,KAAK,EAAE,GAAG,QAAQ,EAAE,MAAM,OAAO,EAAE,CAAC,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA,IACjE,CAAC;AACD,QAAI,CAAC,IAAK,QAAO,CAAC,KAAK,EAAE,GAAG,QAAQ,2DAA2D,CAAC,EAAE;AAClG,WAAO,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,GAAG,UAAU,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,QAAQ,IAAI,WAAW,CAAC,EAAE;AAAA,EACxF;AACF;;;AC/CA,IAAM,cAAc,EAAE,KAAK,QAAQ,MAAM,QAAQ,MAAM,SAAS;AAGzD,IAAM,aAAN,cAAyB,MAAM;AAAA,EAEpC,YAAoB,GAAU;AAC5B,UAAM;AADY;AAAA,EAEpB;AAAA,EAFoB;AAAA,EADZ,OAAmB,EAAE,MAAM,OAAO,QAAQ,GAAG,MAAM,GAAG,gBAAgB,MAAM,MAAM,CAAC,GAAG,WAAW,MAAM;AAAA,EAI/G,IAAI,MAA2B;AAC7B,SAAK,OAAO,EAAE,GAAG,KAAK,MAAM,GAAG,KAAK;AACpC,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,IAAI,UAAsB;AACxB,WAAO,KAAK;AAAA,EACd;AAAA,EACU,KAAK,OAAyB;AACtC,UAAM,EAAE,GAAG,KAAK,IAAI;AACpB,UAAM,MAAM,EAAE,GAAG,QAAQ,QAAK;AAC9B,UAAM,MAAM,KAAK;AACjB,UAAM,SAAS,QAAQ,OAAO,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,MAAM,EAAE,CAAC,CAAC;AAChF,UAAM,MAAM,GAAG,EAAE,GAAG,UAAU,SAAI,OAAO,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,SAAI,OAAO,KAAK,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,QAAQ,QAAQ,OAAO,WAAM,GAAG,KAAK,MAAM,GAAG,CAAC,GAAG,CAAC;AACrJ,UAAM,QAAQ,CAAC,EAAE,GAAG,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,GAAG,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,QAAQ,QAAG,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,GAAG,QAAQ,aAAa,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,QAAQ,IAAI,KAAK,KAAK,QAAQ,CAAC,CAAC,EAAE,CAAC;AAClN,UAAM,QAAQ,KAAK,YAAY,EAAE,GAAG,QAAQ,UAAU,IAAI,EAAE,GAAG,QAAQ,KAAK,QAAQ,EAAE;AACtF,WAAO,CAAC,KAAK,KAAK,MAAM,KAAK,GAAG,CAAC,IAAI,OAAO,KAAK,CAAC;AAAA,EACpD;AACF;;;AClCO,IAAM,UAAN,cAAsB,MAAM;AAAA,EAIjC,YAAoB,GAAmB,MAAsD;AAC3F,UAAM;AADY;AAAmB;AAAA,EAEvC;AAAA,EAFoB;AAAA,EAAmB;AAAA,EAH/B,QAAe,EAAE,MAAM,WAAW,WAAW,EAAE;AAAA,EACvD,WAAW;AAAA,EACH,UAAU;AAAA;AAAA,EAKlB,WAAW,SAAkB;AAC3B,SAAK,UAAU;AACf,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,WAAW,WAAmB;AAC5B,SAAK,QAAQ,EAAE,MAAM,WAAW,UAAU;AAC1C,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,OAAO,GAA2D;AAChE,UAAM,SAAS,EAAE,UAAU,EAAE;AAC7B,SAAK,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,SAAS,EAAE,SAAS,OAAO,IAAI,EAAE,MAAM,QAAQ,SAAS,EAAE,SAAS,OAAO;AACrH,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,SAAS;AACP,SAAK,WAAW,CAAC,KAAK;AACtB,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,IAAI,WAAoB;AACtB,WAAO,KAAK,MAAM,SAAS;AAAA,EAC7B;AAAA,EACU,KAAK,OAAyB;AACtC,UAAM,EAAE,GAAG,MAAM,MAAM,IAAI;AAC3B,UAAM,OAAO,MAAM,EAAE,GAAG,QAAQ,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,QAAQ,KAAK,QAAQ,QAAQ,aAAa,GAAG,CAAC,CAAC;AAC5G,UAAM,SACJ,MAAM,SAAS,YAAY,EAAE,GAAG,QAAQ,KAAK,UAAU,mBAAmB,WAAW,MAAM,MAAM,SAAS,CAAC,EAAE,IAAI,MAAM,SAAS,SAAS,EAAE,GAAG,MAAM,MAAM,IAAI,EAAE,GAAG,OAAO,QAAQ;AACpL,UAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,KAAK,CAAC;AACxC,QAAI,MAAM,SAAS,UAAW,QAAO;AACrC,QAAI,KAAK,UAAU;AACjB,iBAAW,KAAK,MAAM,OAAO,MAAM,IAAI,EAAG,OAAM,KAAK,WAAW,EAAE,GAAG,MAAM,SAAS,WAAW,QAAQ,QAAQ,CAAC,CAAC,EAAE;AAAA,IACrH,WAAW,MAAM,SAAS,YAAY,MAAM,SAAS;AACnD,YAAM,KAAK,WAAW,EAAE,GAAG,OAAO,MAAM,OAAO,CAAC,EAAE;AAAA,IACpD;AACA,WAAO;AAAA,EACT;AACF;;;AChDA,SAAS,gBAAgB;AAIzB,IAAM,SAAS;AAER,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC,YAAoB,GAAkB,MAAc;AAClD,UAAM;AADY;AAAkB;AAAA,EAEtC;AAAA,EAFoB;AAAA,EAAkB;AAAA,EAG5B,OAAiB;AACzB,UAAM,CAAC,QAAQ,IAAI,GAAG,IAAI,IAAI,KAAK,KAAK,MAAM,IAAI;AAClD,WAAO,CAAC,IAAI,IAAI,KAAK,EAAE,GAAG,UAAU,QAAG,CAAC,IAAI,KAAK,EAAE,GAAG,QAAQ,KAAK,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,MAAM,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC;AAAA,EAC1H;AACF;AAGO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAIvC,YAAoB,GAAU;AAC5B,UAAM;AADY;AAElB,SAAK,KAAK,IAAI,SAAS,IAAI,GAAG,GAAG,cAAc,CAAC,CAAC;AAAA,EACnD;AAAA,EAHoB;AAAA,EAHZ,OAAO;AAAA,EACP;AAAA,EACS;AAAA,EAKjB,OAAO,OAAe;AACpB,SAAK,QAAQ;AACb,SAAK,GAAG,QAAQ,KAAK,IAAI;AACzB,SAAK,QAAQ;AAAA,EACf;AAAA,EACA,UAAmB;AACjB,WAAO,KAAK,KAAK,KAAK,EAAE,SAAS;AAAA,EACnC;AAAA;AAAA,EAEA,QAAQ,MAAc;AACpB,SAAK,OAAO;AACZ,SAAK,QAAQ;AAAA,EACf;AAAA,EACU,KAAK,OAAyB;AACtC,UAAM,EAAE,EAAE,IAAI;AACd,UAAM,OAAO,KAAK,OAAO,KAAK,GAAG,OAAO,KAAK,IAAI,IAAI,QAAQ,MAAM,CAAC,IAAI,CAAC,EAAE;AAC3E,UAAM,QAAQ,IAAI,EAAE,KAAK,EAAE,GAAG,UAAU,MAAM,CAAC,CAAC;AAChD,UAAM,QAAQ,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,GAAG,OAAO,MAAM,IAAI,QAAQ,IAAI,OAAO,MAAM,KAAK,CAAC,CAAC;AACpF,QAAI,KAAK,KAAM,OAAM,KAAK,GAAG,IAAI,OAAO,MAAM,CAAC,GAAG,EAAE,GAAG,QAAQ,KAAK,IAAI,CAAC,EAAE;AAC3E,WAAO;AAAA,EACT;AACF;;;ACvCA,SAAS,SAAS,GAAW,GAAmB;AAC9C,QAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC;AAC5D,WAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,QAAI,OAAO,IAAI,CAAC;AAChB,QAAI,CAAC,IAAI;AACT,aAAS,IAAI,GAAG,KAAK,EAAE,QAAQ,KAAK;AAClC,YAAM,MAAM,IAAI,CAAC;AACjB,UAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAK,GAAG,IAAI,IAAI,CAAC,IAAK,GAAG,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;AACtF,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,IAAI,EAAE,MAAM;AACrB;AAMO,SAAS,MAAM,OAAe,UAAiC;AACpE,QAAM,OAAO,MAAM,KAAK;AACxB,QAAM,QAAQ,KAAK,MAAM,MAAM,CAAC,EAAE,CAAC,KAAK;AACxC,QAAM,OAAO,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK;AAClD,MAAI,KAAM,QAAO,EAAE,MAAM,WAAW,MAAM,MAAM,KAAK,MAAM,MAAM,MAAM,EAAE,KAAK,EAAE;AAChF,MAAI,cAAc,KAAK,KAAK,GAAG;AAC7B,UAAM,cAAc,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,SAAS,GAAG,KAAK,KAAK,CAAC;AACrF,QAAI,YAAY,OAAQ,QAAO,EAAE,MAAM,WAAW,MAAM,OAAO,YAAY;AAAA,EAC7E;AACA,SAAO,EAAE,MAAM,UAAU,KAAK;AAChC;;;AdcA,IAAM,OAAN,cAAmB,MAAM;AAAA,EACvB,YAAoB,GAAkB,MAAsB,OAAa,QAAQ;AAC/E,UAAM;AADY;AAAkB;AAAsB;AAAA,EAE5D;AAAA,EAFoB;AAAA,EAAkB;AAAA,EAAsB;AAAA,EAGlD,OAAiB;AACzB,WAAO,KAAK,KAAK,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC,EAAE;AAAA,EACvE;AACF;AAEA,IAAM,QAAN,cAAoB,MAAM;AAAA,EACxB,YAAoB,OAAiB;AACnC,UAAM;AADY;AAAA,EAEpB;AAAA,EAFoB;AAAA,EAGV,OAAiB;AACzB,WAAO,KAAK;AAAA,EACd;AACF;AAEA,IAAM,aAAN,cAAyB,MAAM;AAAA,EAE7B,YAAoB,GAAU;AAC5B,UAAM;AADY;AAAA,EAEpB;AAAA,EAFoB;AAAA,EADpB,QAAyD,CAAC;AAAA,EAI1D,IAAI,OAAwD;AAC1D,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACf;AAAA,EACU,OAAiB;AACzB,UAAM,EAAE,EAAE,IAAI;AACd,WAAO,KAAK,MAAM,IAAI,CAAC,GAAG,MAAM,KAAK,EAAE,GAAG,QAAQ,MAAM,IAAI,WAAW,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,OAAO,IAAI,EAAE,GAAG,QAAQ,OAAO,CAAC,KAAK,EAAE,GAAG,QAAQ,EAAE,KAAK,QAAQ,OAAO,GAAG,CAAC,CAAC,EAAE;AAAA,EAC1M;AACF;AAEA,IAAM,cAAN,cAA0B,MAAM;AAAA,EAC9B,YAAoB,GAAkB,OAA0C;AAC9E,UAAM;AADY;AAAkB;AAAA,EAEtC;AAAA,EAFoB;AAAA,EAAkB;AAAA,EAG5B,OAAiB;AACzB,UAAM,EAAE,GAAG,MAAM,IAAI;AACrB,WAAO;AAAA,MACL,IAAI,EAAE,GAAG,QAAQ,sDAAsD,CAAC;AAAA,MACxE;AAAA,MACA,GAAG,MAAM,MAAM,IAAI,CAAC,MAAM,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,CAAC,EAAE;AAAA,MACzE,GAAG,MAAM,QAAQ,IAAI,CAAC,MAAM,MAAM,EAAE,GAAG,UAAU,QAAQ,CAAC,IAAI,EAAE,GAAG,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,QAAQ,EAAE,OAAO,CAAC,EAAE;AAAA,MAChH;AAAA,MACA,IAAI,EAAE,KAAK,EAAE,GAAG,UAAU,QAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,eAAe,CAAC,CAAC,OAAO,EAAE,GAAG,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,QAAQ,kBAAkB,CAAC,OAAO,EAAE,GAAG,UAAU,GAAG,CAAC,IAAI,EAAE,GAAG,QAAQ,eAAe,CAAC;AAAA,IACnM;AAAA,EACF;AACF;AAEA,SAAS,YAAY,SAA0B;AAC7C,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,MAAI,CAAC,MAAM,QAAQ,OAAO,EAAG,QAAO;AACpC,SAAO,QAAQ,IAAI,CAAC,MAAyC,EAAE,SAAS,SAAU,EAAE,QAAQ,KAAM,EAAG,EAAE,KAAK,EAAE;AAChH;AAEA,IAAM,MAAN,MAAsC;AAAA,EAsCpC,YAAoB,GAAkB;AAAlB;AAClB,SAAK,IAAI,EAAE,SAAS,YAAY,EAAE,YAAY,iBAAiB,EAAE,GAAG,GAAG,MAAM,UAAU,EAAE,GAAG,EAAE,CAAC;AAC/F,SAAK,MAAM,IAAI,cAAc,EAAE,QAAQ;AACvC,SAAK,QAAQ,IAAI,WAAW,KAAK,CAAC;AAClC,SAAK,QAAQ,IAAI,SAAS,KAAK,KAAK,KAAK,CAAC;AAC1C,SAAK,SAAS,IAAI,WAAW,KAAK,CAAC;AACnC,SAAK,OAAO,IAAI,UAAU,KAAK,GAAG,WAAW,UAAU,CAAC,CAAC,CAAC;AAC1D,SAAK,MAAM,EAAE,OAAO;AACpB,SAAK,aAAa,UAAU,EAAE,GAAG,EAAE,SAAS,KAAK,KAAK,EAAE,QAAQ;AAChE,SAAK,QAAQ,eAAe,EAAE,UAAU,EAAE,GAAG;AAC7C,SAAK,WAAW,aAAa,EAAE,UAAU,EAAE,SAAS,KAAK,MAAM,SAAS,KAAK,EAAE,IAAI,CAAC;AACpF,SAAK,OAAO,KAAK,SAAS;AAC1B,SAAK,SAAS,IAAI,OAAO,KAAK,GAAG,EAAE,KAAK,KAAK,KAAK,OAAO,GAAG,CAAC;AAC7D,SAAK,OAAO,IAAI,QAAQ,CAAC,MAAM;AAAE,WAAK,SAAS;AAAA,IAAG,CAAC;AACnD,eAAW,KAAK,CAAC,KAAK,cAAc,IAAI,OAAO,CAAC,GAAG,KAAK,OAAO,KAAK,WAAW,KAAK,OAAO,KAAK,UAAU,KAAK,MAAM,EAAG,MAAK,KAAK,SAAS,CAAC;AAC5I,SAAK,IAAI,SAAS,KAAK,UAAU;AACjC,SAAK,IAAI,SAAS,KAAK,IAAI;AAAA,EAC7B;AAAA,EAjBoB;AAAA,EArCX;AAAA,EACA;AAAA,EACQ,aAAa,IAAI,UAAU;AAAA,EAC3B,OAAO,IAAI,UAAU;AAAA,EACrB,eAAe,IAAI,UAAU;AAAA,EAC7B,YAAY,IAAI,UAAU;AAAA,EAC1B,WAAW,IAAI,UAAU;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT;AAAA,EACA,cAA0B,MAAM;AAAA,EAAC;AAAA,EACjC,cAA0B,MAAM;AAAA,EAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAsB,CAAC;AAAA,EACvB,YAAY;AAAA,EACZ,MAAM;AAAA,EACN;AAAA,EACA,OAAO,oBAAI,IAA+C;AAAA,EAC1D;AAAA,EACA,SAA0D,CAAC;AAAA,EAC3D;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACC;AAAA,EACQ;AAAA,EACA;AAAA;AAAA,EAuBjB,MAAM,QAAuB;AAC3B,QAAI,OAAO,KAAK,EAAE;AAClB,QAAI,CAAC,QAAQ,KAAK,EAAE,eAAgB,SAAQ,MAAM,cAAc,KAAK,EAAE,UAAU,KAAK,UAAU,IAAI;AACpG,UAAM,KAAK,KAAK,MAAM,KAAK,EAAE,KAAK;AAClC,SAAK,MAAM,WAAW,CAAC,SAAS,KAAK,KAAK,OAAO,IAAI;AACrD,SAAK,MAAM,OAAO,WAAW,MAAM,KAAK,WAAW;AACnD,SAAK,IAAI,iBAAiB,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC;AACpD,QAAI,KAAK,MAAM,UAAU,CAAC,KAAK,MAAM,SAAS;AAC5C,WAAK,cAAc,IAAI,YAAY,KAAK,GAAG,KAAK,KAAK;AACrD,WAAK,UAAU,SAAS,KAAK,WAAW;AAAA,IAC1C;AACA,SAAK,IAAI,SAAS,KAAK,KAAK;AAC5B,SAAK,IAAI,MAAM;AACf,UAAM,KAAK,wBAAwB;AACnC,SAAK,SAAS,YAAY,MAAM,KAAK,KAAK,GAAG,GAAI;AACjD,SAAK,cAAc;AACnB,QAAI,KAAK,EAAE,aAAc,OAAM,KAAK,WAAW;AAC/C,SAAK,EAAE,UAAU,EAAE,SAAS,MAAM,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,EAC1D;AAAA;AAAA,EAGA,MAAc,0BAAyC;AACrD,QAAI,KAAK,EAAE,SAAS,KAAK,EAAE,IAAI,cAAc,KAAK,EAAE,SAAS,OAAQ;AACrE,UAAME,OAAM,MAAM,KAAK,IAAI,6BAA6B,EAAE,WAAW,IAAI,CAAC,EAAE,MAAM,MAAM,MAAS;AACjG,QAAI,CAACA,QAAO,iBAAiB,KAAK,EAAE,KAAKA,IAAG,MAAM,KAAK,EAAE,WAAY;AACrE,WAAO,OAAO,KAAK,GAAG,YAAY,EAAE,YAAY,iBAAiB,KAAK,EAAE,KAAKA,IAAG,GAAG,MAAM,KAAK,EAAE,KAAK,CAAC,CAAC;AACvG,SAAK,IAAI,WAAW;AACpB,SAAK,IAAI,cAAc,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAc,KAAK,MAA0B,OAA0C;AACrF,QAAI,MAAM;AACR,YAAM,OAAO,YAAY,IAAI;AAC7B,UAAI,YAAY,KAAM,OAAM,IAAI,MAAM,iDAAiD,KAAK,MAAM,4CAA4C;AAC9I,WAAK,cAAc,KAAK;AAAA,IAC1B;AACA,SAAK,OAAO,MAAM,kBAAkB;AAAA,MAClC,UAAU,KAAK,EAAE;AAAA,MACjB,YAAY,KAAK;AAAA,MACjB,aAAa;AAAA,MACb,cAAc,KAAK,EAAE;AAAA,MACrB;AAAA,MACA,KAAK,KAAK,EAAE;AAAA,MACZ,MAAM,MAAM,KAAK;AAAA,MACjB,OAAO,MAAM,KAAK,SAAS;AAAA,MAC3B,WAAW,MAAM,KAAK;AAAA,MACtB,UAAU;AAAA,MACV,aAAa,CAAC,SAAS;AACrB,aAAK,eAAe;AACpB,cAAM,SAAS,cAAc,KAAK,EAAE,QAAQ,IAAI,wGAAwG;AACxJ,aAAK,KAAK,SAAS,IAAI,gCAAgC,MAAM,EAAE;AAAA,MACjE;AAAA,MACA,eAAe,CAAC,SAAS;AACvB,cAAM,OAAO,KAAK,KAAK,QAAQ,eAAe,UAAU;AACxD,YAAI,KAAM,gBAAe,KAAK,YAAY,KAAK,KAAK,QAAQ,WAAW,MAAM,IAAI;AAAA,MACnF;AAAA,IACF,CAAC;AACD,QAAI,CAAC,KAAM,MAAK,eAAe,MAAM;AACnC,YAAM,IAAI,KAAK,KAAK,QAAQ;AAC5B,UAAI,CAAC,EAAG,QAAO,MAAM;AAAA,MAAC;AACtB,YAAM,OAAO,YAAY,CAAC;AAC1B,aAAO,aAAa,OAAO,KAAK,UAAU,MAAM;AAAA,MAAC;AAAA,IACnD,GAAG;AACH,SAAK,cAAc,KAAK,KAAK,UAAU,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC;AAC7D,SAAK,OAAO,IAAI,EAAE,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,WAAW,CAAC;AAC9D,SAAK,WAAW,SAAS,KAAK,MAAM;AACpC,QAAI,MAAM;AACR,WAAK,OAAO;AACZ,WAAK,KAAK,YAAY,KAAK,KAAK,QAAQ,SAAS,MAAM,YAAY;AACnE,WAAK,OAAO,aAAa,iBAAiB,KAAK,KAAK,QAAQ,cAAc,GAAG,KAAK,SAAS,WAAW;AAAA,IACxG;AACA,QAAI,KAAK,KAAK,OAAQ,MAAK,KAAK,KAAK,KAAK,QAAQ,MAAM;AACxD,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,MAAc,QAAuB;AACnC,SAAK,YAAY;AACjB,QAAI,KAAK,UAAW,OAAM,KAAK,KAAK,QAAQ,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAClE,UAAM,KAAK,KAAK,QAAQ;AACxB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,KAAK,OAAQ,eAAc,KAAK,MAAM;AAC1C,UAAM,KAAK,MAAM;AACjB,SAAK,IAAI,KAAK;AACd,SAAK,OAAO,CAAC;AAAA,EACf;AAAA;AAAA,EAIQ,IAAI,GAAc;AACxB,SAAK,WAAW,SAAS,CAAC;AAC1B,SAAK,IAAI,cAAc;AAAA,EACzB;AAAA,EAEA,KAAK,MAAc,OAAa,QAAQ;AACtC,SAAK,IAAI,IAAI,KAAK,KAAK,GAAG,MAAM,IAAI,CAAC;AAAA,EACvC;AAAA,EAEQ,SAAS;AACf,UAAM,UAAU,oBAAI,IAAqB;AACzC,eAAW,KAAK,KAAK,KAAK,QAAQ,UAA6E;AAC7G,UAAI,EAAE,SAAS,gBAAgB,EAAE,WAAY,SAAQ,IAAI,EAAE,YAAY,QAAQ,EAAE,OAAO,CAAC;AAAA,IAC3F;AACA,eAAW,KAAK,KAAK,KAAK,QAAQ,UAAuD;AACvF,UAAI,EAAE,SAAS,OAAQ,MAAK,WAAW,SAAS,IAAI,SAAS,KAAK,GAAG,YAAY,EAAE,OAAO,CAAC,CAAC;AAC5F,UAAI,EAAE,SAAS,eAAe,CAAC,MAAM,QAAQ,EAAE,OAAO,EAAG;AACzD,iBAAW,QAAQ,EAAE,SAAoH;AACvI,YAAI,KAAK,SAAS,UAAU,KAAK,MAAM,KAAK,GAAG;AAC7C,gBAAM,OAAO,IAAI,cAAc,KAAK,CAAC;AACrC,eAAK,OAAO,KAAK,IAAI;AACrB,eAAK,WAAW,SAAS,IAAI;AAAA,QAC/B;AACA,YAAI,KAAK,SAAS,YAAY;AAC5B,gBAAM,MAAM,IAAI,QAAQ,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,KAAK,MAAM,KAAK,QAAQ,QAAQ,SAAS,KAAK,QAAQ,KAAK,QAAQ,IAAI,KAAK,aAAa,CAAC,CAAC,EAAE,CAAC;AAC5I,cAAI,OAAO,EAAE,SAAS,QAAQ,IAAI,KAAK,MAAM,EAAE,KAAK,OAAO,SAAS,GAAG,CAAC;AACxE,eAAK,WAAW,SAAS,GAAG;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,QAAQ,MAAc,MAAuC;AACnE,QAAI,SAAS,OAAQ,QAAO,OAAO,KAAK,WAAW,EAAE;AACrD,QAAI,OAAO,KAAK,SAAS,UAAU;AACjC,YAAM,MAAMC,UAAS,UAAU,KAAK,EAAE,QAAQ,GAAG,UAAU,eAAe,KAAK,MAAM,KAAK,EAAE,QAAQ,CAAC,CAAC;AACtG,aAAO,IAAI,WAAW,IAAI,KAAKC,YAAW,GAAG,IAAI,KAAK,OAAO;AAAA,IAC/D;AACA,WAAO,KAAK,UAAU,IAAI;AAAA,EAC5B;AAAA;AAAA,EAIQ,QAAQ,GAAc;AAC5B,YAAQ,EAAE,MAAM;AAAA,MACd,KAAK;AACH,YAAI,CAAC,KAAK,aAAa;AACrB,eAAK,cAAc,IAAI,cAAc,KAAK,CAAC;AAC3C,eAAK,WAAW,SAAS,KAAK,WAAW;AAAA,QAC3C;AACA,aAAK,YAAY,OAAO,EAAE,KAAK;AAC/B;AAAA,MACF,KAAK,cAAc;AACjB,aAAK,cAAc;AACnB,cAAM,MAAM,IAAI,QAAQ,KAAK,GAAG,EAAE,KAAK,EAAE,KAAK,KAAK,MAAM,EAAE,MAAM,SAAS,KAAK,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACxG,aAAK,KAAK,IAAI,EAAE,IAAI,EAAE,KAAK,SAAS,KAAK,IAAI,EAAE,CAAC;AAChD,aAAK,WAAW,SAAS,GAAG;AAC5B;AAAA,MACF;AAAA,MACA,KAAK,YAAY;AACf,cAAM,IAAI,KAAK,KAAK,IAAI,EAAE,EAAE;AAC5B,WAAG,IAAI,OAAO,EAAE,SAAS,EAAE,SAAS,SAAS,EAAE,SAAS,QAAQ,EAAE,OAAO,CAAC;AAC1E,YAAI,EAAG,MAAK,eAAe,EAAE;AAC7B,aAAK,KAAK,OAAO,EAAE,EAAE;AACrB,aAAK,cAAc;AACnB;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,QAAQ,oBAAI,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,EAAE,QAAQ,CAAC;AACpD,mBAAW,KAAK,KAAK,OAAQ,KAAI,CAAC,MAAM,IAAI,EAAE,IAAI,EAAG,MAAK,WAAW,SAAS,IAAI,SAAS,KAAK,GAAG,EAAE,IAAI,CAAC;AAC1G,aAAK,SAAS,KAAK,OAAO,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE,IAAI,CAAC;AACzD,aAAK,MAAM,IAAI,KAAK,MAAM;AAC1B,YAAI,MAAM,KAAM,MAAK,cAAc;AACnC;AAAA,MACF;AAAA,MACA,KAAK;AACH,aAAK,YAAY;AACjB,aAAK,cAAc;AACnB,aAAK,cAAc;AACnB;AAAA,MACF,KAAK;AACH,aAAK,KAAK,UAAK,EAAE,OAAO,IAAI,KAAK;AACjC;AAAA,MACF,KAAK;AACH,aAAK,KAAK,EAAE,UAAU,UAAU,sDAAiD,EAAE,QAAQ,6BAAwB,EAAE,KAAK,KAAK,wFAAwF,EAAE,QAAQ,QAAQ,MAAM;AAC/O;AAAA,MACF,KAAK;AACH,aAAK,KAAK,aAAa,EAAE,OAAO,IAAI,EAAE,GAAG,MAAM,EAAE,KAAK,IAAI,MAAM;AAChE;AAAA,MACF;AACE;AAAA,IACJ;AACA,SAAK,IAAI,cAAc;AAAA,EACzB;AAAA,EAEQ,OAAO;AACb,UAAM,MAAM,KAAK,IAAI;AACrB,eAAW,EAAE,KAAK,QAAQ,KAAK,KAAK,KAAK,OAAO,EAAG,KAAI,WAAW,MAAM,OAAO;AAC/E,QAAI,KAAK,KAAK,KAAM,MAAK,IAAI,cAAc;AAAA,EAC7C;AAAA,EAEQ,gBAAgB;AACtB,QAAI,CAAC,KAAK,KAAM;AAChB,UAAM,QAAQ,KAAK,KAAK,QAAQ,gBAAgB;AAChD,UAAM,QAAQ,KAAK,KAAK,QAAQ,gBAAgB;AAChD,SAAK,OAAO,IAAI,EAAE,MAAM,KAAK,MAAM,QAAQ,MAAM,OAAO,OAAO,MAAM,MAAM,MAAM,gBAAgB,OAAO,WAAW,MAAM,WAAW,KAAK,UAAU,CAAC;AACpJ,SAAK,IAAI,cAAc;AAAA,EACzB;AAAA;AAAA,EAIA,MAAc,OAAO,KAAa;AAChC,SAAK,MAAM,QAAQ,EAAE;AACrB,SAAK,SAAS;AACd,UAAM,SAAS,MAAM,KAAK,QAAQ;AAClC,QAAI,OAAO,SAAS,WAAW;AAC7B,WAAK,KAAK,GAAG,OAAO,IAAI,mCAAmC,OAAO,YAAY,KAAK,MAAM,CAAC,KAAK,MAAM;AACrG;AAAA,IACF;AACA,QAAI,OAAO,SAAS,WAAW;AAC7B,UAAI;AACF,cAAM,OAAO,KAAK,IAAI,MAAM,OAAO,IAAI;AAAA,MACzC,SAAS,KAAK;AACZ,aAAK,KAAK,UAAM,IAAc,OAAO,IAAI,KAAK;AAAA,MAChD;AACA;AAAA,IACF;AACA,QAAI,CAAC,OAAO,KAAM;AAClB,SAAK,WAAW;AAChB,QAAI,KAAK,WAAW;AAClB,WAAK,OAAO,KAAK,EAAE,MAAM,SAAS,MAAM,OAAO,KAAK,CAAC;AACrD,WAAK,MAAM,IAAI,KAAK,MAAM;AAC1B,YAAM,KAAK,KAAK,QAAQ,MAAM,OAAO,IAAI;AACzC,WAAK,IAAI,cAAc;AACvB;AAAA,IACF;AACA,SAAK,UAAU,OAAO,IAAI;AAAA,EAC5B;AAAA,EAEQ,UAAU,MAAc;AAC9B,SAAK,IAAI,IAAI,SAAS,KAAK,GAAG,IAAI,CAAC;AACnC,SAAK,cAAc;AACnB,SAAK,YAAY;AACjB,SAAK,cAAc;AACnB,UAAM,WAAW,KAAK,WAAW,GAAG,IAAI;AAAA;AAAA;AAAA,EAA4D,KAAK,QAAQ,KAAK;AACtH,SAAK,WAAW;AAChB,SAAK,KAAK,QAAQ,OAAO,QAAQ,EAAE,MAAM,CAAC,QAAiB;AACzD,WAAK,YAAY;AACjB,WAAK,KAAK,UAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,IAAI,KAAK;AACxE,WAAK,cAAc;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,YAAY;AACxB,UAAM,SAAS,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI;AAC5C,SAAK,SAAS,CAAC;AACf,SAAK,MAAM,IAAI,CAAC,CAAC;AACjB,SAAK,KAAK,QAAQ,WAAW;AAC7B,QAAI,KAAK,QAAS,MAAK,OAAO,EAAE,SAAS,OAAO,QAAQ,6BAA6B,CAAC;AACtF,UAAM,KAAK,KAAK,QAAQ,MAAM,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC9C,QAAI,KAAK,YAAa,MAAK,YAAY,QAAQ,gBAAgB;AAAA,QAC1D,MAAK,KAAK,gBAAgB;AAC/B,SAAK,cAAc;AACnB,eAAW,EAAE,IAAI,KAAK,KAAK,KAAK,OAAO,EAAG,KAAI,OAAO,EAAE,SAAS,MAAM,SAAS,UAAU,CAAC;AAC1F,SAAK,KAAK,MAAM;AAChB,SAAK,YAAY;AACjB,QAAI,OAAO,OAAQ,MAAK,MAAM,QAAQ,OAAO,KAAK,IAAI,CAAC;AACvD,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,MAAM,MAAiD;AAC7D,UAAM,UAAU,EAAE,SAAS,KAAK;AAChC,QAAI,WAAW,MAAM,QAAQ,GAAG;AAC9B,UAAI,KAAK,UAAW,MAAK,KAAK,UAAU;AAAA,eAC/B,KAAK,IAAI,IAAI,KAAK,YAAY,IAAM,MAAK,KAAK,KAAK;AAAA,WACvD;AACH,aAAK,YAAY,KAAK,IAAI;AAC1B,aAAK,KAAK,6BAA6B;AAAA,MACzC;AACA,aAAO;AAAA,IACT;AACA,QAAI,KAAK,aAAa;AACpB,UAAI,WAAW,MAAM,OAAO,GAAG;AAC7B,kBAAU,KAAK,EAAE,UAAU,KAAK,MAAM,MAAM,KAAK,EAAE,GAAG;AACtD,aAAK,QAAQ,eAAe,KAAK,EAAE,UAAU,KAAK,EAAE,GAAG;AACvD,aAAK,eAAe;AACpB,aAAK,eAAe,kEAAkE;AAAA,MACxF,WAAW,SAAS,IAAK,MAAK,eAAe,6FAA6F;AAAA,eACjI,SAAS,IAAK,MAAK,KAAK,kBAAkBC,SAAQ,KAAK,EAAE,UAAU,qBAAqB,CAAC,EAAE;AACpG,aAAO;AAAA,IACT;AACA,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,YAAY,IAAI;AAC5B,WAAK,IAAI,cAAc;AACvB,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS;AAChB,YAAM,EAAE,MAAAC,MAAK,IAAI,KAAK;AACtB,UAAI,WAAW,MAAM,KAAK,GAAG;AAC3B,QAAAA,MAAK,WAAW,CAACA,MAAK,OAAO;AAC7B,aAAK,IAAI,cAAc;AACvB,eAAO;AAAA,MACT;AACA,UAAIA,MAAK,SAAS;AAChB,YAAI,SAAS,IAAK,MAAK,OAAO,EAAE,SAAS,KAAK,CAAC;AAAA,iBACtC,SAAS,IAAK,MAAK,OAAO,EAAE,SAAS,MAAM,CAAC;AAAA,iBAC5C,SAAS,OAAOA,MAAK,IAAI,MAAO,MAAK,OAAO,EAAE,SAAS,MAAM,QAAQ,KAAK,CAAC;AAAA,iBAC3E,SAAS,IAAK,CAAAA,MAAK,OAAO;AAAA,iBAC1B,CAAC,WAAW,MAAM,QAAQ,KAAK,CAAC,WAAW,MAAM,WAAW,EAAG,QAAO;AAC/E,YAAI,CAAC,WAAW,MAAM,QAAQ,KAAK,CAAC,WAAW,MAAM,WAAW,GAAG;AACjE,eAAK,IAAI,cAAc;AACvB,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,QAAI,WAAW,MAAM,QAAQ,GAAG;AAC9B,WAAK,cAAc,OAAO;AAC1B,WAAK,IAAI,cAAc;AACvB,aAAO;AAAA,IACT;AACA,QAAI,KAAK,SAAS,SAAS,QAAQ;AACjC,UAAI,WAAW,MAAM,IAAI,GAAG;AAAE,aAAK,KAAK,KAAK,IAAI,CAAC;AAAG,aAAK,IAAI,cAAc;AAAG,eAAO;AAAA,MAAS;AAC/F,UAAI,WAAW,MAAM,MAAM,GAAG;AAAE,aAAK,KAAK,KAAK,GAAG,CAAC;AAAG,aAAK,IAAI,cAAc;AAAG,eAAO;AAAA,MAAS;AAChG,UAAI,WAAW,MAAM,KAAK,GAAG;AAC3B,cAAM,MAAM,KAAK,KAAK,SAAS;AAC/B,YAAI,IAAK,MAAK,MAAM,QAAQ,GAAG,IAAI,IAAI,GAAG;AAC1C,aAAK,WAAW;AAChB,eAAO;AAAA,MACT;AACA,UAAI,WAAW,MAAM,OAAO,GAAG;AAC7B,cAAM,MAAM,KAAK,KAAK,SAAS;AAC/B,cAAM,QAAQ,KAAK,MAAM,QAAQ,EAAE,KAAK;AACxC,YAAI,OAAO,CAAC,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,GAAG;AAClD,eAAK,KAAK,OAAO,IAAI,IAAI;AACzB,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF;AACA,QAAI,WAAW,MAAM,QAAQ,GAAG;AAC9B,UAAI,KAAK,WAAW;AAAE,aAAK,KAAK,UAAU;AAAG,eAAO;AAAA,MAAS;AAC7D,UAAI,KAAK,UAAU,SAAS,QAAQ;AAAE,aAAK,WAAW;AAAG,eAAO;AAAA,MAAS;AACzE,UAAI,KAAK,SAAS,SAAS,QAAQ;AAAE,aAAK,MAAM,QAAQ,EAAE;AAAG,aAAK,SAAS;AAAG,eAAO;AAAA,MAAS;AAAA,IAChG;AACA,QAAI,WAAW,MAAM,WAAW,GAAG;AACjC,WAAK,UAAU;AACf,aAAO;AAAA,IACT;AACA,QAAI,WAAW,MAAM,WAAW,KAAK,KAAK,WAAW;AACnD,YAAM,OAAO,KAAK,MAAM,QAAQ,EAAE,KAAK;AACvC,UAAI,MAAM;AACR,aAAK,MAAM,QAAQ,EAAE;AACrB,aAAK,OAAO,KAAK,EAAE,MAAM,QAAQ,KAAK,CAAC;AACvC,aAAK,MAAM,IAAI,KAAK,MAAM;AAC1B,aAAK,KAAK,KAAK,QAAQ,SAAS,IAAI;AACpC,aAAK,IAAI,cAAc;AAAA,MACzB;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,mBAAmB;AACzB,UAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,WAAW,MAAM,GAAG,EAAE,CAAC,KAAK,KAAK,KAAK,YAAY,QAAQ,YAAY,EAAE,IAAI;AACjH,SAAK,KAAK,UAAU,WAAW,UAAU,EAAE,UAAU,OAAO,SAAS,KAAK,KAAK,CAAC,CAAC;AAAA,EACnF;AAAA,EAEQ,aAAa;AACnB,UAAM,OAAO,KAAK,MAAM,QAAQ;AAChC,QAAI,UAAU,KAAK,IAAI,GAAG;AACxB,WAAK,KAAK,OAAO,IAAI;AACrB,UAAI,CAAC,KAAK,SAAS,SAAS,OAAQ,MAAK,SAAS,SAAS,KAAK,IAAI;AAAA,IACtE,MAAO,MAAK,SAAS;AACrB,SAAK,IAAI,cAAc;AAAA,EACzB;AAAA,EAEQ,WAAW;AACjB,SAAK,SAAS,MAAM;AAAA,EACtB;AAAA;AAAA,EAIA,IAAI,KAAsB,QAA+C;AACvE,WAAO,IAAI,QAAQ,CAAC,kBAAkB;AACpC,YAAMA,QAAO,IAAI,aAAa,KAAK,GAAG,GAAG;AACzC,WAAK,UAAU,EAAE,MAAAA,OAAM,SAAS,cAAc;AAC9C,YAAM,MAAM,KAAK,KAAK,IAAI,IAAI,EAAE;AAChC,UAAI,KAAK;AACP,YAAI,IAAI,WAAW,IAAI;AACvB,QAAAA,MAAK,WAAW;AAAA,MAClB;AACA,WAAK,aAAa,MAAM;AACxB,WAAK,aAAa,SAASA,KAAI;AAC/B,UAAI,IAAI,SAAS,QAAS,MAAK,EAAE,SAAS,MAAM,MAAM;AACtD,cAAQ,iBAAiB,SAAS,MAAM;AAAE,YAAI,KAAK,SAAS,SAASA,MAAM,MAAK,OAAO,EAAE,SAAS,MAAM,CAAC;AAAA,MAAG,GAAG,EAAE,MAAM,KAAK,CAAC;AAC7H,WAAK,IAAI,cAAc;AAAA,IACzB,CAAC;AAAA,EACH;AAAA,EAEQ,OAAO,GAAmB;AAChC,UAAM,IAAI,KAAK;AACf,QAAI,CAAC,EAAG;AACR,SAAK,UAAU;AACf,SAAK,aAAa,MAAM;AACxB,UAAM,UAAU,KAAK,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE;AAC3C,QAAI,SAAS;AACX,cAAQ,IAAI,WAAW,KAAK;AAC5B,cAAQ,UAAU,KAAK,IAAI;AAAA,IAC7B;AAEA,UAAM,OAAO,GAAG,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,KAAK,IAAI,OAAO,GAAG,KAAK;AAC9D,QAAI,CAAC,EAAE,KAAK,SAAU,MAAK,KAAK,EAAE,UAAU,YAAY,IAAI,GAAG,EAAE,SAAS,iBAAc,EAAE,KAAK,YAAY,IAAI,IAAI,EAAE,UAAU,SAAS,MAAM;AAC9I,MAAE,QAAQ,CAAC;AACX,SAAK,IAAI,cAAc;AAAA,EACzB;AAAA;AAAA,EAIQ,UAAU,GAAc,SAAkB;AAChD,SAAK,UAAU,MAAM;AACrB,SAAK,UAAU,SAAS,CAAC;AACzB,SAAK,WAAW;AAChB,SAAK,IAAI,cAAc;AAAA,EACzB;AAAA,EAEQ,aAAa;AACnB,QAAI,KAAK,OAAQ,MAAK,SAAS;AAC/B,SAAK,UAAU,MAAM;AACrB,SAAK,IAAI,cAAc;AAAA,EACzB;AAAA,EAEQ,eAAe,SAAiB;AACtC,SAAK,cAAc;AACnB,SAAK,UAAU,MAAM;AACrB,SAAK,KAAK,OAAO;AAAA,EACnB;AAAA,EAEQ,WAAW,OAAsE,UAAmC,UAAmB;AAC7I,QAAI,CAAC,MAAM,QAAQ;AACjB,WAAK,KAAK,2BAA2B;AACrC;AAAA,IACF;AACA,UAAM,OAAO,IAAI,WAAW,OAAO,IAAI,YAAY,KAAK,CAAC,EAAE,UAAU;AACrE,SAAK,WAAW,CAAC,SAAS;AAAE,WAAK,WAAW;AAAG,eAAS,KAAK,KAAK;AAAA,IAAG;AACrE,SAAK,WAAW,MAAM,KAAK,WAAW;AACtC,SAAK,SAAS;AACd,SAAK,UAAU,MAAM;AACrB,SAAK,UAAU,SAAS,IAAI;AAC5B,QAAI,SAAU,MAAK,UAAU,SAAS,IAAI,KAAK,KAAK,GAAG,QAAQ,CAAC;AAChE,SAAK,IAAI,cAAc;AAAA,EACzB;AAAA,EAEA,YAAkB;AAChB,UAAM,QAAQ,KAAK,KAAK,QAAQ,gBAAgB;AAChD,UAAM,QAAQ,KAAK,KAAK,QAAQ,gBAAgB;AAChD,UAAM,UAAU,KAAK,KAAK,QAAQ,eAAe,UAAU,GAAG;AAC9D,UAAM,YAAY,UAAU,KAAK,IAAI,IAAI,IAAI,KAAK,OAAO,EAAE,QAAQ,IAAI;AACvE,UAAM,QAAQ,IAAI,WAAW,KAAK,GAAG;AAAA,MACnC,OAAO,KAAK,KAAK;AAAA,MACjB,QAAQ,EAAE,OAAO,MAAM,OAAO,OAAO,QAAQ,MAAM,OAAO,QAAQ,WAAW,MAAM,OAAO,WAAW,OAAO,MAAM,OAAO,MAAM;AAAA,MAC/H,gBAAgB,OAAO,WAAW;AAAA,MAClC,eAAe,OAAO,iBAAiB;AAAA,MACvC,MAAM,MAAM;AAAA,MACZ,OAAO,MAAM;AAAA,MACb,WAAW,MAAM;AAAA,MACjB;AAAA,IACF,CAAC;AACD,SAAK,UAAU,OAAO,UAAU,aAAa,MAAM,OAAO,KAAK,CAAC,aAAa,MAAM,KAAK,QAAQ,CAAC,CAAC,aAAa,OAAO,WAAW,SAAS,IAAI;AAAA,EAChJ;AAAA,EAEA,gBAAgB,MAAoB;AAClC,UAAM,SAAS,kBAAkB,KAAK,KAAK,KAAK,CAAC;AACjD,QAAI,QAAQ;AACV,YAAM,OAAO,OAAO,CAAC,EAAG,KAAK;AAC7B,UAAI,gBAAgB,KAAK,EAAE,UAAU,IAAI,GAAG;AAC1C,aAAK,eAAe;AACpB,aAAK,KAAK,WAAW,IAAI,iCAAiC;AAAA,MAC5D,MAAO,MAAK,KAAK,GAAG,IAAI,4FAA4F,MAAM;AAC1H;AAAA,IACF;AACA,UAAM,IAAI,EAAE,MAAM,KAAK,MAAM,OAAO,KAAK,SAAS,MAAM,OAAO,MAAM,KAAK,SAAS,MAAM,MAAM,SAAS,KAAK,SAAS,QAAQ,MAAM;AACpI,SAAK,UAAU,IAAI,iBAAiB,KAAK,GAAG,CAAC,GAAG,mBAAmB,KAAK,IAAI,YAAY,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,MAAM,WAAW,EAAE,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,MAAM,GAAG;AAAA,EACrM;AAAA,EAEA,WAAiB;AACf,UAAM,EAAE,EAAE,IAAI;AACd,UAAM,QAAQ;AAAA,MACZ,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,UAAU,CAAC,CAAC;AAAA,MACpC,GAAG,SAAS,IAAI,CAAC,MAAM,MAAM,EAAE,GAAG,UAAU,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,WAAW,CAAC,EAAE;AAAA,MAC9F;AAAA,MACA,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,MAAM,CAAC,CAAC;AAAA,MAChC,MAAM,EAAE,GAAG,UAAU,SAAI,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,uCAAuC,CAAC;AAAA,MAC5F,MAAM,EAAE,GAAG,UAAU,eAAK,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,6CAA6C,CAAC;AAAA,MACnG,MAAM,EAAE,GAAG,UAAU,MAAM,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,gBAAgB,CAAC;AAAA,MACvE,MAAM,EAAE,GAAG,UAAU,eAAK,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,8CAAoC,CAAC;AAAA,MAC1F,MAAM,EAAE,GAAG,UAAU,MAAM,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,iEAAiE,CAAC;AAAA,MACxH,MAAM,EAAE,GAAG,UAAU,SAAS,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,+CAA+C,CAAC;AAAA,MACzG,MAAM,EAAE,GAAG,UAAU,eAAY,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,QAAQ,MAAM,CAAC;AAAA,IACrE;AACA,SAAK,UAAU,IAAI,MAAM,KAAK,CAAC;AAAA,EACjC;AAAA,EAEA,MAAM,aAA4B;AAChC,UAAM,WAAW,MAAM,aAAa,KAAK,EAAE,UAAU,KAAK,UAAU;AACpE,UAAM,UAAU,KAAK,KAAK,QAAQ;AAClC,SAAK;AAAA,MACH,SAAS,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,EAAE,QAAQ,WAAW,aAAa,GAAG,IAAI,KAAK,EAAE,SAAS,EAAE,eAAe,CAAC,SAAM,EAAE,QAAQ,YAAY,EAAE;AAAA,MACxL,CAAC,SAAS,KAAK,KAAK,cAAc,IAAI;AAAA,IACxC;AAAA,EACF;AAAA,EAEQ,eAAe;AACrB,WAAO,KAAK,KAAK,QAAQ,0BAA0B,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,OAAO,EAAE,KAAK,MAAM,IAAI,EAAE,CAAC,KAAK,GAAG,EAAE;AAAA,EAC9I;AAAA;AAAA,EAGQ,aAAa,SAAiB;AACpC,UAAM,SAAS,KAAK,KAAK,QAAQ,eAAe,UAAU;AAC1D,UAAM,KAAK,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,OAAO;AACnD,WAAO,KAAK,IAAI,CAAC,IAAI,eAAe,KAAK,YAAY,KAAK,KAAK,QAAQ,WAAW,OAAO,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,EACrH;AAAA,EAEQ,aAAa,OAA0C;AAC7D,QAAI,CAAC,MAAM,OAAQ;AACnB,UAAM,QAAQ,MAAM,IAAI,CAAC,MAAM,KAAK,QAAQ,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACrE,SAAK;AAAA,MACH;AAAA,QACE,EAAE,OAAO,OAAO,OAAO,WAAW,MAAM,MAAM,QAAQ,MAAM,WAAW,IAAI,KAAK,GAAG,IAAI,aAAa,MAAM,KAAK,IAAI,EAAE;AAAA,QACrH,EAAE,OAAO,MAAM,OAAO,yBAAyB;AAAA,MACjD;AAAA,MACA,CAAC,MAAM;AACL,YAAI,MAAM,MAAO;AACjB,gBAAQ,KAAK;AACb,aAAK,KAAK,YAAY,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MAC1C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,aAA4B;AAChC,SAAK,WAAW,KAAK,aAAa,GAAG,CAAC,YAAY,KAAK,KAAK,SAAS,OAAO,GAAG,iDAAiD;AAAA,EAClI;AAAA,EAEA,MAAc,SAAS,SAAiB;AACtC,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,UAAM,SAAS,MAAM,KAAK,KAAK,QAAQ,aAAa,OAAO;AAC3D,SAAK,WAAW,MAAM;AACtB,SAAK,MAAM;AACX,SAAK,WAAW,SAAS,KAAK,MAAM;AACpC,SAAK,OAAO;AACZ,SAAK,KAAK,+DAA+D;AACzE,SAAK,MAAM,QAAQ,OAAO,cAAc,EAAE;AAC1C,SAAK,aAAa,KAAK;AACvB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAM,WAA0B;AAC9B,SAAK,WAAW,KAAK,aAAa,GAAG,CAAC,YAAY,KAAK,KAAK,OAAO,OAAO,GAAG,4EAA4E;AAAA,EAC3J;AAAA,EAEA,MAAc,OAAO,SAAiB;AACpC,UAAM,KAAK,KAAK,KAAK,QAAQ;AAC7B,UAAM,QAAQ,GAAG,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AAC1D,UAAM,OAAO,YAAY,OAAO,SAAS,OAAO;AAChD,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,UAAM,OAAO,OAAO,WAAW,GAAG,sBAAsB,MAAM,QAAQ,IAAI;AAC1E,UAAM,KAAK,cAAc,IAAI;AAC7B,SAAK,KAAK,uDAAuD;AACjE,SAAK,MAAM,QAAQ,IAAI;AACvB,SAAK,aAAa,KAAK;AAAA,EACzB;AAAA,EAEA,MAAc,cAAc,MAA0B;AACpD,UAAM,SAAS,OAAO,WAAW,IAAI,IAAI;AACzC,QAAI,QAAQ;AACV,WAAK,KAAK,iDAAiD,MAAM,oDAAoD,MAAM;AAC3H;AAAA,IACF;AACA,UAAM,KAAK,MAAM;AACjB,SAAK,WAAW,MAAM;AACtB,SAAK,MAAM;AACX,QAAI;AACF,YAAM,KAAK,KAAK,MAAM,MAAS;AAAA,IACjC,SAAS,KAAK;AACZ,WAAK,KAAK,UAAM,IAAc,OAAO,IAAI,KAAK;AAC9C,YAAM,KAAK,KAAK,QAAW,MAAS;AAAA,IACtC;AACA,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAM,UAAyB;AAC7B,UAAM,KAAK,KAAK,QAAQ,QAAQ;AAChC,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAM,SAAS,KAA4B;AACzC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,KAAK;AACR,YAAM,SAAS,QAAQ,UAAU,EAAE,OAAO,CAAC,MAAM,OAAO,EAAE,UAAU,QAAQ,GAAG,KAAK,EAAE,aAAa,KAAK,KAAK,QAAQ,OAAO,QAAQ;AACpI,WAAK,WAAW,OAAO,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,IAAI,EAAE,EAAE,IAAI,OAAO,GAAG,EAAE,QAAQ,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,KAAK,KAAK,SAAS,CAAC,CAAC;AACrI;AAAA,IACF;AACA,QAAI;AACF,YAAM,EAAE,OAAO,MAAM,IAAI,UAAU,SAAS,EAAE,WAAW,KAAK,KAAK,QAAQ,IAAI,CAAC;AAChF,YAAM,KAAK,KAAK,QAAQ,SAAS,KAAK;AACtC,WAAK,KAAK,aAAa;AACvB,WAAK,OAAO,IAAI,EAAE,KAAK,KAAK,KAAK,OAAO,MAAM,CAAC;AAC/C,WAAK,iBAAiB;AACtB,WAAK,KAAK,SAAS,KAAK,EAAE;AAAA,IAC5B,SAAS,KAAK;AACZ,WAAK,KAAK,UAAM,IAAc,OAAO,IAAI,KAAK;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,QAAQ,KAAmB;AACzB,UAAM,IAAI,IAAI,KAAK;AACnB,QAAI,CAAC,CAAC,OAAO,QAAQ,MAAM,EAAE,SAAS,CAAC,GAAG;AACxC,WAAK,KAAK,WAAW,KAAK,IAAI,4CAA4C;AAC1E;AAAA,IACF;AACA,SAAK,OAAO;AACZ,eAAW,KAAK,KAAK,QAAQ,gBAAgB,CAAC;AAC9C,QAAI,MAAM,UAAU,CAAC,KAAK,eAAe;AACvC,WAAK,gBAAgB;AACrB,WAAK,KAAK,oHAAoH,MAAM;AAAA,IACtI;AACA,SAAK,iBAAiB;AACtB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,YAAY;AAClB,SAAK,QAAQ,KAAK,SAAS,QAAQ,SAAS,KAAK,SAAS,SAAS,SAAS,KAAK;AAAA,EACnF;AAAA,EAEA,OAAO,MAAoB;AACzB,QAAI,CAAC,MAAM;AACT,WAAK,KAAK,wBAAwB;AAClC;AAAA,IACF;AACA,UAAM,MAAMD,SAAQ,KAAK,EAAE,UAAU,IAAI;AACzC,QAAI,CAACE,YAAW,GAAG,KAAK,CAACC,UAAS,GAAG,EAAE,YAAY,GAAG;AACpD,WAAK,KAAK,UAAK,GAAG,wBAAwB,KAAK;AAC/C;AAAA,IACF;AACA,SAAK,UAAU,KAAK,GAAG;AACvB,SAAK,KAAK,qBAAqB,GAAG,oBAAoB;AAAA,EACxD;AAAA,EAEA,iBAAiB;AACf,SAAK,WAAW,aAAa,KAAK,EAAE,UAAU,EAAE,SAAS,KAAK,MAAM,SAAS,KAAK,KAAK,EAAE,IAAI,CAAC;AAAA,EAChG;AACF;AAGA,eAAsB,OAAO,GAAmC;AAC9D,QAAM,MAAM,IAAI,IAAI,CAAC;AACrB,MAAI;AACF,UAAM,IAAI,MAAM;AAAA,EAClB,SAAS,KAAK;AACZ,QAAI,IAAI,KAAK;AACb,UAAM;AAAA,EACR;AACA,SAAO,IAAI;AACb;;;AenzBA,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB,SAAS,uBAAsC;;;ACF/C,SAAS,oBAA+D;AACxE,SAAS,aAAa,uBAAuB;AAQ7C,IAAM,OAAO,CAAC,GAAW,MACvB,OAAO,WAAW,CAAC,MAAM,OAAO,WAAW,CAAC,KAAK,gBAAgB,OAAO,KAAK,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC;AAEjG,eAAe,SAAS,SAAoD;AAC1E,MAAI,SAAS;AACb,QAAM,SAAmB,CAAC;AAC1B,mBAAiB,SAAS,SAAS;AACjC,cAAU,MAAM;AAChB,QAAI,SAAS,MAAO,OAAM,MAAM,WAAW;AAC3C,WAAO,KAAK,KAAK;AAAA,EACnB;AACA,SAAO,IAAI,gBAAgB,OAAO,OAAO,MAAM,EAAE,SAAS,CAAC;AAC7D;AAOA,eAAsB,mBAAmB,SAKd;AACzB,QAAM,YAAY,IAAI,IAAI,QAAQ,YAAY;AAC9C,MAAI,UAAU,aAAa,YAAY,EAAE,UAAU,aAAa,WAAW,CAAC,aAAa,WAAW,EAAE,SAAS,UAAU,QAAQ;AAC/H,UAAM,MAAM,wEAAwE;AACtF,MAAI,UAAU,YAAY,UAAU,SAAU,OAAM,MAAM,2CAA2C;AACrG,MAAI,QAAQ,QAAQ,QAAS,OAAM,MAAM,oBAAoB;AAC7D,QAAM,QAAQ,YAAY,EAAE,EAAE,SAAS,KAAK;AAC5C,MAAI,OAAO;AACX,MAAI;AACJ,QAAM,SAAS,IAAI,QAAuB,CAACC,WAAS,WAAW;AAAE,aAAS,EAAE,SAAAA,WAAS,OAAO;AAAA,EAAG,CAAC;AAEhG,QAAM,OAAO,CAAC,UAA0B,QAAgB,OAAe,WAAmB;AACxF,aAAS,UAAU,QAAQ;AAAA,MACzB,gBAAgB;AAAA,MAChB,2BAA2B;AAAA,IAC7B,CAAC;AACD,aAAS,IAAI,WAAW,OAAO,MAAM,CAAC;AAAA,EACxC;AACA,QAAM,SAAS,aAAa,OAAO,SAAS,aAAa;AACvD,aAAS,UAAU,iBAAiB,UAAU;AAC9C,aAAS,UAAU,mBAAmB,aAAa;AACnD,aAAS,UAAU,0BAA0B,SAAS;AACtD,QAAI,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,WAAW,UAAU,QAAQ,QAAQ,eAC7E,QAAQ,QAAQ,WAAW,UAAa,QAAQ,QAAQ,WAAW,UAAU,QAAQ,QAAQ,WAAW,UAAU,QAAS;AAC9H,WAAK,UAAU,KAAK,8CAA8C,wCAAwC;AAC1G;AAAA,IACF;AACA,QAAI;AACJ,QAAI;AAAE,aAAO,MAAM,SAAS,OAAO;AAAA,IAAG,QAChC;AAAE,WAAK,UAAU,KAAK,mBAAmB,wCAAwC;AAAG;AAAA,IAAQ;AAClG,QAAI,CAAC,KAAK,KAAK,IAAI,OAAO,KAAK,IAAI,KAAK,GAAG;AACzC,WAAK,UAAU,KAAK,8CAA8C,wCAAwC;AAC1G;AAAA,IACF;AACA,QAAI,KAAK,IAAI,OAAO,GAAG;AACrB,WAAK,UAAU,KAAK,sBAAsB,6CAA6C;AACvF,aAAO,MAAM,uCAAuC,CAAC;AACrD;AAAA,IACF;AACA,UAAMC,OAAM,KAAK,IAAI,KAAK,KAAK;AAC/B,QAAI,CAAC,2BAA2B,KAAKA,IAAG,GAAG;AACzC,WAAK,UAAU,KAAK,mBAAmB,sDAAsD;AAC7F,aAAO,MAAM,uCAAuC,CAAC;AACrD;AAAA,IACF;AACA,SAAK,UAAU,KAAK,qBAAqB,kDAAkD;AAC3F,WAAO,QAAW,EAAE,KAAAA,MAAK,OAAO,KAAK,IAAI,OAAO,KAAK,QAAW,cAAc,KAAK,IAAI,cAAc,KAAK,OAAU,CAAC;AAAA,EACvH,CAAC;AACD,SAAO,iBAAiB;AACxB,SAAO,iBAAiB;AAExB,QAAM,QAAQ,WAAW,MAAM,OAAO,MAAM,oCAAoC,CAAC,GAAG,GAAM;AAC1F,QAAM,QAAQ,MAAM,OAAO,MAAM,oBAAoB,CAAC;AACtD,WAAS,OAAO,OAAeC,QAAuB;AACpD,QAAI,CAAC,OAAQ;AACb,UAAM,EAAE,SAAAF,WAAS,OAAO,IAAI;AAC5B,aAAS;AACT,iBAAa,KAAK;AAClB,YAAQ,QAAQ,oBAAoB,SAAS,KAAK;AAElD,eAAW,MAAM;AAAE,aAAO,MAAM;AAAG,aAAO,oBAAoB;AAAA,IAAG,GAAG,GAAG,EAAE,MAAM;AAC/E,QAAI,MAAO,QAAO,KAAK;AAAA,QAAQ,CAAAA,UAAQE,MAAM;AAAA,EAC/C;AACA,QAAM,IAAI,QAAc,CAACF,WAAS,WAAW;AAC3C,WAAO,KAAK,SAAS,MAAM;AAC3B,WAAO,OAAO,GAAG,aAAaA,SAAO;AAAA,EACvC,CAAC;AACD,QAAM,UAAU,OAAO,QAAQ;AAC/B,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAAE,WAAO,MAAM,2BAA2B,CAAC;AAAG,WAAO;AAAA,EAAQ;AAC1G,SAAO,aAAa,QAAQ,IAAI;AAChC,UAAQ,QAAQ,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAC/D,QAAM,MAAM,IAAI,IAAI,aAAa,SAAS;AAC1C,MAAI,SAAS,IAAI,gBAAgB,EAAE,MAAM,OAAO,QAAQ,IAAI,GAAG,OAAO,QAAQ,QAAQ,OAAO,CAAC,EAAE,SAAS;AACzG,UAAQ,MAAM,IAAI,SAAS,CAAC;AAC5B,SAAO;AACT;AAEA,SAAS,WAAW,OAAe,QAAwB;AACzD,QAAM,SAAS,CAAC,SAAiB,KAAK,QAAQ,WAAW,CAAC,MAAM,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG;AACvF,SAAO,wIAAwI,OAAO,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+DAO/F,OAAO,KAAK,CAAC,WAAW,OAAO,MAAM,CAAC;AACrG;;;ACnHO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C,YACW,QACT,SACA;AACA,UAAM,QAAQ,MAAM,KAAK,OAAO,EAAE;AAHzB;AAAA,EAIX;AAAA,EAJW;AAKb;AACO,IAAM,iBAAN,MAAqB;AAAA,EAE1B,YAA6B,SAAgC;AAAhC;AAC3B,SAAK,OAAO,IAAI,IAAI,QAAQ,MAAM;AAClC,QACE,CAAC,CAAC,SAAS,QAAQ,EAAE,SAAS,KAAK,KAAK,QAAQ,KAChD,KAAK,KAAK,YACV,KAAK,KAAK,YACV,KAAK,KAAK,UACV,KAAK,KAAK,QACT,KAAK,KAAK,aAAa,WACtB,CAAC,CAAC,aAAa,aAAa,OAAO,EAAE,SAAS,KAAK,KAAK,QAAQ;AAElE,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,EACJ;AAAA,EAd6B;AAAA,EADZ;AAAA,EAgBjB,IAAI,YAAoB;AAAE,WAAO,KAAK,KAAK;AAAA,EAAQ;AAAA,EACnD,MAAM,QAAW,MAAc,OAAoB,CAAC,GAAe;AACjE,UAAM,WAAW,MAAM,KAAK,gBAAgB,MAAM,MAAM,kBAAkB;AAC1E,QAAI,SAAS,WAAW,IAAK,QAAO;AACpC,WAAQ,MAAM,SAAS,KAAK;AAAA,EAC9B;AAAA,EACA,MAAM,cAAc,MAAc,OAAoB,CAAC,GAAsB;AAC3E,WAAO,KAAK,gBAAgB,MAAM,MAAM,mBAAmB;AAAA,EAC7D;AAAA,EACA,MAAc,gBAAgB,MAAc,MAAmB,QAAmC;AAChG,UAAM,UAAU,mBAAmB,KAAK,MAAM,GAAG,EAAE,CAAC,CAAE;AACtD,QACE,CAAC,QAAQ,WAAW,MAAM,KAC1B,QAAQ,SAAS,IAAI,KACrB,QAAQ,MAAM,GAAG,EAAE,KAAK,CAAC,MAAM,MAAM,QAAQ,MAAM,GAAG,KACtD,eAAe,KAAK,OAAO,KAC3B,eAAe,KAAK,KAAK,MAAM,GAAG,EAAE,CAAC,CAAE,KACvC,WAAW,KAAK,KAAK,MAAM,GAAG,EAAE,CAAC,CAAE;AAEnC,YAAM,IAAI,MAAM,kBAAkB;AACpC,UAAM,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI;AACnC,QAAI,IAAI,WAAW,KAAK,KAAK,UAAU,CAAC,IAAI,SAAS,WAAW,MAAM;AACpE,YAAM,IAAI,MAAM,kBAAkB;AACpC,SAAK,QAAQ,eAAe;AAC5B,UAAM,SAAS,KAAK;AACpB,UAAM,QAAQ,SACV,MAAM,IAAI,QAAgB,CAACG,WAAS,WAAW;AAC7C,YAAM,SAAS,MAAM;AACnB,eAAO,oBAAoB,SAAS,MAAM;AAC1C;AAAA,UACE,OAAO,UACL,IAAI,aAAa,wBAAwB,YAAY;AAAA,QACzD;AAAA,MACF;AACA,aAAO,iBAAiB,SAAS,QAAQ,EAAE,MAAM,KAAK,CAAC;AACvD,WAAK,QAAQ,QAAQ,EAClB,KAAK,MAAM,KAAK,QAAQ,SAAS,CAAC,EAClC;AAAA,QACC,CAAC,UAAU;AACT,iBAAO,oBAAoB,SAAS,MAAM;AAC1C,UAAAA,UAAQ,KAAK;AAAA,QACf;AAAA,QACA,CAAC,UAAU;AACT,iBAAO,oBAAoB,SAAS,MAAM;AAC1C,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IACJ,CAAC,IACD,MAAM,KAAK,QAAQ,SAAS;AAChC,SAAK,QAAQ,eAAe;AAC5B,QAAI,CAAC,MAAO,OAAM,IAAI,kBAAkB,KAAK,yBAAyB;AACtE,UAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AACxC,QAAI,CAAC,QAAQ,IAAI,eAAe;AAC9B,cAAQ,IAAI,iBAAiB,UAAU,KAAK,EAAE;AAChD,YAAQ,IAAI,UAAU,MAAM;AAC5B,QAAI,KAAK,QAAQ,CAAC,QAAQ,IAAI,cAAc;AAC1C,cAAQ,IAAI,gBAAgB,kBAAkB;AAChD,QAAI;AACJ,QAAI;AACF,iBAAW,OAAO,KAAK,QAAQ,SAAS,OAAO,KAAK;AAAA,QAClD,GAAG;AAAA,QACH;AAAA,QACA,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,QAAQ;AACN,UAAI,KAAK,QAAQ;AACf,cACE,KAAK,OAAO,UACZ,IAAI,aAAa,wBAAwB,YAAY;AAEzD,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,SAAS,UAAU,OAAO,SAAS,SAAS;AAC9C,YAAM,IAAI,MAAM,sBAAsB;AACxC,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,SAAS;AACb,UAAI;AACF,cAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,iBACE,OAAO,KAAK,WAAW,WACnB,KAAK,SACL,KAAK,UAAU,KAAK,UAAU,MAAM;AAAA,MAC5C,QAAQ;AAAA,MAAC;AACT,YAAM,IAAI;AAAA,QACR,SAAS;AAAA,QACT,CAAC,OAAO,QAAQ,IAAI,eAAe,GAAG,QAAQ,YAAY,EAAE,KAAK,EAAE,EAChE,OAAO,OAAO,EACd;AAAA,UACC,CAAC,OAAO,WAAW,MAAM,MAAM,MAAM,EAAE,KAAK,cAAc;AAAA,UAC1D;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;AC/HA;AAAA,EAGE,iBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,oBAAAC;AAAA,OACK;AACP,SAAS,SAAAC,cAAa;;;ACPtB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,OAAO,UAAU,SAAS,YAAY;AAC/C,SAAS,YAAAC,WAAU,QAAAC,OAAM,WAAAC,gBAAe;AAYjC,SAAS,aAAa,OAAwB;AACnD,QAAM,OACJ,OAAO,UAAU,WACb,QACC,KAAK,UAAU,OAAO,MAAM,CAAC,KAAK,OAAO,KAAK;AACrD,SAAO,KACJ,QAAQ,kCAAkC,EAAE,EAC5C,QAAQ,4BAA4B,EAAE,EACtC,QAAQ,kCAAkC,EAAE;AACjD;AACO,SAAS,kBAAkB,MAAsB;AACtD,MACE,CAAC,QACD,KAAK,SAAS,OACd,KAAK,SAAS,IAAI,KAClB,KAAK,WAAW,GAAG,KACnB,KACG,MAAM,GAAG,EACT,KAAK,CAAC,MAAM,CAAC,KAAK,MAAM,OAAO,MAAM,QAAQ,EAAE,WAAW,GAAG,CAAC,KACjE,cAAc,KAAK,IAAI;AAEvB,UAAM,MAAM,gCAAgC;AAC9C,SAAO;AACT;AACA,eAAsB,eACpB,aACA,SACe;AACf,QAAM,OAAO,MAAM,KAAKC,SAAQ,WAAW,GAAG,MAAM,GAAK;AACzD,MAAI;AACF,UAAM,KAAK,UAAU,OAAO;AAAA,EAC9B,UAAE;AACA,UAAM,KAAK,MAAM;AAAA,EACnB;AACF;AACA,eAAsB,YAAY,MAA8B;AAC9D,QAAMC,QAAOD,SAAQ,IAAI;AACzB,QAAME,QAAO,MAAM,MAAMD,KAAI;AAC7B,MAAIC,MAAK,eAAe;AACtB,UAAM,MAAM,sCAAsC;AACpD,QAAM,QAAgC,CAAC;AACvC,MAAI,QAAQ;AACZ,iBAAeC,MAAK,MAAcC,OAAc;AAC9C,sBAAkBA,KAAI;AACtB,UAAM,OAAO,MAAM,MAAM,IAAI;AAC7B,QAAI,KAAK,eAAe,KAAK,CAAC,KAAK,OAAO;AACxC,YAAM,MAAM,mCAAmC;AACjD,QAAI,KAAK,OAAO,IAAS,OAAM,MAAM,oBAAoB;AACzD,UAAM,QAAQ,MAAM,SAAS,MAAM,MAAM;AACzC,aAAS,OAAO,WAAW,KAAK;AAChC,QAAI,QAAQ,OAAW,OAAO,KAAK,KAAK,EAAE,UAAU;AAClD,YAAM,MAAM,wCAAwC;AACtD,UAAMA,KAAI,IAAI;AAAA,EAChB;AACA,iBAAe,KAAK,KAAa,SAAS,IAAI;AAC5C,eAAW,SAAS,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC/D,YAAMA,QAAO,SAAS,MAAM;AAC5B,wBAAkBA,KAAI;AACtB,UAAI,MAAM,eAAe;AACvB,cAAM,MAAM,sCAAsC;AACpD,UAAI,MAAM,YAAY,EAAG,OAAM,KAAKC,MAAK,KAAK,MAAM,IAAI,GAAGD,QAAO,GAAG;AAAA,UAChE,OAAMD,MAAKE,MAAK,KAAK,MAAM,IAAI,GAAGD,KAAI;AAAA,IAC7C;AAAA,EACF;AACA,MAAIF,MAAK,YAAY,EAAG,OAAM,KAAKD,KAAI;AAAA,OAClC;AACH,QAAIK,UAASL,KAAI,MAAM;AACrB,YAAM,MAAM,wCAAwC;AACtD,UAAME,MAAKF,OAAM,UAAU;AAAA,EAC7B;AACA,QAAM,SAAS,MAAM,UAAU,KAAK;AACpC,QAAM,OAAO,2CAA2C,KAAK,MAAM,IAAI,CAAC;AACxE,MACG,CAAC,OAAO,WAAW,OAAO,KAAK,CAAC,OAAO,WAAW,SAAS,KAC5D,CAAC,QACD,KAAK,SAAS,MACd,CAAC,sBAAsB,KAAK,MAAM;AAElC,UAAM,MAAM,iDAAiD;AAC/D,SAAO,EAAE,MAAM,OAAO,SAAS,KAAK;AACtC;AAEO,SAAS,oBAAoB,OAAuB;AACzD,QAAMM,aAAY,MACf,KAAK,EACL,YAAY,EACZ,QAAQ,WAAW,GAAG;AACzB,MAAI,CAAC,eAAe,KAAKA,UAAS,KAAKA,WAAU,SAAS;AACxD,UAAM,MAAM,yBAAyB;AACvC,SAAOA;AACT;AACO,IAAM,kBAAN,MAAsB;AAAA,EAS3B,YACW,QACTC,OACA;AAFS;AAGT,SAAK,QAAQA,UAAS,SAAY,SAAY,oBAAoBA,KAAI;AAAA,EACxE;AAAA,EAJW;AAAA,EATX;AAAA,EACA,SAAwB,CAAC;AAAA,EACzB,SAAS;AAAA,EACT,aAAa;AAAA,EACb,aAAa;AAAA,EACJ,UAAU,oBAAI,IAAoD;AAAA,EACnE;AAAA,EACA;AAAA,EAOR,IAAI,OAAO;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EACA,IAAI,OAAO;AACT,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EACA,IAAI,OAAO;AACT,WAAO,CAAC,WAAW,UAAU,UAAU,EAAE;AAAA,MACvC,KAAK,QAAQ,UAAU;AAAA,IACzB;AAAA,EACF;AAAA,EACQ,KAAK,KAAK,KAAK,MAAM;AAC3B,QAAI,CAAC,GAAI,OAAM,MAAM,oCAAoC;AACzD,WAAO,mBAAmB,mBAAmB,EAAE,CAAC;AAAA,EAClD;AAAA,EACA,MAAM,KAAK,SAAS,IAAI;AACtB,UAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MAC/B,kBAAkB,KAAK,QAAQ,WAAW,mBAAmB,KAAK,KAAK,IAAI,EAAE;AAAA,IAC/E;AACA,WAAO,OAAO,MAAM;AAAA,MAClB,CAAC,MACC,EAAE,KAAK,YAAY,EAAE,SAAS,OAAO,YAAY,CAAC,KAClD,EAAE,GAAG,SAAS,MAAM;AAAA,IACxB;AAAA,EACF;AAAA,EACA,QAAQA,OAAe;AACrB,SAAK,QAAQA,UAAS,SAAY,SAAY,oBAAoBA,KAAI;AACtE,SAAK;AACL,SAAK,SAAS;AACd,SAAK,SAAS,CAAC;AACf,SAAK,SAAS;AACd,SAAK,aAAa;AAAA,EACpB;AAAA,EACA,MAAM,KAAK,IAAY;AACrB,UAAM,MAAM,EAAE,KAAK;AACnB,SAAK,SAAS;AACd,SAAK,SAAS,CAAC;AACf,SAAK,SAAS;AACd,SAAK,aAAa;AAClB,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,OAAO,QAAoB,KAAK,KAAK,EAAE,CAAC;AAClE,UAAI,QAAQ,KAAK,WAAY;AAC7B,UAAI,KAAK,SAAS,OAAO,SAAS,KAAK;AACrC,cAAM,MAAM,kCAAkC;AAChD,WAAK,SAAS;AAAA,IAChB,SAAS,OAAO;AACd,UAAI,QAAQ,KAAK,WAAY,MAAK,aAAa;AAC/C,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,OAAO,OAAO,YAAY;AAC9B,UAAM,MAAM,KAAK;AACjB,UAAM,OAAO,MAAM,KAAK,OAAO,QAAc,mBAAmB;AAAA,MAC9D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,MAAM,MAAM,KAAK,SAAS,KAAK,CAAC;AAAA,IACzD,CAAC;AACD,QAAI,QAAQ,KAAK,WAAY,OAAM,KAAK,KAAK,KAAK,EAAE;AACpD,WAAO;AAAA,EACT;AAAA,EACA,MAAM,UAAU;AACd,UAAM,MAAM,KAAK,YACf,KAAK,KAAK;AACZ,QAAI,CAAC,GAAI;AACT,UAAM,SAAS,MAAM,KAAK,OAAO,QAAoB,KAAK,KAAK,EAAE,CAAC;AAClE,QAAI,QAAQ,KAAK,WAAY,MAAK,SAAS;AAAA,EAC7C;AAAA,EACA,MAAM,OAAO,MAAc;AACzB,QAAI,CAAC,KAAK,KAAK,KAAK,KAAK,SAAS;AAChC,YAAM,MAAM,oCAA+B;AAC7C,UAAM,MAAM,KAAK;AACjB,UAAM,UAAU,MAAM,KAAK,OAAO,QAAc,KAAK,KAAK,GAAG;AAAA,MAC3D,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,IAC/B,CAAC;AACD,QAAI,QAAQ,KAAK,cAAc,KAAK;AAClC,WAAK,SAAS,EAAE,GAAG,KAAK,QAAQ,GAAG,QAAQ;AAAA,EAC/C;AAAA,EACA,MAAM,KAAK,MAAc,SAAkB;AACzC,UAAM,MAAM,KAAK;AACjB,UAAM,OAAO,MAAM,KAAK,OAAO,QAAc,KAAK,KAAK,IAAI,SAAS;AAAA,MAClE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA,GAAI,YAAY,SAAY,CAAC,IAAI,EAAE,QAAQ;AAAA,MAC7C,CAAC;AAAA,IACH,CAAC;AACD,QAAI,QAAQ,KAAK,WAAY,OAAM,KAAK,KAAK,KAAK,EAAE;AACpD,WAAO;AAAA,EACT;AAAA,EACA,OAAsB;AACpB,QAAI,KAAK,aAAc,QAAO,KAAK;AACnC,UAAM,UAAU,KAAK,SAAS;AAC9B,SAAK,eAAe;AACpB,SAAK,QACF,QAAQ,MAAM;AACb,UAAI,KAAK,iBAAiB,QAAS,MAAK,eAAe;AAAA,IACzD,CAAC,EACA,MAAM,MAAM;AAAA,IAAC,CAAC;AACjB,WAAO;AAAA,EACT;AAAA,EACA,MAAc,WAAW;AACvB,QAAI,CAAC,KAAK,KAAM;AAChB,UAAM,MAAM,KAAK,YACf,KAAK,KAAK;AACZ,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,OAAO;AAAA,QAC7B,KAAK,KAAK,EAAE,IAAI,iBAAiB,KAAK,MAAM;AAAA,MAC9C;AACA,UAAI,QAAQ,KAAK,WAAY;AAC7B,YAAM,OAAO,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC;AAClD,iBAAW,KAAK,KAAK,QAAQ;AAC3B,YAAI,CAAC,OAAO,cAAc,EAAE,GAAG,KAAK,EAAE,OAAO;AAC3C,gBAAM,MAAM,sBAAsB;AACpC,YAAI,CAAC,KAAK,IAAI,EAAE,GAAG,GAAG;AACpB,eAAK,OAAO,KAAK,CAAC;AAClB,eAAK,IAAI,EAAE,GAAG;AACd,cAAI,EAAE,SAAS,YAAY,KAAK;AAC9B,iBAAK,OAAO,SAAS,OAAO,EAAE,KAAK,MAAM;AAAA,QAC7C;AAAA,MACF;AACA,WAAK,OAAO,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG;AACxC,UAAI,CAAC,OAAO,cAAc,KAAK,MAAM,KAAK,KAAK,SAAS,KAAK;AAC3D,cAAM,MAAM,sBAAsB;AACpC,WAAK,SAAS,KAAK;AACnB,WAAK,aAAa;AAAA,IACpB,SAAS,OAAO;AACd,UAAI,QAAQ,KAAK;AACf,aAAK,aACH,iBAAiB,qBACjB,CAAC,KAAK,GAAG,EAAE,SAAS,MAAM,MAAM,IAC5B,4BACA;AACR,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,MAAM,KACJ,MACA,OAAO,IACP,UAAmC,CAAC,GACpC;AACA,QACE,CAAC,UAAU,SAAS,aAAa,OAAO,EAAE,SAAS,IAAI,KACvD,CAAC,KAAK,KAAK;AAEX,YAAM,MAAM,4BAA4B;AAC1C,QAAI,KAAK,SAAS,IAAQ,OAAM,MAAM,mCAAmC;AACzE,UAAM,OAAO,KAAK;AAClB,SAAK,KAAK,IAAI;AACd,UAAM,MAAM,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE;AAAA,MACrC,CAAC,MACC,EAAE,SAAS,QACX,EAAE,KAAK,SAAS,QAChB,EAAE,KAAK,SAAS,QAChB,KAAK,UAAU,EAAE,KAAK,OAAO,MAAM,KAAK,UAAU,OAAO;AAAA,IAC7D;AACA,UAAM,UAAU,OAAO;AAAA,MACrB;AAAA,MACA,MAAM,EAAE,YAAYC,YAAW,GAAG,MAAM,MAAM,QAAQ;AAAA,IACxD;AACA,SAAK,QAAQ,IAAI,QAAQ,KAAK,YAAY,OAAO;AACjD,WAAO,KAAK,QAAQ,OAAO;AAAA,EAC7B;AAAA,EACA,MAAc,QAAQ,SAAiD;AACrE,UAAM,SAAS,MAAM,KAAK,OAAO;AAAA,MAC/B,KAAK,KAAK,QAAQ,IAAI,IAAI;AAAA,MAC1B,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,QAAQ,IAAI,EAAE;AAAA,IACvD;AACA,SAAK,QAAQ,OAAO,QAAQ,KAAK,UAAU;AAC3C,QAAI,KAAK,QAAQ,OAAO,QAAQ,MAAM;AACpC,UAAI,QAAQ,KAAK,SAAS,OAAQ,MAAK,OAAO,SAAS;AAAA,eAErD,CAAC,CAAC,UAAU,WAAW,QAAQ,EAAE,SAAS,QAAQ,KAAK,IAAI,KAC3D,CAAC,QAAQ,UAAU,SAAS,EAAE,SAAS,KAAK,OAAO,MAAM;AAEzD,aAAK,OAAO,SAAS;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAM,IAAa;AACvB,UAAM,WAAW,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EAAE;AAAA,MAC1C,CAAC,MAAM,EAAE,SAAS,KAAK;AAAA,IACzB;AACA,UAAM,UAAU,KAAK,KAAK,QAAQ,IAAI,EAAE,IAAI,SAAS,GAAG,EAAE;AAC1D,QAAI,CAAC,WAAW,QAAQ,SAAS,KAAK;AACpC,YAAM,MAAM,mCAAmC;AACjD,WAAO,KAAK,QAAQ,OAAO;AAAA,EAC7B;AAAA,EACA,MAAM,UAAU,IAAY,MAAc;AACxC,UAAM,MAAM,KAAK;AACjB,UAAM,KAAK,QAAQ;AACnB,QAAI,QAAQ,KAAK,WAAY,OAAM,MAAM,gCAAgC;AACzE,UAAM,OAAO,KAAK,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC1D,QAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,MAAM,EAAE,SAAS,KAAK,MAAM;AACrD,YAAM,MAAM,yCAAyC;AACvD,QAAI,CAAC,KAAK,KAAK,EAAG,OAAM,MAAM,wBAAwB;AACtD,UAAM,KAAK,KAAK,UAAU,EAAE;AAC5B,QAAI,QAAQ,KAAK;AACf,YAAM;AAAA,QACJ;AAAA,MACF;AACF,UAAM,KAAK,KAAK,KAAK,MAAqB,MAAM,KAAK,OAAO;AAC5D,UAAM,KAAK,QAAQ;AAAA,EACrB;AAAA,EACA,MAAM,MAAM,OAAc;AACxB,UAAM,MAAM,KAAK,YACf,KAAK,KAAK;AACZ,UAAM,KAAK,OAAO,QAAQ,KAAK,KAAK,EAAE,IAAI,WAAW;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU;AAAA,QACnB,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM;AAAA,QACb,SAAS,MAAM;AAAA,MACjB,CAAC;AAAA,IACH,CAAC;AACD,QAAI,QAAQ,KAAK,YAAY;AAC3B,YAAM,KAAK,QAAQ;AACnB,YAAM,KAAK,KAAK,QAAQ;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,MAAM,SAAS;AACb,UAAM,MAAM,KAAK;AACjB,UAAM,KAAK;AACX,QAAI,QAAQ,KAAK,WAAY,OAAM,MAAM,4BAA4B;AACrE,UAAM,KAAK,QAAQ;AACnB,OAAG;AACD,YAAM,SAAS,KAAK,OAAO;AAC3B,YAAM,KAAK,KAAK;AAChB,UAAI,QAAQ,KAAK,WAAY,OAAM,MAAM,4BAA4B;AACrE,UAAI,KAAK,OAAO,SAAS,SAAS,IAAK;AAAA,IACzC,SAAS;AACT,QAAI,QAAQ,KAAK,WAAY,OAAM,MAAM,4BAA4B;AACrE,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM,KAAK,QAAQ;AAAA,MACnB,OAAO,KAAK,QAAQ;AAAA,MACpB,QAAQ,KAAK,QAAQ;AAAA,MACrB,QAAQ,KAAK,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,IACtD;AAAA,EACF;AACF;;;AC/VA,IAAM,MAAM,CAAC,MAAgB,OAAO,MAAM,YAAY,IAAI,IAAI;AAE9D,SAAS,cAAc,MAA+B,WAA0D;AAC9G,QAAM,KAAK,IAAI,KAAK,WAAW;AAC/B,QAAM,OAAO,IAAI,KAAK,IAAI;AAC1B,QAAM,SAAS,IAAI,KAAK,MAAM;AAC9B,MAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAQ,QAAO;AACpC,QAAM,OAAO,UAAU,IAAI,EAAE;AAC7B,QAAM,MAAM,OAAO,KAAK,YAAY,YAAY,OAAO,SAAS,KAAK,OAAO,IAAI,KAAK,UAAU,MAAM;AACrG,QAAM,QAAQ,IAAI,KAAK,KAAK,KAAK,MAAM;AACvC,YAAU,IAAI,IAAI,EAAE,MAAM,QAAQ,GAAI,QAAQ,SAAY,CAAC,IAAI,EAAE,SAAS,IAAI,GAAI,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG,CAAC;AAC/G,MAAI,WAAW,aAAa,CAAC,KAAM,QAAO,YAAY,IAAI,WAAW,QAAQ,OAAO,KAAK,KAAK,EAAE,GAAG,QAAQ,SAAY,KAAK,UAAU,IAAI,QAAQ,CAAC,CAAC,EAAE;AACtJ,SAAO,MAAM,WAAW,SAAS,SAAY,YAAY,IAAI,IAAI,MAAM;AACzE;AAEO,SAAS,kBACd,OACA,OACA,SACA,YAAuC,oBAAI,IAAI,GACzC;AACN,QAAM,OAAO,MAAM;AACnB,MAAI,MAAM,SAAS,YAAY;AAC7B,UAAMC,QAAO,cAAc,MAAM,SAAS;AAC1C,QAAIA,MAAM,OAAM,KAAK,IAAI,MAAM,GAAG,KAAK,aAAaA,KAAI,CAAC,IAAI,EAAE;AAC/D;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,cAAe;AAClC,MAAI,MAAM,SAAS,WAAW,MAAM,SAAS,aAAa;AACxD,QAAI,CAAC,KAAK,KAAM;AAChB,UAAM,KAAK,OAAO,KAAK,cAAc,SAAS;AAC9C,QAAI,QAAQ,QAAQ,IAAI,EAAE;AAC1B,QAAI,UAAU,QAAW;AACvB,cAAQ,MAAM;AACd,YAAM,KAAK,IAAI,EAAE;AACjB,cAAQ,IAAI,IAAI,KAAK;AAAA,IACvB;AACA,UAAM,KAAK,IACT,IAAI,MAAM,GAAG,cAAc,MAAM,SAAS,UAAU,oBAAiB,EAAE;AACzE,UAAM,QAAQ,CAAC,IACb,MAAM,SAAS,WACV,MAAM,QAAQ,CAAC,KAAK,MAAM,aAAa,KAAK,QAAQ,EAAE,IACvD,aAAa,KAAK,QAAQ,EAAE;AAClC,QAAI,MAAM,SAAS,YAAa,SAAQ,OAAO,EAAE;AACjD;AAAA,EACF;AACA,QAAM,MAAM,IAAI,KAAK,WAAW;AAChC,QAAM,MAAM,MAAM,UAAU,IAAI,GAAG,GAAG,QAAQ,MAAM;AACpD,QAAM;AAAA,IACJ,IAAI,MAAM,GAAG,KAAK,MAAM,aAAa,GAAG,IAAI,aAAQ,EAAE,GAAG,aAAa,MAAM,IAAI,CAAC,GAAG,KAAK,OAAO,MAAM,aAAa,KAAK,IAAI,IAAI,EAAE;AAAA,IAClI,aAAa,KAAK,QAAQ,IAAI;AAAA,EAChC;AACF;;;AFlBO,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,eAAN,MAAwC;AAAA,EAGtC,YACmB,UACA,QACjB;AAFiB;AACA;AAAA,EAChB;AAAA,EAFgB;AAAA,EACA;AAAA,EAJnB,SAAS;AAAA,EACT,QAAkB,CAAC;AAAA,EAKnB,aAAa;AAAA,EAAC;AAAA,EACd,OAAO,OAAe;AACpB,UAAM,QAAQ,KAAK,MAAM;AAAA,MAAQ,CAAC,MAChCC,kBAAiB,aAAa,CAAC,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC;AAAA,IACtD;AACA,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,SAAS,OAAO,CAAC;AAChD,UAAM,MAAM,KAAK,IAAI,GAAG,MAAM,SAAS,KAAK,MAAM;AAClD,WAAO;AAAA,MACL,aAAa,KAAK,OAAO,CAAC;AAAA,MAC1B;AAAA,MACA,GAAG,MAAM,MAAM,KAAK,IAAI,GAAG,MAAM,KAAK,GAAG,GAAG;AAAA,MAC5C,KAAK,SAAS,6DAAwD;AAAA,IACxE;AAAA,EACF;AACF;AACA,eAAsB,aACpB,SACiB;AACjB,QAAM,YAAY,IAAI,gBAAgB,QAAQ,QAAQ,QAAQ,IAAI;AAClE,QAAM,MAAM,QAAQ,OAAO,QAAQ;AACnC,QAAM,MAAM,IAAIC,eAAc,QAAQ,QAAQ;AAC9C,QAAM,QAAQ,IAAI;AAAA,IAChB;AAAA,IACA,YAAY,EAAE,YAAY,iBAAiB,GAAG,GAAG,MAAM,UAAU,GAAG,EAAE,CAAC;AAAA,EACzE;AACA,QAAM,SAAS,IAAI;AAAA,IACjB,QAAQ;AAAA,IACR,MACE,eAAY,UAAU,QAAQ,WAAW,SAAM,UAAU,QAAQ,QAAQ,gBAAgB,IAAI,UAAU,QAAQ,EAAE,SAAM,UAAU,QAAQ,UAAU,MAAM,SAAM,UAAU,UAAU;AAAA,EACvL;AACA,MAAI,OAAO,OACT,SAAiC,MAAM;AAAA,EAAC,GACxC,OACA,WAAW,GACX,iBAAiB,IACjB,YAAY;AACd,QAAM,SAAS,IAAI,QAAgB,CAACC,cAAa,SAASA,SAAQ;AAClE,QAAM,UAAU,oBAAI,IAAoB;AACxC,QAAM,YAAY,oBAAI,IAA0B;AAChD,MAAI;AACJ,MAAI;AAGJ,WAAS,KAAK,OAAe,OAAgB;AAC3C,WAAO,MAAM,KAAK,GAAG,KAAK,KAAK,aAAa,KAAK,CAAC;AAClD,QAAI,cAAc;AAAA,EACpB;AACA,WAAS,SAAS;AAChB,QAAI,mBAAmB,UAAU,YAAY;AAC3C,uBAAiB,UAAU;AAC3B,kBAAY;AACZ,aAAO,QAAQ,CAAC;AAChB,aAAO,SAAS;AAChB,cAAQ,MAAM;AACd,gBAAU,MAAM;AAAA,IAClB;AACA,eAAW,SAAS,UAAU,OAAO,MAAM,SAAS;AAClD,wBAAkB,OAAO,OAAO,OAAO,SAAS,SAAS;AAC3D,gBAAY,UAAU,OAAO;AAC7B,QAAI,cAAc;AAAA,EACpB;AACA,WAAS,OAAO;AACd,oBAAgB,MAAM;AACtB,QAAI,KAAM;AACV,WAAO;AACP,QAAI,MAAO,cAAa,KAAK;AAC7B,cAAU,QAAQ,UAAU,IAAI;AAChC,QAAI,KAAK;AACT,WAAO,CAAC;AAAA,EACV;AACA,iBAAe,OAAO;AACpB,QAAI,KAAM;AACV,QAAI;AACF,YAAM,UAAU,KAAK;AACrB,UAAI,UAAU,KAAM,OAAM,UAAU,QAAQ;AAC5C,iBAAW;AACX,aAAO;AAAA,IACT,SAAS,GAAG;AACV;AACA,UAAI,aAAa,KAAK,aAAa;AACjC,aAAK,cAAc,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAC/D,UAAI,aAAa,qBAAqB,CAAC,KAAK,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG;AACnE,mBAAW;AAAA,MACb;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,WAAW;AACtB,cAAQ;AAAA,QACN,MAAM,KAAK,KAAK;AAAA,QAChB,KAAK,IAAI,KAAO,MAAM,KAAK,QAAQ;AAAA,MACrC;AAAA,aACO,CAAC;AACR;AAAA,QACE;AAAA,QACA;AAAA,MACF;AAAA,EACJ;AACA,WAAS,YAAY;AACnB,eAAW;AACX,QAAI,MAAO,cAAa,KAAK;AAC7B,SAAK,KAAK;AAAA,EACZ;AACA,WAAS,WAAW,OAA2B,SAAyB;AACtE,QAAI,CAAC,OAAO,KAAK,EAAG,OAAM,MAAM,OAAO;AACvC,WAAO;AAAA,EACT;AACA,iBAAe,QAAQ,KAAa;AAClC,UAAM,OAAO,IAAI,KAAK;AACtB,QAAI,CAAC,KAAM;AACX,QAAI,SAAS,WAAW,SAAS,SAAS;AACxC,WAAK;AACL;AAAA,IACF;AACA,QAAI,CAAC,KAAK,WAAW,GAAG,GAAG;AACzB,YAAM,QAAQ,KAAK,WAAW,GAAG;AACjC,YAAM,OAAO,QAAQ,UAAU,UAAU,OAAO,UAAU;AAC1D,YAAM,UAAU,QAAQ,KAAK,QAAQ,QAAQ,EAAE,EAAE,KAAK,IAAI;AAC1D,YAAM,iBAAiB,QACnB,EAAE,oBAAoB,KAAK,WAAW,IAAI,EAAE,IAC5C,CAAC;AACL,YAAM,QAAQ;AACd,UACE,SACA,MAAM,QAAQ,QACd,MAAM,SAAS,UAAU,QACzB,UAAU,QAAQ,IAAI,MAAM,UAAU,GACtC;AACA,cAAM,UAAU,MAAM,MAAM,UAAU;AAAA,MACxC,OAAO;AACL,YAAI;AACF,gBAAM,UAAU,KAAK,MAAM,SAAS,cAAc;AAAA,QACpD,SAAS,OAAO;AACd,gBAAM,UAAU,CAAC,GAAG,UAAU,QAAQ,OAAO,CAAC,EAAE;AAAA,YAC9C,CAAC,MACC,EAAE,SAAS,UAAU,QACrB,EAAE,KAAK,SAAS,QAChB,EAAE,KAAK,SAAS,WAChB,KAAK,UAAU,EAAE,KAAK,OAAO,MAAM,KAAK,UAAU,cAAc;AAAA,UACpE;AACA,cAAI;AACF,gCAAoB;AAAA,cAClB,KAAK;AAAA,cACL,MAAM,QAAQ;AAAA,cACd,YAAY,QAAQ,KAAK;AAAA,YAC3B;AACF,gBAAM;AAAA,QACR;AAAA,MACF;AACA,0BAAoB;AACpB,WAAK,YAAY,QAAQ,yBAAyB,IAAI;AACtD;AAAA,IACF;AACA,UAAM,QAAQ,6BAA6B,KAAK,IAAI;AACpD,UAAM,MAAM,MAAM,CAAC,GACjB,OAAO,MAAM,CAAC,KAAK;AACrB,UAAM,SAASC,OAAM,IAAI;AACzB,QAAI,OAAO,KAAK,CAAC,MAAM,OAAO,MAAM,QAAQ;AAC1C,YAAM;AAAA,QACJ;AAAA,MACF;AACF,UAAM,OAAO;AACb,QAAI,QAAQ,qBAAqB;AAC/B,uBAAiB,IAAI,gBAAgB;AACrC,UAAI;AACF,cAAM,UAAU,MAAM,QAAQ,oBAAoB,MAAM;AAAA,UACtD,QAAQ,QAAQ;AAAA,UAChB,MAAM,UAAU;AAAA,UAChB;AAAA,UACA,QAAQ,eAAe;AAAA,QACzB,CAAC;AACD,uBAAe,OAAO,eAAe;AACrC,YAAI,QAAS;AAAA,MACf,UAAE;AACA,yBAAiB;AAAA,MACnB;AAAA,IACF;AACA,YAAQ,KAAK;AAAA,MACX,KAAK;AACH,aAAK,YAAY,gBAAgB,KAAK,IAAI,CAAC;AAC3C;AAAA,MACF,KAAK;AACH,kBAAU;AACV;AAAA,MACF,KAAK;AACH,aAAK,SAAS,MAAM,QAAQ,OAAO,QAAQ,WAAW,CAAC;AACvD;AAAA,MACF,KAAK;AACH,YAAI,KAAK,CAAC,MAAM,UAAU;AACxB,gBAAMC,QAAO,MAAM,QAAQ,OAAO;AAAA,YAChC;AAAA,YACA;AAAA,cACE,QAAQ;AAAA,cACR,MAAM,KAAK,UAAU;AAAA,gBACnB,MAAM,WAAW,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,GAAG,iBAAiB;AAAA,cAC7D,CAAC;AAAA,YACH;AAAA,UACF;AACA,oBAAU,QAAQA,MAAK,IAAI;AAAA,QAC7B,OAAO;AACL,gBAAM,QAAQ,WAAW,MAAM,6BAA6B;AAC5D,gBAAM,OAAO,UAAU,QAAQ,QAAQ,oBAAoB,KAAK;AAChE,cAAI,SAAS,OAAO;AAClB,kBAAM,QACJ,MAAM,QAAQ,OAAO;AAAA,cACnB;AAAA,YACF;AACF,gBAAI,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACpC,oBAAM,MAAM,iDAAiD;AAAA,UACjE;AACA,oBAAU,QAAQ,SAAS,QAAQ,SAAY,IAAI;AAAA,QACrD;AACA,eAAO;AACP,aAAK,SAAS,MAAM,UAAU,KAAK,CAAC;AACpC;AAAA,MACF,KAAK;AACH,aAAK,SAAS,MAAM,UAAU,KAAK,IAAI,CAAC;AACxC;AAAA,MACF,KAAK;AACH,cAAM,UAAU,KAAK,WAAW,KAAK,CAAC,GAAG,eAAe,CAAC;AACzD,cAAM,UAAU,KAAK;AACrB,eAAO;AACP;AAAA,MACF,KAAK;AACH,cAAM,UAAU,OAAO,QAAQ,UAAU;AACzC,cAAM,UAAU,KAAK;AACrB,eAAO;AACP;AAAA,MACF,KAAK;AACH,cAAM,UAAU,OAAO,WAAW,MAAM,iBAAiB,CAAC;AAC1D;AAAA,MACF,KAAK,QAAQ;AACX,cAAM,MAAM,KAAK,GAAG,EAAE;AACtB,cAAM,UAAU,OAAO,QAAQ,KAAK,GAAG,IAAI,OAAO,GAAG,IAAI;AACzD,cAAM,UAAU;AAAA,UACd;AAAA,YACE,YAAY,SAAY,OAAO,KAAK,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AAAA,YACzD;AAAA,UACF;AAAA,UACA;AAAA,QACF;AACA,cAAM,UAAU,KAAK;AACrB,eAAO;AACP;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AACH,YACE,QAAQ,cACR,CAAC,CAAC,OAAO,WAAW,OAAO,UAAU,QAAQ,OAAO,EAAE,SAAS,IAAI;AAEnE,gBAAM,MAAM,wDAAwD;AACtE,cAAM,UAAU,KAAK,KAAK,WAAW,MAAM,SAAS,GAAG,EAAE,CAAC;AAC1D;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,cAAM,UAAU,KAAK,GAAG;AACxB;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,cAAM,UAAU,KAAK,KAAK,WAAW,MAAM,mBAAmB,CAAC;AAC/D;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,cAAM,UAAU;AAAA,UACd,QAAQ,SAAS,cAAc;AAAA,UAC/B,WAAW,MAAM,iBAAiB;AAAA,QACpC;AACA;AAAA,MACF,KAAK;AACH,cAAM,UAAU,MAAM,KAAK,CAAC,CAAC;AAC7B;AAAA,MACF,KAAK;AACH;AAAA,UACE;AAAA,UACA,CAAC,GAAG,UAAU,QAAQ,OAAO,CAAC,EAAE;AAAA,YAC9B,CAAC,MAAM,EAAE,SAAS,UAAU;AAAA,UAC9B;AAAA,QACF;AACA;AAAA,MACF,KAAK;AACH,YAAI,KAAK,CAAC,MAAM;AACd,gBAAM,UAAU;AAAA,YACd,WAAW,KAAK,CAAC,GAAG,kBAAkB;AAAA,YACtC,WAAW,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,GAAG,wBAAwB;AAAA,UAC9D;AAAA,iBACO,KAAK,CAAC,MAAM,UAAU;AAC7B,gBAAM,UAAU;AAAA,YACd;AAAA,YACA,WAAW,KAAK,CAAC,GAAG,kBAAkB;AAAA,UACxC;AACA,gBAAM,UAAU,QAAQ;AAAA,QAC1B,WAAW,KAAK;AACd,gBAAM,MAAM,sDAAsD;AAAA,aAC/D;AACH,gBAAM,UAAU,QAAQ;AACxB,eAAK,SAAS,UAAU,QAAQ,YAAY,CAAC,CAAC;AAAA,QAChD;AACA;AAAA,MACF,KAAK;AACH,cAAM,UAAU,QAAQ;AACxB,aAAK,SAAS,OAAO,KAAK,UAAU,QAAQ,SAAS,CAAC,CAAC,CAAC;AACxD;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,YAAY;AACf,cAAM,UAAU,QAAQ;AACxB,cAAM,OAAO,WAAW,KAAK,CAAC,GAAG,wBAAwB;AACzD,cAAM,OAAO,UAAU,QAAQ,MAAM,IAAI;AACzC,YAAI,CAAC,KAAM,OAAM,MAAM,gBAAgB;AACvC,YAAI,QAAQ,YAAY;AACtB,gBAAM,cAAc;AAAA,YAClB,KAAK,CAAC;AAAA,YACN;AAAA,UACF;AACA,gBAAM,eAAe,aAAa,KAAK,OAAO;AAC9C,eAAK,SAAS,WAAW;AAAA,QAC3B;AACE;AAAA,YACE;AAAA,YACA,QAAQ,SACJ;AAAA,EAAW,KAAK,UAAU,uBAAuB;AAAA;AAAA,EAAY,KAAK,OAAO,KACzE,KAAK;AAAA,UACX;AACF;AAAA,MACF;AAAA,MACA,KAAK;AACH,cAAM,UAAU,QAAQ;AACxB,aAAK,UAAU,UAAU,QAAQ,UAAU,CAAC,CAAC;AAC7C;AAAA,MACF,KAAK,SAAS;AACZ,cAAM,SAAS,KAAK,CAAC;AACrB,YAAI,WAAW,UAAU;AACvB,gBAAM,QAAQ,MAAM;AAAA,YAClB,WAAW,KAAK,CAAC,GAAG,kCAAkC;AAAA,UACxD;AACA,gBAAM,UAAU,MAAM,KAAK;AAC3B,eAAK,YAAY,MAAM,IAAI;AAAA,QAC7B,WAAW,WAAW,SAAU,OAAM,UAAU,KAAK,QAAQ;AAAA,aACxD;AACH,gBAAM,UAAU,QAAQ;AACxB,gBAAM,QAAQ,UAAU,QAAQ,OAAO;AAAA,YACrC,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC;AAAA,UAC1B;AACA,cAAI,CAAC,MAAO,OAAM,MAAM,iBAAiB;AACzC,cAAI,WAAW;AACb;AAAA,cACE,MAAM;AAAA,cACN,MAAM,MAAM,KAAK,CAAC,KAAK,UAAU,MAC9B,MAAM;AACL,sBAAM,MAAM,sBAAsB;AAAA,cACpC,GAAG;AAAA,YACP;AAAA,mBACO,WAAW;AAClB,kBAAM,UAAU,MAAM,EAAE,GAAG,OAAO,SAAS,CAAC,MAAM,QAAQ,CAAC;AAAA,mBACpD,WAAW,UAAU;AAC5B,gBAAI,CAAC,MAAM;AACT,oBAAM,MAAM,qCAAqC;AACnD,kBAAM,UAAU;AAAA,cACd,UAAU,OAAO,UAAU;AAAA,cAC3B,UAAU,MAAM,IAAI,IAAI,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC,GAAG,KAAK;AAAA,YACzD;AAAA,UACF;AACE,kBAAM,MAAM,oDAAoD;AAAA,QACpE;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,YAAI,KAAK,CAAC,MAAM;AACd;AAAA,YACE;AAAA,YACA,MAAM,QAAQ,OAAO;AAAA,cACnB,mBAAmB,mBAAmB,WAAW,KAAK,CAAC,GAAG,eAAe,CAAC,CAAC;AAAA,cAC3E,EAAE,QAAQ,SAAS;AAAA,YACrB;AAAA,UACF;AAAA,aACG;AACH,gBAAMC,UAAS,KAAK,CAAC,MAAM,SAAS,OAAO,KAAK,CAAC,CAAC,IAAI;AACtD,cAAI,CAAC,OAAO,cAAcA,OAAM,KAAKA,UAAS;AAC5C,kBAAM,MAAM,2CAA2C;AACzD,gBAAMC,SAAQ,KAAK,CAAC,MAAM,SAAS,KAAK,MAAM,CAAC,EAAE,KAAK,GAAG,IAAI;AAC7D;AAAA,YACE;AAAA,YACA,MAAM,QAAQ,OAAO;AAAA,cACnB,oCAAoCD,OAAM,UAAU,mBAAmBC,MAAK,CAAC;AAAA,YAC/E;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF,KAAK,WAAW;AACd,cAAM,OAAO,OAAO,OAAO,IAAI,IAAI;AACnC,YAAI,CAAC,OAAO,cAAc,IAAI,KAAK,OAAO;AACxC,gBAAM,MAAM,8BAA8B;AAC5C;AAAA,UACE;AAAA,UACA,UAAU,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,IAAI;AAAA,QAC9C;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,cAAM;AAAA,UACJ,WAAW,KAAK,CAAC,GAAG,4CAA4C;AAAA,UAChE,KAAK,UAAU,MAAM,UAAU,OAAO,GAAG,MAAM,CAAC,IAAI;AAAA,QACtD;AACA,aAAK,YAAY,KAAK,CAAC,CAAC;AACxB;AAAA,MACF;AACE,cAAM,MAAM,oBAAoB,GAAG,cAAc;AAAA,IACrD;AACA,QAAI,cAAc;AAAA,EACpB;AACA,MAAI,aAAa;AACjB,MAAI,QAAQ;AACZ,iBAAe,OAAO,MAAc;AAClC,UAAM,aAAa,UAAU;AAC7B,QAAI,CAAC,SAAS,YAAY;AACxB,YAAM,QAAQ,IAAI;AAClB;AAAA,QACE,CAAC,QAAQ,6BAA6B;AAAA,QACtC,CAAC,QACG,iEACA;AAAA,MACN;AACA;AAAA,IACF;AACA,iBAAa;AACb;AAAA,MACE;AAAA,MACA,KAAK,WAAW,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI;AAAA,IAC9C;AACA,QAAI;AACF,YAAM,QAAQ,IAAI;AAClB,UAAI,MAAM,QAAQ,MAAM,KAAM,OAAM,QAAQ,EAAE;AAAA,IAChD,SAAS,GAAG;AACV,UAAI,CAAC,MAAM;AAGT,eAAO;AACP,YAAI,eAAe,UAAU,cAAc,CAAC,MAAM,QAAQ;AACxD,gBAAM,QAAQ,IAAI;AACpB;AAAA,UACE,aAAa,SAAS,EAAE,SAAS,eAC7B,oBACA;AAAA,UACJ,aAAa,SAAS,EAAE,SAAS,eAC7B,kHACA,aAAa,QACX,EAAE,UACF,OAAO,CAAC;AAAA,QAChB;AAAA,MACF;AAAA,IACF,UAAE;AACA,mBAAa;AACb,UACE,eAAe,UAAU,cACzB,CAAC,4CAA4C,KAAK,IAAI,GACtD;AACA,eAAO,QAAQ,CAAC;AAChB,yBAAiB,UAAU;AAC3B,oBAAY;AACZ,eAAO,SAAS;AAChB,gBAAQ,MAAM;AAAA,MAChB;AACA,UAAI,cAAc;AAAA,IACpB;AAAA,EACF;AACA,MAAI,SAAS,MAAM;AACnB,MAAI,SAAS,KAAK;AAClB,QAAM,WAAW,CAAC,SAAS,KAAK,OAAO,IAAI;AAC3C,MAAI,iBAAiB,CAAC,SAAS;AAC7B,QAAIC,YAAW,MAAM,QAAQ,KAAK,gBAAgB;AAChD,qBAAe,MAAM;AACrB;AAAA,QACE;AAAA,QACA;AAAA,MACF;AACA,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AACA,QACE,SACA,CAAC,kBACD,UAAU,SACTA,YAAW,MAAM,QAAQ,KAAKA,YAAW,MAAM,QAAQ,IACxD;AACA,WAAK,UAAU,KAAK,MAAM,EAAE;AAAA,QAC1B,MACE;AAAA,UACE;AAAA,UACA;AAAA,QACF;AAAA,QACF,CAAC,UACC;AAAA,UACE;AAAA,UACA,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QACvD;AAAA,MACJ;AACA,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AACA,QAAIA,YAAW,MAAM,QAAQ,GAAG;AAC9B,WAAK;AACL,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AACA,QAAIA,YAAW,MAAM,QAAQ,KAAKA,YAAW,MAAM,UAAU,GAAG;AAC9D,aAAO,SAAS,KAAK;AAAA,QACnB;AAAA,QACA,KAAK;AAAA,UACH,OAAO,MAAM;AAAA,UACb,OAAO,UAAUA,YAAW,MAAM,QAAQ,IAAI,KAAK;AAAA,QACrD;AAAA,MACF;AACA,UAAI,cAAc;AAClB,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AACA,WAAO;AAAA,EACT,CAAC;AACD,MAAI,SAAS,KAAK;AAClB,MAAI,MAAM;AACV;AAAA,IACE;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ;AACV,QAAI;AACF,YAAM,UAAU,KAAK,QAAQ,IAAI;AACjC,YAAM,UAAU,KAAK;AACrB,aAAO;AAAA,IACT,SAAS,GAAG;AACV,WAAK,SAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,IAC1D;AACF,UAAQ;AACR,UAAQ,UAAU,EAAE,WAAW,QAAQ,KAAK,CAAC;AAC7C,OAAK,KAAK;AACV,SAAO,MAAM;AACf;;;AGrlBA;;;ACOA,IAAM,gBACJ,YAAY,KAAK,WAAW,IAAI,CAAC,KAAK;AACxC,IAAM,WAKD,CAAC;AACN,IAAI,SAAS;AAAb,IACE,SAAS;AACX,WAAWC,SAAQ,YAAY,MAAM,SAAS,GAAG;AAC/C,MAAIA,MAAK,WAAW,KAAK,EAAG,UAAS,CAAC;AACtC,QAAMC,WAAU,CAAC,SAAS,wBAAwB,KAAKD,KAAI,IAAI;AAC/D,MAAIC,UAAS;AACX,UAAM,WAAW,SAAS,GAAG,EAAE;AAC/B,QAAI,SAAU,UAAS,MAAM;AAC7B,UAAM,QAAQA,SAAQ,CAAC;AAEvB,UAAM,OAAO,MACV,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AACzB,aAAS,KAAK,EAAE,OAAO,MAAM,OAAO,QAAQ,KAAK,YAAY,OAAO,CAAC;AAAA,EACvE;AACA,YAAUD,MAAK;AACjB;AAGO,SAAS,aAAa,OAA8B;AACzD,QAAM,WAAW,SAAS;AAC1B,MAAI,aAAa,MAAO,QAAO,EAAE,OAAO,eAAe,SAAS,YAAY;AAC5E,MAAI,aAAa;AACf,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SACE,SACG,IAAI,CAACE,aAAY,KAAKA,SAAQ,KAAK,UAAUA,SAAQ,IAAI,EAAE,EAC3D,KAAK,IAAI,IACZ;AAAA,IACJ;AACF,QAAM,UAAU,SAAS,KAAK,CAAC,cAAc,UAAU,SAAS,QAAQ;AACxE,MAAI,CAAC,QAAS,OAAM,MAAM,sBAAsB,QAAQ,oBAAoB;AAC5E,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,SAAS,YAAY,MAAM,QAAQ,OAAO,QAAQ,GAAG;AAAA,EACvD;AACF;;;ACrDA,SAAQ,QAAAC,OAAK,YAAAC,WAAS,QAAO,cAAa;AAC1C,SAAQ,cAAAC,mBAAiB;AAKzB,eAAsB,YAAY,SAAyB,OAAa,QAAc,WAAiB,aAAmB,MAAsB,MAAyC;AACxL,QAAM,SAAO,QAAQ,OAAO;AAC5B,MAAG,CAAC,OAAO,OAAM,MAAM,gDAAgD;AACvE,MAAI,eAA0B,EAAC,SAAQ,GAAE,MAAK,OAAM,YAAW,QAAQ,OAAO,WAAU,UAAS,CAAC,GAAE,OAAM,CAAC,EAAC;AAC5G,MAAI,UAAQ;AACZ,MAAG,MAAK;AACP,QAAG,CAAC,QAAQ,OAAO,UAAU,OAAM,MAAM,2DAA2D;AACpG,QAAG;AAAC,qBAAa,KAAK,MAAM,MAAMD,UAAS,MAAK,MAAM,CAAC;AAAkB,gBAAQ;AAAA,IAAK,SAChF,OAAM;AAAC,UAAI,MAAgC,SAAO,SAAS,OAAM,MAAM,2DAA2D;AAAE,YAAM,SAAO,MAAMD,MAAK,MAAK,MAAK,GAAK;AAAE,YAAM,OAAO,MAAM;AAAA,IAAE;AACxM,QAAG,aAAa,YAAU,KAAG,aAAa,SAAO,SAAO,CAAC,MAAM,QAAQ,aAAa,QAAQ,KAAG,CAAC,MAAM,QAAQ,aAAa,KAAK,KAAG,aAAa,SAAS,KAAK,OAAG,CAAC,KAAG,CAAC,CAAC,QAAO,WAAW,EAAE,SAAS,EAAE,IAAI,KAAG,OAAO,EAAE,YAAU,QAAQ,EAAE,OAAM,MAAM,wDAAwD;AAC9S,QAAG,SAAQ;AACV,UAAG,aAAa,eAAa,QAAQ,OAAO,UAAU,OAAM,MAAM,6DAA6D;AAAA,IAChI;AAAA,EACD;AACA,QAAM,UAAQ,YAAS;AACtB,QAAG,CAAC,KAAK;AACT,UAAM,OAAK,GAAG,IAAI,IAAIE,YAAW,CAAC;AAAO,UAAM,SAAO,MAAMF,MAAK,MAAK,MAAK,GAAK;AAChF,QAAG;AAAC,YAAM,OAAO,UAAU,KAAK,UAAU,cAAa,MAAK,CAAC,IAAE,IAAI;AAAE,YAAM,OAAO,KAAK;AAAE,YAAM,OAAO,MAAM;AAAE,YAAM,OAAO,MAAK,IAAI;AAAA,IAAE,SAAO,OAAM;AAAC,YAAM,OAAO,MAAM,EAAE,MAAM,MAAI;AAAA,MAAC,CAAC;AAAE,YAAM,OAAO,IAAI,EAAE,MAAM,MAAI;AAAA,MAAC,CAAC;AAAE,YAAM;AAAA,IAAM;AAAA,EACrO;AACA,UAAQ,QAAQ,eAAe;AAC/B,eAAa,SAAS,KAAK,EAAC,MAAK,QAAO,SAAQ,OAAM,CAAC;AACvD,QAAM,WAAS,CAAC,GAAG,aAAa,QAAQ;AAAE,QAAM,YAAkB,EAAC,MAAK,aAAY,SAAQ,GAAE;AAC9F,eAAa,SAAS,KAAK,SAAS;AAAE,QAAM,OAAmC,EAAC,QAAO,CAAC,GAAE,QAAO,YAAW;AAAE,eAAa,MAAM,KAAK,IAAI;AAC1I,QAAM,QAAQ;AACd,MAAG;AACF,UAAM,WAAS,MAAM,OAAO,KAAK,QAAQ,QAAO,gBAAe,EAAC,QAAO,QAAO,QAAO,QAAQ,QAAO,MAAK,KAAK,UAAU,EAAC,OAAM,YAAW,WAAU,aAAY,QAAO,MAAK,SAAQ,CAAC,EAAC,CAAC;AACvL,QAAG,CAAC,SAAS,KAAK,OAAM,MAAM,+BAA+B;AAC7D,UAAM,SAAO,SAAS,KAAK,UAAU;AAAE,UAAM,UAAQ,IAAI,YAAY;AAAE,QAAI,SAAO;AAAG,QAAI,WAAS;AAClG,UAAM,SAAO,MAAI;AAAC,WAAK,OAAO,OAAO,QAAQ,QAAQ,MAAM;AAAA,IAAE;AAAE,YAAQ,QAAQ,iBAAiB,SAAQ,QAAO,EAAC,MAAK,KAAI,CAAC;AAC1H,UAAM,QAAM,OAAM,UAAe;AAChC,YAAM,OAAK,MAAM,MAAM,IAAI,EAAE,OAAO,CAAAG,UAAMA,MAAK,WAAW,OAAO,CAAC,EAAE,IAAI,CAAAA,UAAMA,MAAK,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,KAAK,IAAI;AAAE,UAAG,CAAC,KAAK;AAC7H,UAAG,SAAO,UAAS;AAAC,mBAAS;AAAK;AAAA,MAAO;AACzC,YAAM,QAAM,KAAK,MAAM,IAAI;AAAE,WAAK,OAAO,KAAK,KAAK;AACnD,UAAG,MAAM,SAAO,WAAS,MAAM,MAAM,OAAM,MAAM,yBAAuB,KAAK,UAAU,MAAM,SAAO,KAAK,CAAC;AAC1G,YAAM,OAAK,MAAM,SAAO,yBAAuB,MAAM,OAAO,SAAO,eAAe,MAAM,MAAM,OAAO,MAAM,SAAO,wBAAwB,MAAM,eAAe,OAAO,MAAM,UAAU,CAAC,GAAG,OAAO;AACjM,UAAG,OAAO,SAAO,YAAU,MAAK;AAAC,kBAAU,WAAS;AAAK,aAAK,eAAc,IAAI;AAAA,MAAE;AAClF,UAAG,MAAM,SAAO,eAAe,YAAS;AACxC,YAAM,QAAQ;AAAA,IACf;AACA,QAAG;AAAC,aAAM,MAAK;AAAC,gBAAQ,QAAQ,eAAe;AAAE,cAAM,OAAK,MAAM,OAAO,KAAK;AAAE,kBAAQ,QAAQ,OAAO,KAAK,OAAM,EAAC,QAAO,CAAC,KAAK,KAAI,CAAC;AAAE,iBAAO,OAAO,QAAQ,SAAQ,IAAI;AAAE,YAAI;AAAM,gBAAO,QAAM,OAAO,QAAQ,MAAM,MAAI,GAAE;AAAC,gBAAM,MAAM,OAAO,MAAM,GAAE,KAAK,CAAC;AAAE,mBAAO,OAAO,MAAM,QAAM,CAAC;AAAA,QAAE;AAAC,YAAG,KAAK,KAAK;AAAA,MAAM;AAAC,cAAQ,QAAQ,eAAe;AAAE,UAAG,OAAO,KAAK,EAAE,OAAM,MAAM,MAAM;AAAE,UAAG,CAAC,SAAS,OAAM,MAAM,6FAA6F;AAAA,IAAE,UACjf;AAAQ,cAAQ,QAAQ,oBAAoB,SAAQ,MAAM;AAAE,YAAM,OAAO,OAAO,EAAE,MAAM,MAAI;AAAA,MAAC,CAAC;AAAA,IAAE;AAChG,SAAK,SAAO;AAAW,UAAM,QAAQ;AAAE,SAAK,gBAAe,EAAC,MAAK,OAAM,SAAQ,WAAU,QAAO,KAAK,QAAO,cAAa,QAAM,KAAI,CAAC;AAAA,EACrI,SAAO,OAAM;AAAC,SAAK,SAAO;AAAc,QAAG,CAAC,UAAU,QAAQ,cAAa,SAAS,IAAI;AAAE,UAAM,QAAQ;AAAE,UAAM,UAAQ,iBAAiB,QAAM,MAAM,UAAQ,OAAO,KAAK;AAAE,UAAM,MAAM,OAAO;AAAA,EAAE;AACjM;;;AC/CA,SAAS,SAAAC,cAAa;AACtB,SAAS,YAAAC,iBAAgB;;;ACHzB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,wBAAwB;AACjC,SAAS,QAAAC,OAAM,YAAAC,WAAU,UAAAC,SAAQ,MAAM,UAAAC,SAAQ,iBAAiB;AAChE,SAAS,YAAAC,WAAU,WAAAC,gBAAe;AAClC,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AAKzB,SAAS,YAAY,OAAsB;AAC1C,QAAM,MAAM,IAAI,IAAI,KAAK;AACzB,MAAI,IAAI,YAAY,IAAI,YAAY,EAAE,IAAI,aAAa,YAAa,IAAI,aAAa,WAAW,CAAC,aAAY,aAAY,OAAO,EAAE,SAAS,IAAI,QAAQ,GAAK,OAAM,MAAM,8DAA8D;AACtO,SAAO,IAAI;AACZ;AACA,eAAsB,iBAAiB,QAAuB,MAAY,MAAa,QAAc,MAAU,QAAqB;AAEnI,UAAQ,eAAe;AAAE,QAAM,cAAYA,SAAQ,MAAM;AAAG,QAAM,SAAO,MAAML,MAAK,aAAY,MAAK,GAAK;AAC1G,MAAI;AACH,UAAM,QAAM,MAAM,OAAO,QAAsB,MAAK,EAAC,QAAO,QAAO,MAAK,KAAK,UAAU,IAAI,GAAE,GAAI,SAAS,EAAC,OAAM,IAAI,CAAC,EAAE,CAAC;AACzH,UAAM,WAAS,MAAM,MAAM,YAAY,MAAM,GAAG,GAAE,EAAC,UAAS,SAAQ,OAAM,CAAC;AAC3E,QAAI,CAAC,SAAS,MAAM,CAAC,SAAS,KAAM,OAAM,MAAM,6BAA6B,SAAS,MAAM,GAAG;AAC/F,UAAM,SAAS,SAAS,QAAQ,SAAS,IAAgD,GAAE,OAAO,kBAAkB,GAAE,EAAC,OAAM,CAAC;AAC9H,SAAK,uBAAsB,EAAC,QAAO,aAAY,QAAO,MAAM,KAAK,WAAW,GAAG,KAAI,CAAC;AAAA,EACrF,SAAQ,OAAO;AAAC,UAAM,OAAO,MAAM,EAAE,MAAM,MAAI;AAAA,IAAC,CAAC;AAAE,UAAMG,QAAO,WAAW,EAAE,MAAM,MAAI;AAAA,IAAC,CAAC;AAAE,UAAM;AAAA,EAAM,UACvG;AAAS,UAAM,OAAO,MAAM,EAAE,MAAM,MAAI;AAAA,IAAC,CAAC;AAAA,EAAE;AAC7C;AACA,eAAe,YAAY,MAAY,QAAqB;AAC3D,QAAM,OAAK,MAAM,KAAK,IAAI;AAAE,MAAG,CAAC,KAAK,OAAO,KAAK,KAAK,OAAO,EAAE,OAAM,MAAM,yCAAyC;AACpH,QAAM,OAAKJ,YAAW,QAAQ;AAAE,mBAAgB,SAAS,iBAAiB,MAAK,EAAC,OAAM,CAAC,GAAE;AAAC,YAAQ,eAAe;AAAE,SAAK,OAAO,KAAK;AAAA,EAAE;AACtI,SAAO,EAAC,MAAK,KAAK,MAAK,QAAO,KAAK,OAAO,KAAK,EAAC;AACjD;AACA,eAAe,KAAK,MAAY,SAAiB;AAChD,QAAM,YAAU,OAAK;AAAQ,QAAM,UAAU,WAAU,KAAK,UAAU,SAAQ,MAAK,CAAC,IAAE,MAAK,EAAC,MAAK,MAAK,MAAK,IAAK,CAAC;AACjH,MAAG;AAAC,UAAMG,QAAO,WAAU,IAAI;AAAA,EAAE,SAAO,OAAM;AAAC,UAAMC,QAAO,SAAS,EAAE,MAAM,MAAI;AAAA,IAAC,CAAC;AAAE,UAAM;AAAA,EAAM;AAClG;AACA,eAAsB,WAAW,QAAc,OAAa,aAA6B,QAAuB,MAAU,QAAqB;AAC9I,UAAQ,eAAe;AAAE,QAAM,OAAKE,SAAQ,WAAW,UAAU,QAAQ,WAAY;AAAE,MAAI;AAC3F,MAAG,WAAW,SAAS;AACtB,cAAQ,KAAK,MAAM,MAAMJ,UAAS,MAAK,MAAM,CAAC;AAC9C,QAAG,QAAQ,YAAU,KAAK,CAAC,QAAQ,QAAQ,CAAC,OAAO,UAAU,QAAQ,IAAI,KAAK,CAAC,iBAAiB,KAAK,QAAQ,MAAM,EAAE,OAAM,MAAM,wBAAwB;AACzJ,QAAG,QAAQ,UAAQ,YAAW;AAAC,WAAK,2BAA0B,EAAC,SAAQ,MAAK,KAAI,QAAQ,IAAG,CAAC;AAAE;AAAA,IAAO;AACrG,QAAG,QAAQ,UAAU,YAAY,OAAM,MAAM,aAAa,QAAQ,KAAK,gHAAgH;AACvL,UAAM,WAAS,MAAM,YAAY,QAAQ,MAAK,MAAM;AAAE,QAAG,SAAS,SAAO,QAAQ,QAAQ,SAAS,WAAS,QAAQ,OAAO,OAAM,MAAM,yCAAyC;AAAA,EAChL,OAAO;AACN,UAAM,OAAKI,SAAQ,KAAK,GAAE,WAAS,MAAM,YAAY,MAAK,MAAM;AAAE,cAAQ,EAAC,SAAQ,GAAE,MAAK,GAAG,UAAS,OAAM,WAAU;AAEtH,UAAM,UAAU,MAAK,KAAK,UAAU,SAAQ,MAAK,CAAC,IAAE,MAAK,EAAC,MAAK,MAAK,MAAK,IAAK,CAAC;AAC/E,SAAK,kBAAiB,EAAC,SAAQ,MAAK,MAAK,OAAM,SAAS,KAAI,CAAC;AAC7D,YAAQ,eAAe;AAAE,UAAM,OAAK,MAAM,OAAO,QAA0E,sBAAqB,EAAC,QAAO,QAAO,MAAK,KAAK,UAAU,EAAC,UAASD,UAAS,IAAI,GAAE,MAAK,SAAS,MAAK,cAAa,2BAA0B,CAAC,GAAE,GAAI,SAAS,EAAC,OAAM,IAAI,CAAC,EAAE,CAAC;AACrS,cAAQ,EAAC,GAAG,SAAQ,WAAU,KAAK,WAAU,KAAI,KAAK,KAAI,WAAU,KAAK,WAAU,YAAW,KAAK,YAAW,OAAM,YAAW;AAC/H,QAAI;AAAC,YAAM,KAAK,MAAK,OAAO;AAAA,IAAE,SAAQ,OAAO;AAAC,WAAK,+BAA8B,EAAC,SAAQ,MAAK,WAAU,QAAQ,WAAU,KAAI,QAAQ,KAAI,QAAO,yDAAwD,CAAC;AAAE,YAAM;AAAA,IAAM;AAAA,EAC1N;AACA,MAAG,CAAC,QAAQ,aAAa,CAAC,QAAQ,OAAO,CAAC,OAAO,UAAU,QAAQ,SAAS,KAAK,QAAQ,YAAa,KAAK,CAAC,OAAO,UAAU,QAAQ,UAAU,KAAK,QAAQ,aAAc,KAAK,QAAQ,aAAc,OAAS,KAAK,KAAK,QAAQ,OAAK,QAAQ,SAAU,MAAI,QAAQ,WAAW,OAAM,MAAM,kDAAkD;AAC5U,QAAM,OAAK,eAAe,mBAAmB,QAAQ,SAAS,CAAC;AAC/D,QAAM,QAAM,MAAM,OAAO,QAAiC,GAAG,IAAI,WAAW,IAAI,gBAAgB,EAAC,KAAI,QAAQ,IAAG,CAAC,CAAC,IAAG,SAAS,EAAC,OAAM,IAAI,MAAS;AAClJ,QAAM,QAAa,CAAC,GAAG,MAAM,cAAc;AAAE,QAAM,SAAO,IAAI,IAAI,MAAM,IAAI,OAAG,EAAE,WAAW,CAAC;AAC7F,QAAM,SAAO,MAAMJ,MAAK,QAAQ,MAAK,GAAG;AACxC,MAAI;AACH,aAAQ,IAAE,GAAE,KAAG,QAAQ,YAAY,KAAK;AACvC,cAAQ,eAAe;AAAE,UAAG,OAAO,IAAI,CAAC,EAAE;AAC1C,YAAM,SAAO,MAAM,OAAO,QAAsC,OAAK,SAAQ,EAAC,QAAO,QAAO,MAAK,KAAK,UAAU,EAAC,KAAI,QAAQ,KAAI,cAAa,CAAC,CAAC,EAAC,CAAC,GAAE,GAAI,SAAS,EAAC,OAAM,IAAI,CAAC,EAAE,CAAC;AAChL,cAAQ,eAAe;AAAE,YAAMM,WAAQ,IAAE,KAAG,QAAQ,WAAW,SAAO,KAAK,IAAI,QAAQ,WAAW,QAAQ,OAAKA,OAAM,GAAE,QAAM,OAAO,MAAM,MAAM;AAChJ,YAAMC,QAAK,MAAM,OAAO,KAAK,OAAM,GAAE,QAAOD,OAAM;AAAE,UAAGC,MAAK,cAAY,OAAO,OAAM,MAAM,qCAAqC;AAChI,YAAM,WAAS,MAAM,MAAM,YAAY,OAAO,KAAK,OAAO,CAAC,CAAC,CAAE,GAAE,EAAC,QAAO,OAAM,MAAK,OAAM,UAAS,SAAQ,OAAM,CAAC;AACjH,UAAG,CAAC,SAAS,GAAG,OAAM,MAAM,eAAe,CAAC,YAAY,SAAS,MAAM,kCAAkC,IAAI,aAAa;AAC1H,YAAM,OAAK,SAAS,QAAQ,IAAI,MAAM;AAAE,UAAG,CAAC,KAAK,OAAM,MAAM,eAAe,CAAC,8CAA8C;AAC3H,YAAM,KAAK,EAAC,aAAY,GAAE,KAAI,CAAC;AAAE,WAAK,mBAAkB,EAAC,SAAQ,MAAK,gBAAe,MAAM,QAAO,aAAY,QAAQ,WAAU,CAAC;AAAA,IAClI;AAAA,EACD,UAAE;AAAS,UAAM,OAAO,MAAM;AAAA,EAAE;AAChC,QAAM,gBAAc,MAAM,YAAY,QAAQ,MAAK,MAAM;AAAE,MAAG,cAAc,SAAO,QAAQ,QAAQ,cAAc,WAAS,QAAQ,OAAO,OAAM,MAAM,6EAA6E;AAElO,UAAQ,eAAe;AAAE,UAAQ,QAAM;AAAa,QAAM,KAAK,MAAK,OAAO;AAC3E,QAAM,SAAO,MAAM,OAAO,QAAQ,OAAK,aAAY,EAAC,QAAO,QAAO,MAAK,KAAK,UAAU,EAAC,KAAI,QAAQ,KAAI,OAAM,MAAM,IAAI,CAAC,EAAC,aAAY,KAAI,OAAK,EAAC,aAAY,KAAI,EAAE,EAAE,KAAK,CAAC,GAAE,MAAI,EAAE,cAAY,EAAE,WAAW,EAAC,CAAC,GAAE,GAAI,SAAS,EAAC,OAAM,IAAI,CAAC,EAAE,CAAC;AAC1O,UAAQ,QAAM;AAAW,QAAM,KAAK,MAAK,OAAO;AAAE,OAAK,mBAAkB,EAAC,SAAQ,MAAK,OAAM,CAAC;AAC/F;;;ADhEA,IAAM,MAAM;AAEL,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,aAAa,QAAwB;AAC5C,QAAM,SAAmB,CAAC;AAAG,QAAM,UAAkC,CAAC;AAAG,MAAI,UAAU;AACvF,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,QAAQ,OAAO,CAAC;AACtB,QAAI,UAAU,aAAa;AAAE,UAAI,QAAS,OAAM,MAAM,qBAAqB;AAAG,gBAAU;AAAA,IAAM,WACrF,MAAM,WAAW,IAAI,GAAG;AAC/B,YAAMC,OAAM,MAAM,MAAM,CAAC;AAAG,YAAM,QAAQ,OAAO,EAAE,CAAC;AACpD,UAAI,CAACA,QAAO,UAAU,UAAa,MAAM,WAAW,IAAI,KAAK,OAAO,OAAO,SAASA,IAAG,EAAG,OAAM,MAAM,0BAA0B,KAAK,EAAE;AACvI,cAAQA,IAAG,IAAI;AAAA,IACjB,MAAO,QAAO,KAAK,KAAK;AAAA,EAC1B;AACA,SAAO,EAAC,QAAQ,SAAS,QAAO;AAClC;AACA,SAAS,SAAS,GAAS,KAAa,KAAa,UAAoB,CAAC,GAAG;AAC3E,MAAI,EAAE,OAAO,SAAS,OAAO,EAAE,OAAO,SAAS,IAAK,OAAM,MAAM,YAAY,QAAQ,MAAM,MAAM,GAAG,GAAG,SAAI,GAAG,EAAE,4CAA4C;AAC3J,aAAWA,QAAO,OAAO,KAAK,EAAE,OAAO,EAAG,KAAI,CAAC,QAAQ,SAASA,IAAG,EAAG,OAAM,MAAM,oBAAoBA,IAAG,EAAE;AAC7G;AACA,SAAS,SAAS,GAASA,MAAa;AAAC,QAAM,QAAQ,EAAE,QAAQA,IAAG;AAAG,MAAI,CAAC,MAAO,OAAM,MAAM,cAAcA,IAAG,EAAE;AAAG,SAAO;AAAM;AAClI,SAAS,KAAK,GAAS,SAA2B;AAAC,QAAM,QAAQ,EAAE,QAAQ,QAAQ,QAAQ;AAAM,MAAI,CAAC,MAAO,OAAM,MAAM,mCAAmC;AAAG,SAAO;AAAM;AAC5K,SAAS,MAAM,MAAc,GAAS,MAAgB,WAAkC,CAAC,GAAG;AAC1F,QAAM,SAAS,IAAI,gBAAgB;AACnC,aAAWA,QAAO,KAAM,KAAI,EAAE,QAAQA,IAAG,MAAM,OAAW,QAAO,IAAIA,KAAI,WAAW,KAAK,GAAG,GAAG,EAAE,QAAQA,IAAG,CAAE;AAC9G,aAAW,CAACA,MAAI,KAAK,KAAK,OAAO,QAAQ,QAAQ,EAAG,KAAI,CAAC,OAAO,IAAIA,IAAG,EAAG,QAAO,IAAIA,MAAI,KAAK;AAC9F,SAAO,QAAQ,OAAO,OAAO,IAAI,MAAM,KAAK;AAC9C;AACA,SAAS,MAAM,OAAyB;AAEtC,MAAI,OAAO,UAAU,SAAU,QAAO,MAAM,QAAQ,yBAAyB,OAAK,MAAM,EAAE,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAE,GAAG,CAAC,EAAE;AACtI,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,KAAK;AAChD,MAAI,SAAS,OAAO,UAAU,SAAU,QAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,GAAE,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC,GAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACnI,SAAO;AACT;AACA,SAAS,aAAa,SAA2B,GAAS,OAAe,QAA0B;AACjG,MAAI,EAAE,QAAS,QAAO;AACtB,UAAQ,KAAK,yBAAyB,MAAM,EAAC,QAAO,OAAM,QAAQ,aAAY,8DAA6D,CAAC,CAAC;AAAG,SAAO;AACzJ;AAEA,SAAS,uBAAuB,KAAsC;AACpE,QAAM,aAAW,MAAM,QAAQ,IAAI,UAAU,IAAI,IAAI,aAAyC,CAAC;AAC/F,QAAM,OAAK,WAAW,KAAK,eAAa,UAAU,WAAS,kBAAmB,UAAU,QAA6C,aAAW,MAAM;AACtJ,QAAM,OAAK,MAAM,QAAQ,MAAM,IAAI,IAAI,KAAK,OAAmC,CAAC;AAChF,QAAM,QAAM,CAAC,QAA+B;AAAC,UAAM,QAAM,KAAK,MAAM,OAAO,IAAI,cAAY,IAAI,cAAY,EAAE,CAAC;AAAE,WAAO,OAAO,MAAM,KAAK,IAAI,YAAY;AAAA,EAAM;AAC/J,QAAM,SAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAE,MAAI,MAAM,CAAC,IAAE,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;AAC3D,SAAO,QAAQ,UAAU;AAC3B;AAEA,eAAsB,oBAAoB,OAAe,SAA6C;AACpG,QAAM,SAAS,MAAM,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC;AACnD,MAAI,CAAC,MAAM,KAAK,EAAE,WAAW,GAAG,KAAK,CAAC,CAAC,aAAY,aAAY,QAAO,WAAU,YAAW,SAAQ,cAAa,eAAc,UAAS,cAAa,gBAAe,WAAU,aAAY,WAAU,KAAK,EAAE,SAAS,UAAU,EAAE,EAAG,QAAO;AACzO,QAAM,kBAA4B,CAAC;AACnC,QAAM,SAAS,CAAC,UAA4B;AAC1C,QAAI,OAAO,UAAU,SAAU,QAAO,gBAAgB,OAAO,CAAC,MAAK,WAAW,KAAK,MAAM,MAAM,EAAE,KAAK,cAAc,GAAE,KAAK;AAC3H,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,MAAM;AACjD,QAAI,SAAS,OAAO,UAAU,SAAU,QAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAACA,MAAI,IAAI,MAAM,CAACA,MAAI,OAAO,IAAI,CAAC,CAAC,CAAC;AAC/H,WAAO;AAAA,EACT;AACA,QAAM,OAAO,CAAC,OAAe,UAAmB,QAAQ,KAAK,OAAO,MAAM,OAAO,KAAK,CAAC,CAAC;AACxF,QAAM,SAA0B,EAAC,SAAS,CAAI,MAAc,SAAuB,QAAQ,OAAO,QAAW,MAAK,QAAQ,SAAS,EAAC,GAAG,MAAK,QAAO,QAAQ,OAAM,IAAI,IAAI,EAAC;AAC1K,MAAI;AAEF,UAAM,SAASC,OAAM,OAAO,MAAM;AAAE,YAAM,MAAM,iEAAiE;AAAA,IAAG,CAAC;AACrH,QAAI,OAAO,KAAK,WAAS,OAAO,UAAU,QAAQ,EAAG,OAAM,MAAM,8CAA8C;AAC/G,UAAM,SAAS;AAAoB,WAAO,MAAM;AAChD,UAAM,SAAS,OAAO,MAAM,MAAM,WAAW,QAAQ,KAAK;AAC1D,UAAM,IAAI,aAAa,MAAM;AAAG,UAAM,IAAI,EAAE;AAC5C,QAAI,WAAW,eAAe,WAAW,QAAQ;AAAC,WAAK,6BAA4B,kBAAkB;AAAE,aAAO;AAAA,IAAK;AACnH,QAAI,WAAW,OAAO;AACpB,eAAS,GAAE,GAAE,CAAC;AAAG,YAAM,QAAQ;AAC/B,YAAM,YAAU,aAAa,KAAK;AAElC,cAAQ,KAAK,UAAU,OAAM,UAAU,OAAO;AAAG,aAAO;AAAA,IAC1D;AACA,QAAI,WAAW,cAAc;AAC3B,UAAI,WAAW,QAAQ;AAAC,iBAAS,GAAE,GAAE,CAAC;AAAE,aAAK,wBAAuB,MAAM,OAAO,QAAQ,mBAAmB,IAAI,EAAE,CAAC,CAAE,CAAC,EAAE,CAAC;AAAE,eAAO;AAAA,MAAK;AACvI,UAAI,WAAW,UAAU;AACvB,iBAAS,GAAE,GAAE,GAAE,CAAC,SAAQ,SAAQ,QAAO,SAAQ,eAAe,CAAC;AAC/D,cAAMC,SAAM,OAAO,EAAE,QAAQ,SAAS,GAAG;AAAE,YAAG,CAAC,OAAO,UAAUA,MAAK,KAAGA,SAAM,KAAGA,SAAM,IAAI,OAAM,MAAM,gCAA2B;AAClI,YAAG,EAAE,QAAQ,eAAe,KAAK,CAAC,CAAC,QAAO,OAAO,EAAE,SAAS,EAAE,QAAQ,eAAe,CAAC,EAAE,OAAM,MAAM,qCAAqC;AACzI,cAAM,OAAK,MAAM,qBAAqB,IAAI,EAAE,CAAC,CAAE,CAAC,IAAG,GAAE,CAAC,SAAQ,OAAO,GAAE,EAAC,OAAM,OAAOA,MAAK,EAAC,CAAC;AAC5F,cAAM,OAAK,MAAM,OAAO,QAAqE,IAAI;AACjG,cAAM,SAAO,KAAK,UAAU,CAAC,GAAE,QAAM,EAAE,QAAQ,OAAO,IAAI,IAAI,EAAE,QAAQ,KAAK,MAAM,GAAG,CAAC,IAAI,QAAU,UAAQ,EAAE,QAAQ,SAAO,IAAI,KAAK,EAAE,YAAY;AACrJ,cAAMC,YAAS,OAAO,OAAO,YAAU,CAAC,SAAS,MAAM,IAAI,OAAO,MAAM,KAAK,CAAC,OAAO,EAAE,QAAQ,eAAe,MAAI,UAAU,CAAC,WAAU,QAAO,SAAQ,UAAU,EAAE,SAAS,OAAO,MAAM,SAAO,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC,kBAAiB,SAAS,EAAE,SAAS,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,MAAM,KAAK,IAAI,MAAM,WAAS,EAAE,IAAI,KAAK,UAAU,OAAO,YAAY,OAAO,QAAS,MAAM,YAAqC,CAAC,CAAC,EAAE,OAAO,CAAC,CAACH,IAAG,MAAIA,SAAM,WAAW,CAAC,CAAC,CAAC,GAAG,YAAY,EAAE,SAAS,MAAM,EAAE,EAAE,QAAQ;AACxf,aAAK,wBAAuB,EAAC,GAAG,MAAK,QAAOG,WAAS,kBAAiB,OAAO,QAAO,sBAAqBA,UAAS,QAAO,kBAAiB,wDAAuD,CAAC;AAAE,eAAO;AAAA,MAC7M;AACA,UAAI,WAAW,OAAQ,OAAM,MAAM,sCAAsC;AACzE,eAAS,GAAE,GAAE,GAAE,CAAC,QAAO,aAAY,UAAS,SAAQ,QAAQ,CAAC;AAC7D,YAAM,OAAO,MAAM,OAAO,QAAkC,iBAAiB;AAC7E,YAAMC,gBAAe,EAAE,QAAQ,QAAQ,QAAQ;AAC/C,YAAM,YAAY,CAAC,MAAc,OAAO,KAAG,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,WAAU,GAAG;AACzF,YAAM,WAAW,KAAK,OAAO,SAAO;AAClC,cAAM,MAAM,IAAI;AAChB,eAAO,KAAK,SAAS,wBAAwB,CAACA,iBAAgB,UAAU,IAAI,IAAI,MAAM,UAAUA,aAAY,OAAO,CAAC,EAAE,QAAQ,aAAa,IAAI,cAAc,EAAE,QAAQ,eAAe,CAAC,EAAE,QAAQ,UAAU,uBAAuB,GAAG,MAAM,EAAE,QAAQ;AAAA,MACvP,CAAC;AACD,YAAM,QAAQ,OAAO,EAAE,QAAQ,SAAS,EAAE,GAAGC,UAAS,OAAO,EAAE,QAAQ,UAAU,CAAC;AAClF,UAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,OAAO,CAAC,OAAO,UAAUA,OAAM,KAAKA,UAAS,EAAG,OAAM,MAAM,sDAAiD;AAClK,WAAK,kBAAkB,EAAC,OAAM,SAAS,MAAMA,SAAOA,UAAO,KAAK,GAAE,OAAM,SAAS,QAAO,OAAM,QAAAA,SAAO,aAAYA,UAAO,QAAQ,SAAS,SAASA,UAAO,QAAQ,MAAM,YAAW,wDAAuD,CAAC;AAAE,aAAO;AAAA,IACrP;AACA,QAAI,WAAW,aAAa,CAAC,QAAO,OAAO,EAAE,SAAS,MAAM,GAAG;AAC7D,eAAS,GAAE,GAAE,GAAE,WAAW,SAAS,CAAC,SAAS,IAAI,CAAC,CAAC;AACnD,UAAI,WAAW,OAAQ,UAAS,GAAE,SAAS;AAC3C,UAAI,aAAa,SAAQ,GAAE,UAAU,MAAM,IAAG,EAAC,MAAK,EAAE,CAAC,GAAE,SAAQ,EAAE,QAAQ,QAAO,CAAC,EAAG,OAAM,WAAW,QAAO,EAAE,CAAC,GAAG,EAAE,QAAQ,SAAQ,QAAO,MAAK,QAAQ,MAAM;AAChK,aAAO;AAAA,IACT;AACA,QAAI,WAAW,eAAe,CAAC,YAAW,iBAAiB,EAAE,SAAS,MAAM,GAAG;AAC7E,eAAS,GAAE,WAAW,aAAa,IAAI,GAAE,WAAW,aAAa,IAAI,GAAE,WAAW,aAAa,CAAC,UAAS,QAAQ,IAAI,CAAC,QAAQ,CAAC;AAC/H,eAAS,GAAE,QAAQ;AAAG,YAAM,SAAS,EAAE,QAAQ,UAAU;AAAU,UAAI,CAAC,CAAC,UAAS,SAAS,EAAE,SAAS,MAAM,EAAG,OAAM,MAAM,kCAAkC;AAC7J,UAAI,aAAa,SAAQ,GAAE,qBAAoB,EAAC,QAAO,GAAE,QAAO,EAAE,QAAQ,QAAO,OAAM,CAAC,GAAG;AACzF,cAAM,OAAO,WAAW,aAAa,qCAAqC,iBAAiB,IAAI,EAAE,CAAC,CAAE,CAAC;AACrG,cAAM,OAAO,WAAW,aAAa,EAAC,QAAO,EAAE,CAAC,GAAE,MAAK,EAAE,CAAC,GAAE,OAAM,IAAI,EAAC,YAAW,IAAG;AACrF,cAAM,iBAAiB,QAAO,MAAK,MAAK,EAAE,QAAQ,QAAQ,MAAK,QAAQ,MAAM;AAAA,MAC/E;AACA,aAAO;AAAA,IACT;AACA,QAAI,WAAW,aAAa,WAAW,UAAU;AAC/C,eAAS,GAAE,GAAE,GAAE,CAAC,QAAO,cAAa,eAAc,cAAc,CAAC;AAAG,YAAM,QAAQ,KAAK,GAAE,OAAO;AAChG,YAAM,YAAY,OAAO,EAAE,QAAQ,YAAY,KAAK,GAAG,GAAG,cAAc,OAAO,EAAE,QAAQ,eAAe,GAAG;AAC3G,UAAI,CAAC,OAAO,UAAU,SAAS,KAAK,YAAY,KAAK,YAAY,QAAQ,CAAC,OAAO,SAAS,WAAW,KAAK,cAAc,KAAK,cAAc,EAAG,OAAM,MAAM,8DAAoD;AAC9M,UAAI,CAAC,aAAa,SAAQ,GAAE,kCAAiC,EAAC,MAAK,OAAM,QAAO,EAAE,CAAC,GAAE,YAAW,WAAU,aAAY,cAAa,EAAE,QAAQ,aAAY,CAAC,EAAG,QAAO;AACpK,YAAM,YAAY,SAAQ,OAAM,EAAE,CAAC,GAAG,WAAU,aAAY,EAAE,QAAQ,cAAa,IAAI;AAEvF,aAAO;AAAA,IACT;AACA,QAAI;AACJ,UAAMC,QAAO,CAAC,MAAY,MAAI,GAAE,MAAI,KAAI,OAAc,CAAC,MAAM;AAAC,eAAS,GAAE,KAAI,KAAI,IAAI;AAAE,WAAG,EAAC,KAAI;AAAA,IAAE;AACjG,UAAM,QAAQ,CAAC,MAAY,QAAc,MAAa,KAAW,MAAI,KAAI,OAAc,CAAC,MAAM;AAAC,eAAS,GAAE,KAAI,KAAI,IAAI;AAAE,WAAG,EAAC,MAAK,QAAO,KAAI;AAAA,IAAE;AAC9I,QAAI,WAAW,aAAa;AAC1B,UAAI,WAAW,OAAQ,CAAAA,MAAK,eAAe;AAC3C,UAAI,WAAW,UAAU,WAAW,SAAU,CAAAA,MAAK,iBAAiB,IAAI,EAAE,CAAC,KAAG,EAAE,CAAC,GAAG,WAAW,WAAW,YAAY,EAAE,IAAG,CAAC;AAC5H,UAAI,WAAW,QAAQ;AAAC,iBAAS,GAAE,GAAE,CAAC;AAAE,cAAM,WAAW,EAAE,CAAC,KAAK,QAAQ;AAAK,YAAI,CAAC,SAAU,OAAM,MAAM,+BAA+B;AAAE,aAAG,EAAC,MAAK,aAAa,IAAI,QAAQ,CAAC,YAAW;AAAA,MAAE;AAAA,IAC5L,WAAW,WAAW,QAAQ;AAC5B,UAAI,WAAW,OAAQ,CAAAA,MAAK,MAAM,kBAAiB,GAAE,CAAC,YAAW,OAAO,CAAC,GAAE,GAAE,GAAE,CAAC,YAAW,OAAO,CAAC;AACnG,UAAI,WAAW,OAAQ,CAAAA,MAAK,MAAM,kBAAkB,IAAI,EAAE,CAAC,KAAG,EAAE,CAAC,IAAG,GAAE,CAAC,MAAM,CAAC,GAAE,GAAE,GAAE,CAAC,MAAM,CAAC;AAC5F,UAAI,WAAW,SAAU,CAAAA,MAAK,sBAAsB;AACpD,UAAI,WAAW,OAAQ,OAAM,uBAAsB,QAAO,QAAU,CAAC;AACrE,UAAI,WAAW,UAAW,OAAM,MAAM,kBAAkB,IAAI,EAAE,CAAC,KAAG,EAAE,CAAC,YAAW,GAAE,CAAC,YAAY,CAAC,GAAE,QAAO,QAAU,GAAE,GAAE,CAAC,YAAY,CAAC;AAAA,IACvI,WAAW,WAAW,WAAW;AAC/B,UAAI,WAAW,OAAQ,CAAAA,MAAK,2BAA2B;AACvD,UAAI,WAAW,WAAW;AAAC,iBAAS,GAAE,OAAO;AAAE,QAAAA,MAAK,MAAM,6BAA6B,IAAI,EAAE,CAAC,KAAG,EAAE,CAAC,YAAW,GAAE,CAAC,SAAQ,QAAQ,CAAC,GAAE,GAAE,GAAE,CAAC,SAAQ,QAAQ,CAAC;AAAA,MAAE;AAC7J,UAAI,WAAW,QAAS,OAAM,6BAA6B,IAAI,EAAE,CAAC,KAAG,EAAE,CAAC,UAAS,QAAO,QAAU,CAAC;AACnG,UAAI,WAAW,aAAc,OAAM,6BAA6B,IAAI,EAAE,CAAC,KAAG,EAAE,CAAC,IAAG,UAAS,QAAU,CAAC;AACpG,UAAI,WAAW,WAAW;AAAC,iBAAS,GAAE,GAAE,GAAE,CAAC,QAAQ,CAAC;AAAE,cAAM,SAAS,SAAS,GAAE,QAAQ;AAAE,YAAI,CAAC,aAAa,SAAQ,GAAE,uBAAsB,EAAC,OAAM,EAAE,CAAC,GAAE,OAAM,CAAC,EAAG,QAAO;AAAK,YAAI;AAChL,YAAI;AAAC,iBAAO,KAAK,MAAM,MAAMC,UAAS,QAAO,MAAM,CAAC;AAAA,QAA4B,QAAQ;AAAC,gBAAM,MAAM,8CAA8C;AAAA,QAAE;AACrJ,YAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,EAAG,OAAM,MAAM,qCAAqC;AAC/G,YAAI,KAAK,eAAe,OAAO,KAAK,gBAAgB;AAAU,qBAAW,SAAS,OAAO,OAAO,KAAK,WAAW,EAAG,KAAI,OAAO,UAAU,YAAY,MAAO,iBAAgB,KAAK,KAAK;AAAA;AACrL,YAAI,OAAO,KAAK,mBAAmB,YAAY,KAAK,eAAgB,iBAAgB,KAAK,KAAK,cAAc;AAC5G,aAAG,EAAC,MAAK,6BAA6B,IAAI,EAAE,CAAC,CAAE,CAAC,IAAG,QAAO,OAAM,KAAI;AAAA,MAAE;AAAA,IAC1E,WAAW,WAAW,cAAc,WAAW,UAAU;AAAC,UAAI,WAAW,OAAQ,CAAAD,MAAK,OAAO,MAAM,IAAG,GAAE,GAAE,WAAW,aAAa,CAAC,MAAM,IAAI,CAAC,CAAC;AAAA,IAAE,WACxI,WAAW,SAAS;AAC3B,YAAM,OAAO,uBAAuB,IAAI,EAAE,CAAC,KAAG,EAAE,CAAC;AACjD,UAAI,WAAW,OAAQ,CAAAA,MAAK,MAAM,uBAAsB,GAAE,CAAC,SAAQ,OAAO,CAAC,GAAE,GAAE,GAAE,CAAC,SAAQ,SAAQ,aAAa,CAAC;AAChH,UAAI,WAAW,UAAU,WAAW,SAAU,CAAAA,MAAK,QAAM,WAAW,WAAW,YAAY,KAAI,CAAC;AAChG,UAAI,WAAW,WAAW;AAAC,iBAAS,GAAE,cAAc;AAAE,QAAAA,MAAK,MAAM,GAAG,IAAI,iBAAgB,GAAE,CAAC,gBAAe,SAAQ,OAAO,CAAC,GAAE,GAAE,GAAE,CAAC,gBAAe,SAAQ,OAAO,CAAC;AAAA,MAAE;AAAA,IACpK,WAAW,WAAW,eAAe;AACnC,UAAI,WAAW,OAAQ,CAAAA,MAAK,mBAAkB,GAAE,GAAE,CAAC,MAAM,CAAC;AAC1D,UAAI,CAAC,QAAO,cAAa,UAAU,EAAE,SAAS,MAAM,EAAG,CAAAA,MAAK,mBAAmB,IAAI,EAAE,CAAC,KAAG,EAAE,CAAC,GAAG,WAAW,SAAS,KAAK,MAAI,MAAM,IAAG,CAAC;AAAA,IACxI,WAAW,WAAW,cAAc;AAClC,UAAI,CAAC,WAAU,UAAS,OAAO,EAAE,SAAS,MAAM,EAAG,CAAAA,MAAK,MAAM,cAAc,IAAI,EAAE,CAAC,KAAG,EAAE,CAAC,cAAc,WAAW,YAAY,KAAK,WAAW,WAAW,gBAAgB,QAAQ,IAAG,GAAE,CAAC,QAAO,kBAAkB,CAAC,GAAE,GAAE,GAAE,WAAW,UAAU,CAAC,QAAO,kBAAkB,IAAI,CAAC,MAAM,CAAC;AAClR,UAAI,WAAW,UAAW,CAAAA,MAAK,MAAM,0BAAyB,GAAE,CAAC,MAAM,GAAE,EAAC,mBAAkB,EAAE,CAAC,KAAG,IAAG,oBAAmB,EAAE,CAAC,KAAG,GAAE,CAAC,GAAE,GAAE,GAAE,CAAC,MAAM,CAAC;AAAA,IACjJ,WAAW,WAAW,gBAAgB;AACpC,UAAI,WAAW,OAAQ,CAAAA,MAAK,MAAM,oBAAmB,GAAE,CAAC,SAAQ,UAAS,mBAAkB,YAAW,MAAM,GAAE,QAAQ,OAAO,EAAC,MAAK,QAAQ,KAAI,IAAI,CAAC,CAAC,GAAE,GAAE,GAAE,CAAC,QAAO,YAAW,mBAAkB,SAAQ,QAAQ,CAAC;AACjN,UAAI,WAAW,OAAQ,CAAAA,MAAK,oBAAoB,IAAI,EAAE,CAAC,KAAG,EAAE,CAAC,IAAG,CAAC;AAAA,IACnE,WAAW,WAAW,WAAW;AAC/B,UAAI,WAAW,OAAQ,CAAAA,MAAK,aAAa;AACzC,UAAI,WAAW,YAAY,WAAW,UAAU;AAAC,iBAAS,GAAE,KAAK;AAAE,iBAAS,GAAE,GAAE,GAAE,CAAC,KAAK,CAAC;AAAE,aAAG,EAAC,MAAK,MAAM,eAAe,IAAI,EAAE,CAAC,CAAE,CAAC,IAAI,WAAW,WAAW,WAAW,OAAO,IAAG,GAAE,CAAC,KAAK,CAAC,GAAE,QAAO,WAAW,WAAW,SAAS,OAAS;AAAA,MAAE;AAAA,IAChP,WAAW,WAAW,aAAa;AACjC,UAAI,WAAW,OAAQ,CAAAA,MAAK,MAAM,uBAAsB,GAAE,CAAC,QAAO,OAAO,CAAC,GAAE,GAAE,GAAE,CAAC,QAAO,SAAQ,aAAa,CAAC;AAC9G,UAAI,WAAW,UAAW,CAAAA,MAAK,MAAM,iBAAgB,GAAE,CAAC,MAAM,CAAC,GAAE,GAAE,GAAE,CAAC,MAAM,CAAC;AAC7E,UAAI,WAAW,OAAQ,CAAAA,MAAK,iBAAiB,IAAI,EAAE,CAAC,KAAG,EAAE,CAAC,IAAG,CAAC;AAAA,IAChE,WAAW,WAAW,WAAW;AAC/B,UAAI,WAAW,OAAQ,CAAAA,MAAK,iBAAiB;AAC7C,UAAI,WAAW,QAAS,CAAAA,MAAK,mBAAmB;AAChD,UAAI,WAAW,OAAQ,CAAAA,MAAK,mBAAmB,IAAI,EAAE,CAAC,KAAG,EAAE,CAAC,IAAG,CAAC;AAChE,UAAI,WAAW,UAAW,OAAM,mBAAmB,IAAI,EAAE,CAAC,KAAG,EAAE,CAAC,YAAW,QAAO,EAAC,cAAa,EAAE,CAAC,GAAE,OAAM,EAAE,QAAQ,SAAO,aAAY,GAAE,GAAE,GAAE,CAAC,OAAO,CAAC;AAAA,IACzJ;AACA,QAAI,CAAC,GAAI,OAAM,MAAM,WAAW,MAAM,YAAY,MAAM,wBAAwB;AAChF,QAAI,GAAG,UAAU,CAAC,aAAa,SAAQ,GAAE,GAAG,MAAM,IAAI,MAAM,IAAG,EAAC,QAAO,GAAG,QAAO,MAAK,GAAG,MAAK,GAAI,WAAW,aAAa,WAAW,YAAY,EAAC,QAAO,EAAE,QAAQ,OAAM,IAAI,EAAC,MAAK,GAAG,MAAK,GAAI,EAAE,QAAQ,SAAS,EAAC,QAAO,EAAE,QAAQ,OAAM,IAAI,CAAC,EAAE,EAAE,CAAC,EAAG,QAAO;AAC9P,UAAM,OAAO,GAAG,SAAS,EAAC,QAAO,GAAG,QAAO,GAAI,GAAG,SAAS,SAAY,CAAC,IAAI,EAAC,MAAK,KAAK,UAAU,GAAG,IAAI,EAAC,EAAE,IAAI;AAC/G,QAAI,SAAS,MAAM,OAAO,QAAiB,GAAG,MAAK,IAAI;AACvD,QAAI,WAAW,WAAW,WAAW,UAAU,EAAE,QAAQ,aAAa,GAAG;AACvE,YAAM,OAAK;AACX,UAAG,MAAM,QAAQ,KAAK,KAAK,EAAE,UAAO,EAAC,GAAG,MAAK,OAAM,KAAK,MAAM,OAAO,SAAK,IAAI,gBAAc,EAAE,QAAQ,aAAa,CAAC,GAAE,kBAAiB,+CAA8C;AAAA,IACvL;AACA,QAAI,WAAW,eAAe,WAAW,UAAU,EAAE,QAAQ,aAAa,GAAG;AAC3E,UAAG,CAAC,CAAC,QAAO,OAAO,EAAE,SAAS,EAAE,QAAQ,aAAa,CAAC,EAAE,OAAM,MAAM,mCAAmC;AACvG,YAAM,OAAK;AACX,UAAG,MAAM,QAAQ,KAAK,SAAS,EAAE,UAAO,EAAC,GAAG,MAAK,WAAU,KAAK,UAAU,OAAO,SAAK,IAAI,iBAAe,EAAE,QAAQ,aAAa,MAAI,OAAO,EAAC;AAAA,IAC9I;AACA,UAAM,eAAe,EAAE,QAAQ,QAAQ,QAAQ;AAC/C,QAAI,gBAAgB,WAAW,UAAU,CAAC,YAAW,aAAa,EAAE,SAAS,MAAO,KAAK,MAAM,QAAQ,MAAM,EAAG,UAAO,OAAO,OAAO,SAAO,KAAK,SAAS,YAAY;AACtK,SAAK,GAAG,MAAM,IAAI,MAAM,IAAG,MAAM;AAAA,EACnC,SAAS,OAAO;AAAC,SAAK,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,EAAE;AAC1G,SAAO;AACT;;;AT5NA,IAAM,wBAAwB;AAE9B,IAAM,cAAc;AAAA,EAClB;AAAA,EACE;AAAA,EACF;AAAA,EACA;AACF;AAeA,SAAS,YAAY,KAA4B;AAC/C,QAAME,WAAU,QAAQ,aAAa,WAAW,SAAS,QAAQ,aAAa,UAAU,iBAAiB;AACzG,QAAM,QAAQ,MAAMA,UAAS,CAAC,GAAG,GAAG,EAAE,OAAO,UAAU,UAAU,KAAK,CAAC;AACvE,QAAM,MAAM;AACZ,SAAO,IAAI,QAAQ,CAACC,WAAS,WAAW;AACtC,UAAM,KAAK,SAAS,MAAM;AAC1B,UAAM,KAAK,QAAQ,CAAC,SAAS,SAAS,IAAIA,UAAQ,IAAI,OAAO,MAAM,wBAAwB,CAAC,CAAC;AAAA,EAC/F,CAAC;AACH;AAEA,IAAM,QAAQ,CAAC,OAAgB;AAC7B,QAAM,OAAO,CAAC,SAAiB,CAAC,SAAiB,KAAK,QAAQ,IAAI,IAAI,IAAI,YAAY;AACtF,SAAO,EAAE,MAAM,KAAK,GAAG,GAAG,KAAK,KAAK,GAAG,GAAG,QAAQ,KAAK,kBAAkB,GAAG,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,EAAE;AACjH;AAGA,eAAe,OAAO,QAAgB,cAAsB,aAA0B,SAAuB,QAAmD;AAC9J,QAAM,QAAQ,QAAQ,UAAU,CAAC,SAAiB,QAAQ,OAAO,MAAM,IAAI;AAC3E,QAAM,MAAM,QAAQ,eAAe,CAAC,CAAC,QAAQ,OAAO;AACpD,QAAM,IAAI,MAAM,GAAG;AACnB,QAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAM,cAAc,MAAM,MAAM,MAAM;AACtC,UAAQ,KAAK,UAAU,WAAW;AAClC,QAAM,SAAS,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAChE,MAAI;AACJ,MAAI;AACF,UAAM;AAAA,IAAO,EAAE,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,eAAY,CAAC;AAAA;AAAA,CAAM;AACxD,QAAI,OAAQ,OAAM,KAAK,MAAM;AAAA;AAAA,CAAM;AACnC,UAAMC,SAAQ,OAAO,QAAQ,cAAc,oBAAoB;AAAA,MAC7D;AAAA,MAAc,QAAQ,SAAS,EAAE,QAAQ,YAAY,EAAE;AAAA,MAAG,QAAQ,MAAM;AAAA,MACxE,OAAO,CAAC,QAAQ;AACd,cAAM;AAAA,IAAmD,EAAE,IAAI,4BAA4B,CAAC;AAAA,IAAO,EAAE,OAAO,GAAG,CAAC;AAAA;AAAA,CAAM;AACtH,cAAM,QAAQ,eAAe,aAAa,GAAG,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAC7D,YAAI,KAAK;AACP,cAAI,QAAQ;AACZ,gBAAMC,QAAO,MAAM,OAAO,EAAE,OAAO,OAAO,UAAU,OAAO,MAAM,CAAE,CAAC,8CAA8C,EAAE,IAAI,uBAAoB,CAAC;AAC7I,gBAAMA,MAAK,CAAC;AACZ,oBAAU,YAAY,MAAM,MAAMA,MAAK,CAAC,GAAG,EAAE;AAAA,QAC/C,MAAO,OAAM,qDAAgD;AAAA,MAC/D;AAAA,IACF,CAAC;AACD,QAAI,SAAS;AAAE,oBAAc,OAAO;AAAG,gBAAU;AAAW,YAAM,WAAW;AAAA,IAAG;AAChF,WAAO,QAAQ,YAAY,aAAa,QAAQD,OAAM,KAAK,QAAQ,KAAK;AACxE,UAAM,QAAQ,EAAE,QAAQ,KAAKA,OAAM,KAAK,SAAS,YAAY,UAAU,WAAW,WAAW,OAAOA,OAAM,OAAO,cAAcA,OAAM,aAAa;AAClJ,KAAC,QAAQ,mBAAmB,kBAAkB,EAAE,GAAG,aAAa,UAAU,MAAM,CAAC;AACjF,UAAM,MAAM,CAACA,OAAM,OAAOA,OAAM,YAAY,EAAE,OAAO,OAAO,EAAE,IAAI,CAAC,MAAM,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,QAAK,CAAC;AAC3G,UAAM,KAAK,EAAE,MAAM,QAAG,CAAC,aAAa,MAAM,OAAO,EAAE,KAAK,GAAG,CAAC,KAAK,EAAE;AAAA;AAAA,CAAM;AACzE,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,SAAS;AAAE,oBAAc,OAAO;AAAG,YAAM,WAAW;AAAA,IAAG;AAC3D,QAAI,MAAM,OAAO,SAAS;AAAE,YAAM;AAAA,CAAwB;AAAG,aAAO;AAAA,IAAW;AAC/E,UAAM,KAAK,EAAE,IAAI,QAAG,CAAC,IAAI,aAAc,MAAgB,OAAO,CAAC;AAAA,CAAI;AACnE,UAAM;AAAA,EACR,UAAE;AACA,YAAQ,eAAe,UAAU,WAAW;AAAA,EAC9C;AACF;AAGA,eAAsB,SAAS,MAAY,aAA0B,UAAwB,CAAC,GAAoB;AAChH,QAAM,MAAM,QAAQ,OAAO,QAAQ;AACnC,QAAM,SAAS,KAAK,UAAU,IAAI,oBAAoB;AACtD,QAAM,eAAe,KAAK,gBAAgB,IAAI,0BAA0B;AACxE,SAAO,MAAM,OAAO,QAAQ,cAAc,aAAa,OAAO,IAAI,IAAI;AACxE;AAEA,eAAsB,eAAe,MAAY,aAA0B,UAAwB,CAAC,GAAoB;AACtH,QAAM,MAAM,QAAQ,OAAO,QAAQ;AACnC,QAAM,QAAQ,QAAQ,UAAU,CAAC,SAAiB,QAAQ,OAAO,MAAM,IAAI;AAC3E,QAAM,SAAS,KAAK,UAAU,IAAI,oBAAoB,YAAY,UAAU,UAAU;AACtF,QAAM,eAAe,KAAK,gBAAgB,IAAI,0BAA0B;AACxE,QAAM,WAAW,KAAK,OAAO,IAAI;AACjC,QAAME,QAAO,QAAQ,mBAAmB;AACxC,MAAI,QAAQ,CAAC,YAAY,YAAY,YAAY,YAAY,SAAS,WAAW,SAAS,YAAY,WAAW;AACjH,MAAI,QAAQ;AAEZ,MAAI,CAAC,SAAS,KAAK,QAAS,OAAM,MAAM,8EAA8E;AACtH,MAAI,CAAC,SAAS,OAAO;AACnB,QAAI;AACF,aAAO,QAAQ,YAAY,aAAa,QAAQ,MAAM,KAAK,QAAQ,KAAK;AACxE,cAAQ,MAAM;AAAA,IAChB,SAAS,OAAO;AAEd,UAAI,EAAE,iBAAiB,oBAAoB,MAAM,WAAW,KAAM,OAAM;AACxE,YAAM,EAAE,UAAU,UAAU,GAAG,KAAK,IAAI;AACxC,oBAAc;AACd,MAAAA,MAAK,WAAW;AAChB,cAAQ,MAAM,OAAO,QAAQ,cAAc,aAAa,SAAS,qDAAqD;AACtH,UAAI,CAAC,MAAO,QAAO;AACnB,oBAAc,EAAE,GAAG,aAAa,UAAU,MAAM;AAChD,cAAQ,MAAM;AAAA,IAChB;AAAA,EACF;AACA,MAAI,CAAC,OAAO;AACV,YAAQ,MAAM,OAAO,QAAQ,cAAc,aAAa,OAAO;AAC/D,QAAI,CAAC,MAAO,QAAO;AACnB,kBAAc,EAAE,GAAG,aAAa,UAAU,MAAM;AAChD,YAAQ,MAAM;AAAA,EAChB;AAEA,QAAM,UAAU,EAAE,MAAc;AAChC,QAAM,SAAS,IAAI,eAAe,EAAE,QAAQ,UAAU,MAAM,QAAQ,QAAQ,QAAQ,KAAK,GAAG,OAAO,QAAQ,MAAM,CAAC;AAClH,MAAIC,QAAO,KAAK,MAAM,OAAO,KAAK;AAClC,aAAS;AACP,QAAI;AACJ,QAAI;AACJ,UAAM,SAAS,OAAO,QAAQ,OAAO,cAAc;AAAA,MACjD;AAAA,MAAQ,UAAU,QAAQ,YAAY,IAAI,gBAAgB;AAAA,MAAG,MAAAA;AAAA,MAAM;AAAA,MAAM;AAAA,MACzE,SAAS,CAAC,UAAU;AAAE,iBAAS;AAAA,MAAO;AAAA,MACtC,qBAAqB,OAAO,OAAO,YAAY;AAC7C,YAAI,UAAU,SAAS;AACrB,kBAAQ,KAAK,sBAAsB,mBAAmB,KAAK,IAAI,CAAC;AAChE,kBAAQ,KAAK,WAAW,YAAY,KAAK,IAAI,CAAC;AAC9C,iBAAO;AAAA,QACT;AACA,YAAI,UAAU,YAAY,UAAU,WAAW;AAC7C,cAAI,SAAU,OAAM,MAAM,uFAAuF;AACjH,iBAAO,UAAU,WAAW,UAAU;AACtC,kBAAQ,KAAK;AACb,iBAAO;AAAA,QACT;AACA,YAAI,UAAU,YAAY;AACxB,kBAAQ,KAAK,WAAW,QACpB,CAAC,gBAAgB,MAAM,SAAS,iBAAiB,IAAI,iBAAiB,MAAM,gBAAgB,QAAG,IAAI,QAAQ,MAAM,IAAI,QAAQ,MAAM,IAAI,MAAM,GAAG,EAAE,CAAC,QAAG,EAAE,KAAK,IAAI,IACjK,wBAAwB,QAAQ,MAAM,MAAM,GAAG,EAAE,CAAC,mBAAc,MAAM,GAAG;AAC7E,iBAAO;AAAA,QACT;AACA,YAAI,UAAU,uBAAuB,iBAAiB,KAAK,KAAK,GAAG;AACjE,gBAAM,MAAM,IAAI,IAAI,uBAAuB,YAAY,EAAE,SAAS;AAClE,gBAAM,QAAQ,eAAe,aAAa,GAAG,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAC7D,kBAAQ,KAAK,0BAA0B,GAAG;AAC1C,iBAAO;AAAA,QACT;AACA,eAAO,oBAAoB,OAAO,OAAO;AAAA,MAC3C;AAAA,IACF,CAAC;AACD,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,EAAE,UAAU,YAAY,GAAG,KAAK,IAAI;AAC1C,kBAAc;AACd,IAAAD,MAAK,WAAW;AAChB,QAAI,SAAS,UAAU;AACrB,YAAM,mGAAmG;AACzG,aAAO;AAAA,IACT;AACA,YAAQ,MAAM,OAAO,QAAQ,cAAc,aAAa,OAAO;AAC/D,QAAI,CAAC,MAAO,QAAO;AACnB,kBAAc,EAAE,GAAG,aAAa,UAAU,MAAM;AAChD,YAAQ,QAAQ,MAAM;AACtB,IAAAC,QAAO;AAAW,WAAO;AAAA,EAC3B;AACF;;;AhC3KA,SAAS,aAAa,KAAqB;AACzC,MAAI,MAAMC,SAAQ,GAAG;AACrB,aAAS;AACP,QAAIC,YAAWC,MAAK,KAAK,MAAM,CAAC,EAAG,QAAO;AAC1C,UAAM,KAAKC,SAAQ,GAAG;AACtB,QAAI,OAAO,IAAK,QAAOH,SAAQ,GAAG;AAClC,UAAM;AAAA,EACR;AACF;AAGA,SAAS,aAAa,UAAmC;AACvD,SAAO,IAAI,QAAQ,CAAC,MAAM,SAAS;AACjC,UAAM,QAAQ,QAAQ;AACtB,QAAI,CAAC,MAAM,OAAO;AAChB,WAAK,IAAI,MAAM,uDAAuD,CAAC;AACvE;AAAA,IACF;AACA,YAAQ,OAAO,MAAM,QAAQ;AAC7B,QAAI,QAAQ;AACZ,UAAM,WAAW,IAAI;AACrB,UAAM,OAAO;AACb,UAAM,SAAS,CAAC,QAAgB;AAC9B,iBAAW,MAAM,IAAI,SAAS,MAAM,GAAG;AACrC,YAAI,OAAO,QAAQ,OAAO,MAAM;AAC9B,gBAAM,WAAW,KAAK;AACtB,gBAAM,MAAM;AACZ,gBAAM,IAAI,QAAQ,MAAM;AACxB,kBAAQ,OAAO,MAAM,IAAI;AACzB,eAAK,MAAM,KAAK,CAAC;AACjB;AAAA,QACF;AACA,YAAI,OAAO,KAAU;AACnB,gBAAM,WAAW,KAAK;AACtB,kBAAQ,OAAO,MAAM,IAAI;AACzB,kBAAQ,KAAK,GAAG;AAAA,QAClB;AACA,YAAI,OAAO,OAAU,SAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,YACzC,UAAS;AAAA,MAChB;AAAA,IACF;AACA,UAAM,GAAG,QAAQ,MAAM;AAAA,EACzB,CAAC;AACH;AAEA,eAAe,MAAM,MAAqD;AACxE,QAAM,QAAQ,gBAAgB;AAC9B,MAAI,KAAK,UAAU;AACjB,UAAM,QAAQ,cAAc,KAAK,QAAQ;AACzC,QAAI,CAAC,MAAO,OAAM,IAAI,WAAW,qBAAqB,KAAK,QAAQ,aAAa,OAAO,KAAK,aAAa,EAAE,KAAK,IAAI,CAAC,GAAG;AACxH,UAAMI,OAAM,KAAK,OAAQ,MAAM,aAAa,GAAG,KAAK,QAAQ,YAAY;AACxE,QAAI,CAACA,KAAK,OAAM,IAAI,MAAM,iBAAiB;AAC3C,UAAM,UAAU,KAAK,QAAQ,IAAIA;AACjC,qBAAiB,KAAK;AACtB,YAAQ,OAAO,MAAM,cAAc,KAAK,QAAQ,2BAA2B,MAAM,CAAC,CAAC;AAAA,CAA8B;AACjH,WAAO;AAAA,EACT;AACA,MAAI,CAAC,KAAK,OAAO,CAAC,KAAK,QAAS,QAAO,SAAS,MAAM,KAAK;AAC3D,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAMA,OAAM,KAAK,OAAQ,MAAM,aAAa,iCAA4B;AACxE,MAAI,CAACA,KAAK,OAAM,IAAI,MAAM,iBAAiB;AAC3C,QAAM,YAAY,QAAQA,IAAG;AAC7B,mBAAiB,EAAE,GAAG,OAAO,UAAU,EAAE,QAAQ,KAAAA,MAAK,SAAS,MAAM,UAAU,WAAW,UAAU,EAAE,CAAC;AACvG,UAAQ,OAAO,MAAM,gBAAgB,MAAM;AAAA,CAAK;AAChD,SAAO;AACT;AAEA,SAAS,OAAO,MAA4C;AAC1D,QAAM,QAAQ,gBAAgB;AAC9B,MAAI,KAAK,UAAU;AACjB,WAAO,MAAM,UAAU,KAAK,QAAQ;AACpC,YAAQ,OAAO,MAAM,sBAAsB,KAAK,QAAQ;AAAA,CAAS;AAAA,EACnE,OAAO;AACL,WAAO,MAAM;AACb,YAAQ,OAAO,MAAM,2BAA2B;AAAA,EAClD;AACA,mBAAiB,KAAK;AACtB,SAAO;AACT;AAEA,eAAe,KAAK,MAAiC;AACnD,QAAM,OAAO,UAAU,IAAI;AAC3B,MAAI,KAAK,YAAY,QAAQ;AAC3B,YAAQ,OAAO,MAAM,QAAQ,gBAAI,OAAO;AAAA;AAAA,EAAiC,KAAK;AAAA,CAAI;AAClF,WAAO;AAAA,EACT;AACA,MAAI,KAAK,YAAY,WAAW;AAC9B,YAAQ,OAAO,MAAM,GAAG,gBAAI,OAAO;AAAA,CAAI;AACvC,WAAO;AAAA,EACT;AACA,MAAI,KAAK,YAAY,QAAS,QAAO,MAAM,IAAI;AAC/C,MAAI,KAAK,YAAY,SAAU,QAAO,OAAO,IAAI;AAEjD,QAAM,QAAQ,gBAAgB;AAC9B,MAAI,KAAK,YAAY,SAAU,QAAO,eAAe,MAAM,KAAK;AAChE,oBAAkB,OAAO,QAAQ,GAAG;AACpC,QAAM,WAAW,aAAa,QAAQ,IAAI,CAAC;AAC3C,QAAM,MAAM,MAAM,UAAU,WAAW;AACvC,MAAI,KAAK,UAAU,QAAW;AAC5B,WAAO,SAAS,EAAE,UAAU,QAAQ,KAAK,OAAO,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,OAAO,KAAK,OAAO,IAAI,CAAC;AAAA,EACrJ;AACA,SAAO,OAAO,EAAE,UAAU,UAAU,IAAIC,iBAAgB,GAAG,KAAK,QAAQ,KAAK,KAAK,OAAO,KAAK,OAAO,gBAAgB,KAAK,UAAU,cAAc,KAAK,OAAO,CAAC;AACjK;AAEA,KAAK,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAE;AAAA,EAC1B,CAAC,SAAS,QAAQ,KAAK,IAAI;AAAA,EAC3B,CAAC,QAAiB;AAChB,YAAQ,OAAO,MAAM,GAAG,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AAC5E,YAAQ,KAAK,eAAe,aAAa,IAAI,CAAC;AAAA,EAChD;AACF;",
6
+ "names": ["existsSync", "dirname", "join", "resolve", "ProcessTerminal", "mkdirSync", "writeFileSync", "join", "join", "mkdirSync", "writeFileSync", "key", "key", "relative", "resolve", "existsSync", "mkdirSync", "readFileSync", "join", "mkdirSync", "writeFileSync", "text", "offset", "omitted", "openSync", "closeSync", "mkdirSync", "readFileSync", "join", "clean", "mkdirSync", "join", "offset", "openSync", "closeSync", "readFileSync", "isAbsolute", "relative", "homedir", "basename", "dirname", "join", "resolve", "relative", "parse", "line", "parse", "relative", "flags", "root", "relative", "isAbsolute", "join", "existsSync", "readFileSync", "mkdirSync", "createHash", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "dirname", "join", "resolve", "existsSync", "readFileSync", "join", "createHash", "resolve", "mkdirSync", "dirname", "writeFileSync", "s", "relative", "resolve", "rules", "existsSync", "statSync", "isAbsolute", "relative", "resolve", "createHash", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "dirname", "join", "existsSync", "readFileSync", "writeFileSync", "SessionManager", "truncateToWidth", "visibleWidth", "color", "open", "truncateToWidth", "visibleWidth", "rgb", "relative", "isAbsolute", "resolve", "card", "existsSync", "statSync", "resolve", "key", "login", "resolve", "TuiMainScreen", "matchesKey", "wrapTextWithAnsi", "parse", "randomUUID", "basename", "join", "resolve", "resolve", "root", "stat", "read", "name", "join", "basename", "canonical", "task", "randomUUID", "line", "wrapTextWithAnsi", "TuiMainScreen", "resolve", "parse", "task", "offset", "query", "matchesKey", "line", "heading", "section", "open", "readFile", "randomUUID", "line", "parse", "readFile", "createHash", "open", "readFile", "rename", "unlink", "basename", "resolve", "offset", "read", "key", "parse", "limit", "filtered", "selectedTask", "offset", "read", "readFile", "program", "resolve", "login", "line", "save", "task", "resolve", "existsSync", "join", "dirname", "key", "ProcessTerminal"]
7
+ }