@basemachina/agentic-browser-cli 0.3.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 @@
1
+ {"version":3,"sources":["../../../src/cli/debug-logger.ts","../../../src/context/data-store.ts","../../../src/context/download-manager.ts","../../../src/cli/format.ts","../../../src/cli/options-serializer.ts","../../../src/cli/secrets-loader.ts","../../../src/logger.ts","../../../src/browser/browser-client.ts","../../../src/browser/agent-browser-imports.ts","../../../src/browser/stealth.ts","../../../src/browser/snapshot-parser.ts","../../../src/harness/error-classifier.ts","../../../src/context/memory-operations.ts","../../../src/harness/sleep.ts","../../../src/i18n/prompts/en/exploration.ts","../../../src/i18n/prompts/ja/exploration.ts","../../../src/i18n/prompts/en/review.ts","../../../src/i18n/prompts/ja/review.ts","../../../src/i18n/prompts/en/selector.ts","../../../src/i18n/prompts/ja/selector.ts","../../../src/i18n/prompts/en/goal-agent.ts","../../../src/i18n/prompts/ja/goal-agent.ts","../../../src/i18n/prompts/en/vision.ts","../../../src/i18n/prompts/ja/vision.ts","../../../src/i18n/prompts/en/maintenance.ts","../../../src/i18n/prompts/ja/maintenance.ts","../../../src/i18n/prompts/index.ts","../../../src/harness/report-sections.ts","../../../src/browser/snapshot-filter.ts"],"sourcesContent":["/**\n * cli/debug-logger — デバッグログのJSONLファイル出力 + コンソール出力\n *\n * --debug-log <path> 指定時にファイルロガーが有効化。\n * --debug 指定時にコンソールロガーが有効化。\n * null-object パターンにより、呼び出し側は分岐不要。\n */\n\nimport { appendFile, writeFile } from \"node:fs/promises\";\nimport * as p from \"@clack/prompts\";\n\nexport interface DebugLogEntry {\n phase: \"generator\" | \"executor\";\n event: string;\n step?: number;\n data: Record<string, unknown>;\n}\n\nexport interface DebugLogger {\n log(entry: DebugLogEntry): void;\n flush(): Promise<void>;\n}\n\nclass FileDebugLogger implements DebugLogger {\n private buffer: string[] = [];\n private writing = false;\n private pending: Promise<void> = Promise.resolve();\n private initialized = false;\n\n constructor(private filePath: string) {}\n\n log(entry: DebugLogEntry): void {\n const line = JSON.stringify({ ts: new Date().toISOString(), ...entry });\n this.buffer.push(line);\n this.scheduleWrite();\n }\n\n async flush(): Promise<void> {\n await this.pending;\n if (this.buffer.length > 0) {\n await this.writeBuffer();\n }\n }\n\n private scheduleWrite(): void {\n if (this.writing) return;\n this.pending = this.writeBuffer();\n }\n\n private async writeBuffer(): Promise<void> {\n if (this.buffer.length === 0) return;\n this.writing = true;\n const lines = this.buffer.splice(0, this.buffer.length);\n const content = lines.join(\"\\n\") + \"\\n\";\n try {\n if (!this.initialized) {\n await writeFile(this.filePath, content, \"utf-8\");\n this.initialized = true;\n } else {\n await appendFile(this.filePath, content, \"utf-8\");\n }\n } catch {\n // ログ書き込み失敗は操作をブロックしない\n }\n this.writing = false;\n // バッファに追加分があれば再度書き込み\n if (this.buffer.length > 0) {\n this.pending = this.writeBuffer();\n }\n }\n}\n\n/** コンソールにデバッグ情報を出力する実装 */\nclass ConsoleDebugLogger implements DebugLogger {\n log(entry: DebugLogEntry): void {\n const stepPrefix = entry.step !== undefined ? `step#${entry.step}` : \"\";\n const prefix = `[debug] [${entry.event}]${stepPrefix ? ` ${stepPrefix}` : \"\"}`;\n\n switch (entry.event) {\n case \"extract\":\n case \"extract_result\":\n this.logExtract(prefix, entry.data);\n break;\n case \"memory_append\":\n this.logMemoryAppend(prefix, entry.data);\n break;\n case \"memory_aggregate\":\n this.logMemoryAggregate(prefix, entry.data);\n break;\n case \"export\":\n this.logExport(prefix, entry.data);\n break;\n case \"action\":\n this.logAction(prefix, entry.data);\n break;\n default:\n this.logGeneric(prefix, entry.data);\n break;\n }\n }\n\n async flush(): Promise<void> {\n // コンソール出力は即時なので flush 不要\n }\n\n private logExtract(prefix: string, data: Record<string, unknown>): void {\n if (data.script) {\n p.log.info(`${prefix} script: \"${truncate(String(data.script), 120)}\"`);\n }\n if (data.extractPrompt) {\n p.log.info(`${prefix} extractPrompt: \"${truncate(String(data.extractPrompt), 120)}\"`);\n }\n if (data.resultType !== undefined) {\n const typeInfo = data.isArray\n ? `${data.resultType} (array), length: ${data.arrayLength}`\n : String(data.resultType);\n p.log.info(`${prefix} result typeof: \"${typeInfo}\"`);\n }\n if (data.resultPreview !== undefined) {\n p.log.info(`${prefix} result preview: ${truncate(String(data.resultPreview), 200)}`);\n }\n if (data.storedLength !== undefined) {\n const note = data.stringifyApplied ? \" ← JSON.stringify applied\" : \"\";\n p.log.info(`${prefix} stored as string (length: ${data.storedLength})${note}`);\n }\n }\n\n private logMemoryAppend(prefix: string, data: Record<string, unknown>): void {\n if (data.collection) {\n p.log.info(`${prefix} collection: \"${data.collection}\"`);\n }\n if (data.rawValuePreview !== undefined) {\n p.log.info(`${prefix} rawValue preview (200 chars): ${truncate(String(data.rawValuePreview), 200)}`);\n }\n if (data.doubleStringifyDetected) {\n p.log.warn(`${prefix} double-stringify detected! Unquoting before parse.`);\n }\n if (data.parseResult !== undefined) {\n const result = data.parseResult as string;\n if (result === \"array\") {\n p.log.info(\n `${prefix} JSON.parse OK → Array(${data.arrayLength}), element[0] keys: ${data.firstElementKeys ?? \"N/A\"}`,\n );\n } else if (result === \"object\") {\n p.log.info(`${prefix} JSON.parse OK → Object, keys: ${data.objectKeys ?? \"N/A\"}`);\n } else if (result === \"fallback\") {\n p.log.warn(`${prefix} JSON.parse FAILED → storing as {value: \"...\"}`);\n }\n }\n if (data.count !== undefined && data.parseResult === undefined) {\n p.log.info(`${prefix} stored ${data.count} items`);\n }\n }\n\n private logMemoryAggregate(prefix: string, data: Record<string, unknown>): void {\n p.log.info(\n `${prefix} ${data.operation}(${data.collection}.${data.field}) = \"${data.result}\" → {{${data.outputVariable}}}`,\n );\n }\n\n private logExport(prefix: string, data: Record<string, unknown>): void {\n p.log.info(`${prefix} collection: \"${data.collection}\", items: ${data.itemCount}, format: ${data.format}`);\n if (data.sampleKeys) {\n p.log.info(`${prefix} sample keys: ${data.sampleKeys}`);\n }\n if (data.path) {\n p.log.info(`${prefix} → ${data.path}`);\n }\n }\n\n private logAction(prefix: string, data: Record<string, unknown>): void {\n p.log.info(\n `${prefix} type=${data.type} ref=${data.ref ?? \"N/A\"} value=\"${truncate(String(data.value ?? \"\"), 80)}\" status=${data.status}`,\n );\n }\n\n private logGeneric(prefix: string, data: Record<string, unknown>): void {\n const preview = JSON.stringify(data);\n p.log.info(`${prefix} ${truncate(preview, 200)}`);\n }\n}\n\n/** 複数のロガーに委譲する Composite 実装 */\nclass CompositeDebugLogger implements DebugLogger {\n constructor(private loggers: DebugLogger[]) {}\n\n log(entry: DebugLogEntry): void {\n for (const logger of this.loggers) {\n logger.log(entry);\n }\n }\n\n async flush(): Promise<void> {\n await Promise.all(this.loggers.map((l) => l.flush()));\n }\n}\n\n/** ログ無効時の noop 実装 */\nexport const noopLogger: DebugLogger = {\n log() {},\n async flush() {},\n};\n\n/** 文字列を指定長で切り詰め */\nfunction truncate(str: string, maxLen: number): string {\n if (str.length <= maxLen) return str;\n return `${str.slice(0, maxLen)}...`;\n}\n\n/**\n * デバッグロガーを生成\n *\n * @param opts.filePath JSONL ファイル出力先パス\n * @param opts.console コンソール出力を有効にするか\n */\nexport function createDebugLogger(opts?: {\n filePath?: string;\n console?: boolean;\n}): DebugLogger {\n if (!opts) return noopLogger;\n\n const loggers: DebugLogger[] = [];\n\n if (opts.filePath) {\n loggers.push(new FileDebugLogger(opts.filePath));\n }\n if (opts.console) {\n loggers.push(new ConsoleDebugLogger());\n }\n\n if (loggers.length === 0) return noopLogger;\n if (loggers.length === 1) return loggers[0];\n return new CompositeDebugLogger(loggers);\n}\n","/**\n * data-store — データ蓄積と集計のインターフェース + インメモリ実装\n *\n * DataStore: データの蓄積・取得を抽象化\n * DataAggregator: 集計操作を抽象化\n * InMemoryDataStore: 初期のインメモリ実装(将来 DuckDB 等に差し替え可能)\n */\n\nimport { writeFile } from \"node:fs/promises\";\n\n// ── 型定義 ──\n\nexport type AggregateOperation =\n | \"sum\"\n | \"count\"\n | \"concat\"\n | \"min\"\n | \"max\"\n | \"avg\"\n | \"unique_count\";\n\nexport interface AggregateQuery {\n collection: string;\n field: string;\n operation: AggregateOperation;\n /** 将来拡張: WHERE 条件 */\n filter?: Record<string, unknown>;\n}\n\n// ── インターフェース ──\n\nexport interface DataStore {\n append(collection: string, item: Record<string, unknown>): void;\n extend(collection: string, items: Record<string, unknown>[]): void;\n getAll(collection: string): Record<string, unknown>[];\n count(collection: string): number;\n clear(collection: string): void;\n listCollections(): string[];\n toJSON(): Record<string, Record<string, unknown>[]>;\n /** コレクションをファイルに書き出し */\n writeToFile(collection: string, path: string, format: \"json\" | \"csv\"): Promise<void>;\n}\n\nexport interface DataAggregator {\n aggregate(query: AggregateQuery): string;\n}\n\n// ── インメモリ実装 ──\n\nexport class InMemoryDataStore implements DataStore, DataAggregator {\n private collections = new Map<string, Record<string, unknown>[]>();\n\n append(collection: string, item: Record<string, unknown>): void {\n const items = this.collections.get(collection) ?? [];\n items.push(item);\n this.collections.set(collection, items);\n }\n\n extend(collection: string, newItems: Record<string, unknown>[]): void {\n const items = this.collections.get(collection) ?? [];\n items.push(...newItems);\n this.collections.set(collection, items);\n }\n\n getAll(collection: string): Record<string, unknown>[] {\n return this.collections.get(collection) ?? [];\n }\n\n count(collection: string): number {\n return (this.collections.get(collection) ?? []).length;\n }\n\n clear(collection: string): void {\n this.collections.delete(collection);\n }\n\n listCollections(): string[] {\n return Array.from(this.collections.keys());\n }\n\n toJSON(): Record<string, Record<string, unknown>[]> {\n const result: Record<string, Record<string, unknown>[]> = {};\n for (const [key, items] of this.collections) {\n result[key] = items;\n }\n return result;\n }\n\n aggregate(query: AggregateQuery): string {\n const items = this.getAll(query.collection);\n if (items.length === 0) return \"0\";\n\n const values = items.map((item) => item[query.field]);\n\n switch (query.operation) {\n case \"sum\": {\n const total = values.reduce(\n (acc: number, v) => acc + (Number(v) || 0),\n 0,\n );\n return String(total);\n }\n case \"count\":\n return String(values.length);\n case \"concat\":\n return values.map(String).join(\", \");\n case \"min\": {\n const nums = values.map(Number).filter((n) => !Number.isNaN(n));\n return nums.length > 0 ? String(Math.min(...nums)) : \"0\";\n }\n case \"max\": {\n const nums = values.map(Number).filter((n) => !Number.isNaN(n));\n return nums.length > 0 ? String(Math.max(...nums)) : \"0\";\n }\n case \"avg\": {\n const nums = values.map(Number).filter((n) => !Number.isNaN(n));\n if (nums.length === 0) return \"0\";\n const sum = nums.reduce((a, b) => a + b, 0);\n return String(sum / nums.length);\n }\n case \"unique_count\": {\n const unique = new Set(values.map(String));\n return String(unique.size);\n }\n }\n }\n\n /**\n * コレクションごとのメモリ圧迫状況を返す。\n * low: <1000, medium: 1000-5000, high: >5000\n */\n getPressureStatus(): Record<string, { count: number; pressure: \"low\" | \"medium\" | \"high\" }> {\n const result: Record<string, { count: number; pressure: \"low\" | \"medium\" | \"high\" }> = {};\n for (const [name, items] of this.collections) {\n const count = items.length;\n const pressure = count >= 5000 ? \"high\" : count >= 1000 ? \"medium\" : \"low\";\n result[name] = { count, pressure };\n }\n return result;\n }\n\n /** コレクションを CSV 文字列として出力 */\n toCSV(collection: string): string {\n const items = this.getAll(collection);\n if (items.length === 0) return \"\";\n\n // 全アイテムからキーを収集(順序保持)\n const keys = new Set<string>();\n for (const item of items) {\n for (const key of Object.keys(item)) {\n keys.add(key);\n }\n }\n const headers = Array.from(keys);\n\n const escapeCSV = (val: unknown): string => {\n const str = val === null || val === undefined ? \"\" : String(val);\n if (str.includes(\",\") || str.includes('\"') || str.includes(\"\\n\")) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n };\n\n const rows = items.map((item) =>\n headers.map((h) => escapeCSV(item[h])).join(\",\"),\n );\n return [headers.join(\",\"), ...rows].join(\"\\n\");\n }\n\n /** コレクションをファイルに書き出し */\n async writeToFile(\n collection: string,\n path: string,\n format: \"json\" | \"csv\",\n ): Promise<void> {\n const content =\n format === \"csv\"\n ? this.toCSV(collection)\n : JSON.stringify(this.getAll(collection), null, 2);\n await writeFile(path, content, \"utf-8\");\n }\n}\n","/**\n * download-manager — ファイルダウンロードの追跡と結合\n *\n * OutputStorage: ファイルI/Oの抽象化(将来 S3/GCS 対応用)\n * LocalStorage: ローカルファイルシステム実装\n * DownloadManager: ダウンロード追跡 + CSV マージ\n */\n\nimport { readFile, writeFile, mkdir, stat } from \"node:fs/promises\";\nimport { join, basename } from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\n\n// ── 型定義 ──\n\nexport interface DownloadRecord {\n id: string;\n path: string;\n filename: string;\n stepOrdinal: number;\n timestamp: string;\n sizeBytes?: number;\n}\n\n// ── OutputStorage インターフェース ──\n\nexport interface OutputStorage {\n write(filename: string, content: Buffer | string): Promise<string>;\n read(filename: string): Promise<Buffer>;\n exists(filename: string): Promise<boolean>;\n}\n\nexport class LocalStorage implements OutputStorage {\n constructor(private baseDir: string) {}\n\n async write(filename: string, content: Buffer | string): Promise<string> {\n await mkdir(this.baseDir, { recursive: true });\n const filePath = join(this.baseDir, filename);\n await writeFile(filePath, content);\n return filePath;\n }\n\n async read(filename: string): Promise<Buffer> {\n const filePath = join(this.baseDir, filename);\n return readFile(filePath);\n }\n\n async exists(filename: string): Promise<boolean> {\n try {\n await stat(join(this.baseDir, filename));\n return true;\n } catch {\n return false;\n }\n }\n}\n\n// ── DownloadManager ──\n\nexport class DownloadManager {\n private downloads: DownloadRecord[] = [];\n private storage: OutputStorage;\n\n constructor(outputDir: string) {\n this.storage = new LocalStorage(outputDir);\n }\n\n addDownload(\n record: Omit<DownloadRecord, \"id\">,\n ): DownloadRecord {\n const download: DownloadRecord = {\n ...record,\n id: randomUUID(),\n };\n this.downloads.push(download);\n return download;\n }\n\n getDownloads(): DownloadRecord[] {\n return [...this.downloads];\n }\n\n getDownloadsByStep(stepOrdinal: number): DownloadRecord[] {\n return this.downloads.filter((d) => d.stepOrdinal === stepOrdinal);\n }\n\n /**\n * 複数のダウンロード済みCSVファイルを結合する。\n * 1つ目のファイルのヘッダを使用し、2つ目以降はヘッダ行をスキップ。\n */\n async mergeCSVFiles(\n downloadIds: string[],\n outputFilename: string,\n ): Promise<string> {\n const targets = downloadIds\n .map((id) => this.downloads.find((d) => d.id === id))\n .filter((d): d is DownloadRecord => d !== undefined);\n\n if (targets.length === 0) {\n throw new Error(\"No downloads found for the given IDs\");\n }\n\n const chunks: string[] = [];\n let headerLine: string | null = null;\n\n for (let i = 0; i < targets.length; i++) {\n const content = await readFile(targets[i].path, \"utf-8\");\n const lines = content.split(\"\\n\").filter((l) => l.trim().length > 0);\n\n if (lines.length === 0) continue;\n\n if (i === 0) {\n // 1つ目: ヘッダ含む全行\n headerLine = lines[0];\n chunks.push(content.trimEnd());\n } else {\n // 2つ目以降: ヘッダ行をスキップ\n const dataLines = lines.slice(1);\n if (dataLines.length > 0) {\n chunks.push(dataLines.join(\"\\n\"));\n }\n }\n }\n\n const merged = chunks.join(\"\\n\") + \"\\n\";\n const outputPath = await this.storage.write(outputFilename, merged);\n return outputPath;\n }\n\n /** 全ダウンロードの ID 一覧 */\n getAllDownloadIds(): string[] {\n return this.downloads.map((d) => d.id);\n }\n\n /** ダウンロードのファイルパス一覧 */\n getAllPaths(): string[] {\n return this.downloads.map((d) => d.path);\n }\n}\n","/**\n * cli/format --- 共通フォーマットユーティリティ\n */\n\nexport function formatDuration(ms: number): string {\n return ms >= 1000 ? `${(ms / 1000).toFixed(1)}s` : `${Math.round(ms)}ms`;\n}\n","/**\n * options-serializer — CLI オプションを Markdown レポート向けにシリアライズ\n *\n * secrets の値は出力せず件数のみ、contextMarkdown は行数のみ表示する。\n */\n\nimport type { GeneratorConfig } from \"../instruction-generator/types\";\nimport type { ExecutorConfig } from \"../instruction-executor/types\";\nimport type { AIModelConfig } from \"../harness/ai-model\";\n\nexport interface SerializedOption {\n name: string;\n value: string;\n}\n\nexport function serializeGeneratorOptions(config: GeneratorConfig): SerializedOption[] {\n const opts: SerializedOption[] = [];\n\n opts.push({ name: \"--url\", value: config.url });\n opts.push({ name: \"--goal\", value: config.goal });\n opts.push({ name: \"--output\", value: config.output });\n opts.push({ name: \"--headless\", value: String(config.headless) });\n opts.push({ name: \"--max-iterations\", value: String(config.maxIterations) });\n opts.push({ name: \"--step-delay\", value: `${config.stepDelay}ms` });\n opts.push({ name: \"--stall-check-interval\", value: String(config.stallCheckInterval) });\n opts.push({ name: \"--history-window\", value: String(config.historyWindow) });\n opts.push({ name: \"--max-failures\", value: String(config.maxConsecutiveFailures) });\n opts.push({ name: \"--snapshot-filter\", value: String(config.snapshotFilter) });\n\n if (config.screenshotDir) {\n opts.push({ name: \"--screenshots\", value: config.screenshotDir });\n }\n if (config.contextMarkdown) {\n opts.push({ name: \"--context\", value: `loaded (${config.contextMarkdown.split(\"\\n\").length} lines)` });\n }\n if (config.secrets && Object.keys(config.secrets.values).length > 0) {\n opts.push({ name: \"--secrets\", value: `${Object.keys(config.secrets.values).length} keys` });\n }\n if (config.debugLogPath) {\n opts.push({ name: \"--debug-log\", value: config.debugLogPath });\n }\n if (config.debugConsole) {\n opts.push({ name: \"--debug\", value: \"true\" });\n }\n if (config.stealth) {\n opts.push({ name: \"--stealth\", value: \"true\" });\n }\n if (config.proxy) {\n opts.push({ name: \"--proxy\", value: config.proxy });\n }\n if (config.videoDir) {\n opts.push({ name: \"--video\", value: config.videoDir });\n }\n\n serializeModelConfig(opts, config.aiModelConfig);\n\n return opts;\n}\n\nexport function serializeExecutorOptions(config: ExecutorConfig): SerializedOption[] {\n const opts: SerializedOption[] = [];\n\n opts.push({ name: \"--instruction\", value: config.instructionPath });\n opts.push({ name: \"--headless\", value: String(config.headless) });\n\n if (config.stepDelay !== undefined) {\n opts.push({ name: \"--step-delay\", value: `${config.stepDelay}ms` });\n }\n if (config.screenshotDir) {\n opts.push({ name: \"--screenshots\", value: config.screenshotDir });\n }\n if (config.contextMarkdown) {\n opts.push({ name: \"--context\", value: `loaded (${config.contextMarkdown.split(\"\\n\").length} lines)` });\n }\n if (config.secrets && Object.keys(config.secrets.values).length > 0) {\n opts.push({ name: \"--secrets\", value: `${Object.keys(config.secrets.values).length} keys` });\n }\n if (config.skipConfirmation) {\n opts.push({ name: \"--skip-confirmation\", value: \"true\" });\n }\n if (config.dataFilePath) {\n opts.push({ name: \"--data\", value: config.dataFilePath });\n }\n if (config.reuseSession === false) {\n opts.push({ name: \"--no-reuse-session\", value: \"true\" });\n }\n if (config.debugLogPath) {\n opts.push({ name: \"--debug-log\", value: config.debugLogPath });\n }\n if (config.debugConsole) {\n opts.push({ name: \"--debug\", value: \"true\" });\n }\n if (config.approvalMode && config.approvalMode !== \"cli\") {\n opts.push({ name: \"--approval-mode\", value: config.approvalMode });\n }\n if (config.notifyMode) {\n opts.push({ name: \"--notify\", value: config.notifyMode });\n }\n if (config.enableSelectorCache) {\n opts.push({ name: \"--enable-selector-cache\", value: \"true\" });\n }\n if (config.enableAgentFallback) {\n opts.push({ name: \"--enable-agent-fallback\", value: \"true\" });\n }\n if (config.enableVisionFallback) {\n opts.push({ name: \"--enable-vision-fallback\", value: \"true\" });\n }\n if (config.outputDir) {\n opts.push({ name: \"--output-dir\", value: config.outputDir });\n }\n if (config.mergeDownloads) {\n opts.push({ name: \"--merge-downloads\", value: \"true\" });\n }\n if (config.maintenance) {\n opts.push({ name: \"--maintenance\", value: \"true\" });\n }\n if (config.maxRetries !== undefined) {\n opts.push({ name: \"--max-retries\", value: String(config.maxRetries) });\n }\n if (config.retryWarningThreshold !== undefined) {\n opts.push({ name: \"--retry-warning-threshold\", value: String(config.retryWarningThreshold) });\n }\n if (config.forceReport) {\n opts.push({ name: \"--report\", value: \"true\" });\n }\n if (config.videoDir) {\n opts.push({ name: \"--video\", value: config.videoDir });\n }\n if (config.callbackPort !== undefined) {\n opts.push({ name: \"--callback-port\", value: String(config.callbackPort) });\n }\n if (config.approvalTimeoutMs !== undefined) {\n opts.push({ name: \"--approval-timeout\", value: `${config.approvalTimeoutMs}ms` });\n }\n if (config.stealth) {\n opts.push({ name: \"--stealth\", value: \"true\" });\n }\n if (config.proxy) {\n opts.push({ name: \"--proxy\", value: config.proxy });\n }\n\n serializeModelConfig(opts, config.aiModelConfig);\n\n return opts;\n}\n\nconst MODEL_OVERRIDE_FLAGS: Record<string, string> = {\n selector: \"--model-selector\",\n extraction: \"--model-extraction\",\n exploration: \"--model-exploration\",\n review: \"--model-review\",\n fallback: \"--model-fallback\",\n vision: \"--model-vision\",\n};\n\nfunction serializeModelConfig(opts: SerializedOption[], aiModelConfig?: AIModelConfig): void {\n if (!aiModelConfig) return;\n opts.push({ name: \"--model\", value: aiModelConfig.modelId });\n opts.push({ name: \"--model-provider\", value: aiModelConfig.provider });\n if (aiModelConfig.baseURL) {\n opts.push({ name: \"--model-base-url\", value: aiModelConfig.baseURL });\n }\n if (aiModelConfig.modelOverrides) {\n for (const [purpose, modelId] of Object.entries(aiModelConfig.modelOverrides)) {\n const flag = MODEL_OVERRIDE_FLAGS[purpose];\n if (flag && modelId) {\n opts.push({ name: flag, value: modelId });\n }\n }\n }\n}\n\nexport function renderOptionsMarkdown(options: SerializedOption[]): string[] {\n if (options.length === 0) return [];\n\n const lines: string[] = [];\n for (const opt of options) {\n lines.push(`- \\`${opt.name}\\`: ${opt.value}`);\n }\n return lines;\n}\n","/**\n * cli/secrets-loader --- secrets JSON ファイルの読み込み\n *\n * key-value 形式の JSON を読み込み、全値を sensitive 扱いで管理する。\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { cancel } from \"./prompts\";\n\nexport interface SecretsData {\n /** 変数名→値のマップ */\n values: Record<string, string>;\n /** すべてのキー(全て sensitive 扱い) */\n keys: Set<string>;\n}\n\n/**\n * secrets JSON ファイルを読み込み、バリデーション後に返す。\n * パスが未指定の場合は空の SecretsData を返す。\n */\nexport async function loadSecrets(path?: string): Promise<SecretsData> {\n if (!path) {\n return { values: {}, keys: new Set() };\n }\n\n const raw = await readFile(path, \"utf-8\").catch(() => {\n cancel(`secrets ファイルが読み込めません: ${path}`);\n process.exit(1);\n });\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n cancel(`secrets ファイルの JSON パースに失敗しました: ${path}`);\n process.exit(1);\n }\n\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n cancel('secrets ファイルはオブジェクト形式 {\"key\": \"value\"} である必要があります');\n process.exit(1);\n }\n\n const values: Record<string, string> = {};\n for (const [key, val] of Object.entries(parsed as Record<string, unknown>)) {\n if (typeof val !== \"string\") {\n cancel(`secrets の値は文字列である必要があります (key: \"${key}\")`);\n process.exit(1);\n }\n values[key] = val;\n }\n\n return {\n values,\n keys: new Set(Object.keys(values)),\n };\n}\n","/**\n * logger — ログ出力の抽象化\n *\n * SDK から @clack/prompts への直接依存を除去するためのインターフェース。\n * CLI は CliLogger / CliSpinner で @clack/prompts をデリゲートし、\n * SDK / テストは NoopLogger や CallbackLogger を利用する。\n */\n\nexport interface Logger {\n step(message: string): void;\n success(message: string): void;\n error(message: string): void;\n warn(message: string): void;\n info(message: string): void;\n debug(message: string): void;\n}\n\nexport interface SpinnerLike {\n start(message: string): void;\n stop(message: string): void;\n}\n\nexport interface LoggerFactory {\n createLogger(): Logger;\n createSpinner(): SpinnerLike;\n}\n\n// ── NoopLogger ──\n\nexport class NoopLogger implements Logger {\n step(_message: string): void {}\n success(_message: string): void {}\n error(_message: string): void {}\n warn(_message: string): void {}\n info(_message: string): void {}\n debug(_message: string): void {}\n}\n\nexport class NoopSpinner implements SpinnerLike {\n start(_message: string): void {}\n stop(_message: string): void {}\n}\n\nexport const noopLoggerFactory: LoggerFactory = {\n createLogger: () => new NoopLogger(),\n createSpinner: () => new NoopSpinner(),\n};\n\n// ── CallbackLogger ──\n\nexport type LogLevel = \"step\" | \"success\" | \"error\" | \"warn\" | \"info\" | \"debug\";\n\nexport class CallbackLogger implements Logger {\n constructor(private readonly onLog: (level: LogLevel, message: string) => void) {}\n\n step(message: string): void {\n this.onLog(\"step\", message);\n }\n success(message: string): void {\n this.onLog(\"success\", message);\n }\n error(message: string): void {\n this.onLog(\"error\", message);\n }\n warn(message: string): void {\n this.onLog(\"warn\", message);\n }\n info(message: string): void {\n this.onLog(\"info\", message);\n }\n debug(message: string): void {\n this.onLog(\"debug\", message);\n }\n}\n","/**\n * agent-browser 内部API直接利用ラッパー\n *\n * BrowserManager + executeCommand() でインプロセス実行。\n * CLI子プロセス呼び出しを排除。\n */\n\nimport { mkdir, readFile, unlink } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { type ChildProcess, spawn, execSync } from \"node:child_process\";\nimport { BrowserManager, executeCommand } from \"./agent-browser-imports\";\nimport type {\n Command,\n LaunchCommand,\n Response,\n RefMap,\n SnapshotOptions,\n Annotation,\n ScreenshotData,\n ScreencastFrame,\n} from \"./agent-browser-imports\";\nimport type { Logger } from \"../logger\";\nimport { NoopLogger } from \"../logger\";\nimport type { ExplorationAction, StepResult } from \"../instruction-generator/types\";\nimport { applyStealthScripts } from \"./stealth\";\n\nexport interface BrowserOpenOptions {\n headless?: boolean;\n stealth?: boolean;\n proxy?: string;\n colorScheme?: \"light\" | \"dark\" | \"no-preference\";\n downloadPath?: string;\n}\n\n/**\n * プロキシ URL を LaunchCommand.proxy 形式にパースする。\n * 対応形式: http://user:pass@host:port, socks5://host:port, http://host:port\n */\nfunction parseProxyUrl(\n proxyUrl: string,\n): { server: string; username?: string; password?: string } {\n try {\n const url = new URL(proxyUrl);\n const server = `${url.protocol}//${url.hostname}${url.port ? `:${url.port}` : \"\"}`;\n const username = url.username || undefined;\n const password = url.password || undefined;\n return { server, username, password };\n } catch {\n // パース失敗時はそのまま server として扱う\n return { server: proxyUrl };\n }\n}\n\nlet commandId = 0;\nfunction nextId(): string {\n return String(++commandId);\n}\n\n/** CDP Screencast の FPS(フレームポンプ間隔の基準) */\nconst SCREENCAST_FPS = 5;\n/** フレームポンプ間隔 (ms) */\nconst FRAME_PUMP_INTERVAL_MS = Math.round(1000 / SCREENCAST_FPS);\n/** screencast 回復ポーリング間隔 (ms) */\nconst SCREENCAST_RECOVERY_INTERVAL_MS = 500;\n\nexport class AgentBrowser {\n private browser = new BrowserManager();\n private logger: Logger;\n\n // CDP Screencast + ffmpeg 録画用プロパティ\n private ffmpegProcess: ChildProcess | null = null;\n private latestFrame: Buffer | null = null;\n private framePumpInterval: ReturnType<typeof setInterval> | null = null;\n private screencastRecoveryInterval: ReturnType<typeof setInterval> | null = null;\n private isScreencastRecording = false;\n private screencastOutputPath: string | null = null;\n\n constructor(logger?: Logger) {\n this.logger = logger ?? new NoopLogger();\n }\n\n /**\n * executeCommand のラッパー。失敗時はthrow。\n */\n private async exec(command: Command): Promise<Response> {\n const response = await executeCommand(command, this.browser);\n if (!response.success) {\n throw new Error(response.error);\n }\n return response;\n }\n\n async open(url: string, options?: BrowserOpenOptions): Promise<void> {\n if (!this.browser.isLaunched()) {\n const launchCommand = {\n id: nextId(),\n action: \"launch\" as const,\n headless: options?.headless ?? true,\n viewport: { width: 1280, height: 720 },\n colorScheme: options?.colorScheme,\n downloadPath: options?.downloadPath,\n proxy: options?.proxy ? parseProxyUrl(options.proxy) : undefined,\n } satisfies LaunchCommand & { colorScheme?: string; downloadPath?: string };\n\n await this.browser.launch(launchCommand);\n\n if (options?.stealth) {\n await applyStealthScripts(this.browser.getPage());\n this.logger.debug(\"[stealth] patches applied\");\n }\n }\n await this.exec({ id: nextId(), action: \"navigate\", url });\n }\n\n async snapshot(options?: SnapshotOptions): Promise<string> {\n const result = await this.browser.getSnapshot({ compact: true, cursor: true, ...options });\n return result.tree;\n }\n\n async snapshotWithRefs(options?: SnapshotOptions): Promise<{ tree: string; refs: RefMap }> {\n const result = await this.browser.getSnapshot({ compact: true, cursor: true, ...options });\n return { tree: result.tree, refs: result.refs };\n }\n\n async click(ref: string): Promise<void> {\n await this.exec({ id: nextId(), action: \"click\", selector: ref });\n }\n\n async fill(ref: string, value: string): Promise<void> {\n await this.exec({ id: nextId(), action: \"fill\", selector: ref, value });\n }\n\n async type(ref: string, text: string): Promise<void> {\n await this.exec({\n id: nextId(),\n action: \"type\",\n selector: ref,\n text,\n });\n }\n\n async select(ref: string, value: string): Promise<void> {\n await this.exec({\n id: nextId(),\n action: \"select\",\n selector: ref,\n values: value,\n });\n }\n\n async check(ref: string): Promise<void> {\n await this.exec({ id: nextId(), action: \"check\", selector: ref });\n }\n\n async uncheck(ref: string): Promise<void> {\n await this.exec({ id: nextId(), action: \"uncheck\", selector: ref });\n }\n\n async navigate(url: string): Promise<void> {\n await this.exec({ id: nextId(), action: \"navigate\", url });\n }\n\n async wait(ms: number): Promise<void> {\n await this.exec({ id: nextId(), action: \"wait\", timeout: ms });\n }\n\n async scroll(direction: string, amount = 500, options?: { selector?: string }): Promise<void> {\n await this.exec({\n id: nextId(),\n action: \"scroll\",\n direction: direction as \"up\" | \"down\" | \"left\" | \"right\",\n amount,\n selector: options?.selector,\n });\n }\n\n async screenshot(\n path: string,\n options?: { annotate?: boolean; fullPage?: boolean },\n ): Promise<Annotation[]> {\n const response = await this.exec({\n id: nextId(),\n action: \"screenshot\",\n path,\n ...options,\n });\n const data = (response as { data?: ScreenshotData }).data;\n return data?.annotations ?? [];\n }\n\n /**\n * アノテーション付きスクリーンショットを撮影し、画像バッファとアノテーション配列を返す。\n * Vision Fallback 用: AI にスクリーンショットを渡して視覚的にセレクタを解決する。\n */\n async screenshotWithAnnotations(): Promise<{\n imageBuffer: Buffer;\n annotations: Annotation[];\n }> {\n const tempPath = join(tmpdir(), `vision-fallback-${Date.now()}.png`);\n const annotations = await this.screenshot(tempPath, { annotate: true });\n const imageBuffer = await readFile(tempPath);\n unlink(tempPath).catch(() => {}); // fire-and-forget cleanup\n return { imageBuffer, annotations };\n }\n\n async download(selector: string, savePath: string): Promise<string> {\n await this.exec({\n id: nextId(),\n action: \"download\",\n selector,\n path: savePath,\n });\n return savePath;\n }\n\n async waitForDownload(\n savePath?: string,\n timeout?: number,\n ): Promise<void> {\n await this.exec({\n id: nextId(),\n action: \"waitfordownload\",\n path: savePath,\n timeout: timeout ?? 30000,\n });\n }\n\n async evaluate(script: string): Promise<unknown> {\n const response = await this.exec({\n id: nextId(),\n action: \"evaluate\",\n script,\n });\n // agent-browser returns { result: unknown } in data\n const data = (response as { data?: { result?: unknown } }).data;\n return data?.result ?? data;\n }\n\n async getText(selector: string): Promise<string> {\n const response = await this.exec({\n id: nextId(),\n action: \"gettext\",\n selector,\n });\n const data = (response as { data?: unknown }).data;\n return String(data ?? \"\");\n }\n\n async getInnerText(selector: string): Promise<string> {\n const response = await this.exec({\n id: nextId(),\n action: \"innertext\",\n selector,\n });\n const data = (response as { data?: unknown }).data;\n return String(data ?? \"\");\n }\n\n async url(): Promise<string> {\n return this.browser.getPage().url();\n }\n\n /** アクション前のページ数を返す */\n async pageCount(): Promise<number> {\n return this.browser.getPages().length;\n }\n\n /**\n * 新しいタブが開かれた場合、最新のタブに切り替える。\n * @returns 切り替えが発生したかどうか\n */\n async switchToLatestTab(pageCountBefore: number): Promise<boolean> {\n const pages = this.browser.getPages();\n if (pages.length > pageCountBefore) {\n const latestIndex = pages.length - 1;\n await this.browser.switchTo(latestIndex);\n return true;\n }\n return false;\n }\n\n /**\n * DOM が安定するまで待機(SPA遷移後のレンダリング完了検出用)。\n * Phase 1: networkidle を最大3秒待つ\n * Phase 2: スナップショットをアダプティブ間隔でポーリングし、\n * 2回連続で同一なら安定と判定。\n * 初期100ms → 200ms → 300ms と段階的に延長(高速ページで早期検出)\n */\n async waitForDOMStability(timeoutMs = 5000): Promise<void> {\n const page = this.browser.getPage();\n\n // Phase 1: networkidle\n try {\n await page.waitForLoadState(\"networkidle\", { timeout: Math.min(timeoutMs, 3000) });\n } catch {\n // タイムアウトは無視\n }\n\n // Phase 2: アダプティブポーリング\n const pollEnd = Date.now() + timeoutMs;\n let prevSnapshot = \"\";\n let stableCount = 0;\n let pollCount = 0;\n\n while (Date.now() < pollEnd) {\n const current = await this.snapshot();\n if (current === prevSnapshot) {\n stableCount++;\n if (stableCount >= 2) {\n this.logger.debug(\"[dom-stability] snapshot stable\");\n return;\n }\n } else {\n stableCount = 0;\n }\n prevSnapshot = current;\n pollCount++;\n // アダプティブ間隔: 100ms → 200ms → 300ms(以降300ms固定)\n const interval = pollCount <= 1 ? 100 : pollCount <= 2 ? 200 : 300;\n await new Promise((r) => setTimeout(r, interval));\n }\n this.logger.debug(\"[dom-stability] timeout, proceeding\");\n }\n\n /**\n * スナップショットが変化するまでポーリングで待機。\n * SPA遷移がまだ始まっていないケースに対応。\n * waitForDOMStability(変化が止まるのを待つ)とは逆で、変化が始まるのを待つ。\n */\n async waitForSnapshotChange(\n baselineSnapshot: string,\n timeoutMs = 10000,\n pollIntervalMs = 500,\n ): Promise<{ changed: boolean; snapshot: string }> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, pollIntervalMs));\n const current = await this.snapshot();\n if (current !== baselineSnapshot) {\n this.logger.debug(\"[snapshot-change] transition detected\");\n await this.waitForDOMStability();\n return { changed: true, snapshot: await this.snapshot() };\n }\n }\n this.logger.debug(\"[snapshot-change] timeout, no change\");\n return { changed: false, snapshot: baselineSnapshot };\n }\n\n /**\n * アクション後のナビゲーション/タブ切替を待機。\n * Stage 1: 新タブが開いていたら切り替え + ロード待機\n * Stage 2: 同一タブ内のナビゲーションなら URL 変化を待機\n * Stage 3: URL変化なしの場合、スナップショット変化でSPA遷移を検知し安定化待機\n */\n async waitForPossibleNavigation(\n urlBefore: string,\n pageCountBefore: number,\n timeout = 3000,\n ): Promise<void> {\n // Stage 1: 新タブ検知\n const pollEnd = Date.now() + 500;\n let switched = false;\n while (Date.now() < pollEnd) {\n const currentCount = this.browser.getPages().length;\n this.logger.debug(`[nav] polling tabs: before=${pageCountBefore} now=${currentCount}`);\n if (currentCount > pageCountBefore) {\n switched = true;\n break;\n }\n await new Promise((r) => setTimeout(r, 100));\n }\n\n if (switched) {\n const pages = this.browser.getPages();\n const latestIndex = pages.length - 1;\n this.logger.debug(`[nav] new tab detected, switching to index ${latestIndex}`);\n await this.browser.switchTo(latestIndex);\n const page = this.browser.getPage();\n this.logger.debug(`[nav] switched, url=${page.url()}`);\n try {\n await page.waitForLoadState(\"load\", { timeout });\n } catch {\n // タイムアウトは無視\n }\n this.logger.debug(`[nav] load complete, url=${page.url()}`);\n return;\n }\n\n // Stage 2: 同一タブ内のナビゲーション待機\n this.logger.debug(`[nav] no new tab, checking same-tab navigation (urlBefore=${urlBefore})`);\n const page = this.browser.getPage();\n let urlChanged = false;\n try {\n await page.waitForURL(\n (url) => url.toString() !== urlBefore,\n { timeout, waitUntil: \"load\" },\n );\n urlChanged = true;\n this.logger.debug(`[nav] URL changed to ${page.url()}`);\n // URL変化後、ハイドレーション/レンダリング完了を待機\n await this.waitForDOMStability();\n } catch {\n this.logger.debug(`[nav] no URL change detected`);\n }\n\n // Stage 3: URL変化なし → スナップショットでSPA遷移を検知\n // URL変化済みの場合は Stage 2 で waitForDOMStability 済みなのでスキップ\n if (!urlChanged) {\n this.logger.debug(\"[nav] checking SPA transition via snapshot diff\");\n const snapshotBefore = await this.snapshot();\n const spaPollEnd = Date.now() + 5000;\n const stageStart = Date.now();\n let spaDetected = false;\n let stableCount = 0;\n\n while (Date.now() < spaPollEnd) {\n await new Promise((r) => setTimeout(r, 300));\n const current = await this.snapshot();\n if (current !== snapshotBefore) {\n spaDetected = true;\n this.logger.debug(\"[nav] SPA transition detected (snapshot changed)\");\n break;\n }\n // 最低1秒はポーリングを継続(遅延APIレスポンスのSPA遷移を逃さない)\n // 1秒経過後、3回連続で変化なければ安定と判定して早期終了\n stableCount++;\n if (Date.now() - stageStart >= 1000 && stableCount >= 3) {\n this.logger.debug(\"[nav] snapshot stable, no SPA transition\");\n break;\n }\n }\n\n if (spaDetected) {\n await this.waitForDOMStability();\n }\n }\n }\n\n /**\n * CDP Screencast + ffmpeg でビューポート全体を録画開始する。\n * タブ切り替えを含む単一動画を生成する。\n * @param outputDir 動画ファイル保存先ディレクトリ\n * @param _url 未使用(後方互換性のため残す)\n */\n async startRecording(outputDir: string, _url?: string): Promise<void> {\n if (this.isScreencastRecording) {\n return;\n }\n\n // ffmpeg 存在チェック\n try {\n execSync(\"which ffmpeg\", { stdio: \"ignore\" });\n } catch {\n this.logger.warn(\n \"ffmpeg が見つかりません。--video を使用するには ffmpeg をインストールしてください\",\n );\n return;\n }\n\n await mkdir(outputDir, { recursive: true });\n\n const now = new Date();\n const pad = (n: number) => String(n).padStart(2, \"0\");\n const ts = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}T${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}`;\n const outputPath = join(outputDir, `recording-${ts}.webm`);\n this.screencastOutputPath = outputPath;\n\n // ffmpeg プロセス起動: MJPEG over pipe → WebM (VP8)\n this.ffmpegProcess = spawn(\"ffmpeg\", [\n \"-f\", \"image2pipe\",\n \"-framerate\", String(SCREENCAST_FPS),\n \"-vcodec\", \"mjpeg\",\n \"-i\", \"pipe:0\",\n \"-c:v\", \"libvpx\",\n \"-b:v\", \"1M\",\n \"-auto-alt-ref\", \"0\",\n \"-y\",\n outputPath,\n ], { stdio: [\"pipe\", \"ignore\", \"ignore\"] });\n\n this.ffmpegProcess.on(\"error\", (err) => {\n this.logger.warn(`ffmpeg プロセスエラー: ${err.message}`);\n });\n\n // screencast フレームコールバック: 最新フレームを保持\n this.latestFrame = null;\n const frameCallback = (frame: { data: string }) => {\n this.latestFrame = Buffer.from(frame.data, \"base64\");\n };\n\n // CDP Screencast 開始\n try {\n await this.browser.startScreencast(frameCallback, {\n format: \"jpeg\",\n quality: 80,\n });\n } catch (err) {\n this.logger.warn(\n `screencast 開始に失敗: ${err instanceof Error ? err.message : String(err)}`,\n );\n this.cleanupFfmpeg();\n return;\n }\n\n this.isScreencastRecording = true;\n\n // フレームポンプ: 一定間隔で latestFrame を ffmpeg stdin に書き込み\n this.framePumpInterval = setInterval(() => {\n if (this.latestFrame && this.ffmpegProcess?.stdin?.writable) {\n try {\n this.ffmpegProcess.stdin.write(this.latestFrame);\n } catch {\n // 書き込み失敗は無視(ffmpeg 終了中など)\n }\n }\n }, FRAME_PUMP_INTERVAL_MS);\n\n // screencast 回復ポーリング: タブ切替で停止した screencast を再開\n this.screencastRecoveryInterval = setInterval(async () => {\n if (!this.isScreencastRecording) return;\n try {\n if (!this.browser.isScreencasting()) {\n this.logger.debug(\"[screencast] 回復: screencast を再開\");\n await this.browser.startScreencast(frameCallback, {\n format: \"jpeg\",\n quality: 80,\n });\n }\n } catch {\n // 回復失敗は次回ポーリングでリトライ\n }\n }, SCREENCAST_RECOVERY_INTERVAL_MS);\n }\n\n /**\n * ffmpeg プロセスをクリーンアップする内部ヘルパー。\n */\n private cleanupFfmpeg(): void {\n if (this.ffmpegProcess) {\n try {\n this.ffmpegProcess.stdin?.end();\n this.ffmpegProcess.kill();\n } catch {\n // kill 失敗は無視\n }\n this.ffmpegProcess = null;\n }\n this.screencastOutputPath = null;\n }\n\n /**\n * 録画を停止し、動画ファイルパスを返す。\n * @returns paths: 保存された動画ファイルパス一覧, frames: 0(CDP screencast ではフレーム数不明)\n */\n async stopRecording(): Promise<{ paths: string[]; frames: number; error?: string }> {\n if (!this.isScreencastRecording) {\n return { paths: [], frames: 0, error: \"No recording in progress\" };\n }\n\n // フレームポンプ停止\n if (this.framePumpInterval) {\n clearInterval(this.framePumpInterval);\n this.framePumpInterval = null;\n }\n\n // screencast 回復ポーリング停止\n if (this.screencastRecoveryInterval) {\n clearInterval(this.screencastRecoveryInterval);\n this.screencastRecoveryInterval = null;\n }\n\n // CDP Screencast 停止\n try {\n await this.browser.stopScreencast();\n } catch {\n // 停止失敗は無視\n }\n\n const outputPath = this.screencastOutputPath;\n this.isScreencastRecording = false;\n this.latestFrame = null;\n\n // ffmpeg stdin を閉じてプロセス終了を待機\n if (this.ffmpegProcess) {\n const ffmpeg = this.ffmpegProcess;\n this.ffmpegProcess = null;\n\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n ffmpeg.kill(\"SIGKILL\");\n resolve();\n }, 10000);\n\n ffmpeg.on(\"close\", () => {\n clearTimeout(timeout);\n resolve();\n });\n\n try {\n ffmpeg.stdin?.end();\n } catch {\n clearTimeout(timeout);\n resolve();\n }\n });\n }\n\n this.screencastOutputPath = null;\n\n if (outputPath) {\n return { paths: [outputPath], frames: 0 };\n }\n return { paths: [], frames: 0 };\n }\n\n /**\n * 現在録画中かどうかを返す。\n */\n isRecording(): boolean {\n return this.isScreencastRecording;\n }\n\n async close(): Promise<void> {\n // 録画中なら停止\n if (this.isScreencastRecording) {\n try {\n await this.stopRecording();\n } catch {\n // 停止失敗は無視\n }\n }\n // ffmpeg プロセスが残っていたらクリーンアップ\n this.cleanupFfmpeg();\n await this.browser.close();\n }\n\n /**\n * ExplorationAction を適切なコマンドにディスパッチ\n */\n async executeStep(step: ExplorationAction): Promise<StepResult> {\n const start = Date.now();\n try {\n let output = \"\";\n switch (step.action) {\n case \"click\":\n await this.click(step.selector!);\n break;\n case \"fill\":\n await this.fill(step.selector!, step.value || \"\");\n break;\n case \"type\":\n await this.type(step.selector!, step.value || \"\");\n break;\n case \"select\":\n await this.select(step.selector!, step.value || \"\");\n break;\n case \"check\":\n await this.check(step.selector!);\n break;\n case \"uncheck\":\n await this.uncheck(step.selector!);\n break;\n case \"navigate\":\n await this.navigate(step.value!);\n break;\n case \"wait\":\n await this.wait(Number(step.value) || 1000);\n break;\n case \"scroll\":\n await this.scroll(step.value || \"down\");\n break;\n case \"extract\": {\n const script = step.value || step.script || \"\";\n if (script) {\n const result = await this.evaluate(script);\n output = typeof result === \"string\" ? result : JSON.stringify(result);\n }\n break;\n }\n case \"download\": {\n const downloadPath = step.downloadPath || `/tmp/download-${Date.now()}.bin`;\n await this.download(step.selector!, downloadPath);\n output = downloadPath;\n break;\n }\n default:\n output = `Unknown action: ${step.action}`;\n }\n return {\n success: true,\n output,\n durationMs: Date.now() - start,\n };\n } catch (error) {\n return {\n success: false,\n output: \"\",\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - start,\n };\n }\n }\n}\n","/**\n * agent-browser 内部APIのre-export\n *\n * agent-browserはpackage.jsonにexportsフィールドがなく、\n * dist/パスを直接指定する必要がある。\n * このモジュールでimport先を集約し、他ファイルはここからimportする。\n */\n\nexport { BrowserManager } from \"agent-browser/dist/browser.js\";\nexport { executeCommand } from \"agent-browser/dist/actions.js\";\nexport type {\n Command,\n Response,\n LaunchCommand,\n KeyboardCommand,\n ScrollCommand,\n DiffSnapshotCommand,\n DiffScreenshotCommand,\n DiffUrlCommand,\n AuthSaveCommand,\n AuthLoginCommand,\n AuthListCommand,\n AuthDeleteCommand,\n AuthShowCommand,\n ConfirmCommand,\n DenyCommand,\n} from \"agent-browser/dist/types.js\";\nexport type {\n RefMap,\n EnhancedSnapshot,\n SnapshotOptions,\n} from \"agent-browser/dist/snapshot.js\";\nexport { resetRefs, getSnapshotStats } from \"agent-browser/dist/snapshot.js\";\nexport type { Annotation, ScreenshotData } from \"agent-browser/dist/types.js\";\nexport type { ScreencastFrame } from \"agent-browser/dist/browser.js\";\n","/**\n * browser/stealth --- Playwright ステルスパッチ\n *\n * puppeteer-extra-plugin-stealth の手法を Playwright 用に移植。\n * page.context().addInitScript() で各パッチをブラウザコンテキストに注入する。\n * addInitScript はコンテキストレベルで適用されるため、\n * 以後のナビゲーションや新しいページでも自動的に再実行される。\n */\n\n/** Playwright Page の最小インターフェース(playwright-core を直接参照しない) */\ninterface StealthPage {\n context(): {\n addInitScript(script: string): Promise<void>;\n };\n}\n\n// ── 個別パッチスクリプト生成関数 ──\n\n/** navigator.webdriver を undefined にする */\nexport function webdriverPatch(): string {\n return `\n Object.defineProperty(navigator, 'webdriver', {\n get: () => undefined,\n });\n `;\n}\n\n/** window.chrome オブジェクトを注入(chrome.runtime 含む) */\nexport function chromePatch(): string {\n return `\n if (!window.chrome) {\n Object.defineProperty(window, 'chrome', {\n writable: true,\n enumerable: true,\n configurable: true,\n value: {},\n });\n }\n if (!window.chrome.runtime) {\n window.chrome.runtime = {\n connect: function() { return { onMessage: { addListener: function() {} }, postMessage: function() {}, onDisconnect: { addListener: function() {} } }; },\n sendMessage: function(a, b, c) { if (typeof c === 'function') c(); },\n };\n }\n `;\n}\n\n/** navigator.plugins をエミュレーション(Chrome 標準プラグイン) */\nexport function pluginsPatch(): string {\n return `\n Object.defineProperty(navigator, 'plugins', {\n get: () => {\n const plugins = [\n { name: 'Chrome PDF Plugin', filename: 'internal-pdf-viewer', description: 'Portable Document Format' },\n { name: 'Chrome PDF Viewer', filename: 'mhjfbmdgcfjbbpaeojofohoefgiehjai', description: '' },\n { name: 'Native Client', filename: 'internal-nacl-plugin', description: '' },\n ];\n plugins.refresh = () => {};\n return plugins;\n },\n });\n Object.defineProperty(navigator, 'mimeTypes', {\n get: () => {\n const mimeTypes = [\n { type: 'application/pdf', suffixes: 'pdf', description: 'Portable Document Format' },\n { type: 'application/x-google-chrome-pdf', suffixes: 'pdf', description: 'Portable Document Format' },\n ];\n mimeTypes.refresh = () => {};\n return mimeTypes;\n },\n });\n `;\n}\n\n/** navigator.languages パッチ */\nexport function languagesPatch(): string {\n return `\n Object.defineProperty(navigator, 'languages', {\n get: () => ['en-US', 'en'],\n });\n `;\n}\n\n/** navigator.permissions.query パッチ(notification → denied) */\nexport function permissionsPatch(): string {\n return `\n const originalQuery = navigator.permissions.query.bind(navigator.permissions);\n navigator.permissions.query = (parameters) => {\n if (parameters.name === 'notifications') {\n return Promise.resolve({ state: Notification.permission });\n }\n return originalQuery(parameters);\n };\n `;\n}\n\n/** WebGL vendor/renderer の正規化 */\nexport function webglPatch(): string {\n return `\n const getParameter = WebGLRenderingContext.prototype.getParameter;\n WebGLRenderingContext.prototype.getParameter = function(parameter) {\n // UNMASKED_VENDOR_WEBGL\n if (parameter === 37445) return 'Google Inc. (Intel)';\n // UNMASKED_RENDERER_WEBGL\n if (parameter === 37446) return 'ANGLE (Intel, Intel(R) UHD Graphics, OpenGL 4.1)';\n return getParameter.call(this, parameter);\n };\n if (typeof WebGL2RenderingContext !== 'undefined') {\n const getParameter2 = WebGL2RenderingContext.prototype.getParameter;\n WebGL2RenderingContext.prototype.getParameter = function(parameter) {\n if (parameter === 37445) return 'Google Inc. (Intel)';\n if (parameter === 37446) return 'ANGLE (Intel, Intel(R) UHD Graphics, OpenGL 4.1)';\n return getParameter2.call(this, parameter);\n };\n }\n `;\n}\n\n/** navigator.hardwareConcurrency を 4 に固定 */\nexport function hardwareConcurrencyPatch(): string {\n return `\n Object.defineProperty(navigator, 'hardwareConcurrency', {\n get: () => 4,\n });\n `;\n}\n\n/** iframe contentWindow 検出回避 */\nexport function iframePatch(): string {\n return `\n try {\n if (window.self !== window.top) return;\n const originalAttachShadow = Element.prototype.attachShadow;\n if (originalAttachShadow) {\n Element.prototype.attachShadow = function() {\n return originalAttachShadow.call(this, ...arguments);\n };\n }\n } catch {}\n `;\n}\n\n/** navigator.userAgent / navigator.appVersion から HeadlessChrome を除去 */\nexport function userAgentPatch(): string {\n return `\n (function() {\n var ua = navigator.userAgent || '';\n if (ua.indexOf('HeadlessChrome') !== -1) {\n var cleanUA = ua.replace('HeadlessChrome', 'Chrome');\n Object.defineProperty(navigator, 'userAgent', {\n get: () => cleanUA,\n });\n }\n var av = navigator.appVersion || '';\n if (av.indexOf('HeadlessChrome') !== -1) {\n var cleanAV = av.replace('HeadlessChrome', 'Chrome');\n Object.defineProperty(navigator, 'appVersion', {\n get: () => cleanAV,\n });\n }\n })();\n `;\n}\n\n// ── メインの適用関数 ──\n\n/** 全ステルスパッチを生成 */\nexport function getStealthScripts(): string[] {\n return [\n webdriverPatch(),\n chromePatch(),\n pluginsPatch(),\n languagesPatch(),\n permissionsPatch(),\n webglPatch(),\n hardwareConcurrencyPatch(),\n iframePatch(),\n userAgentPatch(),\n ];\n}\n\n/**\n * Playwright Page にステルスパッチを適用する。\n * page.context().addInitScript() で登録するため、\n * 以後のナビゲーション・新規ページでも自動再適用される。\n */\nexport async function applyStealthScripts(page: StealthPage): Promise<void> {\n const context = page.context();\n const scripts = getStealthScripts();\n for (const script of scripts) {\n await context.addInitScript(script);\n }\n}\n","/**\n * snapshot-parser — アクセシビリティスナップショット行パース\n *\n * Playwright のアクセシビリティスナップショット出力形式:\n * role \"name\" [ref=eN] [attrs]\n *\n * から構造化データを抽出する純粋関数群\n */\n\nexport interface ParsedSnapshotElement {\n /** 参照ID(例: \"e3\") */\n ref: string;\n /** ロール(例: \"textbox\", \"button\", \"link\") */\n role: string;\n /** 名前(例: \"Email\", \"ログイン\") */\n name: string;\n /** 追加属性 */\n attributes: Record<string, string>;\n}\n\n/**\n * スナップショットの1行をパースして構造化データに変換\n *\n * 入力例:\n * textbox \"Email\" [ref=e3] [required] [focused]\n * - button \"ログイン\" [ref=e5]\n * heading \"Title\" [ref=e1] [level=2]\n * textbox \"サブドメイン\" [ref=e3]:\n * img [ref=e10]\n *\n * @returns パースされた要素、またはマッチしない場合 null\n */\nexport function parseSnapshotLine(\n line: string,\n): ParsedSnapshotElement | null {\n // [ref=eN] を抽出\n const refMatch = line.match(/\\[ref=(e\\d+)\\]/);\n if (!refMatch) return null;\n\n const ref = refMatch[1];\n const refIndex = line.indexOf(refMatch[0]);\n\n // ref より前のテキスト(role \"name\" が先頭にある)\n const beforeRef = line.slice(0, refIndex).trim();\n // ref より後のテキスト(属性のみ)\n const afterRef = line.slice(refIndex + refMatch[0].length).trim();\n\n // 先頭の \"- \" (Playwright リストbullet) を除去\n const cleanBefore = beforeRef.replace(/^-\\s+/, \"\");\n\n let role: string;\n let name: string;\n\n // role \"name\" パターン\n const roleNameMatch = cleanBefore.match(/^(\\S+)\\s+\"([^\"]*)\"$/);\n const roleOnlyMatch = cleanBefore.match(/^(\\S+)$/);\n\n if (roleNameMatch) {\n role = roleNameMatch[1];\n name = roleNameMatch[2];\n } else if (roleOnlyMatch && !roleOnlyMatch[1].startsWith(\"[\")) {\n role = roleOnlyMatch[1];\n name = \"\";\n } else {\n return null;\n }\n\n // 末尾 \":\" (子要素インジケータ) を除去して属性を抽出\n const attrSource = afterRef.replace(/:$/, \"\").trim();\n\n // 属性を抽出([key=value] または [key] 形式、[ref=...] はスキップ)\n const attributes: Record<string, string> = {};\n const attrRegex = /\\[(\\w+)(?:=([^\\]]*))?\\]/g;\n let attrMatch: RegExpExecArray | null;\n while ((attrMatch = attrRegex.exec(attrSource)) !== null) {\n const key = attrMatch[1];\n if (key === \"ref\") continue;\n const value = attrMatch[2] ?? \"true\";\n attributes[key] = value;\n }\n\n return { ref, role, name, attributes };\n}\n\n/**\n * スナップショット全体から指定refの要素を検索\n */\nexport function findElementInSnapshot(\n snapshot: string,\n ref: string,\n): ParsedSnapshotElement | null {\n const lines = snapshot.split(\"\\n\");\n for (const line of lines) {\n if (!line.includes(`[ref=${ref}]`)) continue;\n const parsed = parseSnapshotLine(line);\n if (parsed && parsed.ref === ref) return parsed;\n }\n return null;\n}\n\n/**\n * スナップショットからインタラクティブ要素一覧を抽出\n */\nexport function parseAllElements(\n snapshot: string,\n): ParsedSnapshotElement[] {\n const lines = snapshot.split(\"\\n\");\n const elements: ParsedSnapshotElement[] = [];\n for (const line of lines) {\n const parsed = parseSnapshotLine(line);\n if (parsed) elements.push(parsed);\n }\n return elements;\n}\n\n/**\n * スナップショット内の [ref=eN] 要素の総数を返す。\n */\nexport function countElements(snapshot: string): number {\n return parseAllElements(snapshot).length;\n}\n","/**\n * error-classifier — エラー分類の共通ロジック\n *\n * generator / executor / debugger から利用可能。\n * 失敗原因を型付きカテゴリに分類し、カテゴリ別の推奨対応テキストを提供する。\n */\n\nimport type { StepRetryDetail } from \"../instruction-executor/types\";\nimport { t } from \"../i18n\";\n\nexport type FailureCategory =\n | \"element_not_found\"\n | \"element_stale\"\n | \"page_structure_changed\"\n | \"navigation_timeout\"\n | \"action_failed\"\n | \"unknown\";\n\nexport interface ClassificationContext {\n /** エラーメッセージ */\n error: string;\n /** AI がセレクタ解決で ref を返したか */\n selectorResolved: boolean;\n /** アクション実行まで到達したか */\n actionExecuted: boolean;\n /** リトライ詳細(executor のみ) */\n retryDetails?: StepRetryDetail[];\n /** キャッシュから取得した ref を使用したか */\n cachedRefUsed?: boolean;\n}\n\n/**\n * 失敗コンテキストからカテゴリを判定する。\n * 優先度順: action_failed > element_stale > page_structure_changed > element_not_found > navigation_timeout > unknown\n */\nexport function classifyFailure(ctx: ClassificationContext): FailureCategory {\n // アクション実行まで到達したが例外\n if (ctx.actionExecuted) {\n return \"action_failed\";\n }\n\n // キャッシュ ref がスナップショットに見つからなかった\n if (ctx.cachedRefUsed && !ctx.selectorResolved) {\n return \"element_stale\";\n }\n\n // セレクタ解決失敗(リトライ詳細あり)\n if (!ctx.selectorResolved && ctx.retryDetails && ctx.retryDetails.length > 0) {\n const anySnapshotChange = ctx.retryDetails.some((d) => d.snapshotChanged);\n if (anySnapshotChange) {\n return \"page_structure_changed\";\n }\n return \"element_not_found\";\n }\n\n // セレクタ解決失敗(リトライ詳細なし: generator 側など)\n if (!ctx.selectorResolved) {\n return \"element_not_found\";\n }\n\n // タイムアウト / ナビゲーション系\n const lowerError = ctx.error.toLowerCase();\n if (lowerError.includes(\"timeout\") || lowerError.includes(\"navigation\")) {\n return \"navigation_timeout\";\n }\n\n return \"unknown\";\n}\n\n/**\n * カテゴリ別の推奨対応テキスト。\n * reporter / chat-notifier 共通で使用。\n */\nexport function getRecoveryHint(category: FailureCategory): string {\n const keyMap: Record<FailureCategory, string> = {\n element_not_found: \"errors.elementNotFound\",\n element_stale: \"errors.elementStale\",\n page_structure_changed: \"errors.pageStructureChanged\",\n navigation_timeout: \"errors.navigationTimeout\",\n action_failed: \"errors.actionFailed\",\n unknown: \"errors.unknownError\",\n };\n return t(keyMap[category] as import(\"../i18n\").MessageKey);\n}\n","/**\n * orchestrator/memory-operations — メモリ追記のJSONパース共通処理\n *\n * instruction-generator (browser-tool.ts) と instruction-executor (executor.ts) の\n * memory_append ロジックを統合。\n */\n\nimport type { DataStore, DataAggregator } from \"./data-store\";\nimport type { DebugLogger } from \"../cli/debug-logger\";\nimport { log } from \"../cli/prompts\";\n\nexport interface MemoryAppendContext {\n dataStore: DataStore & DataAggregator;\n debugLogger: DebugLogger;\n phase: \"generator\" | \"executor\";\n step: number;\n collection: string;\n}\n\n/**\n * rawValue をパースして DataStore に追記する。\n *\n * - 二重 stringify 検出(JSON文字列のさらにJSONエスケープ)→ unwrap\n * - JSON配列 → dataStore.extend()(プリミティブは {index, value} にラップ)\n * - JSONオブジェクト → dataStore.append()\n * - フォールバック: {value: rawValue} として dataStore.append()\n */\nexport function parseAndAppendToMemory(\n rawValue: string,\n ctx: MemoryAppendContext,\n): { appended: number } {\n const { dataStore, debugLogger, phase, step, collection } = ctx;\n\n debugLogger.log({\n phase,\n event: \"memory_append\",\n step,\n data: {\n collection,\n rawValuePreview: rawValue.slice(0, 200),\n rawValueLength: rawValue.length,\n },\n });\n\n try {\n let dataToParse = rawValue;\n\n // 二重 stringify 検出: 文字列が JSON 文字列のさらに JSON エスケープの場合\n if (dataToParse.startsWith('\"') && dataToParse.endsWith('\"')) {\n try {\n const unquoted = JSON.parse(dataToParse);\n if (typeof unquoted === \"string\") {\n debugLogger.log({\n phase,\n event: \"memory_append\",\n step,\n data: { doubleStringifyDetected: true },\n });\n dataToParse = unquoted;\n }\n } catch {\n // 二重 stringify ではない — 元の値を使う\n }\n }\n\n const parsed = JSON.parse(dataToParse);\n\n if (Array.isArray(parsed)) {\n const items = parsed.map((item: unknown, i: number) => {\n if (typeof item === \"object\" && item !== null && !Array.isArray(item)) {\n return item as Record<string, unknown>;\n }\n return { index: i, value: item };\n });\n const firstKeys =\n items.length > 0\n ? JSON.stringify(Object.keys(items[0]))\n : \"N/A\";\n debugLogger.log({\n phase,\n event: \"memory_append\",\n step,\n data: {\n parseResult: \"array\",\n arrayLength: items.length,\n firstElementKeys: firstKeys,\n collection,\n count: items.length,\n },\n });\n dataStore.extend(collection, items);\n log.success(`Memory: appended ${items.length} items to \"${collection}\"`);\n return { appended: items.length };\n }\n\n const item =\n typeof parsed === \"object\" && parsed !== null\n ? (parsed as Record<string, unknown>)\n : { value: parsed };\n debugLogger.log({\n phase,\n event: \"memory_append\",\n step,\n data: {\n parseResult: \"object\",\n objectKeys: JSON.stringify(Object.keys(item)),\n collection,\n },\n });\n dataStore.append(collection, item);\n log.success(`Memory: appended 1 item to \"${collection}\"`);\n return { appended: 1 };\n } catch {\n debugLogger.log({\n phase,\n event: \"memory_append\",\n step,\n data: {\n parseResult: \"fallback\",\n collection,\n rawValuePreview: rawValue.slice(0, 200),\n },\n });\n log.warn(\n `Memory: could not parse as JSON, storing as {value: \"...\"} — extract script should return an array of objects`,\n );\n dataStore.append(collection, { value: rawValue });\n return { appended: 1 };\n }\n}\n","/**\n * performance/sleep — 共有 sleep ユーティリティ\n */\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * Exploration agent prompt — English\n */\n\nimport type { SecretsData } from \"../../../cli/secrets-loader\";\n\nconst COMMAND_SCHEMA = `### Basic Operations\n- \\`click\\`: Click element by selector\n- \\`fill\\`: Fill value in selector (clears existing value)\n- \\`type\\`: Type value into selector character by character\n- \\`select\\`: Select value from dropdown by selector\n- \\`check\\` / \\`uncheck\\`: Toggle checkbox by selector\n\n### Navigation\n- \\`navigate\\`: Navigate to URL in value (only URLs explicitly stated in goal/context; use click for page links)\n- \\`wait\\`: Wait for value ms\n- \\`scroll\\`: value: \"up\"|\"down\"|\"left\"|\"right\"\n\n### Data Extraction\n- \\`extract\\`: Extract data via script (JS) or extractPrompt (AI). Result in extractedData\n - **script must return a flat array of objects. No JSON.stringify() needed**\n - When extracting tables, dynamically get column names from header row\n- \\`download\\`: Download by clicking selector (specify save path with downloadPath)\n- \\`export\\`: Export memory data to file (exportCollection, exportFormat: csv|json, exportPath)\n\n### Memory Operations\n- \\`memory_append\\`: Accumulate data in memoryCollection (value or previous extract result)\n - **extract and memory_append must be in the same actions array**\n- \\`memory_aggregate\\`: aggregation: {collection, field, operation: sum|count|concat|min|max|avg|unique_count, outputVariable}\n\n**Use only the actions listed above.**`;\n\nexport function getAgentInstructions(\n goal: string,\n contextMarkdown?: string,\n secrets?: SecretsData,\n): string {\n const contextSection = contextMarkdown\n ? `\\n## Supplementary Information\\n${contextMarkdown}\\n`\n : \"\";\n\n let secretsSection = \"\";\n if (secrets && Object.keys(secrets.values).length > 0) {\n const entries = Object.entries(secrets.values)\n .map(([key, value]) => `- ${key}: ${value}`)\n .join(\"\\n\");\n secretsSection = `\\n## Input Values (secrets)\\nUse the following values when filling forms:\\n${entries}\\n\\n**Important**: When using these values, set the corresponding \\`variableName\\` and choose the appropriate \\`inputCategory\\` (\\`credential\\` or \\`user_data\\`).\\n`;\n }\n\n return `You are an AI explorer that navigates web pages to achieve goals.\nUse the browser tool to operate the browser and achieve the goal.\n\n## How to use the browser tool\n\n### Getting a Snapshot\nCall the browser tool with \\`actions: []\\` (empty array) to get the current page's snapshot (accessibility tree) and URL.\n\n### Executing Actions\nPass operations as an array in the browser tool's \\`actions\\`. Keep to 1-3 actions per call.\n\n### Selector Format\nUse \\`@eN\\` format corresponding to \\`[ref=eN]\\` in the snapshot (e.g., \\`@e1\\`, \\`@e10\\`)\n\n### Available Commands\n${COMMAND_SCHEMA}\n\n### Input Category (inputCategory)\nWhen entering values with fill/type, always include inputCategory:\n- \\`credential\\`: Authentication info (username, email, password, etc.)\n- \\`user_data\\`: User-specific data (name, address, phone number, etc.)\n- \\`fixed\\`: Fixed values (test values, constants, etc.)\n- \\`navigation\\`: URLs, search keywords, etc.\n\n### Variable Name (variableName)\nWhen entering values with fill/type, assign a short English camelCase variable name to \\`variableName\\`.\nExample: \\`email\\`, \\`password\\`, \\`searchQuery\\`, \\`companyName\\`, \\`firstName\\`\nAlways use the same name for the same concept (e.g., if email input appears in 2 places, use \\`email\\` for both).\n\n### Data Capture (suggestedCaptures)\nWhen important data appears on the page as a result of operations (IDs, order numbers, URL changes, amounts, etc.),\nrecord them with \\`suggestedCaptures\\`. Prioritize values needed in subsequent steps.\nAvailable strategies:\n- \\`snapshot\\`: Regex match on snapshot (pattern required)\n- \\`url\\`: Regex match on URL (pattern required)\n- \\`ai\\`: AI extraction with natural language (prompt required)\n- \\`expression\\`: Template from existing variables (expression required)\n- \\`evaluate\\`: Execute JavaScript on page and capture result (expression contains JS code)\n\nExample:\n\\`\\`\\`json\n{\n \"suggestedCaptures\": [\n { \"name\": \"orderId\", \"strategy\": \"snapshot\", \"pattern\": \"Order[::]\\\\\\\\s*([A-Z]+-\\\\\\\\d+)\", \"description\": \"Order confirmation number\" },\n { \"name\": \"resourceId\", \"strategy\": \"url\", \"pattern\": \"/orders/(\\\\\\\\d+)\" }\n ]\n}\n\\`\\`\\`\n\n## Critical Rules\n- **Only interact with elements visible in the snapshot.** Never guess about elements or URLs that may not exist\n- Navigate pages by clicking links/buttons on screen. Do not guess/construct URLs with \\`navigate\\` (except URLs explicitly stated in goal or context)\n- Only use \\`@eN\\` refs that exist as \\`[ref=eN]\\` in the most recent snapshot\n- If context (supplementary info) is provided, prioritize the procedures, paths, and hints described there\n- If the snapshot shows \\`[... N items omitted]\\`, the target element may be in the omitted section. Try \\`scroll\\` to move the view and re-fetch\n\n## Exploration Strategy\n1. First check page state with \\`actions: []\\`\n2. **Carefully read** the snapshot and identify links, buttons, and form elements related to the goal\n3. Execute operations using the identified \\`@eN\\` refs\n4. Check results and decide next operation (observe → decide → act cycle)\n5. If target element is not found, \\`scroll\\` to move the view and check the snapshot again\n6. Use \\`select\\` command for SELECT elements, not \\`click\\`\n7. Use \\`check\\` / \\`uncheck\\` commands for checkboxes\n8. Use \\`click\\` command for radio buttons — just click the desired option directly\n9. Never use \\`extract\\` to investigate form elements. If radio buttons, checkboxes, or dropdowns are visible in the snapshot, interact with them directly using the appropriate command\n\n## Form Input Efficiency\nWhen filling large forms, strictly follow these rules:\n1. **Enter each field only once** — Do not re-operate on fields that already have values\n2. **Check filled fields in snapshot** — After fill/type, the field value appears in the snapshot. Skip fields showing values\n3. **Progress systematically top to bottom** — Process fieldsets/sections in order. Don't go back to previous sections\n4. **Track filled field count** — Reference operation history to know what you've already entered. Duplicate operations on the same selector are forbidden\n5. **Submit after all fields are filled** — Once all required fields are complete, promptly click the submit button\n6. **Check filledFields** — The browser tool result includes filledFields listing filled fields. Never re-enter fields in this list\n\n## Form Completion Verification\nBefore returning your final report when filling forms:\n1. Scan the ENTIRE current snapshot for remaining unfilled fields — check every fieldset/section\n2. Look for: empty textboxes (no value), comboboxes showing placeholder like \"Select...\", unchecked checkboxes\n3. The LAST section of a form is commonly missed — always verify the bottom of the form\n4. After all fields are filled, click the submit/register button\n5. Verify the success confirmation appears before declaring goalAchieved: true\nDo NOT declare goalAchieved without first confirming all form sections are complete and the form is submitted.\n\n## Data Collection Pattern (Pagination Traversal)\nProcedure: extract → memory_append → click \"Next\" → repeat → memory_aggregate for aggregation\n\nExample (table extract → accumulate → next page → aggregate → CSV export):\n\\`\\`\\`json\n[\n {\"action\":\"extract\",\"description\":\"Extract table\",\"script\":\"(()=>{const h=[...document.querySelectorAll('table thead th')].map(t=>t.textContent.trim());return[...document.querySelectorAll('table tbody tr')].map(r=>{const c=r.querySelectorAll('td');return Object.fromEntries([...c].map((c,i)=>[h[i]||'col'+i,c.textContent.trim()]));});})()\"},\n {\"action\":\"memory_append\",\"description\":\"Accumulate\",\"memoryCollection\":\"data\"},\n {\"action\":\"click\",\"description\":\"Next page\",\"selector\":\"@e15\"}\n]\n\\`\\`\\`\nAggregate: \\`[{\"action\":\"memory_aggregate\",\"description\":\"Sum total\",\"aggregation\":{\"collection\":\"data\",\"field\":\"amount\",\"operation\":\"sum\",\"outputVariable\":\"total\"}}]\\`\nCSV export: \\`[{\"action\":\"export\",\"description\":\"CSV export\",\"exportCollection\":\"data\",\"exportFormat\":\"csv\",\"exportPath\":\"/tmp/data.csv\"}]\\`\n\nNote: No JSON.stringify() needed in script. Each row is a flat object. Check collection item count via memoryStatus.\n\n**Important**: When paginating, you MUST continue until the LAST page. Check the page indicator (e.g., \"Page X of Y\") and keep clicking \"Next\" until you reach the final page. Do NOT stop after a few pages — process every single page. The goal is not to demonstrate the pattern but to complete the full traversal.\n\n## Using filledFields\nIf the browser tool result includes \\`filledFields\\`, this is a list of already-filled form fields.\nDo not re-enter fields in this list. Only operate on unfilled fields.\n\n## Diff Snapshots\nAfter text input (fill/type), if page structure hasn't changed, you'll receive a compact snapshot listing all refs.\n- \\`Unfilled:\\` shows elements you still need to interact with\n- \\`Filled:\\` shows elements already filled\n- All refs from the compact snapshot are valid and usable\n- If you need full page context, call the browser tool with \\`actions: []\\`\n\n## Responding to nudgeMessage\nIf the browser tool result includes \\`nudgeMessage\\`, it contains important guidance:\n- **Pagination progress**: Shows current page and remaining pages. You MUST continue until ALL pages are processed.\n- **Loop warning**: Indicates you are repeating the same actions without progress. Try a different approach.\n- **Form hints**: Lists remaining unfilled form fields.\nAlways follow the instructions in the message.\n\n## When Goal is Achieved\nWhen you determine the goal has been achieved — for form-filling tasks, first verify all fields are filled and the form is submitted — stop calling the browser tool and return a final report in this JSON format:\n\\`\\`\\`json\n{ \"goalAchieved\": true, \"summary\": \"Summary of what was accomplished\" }\n\\`\\`\\`\n\nIf you determine the goal cannot be achieved:\n\\`\\`\\`json\n{ \"goalAchieved\": false, \"summary\": \"Summary of the situation and reasons\" }\n\\`\\`\\`\n\n---\nThe following is task-specific information.\n\n## Goal\n${goal}\n${contextSection}${secretsSection}\nRespond in English.`;\n}\n\nexport function getInitialUserMessage(): string {\n return \"Call the browser tool with actions:[] (empty array) to check the current page state. Then begin exploring toward the goal.\";\n}\n","/**\n * Exploration agent prompt — Japanese (current production)\n */\n\nimport type { SecretsData } from \"../../../cli/secrets-loader\";\n\nconst COMMAND_SCHEMA = `### 基本操作\n- \\`click\\`: selector で要素クリック\n- \\`fill\\`: selector に value を入力(既存値クリア)\n- \\`type\\`: selector に value を1文字ずつ入力\n- \\`select\\`: selector のドロップダウンで value を選択\n- \\`check\\` / \\`uncheck\\`: selector のチェックボックス操作\n\n### ナビゲーション\n- \\`navigate\\`: value のURLに移動(ゴール/コンテキストで明示されたURLのみ。ページ内リンクは click)\n- \\`wait\\`: value ms待機\n- \\`scroll\\`: value: \"up\"|\"down\"|\"left\"|\"right\"\n\n### データ抽出\n- \\`extract\\`: script(JS) または extractPrompt(AI) でデータ抽出。結果は extractedData\n - **script はフラットなオブジェクト配列を返すこと。JSON.stringify()不要**\n - テーブル抽出時はヘッダー行からカラム名を動的取得\n- \\`download\\`: selector クリックでダウンロード(downloadPath で保存先指定可)\n- \\`export\\`: メモリデータをファイル出力(exportCollection, exportFormat: csv|json, exportPath)\n\n### メモリ操作\n- \\`memory_append\\`: memoryCollection にデータ蓄積(value または直前 extract 結果)\n - **extract と memory_append は必ず同じ actions 配列に含めること**\n- \\`memory_aggregate\\`: aggregation: {collection, field, operation: sum|count|concat|min|max|avg|unique_count, outputVariable}\n\n**上記のアクションのみ使用。**`;\n\nexport function getAgentInstructions(\n goal: string,\n contextMarkdown?: string,\n secrets?: SecretsData,\n): string {\n const contextSection = contextMarkdown\n ? `\\n## 補足情報\\n${contextMarkdown}\\n`\n : \"\";\n\n let secretsSection = \"\";\n if (secrets && Object.keys(secrets.values).length > 0) {\n const entries = Object.entries(secrets.values)\n .map(([key, value]) => `- ${key}: ${value}`)\n .join(\"\\n\");\n secretsSection = `\\n## 入力値(secrets)\\nフォーム入力時に以下の値を使用してください:\\n${entries}\\n\\n**重要**: これらの値を使用する際は、対応する \\`variableName\\` を設定し、\\`inputCategory\\` は \\`credential\\` または \\`user_data\\` を適切に選択してください。\\n`;\n }\n\n return `あなたはWebページを探索してゴールを達成するAIエクスプローラーです。\nbrowserツールを使ってブラウザを操作し、ゴールを達成してください。\n\n## browserツールの使い方\n\n### スナップショット取得\nbrowserツールを \\`actions: []\\`(空配列)で呼ぶと、現在のページのスナップショット(アクセシビリティツリー)とURLが返ります。\n\n### アクション実行\nbrowserツールの \\`actions\\` に操作を配列で渡すと順次実行されます。1回の呼び出しで1〜3アクション程度に抑えてください。\n\n### セレクタ形式\nスナップショットの \\`[ref=eN]\\` に対応する \\`@eN\\` 形式で指定(例: \\`@e1\\`, \\`@e10\\`)\n\n### 利用可能なコマンド\n${COMMAND_SCHEMA}\n\n### 入力値のカテゴリ(inputCategory)\nfill/type で値を入力する場合、必ず inputCategory を付与:\n- \\`credential\\`: ユーザー名、メールアドレス、パスワード等の認証情報\n- \\`user_data\\`: ユーザー固有のデータ(名前、住所、電話番号等)\n- \\`fixed\\`: 固定値(テスト値、定数等)\n- \\`navigation\\`: URL、検索キーワード等\n\n### 変数名(variableName)\nfill/type で値を入力する場合、短い英語 camelCase の変数名を \\`variableName\\` に付与してください。\n例: \\`email\\`, \\`password\\`, \\`searchQuery\\`, \\`companyName\\`, \\`firstName\\`\n同じ概念の値には必ず同じ名前を使用してください(例: メールアドレス入力が2箇所あれば両方 \\`email\\`)。\n\n### データキャプチャ(suggestedCaptures)\n操作結果として重要なデータ(ID、注文番号、URL変化、金額等)がページに現れた場合、\n\\`suggestedCaptures\\` で記録してください。後続ステップで参照が必要になる値を優先。\n利用可能な strategy:\n- \\`snapshot\\`: スナップショットに正規表現マッチ(pattern 必須)\n- \\`url\\`: URLに正規表現マッチ(pattern 必須)\n- \\`ai\\`: AIに自然言語で抽出させる(prompt 必須)\n- \\`expression\\`: 既存変数からテンプレート組み立て(expression 必須)\n- \\`evaluate\\`: ページ内でJavaScriptを実行して結果をキャプチャ(expression にJSコードを指定)\n\n例:\n\\`\\`\\`json\n{\n \"suggestedCaptures\": [\n { \"name\": \"orderId\", \"strategy\": \"snapshot\", \"pattern\": \"注文番号[::]\\\\\\\\s*([A-Z]+-\\\\\\\\d+)\", \"description\": \"注文確認番号\" },\n { \"name\": \"resourceId\", \"strategy\": \"url\", \"pattern\": \"/orders/(\\\\\\\\d+)\" }\n ]\n}\n\\`\\`\\`\n\n## 最重要ルール\n- **スナップショットに見えている要素だけを操作すること。** 存在するか分からない要素やURLを推測してはいけない\n- ページ遷移は画面上のリンクやボタンを \\`click\\` で行う。\\`navigate\\` でURLを推測・組み立てることは禁止(ゴールやコンテキストで明示されたURLは除く)\n- 操作対象の \\`@eN\\` は、直前のスナップショットに \\`[ref=eN]\\` として存在するものだけを使用する\n- コンテキスト(補足情報)が提供されている場合、そこに記載された手順・導線・ヒントを優先的に参照する\n- スナップショットに \\`[... N件省略]\\` とある場合、目的の要素が省略部分にある可能性がある。\\`scroll\\` で画面を動かして再取得を試みること\n\n## 探索戦略\n1. まず \\`actions: []\\` でページ状態を確認\n2. スナップショットを**注意深く読み**、ゴールに関連するリンク・ボタン・フォーム要素を特定\n3. 特定した要素の \\`@eN\\` を使って操作を実行\n4. 結果を確認し、次の操作を決定(観察→判断→行動の繰り返し)\n5. 目的の要素が見つからない場合は \\`scroll\\` で画面を移動し、再度スナップショットを確認する\n6. SELECT要素には \\`click\\` ではなく \\`select\\` コマンドを使用\n7. チェックボックスには \\`check\\` / \\`uncheck\\` コマンドを使用\n8. ラジオボタンには \\`click\\` コマンドを使用 — 選択したいオプションを直接クリックする\n9. フォーム要素の調査に \\`extract\\` を使わないこと。スナップショットにラジオボタン・チェックボックス・ドロップダウンが見えていれば、適切なコマンドで直接操作する\n\n## フォーム入力の効率化\n大きなフォームを入力する際は、以下のルールを厳守してください:\n1. **各フィールドは1回だけ入力する** — 既に値が入力されたフィールドを再度操作しないこと\n2. **スナップショットで入力済みフィールドを確認する** — fill/type 後のフィールドはスナップショットに入力値が表示される。値が表示されているフィールドはスキップする\n3. **上から下へ体系的に進む** — フォーム内のフィールドセット/セクションを上から順に処理する。前のセクションに戻らない\n4. **入力済みフィールド数を意識する** — 操作履歴を参照し、既に何を入力したかを把握する。同じセレクタへの重複操作は禁止\n5. **全フィールド入力後に送信する** — フォーム内の全必須フィールドが埋まったら、速やかに送信ボタンをクリックする\n6. **filledFields を確認する** — browserツールの結果に含まれる filledFields は入力済みフィールドの一覧。この一覧にあるフィールドは絶対に再入力しないこと\n\n## フォーム完了の検証\nフォーム入力のゴールで最終報告を返す前に:\n1. 現在のスナップショット全体をスキャンし、未入力フィールドがないか確認 — 全フィールドセット/セクションをチェック\n2. 以下を探す: 値のないテキストボックス、「Select...」プレースホルダー表示のドロップダウン、未チェックのチェックボックス\n3. フォームの最後のセクションは見落としやすい — フォーム最下部を必ず確認\n4. 全フィールド入力後、送信/登録ボタンをクリック\n5. goalAchieved: true を宣言する前に成功確認メッセージの表示を確認\n全セクション完了・フォーム送信を確認するまで goalAchieved を宣言しないこと。\n\n## データ収集パターン(ページネーション走査)\n手順: extract → memory_append → click「次へ」→ 繰り返し → memory_aggregate で集計\n\n例(テーブル抽出 → 蓄積 → 次ページ → 集計 → CSV出力):\n\\`\\`\\`json\n[\n {\"action\":\"extract\",\"description\":\"テーブル抽出\",\"script\":\"(()=>{const h=[...document.querySelectorAll('table thead th')].map(t=>t.textContent.trim());return[...document.querySelectorAll('table tbody tr')].map(r=>{const c=r.querySelectorAll('td');return Object.fromEntries([...c].map((c,i)=>[h[i]||'col'+i,c.textContent.trim()]));});})()\"},\n {\"action\":\"memory_append\",\"description\":\"蓄積\",\"memoryCollection\":\"data\"},\n {\"action\":\"click\",\"description\":\"次ページ\",\"selector\":\"@e15\"}\n]\n\\`\\`\\`\n集計: \\`[{\"action\":\"memory_aggregate\",\"description\":\"合計\",\"aggregation\":{\"collection\":\"data\",\"field\":\"amount\",\"operation\":\"sum\",\"outputVariable\":\"total\"}}]\\`\nCSV出力: \\`[{\"action\":\"export\",\"description\":\"CSV出力\",\"exportCollection\":\"data\",\"exportFormat\":\"csv\",\"exportPath\":\"/tmp/data.csv\"}]\\`\n\n注意: script で JSON.stringify() 不要。各行はフラットなオブジェクト。memoryStatus でコレクションのアイテム数を確認可能。\n\n**重要**: ページネーション走査時は最後のページまで必ず継続してください。ページ表示(例: \"Page X of Y\")を確認し、最終ページに到達するまで「次へ」をクリックし続けてください。数ページで止めず、全ページを処理してください。パターンを示すことが目的ではなく、全データの走査を完了することが目的です。\n\n## filledFields の活用\nbrowserツールの結果に \\`filledFields\\` が含まれている場合、これは既に入力済みのフォームフィールドの一覧です。\nリストに含まれるフィールドには再度入力しないでください。未入力のフィールドのみを操作してください。\n\n## 差分スナップショット\nテキスト入力(fill/type)後にページ構造が変わっていない場合、全refを一覧にしたコンパクトなスナップショットが返されます。\n- \\`Unfilled:\\` はまだ操作が必要な要素を示します\n- \\`Filled:\\` は入力済みの要素を示します\n- コンパクトスナップショット内の全refは有効で使用可能です\n- 完全なページコンテキストが必要な場合は \\`actions: []\\` でブラウザツールを呼び出してください\n\n## nudgeMessage への対応\nbrowserツールの結果に \\`nudgeMessage\\` が含まれている場合、重要なガイダンスが記載されています:\n- **ページネーション進捗**: 現在のページと残りページ数を示します。全ページの処理が完了するまで続行してください。\n- **ループ警告**: 同じ操作を繰り返している可能性があります。別のアプローチを試してください。\n- **フォームヒント**: 未入力のフォームフィールド一覧です。\nメッセージの指示に必ず従ってください。\n\n## ゴール達成時\nゴールが達成されたと判断したら — フォーム入力タスクの場合、全フィールドが入力済みでフォームが送信済みであることを先に確認すること — browserツールの呼び出しを停止し、以下のJSON形式で最終報告を返してください:\n\\`\\`\\`json\n{ \"goalAchieved\": true, \"summary\": \"達成内容の要約\" }\n\\`\\`\\`\n\nゴールが達成できないと判断した場合も同様に:\n\\`\\`\\`json\n{ \"goalAchieved\": false, \"summary\": \"状況の要約と理由\" }\n\\`\\`\\`\n\n---\n以下はこのタスク固有の情報です。\n\n## ゴール\n${goal}\n${contextSection}${secretsSection}\n日本語で応答してください。`;\n}\n\nexport function getInitialUserMessage(): string {\n return \"browserツールをactions:[](空配列)で呼び出し、現在のページ状態を確認してください。その後、ゴール達成に向けて探索を開始してください。\";\n}\n","/**\n * Review prompt — English\n */\n\nimport type { RecordedStep, InterventionRecord } from \"../../../instruction-generator/types\";\n\nexport function getReviewSystemPrompt(): string {\n return `You are an expert reviewer of web browser automation procedures.\n\n## Task\nAnalyze the recorded steps and determine the following:\n\n1. **Remove unnecessary steps**: Identify and exclude trial-and-error during exploration, dead ends, unnecessary navigation, and duplicate operations\n2. **Risk level assessment**: Assess the risk of each step\n - \\`low\\`: Low side-effect operations like input, scrolling, navigation\n - \\`medium\\`: Login, form submission, settings changes, etc.\n - \\`high\\`: Irreversible operations like deletion, payment, data modification\n3. **Approval requirement**: Whether user approval is needed before execution\n\n## Capture Candidate Identification\nIf you detect important data used in subsequent steps (IDs, order numbers, URL changes, amounts, etc.),\ninclude them as suggestedCaptures in each step's response.\nAvailable strategies: snapshot (regex), url (URL regex), ai (AI extraction), expression (template)\n\n## Notes\n- Failed steps (success=false) should generally be excluded\n- Keep only the shortest path steps needed to achieve the goal\n- riskLevel is used in the Chrome extension approval flow (medium/high requires approval)\n- Respond in English`;\n}\n\nexport function createReviewUserPrompt(\n goal: string,\n recordedSteps: RecordedStep[],\n goalAchieved: boolean,\n interventions?: InterventionRecord[],\n): string {\n const stepsList = recordedSteps\n .map(\n (s) =>\n `${s.ordinal}. [${s.success ? \"OK\" : \"FAIL\"}] ${s.action.description} (action: ${s.action.action}, url: ${s.url})${s.error ? ` Error: ${s.error}` : \"\"}`,\n )\n .join(\"\\n\");\n\n const interventionsSection =\n interventions && interventions.length > 0\n ? `\\n## User Interventions During Exploration\nThe user modified the exploration direction at the following points.\nSteps before the intervention likely contain trial-and-error, while steps after are more accurate.\n\n${interventions\n .map(\n (iv, i) =>\n `${i + 1}. Around step #${iv.stepIndex}: \"${iv.userInstruction}\" (URL: ${iv.url})`,\n )\n .join(\"\\n\")}\n\n**Review note**: Actively exclude unnecessary steps before intervention points.\n`\n : \"\";\n\n return `## Goal\n${goal}\n\n## Goal Achievement Status\n${goalAchieved ? \"Achieved\" : \"Not achieved\"}\n${interventionsSection}\n## All Recorded Steps\n${stepsList}`;\n}\n","/**\n * Review prompt — Japanese (current production)\n */\n\nimport type { RecordedStep, InterventionRecord } from \"../../../instruction-generator/types\";\n\nexport function getReviewSystemPrompt(): string {\n return `あなたはWebブラウザ自動操作の手順書をレビューするエキスパートです。\n\n## タスク\n記録されたステップを分析し、以下を判定してください:\n\n1. **不要ステップの除外**: 探索中の試行錯誤、行き止まり、不要なナビゲーション、重複操作を特定し除外\n2. **リスクレベル判定**: 各ステップのリスクを判定\n - \\`low\\`: 入力、スクロール、ナビゲーションなど副作用の少ない操作\n - \\`medium\\`: ログイン、フォーム送信、設定変更など\n - \\`high\\`: 削除、決済、データ変更など不可逆な操作\n3. **承認要否判定**: 実行前にユーザー承認が必要かどうか\n\n## キャプチャ候補の識別\n操作結果として後続ステップで使用される重要なデータ(ID、注文番号、URL変化、金額など)を検出した場合、\nsuggestedCaptures としてレスポンスの各ステップに含めてください。\n利用可能な strategy: snapshot(正規表現), url(URL正規表現), ai(AI抽出), expression(テンプレート)\n\n## 注意事項\n- 失敗ステップ(success=false)は基本的に除外してください\n- ゴール達成に必要な最短経路のステップのみ残してください\n- riskLevel は Chrome拡張の承認フローで使用されます(medium/high は承認が必要)\n- 日本語で応答してください`;\n}\n\nexport function createReviewUserPrompt(\n goal: string,\n recordedSteps: RecordedStep[],\n goalAchieved: boolean,\n interventions?: InterventionRecord[],\n): string {\n const stepsList = recordedSteps\n .map(\n (s) =>\n `${s.ordinal}. [${s.success ? \"成功\" : \"失敗\"}] ${s.action.description} (action: ${s.action.action}, url: ${s.url})${s.error ? ` エラー: ${s.error}` : \"\"}`,\n )\n .join(\"\\n\");\n\n const interventionsSection =\n interventions && interventions.length > 0\n ? `\\n## 探索中のユーザー介入\n以下のタイミングでユーザーが探索方針を修正しました。\n介入前のステップには探索の試行錯誤が含まれている可能性が高く、介入後のステップがより正確な手順です。\n\n${interventions\n .map(\n (iv, i) =>\n `${i + 1}. ステップ#${iv.stepIndex}付近: \"${iv.userInstruction}\" (URL: ${iv.url})`,\n )\n .join(\"\\n\")}\n\n**レビュー時の注意**: 介入ポイントより前の不要なステップは積極的に除外してください。\n`\n : \"\";\n\n return `## ゴール\n${goal}\n\n## ゴール達成状況\n${goalAchieved ? \"達成済み\" : \"未達成\"}\n${interventionsSection}\n## 記録された全ステップ\n${stepsList}`;\n}\n","/**\n * Selector resolver prompt — English\n */\n\nimport type { Selector } from \"../../../instruction-executor/types\";\nimport type { RetryContext } from \"../../../harness/selector-resolver\";\n\nexport function buildSelectorMessages(\n snapshot: string,\n selector: Selector,\n stepDescription: string,\n url: string,\n contextMarkdown?: string,\n retryContext?: RetryContext,\n workingMemorySummary?: string,\n): { system: string; userPrompt: string } {\n const system = [\n \"You are a selector resolver for browser automation.\",\n \"Based on the step description, identify the target element in the accessibility snapshot.\",\n \"\",\n \"## Matching Guidelines\",\n \"1. Infer the type of target element (button, input field, link, etc.) from the step description\",\n \"2. Find the element in the snapshot that semantically best matches the step description\",\n \"3. Use surrounding text, labels, placeholders, and roles as clues\",\n \"4. Even without an exact match, return the ref of the most likely element\",\n \"5. Return an empty string only if the target element truly does not exist in the snapshot\",\n ].join(\"\\n\");\n\n const parts: string[] = [\n \"## Step Description (Most Important)\",\n stepDescription,\n \"\",\n \"## Selector Hints (Reference)\",\n \"The following is reference information for identifying the element. Even without an exact match, choose the element semantically closest to the step description.\",\n JSON.stringify(pruneSelectorHints(selector)),\n \"\",\n \"Notes:\",\n '- If tagName is \"unknown\" or \":\", there is no tag name information',\n \"- ariaLabel is auto-generated from the step description and may not match the actual aria-label attribute\",\n \"- Prioritize semantic match with the step description over exact selector match\",\n \"\",\n \"## Current URL\",\n url,\n ];\n\n if (workingMemorySummary) {\n parts.push(\"\", \"## Execution Context\", workingMemorySummary);\n }\n\n parts.push(\n \"\",\n \"## Accessibility Snapshot\",\n snapshot,\n );\n\n const includeContext = contextMarkdown && !(retryContext && retryContext.attempt > 0);\n if (includeContext) {\n parts.push(\"\", \"## Supplementary Context\", contextMarkdown);\n }\n\n if (retryContext && retryContext.attempt > 0) {\n parts.push(\n \"\",\n \"## Recovery Context (Attempt \" + (retryContext.attempt + 1) + \")\",\n );\n\n // Failure pattern hints from registry\n if (retryContext.failureHints) {\n parts.push(`Pattern: ${retryContext.failureHints}`);\n }\n\n if (retryContext.failureHistory.length > 0) {\n const recent = retryContext.failureHistory.slice(-2);\n parts.push(`Previous: ${recent.join(\"; \")}`);\n }\n if (retryContext.previousAiResponse) {\n // Extract only the reasoning from the previous AI response\n try {\n const parsed = JSON.parse(retryContext.previousAiResponse);\n if (parsed.reasoning) {\n parts.push(`Last reasoning: \"${parsed.reasoning}\"`);\n }\n } catch {\n parts.push(`Last response: ${retryContext.previousAiResponse.slice(0, 200)}`);\n }\n }\n if (!retryContext.snapshotChanged) {\n parts.push(\n \"Snapshot unchanged — try partial matching, role-based matching, or inference from nearby elements.\",\n );\n }\n }\n\n return { system, userPrompt: parts.join(\"\\n\") };\n}\n\nfunction pruneSelectorHints(selector: Selector): Record<string, unknown> {\n const pruned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(selector)) {\n if (value === null || value === undefined || value === \"\" || value === \"unknown\" || value === \":\") continue;\n pruned[key] = value;\n }\n return pruned;\n}\n","/**\n * Selector resolver prompt — Japanese (current production)\n */\n\nimport type { Selector } from \"../../../instruction-executor/types\";\nimport type { RetryContext } from \"../../../harness/selector-resolver\";\n\nexport function buildSelectorMessages(\n snapshot: string,\n selector: Selector,\n stepDescription: string,\n url: string,\n contextMarkdown?: string,\n retryContext?: RetryContext,\n workingMemorySummary?: string,\n): { system: string; userPrompt: string } {\n const system = [\n \"あなたはブラウザ自動操作のセレクタリゾルバーです。\",\n \"ステップの説明に基づいて、アクセシビリティスナップショット内の操作対象要素を特定してください。\",\n \"\",\n \"## マッチングの指針\",\n \"1. ステップの説明から操作対象の要素の種類(ボタン、入力フィールド、リンク等)を推定する\",\n \"2. スナップショット内で、ステップの説明と意味的に最も一致する要素を探す\",\n \"3. 周辺のテキスト、ラベル、プレースホルダー、role も手がかりにする\",\n \"4. 完全一致がなくても最も可能性の高い要素の ref を返す\",\n \"5. 該当する要素がスナップショット内に本当に存在しない場合のみ空文字を返す\",\n ].join(\"\\n\");\n\n const parts: string[] = [\n \"## ステップの説明(最重要)\",\n stepDescription,\n \"\",\n \"## セレクタのヒント(参考情報)\",\n \"以下は要素を特定するための参考情報です。完全一致しない場合でも、ステップの説明から意味的に最も近い要素を選んでください。\",\n JSON.stringify(pruneSelectorHints(selector)),\n \"\",\n \"注意:\",\n '- tagName が \"unknown\" や \":\" の場合はタグ名情報がありません',\n \"- ariaLabel はステップ説明から自動生成されたものであり、実際の aria-label 属性と一致しないことがあります\",\n \"- セレクタの完全一致よりもステップの説明との意味的一致を優先してください\",\n \"\",\n \"## 現在のURL\",\n url,\n ];\n\n if (workingMemorySummary) {\n parts.push(\"\", \"## 実行コンテキスト\", workingMemorySummary);\n }\n\n parts.push(\n \"\",\n \"## アクセシビリティスナップショット\",\n snapshot,\n );\n\n const includeContext = contextMarkdown && !(retryContext && retryContext.attempt > 0);\n if (includeContext) {\n parts.push(\"\", \"## 補足コンテキスト\", contextMarkdown);\n }\n\n if (retryContext && retryContext.attempt > 0) {\n parts.push(\n \"\",\n \"## 回復コンテキスト(試行\" + (retryContext.attempt + 1) + \"回目)\",\n );\n\n // FailureRegistry からの回復ヒント\n if (retryContext.failureHints) {\n parts.push(`パターン: ${retryContext.failureHints}`);\n }\n\n if (retryContext.failureHistory.length > 0) {\n const recent = retryContext.failureHistory.slice(-2);\n parts.push(`直近の失敗: ${recent.join(\"; \")}`);\n }\n if (retryContext.previousAiResponse) {\n try {\n const parsed = JSON.parse(retryContext.previousAiResponse);\n if (parsed.reasoning) {\n parts.push(`前回の推論: \"${parsed.reasoning}\"`);\n }\n } catch {\n parts.push(`前回の応答: ${retryContext.previousAiResponse.slice(0, 200)}`);\n }\n }\n if (!retryContext.snapshotChanged) {\n parts.push(\n \"スナップショット未変化 — 部分一致、roleベースのマッチング、近接要素からの推定を試みてください。\",\n );\n }\n }\n\n return { system, userPrompt: parts.join(\"\\n\") };\n}\n\nfunction pruneSelectorHints(selector: Selector): Record<string, unknown> {\n const pruned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(selector)) {\n if (value === null || value === undefined || value === \"\" || value === \"unknown\" || value === \":\") continue;\n pruned[key] = value;\n }\n return pruned;\n}\n","/**\n * Goal agent (fallback) prompt — English\n */\n\nimport type { GoalAgentStep } from \"../../../harness/goal-agent\";\n\nexport function buildFallbackMessages(\n snapshot: string,\n step: GoalAgentStep,\n failureHistory: string[],\n url: string,\n contextMarkdown?: string,\n): { system: string; userPrompt: string } {\n const system = [\n \"You are a problem-solving agent for browser automation.\",\n \"Normal selector resolution has failed at all phases. Analyze the entire page and find an alternative operation path.\",\n \"\",\n \"## Alternative Path Search Guidelines\",\n \"1. Check if the target element is hidden inside a hamburger menu, dropdown, or accordion\",\n \"2. Check if a modal or overlay is covering the target element\",\n \"3. Check if the page is in an unexpected state (not logged in, error state, loading)\",\n \"4. Check if the target element is above the current scroll position\",\n \"5. Check if a semantically equivalent alternative element exists (e.g., a button instead of a link)\",\n \"\",\n \"## Alternative Strategy Selection Criteria\",\n \"- direct_ref: Try a different ref directly (when a semantically equivalent element is found)\",\n \"- scroll_up_and_retry: When the target element might be above the current view\",\n \"- expand_collapsed: When a collapsed section/menu needs to be expanded (prerequisiteRef required)\",\n \"- dismiss_overlay: When a modal/overlay needs to be closed (prerequisiteRef required)\",\n \"- tab_navigation: When the element can be reached via Tab key focus navigation\",\n \"- not_found: When the target element truly does not exist on the page\",\n ].join(\"\\n\");\n\n const parts = [\n \"## Step Being Attempted\",\n `Description: ${step.description}`,\n `Action: ${step.action.type}`,\n `Selector hints: ${JSON.stringify(step.action.selector, null, 2)}`,\n `URL: ${url}`,\n \"\",\n \"## Failure History\",\n ...failureHistory.map((f, i) => ` ${i + 1}. ${f}`),\n \"\",\n \"## Current Page Snapshot (Filtered)\",\n snapshot,\n ];\n\n if (contextMarkdown) {\n parts.push(\"\", \"## Supplementary Context\", contextMarkdown);\n }\n\n return { system, userPrompt: parts.join(\"\\n\") };\n}\n","/**\n * Goal agent (fallback) prompt — Japanese (current production)\n */\n\nimport type { GoalAgentStep } from \"../../../harness/goal-agent\";\n\nexport function buildFallbackMessages(\n snapshot: string,\n step: GoalAgentStep,\n failureHistory: string[],\n url: string,\n contextMarkdown?: string,\n): { system: string; userPrompt: string } {\n const system = [\n \"あなたはブラウザ自動操作の問題解決エージェントです。\",\n \"通常のセレクタ解決が全フェーズ失敗しました。ページ全体を分析して代替操作パスを見つけてください。\",\n \"\",\n \"## 代替パス探索の指針\",\n \"1. ハンバーガーメニュー、ドロップダウン、アコーディオンの中に対象要素が隠れていないか確認\",\n \"2. モーダルやオーバーレイが前面にあって対象要素を隠していないか確認\",\n \"3. ページが想定と異なる状態(未ログイン、エラー状態、ローディング中)でないか確認\",\n \"4. 対象要素が上方にあってスクロールで隠れていないか確認\",\n \"5. 意味的に同等な別の要素(リンクではなくボタン、等)が存在しないか確認\",\n \"\",\n \"## 代替戦略の選択基準\",\n \"- direct_ref: 別の ref を直接試す(意味的に同等な要素が見つかった場合)\",\n \"- scroll_up_and_retry: 対象要素が上方にある可能性がある場合\",\n \"- expand_collapsed: 折り畳まれたセクション/メニューを展開する必要がある場合(prerequisiteRef 必須)\",\n \"- dismiss_overlay: モーダル/オーバーレイを閉じる必要がある場合(prerequisiteRef 必須)\",\n \"- tab_navigation: Tab キーでフォーカス移動して到達できる場合\",\n \"- not_found: 本当にページ上に対象要素が存在しない場合\",\n ].join(\"\\n\");\n\n const parts = [\n \"## 達成しようとしていたステップ\",\n `説明: ${step.description}`,\n `アクション: ${step.action.type}`,\n `セレクタヒント: ${JSON.stringify(step.action.selector, null, 2)}`,\n `URL: ${url}`,\n \"\",\n \"## これまでの失敗履歴\",\n ...failureHistory.map((f, i) => ` ${i + 1}. ${f}`),\n \"\",\n \"## 現在のページスナップショット(フィルタ済み)\",\n snapshot,\n ];\n\n if (contextMarkdown) {\n parts.push(\"\", \"## 補足コンテキスト\", contextMarkdown);\n }\n\n return { system, userPrompt: parts.join(\"\\n\") };\n}\n","/**\n * Vision resolver prompt — English\n */\n\nimport type { Selector } from \"../../../instruction-executor/types\";\nimport type { Annotation } from \"../../../browser/agent-browser-imports\";\n\nexport function buildVisionMessages(\n annotations: Annotation[],\n selector: Selector,\n stepDescription: string,\n url: string,\n failureHistory: string[],\n): { system: string; userTextContent: string } {\n const system = [\n \"You are a visual selector resolver for browser automation.\",\n \"The text-based accessibility tree could not find the element.\",\n \"Analyze the screenshot visually to identify the target element.\",\n \"\",\n \"## How to Read the Screenshot\",\n \"- Each interactive element has a red border and number label\",\n \"- Number labels are displayed at the top-left of each element\",\n \"- Each number corresponds to the number field in the annotation list below\",\n \"\",\n \"## Matching Guidelines\",\n \"1. Infer the type of target element (button, input field, link, etc.) from the step description\",\n \"2. Find the element in the screenshot that visually best matches\",\n \"3. Use element text, position, and appearance as clues\",\n \"4. Also reference the role and name from the annotation list\",\n \"5. Target elements not in the A11y tree (canvas, Shadow DOM, iframe, etc.) are also in scope\",\n \"6. Return empty string if confidence is low (below 0.5)\",\n ].join(\"\\n\");\n\n const annotationList = annotations\n .map((a) => {\n const nameStr = a.name ? ` \"${a.name}\"` : \"\";\n return ` #${a.number} ref=${a.ref} ${a.role}${nameStr} @(${a.box.x},${a.box.y})`;\n })\n .join(\"\\n\");\n\n const selectorHints = pruneSelectorHints(selector);\n\n const parts: string[] = [\n \"## Step Description (Most Important)\",\n stepDescription,\n \"\",\n \"## Selector Hints (Reference)\",\n JSON.stringify(selectorHints),\n \"\",\n \"## Current URL\",\n url,\n \"\",\n \"## Annotation List (Corresponds to Numbers on Screenshot)\",\n annotationList,\n ];\n\n if (failureHistory.length > 0) {\n const recent = failureHistory.slice(-3);\n parts.push(\n \"\",\n \"## Text-based Resolution Failure History (Recent 3)\",\n ...recent.map((f, i) => ` ${i + 1}. ${f}`),\n );\n }\n\n return { system, userTextContent: parts.join(\"\\n\") };\n}\n\nfunction pruneSelectorHints(selector: Selector): Record<string, unknown> {\n const pruned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(selector)) {\n if (value === null || value === undefined || value === \"\" || value === \"unknown\" || value === \":\") continue;\n pruned[key] = value;\n }\n return pruned;\n}\n","/**\n * Vision resolver prompt — Japanese (current production)\n */\n\nimport type { Selector } from \"../../../instruction-executor/types\";\nimport type { Annotation } from \"../../../browser/agent-browser-imports\";\n\nexport function buildVisionMessages(\n annotations: Annotation[],\n selector: Selector,\n stepDescription: string,\n url: string,\n failureHistory: string[],\n): { system: string; userTextContent: string } {\n const system = [\n \"あなたはブラウザ自動操作のビジュアルセレクタリゾルバーです。\",\n \"テキストベースのアクセシビリティツリーでは要素が見つかりませんでした。\",\n \"スクリーンショットを視覚的に分析して、操作対象の要素を特定してください。\",\n \"\",\n \"## スクリーンショットの見方\",\n \"- 各インタラクティブ要素に赤い枠線と番号ラベルが表示されています\",\n \"- 番号ラベルは各要素の左上に表示されます\",\n \"- 各番号は下記のアノテーション一覧の number フィールドに対応します\",\n \"\",\n \"## マッチングの指針\",\n \"1. ステップの説明から操作対象の要素の種類(ボタン、入力フィールド、リンク等)を推定\",\n \"2. スクリーンショット内で視覚的に最も一致する要素を探す\",\n \"3. 要素のテキスト、位置、外観を手がかりにする\",\n \"4. アノテーション一覧の role と name も参考にする\",\n \"5. A11y ツリーに表れない要素(canvas、Shadow DOM、iframe 内等)も対象\",\n \"6. 確信度が低い場合(0.5未満)は空文字を返す\",\n ].join(\"\\n\");\n\n const annotationList = annotations\n .map((a) => {\n const nameStr = a.name ? ` \"${a.name}\"` : \"\";\n return ` #${a.number} ref=${a.ref} ${a.role}${nameStr} @(${a.box.x},${a.box.y})`;\n })\n .join(\"\\n\");\n\n const selectorHints = pruneSelectorHints(selector);\n\n const parts: string[] = [\n \"## ステップの説明(最重要)\",\n stepDescription,\n \"\",\n \"## セレクタのヒント(参考情報)\",\n JSON.stringify(selectorHints),\n \"\",\n \"## 現在のURL\",\n url,\n \"\",\n \"## アノテーション一覧(スクリーンショット上の番号と対応)\",\n annotationList,\n ];\n\n if (failureHistory.length > 0) {\n const recent = failureHistory.slice(-3);\n parts.push(\n \"\",\n \"## テキストベース解決の失敗履歴(直近3件)\",\n ...recent.map((f, i) => ` ${i + 1}. ${f}`),\n );\n }\n\n return { system, userTextContent: parts.join(\"\\n\") };\n}\n\nfunction pruneSelectorHints(selector: Selector): Record<string, unknown> {\n const pruned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(selector)) {\n if (value === null || value === undefined || value === \"\" || value === \"unknown\" || value === \":\") continue;\n pruned[key] = value;\n }\n return pruned;\n}\n","/**\n * Maintenance analyzer prompt — English\n */\n\nimport type { ParsedInstruction } from \"../../../instruction-executor/types\";\n\nexport function getSuggestionSystemPrompt(): string {\n return [\n \"You are an instruction debugger for browser automation.\",\n \"Analyze the failed steps from the debug execution and generate fix suggestions for the instruction and context.\",\n \"\",\n \"## Fix Suggestion Guidelines\",\n \"\",\n \"For each failed step, provide suggestions from these two perspectives:\",\n \"\",\n \"### 1. instructionFix (Instruction YAML Fix)\",\n \"- Selector changes (when element has moved/been renamed)\",\n \"- Step addition/removal (when the navigation flow has changed)\",\n \"- Action value updates (text or URL changes)\",\n \"- riskLevel or requiresConfirmation adjustments\",\n `Example: \"Step 3: Change selector ariaLabel from 'Submit' to 'Confirm and Submit'\"`,\n \"\",\n \"### 2. contextFix (Context Markdown Fix)\",\n \"- Document page structure changes (new modals, menu structure changes, etc.)\",\n \"- Add prerequisites (login state, permissions, environment conditions, etc.)\",\n \"- Add selector resolution hints (dynamic ID naming patterns, etc.)\",\n `Example: \"Add to context: 'Settings page has changed from tab UI to accordion UI'\"`,\n \"\",\n \"If context markdown is not provided, return empty string for contextFix.\",\n \"\",\n \"### severity Criteria\",\n \"- error: Selector completely not found, fundamental page structure change\",\n \"- warning: Succeeded with retry but unstable, element position or label slightly changed\",\n \"\",\n \"### failureCategory and suggestedStrategy\",\n \"If a failure category is provided, describe a specific fix strategy in suggestedStrategy:\",\n \"- element_not_found: Update selector ariaLabel/role/text to match current page structure\",\n \"- element_stale: Delete selector cache and re-execute\",\n \"- page_structure_changed: Document page structure changes in context.md and update all selectors\",\n \"- navigation_timeout: Add wait step or increase step-delay\",\n \"- action_failed: Consider changing action type (e.g., click → hover)\",\n \"- unknown: Analyze error details and propose specific remediation\",\n ].join(\"\\n\");\n}\n\nexport function buildSuggestionUserPrompt(\n failedInfo: string[],\n stepsInfo: string[],\n instruction: ParsedInstruction,\n contextMarkdown?: string,\n): string {\n const parts: string[] = [\n \"## Instruction Information\",\n `Title: ${instruction.title}`,\n `Goal: ${instruction.metadata.goal}`,\n `Start URL: ${instruction.metadata.startUrl}`,\n \"\",\n \"## Instruction Steps\",\n stepsInfo.join(\"\\n\\n\"),\n \"\",\n \"## Failed Step Details\",\n failedInfo.join(\"\\n\\n\"),\n ];\n\n if (contextMarkdown) {\n parts.push(\n \"\",\n \"## Current Context (markdown)\",\n contextMarkdown,\n );\n } else {\n parts.push(\n \"\",\n \"## Context\",\n \"Context markdown is not provided. Return empty string for contextFix.\",\n );\n }\n\n return parts.join(\"\\n\");\n}\n","/**\n * Maintenance analyzer prompt — Japanese (current production)\n */\n\nimport type { ParsedInstruction } from \"../../../instruction-executor/types\";\n\nexport function getSuggestionSystemPrompt(): string {\n return [\n \"あなたはブラウザ自動操作の指示書デバッガーです。\",\n \"デバッグ実行で失敗したステップを分析し、指示書とコンテキストの修正提案を生成してください。\",\n \"\",\n \"## 修正提案の指針\",\n \"\",\n \"各失敗ステップについて、以下の2つの観点で修正提案を出してください:\",\n \"\",\n \"### 1. instructionFix(指示書 YAML の修正)\",\n \"- セレクタの変更(要素が移動/リネームされた場合)\",\n \"- ステップの追加/削除(導線が変わった場合)\",\n \"- アクション値の更新(テキストやURLの変更)\",\n \"- riskLevel や requiresConfirmation の調整\",\n '例: 「Step 3: selector の ariaLabel を \\'送信\\' → \\'確認して送信\\' に変更」',\n \"\",\n \"### 2. contextFix(context markdown の修正)\",\n \"- ページ構造変更の記載(新しいモーダル、メニュー構造の変更など)\",\n \"- 前提条件の追加(ログイン状態、権限、環境条件など)\",\n \"- セレクタ解決のヒント追加(動的IDの命名規則など)\",\n '例: 「context に\\'設定画面がタブUIからアコーディオンUIに変更された\\'旨を追記」',\n \"\",\n \"context markdown が未提供の場合、contextFix は空文字で返してください。\",\n \"\",\n \"### severity の判定基準\",\n \"- error: セレクタが完全に見つからない、ページ構造が根本的に変わっている\",\n \"- warning: リトライで成功したが不安定、要素の位置やラベルが微妙に変わっている\",\n \"\",\n \"### failureCategory と suggestedStrategy\",\n \"エラー分類カテゴリが提供されている場合、それに基づいて具体的な修正戦略を suggestedStrategy に記載してください:\",\n \"- element_not_found: セレクタの ariaLabel/role/text を現在のページ構造に合わせて更新\",\n \"- element_stale: セレクタキャッシュの削除と再実行\",\n \"- page_structure_changed: context.md にページ構造変更を記録し、セレクタを全面更新\",\n \"- navigation_timeout: wait ステップの追加または step-delay の増加\",\n \"- action_failed: アクション種別の変更(例: click → hover)を検討\",\n \"- unknown: エラー内容を詳細に分析し、具体的な対処を提案\",\n ].join(\"\\n\");\n}\n\nexport function buildSuggestionUserPrompt(\n failedInfo: string[],\n stepsInfo: string[],\n instruction: ParsedInstruction,\n contextMarkdown?: string,\n): string {\n const parts: string[] = [\n \"## 指示書情報\",\n `タイトル: ${instruction.title}`,\n `目的: ${instruction.metadata.goal}`,\n `開始URL: ${instruction.metadata.startUrl}`,\n \"\",\n \"## 指示書のステップ一覧\",\n stepsInfo.join(\"\\n\\n\"),\n \"\",\n \"## 失敗ステップの詳細\",\n failedInfo.join(\"\\n\\n\"),\n ];\n\n if (contextMarkdown) {\n parts.push(\n \"\",\n \"## 現在のコンテキスト(markdown)\",\n contextMarkdown,\n );\n } else {\n parts.push(\n \"\",\n \"## コンテキスト\",\n \"context markdown は未提供です。contextFix は空文字で返してください。\",\n );\n }\n\n return parts.join(\"\\n\");\n}\n","/**\n * i18n/prompts --- ロケール切替ディスパッチャー\n *\n * AI プロンプト(複雑な複数行テンプレート)をロケールごとに切り替える。\n * 各プロンプトモジュールは関数を export し、ディスパッチャーが getLocale() に\n * 基づいて適切なロケールの関数を呼び出す。\n */\n\nimport { getLocale } from \"../index\";\n\nimport { getAgentInstructions as getAgentInstructionsEn, getInitialUserMessage as getInitialUserMessageEn } from \"./en/exploration\";\nimport { getAgentInstructions as getAgentInstructionsJa, getInitialUserMessage as getInitialUserMessageJa } from \"./ja/exploration\";\n\nimport { getReviewSystemPrompt as getReviewSystemPromptEn, createReviewUserPrompt as createReviewUserPromptEn } from \"./en/review\";\nimport { getReviewSystemPrompt as getReviewSystemPromptJa, createReviewUserPrompt as createReviewUserPromptJa } from \"./ja/review\";\n\nimport { buildSelectorMessages as buildSelectorMessagesEn } from \"./en/selector\";\nimport { buildSelectorMessages as buildSelectorMessagesJa } from \"./ja/selector\";\n\nimport { buildFallbackMessages as buildFallbackMessagesEn } from \"./en/goal-agent\";\nimport { buildFallbackMessages as buildFallbackMessagesJa } from \"./ja/goal-agent\";\n\nimport { buildVisionMessages as buildVisionMessagesEn } from \"./en/vision\";\nimport { buildVisionMessages as buildVisionMessagesJa } from \"./ja/vision\";\n\nimport { getSuggestionSystemPrompt as getSuggestionSystemPromptEn, buildSuggestionUserPrompt as buildSuggestionUserPromptEn } from \"./en/maintenance\";\nimport { getSuggestionSystemPrompt as getSuggestionSystemPromptJa, buildSuggestionUserPrompt as buildSuggestionUserPromptJa } from \"./ja/maintenance\";\n\nimport type { SecretsData } from \"../../cli/secrets-loader\";\nimport type { RecordedStep, InterventionRecord } from \"../../instruction-generator/types\";\nimport type { Selector } from \"../../instruction-executor/types\";\nimport type { RetryContext } from \"../../harness/selector-resolver\";\nimport type { GoalAgentStep } from \"../../harness/goal-agent\";\nimport type { Annotation } from \"../../browser/agent-browser-imports\";\nimport type { ParsedInstruction } from \"../../instruction-executor/types\";\n\n// ── Exploration ──\n\nexport function getAgentInstructions(goal: string, contextMarkdown?: string, secrets?: SecretsData): string {\n return getLocale() === \"ja\"\n ? getAgentInstructionsJa(goal, contextMarkdown, secrets)\n : getAgentInstructionsEn(goal, contextMarkdown, secrets);\n}\n\nexport function getInitialUserMessage(): string {\n return getLocale() === \"ja\"\n ? getInitialUserMessageJa()\n : getInitialUserMessageEn();\n}\n\n// ── Review ──\n\nexport function getReviewSystemPrompt(): string {\n return getLocale() === \"ja\"\n ? getReviewSystemPromptJa()\n : getReviewSystemPromptEn();\n}\n\nexport function createReviewUserPrompt(\n goal: string,\n recordedSteps: RecordedStep[],\n goalAchieved: boolean,\n interventions?: InterventionRecord[],\n): string {\n return getLocale() === \"ja\"\n ? createReviewUserPromptJa(goal, recordedSteps, goalAchieved, interventions)\n : createReviewUserPromptEn(goal, recordedSteps, goalAchieved, interventions);\n}\n\n// ── Selector ──\n\nexport function buildSelectorMessages(\n snapshot: string,\n selector: Selector,\n stepDescription: string,\n url: string,\n contextMarkdown?: string,\n retryContext?: RetryContext,\n workingMemorySummary?: string,\n): { system: string; userPrompt: string } {\n return getLocale() === \"ja\"\n ? buildSelectorMessagesJa(snapshot, selector, stepDescription, url, contextMarkdown, retryContext, workingMemorySummary)\n : buildSelectorMessagesEn(snapshot, selector, stepDescription, url, contextMarkdown, retryContext, workingMemorySummary);\n}\n\n// ── Goal Agent ──\n\nexport function buildFallbackMessages(\n snapshot: string,\n step: GoalAgentStep,\n failureHistory: string[],\n url: string,\n contextMarkdown?: string,\n): { system: string; userPrompt: string } {\n return getLocale() === \"ja\"\n ? buildFallbackMessagesJa(snapshot, step, failureHistory, url, contextMarkdown)\n : buildFallbackMessagesEn(snapshot, step, failureHistory, url, contextMarkdown);\n}\n\n// ── Vision ──\n\nexport function buildVisionMessages(\n annotations: Annotation[],\n selector: Selector,\n stepDescription: string,\n url: string,\n failureHistory: string[],\n): { system: string; userTextContent: string } {\n return getLocale() === \"ja\"\n ? buildVisionMessagesJa(annotations, selector, stepDescription, url, failureHistory)\n : buildVisionMessagesEn(annotations, selector, stepDescription, url, failureHistory);\n}\n\n// ── Maintenance ──\n\nexport function getSuggestionSystemPrompt(): string {\n return getLocale() === \"ja\"\n ? getSuggestionSystemPromptJa()\n : getSuggestionSystemPromptEn();\n}\n\nexport function buildSuggestionUserPrompt(\n failedInfo: string[],\n stepsInfo: string[],\n instruction: ParsedInstruction,\n contextMarkdown?: string,\n): string {\n return getLocale() === \"ja\"\n ? buildSuggestionUserPromptJa(failedInfo, stepsInfo, instruction, contextMarkdown)\n : buildSuggestionUserPromptEn(failedInfo, stepsInfo, instruction, contextMarkdown);\n}\n","/**\n * report-sections — 実行レポートと探索レポートで共通のセクション生成関数群\n *\n * AI Metrics、デバッグログ、セレクタ解決統計、リトライ分布、\n * 失敗カテゴリ分布、回復機構有効性、パフォーマンスボトルネック等を\n * Markdown セクションとしてフォーマットする。\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { computeTotalRealInput, computeCacheRate, type AIMetricsSummary } from \"./ai-metrics\";\nimport { getModelId, getModelProvider } from \"./ai-model\";\nimport { getRecoveryHint } from \"./error-classifier\";\n\n// ── 型定義 ──\n\nexport interface DebugLogEntry {\n phase?: string;\n event?: string;\n step?: number;\n data?: Record<string, unknown>;\n timestamp?: string;\n}\n\n/** 両レポートで共通利用できるステップ情報の最小インターフェース */\nexport interface ReportableStep {\n ordinal: number;\n description: string;\n status: \"success\" | \"failed\" | \"skipped\";\n durationMs: number;\n error?: string;\n failureCategory?: string;\n retryCount?: number;\n actionType?: string;\n diagnostics?: {\n stepAction?: { selector?: Record<string, unknown> };\n deterministicResolveResult?: string;\n };\n}\n\n// ── デバッグログ ──\n\nexport async function readDebugLog(\n filePath: string,\n): Promise<DebugLogEntry[]> {\n try {\n const content = await readFile(filePath, \"utf-8\");\n return content\n .trim()\n .split(\"\\n\")\n .filter((line) => line.trim())\n .map((line) => {\n try {\n return JSON.parse(line) as DebugLogEntry;\n } catch {\n return {};\n }\n });\n } catch {\n return [];\n }\n}\n\n// ── AI Metrics ──\n\nexport function formatAiMetricsSection(aiMetrics: AIMetricsSummary): string[] {\n const lines: string[] = [];\n if (aiMetrics.totalCalls <= 0) return lines;\n\n const m = aiMetrics;\n const totalRealInput = computeTotalRealInput(m);\n const cacheRate = (computeCacheRate(m) * 100).toFixed(1);\n\n lines.push(\"### AI Metrics\");\n lines.push(\"\");\n lines.push(\"| メトリクス | 値 |\");\n lines.push(\"|-----------|-----|\");\n lines.push(`| Total calls | ${m.totalCalls} |`);\n lines.push(`| Total input tokens | ${totalRealInput.toLocaleString()} |`);\n lines.push(`| Output tokens | ${m.totalOutputTokens.toLocaleString()} |`);\n lines.push(`| Cache read tokens | ${m.totalCachedInputTokens.toLocaleString()} |`);\n lines.push(`| Cache write tokens | ${m.totalCacheCreationTokens.toLocaleString()} |`);\n lines.push(`| Cache hit rate | ${cacheRate}% |`);\n lines.push(`| Estimated cost | $${m.estimatedCostUsd.toFixed(4)} |`);\n lines.push(`| Total AI duration | ${(m.totalDurationMs / 1000).toFixed(1)}s |`);\n lines.push(\"\");\n\n // キャッシュヒット率の診断\n const cacheHitRate = computeCacheRate(m);\n if (cacheHitRate < 0.3 && m.totalCalls >= 3) {\n lines.push(`> **:warning: キャッシュヒット率が低い (${cacheRate}%)**`);\n lines.push(\"> AI プロンプトキャッシュの活用が少なく、コスト効率が悪い可能性があります。\");\n lines.push(\"> 考えられる原因: プロンプトの先頭部分が毎回異なる、スナップショットが大きく変動する、同一セレクタの再解決が発生していない。\");\n lines.push(\"\");\n }\n\n if (Object.keys(m.byPurpose).length > 0) {\n lines.push(\"**By purpose:**\");\n lines.push(\"\");\n lines.push(\"| Purpose | Calls | Input | Output | Cache Read | Cache Write | Duration |\");\n lines.push(\"|---------|-------|-------|--------|------------|-------------|----------|\");\n for (const [purpose, b] of Object.entries(m.byPurpose)) {\n const purposeRealInput = computeTotalRealInput(b);\n lines.push(\n `| ${purpose} | ${b.calls} | ${purposeRealInput.toLocaleString()} | ${b.outputTokens.toLocaleString()} | ${b.cachedInputTokens.toLocaleString()} | ${b.cacheCreationTokens.toLocaleString()} | ${(b.durationMs / 1000).toFixed(1)}s |`,\n );\n }\n lines.push(\"\");\n }\n\n if (m.byModel && Object.keys(m.byModel).length > 0) {\n lines.push(\"**By model:**\");\n lines.push(\"\");\n lines.push(\"| Model | Calls | Input | Output | Cache Read | Cache Write | Cost | Duration |\");\n lines.push(\"|-------|-------|-------|--------|------------|-------------|------|----------|\");\n for (const [modelId, b] of Object.entries(m.byModel)) {\n const modelRealInput = computeTotalRealInput(b);\n lines.push(\n `| ${modelId} | ${b.calls} | ${modelRealInput.toLocaleString()} | ${b.outputTokens.toLocaleString()} | ${b.cachedInputTokens.toLocaleString()} | ${b.cacheCreationTokens.toLocaleString()} | $${b.estimatedCostUsd.toFixed(4)} | ${(b.durationMs / 1000).toFixed(1)}s |`,\n );\n }\n lines.push(\"\");\n }\n\n return lines;\n}\n\n// ── Runtime Environment ──\n\nexport function formatRuntimeEnvironment(): string[] {\n const lines: string[] = [];\n lines.push(\"### Runtime Environment\");\n lines.push(\"\");\n lines.push(`- **AI Model**: ${getModelId()} (${getModelProvider()})`);\n lines.push(`- **Node.js**: ${process.version}`);\n lines.push(`- **Platform**: ${process.platform} ${process.arch}`);\n lines.push(\"\");\n return lines;\n}\n\n// ── Selector Resolution Statistics ──\n\nexport function formatSelectorResolutionStats(\n debugEntries: DebugLogEntry[],\n allSteps: ReportableStep[],\n): string[] {\n const lines: string[] = [];\n\n lines.push(\"### Selector Resolution Statistics\");\n lines.push(\"\");\n\n const stepsWithSelector = allSteps.filter(\n (s) => s.diagnostics?.stepAction?.selector || s.diagnostics?.deterministicResolveResult,\n );\n\n const deterministicHits = debugEntries.filter((e) => e.event === \"deterministic_resolve\").length;\n const deterministicMisses = debugEntries.filter((e) => e.event === \"deterministic_resolve_miss\").length;\n const aiResolves = debugEntries.filter((e) => e.event === \"selector_resolve\").length;\n const cacheHits = debugEntries.filter((e) => e.event === \"selector_cache_hit\").length;\n const cacheStales = debugEntries.filter((e) => e.event === \"selector_cache_stale\").length;\n const retryEvents = debugEntries.filter((e) => e.event === \"selector_retry\").length;\n const recoveryAttempts = debugEntries.filter((e) => e.event === \"recovery_attempt\").length;\n const agentFallbackStarts = debugEntries.filter((e) => e.event === \"agent_fallback_start\").length;\n const agentFallbackResults = debugEntries.filter((e) => e.event === \"agent_fallback_result\");\n const agentFallbackSuccesses = agentFallbackResults.filter(\n (e) => e.data && (e.data as Record<string, unknown>).success === true,\n ).length;\n\n const totalResolveAttempts = deterministicHits + deterministicMisses + cacheHits;\n\n if (totalResolveAttempts > 0 || stepsWithSelector.length > 0) {\n lines.push(\"| メトリクス | 件数 |\");\n lines.push(\"|-----------|------|\");\n if (totalResolveAttempts > 0) {\n lines.push(`| 決定論的解決 成功 | ${deterministicHits} |`);\n lines.push(`| 決定論的解決 失敗→AI委譲 | ${deterministicMisses} |`);\n lines.push(`| AI セレクタ解決 | ${aiResolves} |`);\n if (cacheHits > 0 || cacheStales > 0) {\n lines.push(`| キャッシュヒット | ${cacheHits} |`);\n lines.push(`| キャッシュ stale(自動無効化) | ${cacheStales} |`);\n }\n lines.push(`| セレクタリトライ | ${retryEvents} |`);\n if (recoveryAttempts > 0) {\n lines.push(`| スクロール回復 | ${recoveryAttempts} |`);\n }\n const visionFbStarts = debugEntries.filter((e) => e.event === \"vision_fallback_start\").length;\n if (visionFbStarts > 0) {\n const visionFbSuccesses = debugEntries.filter(\n (e) => e.event === \"vision_fallback_result\" && e.data && (e.data as Record<string, unknown>).ref,\n ).length;\n lines.push(`| Vision Fallback 発動 | ${visionFbStarts} |`);\n lines.push(`| Vision Fallback 成功 | ${visionFbSuccesses} |`);\n }\n if (agentFallbackStarts > 0) {\n lines.push(`| Agent Fallback 発動 | ${agentFallbackStarts} |`);\n lines.push(`| Agent Fallback 成功 | ${agentFallbackSuccesses} |`);\n }\n } else {\n const totalRetries = allSteps.reduce((sum, s) => sum + (s.retryCount ?? 0), 0);\n const stepsWithRetry = allSteps.filter((s) => s.retryCount && s.retryCount > 0);\n lines.push(`| セレクタ解決対象ステップ | ${stepsWithSelector.length} |`);\n lines.push(`| リトライ発生ステップ | ${stepsWithRetry.length} |`);\n lines.push(`| 合計リトライ回数 | ${totalRetries} |`);\n }\n lines.push(\"\");\n\n if (totalResolveAttempts > 0) {\n const deterministicRate =\n deterministicHits + deterministicMisses > 0\n ? Math.round((deterministicHits / (deterministicHits + deterministicMisses)) * 100)\n : 0;\n lines.push(`**決定論的解決率**: ${deterministicRate}% — `);\n if (deterministicRate < 50) {\n lines.push(\"低い。`deterministic-resolver.ts` のパターンマッチング精度改善の余地あり。\");\n } else if (deterministicRate < 80) {\n lines.push(\"中程度。頻出のマッチ失敗パターンを分析し追加すると AI 呼び出しを削減できる。\");\n } else {\n lines.push(\"高い。決定論的解決が有効に機能している。\");\n }\n lines.push(\"\");\n }\n }\n\n return lines;\n}\n\n// ── Retry Distribution ──\n\nexport function formatRetryDistribution(allSteps: ReportableStep[]): string[] {\n const lines: string[] = [];\n\n lines.push(\"### Retry Distribution\");\n lines.push(\"\");\n\n const retryDistribution = new Map<number, number>();\n for (const step of allSteps) {\n const count = step.retryCount ?? 0;\n retryDistribution.set(count, (retryDistribution.get(count) ?? 0) + 1);\n }\n\n if (retryDistribution.size > 0) {\n lines.push(\"| リトライ回数 | ステップ数 |\");\n lines.push(\"|-------------|-----------|\");\n for (const [count, steps] of [...retryDistribution.entries()].sort((a, b) => a[0] - b[0])) {\n lines.push(`| ${count} | ${steps} |`);\n }\n lines.push(\"\");\n }\n\n return lines;\n}\n\n// ── Failure Category Distribution ──\n\nexport function getSystemImprovementHint(category: string): string {\n switch (category) {\n case \"element_not_found\":\n return \"決定論的解決のパターン追加、スナップショットフィルタの見直し\";\n case \"element_stale\":\n return \"キャッシュ無効化ロジックの改善、DOM安定化待機の調整\";\n case \"page_structure_changed\":\n return \"スナップショット差分検知の感度調整、動的コンテンツ対応\";\n case \"navigation_timeout\":\n return \"ナビゲーション待機の段階的タイムアウト調整、SPA検知の改善\";\n case \"action_failed\":\n return \"アクションバリデーションの網羅性向上、role互換マッピングの拡充\";\n case \"unknown\":\n return \"エラー分類ロジックへの新カテゴリ追加を検討\";\n default:\n return \"新しいカテゴリ — error-classifier.ts に追加を検討\";\n }\n}\n\nexport function formatFailureCategoryDistribution(\n failedSteps: ReportableStep[],\n): string[] {\n const lines: string[] = [];\n\n if (failedSteps.length === 0) return lines;\n\n lines.push(\"### Failure Category Distribution\");\n lines.push(\"\");\n\n const categoryCount = new Map<string, number>();\n for (const step of failedSteps) {\n const cat = step.failureCategory ?? \"unclassified\";\n categoryCount.set(cat, (categoryCount.get(cat) ?? 0) + 1);\n }\n\n lines.push(\"| カテゴリ | 件数 | 改善ヒント |\");\n lines.push(\"|---------|------|-----------|\");\n for (const [cat, count] of [...categoryCount.entries()].sort((a, b) => b[1] - a[1])) {\n const hint = getSystemImprovementHint(cat);\n lines.push(`| \\`${cat}\\` | ${count} | ${hint} |`);\n }\n lines.push(\"\");\n\n return lines;\n}\n\n// ── Recovery Mechanism Effectiveness ──\n\nexport function analyzeRecoveryEffectiveness(\n entries: DebugLogEntry[],\n allSteps: ReportableStep[],\n): { name: string; total: number; success: number }[] {\n const results: { name: string; total: number; success: number }[] = [];\n\n // スマートリトライ\n const retrySteps = allSteps.filter((s) => s.retryCount && s.retryCount > 0);\n if (retrySteps.length > 0) {\n const retrySuccesses = retrySteps.filter((s) => s.status === \"success\").length;\n results.push({ name: \"スマートリトライ\", total: retrySteps.length, success: retrySuccesses });\n }\n\n // スクロール回復\n const scrollRecoveries = entries.filter((e) => e.event === \"recovery_attempt\");\n if (scrollRecoveries.length > 0) {\n const scrollStepOrdinals = new Set(scrollRecoveries.map((e) => e.step).filter((s) => s !== undefined));\n const scrollSuccesses = allSteps.filter(\n (s) => scrollStepOrdinals.has(s.ordinal) && s.status === \"success\",\n ).length;\n results.push({ name: \"スクロール回復\", total: scrollRecoveries.length, success: scrollSuccesses });\n }\n\n // Vision Fallback\n const visionFallbackStarts = entries.filter((e) => e.event === \"vision_fallback_start\").length;\n if (visionFallbackStarts > 0) {\n const visionSuccesses = entries.filter(\n (e) => e.event === \"vision_fallback_result\" && e.data && (e.data as Record<string, unknown>).ref,\n ).length;\n results.push({ name: \"Vision Fallback\", total: visionFallbackStarts, success: visionSuccesses });\n }\n\n // Agent Fallback\n const fbStarts = entries.filter((e) => e.event === \"agent_fallback_start\").length;\n if (fbStarts > 0) {\n const fbSuccesses = entries.filter(\n (e) => e.event === \"agent_fallback_result\" && e.data && (e.data as Record<string, unknown>).success === true,\n ).length;\n results.push({ name: \"Agent Fallback\", total: fbStarts, success: fbSuccesses });\n }\n\n // 決定論的解決フォールバック\n const deterministicMisses = entries.filter((e) => e.event === \"deterministic_resolve_miss\");\n if (deterministicMisses.length > 0) {\n const missStepOrdinals = new Set(deterministicMisses.map((e) => e.step).filter((s) => s !== undefined));\n const aiRecoveries = allSteps.filter(\n (s) => missStepOrdinals.has(s.ordinal) && s.status === \"success\",\n ).length;\n results.push({ name: \"AI フォールバック(決定論的失敗後)\", total: deterministicMisses.length, success: aiRecoveries });\n }\n\n return results;\n}\n\nexport function formatRecoveryEffectiveness(\n entries: DebugLogEntry[],\n allSteps: ReportableStep[],\n): string[] {\n const lines: string[] = [];\n\n if (entries.length === 0) return lines;\n\n const recoveryResults = analyzeRecoveryEffectiveness(entries, allSteps);\n if (recoveryResults.length === 0) return lines;\n\n lines.push(\"### Recovery Mechanism Effectiveness\");\n lines.push(\"\");\n lines.push(\"| 回復機構 | 発動回数 | 成功 | 失敗 | 成功率 |\");\n lines.push(\"|---------|---------|------|------|--------|\");\n for (const r of recoveryResults) {\n const rate = r.total > 0 ? Math.round((r.success / r.total) * 100) : 0;\n lines.push(`| ${r.name} | ${r.total} | ${r.success} | ${r.total - r.success} | ${rate}% |`);\n }\n lines.push(\"\");\n\n return lines;\n}\n\n// ── Performance Bottlenecks ──\n\nexport function formatPerformanceBottlenecks(allSteps: ReportableStep[]): string[] {\n const lines: string[] = [];\n\n const slowSteps = [...allSteps]\n .filter((s) => s.durationMs > 0)\n .sort((a, b) => b.durationMs - a.durationMs)\n .slice(0, 5);\n\n if (slowSteps.length > 0 && slowSteps[0].durationMs > 3000) {\n lines.push(\"### Performance Bottlenecks\");\n lines.push(\"\");\n lines.push(\"| Step | 所要時間 | リトライ | 状態 | 説明 |\");\n lines.push(\"|------|---------|---------|------|------|\");\n for (const step of slowSteps) {\n if (step.durationMs <= 3000) break;\n const status = step.status === \"failed\" ? \":x:\" : \":white_check_mark:\";\n lines.push(\n `| #${step.ordinal} | ${(step.durationMs / 1000).toFixed(1)}s | ${step.retryCount ?? 0} | ${status} | ${step.description} |`,\n );\n }\n lines.push(\"\");\n }\n\n return lines;\n}\n\n// ── AI Selector Quality Issues ──\n\nexport function analyzeAiSelectorQuality(\n entries: DebugLogEntry[],\n): { step: number; description: string }[] {\n const issues: { step: number; description: string }[] = [];\n\n // 同一ステップで AI が複数回呼ばれた\n const aiResponses = entries.filter((e) => e.event === \"ai_selector_response\");\n const stepAiCounts = new Map<number, number>();\n for (const e of aiResponses) {\n if (e.step !== undefined) {\n stepAiCounts.set(e.step, (stepAiCounts.get(e.step) ?? 0) + 1);\n }\n }\n for (const [step, count] of stepAiCounts) {\n if (count > 1) {\n issues.push({\n step,\n description: `AI が ${count} 回呼び出された(前回応答が不正確)。プロンプトの改善余地あり`,\n });\n }\n }\n\n // スナップショット未変化時の AI 再呼び出し\n const unchangedRetries = entries.filter(\n (e) => e.event === \"snapshot_unchanged\" && e.data && !(e.data as Record<string, unknown>).skippingAI,\n );\n if (unchangedRetries.length > 0) {\n for (const e of unchangedRetries) {\n if (e.step !== undefined) {\n issues.push({\n step: e.step,\n description: \"スナップショット未変化なのに AI が再呼び出しされた。スキップロジックの確認が必要\",\n });\n }\n }\n }\n\n // AI が空 ref を返した\n const emptyRefResponses = entries.filter(\n (e) =>\n e.event === \"ai_selector_response\" &&\n e.data &&\n typeof (e.data as Record<string, unknown>).parsedResult === \"object\" &&\n (e.data as Record<string, unknown>).parsedResult !== null &&\n ((e.data as Record<string, unknown>).parsedResult as Record<string, unknown>).ref === \"\",\n );\n if (emptyRefResponses.length > 0) {\n const steps = [...new Set(emptyRefResponses.map((e) => e.step).filter((s): s is number => s !== undefined))];\n for (const step of steps) {\n issues.push({\n step,\n description: \"AI が空 ref を返した(要素不在判定)。スナップショットフィルタが要素を除去していないか確認\",\n });\n }\n }\n\n return issues;\n}\n\nexport function formatAiSelectorQualityIssues(entries: DebugLogEntry[]): string[] {\n const lines: string[] = [];\n\n const aiQualityIssues = analyzeAiSelectorQuality(entries);\n if (aiQualityIssues.length === 0) return lines;\n\n lines.push(\"### AI Selector Resolution Issues\");\n lines.push(\"\");\n lines.push(\"> AI セレクタ解決で問題が検出されたケース。プロンプト改善の材料。\");\n lines.push(\"\");\n for (const issue of aiQualityIssues.slice(0, 5)) {\n lines.push(`- **Step #${issue.step}**: ${issue.description}`);\n }\n lines.push(\"\");\n\n return lines;\n}\n\n// ── Debug Log Sections ──\n\nexport interface DebugLogSectionOptions {\n /** 失敗ステップのイベントを表示するか(executor のみ) */\n showFailedStepEvents?: boolean;\n /** 失敗ステップの ordinal セット */\n failedOrdinals?: Set<number>;\n /** エラーイベントの最大表示数 (default: 20) */\n maxErrors?: number;\n /** 直近イベントの最大表示数 (default: 15) */\n maxRecent?: number;\n /** 直近イベントに含めるイベントタイプ */\n recentEventTypes?: string[];\n}\n\nconst DEFAULT_RECENT_EVENT_TYPES = [\n \"action\", \"snapshot\", \"selector_resolve\", \"selector_retry\",\n \"selector_cache_hit\", \"selector_cache_stale\",\n \"deterministic_resolve\", \"deterministic_resolve_miss\",\n \"vision_fallback_start\", \"vision_fallback_result\",\n \"agent_fallback_start\", \"agent_fallback_result\",\n \"recovery_attempt\", \"extract\", \"extract_result\", \"memory_operation\",\n];\n\nexport function formatDebugLogSections(\n entries: DebugLogEntry[],\n options: DebugLogSectionOptions = {},\n): string[] {\n const lines: string[] = [];\n\n if (entries.length === 0) return lines;\n\n const maxErrors = options.maxErrors ?? 20;\n const maxRecent = options.maxRecent ?? 15;\n const recentEventTypes = options.recentEventTypes ?? DEFAULT_RECENT_EVENT_TYPES;\n\n // 失敗ステップに関連するイベント\n if (options.showFailedStepEvents && options.failedOrdinals && options.failedOrdinals.size > 0) {\n const failedStepEntries = entries.filter(\n (e) => e.step !== undefined && options.failedOrdinals!.has(e.step),\n );\n if (failedStepEntries.length > 0) {\n lines.push(\"## Debug Log (Failed Step Events)\");\n lines.push(\"```json\");\n for (const entry of failedStepEntries.slice(-30)) {\n lines.push(JSON.stringify(entry));\n }\n lines.push(\"```\");\n lines.push(\"\");\n }\n }\n\n // エラーイベント\n const errorEntries = entries.filter(\n (e) =>\n e.event === \"error\" ||\n e.event === \"step_error\" ||\n e.event === \"validation_failed\" ||\n (e.data &&\n typeof e.data === \"object\" &&\n \"result\" in e.data &&\n typeof e.data.result === \"object\" &&\n e.data.result !== null &&\n \"success\" in (e.data.result as Record<string, unknown>) &&\n (e.data.result as Record<string, unknown>).success === false),\n );\n\n if (errorEntries.length > 0) {\n lines.push(\"## Debug Log (Error Events)\");\n lines.push(\"```json\");\n for (const entry of errorEntries.slice(-maxErrors)) {\n lines.push(JSON.stringify(entry));\n }\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n // 直近のアクション/スナップショットイベント\n const actionEntries = entries.filter(\n (e) => e.event !== undefined && recentEventTypes.includes(e.event),\n );\n const recentActions = actionEntries.slice(-maxRecent);\n\n if (recentActions.length > 0) {\n lines.push(\"## Debug Log (Recent Events)\");\n lines.push(\"```json\");\n for (const entry of recentActions) {\n lines.push(JSON.stringify(entry));\n }\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n return lines;\n}\n","/**\n * snapshot-filter — スナップショットフィルタリング\n *\n * 非インタラクティブ要素を除去してトークン使用量を削減する。\n * BrowserUse の DOM filtering pipeline、Stagehand の accessibility tree 最適化を参考。\n *\n * パイプライン:\n * Stage 1: ref + ロール判定で保持行を特定(既存)\n * Stage 2: 非表示要素([hidden], aria-hidden)を除去\n * Stage 3: 冗長リスト縮約(同一ロールの連続要素を圧縮)\n * Stage 4: 親インデント追加 + 行数制限 + トークン見積もり\n */\n\n/** 保持するロール(heading/landmark/インタラクティブ関連) */\nconst KEEP_ROLES = new Set([\n \"heading\",\n \"navigation\",\n \"main\",\n \"banner\",\n \"form\",\n \"dialog\",\n \"alertdialog\",\n \"alert\",\n \"region\",\n \"search\",\n \"tablist\",\n \"tab\",\n \"tabpanel\",\n \"menu\",\n \"menubar\",\n \"menuitem\",\n \"toolbar\",\n \"radiogroup\",\n]);\n\n/** 各オプションが意味的に固有であり、縮約してはならないロール */\nconst NO_COLLAPSE_ROLES = new Set([\n \"radio\",\n \"checkbox\",\n \"option\",\n \"tab\",\n \"menuitemradio\",\n \"menuitemcheckbox\",\n \"textbox\",\n]);\n\n/** 非表示を示す属性パターン */\nconst HIDDEN_PATTERNS = [\n /\\[hidden\\]/,\n /\\[aria-hidden=true\\]/,\n /\\[aria-hidden=\"true\"\\]/,\n];\n\n/** 意味を持たないロール(WAI-ARIA: presentation/none は装飾要素を示す) */\nconst SEMANTIC_NONE_ROLE_PATTERN = /^\\s*(presentation|none)\\b/;\n\n/**\n * ページネーションコンテキストのテキストパターン。\n * [ref] や KEEP_ROLES がなくても保持する。\n * AI がページネーション完了を判断するために必要。\n *\n * マッチ例:\n * - \"Page 1 of 12\", \"Page 1/12\"\n * - \"Showing 1-100 of 1120 users\", \"Showing 1–100 of 1120\"\n * - \"1-100 of 1120\"\n * - Japanese: \"1 / 12 ページ\", \"1120件中 1-100件\"\n */\nconst PAGINATION_TEXT_PATTERN =\n /\\bpage\\s+\\d+\\s+(?:of|\\/)\\s+\\d+\\b|\\bshowing\\s+\\d+[\\s\\-–]+\\d+\\s+of\\s+\\d+\\b|\\d+\\s*[\\-–]\\s*\\d+\\s+of\\s+\\d+\\b|\\d+\\s*\\/\\s*\\d+\\s*ページ|\\d+件中/i;\n\n/**\n * スナップショットから非インタラクティブ要素を除去\n *\n * 保持する行:\n * 1. [ref=eN] を含む行(インタラクティブ要素)\n * 2. heading/landmark ロール行\n * 3. 保持行の親インデント(ネスト構造の文脈保持)\n *\n * 除去する行: 静的テキスト、separator, generic, 装飾要素、非表示要素\n */\n/** スナップショットフィルタのオプション */\nexport interface SnapshotFilterOptions {\n /** 入力済みフィールドのセレクタ集合(@eN形式)。3件以上あればサマリーに圧縮 */\n filledSelectors?: Set<string>;\n}\n\nexport function filterSnapshot(snapshot: string, options?: SnapshotFilterOptions): string {\n const lines = snapshot.split(\"\\n\");\n const originalCount = lines.length;\n\n // Stage 1+2 統合: 保持行の特定と非表示除去を1パスで実行\n // 同時にインデント情報をキャッシュして Stage 4 の O(n²) 親探索を回避\n const keepIndices = new Set<number>();\n const refPattern = /\\[ref=e\\d+\\]/;\n\n // インデント → 最新行インデックスのスタック(親探索用)\n // スタック要素: [indent, lineIndex] を降順に保持\n const indentStack: Array<{ indent: number; idx: number }> = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trimStart();\n const indent = line.length - trimmed.length;\n\n // インデントスタック更新: 現在行より深い or 同等のエントリをポップ\n while (indentStack.length > 0 && indentStack[indentStack.length - 1].indent >= indent) {\n indentStack.pop();\n }\n indentStack.push({ indent, idx: i });\n\n const hasRef = refPattern.test(line);\n\n if (hasRef) {\n // ref 付き行は常に保持(非表示チェックしない — AI が判断する余地を残す)\n keepIndices.add(i);\n continue;\n }\n\n // heading/landmark ロールの行を保持(ただし非表示は除外)\n const roleMatch = trimmed.match(/^(\\S+)/);\n if (roleMatch && KEEP_ROLES.has(roleMatch[1])) {\n if (!isHiddenLine(line)) {\n keepIndices.add(i);\n }\n }\n\n // ページネーションコンテキスト: \"Page X of Y\" や \"Showing X-Y of Z\" を保持\n if (!keepIndices.has(i) && PAGINATION_TEXT_PATTERN.test(trimmed)) {\n if (!isHiddenLine(line)) {\n keepIndices.add(i);\n }\n }\n }\n\n // Stage 3: 冗長リスト縮約\n const sortedKeepIndices = [...keepIndices].sort((a, b) => a - b);\n const collapsedResult = collapseRedundantLists(lines, sortedKeepIndices);\n\n // Stage 3.5: 入力済みフォームフィールドの圧縮\n // 3件以上の入力済みフィールドをサマリー行に置換\n const filledSelectors = options?.filledSelectors;\n if (filledSelectors && filledSelectors.size >= 3) {\n const filledIndices: number[] = [];\n for (const idx of collapsedResult.keptIndices) {\n const line = lines[idx];\n if (!line) continue;\n const refMatch = line.match(/\\[ref=(e\\d+)\\]/);\n if (refMatch) {\n const ref = `@${refMatch[1]}`;\n if (filledSelectors.has(ref)) {\n filledIndices.push(idx);\n }\n }\n }\n\n if (filledIndices.length >= 3) {\n const filledSet = new Set(filledIndices);\n collapsedResult.keptIndices = collapsedResult.keptIndices.filter(\n idx => !filledSet.has(idx),\n );\n // 入力済みフィールドの最初の位置にサマリーマーカーを挿入\n const firstFilledIdx = filledIndices[0];\n const firstLine = lines[firstFilledIdx];\n const indent = firstLine ? Math.floor((firstLine.length - firstLine.trimStart().length) / 2) : 2;\n collapsedResult.collapseMarkers.push({\n afterLineIndex: firstFilledIdx > 0 ? firstFilledIdx - 1 : 0,\n omittedCount: filledIndices.length,\n indentLevel: indent,\n });\n }\n }\n\n // Stage 4: 親インデント追加(事前計算済みインデント情報を利用)\n // 各行の親を高速に引くため、行ごとのインデントをキャッシュして逆方向探索を最適化\n const parentIndices = new Set<number>();\n for (const idx of collapsedResult.keptIndices) {\n const line = lines[idx];\n if (!line) continue;\n const indent = line.length - line.trimStart().length;\n\n if (indent > 0) {\n // 直前の行から逆方向探索(多くの場合1-3行で見つかる)\n for (let j = idx - 1; j >= 0; j--) {\n const parentLine = lines[j];\n if (!parentLine) continue;\n const parentIndent = parentLine.length - parentLine.trimStart().length;\n if (parentIndent < indent && parentLine.trimStart().length > 0) {\n parentIndices.add(j);\n break;\n }\n }\n }\n }\n\n // 全保持行を統合\n const finalIndices = new Set<number>(collapsedResult.keptIndices);\n for (const idx of parentIndices) {\n finalIndices.add(idx);\n }\n\n // フィルタリング済み行を構築\n const filteredLines: string[] = [];\n const finalSorted = [...finalIndices].sort((a, b) => a - b);\n\n for (const idx of finalSorted) {\n const line = lines[idx];\n if (line.length > 300) {\n // ref suffix を保持して切り詰める\n const refMatch = line.match(/\\s*\\[ref=e\\d+\\].*$/);\n if (refMatch) {\n const refSuffix = refMatch[0];\n const maxContent = 300 - refSuffix.length - 3; // 3 = \"...\"\n filteredLines.push(\n maxContent > 0\n ? line.slice(0, maxContent) + \"...\" + refSuffix\n : line.slice(0, 297) + \"...\",\n );\n } else {\n filteredLines.push(line.slice(0, 297) + \"...\");\n }\n } else {\n filteredLines.push(line);\n }\n }\n\n // 縮約マーカーを挿入\n for (const marker of collapsedResult.collapseMarkers) {\n // マーカーの挿入位置を探す(最後に保持された行の後)\n const insertAfterIdx = filteredLines.findIndex((_, i) => {\n const originalIdx = finalSorted[i];\n return originalIdx !== undefined && originalIdx >= marker.afterLineIndex;\n });\n if (insertAfterIdx >= 0) {\n const indent = \" \".repeat(marker.indentLevel);\n filteredLines.splice(insertAfterIdx + 1, 0, `${indent}[... ${marker.omittedCount}件省略]`);\n }\n }\n\n // 出力行数リミット\n if (filteredLines.length > 300) {\n const truncatedCount = filteredLines.length;\n filteredLines.length = 300;\n filteredLines.push(`[... ${truncatedCount - 300}行省略]`);\n }\n\n const filteredCount = filteredLines.length;\n const estimatedTokens = Math.ceil(filteredLines.join(\"\\n\").length / 4);\n\n const meta = `[フィルタ済み: ${originalCount}行 → ${filteredCount}行, 推定 ~${estimatedTokens} tokens]`;\n\n return `${meta}\\n${filteredLines.join(\"\\n\")}`;\n}\n\n/** 行が非表示属性を含むか、または意味を持たないロールかを判定 */\nfunction isHiddenLine(line: string): boolean {\n return HIDDEN_PATTERNS.some((p) => p.test(line)) || SEMANTIC_NONE_ROLE_PATTERN.test(line.trimStart());\n}\n\ninterface CollapseMarker {\n afterLineIndex: number;\n omittedCount: number;\n indentLevel: number;\n}\n\ninterface CollapseResult {\n keptIndices: number[];\n collapseMarkers: CollapseMarker[];\n}\n\n/**\n * 同一インデント・同一ロールの [ref] 付き行が 3 個以上連続する場合、\n * 最初の 2 個 + マーカーに圧縮する。\n */\nfunction collapseRedundantLists(\n lines: string[],\n sortedIndices: number[],\n): CollapseResult {\n const keptIndices: number[] = [];\n const collapseMarkers: CollapseMarker[] = [];\n const refPattern = /\\[ref=e\\d+\\]/;\n\n // ロール抽出結果をキャッシュして同一行の再計算を回避\n const roleCache = new Map<number, string | null>();\n function getCachedRole(idx: number): string | null {\n let role = roleCache.get(idx);\n if (role === undefined) {\n role = extractRole(lines[idx]);\n roleCache.set(idx, role);\n }\n return role;\n }\n\n let i = 0;\n while (i < sortedIndices.length) {\n const startIdx = sortedIndices[i];\n const startLine = lines[startIdx];\n if (!startLine) {\n keptIndices.push(startIdx);\n i++;\n continue;\n }\n\n // ref 付きでなければそのまま保持\n if (!refPattern.test(startLine)) {\n keptIndices.push(startIdx);\n i++;\n continue;\n }\n\n const indent = startLine.length - startLine.trimStart().length;\n const role = getCachedRole(startIdx);\n\n if (!role) {\n keptIndices.push(startIdx);\n i++;\n continue;\n }\n\n // 同一 indent + role の連続する ref 付き行を数える\n let runLength = 1;\n let j = i + 1;\n while (j < sortedIndices.length) {\n const nextIdx = sortedIndices[j];\n const nextLine = lines[nextIdx];\n if (!nextLine || !refPattern.test(nextLine)) break;\n\n const nextIndent = nextLine.length - nextLine.trimStart().length;\n const nextRole = getCachedRole(nextIdx);\n\n if (nextIndent !== indent || nextRole !== role) break;\n\n runLength++;\n j++;\n }\n\n if (runLength >= 3 && !NO_COLLAPSE_ROLES.has(role)) {\n // 最初の 2 個を保持、残りを省略\n for (let k = i; k < i + 2; k++) {\n keptIndices.push(sortedIndices[k]);\n }\n collapseMarkers.push({\n afterLineIndex: sortedIndices[i + 1],\n omittedCount: runLength - 2,\n indentLevel: Math.floor(indent / 2),\n });\n i = j;\n } else {\n // 15 個未満 → 全て保持\n for (let k = i; k < j; k++) {\n keptIndices.push(sortedIndices[k]);\n }\n i = j;\n }\n }\n\n return { keptIndices, collapseMarkers };\n}\n\n/** 行からロール名を抽出(Format A/B 両対応) */\nfunction extractRole(line: string): string | null {\n const trimmed = line.trimStart();\n // 先頭の \"- \" (Playwright リストbullet) を除去\n const cleaned = trimmed.replace(/^-\\s+/, \"\");\n\n // Format A: role \"name\" [ref=eN] ... or role [ref=eN]\n const roleBeforeRef = cleaned.match(/^(\\S+)(?:\\s+\"[^\"]*\")?\\s*\\[ref=e\\d+\\]/);\n if (roleBeforeRef) return roleBeforeRef[1];\n\n // Format B (legacy): [ref=eN] role \"name\" ...\n const refFirst = cleaned.match(/\\[ref=e\\d+\\]\\s+(\\S+)/);\n if (refFirst) return refFirst[1];\n\n // ref なし行: 最初の単語がロール\n const roleMatch = cleaned.match(/^(\\S+)/);\n return roleMatch ? roleMatch[1] : null;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAQA,SAAS,YAAY,iBAAiB;AACtC,YAAY,OAAO;AAcnB,IAAM,kBAAN,MAA6C;AAAA,EAM3C,YAAoB,UAAkB;AAAlB;AALpB,SAAQ,SAAmB,CAAC;AAC5B,SAAQ,UAAU;AAClB,SAAQ,UAAyB,QAAQ,QAAQ;AACjD,SAAQ,cAAc;AAAA,EAEiB;AAAA,EAEvC,IAAI,OAA4B;AAC9B,UAAM,OAAO,KAAK,UAAU,EAAE,KAAI,oBAAI,KAAK,GAAE,YAAY,GAAG,GAAG,MAAM,CAAC;AACtE,SAAK,OAAO,KAAK,IAAI;AACrB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK;AACX,QAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,YAAM,KAAK,YAAY;AAAA,IACzB;AAAA,EACF;AAAA,EAEQ,gBAAsB;AAC5B,QAAI,KAAK,QAAS;AAClB,SAAK,UAAU,KAAK,YAAY;AAAA,EAClC;AAAA,EAEA,MAAc,cAA6B;AACzC,QAAI,KAAK,OAAO,WAAW,EAAG;AAC9B,SAAK,UAAU;AACf,UAAM,QAAQ,KAAK,OAAO,OAAO,GAAG,KAAK,OAAO,MAAM;AACtD,UAAM,UAAU,MAAM,KAAK,IAAI,IAAI;AACnC,QAAI;AACF,UAAI,CAAC,KAAK,aAAa;AACrB,cAAM,UAAU,KAAK,UAAU,SAAS,OAAO;AAC/C,aAAK,cAAc;AAAA,MACrB,OAAO;AACL,cAAM,WAAW,KAAK,UAAU,SAAS,OAAO;AAAA,MAClD;AAAA,IACF,QAAQ;AAAA,IAER;AACA,SAAK,UAAU;AAEf,QAAI,KAAK,OAAO,SAAS,GAAG;AAC1B,WAAK,UAAU,KAAK,YAAY;AAAA,IAClC;AAAA,EACF;AACF;AAGA,IAAM,qBAAN,MAAgD;AAAA,EAC9C,IAAI,OAA4B;AAC9B,UAAM,aAAa,MAAM,SAAS,SAAY,QAAQ,MAAM,IAAI,KAAK;AACrE,UAAM,SAAS,YAAY,MAAM,KAAK,IAAI,aAAa,IAAI,UAAU,KAAK,EAAE;AAE5E,YAAQ,MAAM,OAAO;AAAA,MACnB,KAAK;AAAA,MACL,KAAK;AACH,aAAK,WAAW,QAAQ,MAAM,IAAI;AAClC;AAAA,MACF,KAAK;AACH,aAAK,gBAAgB,QAAQ,MAAM,IAAI;AACvC;AAAA,MACF,KAAK;AACH,aAAK,mBAAmB,QAAQ,MAAM,IAAI;AAC1C;AAAA,MACF,KAAK;AACH,aAAK,UAAU,QAAQ,MAAM,IAAI;AACjC;AAAA,MACF,KAAK;AACH,aAAK,UAAU,QAAQ,MAAM,IAAI;AACjC;AAAA,MACF;AACE,aAAK,WAAW,QAAQ,MAAM,IAAI;AAClC;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAAA,EAE7B;AAAA,EAEQ,WAAW,QAAgB,MAAqC;AACtE,QAAI,KAAK,QAAQ;AACf,MAAE,MAAI,KAAK,GAAG,MAAM,aAAa,SAAS,OAAO,KAAK,MAAM,GAAG,GAAG,CAAC,GAAG;AAAA,IACxE;AACA,QAAI,KAAK,eAAe;AACtB,MAAE,MAAI,KAAK,GAAG,MAAM,oBAAoB,SAAS,OAAO,KAAK,aAAa,GAAG,GAAG,CAAC,GAAG;AAAA,IACtF;AACA,QAAI,KAAK,eAAe,QAAW;AACjC,YAAM,WAAW,KAAK,UAClB,GAAG,KAAK,UAAU,qBAAqB,KAAK,WAAW,KACvD,OAAO,KAAK,UAAU;AAC1B,MAAE,MAAI,KAAK,GAAG,MAAM,oBAAoB,QAAQ,GAAG;AAAA,IACrD;AACA,QAAI,KAAK,kBAAkB,QAAW;AACpC,MAAE,MAAI,KAAK,GAAG,MAAM,oBAAoB,SAAS,OAAO,KAAK,aAAa,GAAG,GAAG,CAAC,EAAE;AAAA,IACrF;AACA,QAAI,KAAK,iBAAiB,QAAW;AACnC,YAAM,OAAO,KAAK,mBAAmB,mCAA8B;AACnE,MAAE,MAAI,KAAK,GAAG,MAAM,8BAA8B,KAAK,YAAY,IAAI,IAAI,EAAE;AAAA,IAC/E;AAAA,EACF;AAAA,EAEQ,gBAAgB,QAAgB,MAAqC;AAC3E,QAAI,KAAK,YAAY;AACnB,MAAE,MAAI,KAAK,GAAG,MAAM,iBAAiB,KAAK,UAAU,GAAG;AAAA,IACzD;AACA,QAAI,KAAK,oBAAoB,QAAW;AACtC,MAAE,MAAI,KAAK,GAAG,MAAM,kCAAkC,SAAS,OAAO,KAAK,eAAe,GAAG,GAAG,CAAC,EAAE;AAAA,IACrG;AACA,QAAI,KAAK,yBAAyB;AAChC,MAAE,MAAI,KAAK,GAAG,MAAM,qDAAqD;AAAA,IAC3E;AACA,QAAI,KAAK,gBAAgB,QAAW;AAClC,YAAM,SAAS,KAAK;AACpB,UAAI,WAAW,SAAS;AACtB,QAAE,MAAI;AAAA,UACJ,GAAG,MAAM,+BAA0B,KAAK,WAAW,uBAAuB,KAAK,oBAAoB,KAAK;AAAA,QAC1G;AAAA,MACF,WAAW,WAAW,UAAU;AAC9B,QAAE,MAAI,KAAK,GAAG,MAAM,uCAAkC,KAAK,cAAc,KAAK,EAAE;AAAA,MAClF,WAAW,WAAW,YAAY;AAChC,QAAE,MAAI,KAAK,GAAG,MAAM,qDAAgD;AAAA,MACtE;AAAA,IACF;AACA,QAAI,KAAK,UAAU,UAAa,KAAK,gBAAgB,QAAW;AAC9D,MAAE,MAAI,KAAK,GAAG,MAAM,WAAW,KAAK,KAAK,QAAQ;AAAA,IACnD;AAAA,EACF;AAAA,EAEQ,mBAAmB,QAAgB,MAAqC;AAC9E,IAAE,MAAI;AAAA,MACJ,GAAG,MAAM,IAAI,KAAK,SAAS,IAAI,KAAK,UAAU,IAAI,KAAK,KAAK,QAAQ,KAAK,MAAM,cAAS,KAAK,cAAc;AAAA,IAC7G;AAAA,EACF;AAAA,EAEQ,UAAU,QAAgB,MAAqC;AACrE,IAAE,MAAI,KAAK,GAAG,MAAM,iBAAiB,KAAK,UAAU,aAAa,KAAK,SAAS,aAAa,KAAK,MAAM,EAAE;AACzG,QAAI,KAAK,YAAY;AACnB,MAAE,MAAI,KAAK,GAAG,MAAM,iBAAiB,KAAK,UAAU,EAAE;AAAA,IACxD;AACA,QAAI,KAAK,MAAM;AACb,MAAE,MAAI,KAAK,GAAG,MAAM,WAAM,KAAK,IAAI,EAAE;AAAA,IACvC;AAAA,EACF;AAAA,EAEQ,UAAU,QAAgB,MAAqC;AACrE,IAAE,MAAI;AAAA,MACJ,GAAG,MAAM,SAAS,KAAK,IAAI,QAAQ,KAAK,OAAO,KAAK,WAAW,SAAS,OAAO,KAAK,SAAS,EAAE,GAAG,EAAE,CAAC,YAAY,KAAK,MAAM;AAAA,IAC9H;AAAA,EACF;AAAA,EAEQ,WAAW,QAAgB,MAAqC;AACtE,UAAM,UAAU,KAAK,UAAU,IAAI;AACnC,IAAE,MAAI,KAAK,GAAG,MAAM,IAAI,SAAS,SAAS,GAAG,CAAC,EAAE;AAAA,EAClD;AACF;AAGA,IAAM,uBAAN,MAAkD;AAAA,EAChD,YAAoB,SAAwB;AAAxB;AAAA,EAAyB;AAAA,EAE7C,IAAI,OAA4B;AAC9B,eAAW,UAAU,KAAK,SAAS;AACjC,aAAO,IAAI,KAAK;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,QAAQ,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAAA,EACtD;AACF;AAGO,IAAM,aAA0B;AAAA,EACrC,MAAM;AAAA,EAAC;AAAA,EACP,MAAM,QAAQ;AAAA,EAAC;AACjB;AAGA,SAAS,SAAS,KAAa,QAAwB;AACrD,MAAI,IAAI,UAAU,OAAQ,QAAO;AACjC,SAAO,GAAG,IAAI,MAAM,GAAG,MAAM,CAAC;AAChC;AAQO,SAAS,kBAAkB,MAGlB;AACd,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,UAAyB,CAAC;AAEhC,MAAI,KAAK,UAAU;AACjB,YAAQ,KAAK,IAAI,gBAAgB,KAAK,QAAQ,CAAC;AAAA,EACjD;AACA,MAAI,KAAK,SAAS;AAChB,YAAQ,KAAK,IAAI,mBAAmB,CAAC;AAAA,EACvC;AAEA,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,MAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,CAAC;AAC1C,SAAO,IAAI,qBAAqB,OAAO;AACzC;;;ACjOA,SAAS,aAAAA,kBAAiB;AAyCnB,IAAM,oBAAN,MAA6D;AAAA,EAA7D;AACL,SAAQ,cAAc,oBAAI,IAAuC;AAAA;AAAA,EAEjE,OAAO,YAAoB,MAAqC;AAC9D,UAAM,QAAQ,KAAK,YAAY,IAAI,UAAU,KAAK,CAAC;AACnD,UAAM,KAAK,IAAI;AACf,SAAK,YAAY,IAAI,YAAY,KAAK;AAAA,EACxC;AAAA,EAEA,OAAO,YAAoB,UAA2C;AACpE,UAAM,QAAQ,KAAK,YAAY,IAAI,UAAU,KAAK,CAAC;AACnD,UAAM,KAAK,GAAG,QAAQ;AACtB,SAAK,YAAY,IAAI,YAAY,KAAK;AAAA,EACxC;AAAA,EAEA,OAAO,YAA+C;AACpD,WAAO,KAAK,YAAY,IAAI,UAAU,KAAK,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAM,YAA4B;AAChC,YAAQ,KAAK,YAAY,IAAI,UAAU,KAAK,CAAC,GAAG;AAAA,EAClD;AAAA,EAEA,MAAM,YAA0B;AAC9B,SAAK,YAAY,OAAO,UAAU;AAAA,EACpC;AAAA,EAEA,kBAA4B;AAC1B,WAAO,MAAM,KAAK,KAAK,YAAY,KAAK,CAAC;AAAA,EAC3C;AAAA,EAEA,SAAoD;AAClD,UAAM,SAAoD,CAAC;AAC3D,eAAW,CAAC,KAAK,KAAK,KAAK,KAAK,aAAa;AAC3C,aAAO,GAAG,IAAI;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,OAA+B;AACvC,UAAM,QAAQ,KAAK,OAAO,MAAM,UAAU;AAC1C,QAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,UAAM,SAAS,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,KAAK,CAAC;AAEpD,YAAQ,MAAM,WAAW;AAAA,MACvB,KAAK,OAAO;AACV,cAAM,QAAQ,OAAO;AAAA,UACnB,CAAC,KAAa,MAAM,OAAO,OAAO,CAAC,KAAK;AAAA,UACxC;AAAA,QACF;AACA,eAAO,OAAO,KAAK;AAAA,MACrB;AAAA,MACA,KAAK;AACH,eAAO,OAAO,OAAO,MAAM;AAAA,MAC7B,KAAK;AACH,eAAO,OAAO,IAAI,MAAM,EAAE,KAAK,IAAI;AAAA,MACrC,KAAK,OAAO;AACV,cAAM,OAAO,OAAO,IAAI,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC;AAC9D,eAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI;AAAA,MACvD;AAAA,MACA,KAAK,OAAO;AACV,cAAM,OAAO,OAAO,IAAI,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC;AAC9D,eAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC,IAAI;AAAA,MACvD;AAAA,MACA,KAAK,OAAO;AACV,cAAM,OAAO,OAAO,IAAI,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,MAAM,CAAC,CAAC;AAC9D,YAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,cAAM,MAAM,KAAK,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAC1C,eAAO,OAAO,MAAM,KAAK,MAAM;AAAA,MACjC;AAAA,MACA,KAAK,gBAAgB;AACnB,cAAM,SAAS,IAAI,IAAI,OAAO,IAAI,MAAM,CAAC;AACzC,eAAO,OAAO,OAAO,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAA4F;AAC1F,UAAM,SAAiF,CAAC;AACxF,eAAW,CAAC,MAAM,KAAK,KAAK,KAAK,aAAa;AAC5C,YAAM,QAAQ,MAAM;AACpB,YAAM,WAAW,SAAS,MAAO,SAAS,SAAS,MAAO,WAAW;AACrE,aAAO,IAAI,IAAI,EAAE,OAAO,SAAS;AAAA,IACnC;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAM,YAA4B;AAChC,UAAM,QAAQ,KAAK,OAAO,UAAU;AACpC,QAAI,MAAM,WAAW,EAAG,QAAO;AAG/B,UAAM,OAAO,oBAAI,IAAY;AAC7B,eAAW,QAAQ,OAAO;AACxB,iBAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,aAAK,IAAI,GAAG;AAAA,MACd;AAAA,IACF;AACA,UAAM,UAAU,MAAM,KAAK,IAAI;AAE/B,UAAM,YAAY,CAAC,QAAyB;AAC1C,YAAM,MAAM,QAAQ,QAAQ,QAAQ,SAAY,KAAK,OAAO,GAAG;AAC/D,UAAI,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,IAAI,GAAG;AAChE,eAAO,IAAI,IAAI,QAAQ,MAAM,IAAI,CAAC;AAAA,MACpC;AACA,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM;AAAA,MAAI,CAAC,SACtB,QAAQ,IAAI,CAAC,MAAM,UAAU,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG;AAAA,IACjD;AACA,WAAO,CAAC,QAAQ,KAAK,GAAG,GAAG,GAAG,IAAI,EAAE,KAAK,IAAI;AAAA,EAC/C;AAAA;AAAA,EAGA,MAAM,YACJ,YACA,MACA,QACe;AACf,UAAM,UACJ,WAAW,QACP,KAAK,MAAM,UAAU,IACrB,KAAK,UAAU,KAAK,OAAO,UAAU,GAAG,MAAM,CAAC;AACrD,UAAMA,WAAU,MAAM,SAAS,OAAO;AAAA,EACxC;AACF;;;AC7KA,SAAS,UAAU,aAAAC,YAAW,OAAO,YAAY;AACjD,SAAS,YAAsB;AAC/B,SAAS,kBAAkB;AAqBpB,IAAM,eAAN,MAA4C;AAAA,EACjD,YAAoB,SAAiB;AAAjB;AAAA,EAAkB;AAAA,EAEtC,MAAM,MAAM,UAAkB,SAA2C;AACvE,UAAM,MAAM,KAAK,SAAS,EAAE,WAAW,KAAK,CAAC;AAC7C,UAAM,WAAW,KAAK,KAAK,SAAS,QAAQ;AAC5C,UAAMA,WAAU,UAAU,OAAO;AACjC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,UAAmC;AAC5C,UAAM,WAAW,KAAK,KAAK,SAAS,QAAQ;AAC5C,WAAO,SAAS,QAAQ;AAAA,EAC1B;AAAA,EAEA,MAAM,OAAO,UAAoC;AAC/C,QAAI;AACF,YAAM,KAAK,KAAK,KAAK,SAAS,QAAQ,CAAC;AACvC,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAIO,IAAM,kBAAN,MAAsB;AAAA,EAI3B,YAAY,WAAmB;AAH/B,SAAQ,YAA8B,CAAC;AAIrC,SAAK,UAAU,IAAI,aAAa,SAAS;AAAA,EAC3C;AAAA,EAEA,YACE,QACgB;AAChB,UAAM,WAA2B;AAAA,MAC/B,GAAG;AAAA,MACH,IAAI,WAAW;AAAA,IACjB;AACA,SAAK,UAAU,KAAK,QAAQ;AAC5B,WAAO;AAAA,EACT;AAAA,EAEA,eAAiC;AAC/B,WAAO,CAAC,GAAG,KAAK,SAAS;AAAA,EAC3B;AAAA,EAEA,mBAAmB,aAAuC;AACxD,WAAO,KAAK,UAAU,OAAO,CAAC,MAAM,EAAE,gBAAgB,WAAW;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cACJ,aACA,gBACiB;AACjB,UAAM,UAAU,YACb,IAAI,CAAC,OAAO,KAAK,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EACnD,OAAO,CAAC,MAA2B,MAAM,MAAS;AAErD,QAAI,QAAQ,WAAW,GAAG;AACxB,YAAM,IAAI,MAAM,sCAAsC;AAAA,IACxD;AAEA,UAAM,SAAmB,CAAC;AAC1B,QAAI,aAA4B;AAEhC,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAM,UAAU,MAAM,SAAS,QAAQ,CAAC,EAAE,MAAM,OAAO;AACvD,YAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;AAEnE,UAAI,MAAM,WAAW,EAAG;AAExB,UAAI,MAAM,GAAG;AAEX,qBAAa,MAAM,CAAC;AACpB,eAAO,KAAK,QAAQ,QAAQ,CAAC;AAAA,MAC/B,OAAO;AAEL,cAAM,YAAY,MAAM,MAAM,CAAC;AAC/B,YAAI,UAAU,SAAS,GAAG;AACxB,iBAAO,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,OAAO,KAAK,IAAI,IAAI;AACnC,UAAM,aAAa,MAAM,KAAK,QAAQ,MAAM,gBAAgB,MAAM;AAClE,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,oBAA8B;AAC5B,WAAO,KAAK,UAAU,IAAI,CAAC,MAAM,EAAE,EAAE;AAAA,EACvC;AAAA;AAAA,EAGA,cAAwB;AACtB,WAAO,KAAK,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EACzC;AACF;;;ACrIO,SAAS,eAAe,IAAoB;AACjD,SAAO,MAAM,MAAO,IAAI,KAAK,KAAM,QAAQ,CAAC,CAAC,MAAM,GAAG,KAAK,MAAM,EAAE,CAAC;AACtE;;;ACSO,SAAS,0BAA0B,QAA6C;AACrF,QAAM,OAA2B,CAAC;AAElC,OAAK,KAAK,EAAE,MAAM,SAAS,OAAO,OAAO,IAAI,CAAC;AAC9C,OAAK,KAAK,EAAE,MAAM,UAAU,OAAO,OAAO,KAAK,CAAC;AAChD,OAAK,KAAK,EAAE,MAAM,YAAY,OAAO,OAAO,OAAO,CAAC;AACpD,OAAK,KAAK,EAAE,MAAM,cAAc,OAAO,OAAO,OAAO,QAAQ,EAAE,CAAC;AAChE,OAAK,KAAK,EAAE,MAAM,oBAAoB,OAAO,OAAO,OAAO,aAAa,EAAE,CAAC;AAC3E,OAAK,KAAK,EAAE,MAAM,gBAAgB,OAAO,GAAG,OAAO,SAAS,KAAK,CAAC;AAClE,OAAK,KAAK,EAAE,MAAM,0BAA0B,OAAO,OAAO,OAAO,kBAAkB,EAAE,CAAC;AACtF,OAAK,KAAK,EAAE,MAAM,oBAAoB,OAAO,OAAO,OAAO,aAAa,EAAE,CAAC;AAC3E,OAAK,KAAK,EAAE,MAAM,kBAAkB,OAAO,OAAO,OAAO,sBAAsB,EAAE,CAAC;AAClF,OAAK,KAAK,EAAE,MAAM,qBAAqB,OAAO,OAAO,OAAO,cAAc,EAAE,CAAC;AAE7E,MAAI,OAAO,eAAe;AACxB,SAAK,KAAK,EAAE,MAAM,iBAAiB,OAAO,OAAO,cAAc,CAAC;AAAA,EAClE;AACA,MAAI,OAAO,iBAAiB;AAC1B,SAAK,KAAK,EAAE,MAAM,aAAa,OAAO,WAAW,OAAO,gBAAgB,MAAM,IAAI,EAAE,MAAM,UAAU,CAAC;AAAA,EACvG;AACA,MAAI,OAAO,WAAW,OAAO,KAAK,OAAO,QAAQ,MAAM,EAAE,SAAS,GAAG;AACnE,SAAK,KAAK,EAAE,MAAM,aAAa,OAAO,GAAG,OAAO,KAAK,OAAO,QAAQ,MAAM,EAAE,MAAM,QAAQ,CAAC;AAAA,EAC7F;AACA,MAAI,OAAO,cAAc;AACvB,SAAK,KAAK,EAAE,MAAM,eAAe,OAAO,OAAO,aAAa,CAAC;AAAA,EAC/D;AACA,MAAI,OAAO,cAAc;AACvB,SAAK,KAAK,EAAE,MAAM,WAAW,OAAO,OAAO,CAAC;AAAA,EAC9C;AACA,MAAI,OAAO,SAAS;AAClB,SAAK,KAAK,EAAE,MAAM,aAAa,OAAO,OAAO,CAAC;AAAA,EAChD;AACA,MAAI,OAAO,OAAO;AAChB,SAAK,KAAK,EAAE,MAAM,WAAW,OAAO,OAAO,MAAM,CAAC;AAAA,EACpD;AACA,MAAI,OAAO,UAAU;AACnB,SAAK,KAAK,EAAE,MAAM,WAAW,OAAO,OAAO,SAAS,CAAC;AAAA,EACvD;AAEA,uBAAqB,MAAM,OAAO,aAAa;AAE/C,SAAO;AACT;AAEO,SAAS,yBAAyB,QAA4C;AACnF,QAAM,OAA2B,CAAC;AAElC,OAAK,KAAK,EAAE,MAAM,iBAAiB,OAAO,OAAO,gBAAgB,CAAC;AAClE,OAAK,KAAK,EAAE,MAAM,cAAc,OAAO,OAAO,OAAO,QAAQ,EAAE,CAAC;AAEhE,MAAI,OAAO,cAAc,QAAW;AAClC,SAAK,KAAK,EAAE,MAAM,gBAAgB,OAAO,GAAG,OAAO,SAAS,KAAK,CAAC;AAAA,EACpE;AACA,MAAI,OAAO,eAAe;AACxB,SAAK,KAAK,EAAE,MAAM,iBAAiB,OAAO,OAAO,cAAc,CAAC;AAAA,EAClE;AACA,MAAI,OAAO,iBAAiB;AAC1B,SAAK,KAAK,EAAE,MAAM,aAAa,OAAO,WAAW,OAAO,gBAAgB,MAAM,IAAI,EAAE,MAAM,UAAU,CAAC;AAAA,EACvG;AACA,MAAI,OAAO,WAAW,OAAO,KAAK,OAAO,QAAQ,MAAM,EAAE,SAAS,GAAG;AACnE,SAAK,KAAK,EAAE,MAAM,aAAa,OAAO,GAAG,OAAO,KAAK,OAAO,QAAQ,MAAM,EAAE,MAAM,QAAQ,CAAC;AAAA,EAC7F;AACA,MAAI,OAAO,kBAAkB;AAC3B,SAAK,KAAK,EAAE,MAAM,uBAAuB,OAAO,OAAO,CAAC;AAAA,EAC1D;AACA,MAAI,OAAO,cAAc;AACvB,SAAK,KAAK,EAAE,MAAM,UAAU,OAAO,OAAO,aAAa,CAAC;AAAA,EAC1D;AACA,MAAI,OAAO,iBAAiB,OAAO;AACjC,SAAK,KAAK,EAAE,MAAM,sBAAsB,OAAO,OAAO,CAAC;AAAA,EACzD;AACA,MAAI,OAAO,cAAc;AACvB,SAAK,KAAK,EAAE,MAAM,eAAe,OAAO,OAAO,aAAa,CAAC;AAAA,EAC/D;AACA,MAAI,OAAO,cAAc;AACvB,SAAK,KAAK,EAAE,MAAM,WAAW,OAAO,OAAO,CAAC;AAAA,EAC9C;AACA,MAAI,OAAO,gBAAgB,OAAO,iBAAiB,OAAO;AACxD,SAAK,KAAK,EAAE,MAAM,mBAAmB,OAAO,OAAO,aAAa,CAAC;AAAA,EACnE;AACA,MAAI,OAAO,YAAY;AACrB,SAAK,KAAK,EAAE,MAAM,YAAY,OAAO,OAAO,WAAW,CAAC;AAAA,EAC1D;AACA,MAAI,OAAO,qBAAqB;AAC9B,SAAK,KAAK,EAAE,MAAM,2BAA2B,OAAO,OAAO,CAAC;AAAA,EAC9D;AACA,MAAI,OAAO,qBAAqB;AAC9B,SAAK,KAAK,EAAE,MAAM,2BAA2B,OAAO,OAAO,CAAC;AAAA,EAC9D;AACA,MAAI,OAAO,sBAAsB;AAC/B,SAAK,KAAK,EAAE,MAAM,4BAA4B,OAAO,OAAO,CAAC;AAAA,EAC/D;AACA,MAAI,OAAO,WAAW;AACpB,SAAK,KAAK,EAAE,MAAM,gBAAgB,OAAO,OAAO,UAAU,CAAC;AAAA,EAC7D;AACA,MAAI,OAAO,gBAAgB;AACzB,SAAK,KAAK,EAAE,MAAM,qBAAqB,OAAO,OAAO,CAAC;AAAA,EACxD;AACA,MAAI,OAAO,aAAa;AACtB,SAAK,KAAK,EAAE,MAAM,iBAAiB,OAAO,OAAO,CAAC;AAAA,EACpD;AACA,MAAI,OAAO,eAAe,QAAW;AACnC,SAAK,KAAK,EAAE,MAAM,iBAAiB,OAAO,OAAO,OAAO,UAAU,EAAE,CAAC;AAAA,EACvE;AACA,MAAI,OAAO,0BAA0B,QAAW;AAC9C,SAAK,KAAK,EAAE,MAAM,6BAA6B,OAAO,OAAO,OAAO,qBAAqB,EAAE,CAAC;AAAA,EAC9F;AACA,MAAI,OAAO,aAAa;AACtB,SAAK,KAAK,EAAE,MAAM,YAAY,OAAO,OAAO,CAAC;AAAA,EAC/C;AACA,MAAI,OAAO,UAAU;AACnB,SAAK,KAAK,EAAE,MAAM,WAAW,OAAO,OAAO,SAAS,CAAC;AAAA,EACvD;AACA,MAAI,OAAO,iBAAiB,QAAW;AACrC,SAAK,KAAK,EAAE,MAAM,mBAAmB,OAAO,OAAO,OAAO,YAAY,EAAE,CAAC;AAAA,EAC3E;AACA,MAAI,OAAO,sBAAsB,QAAW;AAC1C,SAAK,KAAK,EAAE,MAAM,sBAAsB,OAAO,GAAG,OAAO,iBAAiB,KAAK,CAAC;AAAA,EAClF;AACA,MAAI,OAAO,SAAS;AAClB,SAAK,KAAK,EAAE,MAAM,aAAa,OAAO,OAAO,CAAC;AAAA,EAChD;AACA,MAAI,OAAO,OAAO;AAChB,SAAK,KAAK,EAAE,MAAM,WAAW,OAAO,OAAO,MAAM,CAAC;AAAA,EACpD;AAEA,uBAAqB,MAAM,OAAO,aAAa;AAE/C,SAAO;AACT;AAEA,IAAM,uBAA+C;AAAA,EACnD,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,QAAQ;AACV;AAEA,SAAS,qBAAqB,MAA0B,eAAqC;AAC3F,MAAI,CAAC,cAAe;AACpB,OAAK,KAAK,EAAE,MAAM,WAAW,OAAO,cAAc,QAAQ,CAAC;AAC3D,OAAK,KAAK,EAAE,MAAM,oBAAoB,OAAO,cAAc,SAAS,CAAC;AACrE,MAAI,cAAc,SAAS;AACzB,SAAK,KAAK,EAAE,MAAM,oBAAoB,OAAO,cAAc,QAAQ,CAAC;AAAA,EACtE;AACA,MAAI,cAAc,gBAAgB;AAChC,eAAW,CAAC,SAAS,OAAO,KAAK,OAAO,QAAQ,cAAc,cAAc,GAAG;AAC7E,YAAM,OAAO,qBAAqB,OAAO;AACzC,UAAI,QAAQ,SAAS;AACnB,aAAK,KAAK,EAAE,MAAM,MAAM,OAAO,QAAQ,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,sBAAsB,SAAuC;AAC3E,MAAI,QAAQ,WAAW,EAAG,QAAO,CAAC;AAElC,QAAM,QAAkB,CAAC;AACzB,aAAW,OAAO,SAAS;AACzB,UAAM,KAAK,OAAO,IAAI,IAAI,OAAO,IAAI,KAAK,EAAE;AAAA,EAC9C;AACA,SAAO;AACT;;;AC9KA,SAAS,YAAAC,iBAAgB;AAczB,eAAsB,YAAY,MAAqC;AACrE,MAAI,CAAC,MAAM;AACT,WAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,oBAAI,IAAI,EAAE;AAAA,EACvC;AAEA,QAAM,MAAM,MAAMC,UAAS,MAAM,OAAO,EAAE,MAAM,MAAM;AACpD,WAAO,qFAAyB,IAAI,EAAE;AACtC,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,WAAO,6GAAkC,IAAI,EAAE;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GAAG;AAC1E,WAAO,sKAAmD;AAC1D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAiC,CAAC;AACxC,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAiC,GAAG;AAC1E,QAAI,OAAO,QAAQ,UAAU;AAC3B,aAAO,mHAAmC,GAAG,IAAI;AACjD,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO,GAAG,IAAI;AAAA,EAChB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC;AAAA,EACnC;AACF;;;AC3BO,IAAM,aAAN,MAAmC;AAAA,EACxC,KAAK,UAAwB;AAAA,EAAC;AAAA,EAC9B,QAAQ,UAAwB;AAAA,EAAC;AAAA,EACjC,MAAM,UAAwB;AAAA,EAAC;AAAA,EAC/B,KAAK,UAAwB;AAAA,EAAC;AAAA,EAC9B,KAAK,UAAwB;AAAA,EAAC;AAAA,EAC9B,MAAM,UAAwB;AAAA,EAAC;AACjC;AAEO,IAAM,cAAN,MAAyC;AAAA,EAC9C,MAAM,UAAwB;AAAA,EAAC;AAAA,EAC/B,KAAK,UAAwB;AAAA,EAAC;AAChC;;;AClCA,SAAS,SAAAC,QAAO,YAAAC,WAAU,cAAc;AACxC,SAAS,cAAc;AACvB,SAAS,QAAAC,aAAY;AACrB,SAA4B,OAAO,gBAAgB;;;ACFnD,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAuB/B,SAAS,WAAW,wBAAwB;;;ACbrC,SAAS,iBAAyB;AACvC,SAAO;AAAA;AAAA;AAAA;AAAA;AAKT;AAGO,SAAS,cAAsB;AACpC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBT;AAGO,SAAS,eAAuB;AACrC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBT;AAGO,SAAS,iBAAyB;AACvC,SAAO;AAAA;AAAA;AAAA;AAAA;AAKT;AAGO,SAAS,mBAA2B;AACzC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAST;AAGO,SAAS,aAAqB;AACnC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBT;AAGO,SAAS,2BAAmC;AACjD,SAAO;AAAA;AAAA;AAAA;AAAA;AAKT;AAGO,SAAS,cAAsB;AACpC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWT;AAGO,SAAS,iBAAyB;AACvC,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkBT;AAKO,SAAS,oBAA8B;AAC5C,SAAO;AAAA,IACL,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,WAAW;AAAA,IACX,yBAAyB;AAAA,IACzB,YAAY;AAAA,IACZ,eAAe;AAAA,EACjB;AACF;AAOA,eAAsB,oBAAoB,MAAkC;AAC1E,QAAM,UAAU,KAAK,QAAQ;AAC7B,QAAM,UAAU,kBAAkB;AAClC,aAAW,UAAU,SAAS;AAC5B,UAAM,QAAQ,cAAc,MAAM;AAAA,EACpC;AACF;;;AFzJA,SAAS,cACP,UAC0D;AAC1D,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,QAAQ;AAC5B,UAAM,SAAS,GAAG,IAAI,QAAQ,KAAK,IAAI,QAAQ,GAAG,IAAI,OAAO,IAAI,IAAI,IAAI,KAAK,EAAE;AAChF,UAAM,WAAW,IAAI,YAAY;AACjC,UAAM,WAAW,IAAI,YAAY;AACjC,WAAO,EAAE,QAAQ,UAAU,SAAS;AAAA,EACtC,QAAQ;AAEN,WAAO,EAAE,QAAQ,SAAS;AAAA,EAC5B;AACF;AAEA,IAAI,YAAY;AAChB,SAAS,SAAiB;AACxB,SAAO,OAAO,EAAE,SAAS;AAC3B;AAGA,IAAM,iBAAiB;AAEvB,IAAM,yBAAyB,KAAK,MAAM,MAAO,cAAc;AAE/D,IAAM,kCAAkC;AAEjC,IAAM,eAAN,MAAmB;AAAA,EAYxB,YAAY,QAAiB;AAX7B,SAAQ,UAAU,IAAI,eAAe;AAIrC;AAAA,SAAQ,gBAAqC;AAC7C,SAAQ,cAA6B;AACrC,SAAQ,oBAA2D;AACnE,SAAQ,6BAAoE;AAC5E,SAAQ,wBAAwB;AAChC,SAAQ,uBAAsC;AAG5C,SAAK,SAAS,UAAU,IAAI,WAAW;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,KAAK,SAAqC;AACtD,UAAM,WAAW,MAAM,eAAe,SAAS,KAAK,OAAO;AAC3D,QAAI,CAAC,SAAS,SAAS;AACrB,YAAM,IAAI,MAAM,SAAS,KAAK;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,KAAa,SAA6C;AACnE,QAAI,CAAC,KAAK,QAAQ,WAAW,GAAG;AAC9B,YAAM,gBAAgB;AAAA,QACpB,IAAI,OAAO;AAAA,QACX,QAAQ;AAAA,QACR,UAAU,SAAS,YAAY;AAAA,QAC/B,UAAU,EAAE,OAAO,MAAM,QAAQ,IAAI;AAAA,QACrC,aAAa,SAAS;AAAA,QACtB,cAAc,SAAS;AAAA,QACvB,OAAO,SAAS,QAAQ,cAAc,QAAQ,KAAK,IAAI;AAAA,MACzD;AAEA,YAAM,KAAK,QAAQ,OAAO,aAAa;AAEvC,UAAI,SAAS,SAAS;AACpB,cAAM,oBAAoB,KAAK,QAAQ,QAAQ,CAAC;AAChD,aAAK,OAAO,MAAM,2BAA2B;AAAA,MAC/C;AAAA,IACF;AACA,UAAM,KAAK,KAAK,EAAE,IAAI,OAAO,GAAG,QAAQ,YAAY,IAAI,CAAC;AAAA,EAC3D;AAAA,EAEA,MAAM,SAAS,SAA4C;AACzD,UAAM,SAAS,MAAM,KAAK,QAAQ,YAAY,EAAE,SAAS,MAAM,QAAQ,MAAM,GAAG,QAAQ,CAAC;AACzF,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,iBAAiB,SAAoE;AACzF,UAAM,SAAS,MAAM,KAAK,QAAQ,YAAY,EAAE,SAAS,MAAM,QAAQ,MAAM,GAAG,QAAQ,CAAC;AACzF,WAAO,EAAE,MAAM,OAAO,MAAM,MAAM,OAAO,KAAK;AAAA,EAChD;AAAA,EAEA,MAAM,MAAM,KAA4B;AACtC,UAAM,KAAK,KAAK,EAAE,IAAI,OAAO,GAAG,QAAQ,SAAS,UAAU,IAAI,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,KAAK,KAAa,OAA8B;AACpD,UAAM,KAAK,KAAK,EAAE,IAAI,OAAO,GAAG,QAAQ,QAAQ,UAAU,KAAK,MAAM,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,KAAK,KAAa,MAA6B;AACnD,UAAM,KAAK,KAAK;AAAA,MACd,IAAI,OAAO;AAAA,MACX,QAAQ;AAAA,MACR,UAAU;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,KAAa,OAA8B;AACtD,UAAM,KAAK,KAAK;AAAA,MACd,IAAI,OAAO;AAAA,MACX,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,KAA4B;AACtC,UAAM,KAAK,KAAK,EAAE,IAAI,OAAO,GAAG,QAAQ,SAAS,UAAU,IAAI,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,QAAQ,KAA4B;AACxC,UAAM,KAAK,KAAK,EAAE,IAAI,OAAO,GAAG,QAAQ,WAAW,UAAU,IAAI,CAAC;AAAA,EACpE;AAAA,EAEA,MAAM,SAAS,KAA4B;AACzC,UAAM,KAAK,KAAK,EAAE,IAAI,OAAO,GAAG,QAAQ,YAAY,IAAI,CAAC;AAAA,EAC3D;AAAA,EAEA,MAAM,KAAK,IAA2B;AACpC,UAAM,KAAK,KAAK,EAAE,IAAI,OAAO,GAAG,QAAQ,QAAQ,SAAS,GAAG,CAAC;AAAA,EAC/D;AAAA,EAEA,MAAM,OAAO,WAAmB,SAAS,KAAK,SAAgD;AAC5F,UAAM,KAAK,KAAK;AAAA,MACd,IAAI,OAAO;AAAA,MACX,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,UAAU,SAAS;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WACJ,MACA,SACuB;AACvB,UAAM,WAAW,MAAM,KAAK,KAAK;AAAA,MAC/B,IAAI,OAAO;AAAA,MACX,QAAQ;AAAA,MACR;AAAA,MACA,GAAG;AAAA,IACL,CAAC;AACD,UAAM,OAAQ,SAAuC;AACrD,WAAO,MAAM,eAAe,CAAC;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,4BAGH;AACD,UAAM,WAAWC,MAAK,OAAO,GAAG,mBAAmB,KAAK,IAAI,CAAC,MAAM;AACnE,UAAM,cAAc,MAAM,KAAK,WAAW,UAAU,EAAE,UAAU,KAAK,CAAC;AACtE,UAAM,cAAc,MAAMC,UAAS,QAAQ;AAC3C,WAAO,QAAQ,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAC/B,WAAO,EAAE,aAAa,YAAY;AAAA,EACpC;AAAA,EAEA,MAAM,SAAS,UAAkB,UAAmC;AAClE,UAAM,KAAK,KAAK;AAAA,MACd,IAAI,OAAO;AAAA,MACX,QAAQ;AAAA,MACR;AAAA,MACA,MAAM;AAAA,IACR,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBACJ,UACA,SACe;AACf,UAAM,KAAK,KAAK;AAAA,MACd,IAAI,OAAO;AAAA,MACX,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS,WAAW;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SAAS,QAAkC;AAC/C,UAAM,WAAW,MAAM,KAAK,KAAK;AAAA,MAC/B,IAAI,OAAO;AAAA,MACX,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAED,UAAM,OAAQ,SAA6C;AAC3D,WAAO,MAAM,UAAU;AAAA,EACzB;AAAA,EAEA,MAAM,QAAQ,UAAmC;AAC/C,UAAM,WAAW,MAAM,KAAK,KAAK;AAAA,MAC/B,IAAI,OAAO;AAAA,MACX,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AACD,UAAM,OAAQ,SAAgC;AAC9C,WAAO,OAAO,QAAQ,EAAE;AAAA,EAC1B;AAAA,EAEA,MAAM,aAAa,UAAmC;AACpD,UAAM,WAAW,MAAM,KAAK,KAAK;AAAA,MAC/B,IAAI,OAAO;AAAA,MACX,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AACD,UAAM,OAAQ,SAAgC;AAC9C,WAAO,OAAO,QAAQ,EAAE;AAAA,EAC1B;AAAA,EAEA,MAAM,MAAuB;AAC3B,WAAO,KAAK,QAAQ,QAAQ,EAAE,IAAI;AAAA,EACpC;AAAA;AAAA,EAGA,MAAM,YAA6B;AACjC,WAAO,KAAK,QAAQ,SAAS,EAAE;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAkB,iBAA2C;AACjE,UAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,QAAI,MAAM,SAAS,iBAAiB;AAClC,YAAM,cAAc,MAAM,SAAS;AACnC,YAAM,KAAK,QAAQ,SAAS,WAAW;AACvC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,oBAAoB,YAAY,KAAqB;AACzD,UAAM,OAAO,KAAK,QAAQ,QAAQ;AAGlC,QAAI;AACF,YAAM,KAAK,iBAAiB,eAAe,EAAE,SAAS,KAAK,IAAI,WAAW,GAAI,EAAE,CAAC;AAAA,IACnF,QAAQ;AAAA,IAER;AAGA,UAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,QAAI,eAAe;AACnB,QAAI,cAAc;AAClB,QAAI,YAAY;AAEhB,WAAO,KAAK,IAAI,IAAI,SAAS;AAC3B,YAAM,UAAU,MAAM,KAAK,SAAS;AACpC,UAAI,YAAY,cAAc;AAC5B;AACA,YAAI,eAAe,GAAG;AACpB,eAAK,OAAO,MAAM,iCAAiC;AACnD;AAAA,QACF;AAAA,MACF,OAAO;AACL,sBAAc;AAAA,MAChB;AACA,qBAAe;AACf;AAEA,YAAM,WAAW,aAAa,IAAI,MAAM,aAAa,IAAI,MAAM;AAC/D,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AAAA,IAClD;AACA,SAAK,OAAO,MAAM,qCAAqC;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBACJ,kBACA,YAAY,KACZ,iBAAiB,KACgC;AACjD,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,WAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC;AACtD,YAAM,UAAU,MAAM,KAAK,SAAS;AACpC,UAAI,YAAY,kBAAkB;AAChC,aAAK,OAAO,MAAM,uCAAuC;AACzD,cAAM,KAAK,oBAAoB;AAC/B,eAAO,EAAE,SAAS,MAAM,UAAU,MAAM,KAAK,SAAS,EAAE;AAAA,MAC1D;AAAA,IACF;AACA,SAAK,OAAO,MAAM,sCAAsC;AACxD,WAAO,EAAE,SAAS,OAAO,UAAU,iBAAiB;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,0BACJ,WACA,iBACA,UAAU,KACK;AAEf,UAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,QAAI,WAAW;AACf,WAAO,KAAK,IAAI,IAAI,SAAS;AAC3B,YAAM,eAAe,KAAK,QAAQ,SAAS,EAAE;AAC7C,WAAK,OAAO,MAAM,8BAA8B,eAAe,QAAQ,YAAY,EAAE;AACrF,UAAI,eAAe,iBAAiB;AAClC,mBAAW;AACX;AAAA,MACF;AACA,YAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAAA,IAC7C;AAEA,QAAI,UAAU;AACZ,YAAM,QAAQ,KAAK,QAAQ,SAAS;AACpC,YAAM,cAAc,MAAM,SAAS;AACnC,WAAK,OAAO,MAAM,8CAA8C,WAAW,EAAE;AAC7E,YAAM,KAAK,QAAQ,SAAS,WAAW;AACvC,YAAMC,QAAO,KAAK,QAAQ,QAAQ;AAClC,WAAK,OAAO,MAAM,uBAAuBA,MAAK,IAAI,CAAC,EAAE;AACrD,UAAI;AACF,cAAMA,MAAK,iBAAiB,QAAQ,EAAE,QAAQ,CAAC;AAAA,MACjD,QAAQ;AAAA,MAER;AACA,WAAK,OAAO,MAAM,4BAA4BA,MAAK,IAAI,CAAC,EAAE;AAC1D;AAAA,IACF;AAGA,SAAK,OAAO,MAAM,6DAA6D,SAAS,GAAG;AAC3F,UAAM,OAAO,KAAK,QAAQ,QAAQ;AAClC,QAAI,aAAa;AACjB,QAAI;AACF,YAAM,KAAK;AAAA,QACT,CAAC,QAAQ,IAAI,SAAS,MAAM;AAAA,QAC5B,EAAE,SAAS,WAAW,OAAO;AAAA,MAC/B;AACA,mBAAa;AACb,WAAK,OAAO,MAAM,wBAAwB,KAAK,IAAI,CAAC,EAAE;AAEtD,YAAM,KAAK,oBAAoB;AAAA,IACjC,QAAQ;AACN,WAAK,OAAO,MAAM,8BAA8B;AAAA,IAClD;AAIA,QAAI,CAAC,YAAY;AACf,WAAK,OAAO,MAAM,iDAAiD;AACnE,YAAM,iBAAiB,MAAM,KAAK,SAAS;AAC3C,YAAM,aAAa,KAAK,IAAI,IAAI;AAChC,YAAM,aAAa,KAAK,IAAI;AAC5B,UAAI,cAAc;AAClB,UAAI,cAAc;AAElB,aAAO,KAAK,IAAI,IAAI,YAAY;AAC9B,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAC3C,cAAM,UAAU,MAAM,KAAK,SAAS;AACpC,YAAI,YAAY,gBAAgB;AAC9B,wBAAc;AACd,eAAK,OAAO,MAAM,kDAAkD;AACpE;AAAA,QACF;AAGA;AACA,YAAI,KAAK,IAAI,IAAI,cAAc,OAAQ,eAAe,GAAG;AACvD,eAAK,OAAO,MAAM,0CAA0C;AAC5D;AAAA,QACF;AAAA,MACF;AAEA,UAAI,aAAa;AACf,cAAM,KAAK,oBAAoB;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,eAAe,WAAmB,MAA8B;AACpE,QAAI,KAAK,uBAAuB;AAC9B;AAAA,IACF;AAGA,QAAI;AACF,eAAS,gBAAgB,EAAE,OAAO,SAAS,CAAC;AAAA,IAC9C,QAAQ;AACN,WAAK,OAAO;AAAA,QACV;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAMC,OAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAE1C,UAAM,MAAM,oBAAI,KAAK;AACrB,UAAM,MAAM,CAAC,MAAc,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AACpD,UAAM,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,IAAI,IAAI,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,QAAQ,CAAC,CAAC,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC,CAAC;AACvJ,UAAM,aAAaH,MAAK,WAAW,aAAa,EAAE,OAAO;AACzD,SAAK,uBAAuB;AAG5B,SAAK,gBAAgB,MAAM,UAAU;AAAA,MACnC;AAAA,MAAM;AAAA,MACN;AAAA,MAAc,OAAO,cAAc;AAAA,MACnC;AAAA,MAAW;AAAA,MACX;AAAA,MAAM;AAAA,MACN;AAAA,MAAQ;AAAA,MACR;AAAA,MAAQ;AAAA,MACR;AAAA,MAAiB;AAAA,MACjB;AAAA,MACA;AAAA,IACF,GAAG,EAAE,OAAO,CAAC,QAAQ,UAAU,QAAQ,EAAE,CAAC;AAE1C,SAAK,cAAc,GAAG,SAAS,CAAC,QAAQ;AACtC,WAAK,OAAO,KAAK,sDAAmB,IAAI,OAAO,EAAE;AAAA,IACnD,CAAC;AAGD,SAAK,cAAc;AACnB,UAAM,gBAAgB,CAAC,UAA4B;AACjD,WAAK,cAAc,OAAO,KAAK,MAAM,MAAM,QAAQ;AAAA,IACrD;AAGA,QAAI;AACF,YAAM,KAAK,QAAQ,gBAAgB,eAAe;AAAA,QAChD,QAAQ;AAAA,QACR,SAAS;AAAA,MACX,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,WAAK,OAAO;AAAA,QACV,8CAAqB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MACvE;AACA,WAAK,cAAc;AACnB;AAAA,IACF;AAEA,SAAK,wBAAwB;AAG7B,SAAK,oBAAoB,YAAY,MAAM;AACzC,UAAI,KAAK,eAAe,KAAK,eAAe,OAAO,UAAU;AAC3D,YAAI;AACF,eAAK,cAAc,MAAM,MAAM,KAAK,WAAW;AAAA,QACjD,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,GAAG,sBAAsB;AAGzB,SAAK,6BAA6B,YAAY,YAAY;AACxD,UAAI,CAAC,KAAK,sBAAuB;AACjC,UAAI;AACF,YAAI,CAAC,KAAK,QAAQ,gBAAgB,GAAG;AACnC,eAAK,OAAO,MAAM,0DAAiC;AACnD,gBAAM,KAAK,QAAQ,gBAAgB,eAAe;AAAA,YAChD,QAAQ;AAAA,YACR,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,GAAG,+BAA+B;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAsB;AAC5B,QAAI,KAAK,eAAe;AACtB,UAAI;AACF,aAAK,cAAc,OAAO,IAAI;AAC9B,aAAK,cAAc,KAAK;AAAA,MAC1B,QAAQ;AAAA,MAER;AACA,WAAK,gBAAgB;AAAA,IACvB;AACA,SAAK,uBAAuB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAA8E;AAClF,QAAI,CAAC,KAAK,uBAAuB;AAC/B,aAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,GAAG,OAAO,2BAA2B;AAAA,IACnE;AAGA,QAAI,KAAK,mBAAmB;AAC1B,oBAAc,KAAK,iBAAiB;AACpC,WAAK,oBAAoB;AAAA,IAC3B;AAGA,QAAI,KAAK,4BAA4B;AACnC,oBAAc,KAAK,0BAA0B;AAC7C,WAAK,6BAA6B;AAAA,IACpC;AAGA,QAAI;AACF,YAAM,KAAK,QAAQ,eAAe;AAAA,IACpC,QAAQ;AAAA,IAER;AAEA,UAAM,aAAa,KAAK;AACxB,SAAK,wBAAwB;AAC7B,SAAK,cAAc;AAGnB,QAAI,KAAK,eAAe;AACtB,YAAM,SAAS,KAAK;AACpB,WAAK,gBAAgB;AAErB,YAAM,IAAI,QAAc,CAAC,YAAY;AACnC,cAAM,UAAU,WAAW,MAAM;AAC/B,iBAAO,KAAK,SAAS;AACrB,kBAAQ;AAAA,QACV,GAAG,GAAK;AAER,eAAO,GAAG,SAAS,MAAM;AACvB,uBAAa,OAAO;AACpB,kBAAQ;AAAA,QACV,CAAC;AAED,YAAI;AACF,iBAAO,OAAO,IAAI;AAAA,QACpB,QAAQ;AACN,uBAAa,OAAO;AACpB,kBAAQ;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH;AAEA,SAAK,uBAAuB;AAE5B,QAAI,YAAY;AACd,aAAO,EAAE,OAAO,CAAC,UAAU,GAAG,QAAQ,EAAE;AAAA,IAC1C;AACA,WAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAE;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAuB;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,QAAuB;AAE3B,QAAI,KAAK,uBAAuB;AAC9B,UAAI;AACF,cAAM,KAAK,cAAc;AAAA,MAC3B,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,SAAK,cAAc;AACnB,UAAM,KAAK,QAAQ,MAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAA8C;AAC9D,UAAM,QAAQ,KAAK,IAAI;AACvB,QAAI;AACF,UAAI,SAAS;AACb,cAAQ,KAAK,QAAQ;AAAA,QACnB,KAAK;AACH,gBAAM,KAAK,MAAM,KAAK,QAAS;AAC/B;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,KAAK,KAAK,UAAW,KAAK,SAAS,EAAE;AAChD;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,KAAK,KAAK,UAAW,KAAK,SAAS,EAAE;AAChD;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,OAAO,KAAK,UAAW,KAAK,SAAS,EAAE;AAClD;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,MAAM,KAAK,QAAS;AAC/B;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,QAAQ,KAAK,QAAS;AACjC;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,SAAS,KAAK,KAAM;AAC/B;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK,GAAI;AAC1C;AAAA,QACF,KAAK;AACH,gBAAM,KAAK,OAAO,KAAK,SAAS,MAAM;AACtC;AAAA,QACF,KAAK,WAAW;AACd,gBAAM,SAAS,KAAK,SAAS,KAAK,UAAU;AAC5C,cAAI,QAAQ;AACV,kBAAM,SAAS,MAAM,KAAK,SAAS,MAAM;AACzC,qBAAS,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,MAAM;AAAA,UACtE;AACA;AAAA,QACF;AAAA,QACA,KAAK,YAAY;AACf,gBAAM,eAAe,KAAK,gBAAgB,iBAAiB,KAAK,IAAI,CAAC;AACrE,gBAAM,KAAK,SAAS,KAAK,UAAW,YAAY;AAChD,mBAAS;AACT;AAAA,QACF;AAAA,QACA;AACE,mBAAS,mBAAmB,KAAK,MAAM;AAAA,MAC3C;AACA,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC5D,YAAY,KAAK,IAAI,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;AG/pBO,SAAS,kBACd,MAC8B;AAE9B,QAAM,WAAW,KAAK,MAAM,gBAAgB;AAC5C,MAAI,CAAC,SAAU,QAAO;AAEtB,QAAM,MAAM,SAAS,CAAC;AACtB,QAAM,WAAW,KAAK,QAAQ,SAAS,CAAC,CAAC;AAGzC,QAAM,YAAY,KAAK,MAAM,GAAG,QAAQ,EAAE,KAAK;AAE/C,QAAM,WAAW,KAAK,MAAM,WAAW,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK;AAGhE,QAAM,cAAc,UAAU,QAAQ,SAAS,EAAE;AAEjD,MAAI;AACJ,MAAI;AAGJ,QAAM,gBAAgB,YAAY,MAAM,qBAAqB;AAC7D,QAAM,gBAAgB,YAAY,MAAM,SAAS;AAEjD,MAAI,eAAe;AACjB,WAAO,cAAc,CAAC;AACtB,WAAO,cAAc,CAAC;AAAA,EACxB,WAAW,iBAAiB,CAAC,cAAc,CAAC,EAAE,WAAW,GAAG,GAAG;AAC7D,WAAO,cAAc,CAAC;AACtB,WAAO;AAAA,EACT,OAAO;AACL,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,SAAS,QAAQ,MAAM,EAAE,EAAE,KAAK;AAGnD,QAAM,aAAqC,CAAC;AAC5C,QAAM,YAAY;AAClB,MAAI;AACJ,UAAQ,YAAY,UAAU,KAAK,UAAU,OAAO,MAAM;AACxD,UAAM,MAAM,UAAU,CAAC;AACvB,QAAI,QAAQ,MAAO;AACnB,UAAM,QAAQ,UAAU,CAAC,KAAK;AAC9B,eAAW,GAAG,IAAI;AAAA,EACpB;AAEA,SAAO,EAAE,KAAK,MAAM,MAAM,WAAW;AACvC;AAKO,SAAS,sBACd,UACA,KAC8B;AAC9B,QAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,SAAS,QAAQ,GAAG,GAAG,EAAG;AACpC,UAAM,SAAS,kBAAkB,IAAI;AACrC,QAAI,UAAU,OAAO,QAAQ,IAAK,QAAO;AAAA,EAC3C;AACA,SAAO;AACT;AAKO,SAAS,iBACd,UACyB;AACzB,QAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,QAAM,WAAoC,CAAC;AAC3C,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,kBAAkB,IAAI;AACrC,QAAI,OAAQ,UAAS,KAAK,MAAM;AAAA,EAClC;AACA,SAAO;AACT;AAKO,SAAS,cAAc,UAA0B;AACtD,SAAO,iBAAiB,QAAQ,EAAE;AACpC;;;ACrFO,SAAS,gBAAgB,KAA6C;AAE3E,MAAI,IAAI,gBAAgB;AACtB,WAAO;AAAA,EACT;AAGA,MAAI,IAAI,iBAAiB,CAAC,IAAI,kBAAkB;AAC9C,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,IAAI,oBAAoB,IAAI,gBAAgB,IAAI,aAAa,SAAS,GAAG;AAC5E,UAAM,oBAAoB,IAAI,aAAa,KAAK,CAAC,MAAM,EAAE,eAAe;AACxE,QAAI,mBAAmB;AACrB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAGA,MAAI,CAAC,IAAI,kBAAkB;AACzB,WAAO;AAAA,EACT;AAGA,QAAM,aAAa,IAAI,MAAM,YAAY;AACzC,MAAI,WAAW,SAAS,SAAS,KAAK,WAAW,SAAS,YAAY,GAAG;AACvE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAMO,SAAS,gBAAgB,UAAmC;AACjE,QAAM,SAA0C;AAAA,IAC9C,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,wBAAwB;AAAA,IACxB,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,SAAS;AAAA,EACX;AACA,SAAO,EAAE,OAAO,QAAQ,CAAiC;AAC3D;;;ACxDO,SAAS,uBACd,UACA,KACsB;AACtB,QAAM,EAAE,WAAW,aAAa,OAAO,MAAM,WAAW,IAAI;AAE5D,cAAY,IAAI;AAAA,IACd;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA,MAAM;AAAA,MACJ;AAAA,MACA,iBAAiB,SAAS,MAAM,GAAG,GAAG;AAAA,MACtC,gBAAgB,SAAS;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,MAAI;AACF,QAAI,cAAc;AAGlB,QAAI,YAAY,WAAW,GAAG,KAAK,YAAY,SAAS,GAAG,GAAG;AAC5D,UAAI;AACF,cAAM,WAAW,KAAK,MAAM,WAAW;AACvC,YAAI,OAAO,aAAa,UAAU;AAChC,sBAAY,IAAI;AAAA,YACd;AAAA,YACA,OAAO;AAAA,YACP;AAAA,YACA,MAAM,EAAE,yBAAyB,KAAK;AAAA,UACxC,CAAC;AACD,wBAAc;AAAA,QAChB;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,MAAM,WAAW;AAErC,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,YAAM,QAAQ,OAAO,IAAI,CAACI,OAAe,MAAc;AACrD,YAAI,OAAOA,UAAS,YAAYA,UAAS,QAAQ,CAAC,MAAM,QAAQA,KAAI,GAAG;AACrE,iBAAOA;AAAA,QACT;AACA,eAAO,EAAE,OAAO,GAAG,OAAOA,MAAK;AAAA,MACjC,CAAC;AACD,YAAM,YACJ,MAAM,SAAS,IACX,KAAK,UAAU,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,IACpC;AACN,kBAAY,IAAI;AAAA,QACd;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA,MAAM;AAAA,UACJ,aAAa;AAAA,UACb,aAAa,MAAM;AAAA,UACnB,kBAAkB;AAAA,UAClB;AAAA,UACA,OAAO,MAAM;AAAA,QACf;AAAA,MACF,CAAC;AACD,gBAAU,OAAO,YAAY,KAAK;AAClC,UAAI,QAAQ,oBAAoB,MAAM,MAAM,cAAc,UAAU,GAAG;AACvE,aAAO,EAAE,UAAU,MAAM,OAAO;AAAA,IAClC;AAEA,UAAM,OACJ,OAAO,WAAW,YAAY,WAAW,OACpC,SACD,EAAE,OAAO,OAAO;AACtB,gBAAY,IAAI;AAAA,MACd;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,MAAM;AAAA,QACJ,aAAa;AAAA,QACb,YAAY,KAAK,UAAU,OAAO,KAAK,IAAI,CAAC;AAAA,QAC5C;AAAA,MACF;AAAA,IACF,CAAC;AACD,cAAU,OAAO,YAAY,IAAI;AACjC,QAAI,QAAQ,+BAA+B,UAAU,GAAG;AACxD,WAAO,EAAE,UAAU,EAAE;AAAA,EACvB,QAAQ;AACN,gBAAY,IAAI;AAAA,MACd;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,MAAM;AAAA,QACJ,aAAa;AAAA,QACb;AAAA,QACA,iBAAiB,SAAS,MAAM,GAAG,GAAG;AAAA,MACxC;AAAA,IACF,CAAC;AACD,QAAI;AAAA,MACF;AAAA,IACF;AACA,cAAU,OAAO,YAAY,EAAE,OAAO,SAAS,CAAC;AAChD,WAAO,EAAE,UAAU,EAAE;AAAA,EACvB;AACF;;;AC7HO,SAAS,MAAM,IAA2B;AAC/C,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;;;ACAA,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BhB,SAAS,qBACd,MACA,iBACA,SACQ;AACR,QAAM,iBAAiB,kBACnB;AAAA;AAAA,EAAmC,eAAe;AAAA,IAClD;AAEJ,MAAI,iBAAiB;AACrB,MAAI,WAAW,OAAO,KAAK,QAAQ,MAAM,EAAE,SAAS,GAAG;AACrD,UAAM,UAAU,OAAO,QAAQ,QAAQ,MAAM,EAC1C,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,KAAK,GAAG,KAAK,KAAK,EAAE,EAC1C,KAAK,IAAI;AACZ,qBAAiB;AAAA;AAAA;AAAA,EAA8E,OAAO;AAAA;AAAA;AAAA;AAAA,EACxG;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeP,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyHd,IAAI;AAAA,EACJ,cAAc,GAAG,cAAc;AAAA;AAEjC;AAEO,SAAS,wBAAgC;AAC9C,SAAO;AACT;;;AC1LA,IAAMC,kBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0BhB,SAASC,sBACd,MACA,iBACA,SACQ;AACR,QAAM,iBAAiB,kBACnB;AAAA;AAAA,EAAc,eAAe;AAAA,IAC7B;AAEJ,MAAI,iBAAiB;AACrB,MAAI,WAAW,OAAO,KAAK,QAAQ,MAAM,EAAE,SAAS,GAAG;AACrD,UAAM,UAAU,OAAO,QAAQ,QAAQ,MAAM,EAC1C,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,KAAK,GAAG,KAAK,KAAK,EAAE,EAC1C,KAAK,IAAI;AACZ,qBAAiB;AAAA;AAAA;AAAA,EAA8C,OAAO;AAAA;AAAA;AAAA;AAAA,EACxE;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAePD,eAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyHd,IAAI;AAAA,EACJ,cAAc,GAAG,cAAc;AAAA;AAEjC;AAEO,SAASE,yBAAgC;AAC9C,SAAO;AACT;;;AC1LO,SAAS,wBAAgC;AAC9C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBT;AAEO,SAAS,uBACd,MACA,eACA,cACA,eACQ;AACR,QAAM,YAAY,cACf;AAAA,IACC,CAAC,MACC,GAAG,EAAE,OAAO,MAAM,EAAE,UAAU,OAAO,MAAM,KAAK,EAAE,OAAO,WAAW,aAAa,EAAE,OAAO,MAAM,UAAU,EAAE,GAAG,IAAI,EAAE,QAAQ,WAAW,EAAE,KAAK,KAAK,EAAE;AAAA,EAC1J,EACC,KAAK,IAAI;AAEZ,QAAM,uBACJ,iBAAiB,cAAc,SAAS,IACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAIN,cACC;AAAA,IACC,CAAC,IAAI,MACH,GAAG,IAAI,CAAC,kBAAkB,GAAG,SAAS,MAAM,GAAG,eAAe,WAAW,GAAG,GAAG;AAAA,EACnF,EACC,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,IAIL;AAEN,SAAO;AAAA,EACP,IAAI;AAAA;AAAA;AAAA,EAGJ,eAAe,aAAa,cAAc;AAAA,EAC1C,oBAAoB;AAAA;AAAA,EAEpB,SAAS;AACX;;;AC/DO,SAASC,yBAAgC;AAC9C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsBT;AAEO,SAASC,wBACd,MACA,eACA,cACA,eACQ;AACR,QAAM,YAAY,cACf;AAAA,IACC,CAAC,MACC,GAAG,EAAE,OAAO,MAAM,EAAE,UAAU,iBAAO,cAAI,KAAK,EAAE,OAAO,WAAW,aAAa,EAAE,OAAO,MAAM,UAAU,EAAE,GAAG,IAAI,EAAE,QAAQ,wBAAS,EAAE,KAAK,KAAK,EAAE;AAAA,EACtJ,EACC,KAAK,IAAI;AAEZ,QAAM,uBACJ,iBAAiB,cAAc,SAAS,IACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAIN,cACC;AAAA,IACC,CAAC,IAAI,MACH,GAAG,IAAI,CAAC,8BAAU,GAAG,SAAS,kBAAQ,GAAG,eAAe,WAAW,GAAG,GAAG;AAAA,EAC7E,EACC,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,IAIL;AAEN,SAAO;AAAA,EACP,IAAI;AAAA;AAAA;AAAA,EAGJ,eAAe,6BAAS,oBAAK;AAAA,EAC7B,oBAAoB;AAAA;AAAA,EAEpB,SAAS;AACX;;;AC9DO,SAAS,sBACd,UACA,UACA,iBACA,KACA,iBACA,cACA,sBACwC;AACxC,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,UAAU,mBAAmB,QAAQ,CAAC;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,sBAAsB;AACxB,UAAM,KAAK,IAAI,wBAAwB,oBAAoB;AAAA,EAC7D;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,iBAAiB,mBAAmB,EAAE,gBAAgB,aAAa,UAAU;AACnF,MAAI,gBAAgB;AAClB,UAAM,KAAK,IAAI,4BAA4B,eAAe;AAAA,EAC5D;AAEA,MAAI,gBAAgB,aAAa,UAAU,GAAG;AAC5C,UAAM;AAAA,MACJ;AAAA,MACA,mCAAmC,aAAa,UAAU,KAAK;AAAA,IACjE;AAGA,QAAI,aAAa,cAAc;AAC7B,YAAM,KAAK,YAAY,aAAa,YAAY,EAAE;AAAA,IACpD;AAEA,QAAI,aAAa,eAAe,SAAS,GAAG;AAC1C,YAAM,SAAS,aAAa,eAAe,MAAM,EAAE;AACnD,YAAM,KAAK,aAAa,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,IAC7C;AACA,QAAI,aAAa,oBAAoB;AAEnC,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,aAAa,kBAAkB;AACzD,YAAI,OAAO,WAAW;AACpB,gBAAM,KAAK,oBAAoB,OAAO,SAAS,GAAG;AAAA,QACpD;AAAA,MACF,QAAQ;AACN,cAAM,KAAK,kBAAkB,aAAa,mBAAmB,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,MAC9E;AAAA,IACF;AACA,QAAI,CAAC,aAAa,iBAAiB;AACjC,YAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,YAAY,MAAM,KAAK,IAAI,EAAE;AAChD;AAEA,SAAS,mBAAmB,UAA6C;AACvE,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,QAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,MAAM,UAAU,aAAa,UAAU,IAAK;AACnG,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO;AACT;;;AChGO,SAASC,uBACd,UACA,UACA,iBACA,KACA,iBACA,cACA,sBACwC;AACxC,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,UAAUC,oBAAmB,QAAQ,CAAC;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,sBAAsB;AACxB,UAAM,KAAK,IAAI,uDAAe,oBAAoB;AAAA,EACpD;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,iBAAiB,mBAAmB,EAAE,gBAAgB,aAAa,UAAU;AACnF,MAAI,gBAAgB;AAClB,UAAM,KAAK,IAAI,uDAAe,eAAe;AAAA,EAC/C;AAEA,MAAI,gBAAgB,aAAa,UAAU,GAAG;AAC5C,UAAM;AAAA,MACJ;AAAA,MACA,2EAAoB,aAAa,UAAU,KAAK;AAAA,IAClD;AAGA,QAAI,aAAa,cAAc;AAC7B,YAAM,KAAK,6BAAS,aAAa,YAAY,EAAE;AAAA,IACjD;AAEA,QAAI,aAAa,eAAe,SAAS,GAAG;AAC1C,YAAM,SAAS,aAAa,eAAe,MAAM,EAAE;AACnD,YAAM,KAAK,mCAAU,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,IAC1C;AACA,QAAI,aAAa,oBAAoB;AACnC,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,aAAa,kBAAkB;AACzD,YAAI,OAAO,WAAW;AACpB,gBAAM,KAAK,oCAAW,OAAO,SAAS,GAAG;AAAA,QAC3C;AAAA,MACF,QAAQ;AACN,cAAM,KAAK,mCAAU,aAAa,mBAAmB,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,MACtE;AAAA,IACF;AACA,QAAI,CAAC,aAAa,iBAAiB;AACjC,YAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,YAAY,MAAM,KAAK,IAAI,EAAE;AAChD;AAEA,SAASA,oBAAmB,UAA6C;AACvE,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,QAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,MAAM,UAAU,aAAa,UAAU,IAAK;AACnG,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO;AACT;;;AChGO,SAAS,sBACd,UACA,MACA,gBACA,KACA,iBACwC;AACxC,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,gBAAgB,KAAK,WAAW;AAAA,IAChC,WAAW,KAAK,OAAO,IAAI;AAAA,IAC3B,mBAAmB,KAAK,UAAU,KAAK,OAAO,UAAU,MAAM,CAAC,CAAC;AAAA,IAChE,QAAQ,GAAG;AAAA,IACX;AAAA,IACA;AAAA,IACA,GAAG,eAAe,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE;AAAA,IAClD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,iBAAiB;AACnB,UAAM,KAAK,IAAI,4BAA4B,eAAe;AAAA,EAC5D;AAEA,SAAO,EAAE,QAAQ,YAAY,MAAM,KAAK,IAAI,EAAE;AAChD;;;AC9CO,SAASC,uBACd,UACA,MACA,gBACA,KACA,iBACwC;AACxC,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,iBAAO,KAAK,WAAW;AAAA,IACvB,mCAAU,KAAK,OAAO,IAAI;AAAA,IAC1B,+CAAY,KAAK,UAAU,KAAK,OAAO,UAAU,MAAM,CAAC,CAAC;AAAA,IACzD,QAAQ,GAAG;AAAA,IACX;AAAA,IACA;AAAA,IACA,GAAG,eAAe,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE;AAAA,IAClD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,iBAAiB;AACnB,UAAM,KAAK,IAAI,uDAAe,eAAe;AAAA,EAC/C;AAEA,SAAO,EAAE,QAAQ,YAAY,MAAM,KAAK,IAAI,EAAE;AAChD;;;AC7CO,SAAS,oBACd,aACA,UACA,iBACA,KACA,gBAC6C;AAC7C,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,iBAAiB,YACpB,IAAI,CAAC,MAAM;AACV,UAAM,UAAU,EAAE,OAAO,KAAK,EAAE,IAAI,MAAM;AAC1C,WAAO,MAAM,EAAE,MAAM,QAAQ,EAAE,GAAG,IAAI,EAAE,IAAI,GAAG,OAAO,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AAAA,EAChF,CAAC,EACA,KAAK,IAAI;AAEZ,QAAM,gBAAgBC,oBAAmB,QAAQ;AAEjD,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,UAAU,aAAa;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,eAAe,SAAS,GAAG;AAC7B,UAAM,SAAS,eAAe,MAAM,EAAE;AACtC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,GAAG,OAAO,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,iBAAiB,MAAM,KAAK,IAAI,EAAE;AACrD;AAEA,SAASA,oBAAmB,UAA6C;AACvE,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,QAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,MAAM,UAAU,aAAa,UAAU,IAAK;AACnG,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO;AACT;;;ACpEO,SAASC,qBACd,aACA,UACA,iBACA,KACA,gBAC6C;AAC7C,QAAM,SAAS;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,QAAM,iBAAiB,YACpB,IAAI,CAAC,MAAM;AACV,UAAM,UAAU,EAAE,OAAO,KAAK,EAAE,IAAI,MAAM;AAC1C,WAAO,MAAM,EAAE,MAAM,QAAQ,EAAE,GAAG,IAAI,EAAE,IAAI,GAAG,OAAO,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AAAA,EAChF,CAAC,EACA,KAAK,IAAI;AAEZ,QAAM,gBAAgBC,oBAAmB,QAAQ;AAEjD,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,UAAU,aAAa;AAAA,IAC5B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,eAAe,SAAS,GAAG;AAC7B,UAAM,SAAS,eAAe,MAAM,EAAE;AACtC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,GAAG,OAAO,IAAI,CAAC,GAAG,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,iBAAiB,MAAM,KAAK,IAAI,EAAE;AACrD;AAEA,SAASA,oBAAmB,UAA6C;AACvE,QAAM,SAAkC,CAAC;AACzC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,QAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,MAAM,UAAU,aAAa,UAAU,IAAK;AACnG,WAAO,GAAG,IAAI;AAAA,EAChB;AACA,SAAO;AACT;;;ACrEO,SAAS,4BAAoC;AAClD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,0BACd,YACA,WACA,aACA,iBACQ;AACR,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA,UAAU,YAAY,KAAK;AAAA,IAC3B,SAAS,YAAY,SAAS,IAAI;AAAA,IAClC,cAAc,YAAY,SAAS,QAAQ;AAAA,IAC3C;AAAA,IACA;AAAA,IACA,UAAU,KAAK,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA,WAAW,KAAK,MAAM;AAAA,EACxB;AAEA,MAAI,iBAAiB;AACnB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACzEO,SAASC,6BAAoC;AAClD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEO,SAASC,2BACd,YACA,WACA,aACA,iBACQ;AACR,QAAM,QAAkB;AAAA,IACtB;AAAA,IACA,6BAAS,YAAY,KAAK;AAAA,IAC1B,iBAAO,YAAY,SAAS,IAAI;AAAA,IAChC,oBAAU,YAAY,SAAS,QAAQ;AAAA,IACvC;AAAA,IACA;AAAA,IACA,UAAU,KAAK,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA,WAAW,KAAK,MAAM;AAAA,EACxB;AAEA,MAAI,iBAAiB;AACnB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACzCO,SAASC,sBAAqB,MAAc,iBAA0B,SAA+B;AAC1G,SAAO,UAAU,MAAM,OACnBA,sBAAuB,MAAM,iBAAiB,OAAO,IACrD,qBAAuB,MAAM,iBAAiB,OAAO;AAC3D;AAEO,SAASC,yBAAgC;AAC9C,SAAO,UAAU,MAAM,OACnBA,uBAAwB,IACxB,sBAAwB;AAC9B;AAIO,SAASC,yBAAgC;AAC9C,SAAO,UAAU,MAAM,OACnBA,uBAAwB,IACxB,sBAAwB;AAC9B;AAEO,SAASC,wBACd,MACA,eACA,cACA,eACQ;AACR,SAAO,UAAU,MAAM,OACnBA,wBAAyB,MAAM,eAAe,cAAc,aAAa,IACzE,uBAAyB,MAAM,eAAe,cAAc,aAAa;AAC/E;AAIO,SAASC,uBACd,UACA,UACA,iBACA,KACA,iBACA,cACA,sBACwC;AACxC,SAAO,UAAU,MAAM,OACnBA,uBAAwB,UAAU,UAAU,iBAAiB,KAAK,iBAAiB,cAAc,oBAAoB,IACrH,sBAAwB,UAAU,UAAU,iBAAiB,KAAK,iBAAiB,cAAc,oBAAoB;AAC3H;AAIO,SAASC,uBACd,UACA,MACA,gBACA,KACA,iBACwC;AACxC,SAAO,UAAU,MAAM,OACnBA,uBAAwB,UAAU,MAAM,gBAAgB,KAAK,eAAe,IAC5E,sBAAwB,UAAU,MAAM,gBAAgB,KAAK,eAAe;AAClF;AAIO,SAASC,qBACd,aACA,UACA,iBACA,KACA,gBAC6C;AAC7C,SAAO,UAAU,MAAM,OACnBA,qBAAsB,aAAa,UAAU,iBAAiB,KAAK,cAAc,IACjF,oBAAsB,aAAa,UAAU,iBAAiB,KAAK,cAAc;AACvF;AAIO,SAASC,6BAAoC;AAClD,SAAO,UAAU,MAAM,OACnBA,2BAA4B,IAC5B,0BAA4B;AAClC;AAEO,SAASC,2BACd,YACA,WACA,aACA,iBACQ;AACR,SAAO,UAAU,MAAM,OACnBA,2BAA4B,YAAY,WAAW,aAAa,eAAe,IAC/E,0BAA4B,YAAY,WAAW,aAAa,eAAe;AACrF;;;AC1HA,SAAS,YAAAC,iBAAgB;AAiCzB,eAAsB,aACpB,UAC0B;AAC1B,MAAI;AACF,UAAM,UAAU,MAAMC,UAAS,UAAU,OAAO;AAChD,WAAO,QACJ,KAAK,EACL,MAAM,IAAI,EACV,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC,EAC5B,IAAI,CAAC,SAAS;AACb,UAAI;AACF,eAAO,KAAK,MAAM,IAAI;AAAA,MACxB,QAAQ;AACN,eAAO,CAAC;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACL,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAIO,SAAS,uBAAuB,WAAuC;AAC5E,QAAM,QAAkB,CAAC;AACzB,MAAI,UAAU,cAAc,EAAG,QAAO;AAEtC,QAAM,IAAI;AACV,QAAM,iBAAiB,sBAAsB,CAAC;AAC9C,QAAM,aAAa,iBAAiB,CAAC,IAAI,KAAK,QAAQ,CAAC;AAEvD,QAAM,KAAK,gBAAgB;AAC3B,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,6CAAe;AAC1B,QAAM,KAAK,qBAAqB;AAChC,QAAM,KAAK,mBAAmB,EAAE,UAAU,IAAI;AAC9C,QAAM,KAAK,0BAA0B,eAAe,eAAe,CAAC,IAAI;AACxE,QAAM,KAAK,qBAAqB,EAAE,kBAAkB,eAAe,CAAC,IAAI;AACxE,QAAM,KAAK,yBAAyB,EAAE,uBAAuB,eAAe,CAAC,IAAI;AACjF,QAAM,KAAK,0BAA0B,EAAE,yBAAyB,eAAe,CAAC,IAAI;AACpF,QAAM,KAAK,sBAAsB,SAAS,KAAK;AAC/C,QAAM,KAAK,uBAAuB,EAAE,iBAAiB,QAAQ,CAAC,CAAC,IAAI;AACnE,QAAM,KAAK,0BAA0B,EAAE,kBAAkB,KAAM,QAAQ,CAAC,CAAC,KAAK;AAC9E,QAAM,KAAK,EAAE;AAGb,QAAM,eAAe,iBAAiB,CAAC;AACvC,MAAI,eAAe,OAAO,EAAE,cAAc,GAAG;AAC3C,UAAM,KAAK,2FAA+B,SAAS,MAAM;AACzD,UAAM,KAAK,yNAA0C;AACrD,UAAM,KAAK,8WAAkE;AAC7E,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,GAAG;AACvC,UAAM,KAAK,iBAAiB;AAC5B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,4EAA4E;AACvF,UAAM,KAAK,4EAA4E;AACvF,eAAW,CAAC,SAAS,CAAC,KAAK,OAAO,QAAQ,EAAE,SAAS,GAAG;AACtD,YAAM,mBAAmB,sBAAsB,CAAC;AAChD,YAAM;AAAA,QACJ,KAAK,OAAO,MAAM,EAAE,KAAK,MAAM,iBAAiB,eAAe,CAAC,MAAM,EAAE,aAAa,eAAe,CAAC,MAAM,EAAE,kBAAkB,eAAe,CAAC,MAAM,EAAE,oBAAoB,eAAe,CAAC,OAAO,EAAE,aAAa,KAAM,QAAQ,CAAC,CAAC;AAAA,MACnO;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,EAAE,WAAW,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,GAAG;AAClD,UAAM,KAAK,eAAe;AAC1B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,iFAAiF;AAC5F,UAAM,KAAK,iFAAiF;AAC5F,eAAW,CAAC,SAAS,CAAC,KAAK,OAAO,QAAQ,EAAE,OAAO,GAAG;AACpD,YAAM,iBAAiB,sBAAsB,CAAC;AAC9C,YAAM;AAAA,QACJ,KAAK,OAAO,MAAM,EAAE,KAAK,MAAM,eAAe,eAAe,CAAC,MAAM,EAAE,aAAa,eAAe,CAAC,MAAM,EAAE,kBAAkB,eAAe,CAAC,MAAM,EAAE,oBAAoB,eAAe,CAAC,OAAO,EAAE,iBAAiB,QAAQ,CAAC,CAAC,OAAO,EAAE,aAAa,KAAM,QAAQ,CAAC,CAAC;AAAA,MACrQ;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO;AACT;AAIO,SAAS,2BAAqC;AACnD,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,yBAAyB;AACpC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,mBAAmB,WAAW,CAAC,KAAK,iBAAiB,CAAC,GAAG;AACpE,QAAM,KAAK,kBAAkB,QAAQ,OAAO,EAAE;AAC9C,QAAM,KAAK,mBAAmB,QAAQ,QAAQ,IAAI,QAAQ,IAAI,EAAE;AAChE,QAAM,KAAK,EAAE;AACb,SAAO;AACT;AAIO,SAAS,8BACd,cACA,UACU;AACV,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,oCAAoC;AAC/C,QAAM,KAAK,EAAE;AAEb,QAAM,oBAAoB,SAAS;AAAA,IACjC,CAAC,MAAM,EAAE,aAAa,YAAY,YAAY,EAAE,aAAa;AAAA,EAC/D;AAEA,QAAM,oBAAoB,aAAa,OAAO,CAAC,MAAM,EAAE,UAAU,uBAAuB,EAAE;AAC1F,QAAM,sBAAsB,aAAa,OAAO,CAAC,MAAM,EAAE,UAAU,4BAA4B,EAAE;AACjG,QAAM,aAAa,aAAa,OAAO,CAAC,MAAM,EAAE,UAAU,kBAAkB,EAAE;AAC9E,QAAM,YAAY,aAAa,OAAO,CAAC,MAAM,EAAE,UAAU,oBAAoB,EAAE;AAC/E,QAAM,cAAc,aAAa,OAAO,CAAC,MAAM,EAAE,UAAU,sBAAsB,EAAE;AACnF,QAAM,cAAc,aAAa,OAAO,CAAC,MAAM,EAAE,UAAU,gBAAgB,EAAE;AAC7E,QAAM,mBAAmB,aAAa,OAAO,CAAC,MAAM,EAAE,UAAU,kBAAkB,EAAE;AACpF,QAAM,sBAAsB,aAAa,OAAO,CAAC,MAAM,EAAE,UAAU,sBAAsB,EAAE;AAC3F,QAAM,uBAAuB,aAAa,OAAO,CAAC,MAAM,EAAE,UAAU,uBAAuB;AAC3F,QAAM,yBAAyB,qBAAqB;AAAA,IAClD,CAAC,MAAM,EAAE,QAAS,EAAE,KAAiC,YAAY;AAAA,EACnE,EAAE;AAEF,QAAM,uBAAuB,oBAAoB,sBAAsB;AAEvE,MAAI,uBAAuB,KAAK,kBAAkB,SAAS,GAAG;AAC5D,UAAM,KAAK,mDAAgB;AAC3B,UAAM,KAAK,sBAAsB;AACjC,QAAI,uBAAuB,GAAG;AAC5B,YAAM,KAAK,yDAAiB,iBAAiB,IAAI;AACjD,YAAM,KAAK,6EAAsB,mBAAmB,IAAI;AACxD,YAAM,KAAK,+CAAiB,UAAU,IAAI;AAC1C,UAAI,YAAY,KAAK,cAAc,GAAG;AACpC,cAAM,KAAK,wDAAgB,SAAS,IAAI;AACxC,cAAM,KAAK,sFAA0B,WAAW,IAAI;AAAA,MACtD;AACA,YAAM,KAAK,wDAAgB,WAAW,IAAI;AAC1C,UAAI,mBAAmB,GAAG;AACxB,cAAM,KAAK,kDAAe,gBAAgB,IAAI;AAAA,MAChD;AACA,YAAM,iBAAiB,aAAa,OAAO,CAAC,MAAM,EAAE,UAAU,uBAAuB,EAAE;AACvF,UAAI,iBAAiB,GAAG;AACtB,cAAM,oBAAoB,aAAa;AAAA,UACrC,CAAC,MAAM,EAAE,UAAU,4BAA4B,EAAE,QAAS,EAAE,KAAiC;AAAA,QAC/F,EAAE;AACF,cAAM,KAAK,oCAA0B,cAAc,IAAI;AACvD,cAAM,KAAK,oCAA0B,iBAAiB,IAAI;AAAA,MAC5D;AACA,UAAI,sBAAsB,GAAG;AAC3B,cAAM,KAAK,mCAAyB,mBAAmB,IAAI;AAC3D,cAAM,KAAK,mCAAyB,sBAAsB,IAAI;AAAA,MAChE;AAAA,IACF,OAAO;AACL,YAAM,eAAe,SAAS,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,cAAc,IAAI,CAAC;AAC7E,YAAM,iBAAiB,SAAS,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC;AAC9E,YAAM,KAAK,gFAAoB,kBAAkB,MAAM,IAAI;AAC3D,YAAM,KAAK,oEAAkB,eAAe,MAAM,IAAI;AACtD,YAAM,KAAK,wDAAgB,YAAY,IAAI;AAAA,IAC7C;AACA,UAAM,KAAK,EAAE;AAEb,QAAI,uBAAuB,GAAG;AAC5B,YAAM,oBACJ,oBAAoB,sBAAsB,IACtC,KAAK,MAAO,qBAAqB,oBAAoB,uBAAwB,GAAG,IAChF;AACN,YAAM,KAAK,mDAAgB,iBAAiB,WAAM;AAClD,UAAI,oBAAoB,IAAI;AAC1B,cAAM,KAAK,wKAAqD;AAAA,MAClE,WAAW,oBAAoB,IAAI;AACjC,cAAM,KAAK,8NAA0C;AAAA,MACvD,OAAO;AACL,cAAM,KAAK,0HAAsB;AAAA,MACnC;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AAIO,SAAS,wBAAwB,UAAsC;AAC5E,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,wBAAwB;AACnC,QAAM,KAAK,EAAE;AAEb,QAAM,oBAAoB,oBAAI,IAAoB;AAClD,aAAW,QAAQ,UAAU;AAC3B,UAAM,QAAQ,KAAK,cAAc;AACjC,sBAAkB,IAAI,QAAQ,kBAAkB,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,EACtE;AAEA,MAAI,kBAAkB,OAAO,GAAG;AAC9B,UAAM,KAAK,2EAAoB;AAC/B,UAAM,KAAK,6BAA6B;AACxC,eAAW,CAAC,OAAO,KAAK,KAAK,CAAC,GAAG,kBAAkB,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG;AACzF,YAAM,KAAK,KAAK,KAAK,MAAM,KAAK,IAAI;AAAA,IACtC;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO;AACT;AAIO,SAAS,yBAAyB,UAA0B;AACjE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,kCACd,aACU;AACV,QAAM,QAAkB,CAAC;AAEzB,MAAI,YAAY,WAAW,EAAG,QAAO;AAErC,QAAM,KAAK,mCAAmC;AAC9C,QAAM,KAAK,EAAE;AAEb,QAAM,gBAAgB,oBAAI,IAAoB;AAC9C,aAAW,QAAQ,aAAa;AAC9B,UAAM,MAAM,KAAK,mBAAmB;AACpC,kBAAc,IAAI,MAAM,cAAc,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,EAC1D;AAEA,QAAM,KAAK,8EAAuB;AAClC,QAAM,KAAK,gCAAgC;AAC3C,aAAW,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,cAAc,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG;AACnF,UAAM,OAAO,yBAAyB,GAAG;AACzC,UAAM,KAAK,OAAO,GAAG,QAAQ,KAAK,MAAM,IAAI,IAAI;AAAA,EAClD;AACA,QAAM,KAAK,EAAE;AAEb,SAAO;AACT;AAIO,SAAS,6BACd,SACA,UACoD;AACpD,QAAM,UAA8D,CAAC;AAGrE,QAAM,aAAa,SAAS,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC;AAC1E,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,iBAAiB,WAAW,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AACxE,YAAQ,KAAK,EAAE,MAAM,oDAAY,OAAO,WAAW,QAAQ,SAAS,eAAe,CAAC;AAAA,EACtF;AAGA,QAAM,mBAAmB,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,kBAAkB;AAC7E,MAAI,iBAAiB,SAAS,GAAG;AAC/B,UAAM,qBAAqB,IAAI,IAAI,iBAAiB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,MAAM,MAAS,CAAC;AACrG,UAAM,kBAAkB,SAAS;AAAA,MAC/B,CAAC,MAAM,mBAAmB,IAAI,EAAE,OAAO,KAAK,EAAE,WAAW;AAAA,IAC3D,EAAE;AACF,YAAQ,KAAK,EAAE,MAAM,8CAAW,OAAO,iBAAiB,QAAQ,SAAS,gBAAgB,CAAC;AAAA,EAC5F;AAGA,QAAM,uBAAuB,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,uBAAuB,EAAE;AACxF,MAAI,uBAAuB,GAAG;AAC5B,UAAM,kBAAkB,QAAQ;AAAA,MAC9B,CAAC,MAAM,EAAE,UAAU,4BAA4B,EAAE,QAAS,EAAE,KAAiC;AAAA,IAC/F,EAAE;AACF,YAAQ,KAAK,EAAE,MAAM,mBAAmB,OAAO,sBAAsB,SAAS,gBAAgB,CAAC;AAAA,EACjG;AAGA,QAAM,WAAW,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,sBAAsB,EAAE;AAC3E,MAAI,WAAW,GAAG;AAChB,UAAM,cAAc,QAAQ;AAAA,MAC1B,CAAC,MAAM,EAAE,UAAU,2BAA2B,EAAE,QAAS,EAAE,KAAiC,YAAY;AAAA,IAC1G,EAAE;AACF,YAAQ,KAAK,EAAE,MAAM,kBAAkB,OAAO,UAAU,SAAS,YAAY,CAAC;AAAA,EAChF;AAGA,QAAM,sBAAsB,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,4BAA4B;AAC1F,MAAI,oBAAoB,SAAS,GAAG;AAClC,UAAM,mBAAmB,IAAI,IAAI,oBAAoB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,MAAM,MAAS,CAAC;AACtG,UAAM,eAAe,SAAS;AAAA,MAC5B,CAAC,MAAM,iBAAiB,IAAI,EAAE,OAAO,KAAK,EAAE,WAAW;AAAA,IACzD,EAAE;AACF,YAAQ,KAAK,EAAE,MAAM,uGAAuB,OAAO,oBAAoB,QAAQ,SAAS,aAAa,CAAC;AAAA,EACxG;AAEA,SAAO;AACT;AAEO,SAAS,4BACd,SACA,UACU;AACV,QAAM,QAAkB,CAAC;AAEzB,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,kBAAkB,6BAA6B,SAAS,QAAQ;AACtE,MAAI,gBAAgB,WAAW,EAAG,QAAO;AAEzC,QAAM,KAAK,sCAAsC;AACjD,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,4GAAiC;AAC5C,QAAM,KAAK,8CAA8C;AACzD,aAAW,KAAK,iBAAiB;AAC/B,UAAM,OAAO,EAAE,QAAQ,IAAI,KAAK,MAAO,EAAE,UAAU,EAAE,QAAS,GAAG,IAAI;AACrE,UAAM,KAAK,KAAK,EAAE,IAAI,MAAM,EAAE,KAAK,MAAM,EAAE,OAAO,MAAM,EAAE,QAAQ,EAAE,OAAO,MAAM,IAAI,KAAK;AAAA,EAC5F;AACA,QAAM,KAAK,EAAE;AAEb,SAAO;AACT;AAIO,SAAS,6BAA6B,UAAsC;AACjF,QAAM,QAAkB,CAAC;AAEzB,QAAM,YAAY,CAAC,GAAG,QAAQ,EAC3B,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,EAC9B,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU,EAC1C,MAAM,GAAG,CAAC;AAEb,MAAI,UAAU,SAAS,KAAK,UAAU,CAAC,EAAE,aAAa,KAAM;AAC1D,UAAM,KAAK,6BAA6B;AACxC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,8FAAkC;AAC7C,UAAM,KAAK,4CAA4C;AACvD,eAAW,QAAQ,WAAW;AAC5B,UAAI,KAAK,cAAc,IAAM;AAC7B,YAAM,SAAS,KAAK,WAAW,WAAW,QAAQ;AAClD,YAAM;AAAA,QACJ,MAAM,KAAK,OAAO,OAAO,KAAK,aAAa,KAAM,QAAQ,CAAC,CAAC,OAAO,KAAK,cAAc,CAAC,MAAM,MAAM,MAAM,KAAK,WAAW;AAAA,MAC1H;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO;AACT;AAIO,SAAS,yBACd,SACyC;AACzC,QAAM,SAAkD,CAAC;AAGzD,QAAM,cAAc,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,sBAAsB;AAC5E,QAAM,eAAe,oBAAI,IAAoB;AAC7C,aAAW,KAAK,aAAa;AAC3B,QAAI,EAAE,SAAS,QAAW;AACxB,mBAAa,IAAI,EAAE,OAAO,aAAa,IAAI,EAAE,IAAI,KAAK,KAAK,CAAC;AAAA,IAC9D;AAAA,EACF;AACA,aAAW,CAAC,MAAM,KAAK,KAAK,cAAc;AACxC,QAAI,QAAQ,GAAG;AACb,aAAO,KAAK;AAAA,QACV;AAAA,QACA,aAAa,aAAQ,KAAK;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,mBAAmB,QAAQ;AAAA,IAC/B,CAAC,MAAM,EAAE,UAAU,wBAAwB,EAAE,QAAQ,CAAE,EAAE,KAAiC;AAAA,EAC5F;AACA,MAAI,iBAAiB,SAAS,GAAG;AAC/B,eAAW,KAAK,kBAAkB;AAChC,UAAI,EAAE,SAAS,QAAW;AACxB,eAAO,KAAK;AAAA,UACV,MAAM,EAAE;AAAA,UACR,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,QAAM,oBAAoB,QAAQ;AAAA,IAChC,CAAC,MACC,EAAE,UAAU,0BACZ,EAAE,QACF,OAAQ,EAAE,KAAiC,iBAAiB,YAC3D,EAAE,KAAiC,iBAAiB,QACnD,EAAE,KAAiC,aAAyC,QAAQ;AAAA,EAC1F;AACA,MAAI,kBAAkB,SAAS,GAAG;AAChC,UAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,kBAAkB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,MAAmB,MAAM,MAAS,CAAC,CAAC;AAC3G,eAAW,QAAQ,OAAO;AACxB,aAAO,KAAK;AAAA,QACV;AAAA,QACA,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,8BAA8B,SAAoC;AAChF,QAAM,QAAkB,CAAC;AAEzB,QAAM,kBAAkB,yBAAyB,OAAO;AACxD,MAAI,gBAAgB,WAAW,EAAG,QAAO;AAEzC,QAAM,KAAK,mCAAmC;AAC9C,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,2LAAqC;AAChD,QAAM,KAAK,EAAE;AACb,aAAW,SAAS,gBAAgB,MAAM,GAAG,CAAC,GAAG;AAC/C,UAAM,KAAK,aAAa,MAAM,IAAI,OAAO,MAAM,WAAW,EAAE;AAAA,EAC9D;AACA,QAAM,KAAK,EAAE;AAEb,SAAO;AACT;AAiBA,IAAM,6BAA6B;AAAA,EACjC;AAAA,EAAU;AAAA,EAAY;AAAA,EAAoB;AAAA,EAC1C;AAAA,EAAsB;AAAA,EACtB;AAAA,EAAyB;AAAA,EACzB;AAAA,EAAyB;AAAA,EACzB;AAAA,EAAwB;AAAA,EACxB;AAAA,EAAoB;AAAA,EAAW;AAAA,EAAkB;AACnD;AAEO,SAAS,uBACd,SACA,UAAkC,CAAC,GACzB;AACV,QAAM,QAAkB,CAAC;AAEzB,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,mBAAmB,QAAQ,oBAAoB;AAGrD,MAAI,QAAQ,wBAAwB,QAAQ,kBAAkB,QAAQ,eAAe,OAAO,GAAG;AAC7F,UAAM,oBAAoB,QAAQ;AAAA,MAChC,CAAC,MAAM,EAAE,SAAS,UAAa,QAAQ,eAAgB,IAAI,EAAE,IAAI;AAAA,IACnE;AACA,QAAI,kBAAkB,SAAS,GAAG;AAChC,YAAM,KAAK,mCAAmC;AAC9C,YAAM,KAAK,SAAS;AACpB,iBAAW,SAAS,kBAAkB,MAAM,GAAG,GAAG;AAChD,cAAM,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,MAClC;AACA,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAGA,QAAM,eAAe,QAAQ;AAAA,IAC3B,CAAC,MACC,EAAE,UAAU,WACZ,EAAE,UAAU,gBACZ,EAAE,UAAU,uBACX,EAAE,QACD,OAAO,EAAE,SAAS,YAClB,YAAY,EAAE,QACd,OAAO,EAAE,KAAK,WAAW,YACzB,EAAE,KAAK,WAAW,QAClB,aAAc,EAAE,KAAK,UACpB,EAAE,KAAK,OAAmC,YAAY;AAAA,EAC7D;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,KAAK,6BAA6B;AACxC,UAAM,KAAK,SAAS;AACpB,eAAW,SAAS,aAAa,MAAM,CAAC,SAAS,GAAG;AAClD,YAAM,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,IAClC;AACA,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,QAAM,gBAAgB,QAAQ;AAAA,IAC5B,CAAC,MAAM,EAAE,UAAU,UAAa,iBAAiB,SAAS,EAAE,KAAK;AAAA,EACnE;AACA,QAAM,gBAAgB,cAAc,MAAM,CAAC,SAAS;AAEpD,MAAI,cAAc,SAAS,GAAG;AAC5B,UAAM,KAAK,8BAA8B;AACzC,UAAM,KAAK,SAAS;AACpB,eAAW,SAAS,eAAe;AACjC,YAAM,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,IAClC;AACA,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO;AACT;;;ACtjBA,IAAM,aAAa,oBAAI,IAAI;AAAA,EACzB;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,CAAC;AAGD,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,6BAA6B;AAanC,IAAM,0BACJ;AAkBK,SAAS,eAAe,UAAkB,SAAyC;AACxF,QAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,QAAM,gBAAgB,MAAM;AAI5B,QAAM,cAAc,oBAAI,IAAY;AACpC,QAAM,aAAa;AAInB,QAAM,cAAsD,CAAC;AAE7D,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,UAAU,KAAK,UAAU;AAC/B,UAAM,SAAS,KAAK,SAAS,QAAQ;AAGrC,WAAO,YAAY,SAAS,KAAK,YAAY,YAAY,SAAS,CAAC,EAAE,UAAU,QAAQ;AACrF,kBAAY,IAAI;AAAA,IAClB;AACA,gBAAY,KAAK,EAAE,QAAQ,KAAK,EAAE,CAAC;AAEnC,UAAM,SAAS,WAAW,KAAK,IAAI;AAEnC,QAAI,QAAQ;AAEV,kBAAY,IAAI,CAAC;AACjB;AAAA,IACF;AAGA,UAAM,YAAY,QAAQ,MAAM,QAAQ;AACxC,QAAI,aAAa,WAAW,IAAI,UAAU,CAAC,CAAC,GAAG;AAC7C,UAAI,CAAC,aAAa,IAAI,GAAG;AACvB,oBAAY,IAAI,CAAC;AAAA,MACnB;AAAA,IACF;AAGA,QAAI,CAAC,YAAY,IAAI,CAAC,KAAK,wBAAwB,KAAK,OAAO,GAAG;AAChE,UAAI,CAAC,aAAa,IAAI,GAAG;AACvB,oBAAY,IAAI,CAAC;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,oBAAoB,CAAC,GAAG,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC/D,QAAM,kBAAkB,uBAAuB,OAAO,iBAAiB;AAIvE,QAAM,kBAAkB,SAAS;AACjC,MAAI,mBAAmB,gBAAgB,QAAQ,GAAG;AAChD,UAAM,gBAA0B,CAAC;AACjC,eAAW,OAAO,gBAAgB,aAAa;AAC7C,YAAM,OAAO,MAAM,GAAG;AACtB,UAAI,CAAC,KAAM;AACX,YAAM,WAAW,KAAK,MAAM,gBAAgB;AAC5C,UAAI,UAAU;AACZ,cAAM,MAAM,IAAI,SAAS,CAAC,CAAC;AAC3B,YAAI,gBAAgB,IAAI,GAAG,GAAG;AAC5B,wBAAc,KAAK,GAAG;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,cAAc,UAAU,GAAG;AAC7B,YAAM,YAAY,IAAI,IAAI,aAAa;AACvC,sBAAgB,cAAc,gBAAgB,YAAY;AAAA,QACxD,SAAO,CAAC,UAAU,IAAI,GAAG;AAAA,MAC3B;AAEA,YAAM,iBAAiB,cAAc,CAAC;AACtC,YAAM,YAAY,MAAM,cAAc;AACtC,YAAM,SAAS,YAAY,KAAK,OAAO,UAAU,SAAS,UAAU,UAAU,EAAE,UAAU,CAAC,IAAI;AAC/F,sBAAgB,gBAAgB,KAAK;AAAA,QACnC,gBAAgB,iBAAiB,IAAI,iBAAiB,IAAI;AAAA,QAC1D,cAAc,cAAc;AAAA,QAC5B,aAAa;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAIA,QAAM,gBAAgB,oBAAI,IAAY;AACtC,aAAW,OAAO,gBAAgB,aAAa;AAC7C,UAAM,OAAO,MAAM,GAAG;AACtB,QAAI,CAAC,KAAM;AACX,UAAM,SAAS,KAAK,SAAS,KAAK,UAAU,EAAE;AAE9C,QAAI,SAAS,GAAG;AAEd,eAAS,IAAI,MAAM,GAAG,KAAK,GAAG,KAAK;AACjC,cAAM,aAAa,MAAM,CAAC;AAC1B,YAAI,CAAC,WAAY;AACjB,cAAM,eAAe,WAAW,SAAS,WAAW,UAAU,EAAE;AAChE,YAAI,eAAe,UAAU,WAAW,UAAU,EAAE,SAAS,GAAG;AAC9D,wBAAc,IAAI,CAAC;AACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,QAAM,eAAe,IAAI,IAAY,gBAAgB,WAAW;AAChE,aAAW,OAAO,eAAe;AAC/B,iBAAa,IAAI,GAAG;AAAA,EACtB;AAGA,QAAM,gBAA0B,CAAC;AACjC,QAAM,cAAc,CAAC,GAAG,YAAY,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAE1D,aAAW,OAAO,aAAa;AAC7B,UAAM,OAAO,MAAM,GAAG;AACtB,QAAI,KAAK,SAAS,KAAK;AAErB,YAAM,WAAW,KAAK,MAAM,oBAAoB;AAChD,UAAI,UAAU;AACZ,cAAM,YAAY,SAAS,CAAC;AAC5B,cAAM,aAAa,MAAM,UAAU,SAAS;AAC5C,sBAAc;AAAA,UACZ,aAAa,IACT,KAAK,MAAM,GAAG,UAAU,IAAI,QAAQ,YACpC,KAAK,MAAM,GAAG,GAAG,IAAI;AAAA,QAC3B;AAAA,MACF,OAAO;AACL,sBAAc,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK;AAAA,MAC/C;AAAA,IACF,OAAO;AACL,oBAAc,KAAK,IAAI;AAAA,IACzB;AAAA,EACF;AAGA,aAAW,UAAU,gBAAgB,iBAAiB;AAEpD,UAAM,iBAAiB,cAAc,UAAU,CAAC,GAAG,MAAM;AACvD,YAAM,cAAc,YAAY,CAAC;AACjC,aAAO,gBAAgB,UAAa,eAAe,OAAO;AAAA,IAC5D,CAAC;AACD,QAAI,kBAAkB,GAAG;AACvB,YAAM,SAAS,KAAK,OAAO,OAAO,WAAW;AAC7C,oBAAc,OAAO,iBAAiB,GAAG,GAAG,GAAG,MAAM,QAAQ,OAAO,YAAY,qBAAM;AAAA,IACxF;AAAA,EACF;AAGA,MAAI,cAAc,SAAS,KAAK;AAC9B,UAAM,iBAAiB,cAAc;AACrC,kBAAc,SAAS;AACvB,kBAAc,KAAK,QAAQ,iBAAiB,GAAG,qBAAM;AAAA,EACvD;AAEA,QAAM,gBAAgB,cAAc;AACpC,QAAM,kBAAkB,KAAK,KAAK,cAAc,KAAK,IAAI,EAAE,SAAS,CAAC;AAErE,QAAM,OAAO,0CAAY,aAAa,iBAAO,aAAa,yBAAU,eAAe;AAEnF,SAAO,GAAG,IAAI;AAAA,EAAK,cAAc,KAAK,IAAI,CAAC;AAC7C;AAGA,SAAS,aAAa,MAAuB;AAC3C,SAAO,gBAAgB,KAAK,CAACC,OAAMA,GAAE,KAAK,IAAI,CAAC,KAAK,2BAA2B,KAAK,KAAK,UAAU,CAAC;AACtG;AAiBA,SAAS,uBACP,OACA,eACgB;AAChB,QAAM,cAAwB,CAAC;AAC/B,QAAM,kBAAoC,CAAC;AAC3C,QAAM,aAAa;AAGnB,QAAM,YAAY,oBAAI,IAA2B;AACjD,WAAS,cAAc,KAA4B;AACjD,QAAI,OAAO,UAAU,IAAI,GAAG;AAC5B,QAAI,SAAS,QAAW;AACtB,aAAO,YAAY,MAAM,GAAG,CAAC;AAC7B,gBAAU,IAAI,KAAK,IAAI;AAAA,IACzB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,IAAI;AACR,SAAO,IAAI,cAAc,QAAQ;AAC/B,UAAM,WAAW,cAAc,CAAC;AAChC,UAAM,YAAY,MAAM,QAAQ;AAChC,QAAI,CAAC,WAAW;AACd,kBAAY,KAAK,QAAQ;AACzB;AACA;AAAA,IACF;AAGA,QAAI,CAAC,WAAW,KAAK,SAAS,GAAG;AAC/B,kBAAY,KAAK,QAAQ;AACzB;AACA;AAAA,IACF;AAEA,UAAM,SAAS,UAAU,SAAS,UAAU,UAAU,EAAE;AACxD,UAAM,OAAO,cAAc,QAAQ;AAEnC,QAAI,CAAC,MAAM;AACT,kBAAY,KAAK,QAAQ;AACzB;AACA;AAAA,IACF;AAGA,QAAI,YAAY;AAChB,QAAI,IAAI,IAAI;AACZ,WAAO,IAAI,cAAc,QAAQ;AAC/B,YAAM,UAAU,cAAc,CAAC;AAC/B,YAAM,WAAW,MAAM,OAAO;AAC9B,UAAI,CAAC,YAAY,CAAC,WAAW,KAAK,QAAQ,EAAG;AAE7C,YAAM,aAAa,SAAS,SAAS,SAAS,UAAU,EAAE;AAC1D,YAAM,WAAW,cAAc,OAAO;AAEtC,UAAI,eAAe,UAAU,aAAa,KAAM;AAEhD;AACA;AAAA,IACF;AAEA,QAAI,aAAa,KAAK,CAAC,kBAAkB,IAAI,IAAI,GAAG;AAElD,eAAS,IAAI,GAAG,IAAI,IAAI,GAAG,KAAK;AAC9B,oBAAY,KAAK,cAAc,CAAC,CAAC;AAAA,MACnC;AACA,sBAAgB,KAAK;AAAA,QACnB,gBAAgB,cAAc,IAAI,CAAC;AAAA,QACnC,cAAc,YAAY;AAAA,QAC1B,aAAa,KAAK,MAAM,SAAS,CAAC;AAAA,MACpC,CAAC;AACD,UAAI;AAAA,IACN,OAAO;AAEL,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,oBAAY,KAAK,cAAc,CAAC,CAAC;AAAA,MACnC;AACA,UAAI;AAAA,IACN;AAAA,EACF;AAEA,SAAO,EAAE,aAAa,gBAAgB;AACxC;AAGA,SAAS,YAAY,MAA6B;AAChD,QAAM,UAAU,KAAK,UAAU;AAE/B,QAAM,UAAU,QAAQ,QAAQ,SAAS,EAAE;AAG3C,QAAM,gBAAgB,QAAQ,MAAM,sCAAsC;AAC1E,MAAI,cAAe,QAAO,cAAc,CAAC;AAGzC,QAAM,WAAW,QAAQ,MAAM,sBAAsB;AACrD,MAAI,SAAU,QAAO,SAAS,CAAC;AAG/B,QAAM,YAAY,QAAQ,MAAM,QAAQ;AACxC,SAAO,YAAY,UAAU,CAAC,IAAI;AACpC;","names":["writeFile","writeFile","readFile","readFile","mkdir","readFile","join","join","readFile","page","mkdir","item","COMMAND_SCHEMA","getAgentInstructions","getInitialUserMessage","getReviewSystemPrompt","createReviewUserPrompt","buildSelectorMessages","pruneSelectorHints","buildFallbackMessages","pruneSelectorHints","buildVisionMessages","pruneSelectorHints","getSuggestionSystemPrompt","buildSuggestionUserPrompt","getAgentInstructions","getInitialUserMessage","getReviewSystemPrompt","createReviewUserPrompt","buildSelectorMessages","buildFallbackMessages","buildVisionMessages","getSuggestionSystemPrompt","buildSuggestionUserPrompt","readFile","readFile","p"]}