@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.
- package/dist/ai-model-NZ7QJNJW.js +32 -0
- package/dist/ai-model-NZ7QJNJW.js.map +1 -0
- package/dist/chunk-KDEQ2AAE.js +93 -0
- package/dist/chunk-KDEQ2AAE.js.map +1 -0
- package/dist/chunk-U6GPCKY3.js +3186 -0
- package/dist/chunk-U6GPCKY3.js.map +1 -0
- package/dist/chunk-VNQYQSMI.js +922 -0
- package/dist/chunk-VNQYQSMI.js.map +1 -0
- package/dist/chunk-XAEHXRUC.js +607 -0
- package/dist/chunk-XAEHXRUC.js.map +1 -0
- package/dist/cli.js +55 -0
- package/dist/cli.js.map +1 -0
- package/dist/compose-EHDWVF7N.js +543 -0
- package/dist/compose-EHDWVF7N.js.map +1 -0
- package/dist/fix-instruction-JLCLTXAN.js +406 -0
- package/dist/fix-instruction-JLCLTXAN.js.map +1 -0
- package/dist/instruction-executor-M5Q6HYSM.js +5202 -0
- package/dist/instruction-executor-M5Q6HYSM.js.map +1 -0
- package/dist/instruction-generator-5RPRYTVR.js +2470 -0
- package/dist/instruction-generator-5RPRYTVR.js.map +1 -0
- package/package.json +29 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/instruction-executor/config.ts","../../../src/plan/errors.ts","../../../src/plan/keygen.ts","../../../src/plan/index.ts","../../../src/instruction-executor/yaml-loader.ts","../../../src/instruction-executor/executor.ts","../../../src/harness/selector-resolver.ts","../../../src/harness/failure-registry.ts","../../../src/harness/selector-cache.ts","../../../src/harness/goal-agent.ts","../../../src/harness/vision-resolver.ts","../../../src/harness/action-validator.ts","../../../src/harness/deterministic-resolver.ts","../../../src/harness/confirmation.ts","../../../src/instruction-executor/confirmation.ts","../../../src/context/capture-handler.ts","../../../src/context/expression-evaluator.ts","../../../src/context/snapshot-cache.ts","../../../src/context/context-chunker.ts","../../../src/instruction-executor/reporter.ts","../../../src/instruction-executor/input-collector.ts","../../../src/context/template-resolver.ts","../../../src/instruction-executor/execution-planner.ts","../../../src/context/runtime-store.ts","../../../src/instruction-executor/batch-runner.ts","../../../src/messaging/chat-bot.ts","../../../src/messaging/config.ts","../../../src/messaging/cards.ts","../../../src/approval/chat-provider.ts","../../../src/approval/index.ts","../../../src/notification/chat-notifier.ts","../../../src/notification/index.ts","../../../src/notification/report-forwarder.ts","../../../src/instruction-executor/maintenance-analyzer.ts","../../../src/instruction-executor/maintenance-reporter.ts","../../../src/instruction-executor/types.ts","../../../src/cli/cli-logger.ts","../../../src/instruction-executor/report-generator.ts","../../../src/instruction-executor/index.ts"],"sourcesContent":["/**\n * instruction-executor CLI引数パース\n */\n\nimport { parseArgs as nodeParseArgs } from \"node:util\";\nimport { cancel } from \"../cli/prompts\";\nimport { t, initLocale } from \"../i18n\";\nimport { getRawArgs, readContextFile, validateNotifyMode, parseModelConfig } from \"../cli/config-helpers\";\nimport { loadSecrets } from \"../cli/secrets-loader\";\nimport type { ExecutorConfig } from \"./types\";\n\nexport async function parseArgs(): Promise<ExecutorConfig> {\n const args = getRawArgs();\n\n const { values } = nodeParseArgs({\n args,\n options: {\n instruction: { type: \"string\" },\n context: { type: \"string\" },\n headless: { type: \"string\" },\n \"step-delay\": { type: \"string\" },\n screenshots: { type: \"string\" },\n \"skip-confirmation\": { type: \"boolean\" },\n data: { type: \"string\" },\n secrets: { type: \"string\" },\n \"reuse-session\": { type: \"boolean\" },\n \"no-reuse-session\": { type: \"boolean\" },\n \"debug-log\": { type: \"string\" },\n debug: { type: \"boolean\" },\n \"approval-mode\": { type: \"string\" },\n notify: { type: \"string\" },\n \"enable-selector-cache\": { type: \"boolean\" },\n \"enable-agent-fallback\": { type: \"boolean\" },\n \"enable-vision-fallback\": { type: \"boolean\" },\n \"output-dir\": { type: \"string\" },\n \"merge-downloads\": { type: \"boolean\" },\n maintenance: { type: \"boolean\" },\n \"max-retries\": { type: \"string\" },\n \"retry-warning-threshold\": { type: \"string\" },\n report: { type: \"boolean\" },\n model: { type: \"string\" },\n \"model-provider\": { type: \"string\" },\n \"model-base-url\": { type: \"string\" },\n \"model-selector\": { type: \"string\" },\n \"model-extraction\": { type: \"string\" },\n \"model-review\": { type: \"string\" },\n \"model-fallback\": { type: \"string\" },\n \"model-vision\": { type: \"string\" },\n \"api-key\": { type: \"string\" },\n \"callback-port\": { type: \"string\" },\n \"approval-timeout\": { type: \"string\" },\n video: { type: \"string\" },\n locale: { type: \"string\" },\n stealth: { type: \"boolean\" },\n proxy: { type: \"string\" },\n },\n strict: true,\n });\n\n initLocale(values.locale);\n\n if (!values.instruction) {\n cancel(t(\"cli.instructionRequired\"));\n process.exit(1);\n }\n\n const contextMarkdown = await readContextFile(values.context);\n const secrets = await loadSecrets(values.secrets);\n const aiModelConfig = parseModelConfig(values);\n\n // reuseSession: --no-reuse-session で false、デフォルト true\n const reuseSession = values[\"no-reuse-session\"] ? false : (values[\"reuse-session\"] ?? true);\n\n // approvalMode のバリデーション\n const rawApprovalMode = values[\"approval-mode\"];\n const validApprovalModes = [\"cli\", \"slack\", \"teams\", \"discord\"] as const;\n type ValidApprovalMode = (typeof validApprovalModes)[number];\n let approvalMode: ValidApprovalMode | undefined;\n if (rawApprovalMode) {\n if (!(validApprovalModes as readonly string[]).includes(rawApprovalMode)) {\n cancel(t(\"cli.invalidApprovalMode\"));\n process.exit(1);\n }\n approvalMode = rawApprovalMode as ValidApprovalMode;\n }\n\n const notifyMode = validateNotifyMode(values.notify);\n\n // 承認と通知のプラットフォーム一致チェック\n if (approvalMode && approvalMode !== \"cli\" && notifyMode && approvalMode !== notifyMode) {\n cancel(\"--approval-mode and --notify must use the same platform\");\n process.exit(1);\n }\n\n const maintenance = values.maintenance ?? false;\n\n return {\n instructionPath: values.instruction,\n headless: values.headless !== \"false\",\n stepDelay: values[\"step-delay\"]\n ? Number.parseInt(values[\"step-delay\"], 10)\n : undefined,\n screenshotDir: values.screenshots,\n contextMarkdown,\n skipConfirmation: values[\"skip-confirmation\"] ?? maintenance,\n dataFilePath: values.data,\n secrets,\n reuseSession,\n debugLogPath: values[\"debug-log\"],\n debugConsole: values.debug ?? false,\n approvalMode,\n notifyMode,\n callbackPort: values[\"callback-port\"]\n ? Number.parseInt(values[\"callback-port\"], 10)\n : undefined,\n approvalTimeoutMs: values[\"approval-timeout\"]\n ? Number.parseInt(values[\"approval-timeout\"], 10)\n : undefined,\n enableSelectorCache: values[\"enable-selector-cache\"] ?? (maintenance ? true : undefined),\n enableAgentFallback: values[\"enable-agent-fallback\"] ?? (maintenance ? true : undefined),\n enableVisionFallback: values[\"enable-vision-fallback\"] ?? (maintenance ? true : undefined),\n outputDir: values[\"output-dir\"],\n mergeDownloads: values[\"merge-downloads\"] ?? false,\n maintenance,\n maxRetries: values[\"max-retries\"]\n ? Number.parseInt(values[\"max-retries\"], 10)\n : maintenance ? 5 : undefined,\n retryWarningThreshold: values[\"retry-warning-threshold\"]\n ? Number.parseInt(values[\"retry-warning-threshold\"], 10)\n : maintenance ? 3 : undefined,\n forceReport: values.report ?? false,\n videoDir: values.video,\n aiModelConfig,\n apiKey: values[\"api-key\"],\n stealth: values.stealth ?? false,\n proxy: values.proxy,\n };\n}\n","/**\n * plan/errors --- プラン制限・機能ゲートのエラー型\n */\n\n/** 制限超過の種別 */\nexport type LimitType = \"hard\" | \"quota_exceeded\" | \"timeout\";\n\n/** ステップ数・バッチ行数などの数値制限超過 */\nexport class PlanLimitError extends Error {\n /** 制限種別(デフォルト: \"hard\") */\n readonly limitType: LimitType;\n\n constructor(message: string, limitType: LimitType = \"hard\") {\n super(message);\n this.name = \"PlanLimitError\";\n this.limitType = limitType;\n }\n}\n\n/** 月間クォータ超過(PlanLimitError のサブクラス) */\nexport class QuotaExceededError extends PlanLimitError {\n /** 現在の使用量 */\n readonly currentUsage: number;\n /** 制限値 */\n readonly limit: number;\n /** 超過したメトリクス名(例: \"monthlyJobs\", \"monthlySteps\") */\n readonly metric: string;\n\n constructor(message: string, currentUsage: number, limit: number, metric: string) {\n super(message, \"quota_exceeded\");\n this.name = \"QuotaExceededError\";\n this.currentUsage = currentUsage;\n this.limit = limit;\n this.metric = metric;\n }\n}\n\n/** ゲート対象機能の利用試行 */\nexport class PlanFeatureError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PlanFeatureError\";\n }\n}\n","/**\n * plan/keygen --- API キー生成・パース・バリデーション\n *\n * API キー形式: agb-{JWT}\n * JWT claims に tenantId と tier を埋め込む。署名は HS256(node:crypto)。\n */\n\nimport { createHmac } from \"node:crypto\";\nimport type { PlanTier } from \"./index\";\n\n// ── 定数 ──\n\n/** API キーの固定プレフィックス */\nconst KEY_PREFIX = \"agb\";\n\n/** JWT ヘッダ(HS256 固定) */\nconst JWT_HEADER = { alg: \"HS256\", typ: \"JWT\" } as const;\n\n/** JWT 発行者 */\nconst JWT_ISSUER = \"agentic-browser\";\n\n/** デフォルトの署名シークレット(本番環境では AGENTIC_BROWSER_JWT_SECRET を設定すること) */\nconst DEFAULT_JWT_SECRET = \"agentic-browser-dev-secret-do-not-use-in-production\";\n\n/** 有効な生成対象ティア */\nconst VALID_TIERS: ReadonlySet<string> = new Set([\"pro\", \"team\", \"enterprise\"]);\n\n// ── JWT ヘルパー(node:crypto のみ、同期) ──\n\n/** JWT claims の型定義 */\nexport interface JwtPayload {\n /** tenantId(必須) */\n tid: string;\n /** ティア(必須) */\n tier: Exclude<PlanTier, \"community\">;\n /** 発行時刻(Unix seconds) */\n iat: number;\n /** 発行者 */\n iss: string;\n /** 管理用メモ */\n memo?: string;\n}\n\nfunction base64UrlEncode(buf: Buffer): string {\n return buf.toString(\"base64url\");\n}\n\nfunction base64UrlDecode(str: string): Buffer {\n return Buffer.from(str, \"base64url\");\n}\n\n/** JWT 署名シークレットを取得する */\nexport function getJwtSecret(): string {\n return process.env.AGENTIC_BROWSER_JWT_SECRET ?? DEFAULT_JWT_SECRET;\n}\n\n/** JWT トークンを生成する(HS256 署名) */\nfunction signJwt(payload: JwtPayload, secret: string): string {\n const header = base64UrlEncode(Buffer.from(JSON.stringify(JWT_HEADER)));\n const body = base64UrlEncode(Buffer.from(JSON.stringify(payload)));\n const sigInput = `${header}.${body}`;\n const signature = createHmac(\"sha256\", secret).update(sigInput).digest();\n return `${sigInput}.${base64UrlEncode(signature)}`;\n}\n\n/** JWT トークンを検証・デコードする。無効な場合は undefined */\nfunction verifyAndDecodeJwt(token: string, secret: string): JwtPayload | undefined {\n const parts = token.split(\".\");\n if (parts.length !== 3) return undefined;\n\n const [header, body, sig] = parts;\n\n // 署名検証(base64url 文字列で比較し、パディングビット改変を検出)\n const expectedSig = base64UrlEncode(\n createHmac(\"sha256\", secret).update(`${header}.${body}`).digest(),\n );\n if (expectedSig !== sig) return undefined;\n\n // ペイロードデコード\n try {\n const payload = JSON.parse(base64UrlDecode(body).toString(\"utf-8\")) as Record<string, unknown>;\n if (typeof payload.tid !== \"string\" || !payload.tid) return undefined;\n if (typeof payload.tier !== \"string\" || !VALID_TIERS.has(payload.tier)) return undefined;\n return payload as unknown as JwtPayload;\n } catch {\n return undefined;\n }\n}\n\n// ── 型定義 ──\n\nexport interface GenerateKeyOptions {\n /** テナント ID(必須) */\n tenantId: string;\n /** メモ(管理用。JWT claims に埋め込まれる) */\n memo?: string;\n}\n\nexport interface GeneratedKey {\n /** 生成された API キー文字列(agb-{jwt} 形式) */\n key: string;\n /** ティア */\n tier: PlanTier;\n /** テナント ID */\n tenantId: string;\n /** 生成日時(ISO 8601) */\n createdAt: string;\n /** 管理用メモ */\n memo?: string;\n}\n\nexport interface ParsedApiKey {\n /** 解決されたティア(JWT claims から) */\n tier: PlanTier;\n /** テナント ID(JWT claims から) */\n tenantId: string;\n /** 発行日時 */\n issuedAt?: Date;\n /** 管理用メモ */\n memo?: string;\n}\n\n// ── 生成 ──\n\n/**\n * 指定ティアの API キーを生成する。\n *\n * @param tier - 対象ティア(community は不可)\n * @param options - 生成オプション(tenantId 必須)\n * @returns 生成結果\n */\nexport function generateApiKey(\n tier: Exclude<PlanTier, \"community\">,\n options: GenerateKeyOptions,\n): GeneratedKey {\n if (!options.tenantId) {\n throw new Error(\"tenantId is required\");\n }\n\n const secret = getJwtSecret();\n const now = new Date();\n\n const payload: JwtPayload = {\n tid: options.tenantId,\n tier,\n iat: Math.floor(now.getTime() / 1000),\n iss: JWT_ISSUER,\n ...(options.memo ? { memo: options.memo } : {}),\n };\n\n const jwt = signJwt(payload, secret);\n const key = `${KEY_PREFIX}-${jwt}`;\n\n return {\n key,\n tier,\n tenantId: options.tenantId,\n createdAt: now.toISOString(),\n memo: options.memo,\n };\n}\n\n/**\n * 複数の API キーを一括生成する。\n */\nexport function generateApiKeys(\n tier: Exclude<PlanTier, \"community\">,\n count: number,\n options: GenerateKeyOptions,\n): GeneratedKey[] {\n if (count < 1 || count > 100) {\n throw new Error(\"count must be between 1 and 100\");\n }\n return Array.from({ length: count }, () => generateApiKey(tier, options));\n}\n\n// ── パース ──\n\n/**\n * API キー文字列をパースして構成要素を返す。\n * agb-{jwt} 形式のキーを検証・デコードし、tenantId と tier を返す。\n *\n * @returns パース結果。フォーマット不正または署名無効の場合は undefined\n */\nexport function parseApiKey(key: string): ParsedApiKey | undefined {\n if (!key.startsWith(`${KEY_PREFIX}-`)) return undefined;\n\n const jwtToken = key.slice(KEY_PREFIX.length + 1);\n const secret = getJwtSecret();\n const payload = verifyAndDecodeJwt(jwtToken, secret);\n if (!payload) return undefined;\n\n return {\n tier: payload.tier,\n tenantId: payload.tid,\n issuedAt: payload.iat ? new Date(payload.iat * 1000) : undefined,\n memo: payload.memo,\n };\n}\n\n// ── バリデーション ──\n\n/**\n * API キーのフォーマットが正しいか検証する。\n * agb- プレフィックス + JWT 構造 + 署名検証を行う。\n */\nexport function validateApiKeyFormat(key: string): {\n valid: boolean;\n error?: string;\n} {\n if (!key) {\n return { valid: false, error: \"API key is empty\" };\n }\n\n if (!key.startsWith(`${KEY_PREFIX}-`)) {\n return { valid: false, error: `API key must start with \"${KEY_PREFIX}-\"` };\n }\n\n const jwtToken = key.slice(KEY_PREFIX.length + 1);\n const parts = jwtToken.split(\".\");\n if (parts.length !== 3) {\n return { valid: false, error: \"API key must contain a valid JWT token (3 dot-separated segments)\" };\n }\n\n const secret = getJwtSecret();\n const payload = verifyAndDecodeJwt(jwtToken, secret);\n if (!payload) {\n return { valid: false, error: \"API key signature verification failed or claims are invalid\" };\n }\n\n return { valid: true };\n}\n\n/**\n * 有効なティア名の一覧を返す(community 除く)。\n */\nexport function getGeneratableTiers(): Array<Exclude<PlanTier, \"community\">> {\n return [\"pro\", \"team\", \"enterprise\"];\n}\n","/**\n * plan/index --- プランティア定義・解決・機能ゲート\n *\n * Community(無料)/ Pro / Team / Enterprise の 4 ティア。\n * API キーで判定し、実行開始前に config を clamp する。\n */\n\nimport type { ExecutorConfig } from \"../instruction-executor/types\";\nimport { PlanLimitError, PlanFeatureError, QuotaExceededError, type LimitType } from \"./errors\";\nimport { parseApiKey } from \"./keygen\";\n\n// ── ティア型定義 ──\n\nexport type PlanTier = \"community\" | \"pro\" | \"team\" | \"enterprise\";\n\nexport interface PlanLimits {\n /** 1 instruction あたりの最大ステップ数 */\n maxStepsPerInstruction: number;\n /** バッチ実行時の最大行数 */\n maxBatchRows: number;\n /** テナント同時実行ジョブ数(Phase 3 で enforcement。Community/Pro は Infinity) */\n maxConcurrentJobs: number;\n /** 月間ジョブ数上限(Phase 3 で enforcement。Community/Pro は Infinity) */\n maxMonthlyJobs: number;\n /** 月間ステップ数上限(Phase 3 で enforcement。Community/Pro は Infinity) */\n maxMonthlySteps: number;\n /** 1 ジョブの最大実行時間 (ms)。CLI / SDK で即時 enforce */\n maxJobDurationMs: number;\n /** 1 ステップの最大実行時間 (ms)(Phase 3 で enforcement。Community/Pro は Infinity) */\n maxStepDurationMs: number;\n}\n\nexport interface PlanFeatures {\n /** セレクタキャッシュ */\n selectorCache: boolean;\n /** Agent Fallback */\n agentFallback: boolean;\n /** Vision Fallback */\n visionFallback: boolean;\n /** メンテナンスモード */\n maintenanceMode: boolean;\n /** HITL(Human-in-the-Loop: Chat 承認 + 通知 — Slack / Teams / Discord) */\n hitl: boolean;\n /** 用途別モデルオーバーライド */\n modelOverrides: boolean;\n /** リモート実行 (HTTP API) */\n remoteExecution: boolean;\n /** ステルスモード(bot検出回避 + proxy) */\n stealthMode: boolean;\n}\n\nexport interface Plan {\n tier: PlanTier;\n limits: PlanLimits;\n features: PlanFeatures;\n /** テナント ID。API キーの JWT claims から自動解決。Community(キーなし)は undefined */\n tenantId?: string;\n}\n\n// ── ティア定数 ──\n\nexport const COMMUNITY_PLAN: Plan = {\n tier: \"community\",\n limits: {\n maxStepsPerInstruction: 100,\n maxBatchRows: 20,\n maxConcurrentJobs: Number.POSITIVE_INFINITY,\n maxMonthlyJobs: Number.POSITIVE_INFINITY,\n maxMonthlySteps: Number.POSITIVE_INFINITY,\n maxJobDurationMs: 10 * 60 * 1000, // 10 minutes\n maxStepDurationMs: Number.POSITIVE_INFINITY,\n },\n features: {\n selectorCache: false,\n agentFallback: true,\n visionFallback: false,\n maintenanceMode: false,\n hitl: false,\n modelOverrides: false,\n remoteExecution: false,\n stealthMode: false,\n },\n};\n\nexport const PRO_PLAN: Plan = {\n tier: \"pro\",\n limits: {\n maxStepsPerInstruction: 500,\n maxBatchRows: 100,\n maxConcurrentJobs: Number.POSITIVE_INFINITY,\n maxMonthlyJobs: Number.POSITIVE_INFINITY,\n maxMonthlySteps: Number.POSITIVE_INFINITY,\n maxJobDurationMs: 30 * 60 * 1000, // 30 minutes\n maxStepDurationMs: Number.POSITIVE_INFINITY,\n },\n features: {\n selectorCache: true,\n agentFallback: true,\n visionFallback: true,\n maintenanceMode: false,\n hitl: false,\n modelOverrides: false,\n remoteExecution: false,\n stealthMode: true,\n },\n};\n\nexport const TEAM_PLAN: Plan = {\n tier: \"team\",\n limits: {\n maxStepsPerInstruction: Number.POSITIVE_INFINITY,\n maxBatchRows: 500,\n maxConcurrentJobs: 10,\n maxMonthlyJobs: 2_000,\n maxMonthlySteps: 200_000,\n maxJobDurationMs: 2 * 60 * 60 * 1000, // 2 hours\n maxStepDurationMs: 5 * 60 * 1000, // 5 minutes\n },\n features: {\n selectorCache: true,\n agentFallback: true,\n visionFallback: true,\n maintenanceMode: true,\n hitl: true,\n modelOverrides: true,\n remoteExecution: true,\n stealthMode: true,\n },\n};\n\nexport const ENTERPRISE_PLAN: Plan = {\n tier: \"enterprise\",\n limits: {\n maxStepsPerInstruction: Number.POSITIVE_INFINITY,\n maxBatchRows: Number.POSITIVE_INFINITY,\n maxConcurrentJobs: Number.POSITIVE_INFINITY,\n maxMonthlyJobs: Number.POSITIVE_INFINITY,\n maxMonthlySteps: Number.POSITIVE_INFINITY,\n maxJobDurationMs: 24 * 60 * 60 * 1000, // 24 hours\n maxStepDurationMs: 10 * 60 * 1000, // 10 minutes\n },\n features: {\n selectorCache: true,\n agentFallback: true,\n visionFallback: true,\n maintenanceMode: true,\n hitl: true,\n modelOverrides: true,\n remoteExecution: true,\n stealthMode: true,\n },\n};\n\n// ── API キー解決 ──\n\n/** ティア → プラン定数のルックアップ */\nconst TIER_TO_PLAN: Record<PlanTier, Plan> = {\n community: COMMUNITY_PLAN,\n pro: PRO_PLAN,\n team: TEAM_PLAN,\n enterprise: ENTERPRISE_PLAN,\n};\n\n/**\n * API キーからプランを解決する。\n * キーなし → Community、有効な JWT キー → Pro/Team/Enterprise(tenantId 付き)。\n *\n * API キー形式: agb-{JWT}\n * JWT claims から tier と tenantId を取得する。\n */\nexport function resolvePlan(apiKey?: string): Plan {\n if (!apiKey) return COMMUNITY_PLAN;\n\n const parsed = parseApiKey(apiKey);\n if (!parsed) return COMMUNITY_PLAN;\n\n const basePlan = TIER_TO_PLAN[parsed.tier] ?? COMMUNITY_PLAN;\n return { ...basePlan, tenantId: parsed.tenantId };\n}\n\n/**\n * API キーを CLI 引数 or 環境変数から取得する。\n */\nexport function getApiKey(cliValue?: string): string | undefined {\n return cliValue ?? process.env.AGENTIC_BROWSER_API_KEY;\n}\n\n// ── 機能ゲート ──\n\n/**\n * ExecutorConfig を Plan に基づいて clamp する。\n *\n * - 許可されていない機能フラグ → false に強制\n * - 明示的に要求されたゲート対象機能(--maintenance 等) → PlanFeatureError\n * - 暗黙的なフラグ(--enable-selector-cache 等) → 静かに無効化\n */\nexport function enforceFeatureGates(config: ExecutorConfig, plan: Plan): void {\n // 自己修復機能: 静かに無効化\n if (!plan.features.selectorCache) config.enableSelectorCache = false;\n if (!plan.features.agentFallback) config.enableAgentFallback = false;\n if (!plan.features.visionFallback) config.enableVisionFallback = false;\n\n // メンテナンスモード: 明示的に要求された場合はエラー\n if (!plan.features.maintenanceMode && config.maintenance) {\n throw new PlanFeatureError(\n \"Maintenance mode requires a Team plan. Upgrade: https://basemachina.com/pricing\",\n );\n }\n\n // HITL(承認 + 通知): CLI 以外の全プラットフォームを Team+ に制限\n if (!plan.features.hitl) {\n if (config.approvalMode && config.approvalMode !== \"cli\") {\n throw new PlanFeatureError(\n `${config.approvalMode} approval requires a Team plan. Upgrade: https://basemachina.com/pricing`,\n );\n }\n if (config.notifyMode) {\n throw new PlanFeatureError(\n `${config.notifyMode} notification requires a Team plan. Upgrade: https://basemachina.com/pricing`,\n );\n }\n }\n\n // モデルオーバーライド: 静かに無効化\n // NOTE (A-6): ユーザー指定の modelOverrides のみ無効化される。\n // DEFAULT_PURPOSE_MODELS(selector/extraction → Haiku)は getModel() 内で\n // currentOverrides[purpose] ?? DEFAULT_PURPOSE_MODELS[purpose] として\n // 常に適用されるため、全ティアでコスト最適化ルーティングが有効。\n if (!plan.features.modelOverrides && config.aiModelConfig?.modelOverrides) {\n config.aiModelConfig.modelOverrides = undefined;\n }\n\n // ステルスモード / プロキシ: Pro 未満では PlanFeatureError\n if (!plan.features.stealthMode) {\n if (config.stealth) {\n throw new PlanFeatureError(\n \"Stealth mode requires a Pro plan. Upgrade: https://basemachina.com/pricing\",\n );\n }\n if (config.proxy) {\n throw new PlanFeatureError(\n \"Proxy support requires a Pro plan. Upgrade: https://basemachina.com/pricing\",\n );\n }\n }\n}\n\n/**\n * instruction のステップ数がプランの制限内か検証する。\n */\nexport function validateStepLimit(stepCount: number, plan: Plan): void {\n if (stepCount > plan.limits.maxStepsPerInstruction) {\n throw new PlanLimitError(\n `This instruction has ${stepCount} steps, but your plan allows up to ${plan.limits.maxStepsPerInstruction}. ` +\n \"Upgrade: https://basemachina.com/pricing\",\n );\n }\n}\n\n/**\n * バッチの行数がプランの制限内か検証する。\n */\nexport function validateBatchLimit(rowCount: number, plan: Plan): void {\n if (rowCount > plan.limits.maxBatchRows) {\n throw new PlanLimitError(\n `Batch has ${rowCount} rows, but your plan allows up to ${plan.limits.maxBatchRows}. ` +\n \"Upgrade: https://basemachina.com/pricing\",\n );\n }\n}\n\n// ── 表示用ヘルパー ──\n\n/** プランの表示用ラベルを返す */\nexport function formatPlanLabel(plan: Plan): string {\n const stepsLabel =\n plan.limits.maxStepsPerInstruction === Number.POSITIVE_INFINITY\n ? \"unlimited\"\n : `${plan.limits.maxStepsPerInstruction} steps`;\n const batchLabel =\n plan.limits.maxBatchRows === Number.POSITIVE_INFINITY\n ? \"unlimited\"\n : `${plan.limits.maxBatchRows} batch rows`;\n\n return `${plan.tier.charAt(0).toUpperCase() + plan.tier.slice(1)} (${stepsLabel}, ${batchLabel})`;\n}\n\nexport { PlanLimitError, PlanFeatureError, QuotaExceededError, type LimitType } from \"./errors\";\n","/**\n * instruction YAML 読み込み + Zod バリデーション\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { parse } from \"yaml\";\nimport { ParsedInstructionSchema } from \"../schemas/instruction-schema\";\nimport type { ParsedInstruction } from \"./types\";\nimport { log } from \"../cli/prompts\";\nimport { formatDuration } from \"../cli/format\";\n\n/**\n * YAML 指示書を読み込み、メタデータをログ出力する。\n * executor / debugger 共通のエントリポイント。\n */\nexport async function loadAndLogInstruction(path: string): Promise<ParsedInstruction> {\n const loadStart = performance.now();\n const instruction = await loadInstruction(path);\n log.info(`Title: ${instruction.title}`);\n log.info(`Start URL: ${instruction.metadata.startUrl}`);\n log.info(`Steps: ${instruction.steps.length}`);\n log.info(`YAML loaded (${formatDuration(performance.now() - loadStart)})`);\n return instruction;\n}\n\n/**\n * YAML ファイルを読み込み、Zod スキーマで一括バリデーション。\n * 不正なフィールドは Zod のエラーメッセージで即座に検出される。\n */\nexport async function loadInstruction(path: string): Promise<ParsedInstruction> {\n const raw = await readFile(path, \"utf-8\");\n const doc = parse(raw);\n return ParsedInstructionSchema.parse(doc);\n}\n","/**\n * executor — メイン実行ループ\n *\n * instruction YAML のステップを順に実行する。\n * RuntimeStore によるテンプレート展開 + キャプチャ実行。\n */\n\nimport { mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { AgentBrowser } from \"../browser/browser-client\";\nimport type { RefMap } from \"../browser/agent-browser-imports\";\nimport { findElementInSnapshot, countElements } from \"../browser/snapshot-parser\";\nimport { resolveWithAIDetailed } from \"../harness/selector-resolver\";\nimport type { AIResolveResult, RetryContext } from \"../harness/selector-resolver\";\nimport { classifyFailure, getRecoveryHint } from \"../harness/error-classifier\";\nimport { FailureRegistry } from \"../harness/failure-registry\";\nimport {\n buildCacheKey,\n buildSnapshotHash,\n lookupCache,\n updateCache,\n invalidateCacheEntry,\n type SelectorCache,\n} from \"../harness/selector-cache\";\nimport { runGoalAgent } from \"../harness/goal-agent\";\nimport { resolveWithVision } from \"../harness/vision-resolver\";\nimport { validateAction } from \"../harness/action-validator\";\nimport { resolveDeterministic } from \"../harness/deterministic-resolver\";\nimport { needsConfirmation } from \"./confirmation\";\nimport type { ConfirmationProvider } from \"../harness/confirmation\";\nimport { executeCapture } from \"../context/capture-handler\";\nimport { evaluateCondition } from \"../context/expression-evaluator\";\nimport { parseAndAppendToMemory } from \"../context/memory-operations\";\nimport { sleep } from \"../harness/sleep\";\nimport type { Logger, SpinnerLike } from \"../logger\";\nimport { NoopLogger, NoopSpinner } from \"../logger\";\nimport { createDebugLogger, type DebugLogger } from \"../cli/debug-logger\";\nimport { getActiveMetricsCollector } from \"../harness/ai-metrics\";\nimport type { RuntimeStore } from \"../context/runtime-store\";\nimport { SnapshotCache } from \"../context/snapshot-cache\";\nimport { ContextChunker } from \"../context/context-chunker\";\nimport type {\n ExecutorConfig,\n ExecutionStrategy,\n ParsedInstruction,\n ParsedStep,\n StepExecutionResult,\n StepRetryDetail,\n StepDiagnostics,\n ExecutionReport,\n} from \"./types\";\n\nexport interface ExecuteOptions {\n /** RuntimeStore(テンプレート変数管理) */\n store: RuntimeStore;\n /** バッチ用: 既存ブラウザインスタンスを再利用 */\n browser?: AgentBrowser;\n /** 承認プロバイダ */\n confirmationProvider?: ConfirmationProvider;\n /** セレクタキャッシュ(null=無効) */\n selectorCache?: SelectorCache | null;\n /** データ蓄積・集計ストア */\n dataStore?: import(\"../context/data-store\").DataStore &\n import(\"../context/data-store\").DataAggregator;\n /** ダウンロードマネージャ */\n downloadManager?: import(\"../context/download-manager\").DownloadManager;\n /** Logger インスタンス(SDK 用にカスタム可能) */\n logger?: Logger;\n /** SpinnerLike ファクトリ(SDK 用にカスタム可能) */\n createSpinner?: () => SpinnerLike;\n /** ジョブレベルタイムアウト用 AbortSignal */\n abortSignal?: AbortSignal;\n}\n\n/**\n * instruction を実行する\n */\nexport async function execute(\n config: ExecutorConfig,\n instruction: ParsedInstruction,\n opts: ExecuteOptions,\n): Promise<ExecutionReport> {\n const totalStart = performance.now();\n const ownsBrowser = !opts.browser;\n const browser = opts.browser ?? new AgentBrowser();\n const results: StepExecutionResult[] = [];\n let aborted = false;\n let recordedVideoPaths: string[] | undefined;\n const logger: Logger = opts.logger ?? new NoopLogger();\n const createSpinner = opts.createSpinner ?? (() => new NoopSpinner());\n const debugLogger = createDebugLogger({\n filePath: config.debugLogPath,\n console: config.debugConsole,\n });\n\n const snapshotCache = new SnapshotCache();\n const contextChunker = config.contextMarkdown\n ? new ContextChunker(config.contextMarkdown)\n : undefined;\n const failureRegistry = new FailureRegistry();\n\n const pauseMs = config.stepDelay ?? instruction.settings.pauseBetweenSteps;\n\n if (config.screenshotDir) {\n await mkdir(config.screenshotDir, { recursive: true });\n }\n\n try {\n // ブラウザ起動 + 初期ナビゲーション(自前ブラウザの場合のみ)\n if (ownsBrowser) {\n const startUrl = opts.store.resolveTemplate(instruction.metadata.startUrl);\n const openSpinner = createSpinner();\n openSpinner.start(`${startUrl} を開いています...`);\n await browser.open(startUrl, {\n headless: config.headless,\n stealth: config.stealth,\n proxy: config.proxy,\n });\n // 固定1秒sleep → DOM安定化待機に置換(高速ページで数百ms節約)\n await browser.waitForDOMStability(3000);\n openSpinner.stop(\"ブラウザ起動完了\");\n\n // 動画録画開始\n if (config.videoDir) {\n try {\n await browser.startRecording(config.videoDir);\n logger.info(`録画開始: ${config.videoDir}`);\n } catch (e) {\n logger.warn(`録画開始に失敗しました: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n }\n\n for (const step of instruction.steps) {\n if (aborted) break;\n if (opts.abortSignal?.aborted) {\n aborted = true;\n logger.warn(\"Job aborted: timeout exceeded\");\n break;\n }\n\n logger.step(`Step ${step.ordinal}/${instruction.steps.length}: ${step.description}`);\n const start = Date.now();\n\n // 条件チェック\n if (step.condition) {\n const resolved = opts.store.resolveTemplate(step.condition);\n const evalResult = evaluateCondition(resolved);\n debugLogger.log({\n phase: \"executor\",\n event: \"condition_eval\",\n step: step.ordinal,\n data: { condition: step.condition, resolved, result: evalResult.value, error: evalResult.error },\n });\n if (!evalResult.value) {\n logger.warn(`Condition false, skipping: ${step.condition}`);\n results.push({\n ordinal: step.ordinal,\n description: step.description,\n actionType: step.action.type,\n status: \"skipped\",\n durationMs: Date.now() - start,\n conditionSkipped: true,\n });\n continue;\n }\n }\n\n // ブランチステップ\n if (step.branches) {\n const branchResult = await executeBranchStep(\n browser,\n step,\n instruction,\n config,\n opts,\n debugLogger,\n pauseMs,\n logger,\n snapshotCache,\n contextChunker,\n failureRegistry,\n );\n results.push(branchResult);\n if (branchResult.status === \"failed\" && instruction.settings.stopOnError) {\n logger.error(\"stopOnError=true, aborting execution\");\n aborted = true;\n }\n continue;\n }\n\n // ループステップ\n if (step.loop && step.steps) {\n const loopResult = await executeLoopStep(\n browser,\n step,\n instruction,\n config,\n opts,\n debugLogger,\n pauseMs,\n logger,\n snapshotCache,\n contextChunker,\n failureRegistry,\n );\n results.push(loopResult);\n if (loopResult.status === \"failed\" && instruction.settings.stopOnError) {\n logger.error(\"stopOnError=true, aborting execution\");\n aborted = true;\n }\n continue;\n }\n\n // 承認チェック\n if (needsConfirmation(step, config.skipConfirmation) && opts.confirmationProvider) {\n logger.info(`承認待ち: Step ${step.ordinal} (リスク: ${step.riskLevel})`);\n debugLogger.log({\n phase: \"executor\",\n event: \"approval_pending\",\n step: step.ordinal,\n data: { riskLevel: step.riskLevel, description: step.description },\n });\n\n const result = await opts.confirmationProvider.confirm(step, step.ordinal, {\n goal: instruction.metadata.goal,\n });\n\n debugLogger.log({\n phase: \"executor\",\n event: \"approval_received\",\n step: step.ordinal,\n data: { result },\n });\n\n if (result === \"abort\") {\n logger.error(`承認結果: 中止 (Step ${step.ordinal})`);\n aborted = true;\n results.push({\n ordinal: step.ordinal,\n description: step.description,\n actionType: step.action.type,\n status: \"skipped\",\n durationMs: Date.now() - start,\n error: \"User aborted\",\n });\n break;\n }\n if (result === \"skip\") {\n logger.warn(`承認結果: スキップ (Step ${step.ordinal})`);\n results.push({\n ordinal: step.ordinal,\n description: step.description,\n actionType: step.action.type,\n status: \"skipped\",\n durationMs: Date.now() - start,\n });\n continue;\n }\n\n logger.success(`承認結果: 実行 (Step ${step.ordinal})`);\n }\n\n try {\n const stepResult = await executeStep(\n browser,\n step,\n instruction,\n config,\n opts,\n debugLogger,\n logger,\n snapshotCache,\n contextChunker,\n failureRegistry,\n );\n results.push({ ...stepResult, ordinal: step.ordinal, description: step.description, actionType: step.action.type });\n\n // Working Memory 更新\n opts.store.updateWorkingMemory(\n step.ordinal,\n instruction.steps.length,\n stepResult.status === \"success\",\n step.url,\n step.action.type,\n step.description,\n );\n\n // extract結果をRuntimeStoreに保存(memoryOperationsで参照するため)\n if (stepResult.extractedData) {\n opts.store.set(\"extractedData\", stepResult.extractedData);\n }\n\n if (stepResult.status === \"failed\" && instruction.settings.stopOnError) {\n logger.error(\"stopOnError=true, aborting execution\");\n aborted = true;\n break;\n }\n\n // キャプチャフェーズ\n if (step.captures && step.captures.length > 0) {\n await executeCapturePhase(browser, step, opts.store, results, instruction, debugLogger, logger);\n if (results[results.length - 1].status === \"failed\" && instruction.settings.stopOnError) {\n aborted = true;\n }\n }\n\n // メモリオペレーション(蓄積・集計)\n if (step.memoryOperations && opts.dataStore) {\n await executeMemoryOperations(step, opts.store, opts.dataStore, debugLogger, logger);\n }\n\n // スクリーンショット (オプション)\n if (config.screenshotDir) {\n const filename = `step-${String(step.ordinal).padStart(3, \"0\")}.png`;\n try {\n await browser.screenshot(join(config.screenshotDir, filename));\n } catch {\n // スクリーンショット失敗は無視\n }\n }\n\n // ステップ間待機\n if (pauseMs > 0) {\n await new Promise((r) => setTimeout(r, pauseMs));\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(errorMsg);\n debugLogger.log({\n phase: \"executor\",\n event: \"step_error\",\n step: step.ordinal,\n data: { error: errorMsg },\n });\n results.push({\n ordinal: step.ordinal,\n description: step.description,\n actionType: step.action.type,\n status: \"failed\",\n durationMs: Date.now() - start,\n error: errorMsg,\n });\n\n if (instruction.settings.stopOnError) {\n aborted = true;\n break;\n }\n }\n }\n } finally {\n // 動画録画停止\n if (ownsBrowser && browser.isRecording()) {\n try {\n const result = await browser.stopRecording();\n if (result.paths.length > 0) {\n recordedVideoPaths = result.paths;\n for (const p of result.paths) {\n logger.info(`録画完了: ${p}`);\n }\n }\n } catch (e) {\n logger.warn(`録画停止に失敗しました: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n if (ownsBrowser) {\n try {\n await browser.close();\n } catch {\n // close失敗は無視\n }\n }\n }\n\n // AI メトリクスサマリーをデバッグログに出力\n const metricsSummary = getActiveMetricsCollector().getSummary();\n if (metricsSummary.totalCalls > 0) {\n debugLogger.log({\n phase: \"executor\",\n event: \"ai_metrics_summary\",\n data: metricsSummary as unknown as Record<string, unknown>,\n });\n }\n\n await debugLogger.flush();\n\n const succeeded = results.filter((r) => r.status === \"success\").length;\n const failed = results.filter((r) => r.status === \"failed\").length;\n const skipped = results.filter((r) => r.status === \"skipped\").length;\n\n // メモリコレクション情報を収集\n const memoryCollections: Record<string, number> | undefined = opts.dataStore\n ? Object.fromEntries(\n opts.dataStore.listCollections().map((c) => [c, opts.dataStore!.count(c)]),\n )\n : undefined;\n\n // ダウンロードファイル一覧を収集\n const downloadedFiles = opts.downloadManager\n ? opts.downloadManager.getAllPaths()\n : undefined;\n\n return {\n instructionTitle: instruction.title,\n startUrl: instruction.metadata.startUrl,\n totalSteps: instruction.steps.length,\n executed: succeeded + failed,\n succeeded,\n failed,\n skipped,\n aborted,\n steps: results,\n totalDurationMs: Math.round(performance.now() - totalStart),\n ...(memoryCollections && Object.keys(memoryCollections).length > 0 ? { memoryCollections } : {}),\n ...(downloadedFiles && downloadedFiles.length > 0 ? { downloadedFiles } : {}),\n ...(recordedVideoPaths && recordedVideoPaths.length > 0 ? { videoPaths: recordedVideoPaths } : {}),\n };\n}\n\n/** キャプチャフェーズの共通処理 */\nasync function executeCapturePhase(\n browser: AgentBrowser,\n step: ParsedStep,\n store: RuntimeStore,\n results: StepExecutionResult[],\n instruction: ParsedInstruction,\n debugLogger: DebugLogger,\n logger: Logger,\n): Promise<void> {\n if (!step.captures || step.captures.length === 0) return;\n\n const capturedValues: Record<string, string> = {};\n for (const capture of step.captures) {\n const value = await executeCapture(browser, capture, store);\n if (value !== null) {\n store.set(capture.name, value);\n const maskedValue = store.isSensitive(capture.name) ? \"****\" : value;\n capturedValues[capture.name] = maskedValue;\n logger.success(`Captured: ${capture.name} = \"${maskedValue}\"`);\n debugLogger.log({\n phase: \"executor\",\n event: \"capture\",\n step: step.ordinal,\n data: { name: capture.name, strategy: capture.strategy, value: maskedValue },\n });\n } else if (capture.required) {\n logger.error(`Required capture \"${capture.name}\" failed`);\n results[results.length - 1].status = \"failed\";\n results[results.length - 1].error = `Required capture \"${capture.name}\" failed`;\n } else {\n logger.warn(`Optional capture \"${capture.name}\" returned no value`);\n }\n }\n if (Object.keys(capturedValues).length > 0) {\n results[results.length - 1].capturedValues = capturedValues;\n }\n}\n\n/** ループステップの実行 */\nasync function executeLoopStep(\n browser: AgentBrowser,\n step: ParsedStep,\n instruction: ParsedInstruction,\n config: ExecutorConfig,\n opts: ExecuteOptions,\n debugLogger: DebugLogger,\n pauseMs: number,\n logger: Logger,\n snapshotCache?: SnapshotCache,\n contextChunker?: ContextChunker,\n failureRegistry?: FailureRegistry,\n): Promise<StepExecutionResult> {\n const loop = step.loop!;\n\n // forEach ループ\n if (loop.forEach) {\n return executeForEachLoop(\n browser,\n step,\n instruction,\n config,\n opts,\n debugLogger,\n pauseMs,\n logger,\n snapshotCache,\n contextChunker,\n failureRegistry,\n );\n }\n\n // while 型ループ\n const start = Date.now();\n const store = opts.store;\n const subSteps = step.steps!;\n const maxIter = loop.maxIterations ?? 10;\n const counterVar = loop.counterVariable ?? \"__loopIndex\";\n const allIterResults: StepExecutionResult[][] = [];\n let iterations = 0;\n let loopFailed = false;\n\n debugLogger.log({\n phase: \"executor\",\n event: \"loop_start\",\n step: step.ordinal,\n data: { condition: loop.condition, maxIterations: maxIter, counterVariable: counterVar },\n });\n\n for (let i = 0; i < maxIter; i++) {\n // ジョブタイムアウトチェック\n if (opts.abortSignal?.aborted) {\n loopFailed = true;\n break;\n }\n\n // ループ条件を評価\n const resolved = store.resolveTemplate(loop.condition!);\n const evalResult = evaluateCondition(resolved);\n debugLogger.log({\n phase: \"executor\",\n event: \"loop_condition\",\n step: step.ordinal,\n data: { iteration: i, condition: loop.condition, resolved, result: evalResult.value },\n });\n\n if (!evalResult.value) {\n logger.info(`Loop condition false at iteration ${i}, exiting loop`);\n break;\n }\n\n // カウンタ変数をセット\n store.set(counterVar, String(i));\n iterations++;\n\n logger.step(`Loop ${step.ordinal} iteration ${i}/${maxIter}`);\n\n const { results: iterResults, failed } = await executeSubSteps(\n browser,\n subSteps,\n instruction,\n config,\n opts,\n debugLogger,\n pauseMs,\n logger,\n snapshotCache,\n contextChunker,\n failureRegistry,\n );\n\n allIterResults.push(iterResults);\n if (failed) {\n loopFailed = true;\n break;\n }\n }\n\n debugLogger.log({\n phase: \"executor\",\n event: \"loop_end\",\n step: step.ordinal,\n data: { iterations, failed: loopFailed },\n });\n\n return {\n ordinal: step.ordinal,\n description: step.description,\n actionType: \"loop\",\n status: loopFailed ? \"failed\" : \"success\",\n durationMs: Date.now() - start,\n loopIterations: iterations,\n subStepResults: allIterResults,\n };\n}\n\n/** forEach ループの実行 */\nasync function executeForEachLoop(\n browser: AgentBrowser,\n step: ParsedStep,\n instruction: ParsedInstruction,\n config: ExecutorConfig,\n opts: ExecuteOptions,\n debugLogger: DebugLogger,\n pauseMs: number,\n logger: Logger,\n snapshotCache?: SnapshotCache,\n contextChunker?: ContextChunker,\n failureRegistry?: FailureRegistry,\n): Promise<StepExecutionResult> {\n const start = Date.now();\n const store = opts.store;\n const loop = step.loop!;\n const subSteps = step.steps!;\n const maxIter = loop.maxIterations ?? 100;\n const itemVar = loop.itemVariable ?? \"__item\";\n const indexVar = loop.indexVariable ?? \"__index\";\n\n // forEach 値をテンプレート展開\n const rawForEach = store.resolveTemplate(loop.forEach!);\n\n // データソース解決\n let items: unknown[];\n if (rawForEach.startsWith(\"collection:\")) {\n // DataStore コレクションから取得\n const collectionName = rawForEach.slice(\"collection:\".length);\n if (!opts.dataStore) {\n return {\n ordinal: step.ordinal,\n description: step.description,\n actionType: \"forEach\",\n status: \"failed\",\n durationMs: Date.now() - start,\n error: `forEach collection: requires dataStore (collection: ${collectionName})`,\n };\n }\n items = opts.dataStore.getAll(collectionName);\n } else {\n // JSON パース\n try {\n const parsed = JSON.parse(rawForEach);\n if (!Array.isArray(parsed)) {\n return {\n ordinal: step.ordinal,\n description: step.description,\n actionType: \"forEach\",\n status: \"failed\",\n durationMs: Date.now() - start,\n error: `forEach value must be a JSON array, got ${typeof parsed}`,\n };\n }\n items = parsed;\n } catch {\n return {\n ordinal: step.ordinal,\n description: step.description,\n actionType: \"forEach\",\n status: \"failed\",\n durationMs: Date.now() - start,\n error: `forEach value is not valid JSON: ${rawForEach.slice(0, 100)}`,\n };\n }\n }\n\n // 安全上限\n const effectiveItems = items.slice(0, maxIter);\n\n debugLogger.log({\n phase: \"executor\",\n event: \"forEach_start\",\n step: step.ordinal,\n data: {\n forEach: loop.forEach,\n itemCount: items.length,\n effectiveCount: effectiveItems.length,\n maxIterations: maxIter,\n itemVariable: itemVar,\n indexVariable: indexVar,\n },\n });\n\n const allIterResults: StepExecutionResult[][] = [];\n let loopFailed = false;\n\n for (let i = 0; i < effectiveItems.length; i++) {\n if (opts.abortSignal?.aborted) {\n loopFailed = true;\n break;\n }\n\n store.setForEachItem(itemVar, effectiveItems[i], indexVar, i);\n\n logger.step(`forEach ${step.ordinal} [${i + 1}/${effectiveItems.length}]`);\n\n const { results: iterResults, failed } = await executeSubSteps(\n browser,\n subSteps,\n instruction,\n config,\n opts,\n debugLogger,\n pauseMs,\n logger,\n snapshotCache,\n contextChunker,\n failureRegistry,\n );\n\n allIterResults.push(iterResults);\n if (failed) {\n loopFailed = true;\n break;\n }\n }\n\n // クリーンアップ\n store.clearForEachItem(itemVar, indexVar);\n\n debugLogger.log({\n phase: \"executor\",\n event: \"forEach_end\",\n step: step.ordinal,\n data: { iterations: allIterResults.length, failed: loopFailed },\n });\n\n return {\n ordinal: step.ordinal,\n description: step.description,\n actionType: \"forEach\",\n status: loopFailed ? \"failed\" : \"success\",\n durationMs: Date.now() - start,\n loopIterations: allIterResults.length,\n forEachItemCount: items.length,\n subStepResults: allIterResults,\n };\n}\n\n/** サブステップ群を順に実行する共通ヘルパー */\nasync function executeSubSteps(\n browser: AgentBrowser,\n subSteps: ParsedStep[],\n instruction: ParsedInstruction,\n config: ExecutorConfig,\n opts: ExecuteOptions,\n debugLogger: DebugLogger,\n pauseMs: number,\n logger: Logger,\n snapshotCache?: SnapshotCache,\n contextChunker?: ContextChunker,\n failureRegistry?: FailureRegistry,\n): Promise<{ results: StepExecutionResult[]; failed: boolean }> {\n const store = opts.store;\n const results: StepExecutionResult[] = [];\n let failed = false;\n\n for (const subStep of subSteps) {\n // サブステップの条件チェック\n if (subStep.condition) {\n const subResolved = store.resolveTemplate(subStep.condition);\n const subEval = evaluateCondition(subResolved);\n if (!subEval.value) {\n logger.warn(` Sub-step ${subStep.ordinal} condition false, skipping`);\n results.push({\n ordinal: subStep.ordinal,\n description: subStep.description,\n actionType: subStep.action.type,\n status: \"skipped\",\n durationMs: 0,\n conditionSkipped: true,\n });\n continue;\n }\n }\n\n // サブステップがブランチを持つ場合\n if (subStep.branches) {\n const branchResult = await executeBranchStep(\n browser,\n subStep,\n instruction,\n config,\n opts,\n debugLogger,\n pauseMs,\n logger,\n snapshotCache,\n contextChunker,\n failureRegistry,\n );\n results.push(branchResult);\n if (branchResult.status === \"failed\" && instruction.settings.stopOnError) {\n failed = true;\n break;\n }\n continue;\n }\n\n // サブステップがループを持つ場合\n if (subStep.loop && subStep.steps) {\n const loopResult = await executeLoopStep(\n browser,\n subStep,\n instruction,\n config,\n opts,\n debugLogger,\n pauseMs,\n logger,\n snapshotCache,\n contextChunker,\n failureRegistry,\n );\n results.push(loopResult);\n if (loopResult.status === \"failed\" && instruction.settings.stopOnError) {\n failed = true;\n break;\n }\n continue;\n }\n\n try {\n const subResult = await executeStep(\n browser,\n subStep,\n instruction,\n config,\n opts,\n debugLogger,\n logger,\n snapshotCache,\n contextChunker,\n failureRegistry,\n );\n results.push({\n ...subResult,\n ordinal: subStep.ordinal,\n description: subStep.description,\n actionType: subStep.action.type,\n });\n\n // Working Memory 更新\n store.updateWorkingMemory(\n subStep.ordinal,\n instruction.steps.length,\n subResult.status === \"success\",\n subStep.url,\n subStep.action.type,\n subStep.description,\n );\n\n // extract結果をRuntimeStoreに保存\n if (subResult.extractedData) {\n store.set(\"extractedData\", subResult.extractedData);\n }\n\n if (subResult.status === \"failed\" && instruction.settings.stopOnError) {\n failed = true;\n break;\n }\n\n // サブステップのキャプチャ\n if (subStep.captures && subStep.captures.length > 0) {\n await executeCapturePhase(\n browser,\n subStep,\n store,\n results,\n instruction,\n debugLogger,\n logger,\n );\n if (\n results[results.length - 1].status === \"failed\" &&\n instruction.settings.stopOnError\n ) {\n failed = true;\n break;\n }\n }\n\n // サブステップのメモリオペレーション\n if (subStep.memoryOperations && opts.dataStore) {\n await executeMemoryOperations(subStep, store, opts.dataStore, debugLogger, logger);\n }\n\n // ステップ間待機\n if (pauseMs > 0) {\n await new Promise((r) => setTimeout(r, pauseMs));\n }\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n logger.error(errorMsg);\n results.push({\n ordinal: subStep.ordinal,\n description: subStep.description,\n actionType: subStep.action.type,\n status: \"failed\",\n durationMs: 0,\n error: errorMsg,\n });\n if (instruction.settings.stopOnError) {\n failed = true;\n break;\n }\n }\n }\n\n return { results, failed };\n}\n\n/** ブランチステップの実行 */\nasync function executeBranchStep(\n browser: AgentBrowser,\n step: ParsedStep,\n instruction: ParsedInstruction,\n config: ExecutorConfig,\n opts: ExecuteOptions,\n debugLogger: DebugLogger,\n pauseMs: number,\n logger: Logger,\n snapshotCache?: SnapshotCache,\n contextChunker?: ContextChunker,\n failureRegistry?: FailureRegistry,\n): Promise<StepExecutionResult> {\n const start = Date.now();\n const store = opts.store;\n const branches = step.branches!;\n\n // テンプレート展開\n const resolvedValue = store.resolveTemplate(branches.value);\n debugLogger.log({\n phase: \"executor\",\n event: \"branch_start\",\n step: step.ordinal,\n data: { value: branches.value, resolved: resolvedValue, caseCount: branches.cases.length },\n });\n\n // case マッチング\n let matchedSteps: ParsedStep[] | null = null;\n let matchLabel = \"\";\n\n for (const branchCase of branches.cases) {\n const resolvedMatch = store.resolveTemplate(branchCase.match);\n if (resolvedValue === resolvedMatch) {\n matchedSteps = branchCase.steps;\n matchLabel = branchCase.match;\n break;\n }\n }\n\n // default フォールバック\n if (!matchedSteps && branches.default) {\n matchedSteps = branches.default.steps;\n matchLabel = \"default\";\n }\n\n if (!matchedSteps) {\n logger.warn(`Branch: no matching case for \"${resolvedValue}\", skipping`);\n debugLogger.log({\n phase: \"executor\",\n event: \"branch_no_match\",\n step: step.ordinal,\n data: { value: resolvedValue },\n });\n return {\n ordinal: step.ordinal,\n description: step.description,\n actionType: \"branch\",\n status: \"skipped\",\n durationMs: Date.now() - start,\n branchMatch: undefined,\n };\n }\n\n logger.step(`Branch: matched \"${matchLabel}\" (value=\"${resolvedValue}\")`);\n debugLogger.log({\n phase: \"executor\",\n event: \"branch_matched\",\n step: step.ordinal,\n data: { value: resolvedValue, match: matchLabel, subStepCount: matchedSteps.length },\n });\n\n const { results: subResults, failed } = await executeSubSteps(\n browser,\n matchedSteps,\n instruction,\n config,\n opts,\n debugLogger,\n pauseMs,\n logger,\n snapshotCache,\n contextChunker,\n failureRegistry,\n );\n\n debugLogger.log({\n phase: \"executor\",\n event: \"branch_end\",\n step: step.ordinal,\n data: { match: matchLabel, failed },\n });\n\n return {\n ordinal: step.ordinal,\n description: step.description,\n actionType: \"branch\",\n status: failed ? \"failed\" : \"success\",\n durationMs: Date.now() - start,\n branchMatch: matchLabel,\n subStepResults: [subResults],\n };\n}\n\nasync function executeStep(\n browser: AgentBrowser,\n step: ParsedStep,\n instruction: ParsedInstruction,\n config: ExecutorConfig,\n opts: ExecuteOptions,\n debugLogger: DebugLogger,\n logger: Logger,\n snapshotCache?: SnapshotCache,\n contextChunker?: ContextChunker,\n failureRegistry?: FailureRegistry,\n): Promise<Omit<StepExecutionResult, \"ordinal\" | \"description\">> {\n const start = Date.now();\n\n // navigate / scroll / wait はセレクタ不要\n if (step.action.type === \"navigate\") {\n const rawUrl = step.action.url ?? step.url;\n const url = opts.store.resolveTemplate(rawUrl);\n logger.step(`Navigate: ${opts.store.maskSensitive(url)}`);\n await browser.navigate(url);\n const pageCount = await browser.pageCount();\n await browser.waitForPossibleNavigation(await browser.url(), pageCount);\n return { status: \"success\", durationMs: Date.now() - start };\n }\n\n if (step.action.type === \"scroll\") {\n logger.step(\"Scroll: down\");\n await browser.scroll(\"down\");\n return { status: \"success\", durationMs: Date.now() - start };\n }\n\n if (step.action.type === \"wait\") {\n const rawMs = step.action.value\n ? opts.store.resolveTemplate(step.action.value)\n : String(instruction.settings.defaultTimeout);\n const ms = Number(rawMs);\n logger.step(`Wait: ${ms}ms`);\n await browser.wait(ms);\n return { status: \"success\", durationMs: Date.now() - start };\n }\n\n // extract: ページ内 JavaScript 実行(セレクタ不要)\n if (step.action.type === \"extract\") {\n const script = opts.store.resolveTemplate(step.action.script ?? step.action.value ?? \"\");\n if (!script) {\n return { status: \"failed\", durationMs: Date.now() - start, error: \"extract requires script or value\" };\n }\n logger.step(`Extract: executing script`);\n debugLogger.log({\n phase: \"executor\",\n event: \"extract\",\n step: step.ordinal,\n data: { script: script.slice(0, 200) },\n });\n const result = await browser.evaluate(script);\n const isArray = Array.isArray(result);\n const stringifyApplied = typeof result !== \"string\" && result !== null && result !== undefined;\n const resultStr = result === null || result === undefined\n ? \"\"\n : typeof result === \"string\" ? result : JSON.stringify(result);\n debugLogger.log({\n phase: \"executor\",\n event: \"extract_result\",\n step: step.ordinal,\n data: {\n resultType: result === null ? \"null\" : typeof result,\n isArray,\n arrayLength: isArray ? (result as unknown[]).length : undefined,\n resultPreview: resultStr.slice(0, 200),\n storedLength: resultStr.length,\n stringifyApplied,\n },\n });\n if (resultStr === \"\") {\n logger.warn(\"Extract returned empty result\");\n debugLogger.log({\n phase: \"executor\",\n event: \"extract_empty_result\",\n step: step.ordinal,\n data: { script: script.slice(0, 200) },\n });\n }\n return { status: \"success\", durationMs: Date.now() - start, extractedData: resultStr };\n }\n\n // export: メモリコレクションをファイルに書き出し(セレクタ不要)\n if (step.action.type === \"export\") {\n if (!opts.dataStore) {\n return { status: \"failed\", durationMs: Date.now() - start, error: \"export requires dataStore\" };\n }\n const collection = opts.store.resolveTemplate(step.action.exportCollection ?? \"default\");\n const format = (step.action.exportFormat ?? \"csv\") as \"csv\" | \"json\";\n const outputDir = config.outputDir ?? \"/tmp\";\n const exportPath = opts.store.resolveTemplate(\n step.action.exportPath ?? `${outputDir}/${collection}.${format}`,\n );\n logger.step(`Export: ${collection} → ${exportPath} (${format})`);\n const exportItems = opts.dataStore.getAll(collection);\n const sampleKeys = exportItems.length > 0\n ? JSON.stringify(Object.keys(exportItems[0]))\n : \"N/A\";\n debugLogger.log({\n phase: \"executor\",\n event: \"export\",\n step: step.ordinal,\n data: {\n collection,\n itemCount: exportItems.length,\n format,\n path: exportPath,\n sampleKeys,\n },\n });\n await opts.dataStore.writeToFile(collection, exportPath, format);\n if (opts.downloadManager) {\n opts.downloadManager.addDownload({\n path: exportPath,\n filename: exportPath.split(\"/\").pop() ?? \"unknown\",\n stepOrdinal: step.ordinal,\n timestamp: new Date().toISOString(),\n });\n }\n return { status: \"success\", durationMs: Date.now() - start, exportedFile: exportPath };\n }\n\n // download: ファイルダウンロード(セレクタが必要な場合とパス指定のみの場合がある)\n if (step.action.type === \"download\") {\n const downloadPath = opts.store.resolveTemplate(\n step.action.downloadPath ?? `/tmp/download-${Date.now()}.bin`,\n );\n\n if (step.action.selector) {\n // セレクタ指定あり: 要素をクリックしてダウンロード\n // 簡易的にスナップショット取得 → 決定論的/AI解決 → download\n const snapshotResult = await browser.snapshotWithRefs();\n const deterministicResult = resolveDeterministic(snapshotResult.tree, step.action.selector, snapshotResult.refs);\n const resolvedRef = deterministicResult.ref;\n if (!resolvedRef) {\n const filteredSnap = snapshotCache\n ? snapshotCache.getFiltered(snapshotResult.tree)\n : snapshotResult.tree;\n const relevantContext = contextChunker\n ? contextChunker.selectRelevant(step.description, step.url)\n : config.contextMarkdown;\n const aiDetailed = await resolveWithAIDetailed(\n filteredSnap,\n step.action.selector,\n step.description,\n step.url,\n relevantContext,\n debugLogger,\n undefined,\n opts.store.getWorkingMemorySummary(),\n );\n if (!aiDetailed.ref) {\n return { status: \"failed\", durationMs: Date.now() - start, error: \"Could not resolve download selector\" };\n }\n logger.step(`Download: @${aiDetailed.ref} → ${downloadPath}`);\n await browser.download(`@${aiDetailed.ref}`, downloadPath);\n } else {\n logger.step(`Download: @${resolvedRef} → ${downloadPath}`);\n await browser.download(`@${resolvedRef}`, downloadPath);\n }\n } else {\n // セレクタなし: 現在のダウンロードを待つ\n logger.step(`Download: waiting for download → ${downloadPath}`);\n await browser.waitForDownload(downloadPath);\n }\n\n // DownloadManager に記録\n if (opts.downloadManager) {\n opts.downloadManager.addDownload({\n path: downloadPath,\n filename: downloadPath.split(\"/\").pop() ?? \"unknown\",\n stepOrdinal: step.ordinal,\n timestamp: new Date().toISOString(),\n });\n }\n\n return { status: \"success\", durationMs: Date.now() - start, downloadedFile: downloadPath };\n }\n\n // memory: データ操作のみ(メモリオペレーションは呼び出し元で実行)\n if (step.action.type === \"memory\") {\n logger.step(`Memory operation: ${step.description}`);\n return { status: \"success\", durationMs: Date.now() - start };\n }\n\n // Defensive: memoryOperations付きステップでセレクタが未定義の場合、memory-onlyとして扱う\n if (step.memoryOperations && step.memoryOperations.length > 0 && !step.action.selector) {\n logger.warn(\n `Step has memoryOperations but action type \"${step.action.type}\" with no selector — treating as memory-only`,\n );\n debugLogger.log({\n phase: \"executor\",\n event: \"memory_fallback\",\n step: step.ordinal,\n data: { originalActionType: step.action.type, memoryOpsCount: step.memoryOperations.length },\n });\n return { status: \"success\", durationMs: Date.now() - start };\n }\n\n // セレクタが必要なアクション\n if (!step.action.selector) {\n return {\n status: \"failed\",\n durationMs: Date.now() - start,\n error: \"No selector defined for this step\",\n diagnostics: {\n stepAction: {\n type: step.action.type,\n value: step.action.value,\n url: step.action.url,\n },\n stepUrl: step.url,\n },\n };\n }\n\n // スナップショット取得 + AI セレクタ解決(スマートリトライ)\n const defaultStrategy: ExecutionStrategy = {\n maxRetries: 3,\n changeTimeouts: [8000, 10000],\n finalRetryStabilizeMs: 3000,\n domStabilityMs: 5000,\n };\n const strategy = config.executionStrategy ?? defaultStrategy;\n const { maxRetries } = strategy;\n let aiResult: AIResolveResult | null = null;\n let lastSnapshot = \"\";\n let lastRefs: RefMap | undefined;\n let prevSnapshot = \"\";\n let lastAiResponseText = \"\";\n let lastAiPrompt = \"\";\n let attempts = 0;\n const failureHistory: string[] = [];\n const retryDetails: StepRetryDetail[] = [];\n let cachedRefUsed = false;\n let deterministicResolveResult = \"\";\n let agentFallbackResult: StepDiagnostics[\"agentFallbackResult\"] | undefined;\n let visionFallbackResult: StepDiagnostics[\"visionFallbackResult\"] | undefined;\n\n // キャッシュ高速パス: キャッシュされた ref がスナップショット内に存在すればAIスキップ\n if (opts.selectorCache && step.action.selector) {\n const cacheKey = buildCacheKey(step.ordinal, step.url, step.action.selector);\n const cached = lookupCache(opts.selectorCache, cacheKey);\n if (cached) {\n cachedRefUsed = true;\n const snapshotResult = await browser.snapshotWithRefs();\n const snapshot = snapshotResult.tree;\n lastSnapshot = snapshot;\n lastRefs = snapshotResult.refs;\n prevSnapshot = snapshot;\n if (findElementInSnapshot(snapshot, cached.ref) !== null) {\n // キャッシュヒット: ref が存在する → AIスキップ\n updateCache(opts.selectorCache, cacheKey, cached.ref, buildSnapshotHash(snapshot));\n aiResult = { ref: cached.ref, aiResponseText: \"(cache hit)\", reasoning: \"cache hit\" };\n debugLogger.log({\n phase: \"executor\",\n event: \"selector_cache_hit\",\n step: step.ordinal,\n data: { cacheKey, ref: cached.ref, hitCount: cached.hitCount + 1 },\n });\n logger.success(`Cache hit: @${cached.ref}`);\n } else {\n // キャッシュ stale: ref がスナップショットに存在しない → 無効化して通常フローへ\n invalidateCacheEntry(opts.selectorCache, cacheKey);\n debugLogger.log({\n phase: \"executor\",\n event: \"selector_cache_stale\",\n step: step.ordinal,\n data: { cacheKey, ref: cached.ref },\n });\n logger.warn(`Cache stale: @${cached.ref} not found in snapshot, falling back to AI`);\n cachedRefUsed = false;\n }\n }\n }\n\n // 決定論的セレクタ解決: AI を呼び出す前にパターンマッチで直接解決を試みる\n if (!aiResult && step.action.selector) {\n // スナップショットがまだ取得されていなければ取得\n if (!lastSnapshot) {\n const snapshotResult = await browser.snapshotWithRefs();\n lastSnapshot = snapshotResult.tree;\n lastRefs = snapshotResult.refs;\n prevSnapshot = lastSnapshot;\n }\n\n const deterministicResult = resolveDeterministic(lastSnapshot, step.action.selector, lastRefs);\n if (deterministicResult.ref) {\n aiResult = {\n ref: deterministicResult.ref,\n aiResponseText: `(deterministic: ${deterministicResult.matchType}, confidence=${deterministicResult.confidence})`,\n reasoning: `deterministic match: ${deterministicResult.matchType}`,\n };\n debugLogger.log({\n phase: \"executor\",\n event: \"deterministic_resolve\",\n step: step.ordinal,\n data: {\n ref: deterministicResult.ref,\n matchType: deterministicResult.matchType,\n confidence: deterministicResult.confidence,\n selector: step.action.selector,\n },\n });\n deterministicResolveResult = `hit: @${deterministicResult.ref} (${deterministicResult.matchType}, confidence=${deterministicResult.confidence})`;\n logger.success(`Deterministic resolve: @${deterministicResult.ref} (${deterministicResult.matchType}, confidence=${deterministicResult.confidence})`);\n } else {\n deterministicResolveResult = \"miss: no match\";\n debugLogger.log({\n phase: \"executor\",\n event: \"deterministic_resolve_miss\",\n step: step.ordinal,\n data: { selector: step.action.selector },\n });\n }\n }\n\n for (let attempt = 0; attempt <= maxRetries && !aiResult; attempt++) {\n if (attempt > 0) {\n logger.warn(`Selector not found, retrying (${attempt}/${maxRetries})...`);\n\n if (attempt <= strategy.changeTimeouts.length) {\n // スナップショット変化を能動的に待機(SPA遷移検出)\n const timeout = strategy.changeTimeouts[attempt - 1];\n logger.info(`Waiting up to ${timeout / 1000}s for page transition...`);\n const changeResult = await browser.waitForSnapshotChange(lastSnapshot, timeout);\n\n if (changeResult.changed) {\n logger.success(\"Page transition detected\");\n lastSnapshot = changeResult.snapshot;\n } else {\n // 変化なし: ページ遷移は発生していない → AI呼び出しをスキップ\n debugLogger.log({\n phase: \"executor\",\n event: \"snapshot_unchanged\",\n step: step.ordinal,\n data: { attempt, strategy: \"waitForSnapshotChange\", timeoutMs: timeout },\n });\n logger.warn(\"No page transition detected, skipping AI call\");\n const reason = `Attempt ${attempt}: waited ${timeout / 1000}s for page transition, no change`;\n failureHistory.push(reason);\n retryDetails.push({\n attempt,\n snapshotChanged: false,\n snapshotElementCount: countSnapshotElements(lastSnapshot),\n failureReason: reason,\n });\n prevSnapshot = lastSnapshot;\n attempts = attempt + 1;\n continue;\n }\n } else {\n // 最終リトライ: sleep + DOM安定化\n await sleep(strategy.finalRetryStabilizeMs);\n await browser.waitForDOMStability(strategy.domStabilityMs);\n lastSnapshot = await browser.snapshot();\n }\n } else {\n // 初回: 決定論的解決で既に取得済みならスナップショット再取得をスキップ\n if (!lastSnapshot) {\n lastSnapshot = await browser.snapshot();\n }\n }\n\n const snapshotChanged = attempt === 0 || lastSnapshot !== prevSnapshot;\n\n debugLogger.log({\n phase: \"executor\",\n event: attempt > 0 ? \"selector_retry\" : \"snapshot\",\n step: step.ordinal,\n data: {\n url: step.url,\n snapshot: lastSnapshot,\n attempt,\n ...(attempt > 0 ? { snapshotChanged } : {}),\n },\n });\n\n const failureHints = failureRegistry && step.action.selector\n ? failureRegistry.getRelevantHints(step.url, step.action.selector)\n : undefined;\n const retryContext: RetryContext | undefined = attempt > 0\n ? {\n attempt,\n previousAiResponse: lastAiResponseText || undefined,\n snapshotChanged,\n failureHistory,\n failureHints,\n }\n : undefined;\n\n const filteredSnap = snapshotCache\n ? snapshotCache.getFiltered(lastSnapshot)\n : lastSnapshot;\n const relevantContext = contextChunker\n ? contextChunker.selectRelevant(step.description, step.url)\n : config.contextMarkdown;\n const detailed = await resolveWithAIDetailed(\n filteredSnap,\n step.action.selector,\n step.description,\n step.url,\n relevantContext,\n debugLogger,\n retryContext,\n opts.store.getWorkingMemorySummary(),\n );\n attempts = attempt + 1;\n lastAiResponseText = detailed.aiResponseText;\n lastAiPrompt = detailed.prompt ?? \"\";\n prevSnapshot = lastSnapshot;\n\n if (detailed.ref) {\n aiResult = detailed;\n break;\n }\n\n const reason = `Attempt ${attempt + 1}: AI returned empty ref`;\n failureHistory.push(reason);\n retryDetails.push({\n attempt,\n snapshotChanged,\n snapshotElementCount: countSnapshotElements(lastSnapshot),\n failureReason: reason,\n aiReasoning: detailed.reasoning || undefined,\n aiPrompt: detailed.prompt?.slice(0, 2000),\n aiResponse: detailed.aiResponseText?.slice(0, 1000),\n snapshotPreview: lastSnapshot.slice(0, 2000),\n });\n }\n\n // スクロール回復: 全リトライ失敗後に画面外要素を探す\n if (!aiResult) {\n debugLogger.log({\n phase: \"executor\",\n event: \"recovery_attempt\",\n step: step.ordinal,\n data: { strategy: \"scroll_down\" },\n });\n logger.warn(\"All retries failed, attempting scroll recovery...\");\n\n try {\n await browser.scroll(\"down\", 500);\n await browser.waitForDOMStability(3000);\n const scrolledSnapshot = await browser.snapshot();\n\n if (scrolledSnapshot !== lastSnapshot) {\n const filteredScrollSnap = snapshotCache\n ? snapshotCache.getFiltered(scrolledSnapshot)\n : scrolledSnapshot;\n const relevantCtx = contextChunker\n ? contextChunker.selectRelevant(step.description, step.url)\n : config.contextMarkdown;\n const recoveryResult = await resolveWithAIDetailed(\n filteredScrollSnap,\n step.action.selector,\n step.description,\n step.url,\n relevantCtx,\n debugLogger,\n {\n attempt: attempts,\n snapshotChanged: true,\n failureHistory: [...failureHistory, \"Scroll recovery attempt\"],\n failureHints: failureRegistry && step.action.selector\n ? failureRegistry.getRelevantHints(step.url, step.action.selector)\n : undefined,\n },\n opts.store.getWorkingMemorySummary(),\n );\n attempts++;\n lastAiResponseText = recoveryResult.aiResponseText;\n lastAiPrompt = recoveryResult.prompt ?? \"\";\n lastSnapshot = scrolledSnapshot;\n\n if (recoveryResult.ref) {\n aiResult = recoveryResult;\n logger.success(\"Scroll recovery succeeded\");\n // Record scroll recovery success in failure registry\n if (failureRegistry && step.action.selector) {\n failureRegistry.record(step.url, step.action.selector, \"element_not_found\", step.ordinal, { method: \"scroll\" });\n }\n } else {\n retryDetails.push({\n attempt: attempts - 1,\n snapshotChanged: true,\n snapshotElementCount: countSnapshotElements(scrolledSnapshot),\n failureReason: \"Scroll recovery: AI returned empty ref\",\n aiReasoning: recoveryResult.reasoning || undefined,\n aiPrompt: recoveryResult.prompt?.slice(0, 2000),\n aiResponse: recoveryResult.aiResponseText?.slice(0, 1000),\n snapshotPreview: scrolledSnapshot.slice(0, 2000),\n });\n }\n }\n } catch {\n // スクロール回復失敗は無視\n }\n }\n\n // Vision Fallback: スクリーンショットベースの視覚的セレクタ解決\n if (!aiResult && config.enableVisionFallback) {\n logger.warn(\"Attempting vision fallback (screenshot-based)...\");\n try {\n const { imageBuffer, annotations } = await browser.screenshotWithAnnotations();\n const visionResult = await resolveWithVision(\n imageBuffer,\n annotations,\n step.action.selector,\n step.description,\n step.url,\n failureHistory,\n debugLogger,\n );\n if (visionResult?.ref) {\n aiResult = {\n ref: visionResult.ref,\n aiResponseText: `(vision: confidence=${visionResult.confidence})`,\n reasoning: visionResult.reasoning,\n };\n visionFallbackResult = {\n annotationCount: annotations.length,\n reasoning: visionResult.reasoning,\n success: true,\n };\n logger.success(`Vision fallback succeeded: @${visionResult.ref}`);\n // Record vision recovery success in failure registry\n if (failureRegistry && step.action.selector) {\n failureRegistry.record(step.url, step.action.selector, \"element_not_found\", step.ordinal, { method: \"vision\" });\n }\n } else {\n visionFallbackResult = {\n annotationCount: annotations.length,\n reasoning: visionResult?.reasoning ?? \"no match\",\n success: false,\n };\n failureHistory.push(\"Vision fallback: no matching element\");\n }\n } catch (error) {\n failureHistory.push(`Vision fallback error: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n // Agent Fallback: 全リトライ + スクロール回復後の最終手段\n if (!aiResult && config.enableAgentFallback) {\n debugLogger.log({\n phase: \"executor\",\n event: \"agent_fallback_start\",\n step: step.ordinal,\n data: { failureHistory },\n });\n logger.warn(\"Attempting agent fallback...\");\n\n const fallbackContext = contextChunker\n ? contextChunker.selectRelevant(step.description, step.url)\n : config.contextMarkdown;\n const fallbackResult = await runGoalAgent(\n browser,\n { description: step.description, action: step.action },\n failureHistory,\n fallbackContext,\n debugLogger,\n );\n\n debugLogger.log({\n phase: \"executor\",\n event: \"agent_fallback_result\",\n step: step.ordinal,\n data: fallbackResult as unknown as Record<string, unknown>,\n });\n\n agentFallbackResult = {\n strategy: fallbackResult.alternativeStrategy,\n analysis: fallbackResult.analysis,\n reasoning: fallbackResult.reasoning,\n success: fallbackResult.success,\n };\n\n if (fallbackResult.success && fallbackResult.alternativeRef) {\n aiResult = {\n ref: fallbackResult.alternativeRef,\n aiResponseText: JSON.stringify(fallbackResult),\n reasoning: fallbackResult.reasoning,\n };\n logger.success(`Agent fallback succeeded: @${fallbackResult.alternativeRef} (${fallbackResult.alternativeStrategy})`);\n // Record agent recovery success in failure registry\n if (failureRegistry && step.action.selector) {\n failureRegistry.record(step.url, step.action.selector, \"element_not_found\", step.ordinal, { method: `agent:${fallbackResult.alternativeStrategy}` });\n }\n } else {\n logger.warn(`Agent fallback: ${fallbackResult.alternativeStrategy} — ${fallbackResult.analysis}`);\n }\n }\n\n // リトライ回数(0 = 初回で成功)\n const retryCount = attempts > 1 ? attempts - 1 : 0;\n\n if (!aiResult) {\n const elementCount = countSnapshotElements(lastSnapshot);\n const selectorInfo = JSON.stringify(step.action.selector);\n const aiExcerpt = lastAiResponseText.slice(0, 200);\n\n // エラー分類\n const failureCategory = classifyFailure({\n error: `Could not resolve selector after ${attempts} attempts`,\n selectorResolved: false,\n actionExecuted: false,\n retryDetails,\n cachedRefUsed,\n });\n\n // Record final failure in failure registry\n if (failureRegistry && step.action.selector) {\n failureRegistry.record(step.url, step.action.selector, failureCategory, step.ordinal);\n }\n\n return {\n status: \"failed\",\n durationMs: Date.now() - start,\n error: `Could not resolve selector after ${attempts} attempts (elements: ${elementCount}, selector: ${selectorInfo}, AI: \"${aiExcerpt}\")`,\n retryCount,\n retryDetails,\n failureCategory,\n diagnostics: {\n lastSnapshotPreview: lastSnapshot.slice(0, 2000),\n failureHistory,\n lastAiResponseText,\n recoveryHint: getRecoveryHint(failureCategory),\n deterministicResolveResult: deterministicResolveResult || undefined,\n visionFallbackResult,\n agentFallbackResult,\n executionStrategy: strategy,\n stepAction: {\n type: step.action.type,\n selector: step.action.selector as Record<string, unknown> | undefined,\n value: step.action.value,\n url: step.action.url,\n },\n stepUrl: step.url,\n },\n };\n }\n\n debugLogger.log({\n phase: \"executor\",\n event: \"selector_resolve\",\n step: step.ordinal,\n data: { selector: step.action.selector, resolvedRef: aiResult.ref, url: step.url, attempts },\n });\n\n // キャッシュ更新: AI解決成功時にキャッシュに書き込む\n if (opts.selectorCache && step.action.selector) {\n const cacheKey = buildCacheKey(step.ordinal, step.url, step.action.selector);\n updateCache(opts.selectorCache, cacheKey, aiResult.ref, buildSnapshotHash(lastSnapshot));\n }\n\n logger.success(`AI resolved: @${aiResult.ref}${attempts > 1 ? ` (after ${attempts} attempts)` : \"\"}`);\n const ref = `@${aiResult.ref}`;\n\n // アクション事前バリデーション(RefMap 優先 + type_mismatch 時リトライ)\n const value = resolveValue(step, opts.store);\n // optionText もテンプレート解決\n const optionText = step.action.optionText\n ? opts.store.resolveTemplate(step.action.optionText)\n : undefined;\n\n // 最新の refs を取得してバリデーション\n if (!lastRefs) {\n const freshResult = await browser.snapshotWithRefs();\n lastSnapshot = freshResult.tree;\n lastRefs = freshResult.refs;\n }\n\n let validation = validateAction(lastSnapshot, aiResult.ref, step.action.type, value, lastRefs);\n\n if (validation.warnings.length > 0) {\n for (const w of validation.warnings) {\n logger.warn(`Validation warning: ${w.message}`);\n }\n debugLogger.log({\n phase: \"executor\",\n event: \"validation_warnings\",\n step: step.ordinal,\n data: { warnings: validation.warnings },\n });\n }\n\n if (!validation.valid) {\n const hasTypeMismatch = validation.errors.some((e) => e.code === \"type_mismatch\");\n\n // type_mismatch の場合は新しいスナップショットでリトライ\n if (hasTypeMismatch) {\n debugLogger.log({\n phase: \"executor\",\n event: \"validation_retry\",\n step: step.ordinal,\n data: { errors: validation.errors, ref: aiResult.ref, actionType: step.action.type },\n });\n logger.warn(\"Validation failed with type_mismatch, retrying with fresh snapshot...\");\n\n // DOM安定化待機(固定500msスリープよりも効率的)\n await browser.waitForDOMStability(2000);\n const freshResult = await browser.snapshotWithRefs();\n\n if (freshResult.refs[aiResult.ref]) {\n lastSnapshot = freshResult.tree;\n lastRefs = freshResult.refs;\n validation = validateAction(lastSnapshot, aiResult.ref, step.action.type, value, lastRefs);\n\n if (validation.warnings.length > 0) {\n for (const w of validation.warnings) {\n logger.warn(`Validation warning (retry): ${w.message}`);\n }\n }\n }\n }\n\n if (!validation.valid) {\n const errorMessages = validation.errors.map((e) => e.message).join(\"; \");\n debugLogger.log({\n phase: \"executor\",\n event: \"validation_failed\",\n step: step.ordinal,\n data: { errors: validation.errors, ref: aiResult.ref, actionType: step.action.type },\n });\n return {\n status: \"failed\",\n durationMs: Date.now() - start,\n error: `Pre-execution validation failed: ${errorMessages}`,\n retryCount,\n retryDetails: retryDetails.length > 0 ? retryDetails : undefined,\n diagnostics: {\n lastSnapshotPreview: lastSnapshot.slice(0, 2000),\n failureHistory,\n lastAiResponseText,\n validationErrors: validation.errors.map((e) => `[${e.code}] ${e.message}`),\n validationWarnings: validation.warnings.map((w) => `[${w.code}] ${w.message}`),\n executionStrategy: strategy,\n stepAction: {\n type: step.action.type,\n selector: step.action.selector as Record<string, unknown> | undefined,\n value: step.action.value,\n url: step.action.url,\n },\n stepUrl: step.url,\n },\n };\n }\n\n logger.success(\"Validation retry succeeded\");\n }\n\n // ログ表示(sensitive マスク)\n const displayValue = value\n ? opts.store.maskSensitive(value)\n : value;\n\n // アクション実行\n const urlBefore = await browser.url();\n const pageCountBefore = await browser.pageCount();\n\n switch (step.action.type) {\n case \"click\":\n logger.step(`Click: ${ref}`);\n await browser.click(ref);\n break;\n case \"input\":\n logger.step(`Input: ${ref} = \"${displayValue ?? \"\"}\"`);\n await browser.fill(ref, value ?? \"\");\n break;\n case \"select\": {\n const displayOptionText = optionText ? opts.store.maskSensitive(optionText) : undefined;\n logger.step(`Select: ${ref} = \"${displayOptionText ?? displayValue ?? \"\"}\"`);\n await browser.select(ref, optionText ?? value ?? \"\");\n break;\n }\n case \"hover\":\n logger.step(`Hover (click fallback): ${ref}`);\n await browser.click(ref);\n break;\n }\n\n // click / input(submit) 後のナビゲーション待機\n if (step.action.type === \"click\") {\n await browser.waitForPossibleNavigation(urlBefore, pageCountBefore);\n }\n\n const durationMs = Date.now() - start;\n debugLogger.log({\n phase: \"executor\",\n event: \"action\",\n step: step.ordinal,\n data: {\n type: step.action.type,\n ref,\n value: displayValue,\n status: \"success\",\n durationMs,\n },\n });\n\n return {\n status: \"success\",\n durationMs,\n retryCount,\n retryDetails: retryDetails.length > 0 ? retryDetails : undefined,\n };\n}\n\n/** メモリオペレーション(蓄積・集計)を実行 */\nasync function executeMemoryOperations(\n step: ParsedStep,\n store: RuntimeStore,\n dataStore: import(\"../context/data-store\").DataStore &\n import(\"../context/data-store\").DataAggregator,\n debugLogger: DebugLogger,\n logger: Logger,\n): Promise<void> {\n if (!step.memoryOperations) return;\n\n for (const op of step.memoryOperations) {\n if (op.type === \"append\") {\n if (!op.source) {\n logger.warn(`Memory append: source is required`);\n continue;\n }\n const rawValue = store.get(op.source);\n if (!rawValue) {\n logger.warn(`Memory append: variable \"${op.source}\" not found in store`);\n continue;\n }\n\n parseAndAppendToMemory(rawValue, {\n dataStore,\n debugLogger,\n phase: \"executor\",\n step: step.ordinal,\n collection: op.collection,\n });\n } else if (op.type === \"aggregate\") {\n if (!op.field || !op.operation || !op.outputVariable) {\n logger.warn(`Memory aggregate: field, operation, and outputVariable are required`);\n continue;\n }\n const result = dataStore.aggregate({\n collection: op.collection,\n field: op.field,\n operation: op.operation,\n });\n store.set(op.outputVariable, result);\n logger.success(`Memory: ${op.operation}(${op.collection}.${op.field}) = \"${result}\" → {{${op.outputVariable}}}`);\n debugLogger.log({\n phase: \"executor\",\n event: \"memory_aggregate\",\n step: step.ordinal,\n data: { collection: op.collection, field: op.field, operation: op.operation, result, outputVariable: op.outputVariable },\n });\n }\n }\n}\n\n/** RuntimeStore からテンプレート展開して値を解決 */\nfunction resolveValue(step: ParsedStep, store: RuntimeStore): string | undefined {\n const rawValue = step.action.value;\n if (rawValue === undefined) return undefined;\n return store.resolveTemplate(rawValue);\n}\n\n/** スナップショット内の要素数をカウント */\nfunction countSnapshotElements(snapshot: string): number {\n return countElements(snapshot);\n}\n","/**\n * ai-selector-resolver — セレクタ解決の AI フォールバック\n *\n * 決定的マッチングで要素が見つからない場合に、\n * AI にスナップショットを渡して @eN ref を推定させる。\n */\n\nimport { z } from \"zod\";\nimport { getModel, trackedGenerateObject, withAIRetry } from \"./ai-model\";\nimport { buildSelectorMessages } from \"../i18n/prompts\";\nimport type { Selector } from \"../instruction-executor/types\";\nimport type { DebugLogger } from \"../cli/debug-logger\";\n\nconst selectorResponseSchema = z.object({\n reasoning: z.string().describe(\"マッチング判断の理由を1-2文で説明\"),\n ref: z.string().describe(\"マッチした要素のref値(例: e3)。@は含めない。該当要素がスナップショット内に存在しない場合は空文字\"),\n});\n\nexport interface AIResolveResult {\n ref: string;\n aiResponseText: string;\n reasoning: string;\n /** AI に送ったプロンプト全文(診断レポート用) */\n prompt?: string;\n}\n\nexport interface RetryContext {\n attempt: number;\n previousAiResponse?: string;\n snapshotChanged: boolean;\n failureHistory: string[];\n /** FailureRegistry からの回復ヒント */\n failureHints?: string;\n}\n\n/** 共通の AI セレクタ解決実装 */\nasync function resolveImpl(\n snapshot: string,\n selector: Selector,\n stepDescription: string,\n url: string,\n contextMarkdown?: string,\n debugLogger?: DebugLogger,\n retryContext?: RetryContext,\n workingMemorySummary?: string,\n): Promise<AIResolveResult> {\n const { system, userPrompt } = buildSelectorMessages(snapshot, selector, stepDescription, url, contextMarkdown, retryContext, workingMemorySummary);\n const prompt = `${system}\\n---\\n${userPrompt}`;\n\n debugLogger?.log({\n phase: \"executor\",\n event: \"ai_selector_prompt\",\n data: { prompt, selector, stepDescription, url },\n });\n\n const { object } = await withAIRetry(\n () =>\n trackedGenerateObject(\"selector\", {\n model: getModel(\"selector\"),\n messages: [\n {\n role: \"system\",\n content: system,\n providerOptions: {\n anthropic: { cacheControl: { type: \"ephemeral\" } },\n },\n },\n { role: \"user\", content: userPrompt },\n ],\n schema: selectorResponseSchema,\n temperature: 0,\n }),\n { label: \"selector-resolve\" },\n );\n\n debugLogger?.log({\n phase: \"executor\",\n event: \"ai_selector_response\",\n data: { parsedResult: object as unknown as Record<string, unknown> },\n });\n\n return { ref: object.ref ?? \"\", aiResponseText: JSON.stringify(object), reasoning: object.reasoning, prompt };\n}\n\n/**\n * AI にスナップショット・セレクタ情報・ステップ説明を渡し、\n * 対応する @eN ref を返させる。\n * 該当要素が見つからなかった場合は null を返す。\n */\nexport async function resolveWithAI(\n snapshot: string,\n selector: Selector,\n stepDescription: string,\n url: string,\n contextMarkdown?: string,\n debugLogger?: DebugLogger,\n workingMemorySummary?: string,\n): Promise<AIResolveResult | null> {\n const result = await resolveImpl(snapshot, selector, stepDescription, url, contextMarkdown, debugLogger, undefined, workingMemorySummary);\n return result.ref ? result : null;\n}\n\n/**\n * resolveWithAI と同じだが、セレクタが見つからなかった場合でも\n * AI応答テキストを含む結果を返す(リトライ時のエラーメッセージ用)。\n */\nexport async function resolveWithAIDetailed(\n snapshot: string,\n selector: Selector,\n stepDescription: string,\n url: string,\n contextMarkdown?: string,\n debugLogger?: DebugLogger,\n retryContext?: RetryContext,\n workingMemorySummary?: string,\n): Promise<AIResolveResult> {\n return resolveImpl(snapshot, selector, stepDescription, url, contextMarkdown, debugLogger, retryContext, workingMemorySummary);\n}\n\n// buildSelectorMessages and pruneSelectorHints are now dispatched via i18n/prompts\n","/**\n * failure-registry — 失敗パターンの蓄積と回復ヒント生成\n *\n * 実行中に発生した失敗パターンを URL + セレクタヒント単位で蓄積し、\n * 類似セレクタの解決時に過去の回復成功パターンをヒントとして提供する。\n */\n\nimport type { FailureCategory } from \"./error-classifier\";\nimport type { Selector } from \"../instruction-executor/types\";\n\nexport interface FailurePattern {\n urlPattern: string;\n selectorHint: string;\n category: FailureCategory;\n recoveryUsed?: string;\n count: number;\n lastStepOrdinal: number;\n}\n\nconst MAX_PATTERNS = 50;\n\n/**\n * 実行中の失敗パターンを蓄積するレジストリ。\n * 類似パターンの回復ヒントを AI プロンプトに注入できる。\n */\nexport class FailureRegistry {\n private patterns: FailurePattern[] = [];\n\n /**\n * 失敗を記録する。\n * 同じ urlPattern + selectorHint + category の組み合わせは count をインクリメント。\n */\n record(\n url: string,\n selector: Selector,\n category: FailureCategory,\n stepOrdinal: number,\n resolution?: { method: string },\n ): void {\n const urlPattern = normalizeUrlPattern(url);\n const selectorHint = buildSelectorHint(selector);\n\n const existing = this.patterns.find(\n (p) => p.urlPattern === urlPattern && p.selectorHint === selectorHint && p.category === category,\n );\n\n if (existing) {\n existing.count++;\n existing.lastStepOrdinal = stepOrdinal;\n if (resolution) {\n existing.recoveryUsed = resolution.method;\n }\n } else {\n // LRU eviction\n if (this.patterns.length >= MAX_PATTERNS) {\n this.patterns.shift();\n }\n this.patterns.push({\n urlPattern,\n selectorHint,\n category,\n recoveryUsed: resolution?.method,\n count: 1,\n lastStepOrdinal: stepOrdinal,\n });\n }\n }\n\n /**\n * URL + セレクタに関連する回復ヒントを返す。\n * 類似パターンがなければ undefined。\n */\n getRelevantHints(url: string, selector: Selector): string | undefined {\n const urlPattern = normalizeUrlPattern(url);\n const selectorHint = buildSelectorHint(selector);\n\n // 同じ URL パターンでの失敗を検索\n const relevant = this.patterns.filter(\n (p) => p.urlPattern === urlPattern || p.selectorHint === selectorHint,\n );\n\n if (relevant.length === 0) return undefined;\n\n // 回復方法ごとの集計\n const recoveryMethods = new Map<string, number>();\n for (const p of relevant) {\n if (p.recoveryUsed) {\n recoveryMethods.set(\n p.recoveryUsed,\n (recoveryMethods.get(p.recoveryUsed) ?? 0) + p.count,\n );\n }\n }\n\n const parts: string[] = [];\n\n // 失敗パターンのサマリー\n const categoryCounts = new Map<string, number>();\n for (const p of relevant) {\n categoryCounts.set(p.category, (categoryCounts.get(p.category) ?? 0) + p.count);\n }\n const categoryStr = [...categoryCounts.entries()]\n .map(([cat, count]) => `${cat}(${count}x)`)\n .join(\", \");\n parts.push(`Similar failures on ${urlPattern}: ${categoryStr}`);\n\n // 回復方法のヒント\n if (recoveryMethods.size > 0) {\n const recoveryStr = [...recoveryMethods.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([method, count]) => `${method}(${count}x)`)\n .join(\", \");\n parts.push(`Resolved by: ${recoveryStr}`);\n }\n\n return parts.join(\". \");\n }\n\n /** 蓄積パターン数 */\n get size(): number {\n return this.patterns.length;\n }\n\n /** パターンをクリア */\n clear(): void {\n this.patterns = [];\n }\n}\n\n/**\n * URL をパスパラメータをワイルドカード化してパターン化する。\n * 例: /users/123/edit → /users/{id}/edit\n */\nfunction normalizeUrlPattern(url: string): string {\n try {\n const parsed = new URL(url);\n const normalizedPath = parsed.pathname\n .split(\"/\")\n .map((segment) => {\n // 数値のみ or UUID 的なセグメントをワイルドカード化\n if (/^\\d+$/.test(segment)) return \"*\";\n if (/^[0-9a-f]{8,}$/i.test(segment)) return \"*\";\n return segment;\n })\n .join(\"/\");\n return `${parsed.hostname}${normalizedPath}`;\n } catch {\n return url;\n }\n}\n\n/**\n * セレクタから ref 番号に依存しない識別子を生成する。\n * role + name ベースで、スナップショットの ref 番号が変わっても同じヒントになる。\n */\nfunction buildSelectorHint(selector: Selector): string {\n const parts: string[] = [];\n if (selector.role) parts.push(`role:${selector.role}`);\n if (selector.name) parts.push(`name:${selector.name}`);\n if (selector.ariaLabel) parts.push(`aria:${selector.ariaLabel}`);\n if (selector.dataTestId) parts.push(`testid:${selector.dataTestId}`);\n return parts.join(\"|\") || \"unknown\";\n}\n","/**\n * selector-cache — セレクタ解決キャッシュ\n *\n * 成功した selector → ref マッピングを永続化し、\n * 再実行時に AI 呼び出しをスキップする高速パスを提供する。\n * キャッシュされた ref が stale(ページ上に存在しない)場合は\n * 無効化して通常の AI 解決にフォールバックする(self-healing loop)。\n *\n * executor / debugger から利用。generator では使用しない。\n */\n\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { join, dirname, basename } from \"node:path\";\nimport type { Selector } from \"../instruction-executor/types\";\n\nexport interface CacheEntry {\n /** 解決済み ref(@ なし。例: \"e3\") */\n ref: string;\n /** 解決時刻 ISO8601 */\n resolvedAt: string;\n /** 解決時のスナップショットハッシュ */\n snapshotHash: string;\n /** キャッシュヒット成功回数 */\n hitCount: number;\n}\n\nexport interface SelectorCache {\n version: number;\n instructionPath: string;\n entries: Record<string, CacheEntry>;\n}\n\n/**\n * キャッシュキーを生成する。\n * フォーマット: `{stepOrdinal}:{urlWithoutQuery}:{selectorHash}`\n */\nexport function buildCacheKey(\n stepOrdinal: number,\n url: string,\n selector: Selector,\n): string {\n const selectorHash = createHash(\"sha256\")\n .update(JSON.stringify(selector))\n .digest(\"hex\")\n .slice(0, 12);\n const urlNormalized = url.split(\"?\")[0];\n return `${stepOrdinal}:${urlNormalized}:${selectorHash}`;\n}\n\n/**\n * スナップショット文字列のハッシュを生成する。\n */\nexport function buildSnapshotHash(snapshot: string): string {\n return createHash(\"sha256\").update(snapshot).digest(\"hex\").slice(0, 16);\n}\n\n/**\n * キャッシュファイルのパスを返す。\n * 指示書 YAML と同じディレクトリに `{basename}.selector-cache.json`。\n */\nexport function cacheFilePath(instructionPath: string): string {\n const dir = dirname(instructionPath);\n const base = basename(instructionPath, \".yaml\");\n return join(dir, `${base}.selector-cache.json`);\n}\n\n/**\n * キャッシュファイルを読み込む。存在しない/パース失敗時は空のキャッシュを返す。\n */\nexport async function loadCache(instructionPath: string): Promise<SelectorCache> {\n const path = cacheFilePath(instructionPath);\n if (!existsSync(path)) {\n return { version: 1, instructionPath, entries: {} };\n }\n try {\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw) as SelectorCache;\n } catch {\n return { version: 1, instructionPath, entries: {} };\n }\n}\n\n/**\n * キャッシュをファイルに書き出す。書き込み失敗はサイレントに無視する。\n */\nexport async function saveCache(cache: SelectorCache): Promise<void> {\n const path = cacheFilePath(cache.instructionPath);\n try {\n await writeFile(path, JSON.stringify(cache, null, 2), \"utf-8\");\n } catch {\n // キャッシュ書き込み失敗は non-fatal\n }\n}\n\n/**\n * キャッシュエントリをルックアップする。\n */\nexport function lookupCache(\n cache: SelectorCache,\n key: string,\n): CacheEntry | undefined {\n return cache.entries[key];\n}\n\n/**\n * キャッシュエントリを追加または更新する。\n */\nexport function updateCache(\n cache: SelectorCache,\n key: string,\n ref: string,\n snapshotHash: string,\n): void {\n const existing = cache.entries[key];\n cache.entries[key] = {\n ref,\n resolvedAt: new Date().toISOString(),\n snapshotHash,\n hitCount: (existing?.hitCount ?? 0) + 1,\n };\n}\n\n/**\n * キャッシュエントリを無効化(削除)する。\n */\nexport function invalidateCacheEntry(cache: SelectorCache, key: string): void {\n delete cache.entries[key];\n}\n","/**\n * goal-agent — セレクタ解決が全フェーズ失敗した後の最終フォールバック\n *\n * ページ全体のスナップショットとステップの目的を AI に渡し、\n * 代替操作パス(折り畳み展開、モーダル閉じ、別要素等)を探させる。\n *\n * executor / debugger から利用。generator では Mastra Agent が自律的に再試行するため不使用。\n */\n\nimport { z } from \"zod\";\nimport { getModel, trackedGenerateObject } from \"./ai-model\";\nimport { buildFallbackMessages } from \"../i18n/prompts\";\nimport { findElementInSnapshot } from \"../browser/snapshot-parser\";\nimport { filterSnapshot } from \"../browser/snapshot-filter\";\nimport type { Selector } from \"../instruction-executor/types\";\nimport type { AgentBrowser } from \"../browser/browser-client\";\nimport type { DebugLogger } from \"../cli/debug-logger\";\n\nexport type AlternativeStrategy =\n | \"direct_ref\"\n | \"scroll_up_and_retry\"\n | \"expand_collapsed\"\n | \"dismiss_overlay\"\n | \"tab_navigation\"\n | \"not_found\";\n\nconst agentFallbackSchema = z.object({\n analysis: z.string().describe(\"ページの現状の分析(200字以内)\"),\n alternativeRef: z.string().describe(\n \"代替となる操作対象要素のref値(例: e5)。@は含めない。見つからない場合は空文字。\",\n ),\n alternativeStrategy: z.enum([\n \"direct_ref\",\n \"scroll_up_and_retry\",\n \"expand_collapsed\",\n \"dismiss_overlay\",\n \"tab_navigation\",\n \"not_found\",\n ]).describe(\"推奨する代替戦略\"),\n prerequisiteRef: z.string().optional().describe(\n \"alternativeStrategy が expand_collapsed/dismiss_overlay の場合: 先に操作する要素のref\",\n ),\n reasoning: z.string().describe(\"代替パスを選んだ理由(100字以内)\"),\n});\n\nexport interface AgentFallbackResult {\n success: boolean;\n alternativeRef: string;\n alternativeStrategy: AlternativeStrategy;\n prerequisiteRef?: string;\n analysis: string;\n reasoning: string;\n}\n\nexport interface GoalAgentStep {\n description: string;\n action: {\n type: string;\n selector?: Selector;\n };\n}\n\n/**\n * 全リトライ + スクロール回復が失敗した後に呼び出す。\n * ページ上部にスクロールし、完全スナップショットを取得して AI に代替パスを探させる。\n */\nexport async function runGoalAgent(\n browser: AgentBrowser,\n step: GoalAgentStep,\n failureHistory: string[],\n contextMarkdown?: string,\n debugLogger?: DebugLogger,\n): Promise<AgentFallbackResult> {\n // ページ上部にスクロールして全体を見渡す\n try {\n await browser.scroll(\"up\", 2000);\n await browser.waitForDOMStability(3000);\n } catch {\n // スクロール失敗は無視して続行\n }\n\n const fullSnapshot = filterSnapshot(await browser.snapshot());\n const currentUrl = await browser.url();\n\n const { system, userPrompt } = buildFallbackMessages(\n fullSnapshot,\n step,\n failureHistory,\n currentUrl,\n contextMarkdown,\n );\n\n try {\n const { object } = await trackedGenerateObject(\"fallback\", {\n model: getModel(\"fallback\"),\n messages: [\n {\n role: \"system\",\n content: system,\n providerOptions: {\n anthropic: { cacheControl: { type: \"ephemeral\" } },\n },\n },\n { role: \"user\", content: userPrompt },\n ],\n schema: agentFallbackSchema,\n temperature: 0.3,\n });\n\n if (object.alternativeStrategy === \"not_found\" || !object.alternativeRef) {\n return { ...object, alternativeRef: object.alternativeRef ?? \"\", success: false };\n }\n\n // 前提操作が必要な場合は実行\n if (\n object.prerequisiteRef &&\n (object.alternativeStrategy === \"expand_collapsed\" ||\n object.alternativeStrategy === \"dismiss_overlay\")\n ) {\n debugLogger?.log({\n phase: \"executor\",\n event: \"agent_fallback_prerequisite\",\n data: {\n strategy: object.alternativeStrategy,\n prerequisiteRef: object.prerequisiteRef,\n },\n });\n\n try {\n await browser.click(`@${object.prerequisiteRef}`);\n await browser.waitForDOMStability(2000);\n } catch {\n return { ...object, alternativeRef: object.alternativeRef ?? \"\", success: false };\n }\n\n // 前提操作後にターゲット要素が存在するか確認\n const updatedSnapshot = await browser.snapshot();\n if (findElementInSnapshot(updatedSnapshot, object.alternativeRef) === null) {\n return { ...object, success: false };\n }\n }\n\n return { ...object, success: true };\n } catch {\n return {\n analysis: \"AI呼び出しに失敗\",\n alternativeRef: \"\",\n alternativeStrategy: \"not_found\",\n reasoning: \"AI fallback failed\",\n success: false,\n };\n }\n}\n\n// buildFallbackMessages is now dispatched via i18n/prompts\n","/**\n * vision-resolver — スクリーンショットベースのセレクタ解決\n *\n * A11y ツリーのテキストベース解決が失敗した場合のフォールバック。\n * アノテーション付きスクリーンショットを AI に渡し、\n * 視覚的に要素を特定して対応する ref を返す。\n *\n * canvas、Shadow DOM、iframe、カスタム Web Components など\n * A11y ツリーに表れない要素に有効。\n */\n\nimport { z } from \"zod\";\nimport { getModel, trackedGenerateObject, withAIRetry } from \"./ai-model\";\nimport { buildVisionMessages as buildVisionMessagesI18n } from \"../i18n/prompts\";\nimport type { Selector } from \"../instruction-executor/types\";\nimport type { Annotation } from \"../browser/agent-browser-imports\";\nimport type { DebugLogger } from \"../cli/debug-logger\";\n\nconst visionResponseSchema = z.object({\n reasoning: z.string().describe(\n \"スクリーンショット内で要素を特定した理由(1-3文)\",\n ),\n ref: z.string().describe(\n \"特定した要素の ref 値(例: e3)。@は含めない。該当する要素が見つからない場合は空文字\",\n ),\n annotationNumber: z.number().optional().describe(\n \"特定した要素のアノテーション番号(スクリーンショット上の番号ラベル)\",\n ),\n confidence: z.number().min(0).max(1).describe(\n \"特定の確信度(0.0-1.0)\",\n ),\n});\n\nexport interface VisionResolveResult {\n ref: string;\n reasoning: string;\n annotationNumber?: number;\n confidence: number;\n}\n\n/**\n * アノテーション付きスクリーンショットを AI に渡してセレクタを解決する。\n *\n * @returns 解決結果。要素が見つからない場合は null。\n */\nexport async function resolveWithVision(\n imageBuffer: Buffer,\n annotations: Annotation[],\n selector: Selector,\n stepDescription: string,\n url: string,\n failureHistory: string[],\n debugLogger?: DebugLogger,\n): Promise<VisionResolveResult | null> {\n debugLogger?.log({\n phase: \"executor\",\n event: \"vision_fallback_start\",\n data: {\n annotationCount: annotations.length,\n selector,\n stepDescription,\n url,\n failureHistoryCount: failureHistory.length,\n },\n });\n\n // アノテーションが空ならスキップ(ページに要素が全くない場合)\n if (annotations.length === 0) {\n debugLogger?.log({\n phase: \"executor\",\n event: \"vision_fallback_skip\",\n data: { reason: \"no annotations\" },\n });\n return null;\n }\n\n const { system, userTextContent } = buildVisionMessagesI18n(\n annotations,\n selector,\n stepDescription,\n url,\n failureHistory,\n );\n\n try {\n const { object } = await withAIRetry(\n () =>\n trackedGenerateObject(\"vision\", {\n model: getModel(\"vision\"),\n messages: [\n {\n role: \"system\",\n content: system,\n providerOptions: {\n anthropic: { cacheControl: { type: \"ephemeral\" } },\n },\n },\n {\n role: \"user\",\n content: [\n { type: \"text\", text: userTextContent },\n { type: \"image\", image: imageBuffer },\n ],\n },\n ],\n schema: visionResponseSchema,\n temperature: 0,\n }),\n { label: \"vision-resolve\" },\n );\n\n debugLogger?.log({\n phase: \"executor\",\n event: \"vision_fallback_result\",\n data: {\n ref: object.ref,\n reasoning: object.reasoning,\n annotationNumber: object.annotationNumber,\n confidence: object.confidence,\n },\n });\n\n if (!object.ref) return null;\n\n // バリデーション: ref がアノテーション内に存在するか確認\n const matchingAnnotation = annotations.find((a) => a.ref === object.ref);\n if (!matchingAnnotation) {\n debugLogger?.log({\n phase: \"executor\",\n event: \"vision_fallback_invalid_ref\",\n data: {\n ref: object.ref,\n availableRefs: annotations.map((a) => a.ref),\n },\n });\n return null;\n }\n\n return {\n ref: object.ref,\n reasoning: object.reasoning,\n annotationNumber: object.annotationNumber,\n confidence: object.confidence,\n };\n } catch (error) {\n debugLogger?.log({\n phase: \"executor\",\n event: \"vision_fallback_error\",\n data: { error: error instanceof Error ? error.message : String(error) },\n });\n return null;\n }\n}\n\n/** @internal テスト用にエクスポート(i18n ディスパッチャー経由) */\nexport { buildVisionMessagesI18n as buildVisionMessages };\n","/**\n * action-validator — アクション事前バリデーション\n *\n * ref 解決後、アクション実行前にアクションの妥当性を検証する。\n * browser-use の Pydantic ベースバリデーション、\n * Stagehand の observe → act パターンを参考に、\n * 無効なアクション実行を事前に回避する。\n */\n\nimport {\n findElementInSnapshot,\n type ParsedSnapshotElement,\n} from \"../browser/snapshot-parser\";\nimport type { RefMap } from \"../browser/agent-browser-imports\";\n\nexport interface ValidationError {\n code: \"ref_not_found\" | \"type_mismatch\" | \"value_required\" | \"selector_missing\";\n message: string;\n}\n\nexport interface ValidationWarning {\n code: \"element_disabled\" | \"possible_overlay\" | \"element_readonly\";\n message: string;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings: ValidationWarning[];\n}\n\n/** action タイプごとに互換性のある role の一覧 */\nconst COMPATIBLE_ROLES: Record<string, Set<string>> = {\n click: new Set([\n \"button\",\n \"link\",\n \"checkbox\",\n \"radio\",\n \"tab\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"switch\",\n \"option\",\n \"treeitem\",\n \"row\",\n \"cell\",\n \"gridcell\",\n \"img\",\n \"figure\",\n ]),\n input: new Set([\"textbox\", \"searchbox\", \"combobox\", \"spinbutton\", \"textarea\"]),\n select: new Set([\"combobox\", \"listbox\", \"select\"]),\n hover: new Set(), // 空 = 全ロール OK\n};\n\n/** click は幅広いため、明示的に非互換なロールだけ定義 */\nconst CLICK_INCOMPATIBLE_ROLES = new Set([\n \"textbox\",\n \"searchbox\",\n \"textarea\",\n \"spinbutton\",\n]);\n\n/** 値が必要なアクションタイプ */\nconst VALUE_REQUIRED_ACTIONS = new Set([\"input\", \"select\"]);\n\n/** ロール文字列が有効な ARIA ロールかを簡易判定 */\nfunction isValidRole(role: string): boolean {\n return role.length > 1 && /^[a-z]/.test(role);\n}\n\n/**\n * アクション実行前にバリデーションを行う。\n *\n * @param snapshot - 現在のアクセシビリティスナップショット\n * @param ref - 解決済みの ref 値(@ なし、例: \"e3\")\n * @param actionType - アクション種別(click, input, select, hover 等)\n * @param value - アクション実行時の値(input, select で使用)\n * @param refs - RefMap(構造化データ)。渡された場合はテキストパースを回避\n */\nexport function validateAction(\n snapshot: string,\n ref: string,\n actionType: string,\n value?: string,\n refs?: RefMap,\n): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // 1. ref から要素情報を取得(RefMap 優先、フォールバックでテキストパース)\n let element: ParsedSnapshotElement | null = null;\n const refEntry = refs?.[ref];\n if (refEntry) {\n element = { ref, role: refEntry.role, name: refEntry.name ?? \"\", attributes: {} };\n } else {\n element = findElementInSnapshot(snapshot, ref);\n }\n\n if (!element) {\n errors.push({\n code: \"ref_not_found\",\n message: `[ref=${ref}] がスナップショット内に存在しません`,\n });\n // ref が見つからない場合、他のチェックは不可\n return { valid: false, errors, warnings };\n }\n\n // 2. action と role の互換性チェック\n const normalizedAction = normalizeActionType(actionType);\n\n // パーサーが不正なロールを返した場合は type_mismatch チェックをスキップ(安全ガード)\n if (normalizedAction !== \"hover\" && isValidRole(element.role)) {\n const compatible = COMPATIBLE_ROLES[normalizedAction];\n if (compatible && compatible.size > 0) {\n // 明示的な互換リストがある場合\n if (!compatible.has(element.role)) {\n // click は広範囲に互換だが、テキスト入力系は非互換\n if (normalizedAction === \"click\" && !CLICK_INCOMPATIBLE_ROLES.has(element.role)) {\n // click は互換リスト外でも、明示的非互換でなければ警告止まり\n } else {\n errors.push({\n code: \"type_mismatch\",\n message: `アクション \"${actionType}\" は role=\"${element.role}\" の要素と互換性がありません(ref=${ref})`,\n });\n }\n }\n }\n }\n\n // 3. 値が必要なアクションで値が空\n if (VALUE_REQUIRED_ACTIONS.has(normalizedAction) && (!value || value.trim() === \"\")) {\n errors.push({\n code: \"value_required\",\n message: `アクション \"${actionType}\" には値が必要です(ref=${ref})`,\n });\n }\n\n // 4. disabled チェック\n if (element.attributes.disabled || element.attributes.disabled === \"true\") {\n warnings.push({\n code: \"element_disabled\",\n message: `要素が disabled です(ref=${ref}, role=${element.role})`,\n });\n }\n\n // 5. readonly チェック\n if (element.attributes.readonly || element.attributes.readonly === \"true\") {\n if (normalizedAction === \"input\") {\n warnings.push({\n code: \"element_readonly\",\n message: `要素が readonly です(ref=${ref}, role=${element.role})`,\n });\n }\n }\n\n // 6. overlay(dialog)チェック\n const overlayWarning = checkOverlay(snapshot, ref);\n if (overlayWarning) {\n warnings.push(overlayWarning);\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/** アクションタイプを正規化 */\nfunction normalizeActionType(actionType: string): string {\n switch (actionType) {\n case \"fill\":\n case \"type\":\n case \"input\":\n return \"input\";\n case \"click\":\n return \"click\";\n case \"select\":\n return \"select\";\n case \"hover\":\n return \"hover\";\n default:\n return actionType;\n }\n}\n\n/**\n * dialog/alertdialog が存在し、ターゲット要素が dialog 外にある場合に警告を返す。\n * スナップショットのインデント構造から、要素が dialog のネスト内にあるか判定する。\n */\nfunction checkOverlay(snapshot: string, targetRef: string): ValidationWarning | null {\n const lines = snapshot.split(\"\\n\");\n\n // dialog/alertdialog の行インデックスとインデントレベルを取得\n let dialogLineIndex = -1;\n let dialogIndent = -1;\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trimStart();\n if (trimmed.startsWith(\"dialog\") || trimmed.startsWith(\"alertdialog\")) {\n dialogLineIndex = i;\n dialogIndent = lines[i].length - trimmed.length;\n break;\n }\n }\n\n if (dialogLineIndex === -1) return null;\n\n // ターゲット ref の行を探す\n const refPattern = `[ref=${targetRef}]`;\n let targetLineIndex = -1;\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].includes(refPattern)) {\n targetLineIndex = i;\n break;\n }\n }\n\n if (targetLineIndex === -1) return null;\n\n // ターゲットが dialog の後にあり、dialog のインデント以下なら dialog 内\n if (targetLineIndex > dialogLineIndex) {\n const targetIndent = lines[targetLineIndex].length - lines[targetLineIndex].trimStart().length;\n if (targetIndent > dialogIndent) {\n // dialog 内 → 問題なし\n return null;\n }\n }\n\n // ターゲットが dialog 前、または dialog 外のインデント → 警告\n return {\n code: \"possible_overlay\",\n message: `dialog/alertdialog が存在し、ターゲット要素(ref=${targetRef})がその外側にあります。モーダルに遮られている可能性があります`,\n };\n}\n","/**\n * deterministic-resolver — 決定論的セレクタ解決\n *\n * AI を呼び出す前に、スナップショット内の要素をパターンマッチで直接解決する。\n * キャッシュが空でも AI なしで解決できるケースを増やし、安定性とコストを改善する。\n *\n * Stagehand の observe → act パターン、\n * browser-use のインデックスベース参照を参考。\n */\n\nimport {\n parseAllElements,\n} from \"../browser/snapshot-parser\";\nimport type { RefMap } from \"../browser/agent-browser-imports\";\nimport type { Selector } from \"../instruction-executor/types\";\n\nexport type MatchType =\n | \"exact_role_and_name\"\n | \"exact_name\"\n | \"role_and_partial_name\"\n | \"role_and_text\"\n | null;\n\nexport interface DeterministicResolveResult {\n /** 解決された ref 値(@ なし、例: \"e3\")。解決失敗時は null */\n ref: string | null;\n /** マッチの種類 */\n matchType: MatchType;\n /** マッチの信頼度(0-1) */\n confidence: number;\n}\n\n/**\n * セレクタ情報からスナップショット内の要素を決定論的に解決する。\n *\n * マッチング優先順位(上から順に試行):\n * 1. role + ariaLabel 完全一致(confidence: 1.0)\n * 2. ariaLabel 完全一致(role 不一致でも)(confidence: 0.9)\n * 3. role + ariaLabel 部分一致(大文字小文字無視)(confidence: 0.7)\n * 4. role + text 部分一致(confidence: 0.6)\n *\n * 候補が 1 件かつ confidence ≥ 0.9 → 確定\n * 候補が複数、または confidence < 0.9 → null(AI に委譲)\n *\n * @param snapshot - 現在のアクセシビリティスナップショット\n * @param selector - セレクタ情報(ariaLabel, role, text 等)\n * @param refs - RefMap(構造化データ)。渡された場合はテキストパースを回避\n * @returns 解決結果\n */\nexport function resolveDeterministic(\n snapshot: string,\n selector: Selector,\n refs?: RefMap,\n): DeterministicResolveResult {\n const noMatch: DeterministicResolveResult = {\n ref: null,\n matchType: null,\n confidence: 0,\n };\n\n // RefMap 優先、フォールバックでテキストパース\n const elements: Array<{ ref: string; role: string; name: string }> = [];\n if (refs) {\n for (const [ref, entry] of Object.entries(refs)) {\n elements.push({ ref, role: entry.role, name: entry.name ?? \"\" });\n }\n } else {\n elements.push(...parseAllElements(snapshot));\n }\n if (elements.length === 0) return noMatch;\n\n const selectorRole = normalizeString(selector.role);\n const selectorAriaLabel = normalizeString(selector.ariaLabel);\n const selectorText = normalizeString(selector.text);\n\n // ariaLabel も text もなければパターンマッチ不可\n if (!selectorAriaLabel && !selectorText) return noMatch;\n\n // シングルパス: 各要素を1回だけ走査し、全優先度のバケットに振り分ける。\n // 事前に toLowerCase を1回だけ計算してループ内の再計算を回避する。\n const labelLower = selectorAriaLabel?.toLowerCase();\n const textLower = selectorText?.toLowerCase();\n\n // 各優先度の候補バケット(最大1件 or 複数件を追跡)\n type Bucket = { ref: string; count: number };\n let p1: Bucket | null = null; // role + ariaLabel 完全一致\n let p2: Bucket | null = null; // ariaLabel 完全一致(role 不問)\n let p3: Bucket | null = null; // role + ariaLabel 部分一致\n let p4: Bucket | null = null; // role + text 部分一致\n let p5: Bucket | null = null; // ariaLabel のみ部分一致(role なし)\n\n for (const el of elements) {\n const nameExact = selectorAriaLabel ? el.name === selectorAriaLabel : false;\n const roleMatch = selectorRole ? el.role === selectorRole : false;\n\n // 優先度 1: role + ariaLabel 完全一致 (confidence: 1.0)\n if (roleMatch && nameExact) {\n if (!p1) { p1 = { ref: el.ref, count: 1 }; }\n else { p1.count++; }\n // confidence 1.0 で候補1件なら即確定(ここでは count を見て最後に判定)\n }\n\n // 優先度 2: ariaLabel 完全一致(role 不問)(confidence: 0.9)\n if (nameExact) {\n if (!p2) { p2 = { ref: el.ref, count: 1 }; }\n else { p2.count++; }\n }\n\n // 部分一致は toLowerCase が必要\n const nameLower = (labelLower || textLower) ? el.name.toLowerCase() : \"\";\n\n // 優先度 3: role + ariaLabel 部分一致 (confidence: 0.7)\n if (roleMatch && labelLower && nameLower.includes(labelLower)) {\n if (!p3) { p3 = { ref: el.ref, count: 1 }; }\n else { p3.count++; }\n }\n\n // 優先度 4: role + text 部分一致 (confidence: 0.6)\n if (roleMatch && textLower && nameLower.includes(textLower)) {\n if (!p4) { p4 = { ref: el.ref, count: 1 }; }\n else { p4.count++; }\n }\n\n // 優先度 5: ariaLabel のみの部分一致(role なし)(confidence: 0.6)\n if (!selectorRole && labelLower && nameLower.includes(labelLower)) {\n if (!p5) { p5 = { ref: el.ref, count: 1 }; }\n else { p5.count++; }\n }\n }\n\n // 優先度順に候補1件のバケットを返す\n if (p1 && p1.count === 1) return { ref: p1.ref, matchType: \"exact_role_and_name\", confidence: 1.0 };\n if (p2 && p2.count === 1) return { ref: p2.ref, matchType: \"exact_name\", confidence: 0.9 };\n if (p3 && p3.count === 1) return { ref: p3.ref, matchType: \"role_and_partial_name\", confidence: 0.7 };\n if (p4 && p4.count === 1) return { ref: p4.ref, matchType: \"role_and_text\", confidence: 0.6 };\n if (p5 && p5.count === 1) return { ref: p5.ref, matchType: \"role_and_partial_name\", confidence: 0.6 };\n\n return noMatch;\n}\n\n/** unknown 値を安全に string | undefined に変換 */\nfunction normalizeString(value: unknown): string | undefined {\n if (typeof value === \"string\" && value.trim() !== \"\") {\n return value.trim();\n }\n return undefined;\n}\n","/**\n * confirmation --- ConfirmationProvider インターフェース + 純粋ロジック\n *\n * TTY / HTTP の承認方式を抽象化する。\n */\n\nimport type { ParsedStep } from \"../instruction-executor/types\";\n\nexport type ConfirmationResult = \"approve\" | \"skip\" | \"abort\";\n\n/** confirm() に渡す追加コンテキスト */\nexport interface ConfirmationContext {\n /** 指示書のゴール(業務内容) */\n goal: string;\n}\n\n/**\n * ステップ実行前の承認プロバイダ。\n * CLI 実装は CliConfirmationProvider (instruction-executor/confirmation.ts)、\n * 将来の HTTP 実装は POST /execute-respond に対応。\n */\nexport interface ConfirmationProvider {\n confirm(step: ParsedStep, stepIndex: number, context?: ConfirmationContext): Promise<ConfirmationResult>;\n dispose?(): Promise<void>;\n}\n\n/**\n * ステップが承認を必要とするか判定(純粋ロジック)\n */\nexport function needsConfirmation(step: ParsedStep, skipAll: boolean): boolean {\n if (skipAll) return false;\n return step.requiresConfirmation;\n}\n","/**\n * confirmation --- CLI 実装の ConfirmationProvider\n */\n\nimport { promptSelect, formatRiskHint, note } from \"../cli/prompts\";\nimport type { ConfirmationProvider, ConfirmationResult, ConfirmationContext } from \"../harness/confirmation\";\nimport type { ParsedStep } from \"./types\";\nimport { t, tf } from \"../i18n\";\n\nexport type { ConfirmationResult } from \"../harness/confirmation\";\nexport { needsConfirmation } from \"../harness/confirmation\";\n\n/**\n * CLI (TTY) 用の承認プロバイダ\n */\nexport class CliConfirmationProvider implements ConfirmationProvider {\n async confirm(step: ParsedStep, _stepIndex: number, _context?: ConfirmationContext): Promise<ConfirmationResult> {\n return promptConfirmation(step);\n }\n}\n\n/**\n * ステップ実行前の承認プロンプトを表示\n */\nexport async function promptConfirmation(\n step: ParsedStep,\n): Promise<ConfirmationResult> {\n note(\n `${tf(\"confirmation.stepInfo\", { ordinal: step.ordinal, description: step.description })}\\n${tf(\"confirmation.riskLevelLabel\", { level: step.riskLevel, hint: formatRiskHint(step.riskLevel) })}`,\n t(\"confirmation.title\"),\n );\n\n return promptSelect<ConfirmationResult>(t(\"confirmation.selectAction\"), [\n { value: \"approve\", label: t(\"confirmation.approve\") },\n { value: \"skip\", label: t(\"confirmation.skip\") },\n { value: \"abort\", label: t(\"confirmation.abort\"), hint: t(\"confirmation.abortHint\") },\n ]);\n}\n","/**\n * capture-executor — ランタイムキャプチャの実行\n *\n * ステップ実行後にページから値を取得し、RuntimeStore に格納する。\n */\n\nimport { z } from \"zod\";\nimport { getModel, trackedGenerateObject, withAIRetry } from \"../harness/ai-model\";\nimport { filterSnapshot } from \"../browser/snapshot-filter\";\nimport type { AgentBrowser } from \"../browser/browser-client\";\nimport type { StepCapture } from \"../instruction-executor/types\";\nimport type { RuntimeStore } from \"./runtime-store\";\nimport { log } from \"../cli/prompts\";\n\nconst captureValueSchema = z.object({\n value: z.string().nullable().describe(\"抽出した値。見つからない場合はnull\"),\n});\n\n/**\n * 単一のキャプチャ定義を実行し、取得した値を返す。\n * 取得できなかった場合は null を返す。\n */\nexport async function executeCapture(\n browser: AgentBrowser,\n capture: StepCapture,\n store: RuntimeStore,\n): Promise<string | null> {\n switch (capture.strategy) {\n case \"snapshot\":\n return captureFromSnapshot(browser, capture);\n case \"url\":\n return captureFromUrl(browser, capture);\n case \"ai\":\n return captureWithAI(browser, capture);\n case \"expression\":\n return captureFromExpression(capture, store);\n case \"evaluate\":\n return captureWithEvaluate(browser, capture);\n default:\n log.warn(`Unknown capture strategy: ${capture.strategy}`);\n return null;\n }\n}\n\nasync function captureFromSnapshot(\n browser: AgentBrowser,\n capture: StepCapture,\n): Promise<string | null> {\n if (!capture.pattern) {\n log.warn(`Capture \"${capture.name}\": snapshot strategy requires pattern`);\n return null;\n }\n\n const snapshot = await browser.snapshot();\n let re: RegExp;\n try {\n re = new RegExp(capture.pattern);\n } catch {\n log.warn(`Capture \"${capture.name}\": invalid regex pattern: ${capture.pattern}`);\n return null;\n }\n const match = re.exec(snapshot);\n\n if (!match) {\n return null;\n }\n\n const group = capture.group ?? 1;\n return match[group] ?? match[0] ?? null;\n}\n\nasync function captureFromUrl(\n browser: AgentBrowser,\n capture: StepCapture,\n): Promise<string | null> {\n if (!capture.pattern) {\n log.warn(`Capture \"${capture.name}\": url strategy requires pattern`);\n return null;\n }\n\n const currentUrl = await browser.url();\n let re: RegExp;\n try {\n re = new RegExp(capture.pattern);\n } catch {\n log.warn(`Capture \"${capture.name}\": invalid regex pattern: ${capture.pattern}`);\n return null;\n }\n const match = re.exec(currentUrl);\n\n if (!match) {\n return null;\n }\n\n const group = capture.group ?? 1;\n return match[group] ?? match[0] ?? null;\n}\n\n/** 静的なキャプチャ用システムプロンプト(キャッシュ対象) */\nconst CAPTURE_SYSTEM_PROMPT = \"以下のページスナップショットから情報を抽出してください。抽出対象の説明に基づいて、スナップショット内から該当する値を特定して返してください。\";\n\nasync function captureWithAI(\n browser: AgentBrowser,\n capture: StepCapture,\n): Promise<string | null> {\n if (!capture.prompt) {\n log.warn(`Capture \"${capture.name}\": ai strategy requires prompt`);\n return null;\n }\n\n const snapshot = filterSnapshot(await browser.snapshot());\n const currentUrl = await browser.url();\n\n const userPrompt = [\n `## 抽出対象`,\n capture.prompt,\n \"\",\n `## 現在のURL`,\n currentUrl,\n \"\",\n `## スナップショット`,\n snapshot,\n ].join(\"\\n\");\n\n try {\n const { object } = await withAIRetry(\n () =>\n trackedGenerateObject(\"extraction\", {\n model: getModel(\"extraction\"),\n messages: [\n {\n role: \"system\",\n content: CAPTURE_SYSTEM_PROMPT,\n providerOptions: {\n anthropic: { cacheControl: { type: \"ephemeral\" } },\n },\n },\n { role: \"user\", content: userPrompt },\n ],\n schema: captureValueSchema,\n temperature: 0,\n }),\n { label: \"capture-ai\" },\n );\n\n return object.value ?? null;\n } catch (error) {\n log.warn(\n `Capture \"${capture.name}\" AI extraction failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n return null;\n }\n}\n\nasync function captureWithEvaluate(\n browser: AgentBrowser,\n capture: StepCapture,\n): Promise<string | null> {\n if (!capture.expression) {\n log.warn(`Capture \"${capture.name}\": evaluate strategy requires expression (JavaScript code)`);\n return null;\n }\n\n try {\n const result = await browser.evaluate(capture.expression);\n if (result === null || result === undefined) {\n return null;\n }\n return typeof result === \"string\" ? result : JSON.stringify(result);\n } catch (error) {\n log.warn(\n `Capture \"${capture.name}\" evaluate failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n return null;\n }\n}\n\nfunction captureFromExpression(\n capture: StepCapture,\n store: RuntimeStore,\n): string | null {\n if (!capture.expression) {\n log.warn(`Capture \"${capture.name}\": expression strategy requires expression`);\n return null;\n }\n\n const result = store.resolveTemplate(capture.expression);\n // 未解決テンプレートが残っていたら失敗とみなす\n if (/\\{\\{\\w+\\}\\}/.test(result)) {\n return null;\n }\n return result;\n}\n","/**\n * expression-evaluator -- 安全な条件式評価器\n *\n * eval() / Function() を使わず、限定的な比較式を評価する。\n *\n * サポートする構文:\n * - 比較: ===, !==, ==, !=, <, >, <=, >=\n * - 否定: !operand\n * - truthy チェック: 単一オペランド\n * - オペランド: 文字列リテラル ('...' / \"...\"), 数値, true/false, bareワード\n */\n\nexport interface EvalResult {\n value: boolean;\n error?: string;\n}\n\ntype Operand = string | number | boolean;\n\nconst COMPARISON_OPERATORS = [\"===\", \"!==\", \"==\", \"!=\", \"<=\", \">=\", \"<\", \">\"] as const;\ntype ComparisonOperator = (typeof COMPARISON_OPERATORS)[number];\n\n/**\n * 条件式を評価する。\n * テンプレート展開は呼び出し側で事前に行うこと。\n */\nexport function evaluateCondition(expression: string): EvalResult {\n const trimmed = expression.trim();\n if (!trimmed) {\n return { value: false, error: \"Empty expression\" };\n }\n\n // 否定: !operand\n if (trimmed.startsWith(\"!\") && !trimmed.startsWith(\"!=\")) {\n const inner = trimmed.slice(1).trim();\n const operand = parseOperand(inner);\n if (operand === undefined) {\n return { value: false, error: `Cannot parse operand: ${inner}` };\n }\n return { value: !isTruthy(operand) };\n }\n\n // 比較演算子を探す\n const comparison = findComparison(trimmed);\n if (comparison) {\n const { left, operator, right } = comparison;\n const leftVal = parseOperand(left);\n const rightVal = parseOperand(right);\n if (leftVal === undefined) {\n return { value: false, error: `Cannot parse left operand: ${left}` };\n }\n if (rightVal === undefined) {\n return { value: false, error: `Cannot parse right operand: ${right}` };\n }\n return { value: compare(leftVal, rightVal, operator) };\n }\n\n // truthy チェック: 単一オペランド\n const operand = parseOperand(trimmed);\n if (operand === undefined) {\n return { value: false, error: `Cannot parse expression: ${trimmed}` };\n }\n return { value: isTruthy(operand) };\n}\n\nfunction findComparison(\n expr: string,\n): { left: string; operator: ComparisonOperator; right: string } | null {\n // 長い演算子から先にマッチさせる\n for (const op of COMPARISON_OPERATORS) {\n // 文字列リテラル内の演算子を避けるため、リテラル外で探す\n const idx = findOperatorOutsideStrings(expr, op);\n if (idx !== -1) {\n return {\n left: expr.slice(0, idx).trim(),\n operator: op,\n right: expr.slice(idx + op.length).trim(),\n };\n }\n }\n return null;\n}\n\nfunction findOperatorOutsideStrings(expr: string, op: string): number {\n let inSingle = false;\n let inDouble = false;\n for (let i = 0; i < expr.length; i++) {\n const ch = expr[i];\n if (ch === \"'\" && !inDouble && (i === 0 || expr[i - 1] !== \"\\\\\")) {\n inSingle = !inSingle;\n } else if (ch === '\"' && !inSingle && (i === 0 || expr[i - 1] !== \"\\\\\")) {\n inDouble = !inDouble;\n } else if (!inSingle && !inDouble) {\n if (expr.slice(i, i + op.length) === op) {\n // ===, !== は == や != より先にマッチ済みなので OK\n // ただし < が <= の一部でないか確認\n if (op === \"<\" && expr[i + 1] === \"=\") continue;\n if (op === \">\" && expr[i + 1] === \"=\") continue;\n if (op === \"=\" && op.length === 1) continue; // 単独 = は無視\n if (op === \"==\" && expr[i + 2] === \"=\") continue;\n if (op === \"!=\" && expr[i + 2] === \"=\") continue;\n return i;\n }\n }\n }\n return -1;\n}\n\nfunction parseOperand(raw: string): Operand | undefined {\n const trimmed = raw.trim();\n if (!trimmed) return undefined;\n\n // 文字列リテラル: '...' or \"...\"\n if (\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) ||\n (trimmed.startsWith('\"') && trimmed.endsWith('\"'))\n ) {\n return trimmed.slice(1, -1).replace(/\\\\'/g, \"'\").replace(/\\\\\"/g, '\"');\n }\n\n // boolean\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n\n // 数値\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return Number(trimmed);\n }\n\n // bareワード(テンプレート展開済みの値)\n return trimmed;\n}\n\nfunction isTruthy(val: Operand): boolean {\n if (typeof val === \"boolean\") return val;\n if (typeof val === \"number\") return val !== 0;\n if (typeof val === \"string\") return val !== \"\" && val !== \"false\" && val !== \"0\";\n return false;\n}\n\nfunction compare(left: Operand, right: Operand, op: ComparisonOperator): boolean {\n switch (op) {\n case \"===\":\n return left === right;\n case \"!==\":\n return left !== right;\n case \"==\":\n // eslint-disable-next-line eqeqeq\n return String(left) === String(right);\n case \"!=\":\n return String(left) !== String(right);\n case \"<\":\n return toNumber(left) < toNumber(right);\n case \">\":\n return toNumber(left) > toNumber(right);\n case \"<=\":\n return toNumber(left) <= toNumber(right);\n case \">=\":\n return toNumber(left) >= toNumber(right);\n default:\n return false;\n }\n}\n\nfunction toNumber(val: Operand): number {\n if (typeof val === \"number\") return val;\n if (typeof val === \"boolean\") return val ? 1 : 0;\n const n = Number(val);\n return Number.isNaN(n) ? 0 : n;\n}\n","/**\n * snapshot-cache — フィルタ済みスナップショットのキャッシュ\n *\n * 同一スナップショットの再フィルタリングを回避してCPU負荷を低減する。\n * リトライ時にスナップショットが変化していない場合、キャッシュからフィルタ済み結果を返す。\n */\n\nimport { createHash } from \"node:crypto\";\nimport {\n filterSnapshot,\n type SnapshotFilterOptions,\n} from \"../browser/snapshot-filter\";\n\ninterface SnapshotCacheEntry {\n rawHash: string;\n filtered: string;\n tokenEstimate: number;\n createdAt: number;\n}\n\n/**\n * スナップショットのフィルタリング結果をハッシュベースでキャッシュする。\n * LRU方式で最大 maxEntries 件を保持。\n */\nexport class SnapshotCache {\n private cache = new Map<string, SnapshotCacheEntry>();\n private readonly maxEntries: number;\n\n constructor(maxEntries = 5) {\n this.maxEntries = maxEntries;\n }\n\n /**\n * フィルタ済みスナップショットを返す(キャッシュがあればそれを利用)。\n *\n * opts が異なる場合は別キーとして扱う(filledSelectors のサイズをキーに含める)。\n */\n getFiltered(raw: string, opts?: SnapshotFilterOptions): string {\n const key = this.buildKey(raw, opts);\n const existing = this.cache.get(key);\n if (existing) {\n // LRU: アクセスされたエントリを末尾に移動\n this.cache.delete(key);\n this.cache.set(key, existing);\n return existing.filtered;\n }\n\n const filtered = filterSnapshot(raw, opts);\n const tokenEstimate = Math.ceil(filtered.length / 4);\n\n this.evictIfNeeded();\n this.cache.set(key, {\n rawHash: this.hashSnapshot(raw),\n filtered,\n tokenEstimate,\n createdAt: Date.now(),\n });\n\n return filtered;\n }\n\n /**\n * 2つのスナップショットが同一内容かどうかをハッシュで高速判定する。\n */\n hasChanged(rawA: string, rawB: string): boolean {\n return this.hashSnapshot(rawA) !== this.hashSnapshot(rawB);\n }\n\n /** キャッシュをクリアする */\n clear(): void {\n this.cache.clear();\n }\n\n /** 現在のキャッシュエントリ数 */\n get size(): number {\n return this.cache.size;\n }\n\n private buildKey(raw: string, opts?: SnapshotFilterOptions): string {\n const rawHash = this.hashSnapshot(raw);\n const filledCount = opts?.filledSelectors?.size ?? 0;\n return `${rawHash}:${filledCount}`;\n }\n\n private hashSnapshot(raw: string): string {\n return createHash(\"sha256\").update(raw).digest(\"hex\").slice(0, 16);\n }\n\n private evictIfNeeded(): void {\n while (this.cache.size >= this.maxEntries) {\n // Map は挿入順を保持するため、最初のキーが最古(LRU)\n const oldestKey = this.cache.keys().next().value;\n if (oldestKey !== undefined) {\n this.cache.delete(oldestKey);\n }\n }\n }\n}\n","/**\n * context-chunker — コンテキスト Markdown の関連チャンク選択\n *\n * 大きなコンテキスト Markdown をヘディング単位で分割し、\n * ステップ説明 + URL に関連するチャンクだけをキーワードスコアリングで選択する。\n * AI 呼び出し不要のローカル処理。\n */\n\ninterface ContextChunk {\n heading: string;\n content: string;\n tokenEstimate: number;\n keywords: string[];\n}\n\n/**\n * Markdown をヘディング単位で分割し、ステップごとに関連チャンクを選択する。\n */\nexport class ContextChunker {\n private chunks: ContextChunk[];\n private fullText: string;\n\n constructor(markdown: string) {\n this.fullText = markdown;\n this.chunks = parseMarkdownIntoChunks(markdown);\n }\n\n /**\n * ステップ説明 + URL に関連するチャンクを選択して返す。\n * キーワードオーバーラップスコアリングによる選択(AI 不要)。\n *\n * @param stepDescription ステップの説明テキスト\n * @param url 現在のページURL\n * @param maxTokens 最大トークン数(デフォルト: 2000)\n * @returns 関連チャンクを結合したテキスト。関連チャンクがなければ空文字。\n */\n selectRelevant(\n stepDescription: string,\n url: string,\n maxTokens = 2000,\n ): string {\n if (this.chunks.length === 0) return this.fullText;\n\n const queryTerms = extractKeywords(`${stepDescription} ${url}`);\n if (queryTerms.length === 0) return this.fullText;\n\n const scored = this.chunks\n .map((chunk) => ({\n chunk,\n score: keywordOverlapScore(queryTerms, chunk.keywords),\n }))\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score);\n\n if (scored.length === 0) {\n // 関連チャンクが見つからない場合: 全文が短ければそのまま返す\n const fullTokens = Math.ceil(this.fullText.length / 4);\n if (fullTokens <= maxTokens) return this.fullText;\n // 長い場合は先頭を切り詰め\n return this.fullText.slice(0, maxTokens * 4) + \"\\n[... truncated]\";\n }\n\n // トークン予算内で貪欲にチャンクを選択\n let tokens = 0;\n const selected: ContextChunk[] = [];\n for (const { chunk } of scored) {\n if (tokens + chunk.tokenEstimate > maxTokens) {\n // 残り予算に収まる小さいチャンクがあれば追加\n continue;\n }\n selected.push(chunk);\n tokens += chunk.tokenEstimate;\n }\n\n if (selected.length === 0 && scored.length > 0) {\n // 全チャンクが maxTokens を超える場合、最もスコアの高いチャンクを切り詰めて返す\n const best = scored[0].chunk;\n const maxChars = maxTokens * 4;\n return `### ${best.heading}\\n${best.content.slice(0, maxChars)}\\n[... truncated]`;\n }\n\n return selected.map((c) => `### ${c.heading}\\n${c.content}`).join(\"\\n\\n\");\n }\n\n /** 全文を返す(フォールバック用) */\n getFull(): string {\n return this.fullText;\n }\n\n /** チャンク数を返す(テスト・デバッグ用) */\n get chunkCount(): number {\n return this.chunks.length;\n }\n}\n\n/**\n * Markdown をヘディング(#, ##, ###)単位で分割する。\n * ヘディングがない場合はドキュメント全体を1チャンクとして扱う。\n */\nfunction parseMarkdownIntoChunks(markdown: string): ContextChunk[] {\n const lines = markdown.split(\"\\n\");\n const chunks: ContextChunk[] = [];\n let currentHeading = \"\";\n let currentContent: string[] = [];\n\n for (const line of lines) {\n const headingMatch = line.match(/^#{1,3}\\s+(.+)/);\n if (headingMatch) {\n // 前のチャンクを確定\n if (currentContent.length > 0 || currentHeading) {\n const content = currentContent.join(\"\\n\").trim();\n if (content) {\n chunks.push(buildChunk(currentHeading || \"untitled\", content));\n }\n }\n currentHeading = headingMatch[1].trim();\n currentContent = [];\n } else {\n currentContent.push(line);\n }\n }\n\n // 最後のチャンクを確定\n const content = currentContent.join(\"\\n\").trim();\n if (content) {\n chunks.push(buildChunk(currentHeading || \"untitled\", content));\n }\n\n return chunks;\n}\n\nfunction buildChunk(heading: string, content: string): ContextChunk {\n const fullText = `${heading} ${content}`;\n return {\n heading,\n content,\n tokenEstimate: Math.ceil(fullText.length / 4),\n keywords: extractKeywords(fullText),\n };\n}\n\n/**\n * テキストからキーワードを抽出する。\n * URL パス、英単語、日本語の名詞的文字列を抽出。\n * ストップワードと短すぎる単語を除外。\n */\nexport function extractKeywords(text: string): string[] {\n const normalized = text.toLowerCase();\n const words = new Set<string>();\n\n // URL パス部分を抽出(/login, /dashboard, /users など)\n const urlPaths = normalized.match(/\\/[a-z0-9_-]+/g);\n if (urlPaths) {\n for (const path of urlPaths) {\n words.add(path.replace(\"/\", \"\"));\n }\n }\n\n // 英単語を抽出\n const englishWords = normalized.match(/[a-z][a-z0-9_-]{2,}/g);\n if (englishWords) {\n for (const w of englishWords) {\n if (!STOP_WORDS.has(w)) {\n words.add(w);\n }\n }\n }\n\n // 日本語キーワード抽出(カタカナ語、漢字列)\n const japaneseWords = text.match(/[\\u30A0-\\u30FF]{2,}|[\\u4E00-\\u9FFF]{2,}/g);\n if (japaneseWords) {\n for (const w of japaneseWords) {\n words.add(w);\n }\n }\n\n return [...words];\n}\n\n/**\n * クエリキーワードとチャンクキーワードのオーバーラップスコアを計算する。\n * 部分一致も考慮(\"login\" は \"login-form\" にマッチ)。\n */\nexport function keywordOverlapScore(\n queryTerms: string[],\n chunkKeywords: string[],\n): number {\n if (queryTerms.length === 0 || chunkKeywords.length === 0) return 0;\n\n let matchCount = 0;\n for (const qt of queryTerms) {\n for (const ck of chunkKeywords) {\n if (ck.includes(qt) || qt.includes(ck)) {\n matchCount++;\n break; // 1つのクエリタームにつき最大1マッチ\n }\n }\n }\n\n // Jaccard 的なスコアリング: マッチ数 / クエリターム数\n return matchCount / queryTerms.length;\n}\n\nconst STOP_WORDS = new Set([\n \"the\", \"and\", \"for\", \"are\", \"but\", \"not\", \"you\", \"all\", \"can\",\n \"has\", \"her\", \"was\", \"one\", \"our\", \"out\", \"day\", \"had\", \"hot\",\n \"may\", \"who\", \"did\", \"get\", \"let\", \"say\", \"she\", \"too\", \"use\",\n \"that\", \"this\", \"with\", \"have\", \"from\", \"they\", \"been\", \"will\",\n \"each\", \"make\", \"like\", \"when\", \"than\", \"them\", \"into\", \"some\",\n \"could\", \"other\", \"about\", \"which\", \"their\", \"there\", \"would\",\n \"click\", \"input\", \"select\", \"button\", \"page\", \"form\", \"step\",\n]);\n","/**\n * reporter — 実行結果サマリー出力\n */\n\nimport { note, log } from \"../cli/prompts\";\nimport { formatDuration } from \"../cli/format\";\nimport { t, tf } from \"../i18n\";\nimport { computeTotalRealInput, computeCacheRate } from \"../harness/ai-metrics\";\nimport type { ExecutionReport, BatchExecutionReport, StepExecutionResult } from \"./types\";\n\n/** ループ内サブステップも含めてフラット化する */\nfunction flattenSteps(steps: StepExecutionResult[]): StepExecutionResult[] {\n const result: StepExecutionResult[] = [];\n for (const step of steps) {\n result.push(step);\n if (step.subStepResults) {\n for (const iteration of step.subStepResults) {\n result.push(...flattenSteps(iteration));\n }\n }\n }\n return result;\n}\n\nfunction printStepResult(step: StepExecutionResult, indent: string): void {\n const duration = formatDuration(step.durationMs);\n\n // 条件スキップ\n if (step.conditionSkipped) {\n log.warn(`${indent}#${step.ordinal} ${step.description} (${t(\"common.conditionSkipped\")})`);\n return;\n }\n\n // ブランチステップ\n if (step.branchMatch !== undefined) {\n const matchLabel = step.branchMatch || t(\"common.skipped\").toLowerCase();\n const msg = `${indent}#${step.ordinal} ${step.description} (branch: ${matchLabel}, ${duration})`;\n if (step.status === \"success\") {\n log.success(msg);\n } else if (step.status === \"skipped\") {\n log.warn(msg);\n } else {\n log.error(msg);\n }\n if (step.subStepResults) {\n for (const subResults of step.subStepResults) {\n for (const subResult of subResults) {\n printStepResult(subResult, `${indent} `);\n }\n }\n }\n return;\n }\n\n // ループステップ(while + forEach)\n if (step.loopIterations !== undefined) {\n const iterLabel = step.forEachItemCount !== undefined\n ? `forEach: ${step.forEachItemCount} ${t(\"common.items\")}`\n : `${step.loopIterations} ${t(\"common.iterations\")}`;\n const msg = `${indent}#${step.ordinal} ${step.description} (${iterLabel}, ${duration})`;\n if (step.status === \"success\") {\n log.success(msg);\n } else {\n log.error(msg);\n }\n // サブステップ結果をイテレーションごとに表示\n if (step.subStepResults) {\n for (let i = 0; i < step.subStepResults.length; i++) {\n log.info(`${indent} ${t(\"common.iteration\")} ${i}:`);\n for (const subResult of step.subStepResults[i]) {\n printStepResult(subResult, `${indent} `);\n }\n }\n }\n return;\n }\n\n // 通常ステップ\n const msg = `${indent}#${step.ordinal} ${step.description} (${duration})`;\n if (step.status === \"success\") {\n log.success(msg);\n if (step.capturedValues) {\n for (const [name, value] of Object.entries(step.capturedValues)) {\n log.info(`${indent} captured: ${name} = \"${value}\"`);\n }\n }\n if (step.extractedData) {\n const preview = step.extractedData.length > 80\n ? `${step.extractedData.slice(0, 80)}...`\n : step.extractedData;\n log.info(`${indent} extracted: ${preview}`);\n }\n if (step.downloadedFile) {\n log.info(`${indent} downloaded: ${step.downloadedFile}`);\n }\n if (step.exportedFile) {\n log.info(`${indent} exported: ${step.exportedFile}`);\n }\n } else if (step.status === \"failed\") {\n log.error(`${msg} ERROR: ${step.error}`);\n } else {\n log.warn(`${msg} (${t(\"common.skipped\").toLowerCase()})`);\n }\n}\n\nexport function printReport(report: ExecutionReport): void {\n // サマリーを note() で枠付き表示\n const summaryLines = [\n tf(\"reporter.instruction\", { title: report.instructionTitle }),\n tf(\"reporter.startUrl\", { url: report.startUrl }),\n tf(\"reporter.totalSteps\", { count: report.totalSteps }),\n tf(\"reporter.statsLine\", { executed: report.executed, succeeded: report.succeeded, failed: report.failed, skipped: report.skipped }),\n ...(report.aborted ? [t(\"reporter.statusAborted\")] : []),\n tf(\"reporter.totalDuration\", { duration: formatDuration(report.totalDurationMs) }),\n ];\n\n // メモリコレクション情報\n if (report.memoryCollections && Object.keys(report.memoryCollections).length > 0) {\n const memoryInfo = Object.entries(report.memoryCollections)\n .map(([name, count]) => `${name}(${count}${t(\"common.items\")})`)\n .join(\", \");\n summaryLines.push(tf(\"reporter.memory\", { info: memoryInfo }));\n }\n\n // ダウンロードファイル情報\n if (report.downloadedFiles && report.downloadedFiles.length > 0) {\n summaryLines.push(tf(\"reporter.downloads\", { count: report.downloadedFiles.length }));\n }\n\n // AI メトリクスサマリー\n if (report.aiMetrics && report.aiMetrics.totalCalls > 0) {\n const m = report.aiMetrics;\n const totalRealInput = computeTotalRealInput(m);\n const cacheRate = (computeCacheRate(m) * 100).toFixed(1);\n const purposeSummary = Object.entries(m.byPurpose)\n .map(([p, b]) => `${p}(${b.calls})`)\n .join(\" \");\n summaryLines.push(\n `AI: ${m.totalCalls} calls, ` +\n `${totalRealInput.toLocaleString()} in / ${m.totalOutputTokens.toLocaleString()} out, ` +\n `cache ${cacheRate}%, ` +\n `$${m.estimatedCostUsd.toFixed(4)}, ` +\n `${(m.totalDurationMs / 1000).toFixed(1)}s — ${purposeSummary}`,\n );\n if (m.byModel && Object.keys(m.byModel).length > 1) {\n const modelSummary = Object.entries(m.byModel)\n .map(([id, b]) => `${id}($${b.estimatedCostUsd.toFixed(4)})`)\n .join(\" \");\n summaryLines.push(`Models: ${modelSummary}`);\n }\n }\n\n note(summaryLines.join(\"\\n\"), t(\"reporter.executionResult\"));\n\n // Extract 失敗・空結果の要約\n const allFlatSteps = flattenSteps(report.steps);\n const extractFailures = allFlatSteps.filter(\n (s) => s.actionType === \"extract\" && s.status === \"failed\",\n );\n const extractEmpty = allFlatSteps.filter(\n (s) => s.actionType === \"extract\" && s.status === \"success\" && (!s.extractedData || s.extractedData === \"\"),\n );\n if (extractFailures.length > 0) {\n log.error(`Extract failures: ${extractFailures.length} step(s) failed — ${extractFailures.map((s) => `#${s.ordinal}`).join(\", \")}`);\n }\n if (extractEmpty.length > 0) {\n log.warn(`Extract warnings: ${extractEmpty.length} step(s) returned empty results`);\n }\n\n // ステップ詳細: 状態に応じて色分け\n for (const step of report.steps) {\n printStepResult(step, \"\");\n }\n}\n\nexport function printBatchReport(report: BatchExecutionReport): void {\n const summaryLines = [\n tf(\"reporter.instruction\", { title: report.instructionTitle }),\n tf(\"reporter.batchTotalRows\", { count: report.totalRows }),\n tf(\"reporter.batchStats\", { succeeded: report.succeeded, failed: report.failed }),\n tf(\"reporter.totalDuration\", { duration: formatDuration(report.totalDurationMs) }),\n ];\n note(summaryLines.join(\"\\n\"), t(\"reporter.batchResult\"));\n\n // 行ごとの結果\n for (const row of report.rows) {\n const r = row.report;\n const status = r.failed === 0 && !r.aborted ? \"OK\" : \"NG\";\n const duration = formatDuration(r.totalDurationMs);\n const msg = `${row.rowLabel}: ${status} (${r.succeeded}/${r.totalSteps} steps, ${duration})`;\n\n if (status === \"OK\") {\n log.success(msg);\n } else {\n log.error(msg);\n // 失敗ステップの詳細\n for (const step of r.steps) {\n if (step.status === \"failed\") {\n log.error(` #${step.ordinal} ${step.description}: ${step.error}`);\n }\n }\n }\n }\n}\n","/**\n * input-collector — context markdown からの変数値抽出\n */\n\nimport { z } from \"zod\";\nimport { getModel, trackedGenerateObject, withAIRetry } from \"../harness/ai-model\";\nimport { spinner } from \"../cli/prompts\";\n\nconst contextValuesSchema = z.object({\n values: z.record(z.string(), z.string()).describe(\"変数名→抽出値のマップ\"),\n});\n\ninterface InputDescriptor {\n name: string;\n description: string;\n required: boolean;\n}\n\n/** 静的な変数抽出用システムプロンプト(キャッシュ対象) */\nconst CONTEXT_EXTRACTION_SYSTEM_PROMPT = [\n \"以下の変数リストと context markdown が与えられます。\",\n \"context から各変数に対応する値を抽出してください。\",\n \"値が見つからない場合はそのキーを含めないでください。\",\n].join(\"\\n\");\n\n/**\n * context markdown から変数の値を AI で抽出する\n * execution-planner.ts から使用される\n */\nexport async function extractValuesFromContext(\n inputs: InputDescriptor[],\n contextMarkdown: string,\n): Promise<Record<string, string>> {\n const inputDescriptions = inputs\n .map((i) => `- name: \"${i.name}\", description: \"${i.description}\"`)\n .join(\"\\n\");\n\n const userPrompt = [\n \"## 変数\",\n inputDescriptions,\n \"\",\n \"## Context\",\n contextMarkdown,\n ].join(\"\\n\");\n\n try {\n const { object } = await withAIRetry(\n () =>\n trackedGenerateObject(\"extraction\", {\n model: getModel(\"extraction\"),\n messages: [\n {\n role: \"system\",\n content: CONTEXT_EXTRACTION_SYSTEM_PROMPT,\n providerOptions: {\n anthropic: { cacheControl: { type: \"ephemeral\" } },\n },\n },\n { role: \"user\", content: userPrompt },\n ],\n schema: contextValuesSchema,\n temperature: 0,\n }),\n { label: \"input-collect\" },\n );\n\n return object.values;\n } catch {\n return {};\n }\n}\n","/**\n * template-resolver — {{varName}} テンプレート展開エンジン\n *\n * 純粋関数のみ。ブラウザ / AI / IO 依存なし。\n */\n\nimport type { ParsedStep } from \"../instruction-executor/types\";\n\nconst TEMPLATE_RE = /\\{\\{([\\w.]+)\\}\\}/g;\nconst MAX_RESOLVE_DEPTH = 3;\n\n/**\n * テンプレート文字列中の {{varName}} を values で展開する。\n * ネストした参照(expression 内の {{}} )は最大 MAX_RESOLVE_DEPTH 回まで再帰展開。\n */\nexport function resolveTemplate(\n template: string,\n values: Map<string, string>,\n): string {\n let result = template;\n for (let depth = 0; depth < MAX_RESOLVE_DEPTH; depth++) {\n const next = result.replace(TEMPLATE_RE, (match, name: string) => {\n const v = values.get(name);\n return v !== undefined ? v : match; // 未解決はそのまま残す\n });\n if (next === result) break; // 変化なし → 完了\n result = next;\n }\n return result;\n}\n\n/**\n * テンプレート文字列から参照されている変数名の一覧を抽出する。\n */\nexport function extractVariableNames(template: string): string[] {\n const names: string[] = [];\n let match: RegExpExecArray | null;\n const re = new RegExp(TEMPLATE_RE.source, \"g\");\n while ((match = re.exec(template)) !== null) {\n if (!names.includes(match[1])) {\n names.push(match[1]);\n }\n }\n return names;\n}\n\n/**\n * 文字列に {{...}} テンプレート参照を含むか判定する。\n */\nexport function hasTemplateRef(value: string): boolean {\n return TEMPLATE_RE.test(value);\n}\n\n/**\n * 全ステップの value / url / optionText / condition / loop.condition をスキャンし、\n * 参照されている変数名の一覧を返す。サブステップも再帰的にスキャンする。\n */\nexport function scanStepsForTemplates(steps: ParsedStep[]): string[] {\n const names = new Set<string>();\n\n function scan(stepsToScan: ParsedStep[]): void {\n for (const step of stepsToScan) {\n const candidates = [\n step.action.value,\n step.action.url,\n step.action.optionText,\n step.condition,\n step.loop?.condition,\n step.loop?.forEach,\n step.branches?.value,\n ];\n for (const c of candidates) {\n if (c) {\n for (const name of extractVariableNames(c)) {\n names.add(name);\n }\n }\n }\n // branches の match 値と サブステップを再帰スキャン\n if (step.branches) {\n for (const branchCase of step.branches.cases) {\n for (const name of extractVariableNames(branchCase.match)) {\n names.add(name);\n }\n scan(branchCase.steps);\n }\n if (step.branches.default) {\n scan(step.branches.default.steps);\n }\n }\n // サブステップを再帰スキャン\n if (step.steps) {\n scan(step.steps);\n }\n }\n }\n\n scan(steps);\n return Array.from(names);\n}\n","/**\n * execution-planner --- 事前変数の解決 + 実行プラン表示\n *\n * 実行前に全変数を解決し、ユーザーに確認を求める。\n * 優先順位: secrets → data行値 → context抽出(全未解決変数) → env → expression → fixed → prompt(未解決必須変数)\n *\n * resolveVariablesCore() は SDK からも利用される非対話的コア関数。\n * planExecution() は CLI 用で、prompt (ステップ 7) を含む完全版。\n */\n\nimport { extractValuesFromContext } from \"./input-collector\";\nimport { scanStepsForTemplates } from \"../context/template-resolver\";\nimport { resolveTemplate } from \"../context/template-resolver\";\nimport { promptText, promptConfirm, note, log, spinner } from \"../cli/prompts\";\nimport { t, tf } from \"../i18n\";\nimport type {\n ParsedInstruction,\n ExecutorConfig,\n ResolvedVariables,\n VariableDefinition,\n} from \"./types\";\nimport type { SecretsData } from \"../cli/secrets-loader\";\n\nexport interface ExecutionPlan {\n resolvedVariables: ResolvedVariables;\n unresolvedDataVars: string[]; // data ソース(行ごとに提供)\n captureVars: string[]; // ランタイムキャプチャ変数名\n dataFilePath?: string;\n contextExtractedKeys: Set<string>; // contextから抽出された変数名\n secretsKeys: Set<string>; // secretsから読み込まれた変数名\n}\n\n// ── resolveVariablesCore: 非対話的変数解決(SDK 共有) ──\n\n/** resolveVariablesCore に渡す入力 */\nexport interface CoreResolveInput {\n /** secrets データ */\n secrets?: SecretsData;\n /** 補足情報の markdown テキスト */\n contextMarkdown?: string;\n /** env ソースをスキップするか (SDK: true, CLI: false) */\n skipEnv?: boolean;\n}\n\n/** resolveVariablesCore の戻り値 */\nexport interface CoreResolveResult {\n values: Map<string, string>;\n sensitiveKeys: Set<string>;\n unresolvedDataVars: string[];\n captureVars: string[];\n contextExtractedKeys: Set<string>;\n secretsKeys: Set<string>;\n}\n\n/**\n * 指示書の変数をステップ 1-6 で非対話的に解決する。\n * ステップ 7 (prompt) は含まない。\n *\n * SDK と CLI の両方から利用される共通コア関数。\n */\nexport async function resolveVariablesCore(\n instruction: ParsedInstruction,\n input: CoreResolveInput,\n): Promise<CoreResolveResult> {\n const variables = instruction.variables ?? {};\n const values = new Map<string, string>();\n const sensitiveKeys = new Set<string>();\n const unresolvedDataVars: string[] = [];\n\n // キャプチャ変数名(サブステップ・ブランチも再帰スキャン)\n const captureVars: string[] = [];\n function collectCaptureVars(steps: typeof instruction.steps): void {\n for (const step of steps) {\n if (step.captures) {\n for (const c of step.captures) {\n captureVars.push(c.name);\n }\n }\n if (step.steps) {\n collectCaptureVars(step.steps);\n }\n if (step.branches) {\n for (const branchCase of step.branches.cases) {\n collectCaptureVars(branchCase.steps);\n }\n if (step.branches.default) {\n collectCaptureVars(step.branches.default.steps);\n }\n }\n }\n }\n collectCaptureVars(instruction.steps);\n\n // sensitive キーを収集\n for (const [name, def] of Object.entries(variables)) {\n if (def.sensitive) {\n sensitiveKeys.add(name);\n }\n }\n\n // 1. secrets(最高優先: secrets JSON から読み込んだ値、全て sensitive)\n const secretsKeys = new Set<string>();\n if (input.secrets) {\n for (const [key, val] of Object.entries(input.secrets.values)) {\n values.set(key, val);\n sensitiveKeys.add(key);\n secretsKeys.add(key);\n }\n }\n\n // 2. data ソースの変数は行ごとに提供されるためマーク\n for (const [name, def] of Object.entries(variables)) {\n if (def.source === \"data\" && !values.has(name)) {\n unresolvedDataVars.push(name);\n }\n }\n\n // 3. context 抽出: 全未解決変数を対象(data ソース除く)\n const unresolvedVars = Object.entries(variables).filter(\n ([name]) => !values.has(name) && !unresolvedDataVars.includes(name),\n );\n const contextExtractedKeys = new Set<string>();\n if (unresolvedVars.length > 0 && input.contextMarkdown) {\n const extracted = await extractValuesFromContext(\n unresolvedVars.map(([name, def]) => ({\n name,\n description: def.description ?? name,\n required: def.required !== false,\n })),\n input.contextMarkdown,\n );\n for (const [name, val] of Object.entries(extracted)) {\n if (!values.has(name) && val) {\n values.set(name, val);\n contextExtractedKeys.add(name);\n }\n }\n }\n\n // 4. env(SDK ではスキップ)\n if (!input.skipEnv) {\n for (const [name, def] of Object.entries(variables)) {\n if (def.source === \"env\" && !values.has(name) && def.envKey) {\n const envVal = process.env[def.envKey];\n if (envVal !== undefined) {\n values.set(name, envVal);\n }\n }\n }\n }\n\n // 5. expression(他の事前変数を展開)\n for (const [name, def] of Object.entries(variables)) {\n if (def.source === \"expression\" && !values.has(name) && def.expression) {\n const resolved = resolveTemplate(def.expression, values);\n // 未解決テンプレートが残っていなければセット\n if (!/\\{\\{[\\w.]+\\}\\}/.test(resolved)) {\n values.set(name, resolved);\n }\n }\n }\n\n // 6. fixed\n for (const [name, def] of Object.entries(variables)) {\n if (def.source === \"fixed\" && !values.has(name) && def.value !== undefined) {\n values.set(name, def.value);\n }\n }\n\n return {\n values,\n sensitiveKeys,\n unresolvedDataVars,\n captureVars,\n contextExtractedKeys,\n secretsKeys,\n };\n}\n\n/**\n * instruction の事前変数を解決する(CLI 用: prompt ステップ含む)\n */\nexport async function planExecution(\n instruction: ParsedInstruction,\n config: ExecutorConfig,\n): Promise<ExecutionPlan> {\n // ステップ 1-6 はコア関数で実行\n const s = spinner();\n const variables = instruction.variables ?? {};\n\n // context 抽出時の spinner 表示のため、手動で spinner を管理\n const hasContextVars =\n Object.entries(variables).some(\n ([name]) =>\n !config.secrets?.keys.has(name) &&\n variables[name]?.source !== \"data\",\n ) && config.contextMarkdown;\n\n if (hasContextVars) {\n s.start(t(\"planner.extractingFromContext\"));\n }\n\n const coreResult = await resolveVariablesCore(instruction, {\n secrets: config.secrets,\n contextMarkdown: config.contextMarkdown,\n skipEnv: false,\n });\n\n if (hasContextVars) {\n s.stop(tf(\"planner.extractedFromContext\", { count: coreResult.contextExtractedKeys.size }));\n }\n\n // 7. prompt: source に関係なく、まだ未解決の必須変数をユーザーに問い合わせ\n const captureVarNames = new Set(coreResult.captureVars);\n const stillUnresolved = Object.entries(variables).filter(\n ([name, def]) =>\n !coreResult.values.has(name) &&\n !coreResult.unresolvedDataVars.includes(name) &&\n !captureVarNames.has(name) &&\n def.required !== false,\n );\n if (stillUnresolved.length > 0) {\n log.warn(tf(\"planner.unresolvedRequired\", { count: stillUnresolved.length }));\n for (const [name, def] of stillUnresolved) {\n const answer = await promptText(def.description ?? name, {\n placeholder: t(\"planner.placeholder\"),\n validate: (v) => (!v?.trim() ? tf(\"planner.variableRequired\", { name }) : undefined),\n });\n coreResult.values.set(name, answer.trim());\n }\n }\n\n return {\n resolvedVariables: {\n values: coreResult.values,\n sensitiveKeys: coreResult.sensitiveKeys,\n },\n unresolvedDataVars: coreResult.unresolvedDataVars,\n captureVars: coreResult.captureVars,\n dataFilePath: config.dataFilePath,\n contextExtractedKeys: coreResult.contextExtractedKeys,\n secretsKeys: coreResult.secretsKeys,\n };\n}\n\n/**\n * 実行プランを表示する\n */\nexport function displayPlan(\n plan: ExecutionPlan,\n instruction: ParsedInstruction,\n dataRowCount?: number,\n): void {\n const lines: string[] = [];\n\n // 事前変数\n lines.push(t(\"planner.preVariables\"));\n if (plan.resolvedVariables.values.size === 0 && plan.unresolvedDataVars.length === 0) {\n lines.push(\" \" + t(\"common.none\"));\n } else {\n for (const [name, value] of plan.resolvedVariables.values) {\n const display = plan.resolvedVariables.sensitiveKeys.has(name)\n ? `\"${value.slice(0, 3)}****\"`\n : `\"${value}\"`;\n let source = \"\";\n if (plan.secretsKeys.has(name)) {\n source = t(\"planner.fromSecrets\");\n } else if (plan.contextExtractedKeys.has(name)) {\n source = t(\"planner.fromContext\");\n }\n lines.push(` ${name} → ${display}${source}`);\n }\n for (const name of plan.unresolvedDataVars) {\n lines.push(` ${name} → ${t(\"planner.fromDataSource\")}`);\n }\n }\n\n // ランタイムキャプチャ(サブステップ含む)\n if (plan.captureVars.length > 0) {\n lines.push(\"\");\n lines.push(t(\"planner.runtimeCaptures\"));\n function displayCaptures(\n steps: typeof instruction.steps,\n prefix: string,\n ): void {\n for (const step of steps) {\n if (step.captures) {\n for (const c of step.captures) {\n lines.push(` ${c.name} ← ${prefix}Step ${step.ordinal} (${c.strategy})`);\n }\n }\n if (step.steps) {\n displayCaptures(step.steps, `${prefix}Loop ${step.ordinal} > `);\n }\n if (step.branches) {\n for (const branchCase of step.branches.cases) {\n displayCaptures(branchCase.steps, `${prefix}Branch ${step.ordinal}/${branchCase.match} > `);\n }\n if (step.branches.default) {\n displayCaptures(step.branches.default.steps, `${prefix}Branch ${step.ordinal}/default > `);\n }\n }\n }\n }\n displayCaptures(instruction.steps, \"\");\n }\n\n // 条件付き・ループ・ブランチステップ\n const conditionSteps = instruction.steps.filter((s) => s.condition);\n const loopSteps = instruction.steps.filter((s) => s.loop && s.steps);\n const branchSteps = instruction.steps.filter((s) => s.branches);\n if (conditionSteps.length > 0 || loopSteps.length > 0 || branchSteps.length > 0) {\n lines.push(\"\");\n lines.push(t(\"planner.controlFlow\"));\n for (const step of conditionSteps) {\n lines.push(tf(\"planner.conditionLabel\", { ordinal: step.ordinal, condition: step.condition ?? \"\" }));\n }\n for (const step of loopSteps) {\n if (step.loop!.forEach) {\n const maxIter = step.loop!.maxIterations ?? 100;\n lines.push(\n tf(\"planner.forEachLabel\", { ordinal: step.ordinal, max: maxIter, subSteps: step.steps!.length, forEach: step.loop!.forEach }),\n );\n } else {\n const maxIter = step.loop!.maxIterations ?? 10;\n lines.push(\n tf(\"planner.loopLabel\", { ordinal: step.ordinal, max: maxIter, subSteps: step.steps!.length, condition: step.loop!.condition ?? \"\" }),\n );\n }\n }\n for (const step of branchSteps) {\n const caseLabels = step.branches!.cases.map((c) => c.match).join(\", \");\n lines.push(\n tf(\"planner.branchLabel\", { ordinal: step.ordinal, value: step.branches!.value, cases: caseLabels }),\n );\n }\n }\n\n // バッチ情報\n if (plan.dataFilePath && dataRowCount !== undefined) {\n lines.push(\"\");\n lines.push(tf(\"planner.batchMode\", { count: dataRowCount, path: plan.dataFilePath }));\n }\n\n lines.push(tf(\"planner.stepCount\", { count: instruction.steps.length }));\n\n note(lines.join(\"\\n\"), t(\"planner.executionPlan\"));\n}\n\n/**\n * 実行確認プロンプト\n */\nexport async function confirmPlan(): Promise<boolean> {\n return promptConfirm(t(\"planner.confirmStart\"), true);\n}\n","/**\n * runtime-store — 変数の統合管理ストア\n *\n * 事前解決値 + ランタイムキャプチャ値を一元管理。\n * テンプレート展開もストア経由で行う。\n * Working Memory: 実行フェーズ追跡・ステップ履歴・AI プロンプト注入用サマリー。\n */\n\nimport { resolveTemplate } from \"./template-resolver\";\n\n/** 実行フェーズ(自動検出) */\nexport interface ExecutionPhase {\n name: string;\n startStep: number;\n endStep?: number;\n summary: string;\n}\n\n/** Working Memory の内部状態 */\ninterface WorkingMemoryState {\n currentPhase: string;\n completedPhases: ExecutionPhase[];\n recentStepSummaries: string[];\n currentPageContext: string;\n successStreak: number;\n failureCount: number;\n totalSteps: number;\n lastUrl: string;\n lastActionType: string;\n /** 直近アクションタイプの連続カウント(フェーズ検出用) */\n actionTypeRun: number;\n}\n\nconst MAX_RECENT_SUMMARIES = 5;\n\nexport class RuntimeStore {\n private store = new Map<string, string>();\n private sensitiveKeys = new Set<string>();\n private wm: WorkingMemoryState = {\n currentPhase: \"initial\",\n completedPhases: [],\n recentStepSummaries: [],\n currentPageContext: \"\",\n successStreak: 0,\n failureCount: 0,\n totalSteps: 0,\n lastUrl: \"\",\n lastActionType: \"\",\n actionTypeRun: 0,\n };\n\n /** 事前解決済み変数をシードする */\n seed(values: Map<string, string>, sensitive: Set<string>): void {\n for (const [k, v] of values) {\n this.store.set(k, v);\n }\n for (const k of sensitive) {\n this.sensitiveKeys.add(k);\n }\n }\n\n get(name: string): string | undefined {\n return this.store.get(name);\n }\n\n set(name: string, value: string): void {\n this.store.set(name, value);\n }\n\n has(name: string): boolean {\n return this.store.has(name);\n }\n\n isSensitive(name: string): boolean {\n return this.sensitiveKeys.has(name);\n }\n\n /** sensitive として登録されたキー名一覧を返す */\n getSensitiveKeys(): string[] {\n return Array.from(this.sensitiveKeys);\n }\n\n /** store の値で {{varName}} を展開する */\n resolveTemplate(template: string): string {\n return resolveTemplate(template, this.store);\n }\n\n /** ログ出力用: sensitive な値をマスクした文字列を返す */\n maskSensitive(value: string): string {\n let masked = value;\n for (const key of this.sensitiveKeys) {\n const val = this.store.get(key);\n if (val && masked.includes(val)) {\n masked = masked.replaceAll(val, \"****\");\n }\n }\n return masked;\n }\n\n /** 全変数のスナップショット(デバッグ用) */\n entries(): [string, string][] {\n return Array.from(this.store.entries());\n }\n\n // ─────────────── forEach ヘルパー ───────────────\n\n /**\n * forEach ループの各アイテムを変数としてセットする。\n * オブジェクト → varName = JSON文字列, varName.key = value にフラット化(1階層のみ)\n * プリミティブ → varName = String(item)\n */\n setForEachItem(varName: string, item: unknown, indexVar?: string, index?: number): void {\n if (indexVar !== undefined && index !== undefined) {\n this.store.set(indexVar, String(index));\n }\n if (item !== null && typeof item === \"object\" && !Array.isArray(item)) {\n this.store.set(varName, JSON.stringify(item));\n for (const [key, value] of Object.entries(item as Record<string, unknown>)) {\n this.store.set(`${varName}.${key}`, String(value ?? \"\"));\n }\n } else {\n this.store.set(varName, String(item ?? \"\"));\n }\n }\n\n /**\n * forEach ループのアイテム変数をクリーンアップする。\n * varName と全 varName.* キーを削除。\n */\n clearForEachItem(varName: string, indexVar?: string): void {\n this.store.delete(varName);\n if (indexVar) {\n this.store.delete(indexVar);\n }\n // varName.* キーをすべて削除\n const prefix = `${varName}.`;\n for (const key of Array.from(this.store.keys())) {\n if (key.startsWith(prefix)) {\n this.store.delete(key);\n }\n }\n }\n\n // ─────────────── Working Memory ───────────────\n\n /**\n * ステップ完了後に Working Memory を更新する。\n * フェーズ自動検出 + ステップ履歴の記録。\n */\n updateWorkingMemory(\n stepOrdinal: number,\n totalStepCount: number,\n success: boolean,\n url: string,\n actionType: string,\n stepDescription: string,\n ): void {\n this.wm.totalSteps = totalStepCount;\n\n // 成功/失敗カウント\n if (success) {\n this.wm.successStreak++;\n this.wm.failureCount = 0;\n } else {\n this.wm.successStreak = 0;\n this.wm.failureCount++;\n }\n\n // ステップサマリー(ring buffer)\n const summary = `Step ${stepOrdinal}: ${stepDescription} → ${success ? \"OK\" : \"FAIL\"}`;\n this.wm.recentStepSummaries.push(summary);\n if (this.wm.recentStepSummaries.length > MAX_RECENT_SUMMARIES) {\n this.wm.recentStepSummaries.shift();\n }\n\n // ページコンテキスト更新\n this.wm.currentPageContext = url;\n\n // フェーズ遷移検出\n this.detectPhaseTransition(stepOrdinal, url, actionType);\n\n this.wm.lastUrl = url;\n this.wm.lastActionType = actionType;\n }\n\n /**\n * AI プロンプト注入用の Working Memory サマリーを返す。\n * 100〜200 トークンの簡潔な構造化テキスト。\n * Working Memory がまだ蓄積されていない場合は undefined を返す。\n */\n getWorkingMemorySummary(): string | undefined {\n if (this.wm.recentStepSummaries.length === 0) return undefined;\n\n const parts: string[] = [];\n\n // フェーズ情報\n if (this.wm.completedPhases.length > 0) {\n const phaseHistory = this.wm.completedPhases\n .map((p) => `${p.name}(steps ${p.startStep}-${p.endStep ?? \"?\"})`)\n .join(\" → \");\n parts.push(`Phases: ${phaseHistory} → ${this.wm.currentPhase}(current)`);\n } else {\n parts.push(`Phase: ${this.wm.currentPhase}`);\n }\n\n // 直近ステップ\n const recent = this.wm.recentStepSummaries.slice(-3).join(\"; \");\n parts.push(`Recent: ${recent}`);\n\n // ステータス\n const statusParts: string[] = [];\n if (this.wm.successStreak > 0) {\n statusParts.push(`${this.wm.successStreak} consecutive successes`);\n }\n if (this.wm.failureCount > 0) {\n statusParts.push(`${this.wm.failureCount} consecutive failures`);\n }\n if (statusParts.length > 0) {\n parts.push(`Status: ${statusParts.join(\", \")}`);\n }\n\n // 現在の URL\n parts.push(`URL: ${this.wm.currentPageContext}`);\n\n return parts.join(\"\\n\");\n }\n\n /**\n * URL パターン変化 + アクションタイプのクラスタリングでフェーズ遷移を検出。\n * AI 呼び出し不要のヒューリスティック。\n */\n private detectPhaseTransition(\n stepOrdinal: number,\n url: string,\n actionType: string,\n ): void {\n const urlPath = extractUrlPath(url);\n const lastUrlPath = extractUrlPath(this.wm.lastUrl);\n\n // URL パスの大幅変更を検出\n const pathChanged = urlPath !== lastUrlPath && this.wm.lastUrl !== \"\";\n\n // アクションタイプの連続を追跡\n if (actionType === this.wm.lastActionType) {\n this.wm.actionTypeRun++;\n } else {\n this.wm.actionTypeRun = 1;\n }\n\n // フェーズ遷移判定\n const newPhase = detectPhaseFromContext(urlPath, actionType, this.wm.actionTypeRun);\n\n if (newPhase !== this.wm.currentPhase && (pathChanged || this.wm.actionTypeRun >= 3)) {\n // 前のフェーズを完了として記録\n if (this.wm.currentPhase !== \"initial\") {\n const lastPhase = this.wm.completedPhases[this.wm.completedPhases.length - 1];\n const startStep = lastPhase ? (lastPhase.endStep ?? 0) + 1 : 1;\n this.wm.completedPhases.push({\n name: this.wm.currentPhase,\n startStep,\n endStep: stepOrdinal - 1,\n summary: `${this.wm.currentPhase} completed`,\n });\n }\n this.wm.currentPhase = newPhase;\n }\n }\n}\n\n/** URL からパス部分を抽出(クエリ・フラグメント除去) */\nfunction extractUrlPath(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.pathname;\n } catch {\n return url;\n }\n}\n\n/**\n * URL パス + アクションタイプからフェーズ名を推定するヒューリスティック。\n */\nfunction detectPhaseFromContext(\n urlPath: string,\n actionType: string,\n actionTypeRun: number,\n): string {\n // URL ベースの判定\n if (/\\/(login|signin|auth)/i.test(urlPath)) return \"authentication\";\n if (/\\/(dashboard|home|overview)/i.test(urlPath)) return \"navigation\";\n if (/\\/(settings|config|preferences)/i.test(urlPath)) return \"configuration\";\n\n // アクションタイプベースの判定\n if (actionType === \"input\" && actionTypeRun >= 2) return \"form_filling\";\n if (actionType === \"extract\" && actionTypeRun >= 2) return \"data_extraction\";\n if (actionType === \"click\" && actionTypeRun >= 3) return \"navigation\";\n if (actionType === \"download\") return \"data_export\";\n\n return \"general\";\n}\n","/**\n * batch-runner — CSV/JSON からの繰り返し実行\n *\n * dataSource.mapping に従い、行ごとに変数を RuntimeStore にセットして実行する。\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { extname } from \"node:path\";\nimport { AgentBrowser } from \"../browser/browser-client\";\nimport { RuntimeStore } from \"../context/runtime-store\";\nimport { execute } from \"./executor\";\nimport type { Logger, SpinnerLike } from \"../logger\";\nimport { NoopLogger, NoopSpinner } from \"../logger\";\nimport type { ConfirmationProvider } from \"../harness/confirmation\";\nimport type { SelectorCache } from \"../harness/selector-cache\";\nimport type {\n ExecutorConfig,\n ParsedInstruction,\n BatchExecutionReport,\n} from \"./types\";\n\n/**\n * CSV/JSON ファイルを読み込んで行配列として返す\n */\nexport async function loadDataFile(\n path: string,\n): Promise<Record<string, string>[]> {\n const raw = await readFile(path, \"utf-8\");\n const ext = extname(path).toLowerCase();\n\n if (ext === \".json\") {\n const data = JSON.parse(raw);\n if (!Array.isArray(data)) {\n throw new Error(\"JSON data file must be an array of objects\");\n }\n return data.map((row: Record<string, unknown>) => {\n const result: Record<string, string> = {};\n for (const [k, v] of Object.entries(row)) {\n result[k] = String(v ?? \"\");\n }\n return result;\n });\n }\n\n // CSV パース(シンプルな実装)\n return parseCSV(raw);\n}\n\nfunction parseCSV(raw: string): Record<string, string>[] {\n const lines = raw.split(\"\\n\").filter((line) => line.trim() !== \"\");\n if (lines.length < 2) return [];\n\n const headers = parseCSVLine(lines[0]);\n const rows: Record<string, string>[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const values = parseCSVLine(lines[i]);\n const row: Record<string, string> = {};\n for (let j = 0; j < headers.length; j++) {\n row[headers[j]] = values[j] ?? \"\";\n }\n rows.push(row);\n }\n\n return rows;\n}\n\nfunction parseCSVLine(line: string): string[] {\n const result: string[] = [];\n let current = \"\";\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i++) {\n const char = line[i];\n if (inQuotes) {\n if (char === '\"') {\n if (i + 1 < line.length && line[i + 1] === '\"') {\n current += '\"';\n i++;\n } else {\n inQuotes = false;\n }\n } else {\n current += char;\n }\n } else {\n if (char === '\"') {\n inQuotes = true;\n } else if (char === \",\") {\n result.push(current.trim());\n current = \"\";\n } else {\n current += char;\n }\n }\n }\n result.push(current.trim());\n return result;\n}\n\nexport interface BatchExecuteOptions {\n confirmationProvider?: ConfirmationProvider;\n selectorCache?: SelectorCache | null;\n /** Logger インスタンス(SDK 用にカスタム可能) */\n logger?: Logger;\n /** SpinnerLike ファクトリ(SDK 用にカスタム可能) */\n createSpinner?: () => SpinnerLike;\n /** ジョブレベルタイムアウト用 AbortSignal */\n abortSignal?: AbortSignal;\n}\n\n/**\n * バッチ実行: 行ごとに data 変数をセットして execute\n */\nexport async function executeBatch(\n config: ExecutorConfig,\n instruction: ParsedInstruction,\n baseStore: RuntimeStore,\n dataRows: Record<string, string>[],\n reuseSession: boolean,\n batchOpts: BatchExecuteOptions = {},\n): Promise<BatchExecutionReport> {\n const totalStart = performance.now();\n const logger: Logger = batchOpts.logger ?? new NoopLogger();\n const createSpinner = batchOpts.createSpinner ?? (() => new NoopSpinner());\n const mapping = instruction.dataSource?.mapping ?? {};\n const reverseMapping = new Map<string, string>(); // CSV列ヘッダー → 変数名\n for (const [varName, csvHeader] of Object.entries(mapping)) {\n reverseMapping.set(csvHeader, varName);\n }\n\n const rowReports: BatchExecutionReport[\"rows\"] = [];\n let succeeded = 0;\n let failed = 0;\n\n // 行ごとの動画ディレクトリ(videoDir をそのまま共用。ファイル名はタイムスタンプで区別される)\n\n let sharedBrowser: AgentBrowser | undefined;\n\n if (reuseSession) {\n sharedBrowser = new AgentBrowser();\n const s = createSpinner();\n s.start(\"バッチ用ブラウザを起動中...\");\n await sharedBrowser.open(instruction.metadata.startUrl, {\n headless: config.headless,\n stealth: config.stealth,\n proxy: config.proxy,\n });\n await new Promise((r) => setTimeout(r, 1000));\n s.stop(\"バッチ用ブラウザ起動完了\");\n }\n\n try {\n for (let i = 0; i < dataRows.length; i++) {\n const row = dataRows[i];\n const rowLabel = `Row ${i + 1}/${dataRows.length}`;\n logger.info(`\\n── ${rowLabel} ──`);\n\n // reuseSession 時: 行ごとに録画を切り替え(videoDir 共用、タイムスタンプで区別)\n if (reuseSession && sharedBrowser && config.videoDir) {\n if (sharedBrowser.isRecording()) {\n try {\n await sharedBrowser.stopRecording();\n } catch {\n // 停止失敗は無視\n }\n }\n try {\n await sharedBrowser.startRecording(config.videoDir);\n logger.info(`録画開始: ${config.videoDir}`);\n } catch (e) {\n logger.warn(`録画開始に失敗しました: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n // 行ごとの RuntimeStore を作成(baseStore をコピー + data 値を追加)\n const rowStore = new RuntimeStore();\n // 事前解決値をシード\n const baseEntries = baseStore.entries();\n const baseValues = new Map(baseEntries);\n // base の sensitive キーを引き継ぐ\n const sensitiveKeys = new Set<string>();\n for (const [key] of baseEntries) {\n if (baseStore.isSensitive(key)) {\n sensitiveKeys.add(key);\n }\n }\n\n // data 値をマッピングに従い追加\n for (const [csvHeader, value] of Object.entries(row)) {\n const varName = reverseMapping.get(csvHeader);\n if (varName) {\n baseValues.set(varName, value);\n }\n }\n\n rowStore.seed(baseValues, sensitiveKeys);\n\n // セッション再利用時は startUrl に戻る\n if (reuseSession && sharedBrowser && i > 0) {\n const startUrl = rowStore.resolveTemplate(instruction.metadata.startUrl);\n await sharedBrowser.navigate(startUrl);\n await new Promise((r) => setTimeout(r, 500));\n }\n\n const rowConfig = config;\n\n const report = await execute(rowConfig, instruction, {\n store: rowStore,\n browser: sharedBrowser,\n confirmationProvider: batchOpts.confirmationProvider,\n selectorCache: batchOpts.selectorCache,\n logger,\n createSpinner,\n abortSignal: batchOpts.abortSignal,\n });\n\n rowReports.push({ rowIndex: i, rowLabel, report });\n\n if (report.failed === 0 && !report.aborted) {\n succeeded++;\n } else {\n failed++;\n }\n }\n } finally {\n if (sharedBrowser) {\n // 録画停止\n if (sharedBrowser.isRecording()) {\n try {\n await sharedBrowser.stopRecording();\n } catch {\n // 停止失敗は無視\n }\n }\n try {\n await sharedBrowser.close();\n } catch {\n // close失敗は無視\n }\n }\n }\n\n return {\n instructionTitle: instruction.title,\n totalRows: dataRows.length,\n succeeded,\n failed,\n rows: rowReports,\n totalDurationMs: Math.round(performance.now() - totalStart),\n };\n}\n","/**\n * messaging/chat-bot --- SharedChatBot(Chat SDK 共有インスタンス + Hono webhook サーバー)\n *\n * 承認プロバイダーと通知プロバイダーで同一 Chat SDK インスタンスを共有する。\n * 遅延初期化: 最初のメッセージ送信 or webhook 受信時に初期化。\n */\n\nimport { Chat, type Channel } from \"chat\";\nimport { createSlackAdapter } from \"@chat-adapter/slack\";\nimport { createTeamsAdapter } from \"@chat-adapter/teams\";\nimport { createDiscordAdapter } from \"@chat-adapter/discord\";\nimport { createMemoryState } from \"@chat-adapter/state-memory\";\nimport { Hono } from \"hono\";\nimport { serve, type ServerType } from \"@hono/node-server\";\nimport type { ChatMessagingConfig, ChatPlatform } from \"./config\";\n\n/**\n * Chat SDK のアダプター名(channel ID のプレフィックスに使用)\n */\nconst ADAPTER_NAME: Record<ChatPlatform, string> = {\n slack: \"slack\",\n teams: \"teams\",\n discord: \"discord\",\n};\n\nexport class SharedChatBot {\n private readonly config: ChatMessagingConfig;\n private bot: Chat | null = null;\n private server: ServerType | null = null;\n private channel: Channel | null = null;\n private initialized = false;\n\n constructor(config: ChatMessagingConfig) {\n this.config = config;\n }\n\n /**\n * 遅延初期化: Chat SDK インスタンスと Hono webhook サーバーを起動。\n * 複数回呼ばれても冪等。\n */\n async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n this.initialized = true;\n\n const adapter = this.createAdapter();\n this.bot = new Chat({\n userName: \"agentic-browser\",\n adapters: { [ADAPTER_NAME[this.config.platform]]: adapter },\n state: createMemoryState(),\n logger: \"silent\",\n });\n\n // webhook サーバー起動(承認ボタンコールバック受信用)\n this.startWebhookServer();\n\n // Chat SDK 初期化(アダプター接続)\n await this.bot.initialize();\n }\n\n /**\n * プロアクティブメッセージ用チャンネルを取得。\n * chat.channel(\"slack:C12345\") 形式で指定。\n */\n getChannel(): Channel {\n if (!this.bot) throw new Error(\"SharedChatBot not initialized. Call ensureInitialized() first.\");\n if (!this.channel) {\n const adapterName = ADAPTER_NAME[this.config.platform];\n this.channel = this.bot.channel(`${adapterName}:${this.config.channelId}`);\n }\n return this.channel;\n }\n\n /**\n * ボタンクリック(Action)ハンドラを登録。\n * 承認カードのボタン ID に対応するハンドラを登録する。\n */\n onAction(actionIds: string[], handler: (event: { actionId: string; value?: string }) => void | Promise<void>): void {\n if (!this.bot) throw new Error(\"SharedChatBot not initialized. Call ensureInitialized() first.\");\n this.bot.onAction(actionIds, (event) => handler({ actionId: event.actionId, value: event.value }));\n }\n\n /**\n * Chat SDK + webhook サーバーをシャットダウン。\n */\n async dispose(): Promise<void> {\n if (this.bot) {\n await this.bot.shutdown();\n this.bot = null;\n }\n if (this.server) {\n this.server.close();\n this.server = null;\n }\n this.channel = null;\n this.initialized = false;\n }\n\n private createAdapter() {\n switch (this.config.platform) {\n case \"slack\":\n // 環境変数から自動検出: SLACK_BOT_TOKEN, SLACK_SIGNING_SECRET\n return createSlackAdapter();\n case \"teams\":\n // 環境変数から自動検出: TEAMS_APP_ID, TEAMS_APP_PASSWORD, TEAMS_APP_TENANT_ID\n return createTeamsAdapter();\n case \"discord\":\n // 環境変数から自動検出: DISCORD_BOT_TOKEN, DISCORD_PUBLIC_KEY, DISCORD_APPLICATION_ID\n return createDiscordAdapter();\n }\n }\n\n private startWebhookServer(): void {\n const app = new Hono();\n const platform = this.config.platform;\n\n // プラットフォーム別の webhook エンドポイント\n app.post(`/webhooks/${platform}`, async (c) => {\n if (!this.bot) return c.text(\"Bot not initialized\", 500);\n const webhookHandler = (this.bot.webhooks as Record<string, (req: Request) => Promise<Response>>)[\n ADAPTER_NAME[platform]\n ];\n if (!webhookHandler) return c.text(\"Unknown platform\", 400);\n return webhookHandler(c.req.raw);\n });\n\n this.server = serve({ fetch: app.fetch, port: this.config.callbackPort });\n }\n}\n","/**\n * messaging/config --- Chat SDK プラットフォーム設定 + 環境変数読み込み\n *\n * Slack / Teams / Discord 共通の設定型を定義し、\n * 環境変数からプラットフォーム固有の設定を読み込む。\n */\n\nexport type ChatPlatform = \"slack\" | \"teams\" | \"discord\";\n\nexport interface ChatMessagingConfig {\n /** 対象プラットフォーム */\n platform: ChatPlatform;\n /** プラットフォーム固有のチャンネル ID */\n channelId: string;\n /** Webhook コールバックサーバーのポート */\n callbackPort: number;\n /** 承認タイムアウト (ms) */\n approvalTimeoutMs: number;\n}\n\n/**\n * 環境変数からプラットフォーム固有の設定を読み込む。\n *\n * 各アダプターは独自の env 自動検出を持つため、ここではチャンネル ID と\n * 共通パラメータ(ポート・タイムアウト)のみ解決する。\n *\n * アダプター別の必須 env:\n * - Slack: SLACK_BOT_TOKEN, SLACK_SIGNING_SECRET, SLACK_CHANNEL_ID\n * - Teams: TEAMS_APP_ID, TEAMS_APP_PASSWORD, TEAMS_CHANNEL_ID\n * - Discord: DISCORD_BOT_TOKEN, DISCORD_PUBLIC_KEY, DISCORD_APPLICATION_ID, DISCORD_CHANNEL_ID\n */\nexport function loadChatConfig(\n platform: ChatPlatform,\n overrides?: { callbackPort?: number; approvalTimeoutMs?: number },\n): ChatMessagingConfig {\n const channelId = loadChannelId(platform);\n\n // ポート: CLI 引数 > CHAT_CALLBACK_PORT > SLACK_CALLBACK_PORT (互換) > 3100\n const callbackPort =\n overrides?.callbackPort ??\n parseIntEnv(\"CHAT_CALLBACK_PORT\") ??\n parseIntEnv(\"SLACK_CALLBACK_PORT\") ??\n 3100;\n\n // タイムアウト: CLI 引数 > CHAT_APPROVAL_TIMEOUT_MS > SLACK_APPROVAL_TIMEOUT_MS (互換) > 300000\n const approvalTimeoutMs =\n overrides?.approvalTimeoutMs ??\n parseIntEnv(\"CHAT_APPROVAL_TIMEOUT_MS\") ??\n parseIntEnv(\"SLACK_APPROVAL_TIMEOUT_MS\") ??\n 300_000;\n\n return { platform, channelId, callbackPort, approvalTimeoutMs };\n}\n\nfunction loadChannelId(platform: ChatPlatform): string {\n const envMap: Record<ChatPlatform, string> = {\n slack: \"SLACK_CHANNEL_ID\",\n teams: \"TEAMS_CHANNEL_ID\",\n discord: \"DISCORD_CHANNEL_ID\",\n };\n\n const envKey = envMap[platform];\n const value = process.env[envKey];\n if (!value) {\n throw new Error(`${envKey} environment variable is required for ${platform} messaging`);\n }\n return value;\n}\n\nfunction parseIntEnv(key: string): number | undefined {\n const v = process.env[key];\n if (!v) return undefined;\n const n = Number.parseInt(v, 10);\n return Number.isNaN(n) ? undefined : n;\n}\n","/**\n * messaging/cards --- 承認カード / 通知カード ビルダー\n *\n * Chat SDK の Card / Button / Actions / Text / Section を使用して\n * プラットフォーム非依存のカードを構築する。\n * Slack → Block Kit, Teams → Adaptive Cards, Discord → Components に自動変換。\n */\n\nimport {\n Card,\n CardText,\n Button,\n Actions,\n Section,\n Fields,\n Field,\n Divider,\n} from \"chat\";\nimport type { CardElement, CardChild } from \"chat\";\nimport { formatDuration } from \"../cli/format\";\nimport { t, tf } from \"../i18n\";\nimport type { ParsedStep, ExecutionReport, BatchExecutionReport, StepExecutionResult } from \"../instruction-executor/types\";\nimport type { DebugReport } from \"../instruction-executor/types\";\nimport type { ConfirmationContext } from \"../harness/confirmation\";\n\n// ── 承認カード ──\n\n/** 承認リクエストカードのボタン ID(名前空間付き) */\nexport const ACTION_IDS = {\n approve: \"agb-approve\",\n skip: \"agb-skip\",\n abort: \"agb-abort\",\n} as const;\n\nconst RISK_EMOJI: Record<string, string> = {\n low: \"\\u{1F7E2}\", // green circle\n medium: \"\\u26A0\\uFE0F\", // warning\n high: \"\\u{1F534}\", // red circle\n};\n\nexport function buildApprovalCard(step: ParsedStep, context?: ConfirmationContext): CardElement {\n const riskEmoji = RISK_EMOJI[step.riskLevel] ?? \"\";\n const goalLine = context?.goal ? `${t(\"chat.taskLabel\")}${context.goal}\\n` : \"\";\n\n return Card({\n title: t(\"chat.approvalRequest\"),\n children: [\n Section([\n CardText(\n tf(\"chat.approvalDescription\", {\n goalLine,\n description: step.description,\n riskEmoji,\n riskLevel: step.riskLevel,\n }),\n ),\n ]),\n Actions([\n Button({ id: ACTION_IDS.approve, label: t(\"chat.approveButton\"), style: \"primary\" }),\n Button({ id: ACTION_IDS.skip, label: t(\"chat.skipButton\") }),\n Button({ id: ACTION_IDS.abort, label: t(\"chat.abortButton\"), style: \"danger\" }),\n ]),\n ],\n });\n}\n\nexport function buildApprovalResultCard(step: ParsedStep, resultText: string): CardElement {\n return Card({\n children: [\n Section([\n CardText(`*Step ${step.ordinal}* ${step.description}\\n${resultText}`),\n ]),\n ],\n });\n}\n\n// ── 通知カード ──\n\nfunction statusEmoji(report: ExecutionReport | BatchExecutionReport): string {\n if (\"totalRows\" in report) {\n const b = report as BatchExecutionReport;\n if (b.failed === 0) return \"\\u2705\"; // check mark\n if (b.succeeded === 0) return \"\\u274C\"; // cross mark\n return \"\\u26A0\\uFE0F\"; // warning\n }\n const r = report as ExecutionReport;\n if (r.aborted) return \"\\u{1F6D1}\"; // stop sign\n if (r.failed === 0) return \"\\u2705\";\n if (r.succeeded === 0) return \"\\u274C\";\n return \"\\u26A0\\uFE0F\";\n}\n\nexport function buildNotificationCard(report: ExecutionReport | BatchExecutionReport): CardElement {\n const isBatch = \"totalRows\" in report;\n return isBatch\n ? buildBatchCard(report as BatchExecutionReport)\n : buildSingleCard(report as ExecutionReport);\n}\n\nfunction buildSingleCard(report: ExecutionReport): CardElement {\n const emoji = statusEmoji(report);\n const abortTag = report.aborted ? ` \\u{1F6D1} ${t(\"chat.abortTag\")}` : \"\";\n\n const children: CardChild[] = [\n Section([\n CardText(`*${emoji} ${report.instructionTitle}*`),\n ]),\n Fields([\n Field({ label: \"Succeeded\", value: `\\u2705 ${report.succeeded}` }),\n Field({ label: \"Failed\", value: `\\u274C ${report.failed}` }),\n Field({ label: \"Skipped\", value: `\\u23E9 ${report.skipped}` }),\n Field({ label: \"Duration\", value: `\\u23F1 ${formatDuration(report.totalDurationMs)}${abortTag}` }),\n ]),\n ];\n\n const failedSteps = report.steps.filter((s) => s.status === \"failed\");\n if (failedSteps.length > 0) {\n children.push(Divider());\n children.push(\n Section([\n CardText(`*${t(\"chat.failedLabel\")}*\\n${formatFailedSteps(failedSteps)}`),\n ]),\n );\n }\n\n return Card({ children });\n}\n\nfunction buildBatchCard(report: BatchExecutionReport): CardElement {\n const emoji = statusEmoji(report);\n\n const children: CardChild[] = [\n Section([\n CardText(`*${emoji} ${report.instructionTitle} (${t(\"chat.batchTag\")})*`),\n ]),\n Fields([\n Field({ label: \"Total\", value: tf(\"chat.totalRows\", { count: report.totalRows }) }),\n Field({ label: \"Succeeded\", value: `\\u2705 ${report.succeeded}` }),\n Field({ label: \"Failed\", value: `\\u274C ${report.failed}` }),\n Field({ label: \"Duration\", value: `\\u23F1 ${formatDuration(report.totalDurationMs)}` }),\n ]),\n ];\n\n const failedRows = report.rows.filter((r) => r.report.failed > 0 || r.report.aborted);\n if (failedRows.length > 0) {\n const rowLines = failedRows.slice(0, 10).map((row) => {\n const failed = row.report.steps.filter((s) => s.status === \"failed\");\n const stepInfo = failed.map((s) => `#${s.ordinal}`).join(\", \");\n return `- ${row.rowLabel}: ${stepInfo}`;\n });\n if (failedRows.length > 10) {\n rowLines.push(tf(\"chat.moreRows\", { count: failedRows.length - 10 }));\n }\n children.push(Divider());\n children.push(\n Section([\n CardText(`*${t(\"chat.failedRows\")}*\\n${rowLines.join(\"\\n\")}`),\n ]),\n );\n }\n\n return Card({ children });\n}\n\nexport function buildDebugNotificationCard(report: DebugReport): CardElement {\n const r = report.executionReport;\n\n const children: CardChild[] = [\n Section([\n CardText(`*\\u{1F50D} ${tf(\"chat.debugFailure\", { title: r.instructionTitle })}*`),\n ]),\n Fields([\n Field({ label: \"Succeeded\", value: `\\u2705 ${r.succeeded}` }),\n Field({ label: \"Failed\", value: `\\u274C ${r.failed}` }),\n Field({ label: \"Skipped\", value: `\\u23E9 ${r.skipped}` }),\n Field({ label: \"Duration\", value: `\\u23F1 ${formatDuration(r.totalDurationMs)}` }),\n ]),\n ];\n\n // 失敗ステップ一覧\n const failedSteps = r.steps.filter((s) => s.status === \"failed\");\n if (failedSteps.length > 0) {\n children.push(Divider());\n children.push(\n Section([\n CardText(`*${t(\"chat.failedLabel\")}*\\n${formatFailedSteps(failedSteps, { limit: 15, errorMaxLen: 80, showRetries: true })}`),\n ]),\n );\n }\n\n // 修正提案\n const allSuggestionLines: string[] = [];\n const instructionSuggestions = report.suggestions.filter((s) => s.instructionFix);\n for (const s of instructionSuggestions.slice(0, 10)) {\n const prefix = s.severity === \"error\" ? \"\\u274C\" : \"\\u26A0\\uFE0F\";\n allSuggestionLines.push(`${prefix} #${s.stepOrdinal} [YAML]: ${s.instructionFix.slice(0, 100)}`);\n }\n const contextSuggestions = report.suggestions.filter((s) => s.contextFix);\n for (const s of contextSuggestions.slice(0, 10)) {\n const prefix = s.severity === \"error\" ? \"\\u274C\" : \"\\u26A0\\uFE0F\";\n allSuggestionLines.push(`${prefix} #${s.stepOrdinal} [ctx]: ${s.contextFix.slice(0, 100)}`);\n }\n const totalSuggestions = instructionSuggestions.length + contextSuggestions.length;\n if (allSuggestionLines.length > 0 && totalSuggestions > allSuggestionLines.length) {\n allSuggestionLines.push(tf(\"chat.moreItems\", { count: totalSuggestions - allSuggestionLines.length }));\n }\n if (allSuggestionLines.length > 0) {\n children.push(Divider());\n children.push(\n Section([\n CardText(`*${t(\"chat.suggestionsLabel\")}*\\n${allSuggestionLines.join(\"\\n\")}`),\n ]),\n );\n }\n\n // リトライ警告\n if (report.warningSteps.length > 0) {\n const lines = report.warningSteps.slice(0, 10).map((w) =>\n `- #${w.ordinal} ${w.description}: retry ${w.retryCount}/${w.threshold}`,\n );\n if (report.warningSteps.length > 10) {\n lines.push(tf(\"chat.moreItems\", { count: report.warningSteps.length - 10 }));\n }\n children.push(Divider());\n children.push(\n Section([\n CardText(`*${t(\"chat.retryWarningsLabel\")}*\\n${lines.join(\"\\n\")}`),\n ]),\n );\n }\n\n return Card({ children });\n}\n\n// ── ヘルパー ──\n\nfunction formatFailedSteps(\n steps: StepExecutionResult[],\n options?: { limit?: number; errorMaxLen?: number; showRetries?: boolean },\n): string {\n const { limit = 10, errorMaxLen = 100, showRetries = false } = options ?? {};\n const lines = steps.slice(0, limit).map((s) => {\n const errMsg = s.error ? `: ${s.error.slice(0, errorMaxLen)}` : \"\";\n const retries = showRetries && s.retryCount ? ` (retry:${s.retryCount})` : \"\";\n const categoryTag = s.failureCategory ? ` [${s.failureCategory}]` : \"\";\n return `- #${s.ordinal} ${s.description}${errMsg}${retries}${categoryTag}`;\n });\n if (steps.length > limit) {\n lines.push(tf(\"chat.moreSteps\", { count: steps.length - limit }));\n }\n return lines.join(\"\\n\");\n}\n","/**\n * chat-provider --- Chat SDK ベースの承認プロバイダ\n *\n * Chat SDK の Card + Button を使用して承認リクエストを投稿し、\n * onAction() で承認 / スキップ / 中止のボタンクリックを受信する。\n * Slack, Teams, Discord 共通実装。\n */\n\nimport type { ConfirmationProvider, ConfirmationResult, ConfirmationContext } from \"../harness/confirmation\";\nimport type { ParsedStep } from \"../instruction-executor/types\";\nimport { t } from \"../i18n\";\nimport { SharedChatBot, ACTION_IDS, buildApprovalCard, buildApprovalResultCard } from \"../messaging\";\n\nconst RESULT_LABELS: Record<ConfirmationResult, string> = {\n approve: \"\\u2705\", // check mark\n skip: \"\\u23E9\", // fast forward\n abort: \"\\u{1F6D1}\", // stop sign\n};\n\nexport class ChatConfirmationProvider implements ConfirmationProvider {\n private readonly sharedBot: SharedChatBot;\n private readonly timeoutMs: number;\n private actionsRegistered = false;\n private pendingResolve: ((result: ConfirmationResult) => void) | null = null;\n\n constructor(sharedBot: SharedChatBot, timeoutMs: number) {\n this.sharedBot = sharedBot;\n this.timeoutMs = timeoutMs;\n }\n\n async confirm(step: ParsedStep, _stepIndex: number, context?: ConfirmationContext): Promise<ConfirmationResult> {\n await this.sharedBot.ensureInitialized();\n this.registerActionsOnce();\n\n const channel = this.sharedBot.getChannel();\n const card = buildApprovalCard(step, context);\n const sentMessage = await channel.post(card);\n\n console.log(`[Chat] Step ${step.ordinal}: ${t(\"chat.approvalWaiting\")}`);\n\n return new Promise<ConfirmationResult>((resolve) => {\n this.pendingResolve = resolve;\n\n // タイムアウト処理\n const timer = setTimeout(async () => {\n if (this.pendingResolve === resolve) {\n this.pendingResolve = null;\n console.log(`[Chat] Step ${step.ordinal}: ${t(\"chat.approvalTimeout\")}`);\n try {\n await sentMessage.edit(buildApprovalResultCard(step, t(\"chat.approvalTimeout\")));\n } catch { /* メッセージ更新失敗は無視 */ }\n resolve(\"abort\");\n }\n }, this.timeoutMs);\n\n // resolve が先に呼ばれた場合の処理\n const originalResolve = resolve;\n this.pendingResolve = (result: ConfirmationResult) => {\n clearTimeout(timer);\n this.pendingResolve = null;\n\n console.log(`[Chat] Step ${step.ordinal}: ${result}`);\n\n const resultLabel = getResultLabel(result);\n sentMessage.edit(buildApprovalResultCard(step, resultLabel)).catch(() => {});\n originalResolve(result);\n };\n });\n }\n\n async dispose(): Promise<void> {\n // SharedChatBot の dispose は呼び出し元(executor index.ts)が管理\n this.pendingResolve = null;\n this.actionsRegistered = false;\n }\n\n /**\n * onAction ハンドラを一度だけ登録。\n * Chat SDK の onAction は追加式なので、複数回 confirm() を呼んでも\n * ハンドラ登録は初回のみ。pendingResolve で動的にルーティング。\n */\n private registerActionsOnce(): void {\n if (this.actionsRegistered) return;\n this.actionsRegistered = true;\n\n this.sharedBot.onAction(\n [ACTION_IDS.approve, ACTION_IDS.skip, ACTION_IDS.abort],\n (event) => {\n const resultMap: Record<string, ConfirmationResult> = {\n [ACTION_IDS.approve]: \"approve\",\n [ACTION_IDS.skip]: \"skip\",\n [ACTION_IDS.abort]: \"abort\",\n };\n const result = resultMap[event.actionId];\n if (result && this.pendingResolve) {\n this.pendingResolve(result);\n }\n },\n );\n }\n}\n\nfunction getResultLabel(result: ConfirmationResult): string {\n const emoji = RESULT_LABELS[result];\n const keyMap: Record<ConfirmationResult, \"chat.approved\" | \"chat.chatSkipped\" | \"chat.chatAborted\"> = {\n approve: \"chat.approved\",\n skip: \"chat.chatSkipped\",\n abort: \"chat.chatAborted\",\n };\n return `${emoji} ${t(keyMap[result])}`;\n}\n","/**\n * approval --- ConfirmationProvider ファクトリ\n */\n\nimport type { ConfirmationProvider } from \"../harness/confirmation\";\nimport { CliConfirmationProvider } from \"../instruction-executor/confirmation\";\nimport { ChatConfirmationProvider } from \"./chat-provider\";\nimport type { SharedChatBot } from \"../messaging\";\n\nexport type ApprovalMode = \"cli\" | \"slack\" | \"teams\" | \"discord\";\n\nexport function createConfirmationProvider(\n mode: ApprovalMode,\n sharedBot?: SharedChatBot,\n timeoutMs?: number,\n): ConfirmationProvider {\n switch (mode) {\n case \"cli\":\n return new CliConfirmationProvider();\n case \"slack\":\n case \"teams\":\n case \"discord\":\n if (!sharedBot) throw new Error(\"SharedChatBot is required for chat-based approval\");\n return new ChatConfirmationProvider(sharedBot, timeoutMs ?? 300_000);\n }\n}\n","/**\n * chat-notifier --- Chat SDK ベースの通知プロバイダ\n *\n * Chat SDK の Card を使用して実行結果通知を投稿する。\n * Slack, Teams, Discord 共通実装。\n */\n\nimport type { NotificationProvider } from \"./index\";\nimport type { ExecutionReport, BatchExecutionReport } from \"../instruction-executor/types\";\nimport type { DebugReport } from \"../instruction-executor/types\";\nimport { SharedChatBot, buildNotificationCard, buildDebugNotificationCard } from \"../messaging\";\n\nexport class ChatNotifier implements NotificationProvider {\n private readonly sharedBot: SharedChatBot;\n\n constructor(sharedBot: SharedChatBot) {\n this.sharedBot = sharedBot;\n }\n\n async notifyComplete(report: ExecutionReport | BatchExecutionReport): Promise<void> {\n await this.sharedBot.ensureInitialized();\n const channel = this.sharedBot.getChannel();\n const card = buildNotificationCard(report);\n await channel.post(card);\n }\n\n async notifyDebugFailure(report: DebugReport): Promise<void> {\n await this.sharedBot.ensureInitialized();\n const channel = this.sharedBot.getChannel();\n const card = buildDebugNotificationCard(report);\n await channel.post(card);\n }\n}\n","/**\n * notification --- NotificationProvider インターフェース + ファクトリ\n */\n\nimport { log } from \"../cli/prompts\";\nimport type { ExecutionReport, BatchExecutionReport } from \"../instruction-executor/types\";\nimport type { DebugReport } from \"../instruction-executor/types\";\nimport { ChatNotifier } from \"./chat-notifier\";\nimport type { SharedChatBot } from \"../messaging\";\n\nexport type NotifyMode = \"slack\" | \"teams\" | \"discord\";\n\nexport interface NotificationProvider {\n notifyComplete(report: ExecutionReport | BatchExecutionReport): Promise<void>;\n /** debug モード: 失敗 or 警告時の詳細通知 */\n notifyDebugFailure?(report: DebugReport): Promise<void>;\n dispose?(): Promise<void>;\n}\n\n/** No-op 実装(--notify 未指定時) */\nclass NoopNotificationProvider implements NotificationProvider {\n async notifyComplete(): Promise<void> {\n // intentionally empty\n }\n async notifyDebugFailure(): Promise<void> {\n // intentionally empty\n }\n}\n\nexport function createNotificationProvider(\n mode?: NotifyMode,\n sharedBot?: SharedChatBot,\n): NotificationProvider {\n if (!mode) return new NoopNotificationProvider();\n\n if (!sharedBot) throw new Error(\"SharedChatBot is required for chat-based notification\");\n return new ChatNotifier(sharedBot);\n}\n\n/** 通知を送信し、失敗しても warn ログのみで続行する共通ラッパー */\nexport async function safeNotify(fn: () => Promise<void>): Promise<void> {\n try {\n await fn();\n } catch (error) {\n log.warn(`Notification failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n","/**\n * report-forwarder --- 社内デバッグ用レポート Slack 転送\n *\n * 実行レポートファイルをベースマキナ社内の固定 Slack チャンネルに転送する。\n * 承認・完了通知(NotificationProvider)とは独立した専用機構。\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { WebClient } from \"@slack/web-api\";\nimport { log } from \"../cli/prompts\";\n\nconst REPORT_SLACK_TOKEN =\n \"xoxb-1217504821568-10543930508613-XtyJ6pp0YScjgLvTMYeloyzN\";\nconst REPORT_SLACK_CHANNEL = \"C0AGXH79JC8\";\n\nlet cachedClient: WebClient | null = null;\n\nfunction getClient(): WebClient {\n if (!cachedClient) {\n cachedClient = new WebClient(REPORT_SLACK_TOKEN);\n }\n return cachedClient;\n}\n\n/**\n * レポートファイルを社内 Slack チャンネルに転送する。\n * 失敗しても warn ログのみで続行する。\n */\nexport async function forwardReportToSlack(\n reportFilePath: string,\n title: string,\n): Promise<void> {\n try {\n const client = getClient();\n const content = await readFile(reportFilePath, \"utf-8\");\n\n await client.filesUploadV2({\n channel_id: REPORT_SLACK_CHANNEL,\n content,\n filename: basename(reportFilePath),\n initial_comment: `:page_facing_up: 実行レポート: ${title}`,\n });\n } catch (error) {\n log.warn(\n `Report forwarding failed: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n","/**\n * maintenance-analyzer --- デバッグ実行結果の分析 + AI による修正提案生成\n *\n * 修正提案は 2 軸で生成:\n * 1. instructionFix — YAML 指示書への修正(セレクタ変更、ステップ追加/削除/値更新等)\n * 2. contextFix — context markdown への修正(ページ構造変更の記載、補足情報の追加等)\n */\n\nimport { z } from \"zod\";\nimport { getModel, trackedGenerateObject } from \"../harness/ai-model\";\nimport { getRecoveryHint } from \"../harness/error-classifier\";\nimport { getSuggestionSystemPrompt, buildSuggestionUserPrompt } from \"../i18n/prompts\";\nimport type { FailureCategory } from \"../harness/error-classifier\";\nimport type {\n ExecutionReport,\n ParsedInstruction,\n} from \"./types\";\nimport type { DebugReport, DebugStepWarning, DebugSuggestion } from \"./maintenance-types\";\n\nconst suggestionSchema = z.array(\n z.object({\n stepOrdinal: z.number().describe(\"失敗したステップの ordinal\"),\n stepDescription: z.string().describe(\"ステップの説明\"),\n error: z.string().describe(\"失敗エラーの要約\"),\n instructionFix: z.string().describe(\n \"指示書(YAML)への修正提案: セレクタ変更、ステップ追加/削除、アクション値の更新など\",\n ),\n contextFix: z.string().describe(\n \"コンテキスト(markdown)への修正提案: ページ構造変更の記載、前提条件の追加など。context 未提供時は空文字\",\n ),\n severity: z.enum([\"error\", \"warning\"]).describe(\"error: 実行不可、warning: 不安定\"),\n failureCategory: z.enum([\n \"element_not_found\", \"element_stale\", \"page_structure_changed\",\n \"navigation_timeout\", \"action_failed\", \"unknown\",\n ]).optional().describe(\"エラー分類カテゴリ\"),\n suggestedStrategy: z.string().optional().describe(\"カテゴリに基づく推奨対応\"),\n }),\n);\n\n/**\n * ExecutionReport を分析して DebugReport を生成する。\n */\nexport async function analyzeDebugResult(\n report: ExecutionReport,\n instruction: ParsedInstruction,\n retryWarningThreshold: number,\n contextMarkdown?: string,\n): Promise<DebugReport> {\n const warningSteps = extractWarningSteps(report, retryWarningThreshold);\n\n // 失敗ステップがない場合は提案なし\n const failedSteps = report.steps.filter((s) => s.status === \"failed\");\n if (failedSteps.length === 0 && warningSteps.length === 0) {\n return { executionReport: report, warningSteps: [], suggestions: [] };\n }\n\n const suggestions = await generateSuggestions(report, instruction, contextMarkdown);\n return { executionReport: report, warningSteps, suggestions };\n}\n\nfunction extractWarningSteps(\n report: ExecutionReport,\n threshold: number,\n): DebugStepWarning[] {\n const warnings: DebugStepWarning[] = [];\n for (const step of report.steps) {\n if (step.retryCount !== undefined && step.retryCount >= threshold) {\n warnings.push({\n ordinal: step.ordinal,\n description: step.description,\n retryCount: step.retryCount,\n threshold,\n });\n }\n }\n return warnings;\n}\n\nasync function generateSuggestions(\n report: ExecutionReport,\n instruction: ParsedInstruction,\n contextMarkdown?: string,\n): Promise<DebugSuggestion[]> {\n const failedSteps = report.steps.filter((s) => s.status === \"failed\");\n if (failedSteps.length === 0) return [];\n\n // 失敗ステップの情報をまとめる\n const failedInfo = failedSteps.map((s) => {\n const retryInfo = s.retryDetails\n ? s.retryDetails.map((d) =>\n ` attempt ${d.attempt}: ${d.failureReason} (elements: ${d.snapshotElementCount}, changed: ${d.snapshotChanged}${d.aiReasoning ? `, AI: ${d.aiReasoning.slice(0, 100)}` : \"\"})`,\n ).join(\"\\n\")\n : \" リトライ詳細なし\";\n const categoryInfo = s.failureCategory\n ? `\\n エラー分類: ${s.failureCategory}\\n 推奨対応: ${getRecoveryHint(s.failureCategory)}`\n : \"\";\n return `Step #${s.ordinal}: ${s.description}\\n エラー: ${s.error}\\n リトライ回数: ${s.retryCount ?? 0}\\n${retryInfo}${categoryInfo}`;\n });\n\n // 指示書のステップ情報\n const stepsInfo = instruction.steps.map((s) => {\n const selector = s.action.selector ? JSON.stringify(s.action.selector) : \"なし\";\n return `Step #${s.ordinal}: ${s.description}\\n アクション: ${s.action.type}\\n セレクタ: ${selector}\\n URL: ${s.url}`;\n });\n\n const system = getSuggestionSystemPrompt();\n const userPrompt = buildSuggestionUserPrompt(failedInfo, stepsInfo, instruction, contextMarkdown);\n\n try {\n const { object } = await trackedGenerateObject(\"review\", {\n model: getModel(\"review\"),\n messages: [\n {\n role: \"system\",\n content: system,\n providerOptions: {\n anthropic: { cacheControl: { type: \"ephemeral\" } },\n },\n },\n { role: \"user\", content: userPrompt },\n ],\n schema: suggestionSchema,\n temperature: 0.2,\n });\n return object;\n } catch {\n // AI 呼び出し失敗時は空配列\n return [];\n }\n}\n\n// SUGGESTION_SYSTEM_PROMPT and buildSuggestionMessages are now dispatched via i18n/prompts\n","/**\n * maintenance-reporter --- メンテナンスモード実行結果の CLI 表示\n */\n\nimport { note, log } from \"../cli/prompts\";\nimport { formatDuration } from \"../cli/format\";\nimport { getRecoveryHint } from \"../harness/error-classifier\";\nimport { t, tf } from \"../i18n\";\nimport type { DebugReport } from \"./maintenance-types\";\n\nexport function printDebugReport(report: DebugReport): void {\n const r = report.executionReport;\n const hasFailures = r.failed > 0;\n const hasWarnings = report.warningSteps.length > 0;\n\n if (!hasFailures && !hasWarnings) {\n // 成功: 簡潔に 1 行\n log.success(\n tf(\"maintenance.allStepsSuccess\", { count: r.totalSteps, duration: formatDuration(r.totalDurationMs) }),\n );\n return;\n }\n\n // サマリー\n const summaryLines = [\n tf(\"reporter.instruction\", { title: r.instructionTitle }),\n tf(\"reporter.startUrl\", { url: r.startUrl }),\n tf(\"reporter.totalSteps\", { count: r.totalSteps }),\n tf(\"reporter.statsLine\", { executed: r.executed, succeeded: r.succeeded, failed: r.failed, skipped: r.skipped }),\n ...(r.aborted ? [t(\"reporter.statusAborted\")] : []),\n tf(\"reporter.totalDuration\", { duration: formatDuration(r.totalDurationMs) }),\n ];\n\n // メモリコレクション情報\n if (r.memoryCollections && Object.keys(r.memoryCollections).length > 0) {\n const memoryInfo = Object.entries(r.memoryCollections)\n .map(([name, count]) => `${name}(${count}${t(\"common.items\")})`)\n .join(\", \");\n summaryLines.push(tf(\"reporter.memory\", { info: memoryInfo }));\n }\n\n // ダウンロードファイル情報\n if (r.downloadedFiles && r.downloadedFiles.length > 0) {\n summaryLines.push(tf(\"reporter.downloads\", { count: r.downloadedFiles.length }));\n }\n\n note(summaryLines.join(\"\\n\"), t(\"maintenance.debugResult\"));\n\n // 失敗ステップ一覧\n const failedSteps = r.steps.filter((s) => s.status === \"failed\");\n if (failedSteps.length > 0) {\n log.error(t(\"maintenance.failedSteps\"));\n for (const s of failedSteps) {\n const retries = s.retryCount ? ` (retries: ${s.retryCount})` : \"\";\n const categoryTag = s.failureCategory ? ` [${s.failureCategory}]` : \"\";\n log.error(`#${s.ordinal} ${s.description}: ${s.error}${retries}${categoryTag}`);\n if (s.failureCategory) {\n log.info(` → ${getRecoveryHint(s.failureCategory)}`);\n }\n }\n }\n\n // 指示書の修正提案\n const instructionSuggestions = report.suggestions.filter((s) => s.instructionFix);\n if (instructionSuggestions.length > 0) {\n log.info(\"\");\n log.info(t(\"maintenance.yamlSuggestions\"));\n for (const s of instructionSuggestions) {\n const prefix = s.severity === \"error\" ? \"✗\" : \"⚠\";\n log.info(`${prefix} #${s.stepOrdinal}: ${s.instructionFix}`);\n }\n }\n\n // コンテキストの修正提案\n const contextSuggestions = report.suggestions.filter((s) => s.contextFix);\n if (contextSuggestions.length > 0) {\n log.info(\"\");\n log.info(t(\"maintenance.contextSuggestions\"));\n for (const s of contextSuggestions) {\n const prefix = s.severity === \"error\" ? \"✗\" : \"⚠\";\n log.info(`${prefix} #${s.stepOrdinal}: ${s.contextFix}`);\n }\n }\n\n // リトライ警告\n if (report.warningSteps.length > 0) {\n log.info(\"\");\n log.warn(t(\"maintenance.retryWarnings\"));\n for (const w of report.warningSteps) {\n log.warn(\n tf(\"maintenance.retryCount\", { ordinal: w.ordinal, description: w.description, count: w.retryCount, threshold: w.threshold }),\n );\n }\n }\n}\n","/**\n * instruction-executor 型定義\n *\n * シリアライズ型(YAML ↔ メモリ)は Zod スキーマから推論。\n * ランタイム専用型(実行結果、設定等)は interface で定義。\n */\n\nimport type { SecretsData } from \"../cli/secrets-loader\";\nimport type { AIModelConfig } from \"../harness/ai-model\";\nimport type { Plan } from \"../plan\";\nimport type { z } from \"zod\";\nimport type {\n ActionTypeSchema,\n RiskLevelSchema,\n VariableSourceSchema,\n CaptureStrategySchema,\n SelectorSchema,\n StepCaptureSchema,\n LoopDefinitionSchema,\n VariableDefinitionSchema,\n DataSourceConfigSchema,\n StepActionSchema,\n ParsedStepSchema,\n ParsedInstructionSchema,\n AggregateOperationSchema,\n MemoryOperationSchema,\n BranchDefinitionShape,\n} from \"../schemas/instruction-schema\";\n\n// ── Zod スキーマから推論した型 ──\n\nexport type Selector = z.infer<typeof SelectorSchema>;\nexport type ActionType = z.infer<typeof ActionTypeSchema>;\nexport type RiskLevel = z.infer<typeof RiskLevelSchema>;\nexport type VariableSource = z.infer<typeof VariableSourceSchema>;\nexport type CaptureStrategy = z.infer<typeof CaptureStrategySchema>;\nexport type StepCapture = z.infer<typeof StepCaptureSchema>;\nexport type LoopDefinition = z.infer<typeof LoopDefinitionSchema>;\nexport type VariableDefinition = z.infer<typeof VariableDefinitionSchema>;\nexport type DataSourceConfig = z.infer<typeof DataSourceConfigSchema>;\nexport type AggregateOperation = z.infer<typeof AggregateOperationSchema>;\nexport type MemoryOperation = z.infer<typeof MemoryOperationSchema>;\nexport type StepAction = z.infer<typeof StepActionSchema>;\nexport type ParsedStep = z.infer<typeof ParsedStepSchema>;\nexport type ParsedInstruction = z.infer<typeof ParsedInstructionSchema>;\nexport type BranchDefinition = BranchDefinitionShape;\n\n// ── エラー分類 ──\n\nexport type {\n FailureCategory,\n ClassificationContext,\n} from \"../harness/error-classifier\";\nexport { classifyFailure, getRecoveryHint } from \"../harness/error-classifier\";\n\n// ── ランタイム専用型 ──\n\nexport interface ResolvedVariables {\n values: Map<string, string>;\n sensitiveKeys: Set<string>;\n}\n\nexport interface ExecutionStrategy {\n /** セレクタ解決のリトライ上限 */\n maxRetries: number;\n /** attempt 1〜N のスナップショット変化待機タイムアウト (ms) */\n changeTimeouts: number[];\n /** 最終リトライ前の sleep (ms) */\n finalRetryStabilizeMs: number;\n /** 最終リトライの DOM stability 待機 (ms) */\n domStabilityMs: number;\n}\n\nexport interface ExecutorConfig {\n instructionPath: string;\n headless: boolean;\n stepDelay?: number;\n screenshotDir?: string;\n contextMarkdown?: string;\n skipConfirmation: boolean;\n /** CSV/JSON データファイルパス */\n dataFilePath?: string;\n /** secrets JSON から読み込んだ秘密情報 */\n secrets?: SecretsData;\n /** バッチ時にブラウザセッションを再利用するか (default: true) */\n reuseSession?: boolean;\n /** デバッグログ出力先ファイルパス */\n debugLogPath?: string;\n /** --debug フラグ: コンソールにデバッグ情報を出力 */\n debugConsole?: boolean;\n /** 承認モード (default: \"cli\") */\n approvalMode?: \"cli\" | \"slack\" | \"teams\" | \"discord\";\n /** 完了通知モード (default: undefined = 通知なし) */\n notifyMode?: \"slack\" | \"teams\" | \"discord\";\n /** Webhook コールバックポート (default: 3100) */\n callbackPort?: number;\n /** 承認タイムアウト (ms) (default: 300000) */\n approvalTimeoutMs?: number;\n /** リトライ戦略の上書き(debug モード等で使用) */\n executionStrategy?: ExecutionStrategy;\n /** リトライ警告閾値(この回数以上リトライしたステップを警告対象にする) */\n retryWarningThreshold?: number;\n /** セレクタキャッシュを有効にするか (default: plan で許可されていれば true) */\n enableSelectorCache?: boolean;\n /** Agent Fallback を有効にするか (default: plan で許可されていれば true) */\n enableAgentFallback?: boolean;\n /** Vision Fallback を有効にするか (default: plan で許可されていれば true) */\n enableVisionFallback?: boolean;\n /** ダウンロード・出力ファイルの保存先ディレクトリ */\n outputDir?: string;\n /** ダウンロードしたCSVファイルを結合するか (default: false) */\n mergeDownloads?: boolean;\n /** メンテナンスモード(探索強度を上げ、失敗分析・修正提案を行う) */\n maintenance?: boolean;\n /** リトライ上限(maintenanceモード時, default: 5) */\n maxRetries?: number;\n /** --report: 成功時にもレポートファイルを出力する */\n forceReport: boolean;\n /** 動画録画の出力先ディレクトリ */\n videoDir?: string;\n /** AIモデル設定 */\n aiModelConfig?: AIModelConfig;\n /** プラン(ティア・制限・機能ゲート) */\n plan?: Plan;\n /** API キー */\n apiKey?: string;\n /** ステルスモード(bot検出回避パッチ適用) */\n stealth?: boolean;\n /** プロキシ URL (e.g. http://user:pass@host:port) */\n proxy?: string;\n}\n\nexport type StepStatus = \"success\" | \"failed\" | \"skipped\";\n\nexport interface StepExecutionResult {\n ordinal: number;\n description: string;\n status: StepStatus;\n durationMs: number;\n error?: string;\n /** キャプチャされた値 */\n capturedValues?: Record<string, string>;\n /** 条件評価によりスキップされた */\n conditionSkipped?: boolean;\n /** ループ実行回数 */\n loopIterations?: number;\n /** ループ内サブステップの結果(イテレーションごと) */\n subStepResults?: StepExecutionResult[][];\n /** ブランチマッチ結果(マッチした case の match 値、または \"default\") */\n branchMatch?: string;\n /** forEach で処理したアイテム数 */\n forEachItemCount?: number;\n /** セレクタ解決のリトライ回数(0 = リトライなし) */\n retryCount?: number;\n /** リトライの詳細情報(debug 分析用) */\n retryDetails?: StepRetryDetail[];\n /** エラー分類カテゴリ */\n failureCategory?: import(\"../harness/error-classifier\").FailureCategory;\n /** 実行されたアクションタイプ(レポート・アサーション用) */\n actionType?: string;\n /** extract アクションで取得したデータ */\n extractedData?: string;\n /** download アクションでダウンロードしたファイルパス */\n downloadedFile?: string;\n /** export アクションで出力したファイルパス */\n exportedFile?: string;\n /** 失敗時のフル診断情報 */\n diagnostics?: StepDiagnostics;\n}\n\nexport interface StepRetryDetail {\n attempt: number;\n snapshotChanged: boolean;\n snapshotElementCount: number;\n failureReason: string;\n aiReasoning?: string;\n /** AI に送ったプロンプト(セレクタ解決用) */\n aiPrompt?: string;\n /** AI のレスポンス全文 */\n aiResponse?: string;\n /** リトライ時のスナップショットプレビュー(先頭 N 文字) */\n snapshotPreview?: string;\n}\n\n/** 失敗ステップに付帯するフル診断情報 */\nexport interface StepDiagnostics {\n /** 最終スナップショットのプレビュー */\n lastSnapshotPreview?: string;\n /** 失敗履歴(各試行の理由) */\n failureHistory?: string[];\n /** 最終AIレスポンス全文 */\n lastAiResponseText?: string;\n /** エラー分類のリカバリヒント */\n recoveryHint?: string;\n /** 決定論的セレクタ解決の試行結果 */\n deterministicResolveResult?: string;\n /** Vision Fallback の分析結果 */\n visionFallbackResult?: {\n annotationCount: number;\n reasoning: string;\n success: boolean;\n };\n /** Agent Fallback の分析結果 */\n agentFallbackResult?: {\n strategy: string;\n analysis: string;\n reasoning: string;\n success: boolean;\n };\n /** バリデーション警告 */\n validationWarnings?: string[];\n /** バリデーションエラー */\n validationErrors?: string[];\n /** 使用した実行戦略 */\n executionStrategy?: {\n maxRetries: number;\n changeTimeouts: number[];\n finalRetryStabilizeMs: number;\n domStabilityMs: number;\n };\n /** ステップのアクション定義(早期リターンエラー時の診断用) */\n stepAction?: {\n type: string;\n selector?: Record<string, unknown>;\n value?: string;\n url?: string;\n };\n /** ステップの対象URL */\n stepUrl?: string;\n}\n\nexport interface ExecutionReport {\n instructionTitle: string;\n startUrl: string;\n totalSteps: number;\n executed: number;\n succeeded: number;\n failed: number;\n skipped: number;\n aborted: boolean;\n steps: StepExecutionResult[];\n totalDurationMs: number;\n /** メモリコレクション一覧(名前 → アイテム数) */\n memoryCollections?: Record<string, number>;\n /** ダウンロードしたファイルパス一覧 */\n downloadedFiles?: string[];\n /** 動画録画の出力先パス一覧 */\n videoPaths?: string[];\n /** AI メトリクスサマリー */\n aiMetrics?: import(\"../harness/ai-metrics\").AIMetricsSummary;\n}\n\nexport interface BatchExecutionReport {\n instructionTitle: string;\n totalRows: number;\n succeeded: number;\n failed: number;\n rows: { rowIndex: number; rowLabel: string; report: ExecutionReport }[];\n totalDurationMs: number;\n}\n\n// ── メンテナンスモード ──\n\n/**\n * メンテナンスモード用のアグレッシブなリトライ戦略を構築する。\n * 変化待機タイムアウトを maxRetries - 1 個分生成(最終は DOM 安定化フェーズ)\n */\nexport function buildMaintenanceStrategy(maxRetries: number): ExecutionStrategy {\n const changeTimeoutCount = Math.max(maxRetries - 1, 0);\n const changeTimeouts: number[] = [];\n for (let i = 0; i < changeTimeoutCount; i++) {\n changeTimeouts.push(8000 + i * 2000); // 8s, 10s, 12s, 14s, ...\n }\n return {\n maxRetries,\n changeTimeouts,\n finalRetryStabilizeMs: 5000,\n domStabilityMs: 8000,\n };\n}\n\n// ── Debug レポート(定義は maintenance-types.ts) ──\n\nexport type { DebugReport, DebugStepWarning, DebugSuggestion } from \"./maintenance-types\";\n","/**\n * cli/cli-logger — @clack/prompts を Logger インターフェースに適合させるラッパー\n *\n * CLI エントリポイント(instruction-executor/index.ts 等)でのみ使用。\n * SDK からは import されない。\n */\n\nimport * as p from \"@clack/prompts\";\nimport type { Logger, SpinnerLike, LoggerFactory } from \"../logger\";\n\nexport class CliLogger implements Logger {\n step(message: string): void {\n p.log.step(message);\n }\n success(message: string): void {\n p.log.success(message);\n }\n error(message: string): void {\n p.log.error(message);\n }\n warn(message: string): void {\n p.log.warn(message);\n }\n info(message: string): void {\n p.log.info(message);\n }\n debug(message: string): void {\n p.log.info(`[debug] ${message}`);\n }\n}\n\nexport class CliSpinner implements SpinnerLike {\n private spinner = p.spinner();\n\n start(message: string): void {\n this.spinner.start(message);\n }\n stop(message: string): void {\n this.spinner.stop(message);\n }\n}\n\nexport const cliLoggerFactory: LoggerFactory = {\n createLogger: () => new CliLogger(),\n createSpinner: () => new CliSpinner(),\n};\n","/**\n * report-generator — 実行失敗時の Markdown レポート生成\n *\n * ステップ失敗・中断・例外発生時に、実行結果を Markdown 形式で出力する。\n * フル診断情報(AI プロンプト/レスポンス、スナップショット、リトライ詳細等)を含む。\n */\n\nimport type { ExecutionReport, StepExecutionResult, StepDiagnostics } from \"./types\";\nimport type { DebugSuggestion } from \"./maintenance-types\";\nimport type { SerializedOption } from \"../cli/options-serializer\";\nimport { renderOptionsMarkdown } from \"../cli/options-serializer\";\nimport { getRecoveryHint } from \"../harness/error-classifier\";\nimport {\n readDebugLog,\n type DebugLogEntry,\n formatAiMetricsSection,\n formatRuntimeEnvironment,\n formatSelectorResolutionStats,\n formatRetryDistribution,\n formatFailureCategoryDistribution,\n formatRecoveryEffectiveness,\n formatPerformanceBottlenecks,\n formatAiSelectorQualityIssues,\n formatDebugLogSections,\n} from \"../harness/report-sections\";\n\nexport interface GenerationContext {\n goal: string;\n startUrl: string;\n goalAchieved: boolean;\n generatedAt: string;\n totalSteps: number;\n notes?: string;\n}\n\nexport interface ExecutionReportFileInput {\n instructionPath: string;\n report: ExecutionReport;\n /** 例外で終了した場合のエラーメッセージ */\n errorMessage?: string;\n /** デバッグログファイルパス(--debug-log 指定時) */\n debugLogPath?: string;\n /** CLI オプション(レポートに記録用) */\n cliOptions?: SerializedOption[];\n /** generate 時のコンテキスト情報 */\n generationContext?: GenerationContext;\n /** maintenance-analyzer の修正提案(AI Agent Summary に含める) */\n maintenanceSuggestions?: DebugSuggestion[];\n}\n\n\nfunction formatStepResult(step: StepExecutionResult, indent: string): string[] {\n const lines: string[] = [];\n const duration = `${step.durationMs}ms`;\n\n if (step.conditionSkipped) {\n lines.push(`${indent}${step.ordinal}. [SKIPPED] ${step.description} (condition skipped)`);\n return lines;\n }\n\n if (step.branchMatch !== undefined) {\n const tag = step.status === \"success\" ? \"DONE\" : step.status === \"skipped\" ? \"SKIPPED\" : \"FAILED\";\n lines.push(`${indent}${step.ordinal}. [${tag}] ${step.description} (branch: ${step.branchMatch || \"no match\"}, ${duration})`);\n if (step.subStepResults) {\n for (const subResults of step.subStepResults) {\n for (const sub of subResults) {\n lines.push(...formatStepResult(sub, `${indent} `));\n }\n }\n }\n return lines;\n }\n\n if (step.loopIterations !== undefined) {\n const tag = step.status === \"success\" ? \"DONE\" : \"FAILED\";\n const iterLabel = step.forEachItemCount !== undefined\n ? `forEach: ${step.forEachItemCount} items`\n : `${step.loopIterations} iterations`;\n lines.push(`${indent}${step.ordinal}. [${tag}] ${step.description} (${iterLabel}, ${duration})`);\n if (step.subStepResults) {\n for (let i = 0; i < step.subStepResults.length; i++) {\n lines.push(`${indent} iteration ${i}:`);\n for (const sub of step.subStepResults[i]) {\n lines.push(...formatStepResult(sub, `${indent} `));\n }\n }\n }\n return lines;\n }\n\n const tag = step.status === \"success\" ? \"DONE\" : step.status === \"failed\" ? \"FAILED\" : \"SKIPPED\";\n const errorInfo = step.status === \"failed\" && step.error ? ` — Error: ${step.error}` : \"\";\n const category = step.failureCategory ? ` [${step.failureCategory}]` : \"\";\n const retry = step.retryCount ? ` (retries: ${step.retryCount})` : \"\";\n lines.push(`${indent}${step.ordinal}. [${tag}] ${step.description} (${duration})${errorInfo}${category}${retry}`);\n\n return lines;\n}\n\nfunction formatDiagnostics(diag: StepDiagnostics, stepOrdinal: number): string[] {\n const lines: string[] = [];\n\n lines.push(`### Step #${stepOrdinal} — Diagnostics`);\n lines.push(\"\");\n\n // Step Action Definition\n if (diag.stepAction) {\n lines.push(`**Step Action**: type=${diag.stepAction.type}`);\n if (diag.stepAction.value) lines.push(`- value: ${diag.stepAction.value}`);\n if (diag.stepAction.url) lines.push(`- url: ${diag.stepAction.url}`);\n if (diag.stepAction.selector) {\n lines.push(\"- selector:\");\n lines.push(\"```json\");\n lines.push(JSON.stringify(diag.stepAction.selector, null, 2));\n lines.push(\"```\");\n }\n lines.push(\"\");\n }\n\n // Step URL\n if (diag.stepUrl) {\n lines.push(`**Step URL**: ${diag.stepUrl}`);\n lines.push(\"\");\n }\n\n // Recovery Hint\n if (diag.recoveryHint) {\n lines.push(`**Recovery Hint**: ${diag.recoveryHint}`);\n lines.push(\"\");\n }\n\n // Execution Strategy\n if (diag.executionStrategy) {\n const s = diag.executionStrategy;\n lines.push(`**Execution Strategy**: maxRetries=${s.maxRetries}, changeTimeouts=[${s.changeTimeouts.join(\",\")}]ms, finalRetryStabilize=${s.finalRetryStabilizeMs}ms, domStability=${s.domStabilityMs}ms`);\n lines.push(\"\");\n }\n\n // Deterministic Resolve\n if (diag.deterministicResolveResult) {\n lines.push(`**Deterministic Resolve**: ${diag.deterministicResolveResult}`);\n lines.push(\"\");\n }\n\n // Failure History\n if (diag.failureHistory && diag.failureHistory.length > 0) {\n lines.push(\"**Failure History**:\");\n for (const f of diag.failureHistory) {\n lines.push(`- ${f}`);\n }\n lines.push(\"\");\n }\n\n // Validation Warnings\n if (diag.validationWarnings && diag.validationWarnings.length > 0) {\n lines.push(\"**Validation Warnings**:\");\n for (const w of diag.validationWarnings) {\n lines.push(`- ${w}`);\n }\n lines.push(\"\");\n }\n\n // Validation Errors\n if (diag.validationErrors && diag.validationErrors.length > 0) {\n lines.push(\"**Validation Errors**:\");\n for (const e of diag.validationErrors) {\n lines.push(`- ${e}`);\n }\n lines.push(\"\");\n }\n\n // Vision Fallback\n if (diag.visionFallbackResult) {\n const vf = diag.visionFallbackResult;\n lines.push(`**Vision Fallback**: annotations=${vf.annotationCount}, success=${vf.success}`);\n lines.push(`- Reasoning: ${vf.reasoning}`);\n lines.push(\"\");\n }\n\n // Agent Fallback\n if (diag.agentFallbackResult) {\n const fb = diag.agentFallbackResult;\n lines.push(`**Agent Fallback**: strategy=${fb.strategy}, success=${fb.success}`);\n lines.push(`- Analysis: ${fb.analysis}`);\n lines.push(`- Reasoning: ${fb.reasoning}`);\n lines.push(\"\");\n }\n\n // Last AI Response\n if (diag.lastAiResponseText) {\n lines.push(\"**Last AI Response**:\");\n lines.push(\"```json\");\n lines.push(diag.lastAiResponseText);\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n // Last Snapshot Preview\n if (diag.lastSnapshotPreview) {\n lines.push(\"**Last Snapshot Preview** (truncated):\");\n lines.push(\"```\");\n lines.push(diag.lastSnapshotPreview);\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n return lines;\n}\n\nfunction formatRetryDetails(retryDetails: StepExecutionResult[\"retryDetails\"], stepOrdinal: number): string[] {\n if (!retryDetails || retryDetails.length === 0) return [];\n\n const lines: string[] = [];\n lines.push(`### Step #${stepOrdinal} — Retry Details`);\n lines.push(\"\");\n\n for (const detail of retryDetails) {\n lines.push(`#### Attempt ${detail.attempt}`);\n lines.push(`- Snapshot changed: ${detail.snapshotChanged}`);\n lines.push(`- Element count: ${detail.snapshotElementCount}`);\n lines.push(`- Failure reason: ${detail.failureReason}`);\n if (detail.aiReasoning) {\n lines.push(`- AI reasoning: ${detail.aiReasoning}`);\n }\n\n if (detail.aiResponse) {\n lines.push(\"- AI response:\");\n lines.push(\"```json\");\n lines.push(detail.aiResponse);\n lines.push(\"```\");\n }\n\n if (detail.aiPrompt) {\n lines.push(\"\");\n lines.push(\"<details>\");\n lines.push(`<summary>AI Prompt (attempt ${detail.attempt})</summary>`);\n lines.push(\"\");\n lines.push(\"```\");\n lines.push(detail.aiPrompt);\n lines.push(\"```\");\n lines.push(\"</details>\");\n }\n\n if (detail.snapshotPreview) {\n lines.push(\"\");\n lines.push(\"<details>\");\n lines.push(`<summary>Snapshot Preview (attempt ${detail.attempt}, truncated)</summary>`);\n lines.push(\"\");\n lines.push(\"```\");\n lines.push(detail.snapshotPreview);\n lines.push(\"```\");\n lines.push(\"</details>\");\n }\n\n lines.push(\"\");\n }\n\n return lines;\n}\n\n/**\n * AI エージェント向けの構造化サマリーを生成する。\n * AI がこのセクションだけ読めば即座に修正アクションを取れるようにする。\n */\nfunction formatAiAgentSummary(\n failedSteps: StepExecutionResult[],\n input: ExecutionReportFileInput,\n): string[] {\n const lines: string[] = [];\n\n lines.push(\"## AI Agent Summary\");\n lines.push(\"\");\n lines.push(\"以下は AI エージェントが即座に修正アクションを取るための構造化情報です。\");\n lines.push(\"\");\n\n // 失敗ステップと修正指示\n lines.push(\"### 失敗ステップと修正指示\");\n lines.push(\"\");\n\n for (const step of failedSteps) {\n lines.push(`#### Step #${step.ordinal}: ${step.description}`);\n lines.push(\"\");\n lines.push(`- **エラー**: ${step.error ?? \"Unknown\"}`);\n if (step.failureCategory) {\n lines.push(`- **分類**: \\`${step.failureCategory}\\``);\n lines.push(`- **推奨対応**: ${getRecoveryHint(step.failureCategory)}`);\n }\n if (step.retryCount !== undefined && step.retryCount > 0) {\n lines.push(`- **リトライ回数**: ${step.retryCount}`);\n }\n\n // 診断情報から具体的な修正ヒントを抽出\n if (step.diagnostics) {\n const diag = step.diagnostics;\n if (diag.stepAction?.selector) {\n lines.push(`- **現在のセレクタ**:`);\n lines.push(\" ```json\");\n lines.push(` ${JSON.stringify(diag.stepAction.selector)}`);\n lines.push(\" ```\");\n }\n if (diag.lastSnapshotPreview) {\n lines.push(`- **最終スナップショット**:`);\n lines.push(\" <details>\");\n lines.push(\" <summary>スナップショット全文を表示</summary>\");\n lines.push(\"\");\n lines.push(\" ```\");\n lines.push(` ${diag.lastSnapshotPreview}`);\n lines.push(\" ```\");\n lines.push(\" </details>\");\n }\n if (diag.visionFallbackResult) {\n lines.push(`- **Vision Fallback 結果**: annotations=${diag.visionFallbackResult.annotationCount}, success=${diag.visionFallbackResult.success}`);\n lines.push(` - 理由: ${diag.visionFallbackResult.reasoning}`);\n }\n if (diag.agentFallbackResult) {\n lines.push(`- **Agent Fallback 結果**: strategy=${diag.agentFallbackResult.strategy}, success=${diag.agentFallbackResult.success}`);\n lines.push(` - 分析: ${diag.agentFallbackResult.analysis}`);\n }\n }\n\n // maintenance-analyzer からの修正提案があれば含める\n if (input.maintenanceSuggestions) {\n const suggestion = input.maintenanceSuggestions.find(\n (s) => s.stepOrdinal === step.ordinal,\n );\n if (suggestion) {\n if (suggestion.instructionFix) {\n lines.push(`- **YAML 修正提案**: ${suggestion.instructionFix}`);\n }\n if (suggestion.contextFix) {\n lines.push(`- **Context 修正提案**: ${suggestion.contextFix}`);\n }\n if (suggestion.suggestedStrategy) {\n lines.push(`- **推奨戦略**: ${suggestion.suggestedStrategy}`);\n }\n }\n }\n\n lines.push(\"\");\n }\n\n // 修正対象ファイル\n lines.push(\"### 修正対象ファイル\");\n lines.push(\"\");\n lines.push(`- \\`${input.instructionPath}\\` (Steps: ${failedSteps.map((s) => `#${s.ordinal}`).join(\", \")})`);\n lines.push(\"\");\n\n // 修正後の検証コマンド\n lines.push(\"### 修正後の検証コマンド\");\n lines.push(\"\");\n lines.push(\"```bash\");\n lines.push(`pnpm execute -- --instruction ${input.instructionPath} --maintenance`);\n lines.push(\"```\");\n lines.push(\"\");\n\n return lines;\n}\n\n/**\n * agentic-browser 自体の改善材料となるシステムレベルの分析情報を生成する。\n * 共通モジュール report-sections.ts の関数群に委譲する。\n */\nfunction formatSystemInsights(\n report: ExecutionReport,\n debugEntries: DebugLogEntry[],\n): string[] {\n const lines: string[] = [];\n\n lines.push(\"## System Insights\");\n lines.push(\"\");\n lines.push(\"> agentic-browser の機能改善・バグ修正のための分析情報\");\n lines.push(\"\");\n\n const allSteps = flattenSteps(report.steps);\n\n lines.push(...formatRuntimeEnvironment());\n\n if (report.aiMetrics && report.aiMetrics.totalCalls > 0) {\n lines.push(...formatAiMetricsSection(report.aiMetrics));\n }\n\n lines.push(...formatSelectorResolutionStats(debugEntries, allSteps));\n lines.push(...formatRetryDistribution(allSteps));\n\n const failedSteps = allSteps.filter((s) => s.status === \"failed\");\n lines.push(...formatFailureCategoryDistribution(failedSteps));\n lines.push(...formatRecoveryEffectiveness(debugEntries, allSteps));\n lines.push(...formatPerformanceBottlenecks(allSteps));\n lines.push(...formatAiSelectorQualityIssues(debugEntries));\n\n return lines;\n}\n\n/** ループ内サブステップも含めてフラット化する */\nfunction flattenSteps(steps: StepExecutionResult[]): StepExecutionResult[] {\n const result: StepExecutionResult[] = [];\n for (const step of steps) {\n result.push(step);\n if (step.subStepResults) {\n for (const iteration of step.subStepResults) {\n result.push(...flattenSteps(iteration));\n }\n }\n }\n return result;\n}\n\nexport async function generateExecutionReportFile(input: ExecutionReportFileInput): Promise<string> {\n const { report } = input;\n const lines: string[] = [];\n\n lines.push(\"# Execution Report\");\n lines.push(\"\");\n\n // Session Info\n lines.push(\"## Session Info\");\n lines.push(`- **Date**: ${new Date().toISOString()}`);\n lines.push(`- **Instruction**: ${report.instructionTitle}`);\n lines.push(`- **Instruction Path**: ${input.instructionPath}`);\n lines.push(`- **Start URL**: ${report.startUrl}`);\n const outcome = report.aborted\n ? \"Aborted\"\n : report.failed > 0\n ? \"Failed\"\n : input.errorMessage\n ? \"Error\"\n : \"Success\";\n lines.push(`- **Outcome**: ${outcome}`);\n lines.push(\"\");\n\n // Executor CLI Options\n if (input.cliOptions && input.cliOptions.length > 0) {\n lines.push(\"## Executor CLI Options\");\n lines.push(...renderOptionsMarkdown(input.cliOptions));\n lines.push(\"\");\n }\n\n // Generation Context\n if (input.generationContext) {\n const gc = input.generationContext;\n lines.push(\"## Generation Context\");\n lines.push(`- **Goal**: ${gc.goal}`);\n lines.push(`- **Start URL**: ${gc.startUrl}`);\n lines.push(`- **Goal Achieved (at generation)**: ${gc.goalAchieved}`);\n lines.push(`- **Generated At**: ${gc.generatedAt}`);\n lines.push(`- **Total Steps (generated)**: ${gc.totalSteps}`);\n if (gc.notes) {\n lines.push(\"- **Notes**:\");\n for (const line of gc.notes.split(\"\\n\")) {\n lines.push(` > ${line}`);\n }\n }\n lines.push(\"\");\n }\n\n // Error Details\n if (input.errorMessage) {\n lines.push(\"## Error Details\");\n lines.push(\"```\");\n lines.push(input.errorMessage);\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n // Execution Summary\n lines.push(\"## Execution Summary\");\n lines.push(`- **Total Steps**: ${report.totalSteps}`);\n lines.push(`- **Executed**: ${report.executed}`);\n lines.push(`- **Succeeded**: ${report.succeeded}`);\n lines.push(`- **Failed**: ${report.failed}`);\n lines.push(`- **Skipped**: ${report.skipped}`);\n lines.push(`- **Aborted**: ${report.aborted}`);\n lines.push(`- **Duration**: ${report.totalDurationMs}ms`);\n lines.push(\"\");\n\n // Extract Summary\n const allFlatSteps = flattenSteps(report.steps);\n const extractSteps = allFlatSteps.filter((s) => s.actionType === \"extract\");\n if (extractSteps.length > 0) {\n const extractFailures = extractSteps.filter((s) => s.status === \"failed\");\n const extractEmpty = extractSteps.filter(\n (s) => s.status === \"success\" && (!s.extractedData || s.extractedData === \"\"),\n );\n const extractSuccess = extractSteps.filter(\n (s) => s.status === \"success\" && s.extractedData && s.extractedData !== \"\",\n );\n\n lines.push(\"## Extract Summary\");\n lines.push(\"\");\n lines.push(`- **Total extract steps**: ${extractSteps.length}`);\n lines.push(`- **Succeeded (with data)**: ${extractSuccess.length}`);\n lines.push(`- **Succeeded (empty result)**: ${extractEmpty.length}`);\n lines.push(`- **Failed**: ${extractFailures.length}`);\n lines.push(\"\");\n\n if (extractFailures.length > 0) {\n lines.push(\"### Extract Failures\");\n lines.push(\"\");\n for (const step of extractFailures) {\n lines.push(`- **Step #${step.ordinal}** (${step.description}): ${step.error ?? \"Unknown\"}`);\n }\n lines.push(\"\");\n }\n\n if (extractEmpty.length > 0) {\n lines.push(\"### Extract Empty Results (Warning)\");\n lines.push(\"\");\n for (const step of extractEmpty) {\n lines.push(`- **Step #${step.ordinal}** (${step.description}): Script executed but returned empty`);\n }\n lines.push(\"\");\n }\n }\n\n // Step Results\n if (report.steps.length > 0) {\n lines.push(\"## Step Results\");\n for (const step of report.steps) {\n lines.push(...formatStepResult(step, \"\"));\n }\n lines.push(\"\");\n }\n\n // Failed Step Diagnostics (full details for each failed step)\n const failedSteps = report.steps.filter((s) => s.status === \"failed\");\n if (failedSteps.length > 0) {\n lines.push(\"## Failed Step Diagnostics\");\n lines.push(\"\");\n\n for (const step of failedSteps) {\n // Retry details\n if (step.retryDetails && step.retryDetails.length > 0) {\n lines.push(...formatRetryDetails(step.retryDetails, step.ordinal));\n }\n\n // Full diagnostics\n if (step.diagnostics) {\n lines.push(...formatDiagnostics(step.diagnostics, step.ordinal));\n }\n\n // diagnostics が空でもリトライもない場合(早期リターン系エラー)\n if (!step.diagnostics && (!step.retryDetails || step.retryDetails.length === 0)) {\n lines.push(`### Step #${step.ordinal} — Error Info`);\n lines.push(\"\");\n lines.push(`**Error**: ${step.error ?? \"Unknown\"}`);\n if (step.failureCategory) {\n lines.push(`**Category**: ${step.failureCategory}`);\n }\n lines.push(\"\");\n }\n }\n }\n\n // AI Agent Summary(AI エージェントが即座にアクションを取るための構造化サマリー)\n if (failedSteps.length > 0) {\n lines.push(...formatAiAgentSummary(failedSteps, input));\n }\n\n // デバッグログ読み込み(System Insights と Debug Log セクションで共有)\n const debugEntries = input.debugLogPath ? await readDebugLog(input.debugLogPath) : [];\n\n // System Insights(agentic-browser 改善用の分析情報)\n lines.push(...formatSystemInsights(report, debugEntries));\n\n // Debug Log (from --debug-log JSONL file)\n const failedOrdinals = new Set(failedSteps.map((s) => s.ordinal));\n lines.push(...formatDebugLogSections(debugEntries, {\n showFailedStepEvents: true,\n failedOrdinals,\n }));\n\n return lines.join(\"\\n\");\n}\n","/**\n * instruction-executor CLIエントリポイント\n *\n * Usage:\n * npx tsx src/instruction-executor/index.ts \\\n * --instruction ./instructions/login-flow.yaml \\\n * --headless false\n *\n * npx tsx src/instruction-executor/index.ts \\\n * --instruction ./v2-instruction.yaml \\\n * --secrets ./secrets.json \\\n * --data ./users.csv \\\n * --headless false\n *\n * npx tsx src/instruction-executor/index.ts \\\n * --instruction ./instructions/login-flow.yaml \\\n * --maintenance \\\n * --notify slack\n */\n\nimport { parseArgs } from \"./config\";\nimport { initModel } from \"../harness/ai-model\";\nimport {\n resolvePlan,\n getApiKey,\n enforceFeatureGates,\n validateStepLimit,\n validateBatchLimit,\n formatPlanLabel,\n} from \"../plan\";\nimport { globalMetrics } from \"../harness/ai-metrics\";\nimport { loadAndLogInstruction } from \"./yaml-loader\";\nimport { execute } from \"./executor\";\nimport { printReport, printBatchReport } from \"./reporter\";\nimport { planExecution, displayPlan, confirmPlan } from \"./execution-planner\";\nimport { RuntimeStore } from \"../context/runtime-store\";\nimport { InMemoryDataStore } from \"../context/data-store\";\nimport { DownloadManager } from \"../context/download-manager\";\nimport { loadCache, saveCache } from \"../harness/selector-cache\";\nimport { executeBatch, loadDataFile } from \"./batch-runner\";\nimport { createConfirmationProvider } from \"../approval\";\nimport { createNotificationProvider, safeNotify } from \"../notification\";\nimport { SharedChatBot, loadChatConfig } from \"../messaging\";\nimport { forwardReportToSlack } from \"../notification/report-forwarder\";\nimport { analyzeDebugResult } from \"./maintenance-analyzer\";\nimport { printDebugReport } from \"./maintenance-reporter\";\nimport { buildMaintenanceStrategy } from \"./types\";\nimport { intro, outro, log, cancel } from \"../cli/prompts\";\nimport { t } from \"../i18n\";\nimport { cliLoggerFactory } from \"../cli/cli-logger\";\nimport { formatDuration } from \"../cli/format\";\nimport { generateExecutionReportFile } from \"./report-generator\";\nimport type { GenerationContext } from \"./report-generator\";\nimport type { SerializedOption } from \"../cli/options-serializer\";\nimport { serializeExecutorOptions } from \"../cli/options-serializer\";\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nasync function writeReportFile(\n instructionPath: string,\n report: import(\"./types\").ExecutionReport,\n options: {\n errorMessage?: string;\n debugLogPath?: string;\n cliOptions?: SerializedOption[];\n generationContext?: GenerationContext;\n maintenanceSuggestions?: import(\"./maintenance-types\").DebugSuggestion[];\n },\n): Promise<string> {\n const reportContent = await generateExecutionReportFile({\n instructionPath,\n report,\n errorMessage: options.errorMessage,\n debugLogPath: options.debugLogPath,\n cliOptions: options.cliOptions,\n generationContext: options.generationContext,\n maintenanceSuggestions: options.maintenanceSuggestions,\n });\n const reportPath = instructionPath.replace(/\\.\\w+$/, \"-report.md\");\n await mkdir(dirname(reportPath), { recursive: true });\n await writeFile(reportPath, reportContent, \"utf-8\");\n return reportPath;\n}\n\nasync function main() {\n const totalStart = performance.now();\n const config = await parseArgs();\n\n // プラン解決 + プランベースのデフォルト適用 + 機能ゲート\n const apiKey = getApiKey(config.apiKey);\n const tierPlan = resolvePlan(apiKey);\n config.plan = tierPlan;\n\n // プランで許可された機能は、ユーザー未指定(undefined)の場合デフォルトON\n config.enableSelectorCache ??= tierPlan.features.selectorCache;\n config.enableAgentFallback ??= tierPlan.features.agentFallback;\n config.enableVisionFallback ??= tierPlan.features.visionFallback;\n\n enforceFeatureGates(config, tierPlan);\n\n await initModel(config.aiModelConfig);\n const cliOptions = serializeExecutorOptions(config);\n\n // Chat SDK が必要かどうか判定\n const approvalMode = config.approvalMode ?? \"cli\";\n const needsChatBot =\n (approvalMode !== \"cli\") || !!config.notifyMode;\n\n // SharedChatBot 生成(必要な場合のみ)\n const sharedBot = needsChatBot\n ? new SharedChatBot(\n loadChatConfig(config.notifyMode ?? (approvalMode as \"slack\" | \"teams\" | \"discord\"), {\n callbackPort: config.callbackPort,\n approvalTimeoutMs: config.approvalTimeoutMs,\n }),\n )\n : undefined;\n\n // 承認プロバイダ生成\n const confirmationProvider = createConfirmationProvider(\n approvalMode,\n sharedBot,\n config.approvalTimeoutMs,\n );\n\n // 通知プロバイダ生成\n const notificationProvider = createNotificationProvider(config.notifyMode, sharedBot);\n\n intro(config.maintenance ? \"instruction-executor (maintenance)\" : \"instruction-executor\");\n log.info(`Plan: ${formatPlanLabel(tierPlan)}`);\n log.info(`Instruction: ${config.instructionPath}`);\n log.info(`Headless: ${config.headless}`);\n if (config.stealth) {\n log.info(t(\"cli.stealthEnabled\"));\n }\n if (config.proxy) {\n log.info(t(\"cli.proxyEnabled\").replace(\"{proxy}\", config.proxy.replace(/:\\/\\/[^@]+@/, \"://***@\")));\n }\n if (config.maintenance) {\n log.info(\"Mode: maintenance\");\n log.info(`Max retries: ${config.maxRetries ?? 5}`);\n log.info(`Retry warning threshold: ${config.retryWarningThreshold ?? 3}`);\n log.info(`Selector cache: ${config.enableSelectorCache ? \"enabled\" : \"disabled\"}`);\n log.info(`Agent fallback: ${config.enableAgentFallback ? \"enabled\" : \"disabled\"}`);\n log.info(`Vision fallback: ${config.enableVisionFallback ? \"enabled\" : \"disabled\"}`);\n }\n if (config.stepDelay !== undefined) {\n log.info(`Step delay: ${config.stepDelay}ms`);\n }\n if (config.screenshotDir) {\n log.info(`Screenshots: ${config.screenshotDir}`);\n }\n if (config.contextMarkdown) {\n log.info(`Context: loaded (${config.contextMarkdown.split(\"\\n\").length} lines)`);\n }\n if (config.secrets && Object.keys(config.secrets.values).length > 0) {\n log.info(`Secrets: ${Object.keys(config.secrets.values).length} keys loaded`);\n }\n if (config.skipConfirmation) {\n log.info(`Skip confirmation: true`);\n }\n if (approvalMode !== \"cli\") {\n log.info(`Approval mode: ${approvalMode}`);\n }\n if (config.notifyMode) {\n log.info(`Notify: ${config.notifyMode}`);\n }\n if (config.forceReport) {\n log.info(\"Report: forced\");\n }\n\n // CLI 用 Logger / Spinner を生成(executor / batch-runner に注入)\n const cliLogger = cliLoggerFactory.createLogger();\n const cliCreateSpinner = () => cliLoggerFactory.createSpinner();\n\n // メンテナンスモード: アグレッシブなリトライ戦略を構築\n if (config.maintenance) {\n config.executionStrategy = buildMaintenanceStrategy(config.maxRetries ?? 5);\n }\n\n // YAML 読み込み\n const instruction = await loadAndLogInstruction(config.instructionPath);\n\n // ステップ数制限チェック\n validateStepLimit(instruction.steps.length, tierPlan);\n\n // generation context の抽出(executor レポートに埋め込み用)\n const generationContext: GenerationContext = {\n goal: instruction.metadata.goal,\n startUrl: instruction.metadata.startUrl,\n goalAchieved: instruction.metadata.goalAchieved,\n generatedAt: instruction.metadata.generatedAt,\n totalSteps: instruction.metadata.totalSteps,\n notes: instruction.notes,\n };\n\n // セレクタキャッシュの読み込み\n const selectorCache = config.enableSelectorCache\n ? await loadCache(config.instructionPath)\n : null;\n\n // ジョブタイムアウト設定\n const jobTimeoutMs = tierPlan.limits.maxJobDurationMs;\n const abortController = new AbortController();\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n if (Number.isFinite(jobTimeoutMs)) {\n timeoutId = setTimeout(() => abortController.abort(), jobTimeoutMs);\n }\n\n try {\n // プランニング: 事前変数を解決\n const plan = await planExecution(instruction, config);\n\n // データファイル読み込み(バッチモード用)\n let dataRows: Record<string, string>[] | undefined;\n if (config.dataFilePath) {\n dataRows = await loadDataFile(config.dataFilePath);\n validateBatchLimit(dataRows.length, tierPlan);\n log.info(`Data file: ${dataRows.length} rows`);\n }\n\n // プラン表示 + 確認\n displayPlan(plan, instruction, dataRows?.length);\n const confirmed = await confirmPlan();\n if (!confirmed) {\n cancel(t(\"cli.executionCancelled\"));\n process.exit(0);\n }\n\n // RuntimeStore 作成 + 事前変数をシード\n const store = new RuntimeStore();\n store.seed(plan.resolvedVariables.values, plan.resolvedVariables.sensitiveKeys);\n\n if (config.dataFilePath && dataRows) {\n // バッチ実行\n const batchReport = await executeBatch(\n config,\n instruction,\n store,\n dataRows,\n config.reuseSession !== false,\n {\n confirmationProvider,\n selectorCache,\n logger: cliLogger,\n createSpinner: cliCreateSpinner,\n abortSignal: abortController.signal,\n },\n );\n\n if (config.maintenance) {\n printBatchReport(batchReport);\n // 失敗した行のみ個別分析\n for (const row of batchReport.rows) {\n if (row.report.failed > 0 || row.report.aborted) {\n const debugReport = await analyzeDebugResult(\n row.report,\n instruction,\n config.retryWarningThreshold ?? 3,\n config.contextMarkdown,\n );\n log.info(`\\n── ${row.rowLabel} Maintenance Analysis ──`);\n printDebugReport(debugReport);\n }\n }\n await safeNotify(() => notificationProvider.notifyComplete(batchReport));\n } else {\n printBatchReport(batchReport);\n await safeNotify(() => notificationProvider.notifyComplete(batchReport));\n }\n\n // レポートファイル生成(失敗時は自動、--report 時は常時)\n if (batchReport.failed > 0 || config.forceReport) {\n for (const row of batchReport.rows) {\n if (row.report.failed > 0 || row.report.aborted || config.forceReport) {\n const reportPath = await writeReportFile(config.instructionPath, row.report, {\n debugLogPath: config.debugLogPath,\n cliOptions,\n generationContext,\n });\n log.info(`Report written to: ${reportPath} (${row.rowLabel})`);\n // 社内 Slack にレポートファイルを転送\n await forwardReportToSlack(reportPath, batchReport.instructionTitle ?? row.rowLabel);\n if (!config.forceReport) break; // 失敗時は最初の1行のみ\n }\n }\n }\n\n outro(`Total: ${formatDuration(performance.now() - totalStart)}`);\n if (batchReport.failed > 0) process.exit(1);\n } else {\n // 単発実行\n const dataStore = new InMemoryDataStore();\n const downloadManager = config.outputDir\n ? new DownloadManager(config.outputDir)\n : undefined;\n\n const execStart = performance.now();\n const report = await execute(config, instruction, {\n store,\n confirmationProvider,\n dataStore,\n downloadManager,\n selectorCache,\n logger: cliLogger,\n createSpinner: cliCreateSpinner,\n abortSignal: abortController.signal,\n });\n log.info(`Execution completed (${formatDuration(performance.now() - execStart)})`);\n\n // AI メトリクスをレポートに付与\n const metricsSummary = globalMetrics.getSummary();\n if (metricsSummary.totalCalls > 0) {\n report.aiMetrics = metricsSummary;\n }\n\n // メモリデータ出力(JSON + CSV)\n if (dataStore.listCollections().length > 0 && config.outputDir) {\n for (const collection of dataStore.listCollections()) {\n await dataStore.writeToFile(collection, `${config.outputDir}/${collection}.json`, \"json\");\n await dataStore.writeToFile(collection, `${config.outputDir}/${collection}.csv`, \"csv\");\n log.info(`Memory data exported: ${config.outputDir}/${collection}.json, ${config.outputDir}/${collection}.csv`);\n }\n }\n\n // CSVマージ\n if (config.mergeDownloads && downloadManager && downloadManager.getAllDownloadIds().length > 0) {\n const ids = downloadManager.getAllDownloadIds();\n const mergedPath = await downloadManager.mergeCSVFiles(ids, \"merged.csv\");\n log.info(`CSV files merged: ${mergedPath}`);\n }\n\n let maintenanceSuggestions: import(\"./maintenance-types\").DebugSuggestion[] | undefined;\n\n if (config.maintenance) {\n // メンテナンスモード: 分析 + デバッグレポート + 失敗時通知\n const analysisStart = performance.now();\n const debugReport = await analyzeDebugResult(\n report,\n instruction,\n config.retryWarningThreshold ?? 3,\n config.contextMarkdown,\n );\n log.info(`Analysis completed (${formatDuration(performance.now() - analysisStart)})`);\n\n printDebugReport(debugReport);\n maintenanceSuggestions = debugReport.suggestions;\n\n const hasIssues = report.failed > 0 || report.aborted || debugReport.warningSteps.length > 0;\n if (hasIssues) {\n await safeNotify(() => notificationProvider.notifyDebugFailure?.(debugReport) ?? Promise.resolve());\n }\n } else {\n printReport(report);\n await safeNotify(() => notificationProvider.notifyComplete(report));\n }\n\n // レポートファイル生成(失敗・中断時は自動、--report 時は常時)\n if (report.failed > 0 || report.aborted || config.forceReport) {\n const reportPath = await writeReportFile(config.instructionPath, report, {\n debugLogPath: config.debugLogPath,\n cliOptions,\n generationContext,\n maintenanceSuggestions,\n });\n log.info(`Report written to: ${reportPath}`);\n // 社内 Slack にレポートファイルを転送\n await forwardReportToSlack(reportPath, report.instructionTitle);\n }\n\n outro(`Total: ${formatDuration(performance.now() - totalStart)}`);\n if (report.failed > 0 || report.aborted) process.exit(1);\n }\n } finally {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n // セレクタキャッシュの保存\n if (selectorCache) {\n await saveCache(selectorCache);\n }\n await confirmationProvider.dispose?.();\n await notificationProvider.dispose?.();\n await sharedBot?.dispose();\n }\n}\n\nmain().catch((error) => {\n cancel(`Fatal error: ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,SAAS,aAAa,qBAAqB;AAO3C,eAAsB,YAAqC;AACzD,QAAM,OAAO,WAAW;AAExB,QAAM,EAAE,OAAO,IAAI,cAAc;AAAA,IAC/B;AAAA,IACA,SAAS;AAAA,MACP,aAAa,EAAE,MAAM,SAAS;AAAA,MAC9B,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,UAAU,EAAE,MAAM,SAAS;AAAA,MAC3B,cAAc,EAAE,MAAM,SAAS;AAAA,MAC/B,aAAa,EAAE,MAAM,SAAS;AAAA,MAC9B,qBAAqB,EAAE,MAAM,UAAU;AAAA,MACvC,MAAM,EAAE,MAAM,SAAS;AAAA,MACvB,SAAS,EAAE,MAAM,SAAS;AAAA,MAC1B,iBAAiB,EAAE,MAAM,UAAU;AAAA,MACnC,oBAAoB,EAAE,MAAM,UAAU;AAAA,MACtC,aAAa,EAAE,MAAM,SAAS;AAAA,MAC9B,OAAO,EAAE,MAAM,UAAU;AAAA,MACzB,iBAAiB,EAAE,MAAM,SAAS;AAAA,MAClC,QAAQ,EAAE,MAAM,SAAS;AAAA,MACzB,yBAAyB,EAAE,MAAM,UAAU;AAAA,MAC3C,yBAAyB,EAAE,MAAM,UAAU;AAAA,MAC3C,0BAA0B,EAAE,MAAM,UAAU;AAAA,MAC5C,cAAc,EAAE,MAAM,SAAS;AAAA,MAC/B,mBAAmB,EAAE,MAAM,UAAU;AAAA,MACrC,aAAa,EAAE,MAAM,UAAU;AAAA,MAC/B,eAAe,EAAE,MAAM,SAAS;AAAA,MAChC,2BAA2B,EAAE,MAAM,SAAS;AAAA,MAC5C,QAAQ,EAAE,MAAM,UAAU;AAAA,MAC1B,OAAO,EAAE,MAAM,SAAS;AAAA,MACxB,kBAAkB,EAAE,MAAM,SAAS;AAAA,MACnC,kBAAkB,EAAE,MAAM,SAAS;AAAA,MACnC,kBAAkB,EAAE,MAAM,SAAS;AAAA,MACnC,oBAAoB,EAAE,MAAM,SAAS;AAAA,MACrC,gBAAgB,EAAE,MAAM,SAAS;AAAA,MACjC,kBAAkB,EAAE,MAAM,SAAS;AAAA,MACnC,gBAAgB,EAAE,MAAM,SAAS;AAAA,MACjC,WAAW,EAAE,MAAM,SAAS;AAAA,MAC5B,iBAAiB,EAAE,MAAM,SAAS;AAAA,MAClC,oBAAoB,EAAE,MAAM,SAAS;AAAA,MACrC,OAAO,EAAE,MAAM,SAAS;AAAA,MACxB,QAAQ,EAAE,MAAM,SAAS;AAAA,MACzB,SAAS,EAAE,MAAM,UAAU;AAAA,MAC3B,OAAO,EAAE,MAAM,SAAS;AAAA,IAC1B;AAAA,IACA,QAAQ;AAAA,EACV,CAAC;AAED,aAAW,OAAO,MAAM;AAExB,MAAI,CAAC,OAAO,aAAa;AACvB,WAAO,EAAE,yBAAyB,CAAC;AACnC,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,kBAAkB,MAAM,gBAAgB,OAAO,OAAO;AAC5D,QAAM,UAAU,MAAM,YAAY,OAAO,OAAO;AAChD,QAAM,gBAAgB,iBAAiB,MAAM;AAG7C,QAAM,eAAe,OAAO,kBAAkB,IAAI,QAAS,OAAO,eAAe,KAAK;AAGtF,QAAM,kBAAkB,OAAO,eAAe;AAC9C,QAAM,qBAAqB,CAAC,OAAO,SAAS,SAAS,SAAS;AAE9D,MAAI;AACJ,MAAI,iBAAiB;AACnB,QAAI,CAAE,mBAAyC,SAAS,eAAe,GAAG;AACxE,aAAO,EAAE,yBAAyB,CAAC;AACnC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,mBAAe;AAAA,EACjB;AAEA,QAAM,aAAa,mBAAmB,OAAO,MAAM;AAGnD,MAAI,gBAAgB,iBAAiB,SAAS,cAAc,iBAAiB,YAAY;AACvF,WAAO,yDAAyD;AAChE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAc,OAAO,eAAe;AAE1C,SAAO;AAAA,IACL,iBAAiB,OAAO;AAAA,IACxB,UAAU,OAAO,aAAa;AAAA,IAC9B,WAAW,OAAO,YAAY,IAC1B,OAAO,SAAS,OAAO,YAAY,GAAG,EAAE,IACxC;AAAA,IACJ,eAAe,OAAO;AAAA,IACtB;AAAA,IACA,kBAAkB,OAAO,mBAAmB,KAAK;AAAA,IACjD,cAAc,OAAO;AAAA,IACrB;AAAA,IACA;AAAA,IACA,cAAc,OAAO,WAAW;AAAA,IAChC,cAAc,OAAO,SAAS;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,cAAc,OAAO,eAAe,IAChC,OAAO,SAAS,OAAO,eAAe,GAAG,EAAE,IAC3C;AAAA,IACJ,mBAAmB,OAAO,kBAAkB,IACxC,OAAO,SAAS,OAAO,kBAAkB,GAAG,EAAE,IAC9C;AAAA,IACJ,qBAAqB,OAAO,uBAAuB,MAAM,cAAc,OAAO;AAAA,IAC9E,qBAAqB,OAAO,uBAAuB,MAAM,cAAc,OAAO;AAAA,IAC9E,sBAAsB,OAAO,wBAAwB,MAAM,cAAc,OAAO;AAAA,IAChF,WAAW,OAAO,YAAY;AAAA,IAC9B,gBAAgB,OAAO,iBAAiB,KAAK;AAAA,IAC7C;AAAA,IACA,YAAY,OAAO,aAAa,IAC5B,OAAO,SAAS,OAAO,aAAa,GAAG,EAAE,IACzC,cAAc,IAAI;AAAA,IACtB,uBAAuB,OAAO,yBAAyB,IACnD,OAAO,SAAS,OAAO,yBAAyB,GAAG,EAAE,IACrD,cAAc,IAAI;AAAA,IACtB,aAAa,OAAO,UAAU;AAAA,IAC9B,UAAU,OAAO;AAAA,IACjB;AAAA,IACA,QAAQ,OAAO,SAAS;AAAA,IACxB,SAAS,OAAO,WAAW;AAAA,IAC3B,OAAO,OAAO;AAAA,EAChB;AACF;;;ACjIO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EAIxC,YAAY,SAAiB,YAAuB,QAAQ;AAC1D,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,YAAY;AAAA,EACnB;AACF;AAqBO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EAC1C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;ACpCA,SAAS,kBAAkB;AAM3B,IAAM,aAAa;AASnB,IAAM,qBAAqB;AAG3B,IAAM,cAAmC,oBAAI,IAAI,CAAC,OAAO,QAAQ,YAAY,CAAC;AAkB9E,SAAS,gBAAgB,KAAqB;AAC5C,SAAO,IAAI,SAAS,WAAW;AACjC;AAEA,SAAS,gBAAgB,KAAqB;AAC5C,SAAO,OAAO,KAAK,KAAK,WAAW;AACrC;AAGO,SAAS,eAAuB;AACrC,SAAO,QAAQ,IAAI,8BAA8B;AACnD;AAYA,SAAS,mBAAmB,OAAe,QAAwC;AACjF,QAAM,QAAQ,MAAM,MAAM,GAAG;AAC7B,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,CAAC,QAAQ,MAAM,GAAG,IAAI;AAG5B,QAAM,cAAc;AAAA,IAClB,WAAW,UAAU,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,IAAI,EAAE,EAAE,OAAO;AAAA,EAClE;AACA,MAAI,gBAAgB,IAAK,QAAO;AAGhC,MAAI;AACF,UAAM,UAAU,KAAK,MAAM,gBAAgB,IAAI,EAAE,SAAS,OAAO,CAAC;AAClE,QAAI,OAAO,QAAQ,QAAQ,YAAY,CAAC,QAAQ,IAAK,QAAO;AAC5D,QAAI,OAAO,QAAQ,SAAS,YAAY,CAAC,YAAY,IAAI,QAAQ,IAAI,EAAG,QAAO;AAC/E,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAiGO,SAAS,YAAY,KAAuC;AACjE,MAAI,CAAC,IAAI,WAAW,GAAG,UAAU,GAAG,EAAG,QAAO;AAE9C,QAAM,WAAW,IAAI,MAAM,WAAW,SAAS,CAAC;AAChD,QAAM,SAAS,aAAa;AAC5B,QAAM,UAAU,mBAAmB,UAAU,MAAM;AACnD,MAAI,CAAC,QAAS,QAAO;AAErB,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,UAAU,QAAQ;AAAA,IAClB,UAAU,QAAQ,MAAM,IAAI,KAAK,QAAQ,MAAM,GAAI,IAAI;AAAA,IACvD,MAAM,QAAQ;AAAA,EAChB;AACF;;;ACzIO,IAAM,iBAAuB;AAAA,EAClC,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,wBAAwB;AAAA,IACxB,cAAc;AAAA,IACd,mBAAmB,OAAO;AAAA,IAC1B,gBAAgB,OAAO;AAAA,IACvB,iBAAiB,OAAO;AAAA,IACxB,kBAAkB,KAAK,KAAK;AAAA;AAAA,IAC5B,mBAAmB,OAAO;AAAA,EAC5B;AAAA,EACA,UAAU;AAAA,IACR,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AACF;AAEO,IAAM,WAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,wBAAwB;AAAA,IACxB,cAAc;AAAA,IACd,mBAAmB,OAAO;AAAA,IAC1B,gBAAgB,OAAO;AAAA,IACvB,iBAAiB,OAAO;AAAA,IACxB,kBAAkB,KAAK,KAAK;AAAA;AAAA,IAC5B,mBAAmB,OAAO;AAAA,EAC5B;AAAA,EACA,UAAU;AAAA,IACR,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AACF;AAEO,IAAM,YAAkB;AAAA,EAC7B,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,wBAAwB,OAAO;AAAA,IAC/B,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,kBAAkB,IAAI,KAAK,KAAK;AAAA;AAAA,IAChC,mBAAmB,IAAI,KAAK;AAAA;AAAA,EAC9B;AAAA,EACA,UAAU;AAAA,IACR,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AACF;AAEO,IAAM,kBAAwB;AAAA,EACnC,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,wBAAwB,OAAO;AAAA,IAC/B,cAAc,OAAO;AAAA,IACrB,mBAAmB,OAAO;AAAA,IAC1B,gBAAgB,OAAO;AAAA,IACvB,iBAAiB,OAAO;AAAA,IACxB,kBAAkB,KAAK,KAAK,KAAK;AAAA;AAAA,IACjC,mBAAmB,KAAK,KAAK;AAAA;AAAA,EAC/B;AAAA,EACA,UAAU;AAAA,IACR,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AACF;AAKA,IAAM,eAAuC;AAAA,EAC3C,WAAW;AAAA,EACX,KAAK;AAAA,EACL,MAAM;AAAA,EACN,YAAY;AACd;AASO,SAAS,YAAY,QAAuB;AACjD,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,SAAS,YAAY,MAAM;AACjC,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,WAAW,aAAa,OAAO,IAAI,KAAK;AAC9C,SAAO,EAAE,GAAG,UAAU,UAAU,OAAO,SAAS;AAClD;AAKO,SAAS,UAAU,UAAuC;AAC/D,SAAO,YAAY,QAAQ,IAAI;AACjC;AAWO,SAAS,oBAAoB,QAAwB,MAAkB;AAE5E,MAAI,CAAC,KAAK,SAAS,cAAe,QAAO,sBAAsB;AAC/D,MAAI,CAAC,KAAK,SAAS,cAAe,QAAO,sBAAsB;AAC/D,MAAI,CAAC,KAAK,SAAS,eAAgB,QAAO,uBAAuB;AAGjE,MAAI,CAAC,KAAK,SAAS,mBAAmB,OAAO,aAAa;AACxD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,KAAK,SAAS,MAAM;AACvB,QAAI,OAAO,gBAAgB,OAAO,iBAAiB,OAAO;AACxD,YAAM,IAAI;AAAA,QACR,GAAG,OAAO,YAAY;AAAA,MACxB;AAAA,IACF;AACA,QAAI,OAAO,YAAY;AACrB,YAAM,IAAI;AAAA,QACR,GAAG,OAAO,UAAU;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAOA,MAAI,CAAC,KAAK,SAAS,kBAAkB,OAAO,eAAe,gBAAgB;AACzE,WAAO,cAAc,iBAAiB;AAAA,EACxC;AAGA,MAAI,CAAC,KAAK,SAAS,aAAa;AAC9B,QAAI,OAAO,SAAS;AAClB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,QAAI,OAAO,OAAO;AAChB,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,kBAAkB,WAAmB,MAAkB;AACrE,MAAI,YAAY,KAAK,OAAO,wBAAwB;AAClD,UAAM,IAAI;AAAA,MACR,wBAAwB,SAAS,sCAAsC,KAAK,OAAO,sBAAsB;AAAA,IAE3G;AAAA,EACF;AACF;AAKO,SAAS,mBAAmB,UAAkB,MAAkB;AACrE,MAAI,WAAW,KAAK,OAAO,cAAc;AACvC,UAAM,IAAI;AAAA,MACR,aAAa,QAAQ,qCAAqC,KAAK,OAAO,YAAY;AAAA,IAEpF;AAAA,EACF;AACF;AAKO,SAAS,gBAAgB,MAAoB;AAClD,QAAM,aACJ,KAAK,OAAO,2BAA2B,OAAO,oBAC1C,cACA,GAAG,KAAK,OAAO,sBAAsB;AAC3C,QAAM,aACJ,KAAK,OAAO,iBAAiB,OAAO,oBAChC,cACA,GAAG,KAAK,OAAO,YAAY;AAEjC,SAAO,GAAG,KAAK,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,KAAK,UAAU,KAAK,UAAU;AAChG;;;ACzRA,SAAS,gBAAgB;AACzB,SAAS,aAAa;AAUtB,eAAsB,sBAAsB,MAA0C;AACpF,QAAM,YAAY,YAAY,IAAI;AAClC,QAAM,cAAc,MAAM,gBAAgB,IAAI;AAC9C,MAAI,KAAK,UAAU,YAAY,KAAK,EAAE;AACtC,MAAI,KAAK,cAAc,YAAY,SAAS,QAAQ,EAAE;AACtD,MAAI,KAAK,UAAU,YAAY,MAAM,MAAM,EAAE;AAC7C,MAAI,KAAK,gBAAgB,eAAe,YAAY,IAAI,IAAI,SAAS,CAAC,GAAG;AACzE,SAAO;AACT;AAMA,eAAsB,gBAAgB,MAA0C;AAC9E,QAAM,MAAM,MAAM,SAAS,MAAM,OAAO;AACxC,QAAM,MAAM,MAAM,GAAG;AACrB,SAAO,wBAAwB,MAAM,GAAG;AAC1C;;;AC1BA,SAAS,aAAa;AACtB,SAAS,QAAAA,aAAY;;;ACDrB,SAAS,SAAS;AAMlB,IAAM,yBAAyB,EAAE,OAAO;AAAA,EACtC,WAAW,EAAE,OAAO,EAAE,SAAS,+FAAoB;AAAA,EACnD,KAAK,EAAE,OAAO,EAAE,SAAS,wRAAuD;AAClF,CAAC;AAoBD,eAAe,YACb,UACA,UACA,iBACA,KACA,iBACA,aACA,cACA,sBAC0B;AAC1B,QAAM,EAAE,QAAQ,WAAW,IAAI,sBAAsB,UAAU,UAAU,iBAAiB,KAAK,iBAAiB,cAAc,oBAAoB;AAClJ,QAAM,SAAS,GAAG,MAAM;AAAA;AAAA,EAAU,UAAU;AAE5C,eAAa,IAAI;AAAA,IACf,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,EAAE,QAAQ,UAAU,iBAAiB,IAAI;AAAA,EACjD,CAAC;AAED,QAAM,EAAE,OAAO,IAAI,MAAM;AAAA,IACvB,MACE,sBAAsB,YAAY;AAAA,MAChC,OAAO,SAAS,UAAU;AAAA,MAC1B,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,UACT,iBAAiB;AAAA,YACf,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,EAAE;AAAA,UACnD;AAAA,QACF;AAAA,QACA,EAAE,MAAM,QAAQ,SAAS,WAAW;AAAA,MACtC;AAAA,MACA,QAAQ;AAAA,MACR,aAAa;AAAA,IACf,CAAC;AAAA,IACH,EAAE,OAAO,mBAAmB;AAAA,EAC9B;AAEA,eAAa,IAAI;AAAA,IACf,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,EAAE,cAAc,OAA6C;AAAA,EACrE,CAAC;AAED,SAAO,EAAE,KAAK,OAAO,OAAO,IAAI,gBAAgB,KAAK,UAAU,MAAM,GAAG,WAAW,OAAO,WAAW,OAAO;AAC9G;AAwBA,eAAsB,sBACpB,UACA,UACA,iBACA,KACA,iBACA,aACA,cACA,sBAC0B;AAC1B,SAAO,YAAY,UAAU,UAAU,iBAAiB,KAAK,iBAAiB,aAAa,cAAc,oBAAoB;AAC/H;;;AClGA,IAAM,eAAe;AAMd,IAAM,kBAAN,MAAsB;AAAA,EAAtB;AACL,SAAQ,WAA6B,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtC,OACE,KACA,UACA,UACA,aACA,YACM;AACN,UAAM,aAAa,oBAAoB,GAAG;AAC1C,UAAM,eAAe,kBAAkB,QAAQ;AAE/C,UAAM,WAAW,KAAK,SAAS;AAAA,MAC7B,CAACC,OAAMA,GAAE,eAAe,cAAcA,GAAE,iBAAiB,gBAAgBA,GAAE,aAAa;AAAA,IAC1F;AAEA,QAAI,UAAU;AACZ,eAAS;AACT,eAAS,kBAAkB;AAC3B,UAAI,YAAY;AACd,iBAAS,eAAe,WAAW;AAAA,MACrC;AAAA,IACF,OAAO;AAEL,UAAI,KAAK,SAAS,UAAU,cAAc;AACxC,aAAK,SAAS,MAAM;AAAA,MACtB;AACA,WAAK,SAAS,KAAK;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,YAAY;AAAA,QAC1B,OAAO;AAAA,QACP,iBAAiB;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,KAAa,UAAwC;AACpE,UAAM,aAAa,oBAAoB,GAAG;AAC1C,UAAM,eAAe,kBAAkB,QAAQ;AAG/C,UAAM,WAAW,KAAK,SAAS;AAAA,MAC7B,CAACA,OAAMA,GAAE,eAAe,cAAcA,GAAE,iBAAiB;AAAA,IAC3D;AAEA,QAAI,SAAS,WAAW,EAAG,QAAO;AAGlC,UAAM,kBAAkB,oBAAI,IAAoB;AAChD,eAAWA,MAAK,UAAU;AACxB,UAAIA,GAAE,cAAc;AAClB,wBAAgB;AAAA,UACdA,GAAE;AAAA,WACD,gBAAgB,IAAIA,GAAE,YAAY,KAAK,KAAKA,GAAE;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,QAAkB,CAAC;AAGzB,UAAM,iBAAiB,oBAAI,IAAoB;AAC/C,eAAWA,MAAK,UAAU;AACxB,qBAAe,IAAIA,GAAE,WAAW,eAAe,IAAIA,GAAE,QAAQ,KAAK,KAAKA,GAAE,KAAK;AAAA,IAChF;AACA,UAAM,cAAc,CAAC,GAAG,eAAe,QAAQ,CAAC,EAC7C,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,IAAI,EACzC,KAAK,IAAI;AACZ,UAAM,KAAK,uBAAuB,UAAU,KAAK,WAAW,EAAE;AAG9D,QAAI,gBAAgB,OAAO,GAAG;AAC5B,YAAM,cAAc,CAAC,GAAG,gBAAgB,QAAQ,CAAC,EAC9C,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,GAAG,MAAM,IAAI,KAAK,IAAI,EAC/C,KAAK,IAAI;AACZ,YAAM,KAAK,gBAAgB,WAAW,EAAE;AAAA,IAC1C;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA,EAGA,IAAI,OAAe;AACjB,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,WAAW,CAAC;AAAA,EACnB;AACF;AAMA,SAAS,oBAAoB,KAAqB;AAChD,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,UAAM,iBAAiB,OAAO,SAC3B,MAAM,GAAG,EACT,IAAI,CAAC,YAAY;AAEhB,UAAI,QAAQ,KAAK,OAAO,EAAG,QAAO;AAClC,UAAI,kBAAkB,KAAK,OAAO,EAAG,QAAO;AAC5C,aAAO;AAAA,IACT,CAAC,EACA,KAAK,GAAG;AACX,WAAO,GAAG,OAAO,QAAQ,GAAG,cAAc;AAAA,EAC5C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,SAAS,kBAAkB,UAA4B;AACrD,QAAM,QAAkB,CAAC;AACzB,MAAI,SAAS,KAAM,OAAM,KAAK,QAAQ,SAAS,IAAI,EAAE;AACrD,MAAI,SAAS,KAAM,OAAM,KAAK,QAAQ,SAAS,IAAI,EAAE;AACrD,MAAI,SAAS,UAAW,OAAM,KAAK,QAAQ,SAAS,SAAS,EAAE;AAC/D,MAAI,SAAS,WAAY,OAAM,KAAK,UAAU,SAAS,UAAU,EAAE;AACnE,SAAO,MAAM,KAAK,GAAG,KAAK;AAC5B;;;ACvJA,SAAS,YAAAC,WAAU,iBAAiB;AACpC,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,MAAM,SAAS,gBAAgB;AAwBjC,SAAS,cACd,aACA,KACA,UACQ;AACR,QAAM,eAAe,WAAW,QAAQ,EACrC,OAAO,KAAK,UAAU,QAAQ,CAAC,EAC/B,OAAO,KAAK,EACZ,MAAM,GAAG,EAAE;AACd,QAAM,gBAAgB,IAAI,MAAM,GAAG,EAAE,CAAC;AACtC,SAAO,GAAG,WAAW,IAAI,aAAa,IAAI,YAAY;AACxD;AAKO,SAAS,kBAAkB,UAA0B;AAC1D,SAAO,WAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACxE;AAMO,SAAS,cAAc,iBAAiC;AAC7D,QAAM,MAAM,QAAQ,eAAe;AACnC,QAAM,OAAO,SAAS,iBAAiB,OAAO;AAC9C,SAAO,KAAK,KAAK,GAAG,IAAI,sBAAsB;AAChD;AAKA,eAAsB,UAAU,iBAAiD;AAC/E,QAAM,OAAO,cAAc,eAAe;AAC1C,MAAI,CAAC,WAAW,IAAI,GAAG;AACrB,WAAO,EAAE,SAAS,GAAG,iBAAiB,SAAS,CAAC,EAAE;AAAA,EACpD;AACA,MAAI;AACF,UAAM,MAAM,MAAMA,UAAS,MAAM,OAAO;AACxC,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO,EAAE,SAAS,GAAG,iBAAiB,SAAS,CAAC,EAAE;AAAA,EACpD;AACF;AAKA,eAAsB,UAAU,OAAqC;AACnE,QAAM,OAAO,cAAc,MAAM,eAAe;AAChD,MAAI;AACF,UAAM,UAAU,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;AAAA,EAC/D,QAAQ;AAAA,EAER;AACF;AAKO,SAAS,YACd,OACA,KACwB;AACxB,SAAO,MAAM,QAAQ,GAAG;AAC1B;AAKO,SAAS,YACd,OACA,KACA,KACA,cACM;AACN,QAAM,WAAW,MAAM,QAAQ,GAAG;AAClC,QAAM,QAAQ,GAAG,IAAI;AAAA,IACnB;AAAA,IACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC;AAAA,IACA,WAAW,UAAU,YAAY,KAAK;AAAA,EACxC;AACF;AAKO,SAAS,qBAAqB,OAAsB,KAAmB;AAC5E,SAAO,MAAM,QAAQ,GAAG;AAC1B;;;ACxHA,SAAS,KAAAC,UAAS;AAiBlB,IAAM,sBAAsBC,GAAE,OAAO;AAAA,EACnC,UAAUA,GAAE,OAAO,EAAE,SAAS,yFAAmB;AAAA,EACjD,gBAAgBA,GAAE,OAAO,EAAE;AAAA,IACzB;AAAA,EACF;AAAA,EACA,qBAAqBA,GAAE,KAAK;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,EAAE,SAAS,kDAAU;AAAA,EACtB,iBAAiBA,GAAE,OAAO,EAAE,SAAS,EAAE;AAAA,IACrC;AAAA,EACF;AAAA,EACA,WAAWA,GAAE,OAAO,EAAE,SAAS,+FAAoB;AACrD,CAAC;AAuBD,eAAsB,aACpB,SACA,MACA,gBACA,iBACA,aAC8B;AAE9B,MAAI;AACF,UAAM,QAAQ,OAAO,MAAM,GAAI;AAC/B,UAAM,QAAQ,oBAAoB,GAAI;AAAA,EACxC,QAAQ;AAAA,EAER;AAEA,QAAM,eAAe,eAAe,MAAM,QAAQ,SAAS,CAAC;AAC5D,QAAM,aAAa,MAAM,QAAQ,IAAI;AAErC,QAAM,EAAE,QAAQ,WAAW,IAAI;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,sBAAsB,YAAY;AAAA,MACzD,OAAO,SAAS,UAAU;AAAA,MAC1B,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,UACT,iBAAiB;AAAA,YACf,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,EAAE;AAAA,UACnD;AAAA,QACF;AAAA,QACA,EAAE,MAAM,QAAQ,SAAS,WAAW;AAAA,MACtC;AAAA,MACA,QAAQ;AAAA,MACR,aAAa;AAAA,IACf,CAAC;AAED,QAAI,OAAO,wBAAwB,eAAe,CAAC,OAAO,gBAAgB;AACxE,aAAO,EAAE,GAAG,QAAQ,gBAAgB,OAAO,kBAAkB,IAAI,SAAS,MAAM;AAAA,IAClF;AAGA,QACE,OAAO,oBACN,OAAO,wBAAwB,sBAC9B,OAAO,wBAAwB,oBACjC;AACA,mBAAa,IAAI;AAAA,QACf,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,UACJ,UAAU,OAAO;AAAA,UACjB,iBAAiB,OAAO;AAAA,QAC1B;AAAA,MACF,CAAC;AAED,UAAI;AACF,cAAM,QAAQ,MAAM,IAAI,OAAO,eAAe,EAAE;AAChD,cAAM,QAAQ,oBAAoB,GAAI;AAAA,MACxC,QAAQ;AACN,eAAO,EAAE,GAAG,QAAQ,gBAAgB,OAAO,kBAAkB,IAAI,SAAS,MAAM;AAAA,MAClF;AAGA,YAAM,kBAAkB,MAAM,QAAQ,SAAS;AAC/C,UAAI,sBAAsB,iBAAiB,OAAO,cAAc,MAAM,MAAM;AAC1E,eAAO,EAAE,GAAG,QAAQ,SAAS,MAAM;AAAA,MACrC;AAAA,IACF;AAEA,WAAO,EAAE,GAAG,QAAQ,SAAS,KAAK;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,MACL,UAAU;AAAA,MACV,gBAAgB;AAAA,MAChB,qBAAqB;AAAA,MACrB,WAAW;AAAA,MACX,SAAS;AAAA,IACX;AAAA,EACF;AACF;;;AC7IA,SAAS,KAAAC,UAAS;AAOlB,IAAM,uBAAuBC,GAAE,OAAO;AAAA,EACpC,WAAWA,GAAE,OAAO,EAAE;AAAA,IACpB;AAAA,EACF;AAAA,EACA,KAAKA,GAAE,OAAO,EAAE;AAAA,IACd;AAAA,EACF;AAAA,EACA,kBAAkBA,GAAE,OAAO,EAAE,SAAS,EAAE;AAAA,IACtC;AAAA,EACF;AAAA,EACA,YAAYA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE;AAAA,IACnC;AAAA,EACF;AACF,CAAC;AAcD,eAAsB,kBACpB,aACA,aACA,UACA,iBACA,KACA,gBACA,aACqC;AACrC,eAAa,IAAI;AAAA,IACf,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,MACJ,iBAAiB,YAAY;AAAA,MAC7B;AAAA,MACA;AAAA,MACA;AAAA,MACA,qBAAqB,eAAe;AAAA,IACtC;AAAA,EACF,CAAC;AAGD,MAAI,YAAY,WAAW,GAAG;AAC5B,iBAAa,IAAI;AAAA,MACf,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,EAAE,QAAQ,iBAAiB;AAAA,IACnC,CAAC;AACD,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,QAAQ,gBAAgB,IAAI;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM;AAAA,MACvB,MACE,sBAAsB,UAAU;AAAA,QAC9B,OAAO,SAAS,QAAQ;AAAA,QACxB,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,YACT,iBAAiB;AAAA,cACf,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,EAAE;AAAA,YACnD;AAAA,UACF;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,EAAE,MAAM,QAAQ,MAAM,gBAAgB;AAAA,cACtC,EAAE,MAAM,SAAS,OAAO,YAAY;AAAA,YACtC;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,QACR,aAAa;AAAA,MACf,CAAC;AAAA,MACH,EAAE,OAAO,iBAAiB;AAAA,IAC5B;AAEA,iBAAa,IAAI;AAAA,MACf,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,QACJ,KAAK,OAAO;AAAA,QACZ,WAAW,OAAO;AAAA,QAClB,kBAAkB,OAAO;AAAA,QACzB,YAAY,OAAO;AAAA,MACrB;AAAA,IACF,CAAC;AAED,QAAI,CAAC,OAAO,IAAK,QAAO;AAGxB,UAAM,qBAAqB,YAAY,KAAK,CAAC,MAAM,EAAE,QAAQ,OAAO,GAAG;AACvE,QAAI,CAAC,oBAAoB;AACvB,mBAAa,IAAI;AAAA,QACf,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,UACJ,KAAK,OAAO;AAAA,UACZ,eAAe,YAAY,IAAI,CAAC,MAAM,EAAE,GAAG;AAAA,QAC7C;AAAA,MACF,CAAC;AACD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,KAAK,OAAO;AAAA,MACZ,WAAW,OAAO;AAAA,MAClB,kBAAkB,OAAO;AAAA,MACzB,YAAY,OAAO;AAAA,IACrB;AAAA,EACF,SAAS,OAAO;AACd,iBAAa,IAAI;AAAA,MACf,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;AAAA,IACxE,CAAC;AACD,WAAO;AAAA,EACT;AACF;;;ACxHA,IAAM,mBAAgD;AAAA,EACpD,OAAO,oBAAI,IAAI;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,CAAC;AAAA,EACD,OAAO,oBAAI,IAAI,CAAC,WAAW,aAAa,YAAY,cAAc,UAAU,CAAC;AAAA,EAC7E,QAAQ,oBAAI,IAAI,CAAC,YAAY,WAAW,QAAQ,CAAC;AAAA,EACjD,OAAO,oBAAI,IAAI;AAAA;AACjB;AAGA,IAAM,2BAA2B,oBAAI,IAAI;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,yBAAyB,oBAAI,IAAI,CAAC,SAAS,QAAQ,CAAC;AAG1D,SAAS,YAAY,MAAuB;AAC1C,SAAO,KAAK,SAAS,KAAK,SAAS,KAAK,IAAI;AAC9C;AAWO,SAAS,eACd,UACA,KACA,YACA,OACA,MACkB;AAClB,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAgC,CAAC;AAGvC,MAAI,UAAwC;AAC5C,QAAM,WAAW,OAAO,GAAG;AAC3B,MAAI,UAAU;AACZ,cAAU,EAAE,KAAK,MAAM,SAAS,MAAM,MAAM,SAAS,QAAQ,IAAI,YAAY,CAAC,EAAE;AAAA,EAClF,OAAO;AACL,cAAU,sBAAsB,UAAU,GAAG;AAAA,EAC/C;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,QAAQ,GAAG;AAAA,IACtB,CAAC;AAED,WAAO,EAAE,OAAO,OAAO,QAAQ,SAAS;AAAA,EAC1C;AAGA,QAAM,mBAAmB,oBAAoB,UAAU;AAGvD,MAAI,qBAAqB,WAAW,YAAY,QAAQ,IAAI,GAAG;AAC7D,UAAM,aAAa,iBAAiB,gBAAgB;AACpD,QAAI,cAAc,WAAW,OAAO,GAAG;AAErC,UAAI,CAAC,WAAW,IAAI,QAAQ,IAAI,GAAG;AAEjC,YAAI,qBAAqB,WAAW,CAAC,yBAAyB,IAAI,QAAQ,IAAI,GAAG;AAAA,QAEjF,OAAO;AACL,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,SAAS,mCAAU,UAAU,kBAAa,QAAQ,IAAI,6FAAuB,GAAG;AAAA,UAClF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,uBAAuB,IAAI,gBAAgB,MAAM,CAAC,SAAS,MAAM,KAAK,MAAM,KAAK;AACnF,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS,mCAAU,UAAU,+DAAkB,GAAG;AAAA,IACpD,CAAC;AAAA,EACH;AAGA,MAAI,QAAQ,WAAW,YAAY,QAAQ,WAAW,aAAa,QAAQ;AACzE,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,qDAAuB,GAAG,UAAU,QAAQ,IAAI;AAAA,IAC3D,CAAC;AAAA,EACH;AAGA,MAAI,QAAQ,WAAW,YAAY,QAAQ,WAAW,aAAa,QAAQ;AACzE,QAAI,qBAAqB,SAAS;AAChC,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,qDAAuB,GAAG,UAAU,QAAQ,IAAI;AAAA,MAC3D,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,iBAAiB,aAAa,UAAU,GAAG;AACjD,MAAI,gBAAgB;AAClB,aAAS,KAAK,cAAc;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAGA,SAAS,oBAAoB,YAA4B;AACvD,UAAQ,YAAY;AAAA,IAClB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,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;AAMA,SAAS,aAAa,UAAkB,WAA6C;AACnF,QAAM,QAAQ,SAAS,MAAM,IAAI;AAGjC,MAAI,kBAAkB;AACtB,MAAI,eAAe;AACnB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,UAAU,MAAM,CAAC,EAAE,UAAU;AACnC,QAAI,QAAQ,WAAW,QAAQ,KAAK,QAAQ,WAAW,aAAa,GAAG;AACrE,wBAAkB;AAClB,qBAAe,MAAM,CAAC,EAAE,SAAS,QAAQ;AACzC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,oBAAoB,GAAI,QAAO;AAGnC,QAAM,aAAa,QAAQ,SAAS;AACpC,MAAI,kBAAkB;AACtB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,QAAI,MAAM,CAAC,EAAE,SAAS,UAAU,GAAG;AACjC,wBAAkB;AAClB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,oBAAoB,GAAI,QAAO;AAGnC,MAAI,kBAAkB,iBAAiB;AACrC,UAAM,eAAe,MAAM,eAAe,EAAE,SAAS,MAAM,eAAe,EAAE,UAAU,EAAE;AACxF,QAAI,eAAe,cAAc;AAE/B,aAAO;AAAA,IACT;AAAA,EACF;AAGA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS,wGAAuC,SAAS;AAAA,EAC3D;AACF;;;AC1LO,SAAS,qBACd,UACA,UACA,MAC4B;AAC5B,QAAM,UAAsC;AAAA,IAC1C,KAAK;AAAA,IACL,WAAW;AAAA,IACX,YAAY;AAAA,EACd;AAGA,QAAM,WAA+D,CAAC;AACtE,MAAI,MAAM;AACR,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,eAAS,KAAK,EAAE,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,QAAQ,GAAG,CAAC;AAAA,IACjE;AAAA,EACF,OAAO;AACL,aAAS,KAAK,GAAG,iBAAiB,QAAQ,CAAC;AAAA,EAC7C;AACA,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,QAAM,eAAe,gBAAgB,SAAS,IAAI;AAClD,QAAM,oBAAoB,gBAAgB,SAAS,SAAS;AAC5D,QAAM,eAAe,gBAAgB,SAAS,IAAI;AAGlD,MAAI,CAAC,qBAAqB,CAAC,aAAc,QAAO;AAIhD,QAAM,aAAa,mBAAmB,YAAY;AAClD,QAAM,YAAY,cAAc,YAAY;AAI5C,MAAI,KAAoB;AACxB,MAAI,KAAoB;AACxB,MAAI,KAAoB;AACxB,MAAI,KAAoB;AACxB,MAAI,KAAoB;AAExB,aAAW,MAAM,UAAU;AACzB,UAAM,YAAY,oBAAoB,GAAG,SAAS,oBAAoB;AACtE,UAAM,YAAY,eAAe,GAAG,SAAS,eAAe;AAG5D,QAAI,aAAa,WAAW;AAC1B,UAAI,CAAC,IAAI;AAAE,aAAK,EAAE,KAAK,GAAG,KAAK,OAAO,EAAE;AAAA,MAAG,OACtC;AAAE,WAAG;AAAA,MAAS;AAAA,IAErB;AAGA,QAAI,WAAW;AACb,UAAI,CAAC,IAAI;AAAE,aAAK,EAAE,KAAK,GAAG,KAAK,OAAO,EAAE;AAAA,MAAG,OACtC;AAAE,WAAG;AAAA,MAAS;AAAA,IACrB;AAGA,UAAM,YAAa,cAAc,YAAa,GAAG,KAAK,YAAY,IAAI;AAGtE,QAAI,aAAa,cAAc,UAAU,SAAS,UAAU,GAAG;AAC7D,UAAI,CAAC,IAAI;AAAE,aAAK,EAAE,KAAK,GAAG,KAAK,OAAO,EAAE;AAAA,MAAG,OACtC;AAAE,WAAG;AAAA,MAAS;AAAA,IACrB;AAGA,QAAI,aAAa,aAAa,UAAU,SAAS,SAAS,GAAG;AAC3D,UAAI,CAAC,IAAI;AAAE,aAAK,EAAE,KAAK,GAAG,KAAK,OAAO,EAAE;AAAA,MAAG,OACtC;AAAE,WAAG;AAAA,MAAS;AAAA,IACrB;AAGA,QAAI,CAAC,gBAAgB,cAAc,UAAU,SAAS,UAAU,GAAG;AACjE,UAAI,CAAC,IAAI;AAAE,aAAK,EAAE,KAAK,GAAG,KAAK,OAAO,EAAE;AAAA,MAAG,OACtC;AAAE,WAAG;AAAA,MAAS;AAAA,IACrB;AAAA,EACF;AAGA,MAAI,MAAM,GAAG,UAAU,EAAG,QAAO,EAAE,KAAK,GAAG,KAAK,WAAW,uBAAuB,YAAY,EAAI;AAClG,MAAI,MAAM,GAAG,UAAU,EAAG,QAAO,EAAE,KAAK,GAAG,KAAK,WAAW,cAAc,YAAY,IAAI;AACzF,MAAI,MAAM,GAAG,UAAU,EAAG,QAAO,EAAE,KAAK,GAAG,KAAK,WAAW,yBAAyB,YAAY,IAAI;AACpG,MAAI,MAAM,GAAG,UAAU,EAAG,QAAO,EAAE,KAAK,GAAG,KAAK,WAAW,iBAAiB,YAAY,IAAI;AAC5F,MAAI,MAAM,GAAG,UAAU,EAAG,QAAO,EAAE,KAAK,GAAG,KAAK,WAAW,yBAAyB,YAAY,IAAI;AAEpG,SAAO;AACT;AAGA,SAAS,gBAAgB,OAAoC;AAC3D,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,WAAO,MAAM,KAAK;AAAA,EACpB;AACA,SAAO;AACT;;;ACrHO,SAAS,kBAAkB,MAAkB,SAA2B;AAC7E,MAAI,QAAS,QAAO;AACpB,SAAO,KAAK;AACd;;;ACjBO,IAAM,0BAAN,MAA8D;AAAA,EACnE,MAAM,QAAQ,MAAkB,YAAoB,UAA6D;AAC/G,WAAO,mBAAmB,IAAI;AAAA,EAChC;AACF;AAKA,eAAsB,mBACpB,MAC6B;AAC7B;AAAA,IACE,GAAG,GAAG,yBAAyB,EAAE,SAAS,KAAK,SAAS,aAAa,KAAK,YAAY,CAAC,CAAC;AAAA,EAAK,GAAG,+BAA+B,EAAE,OAAO,KAAK,WAAW,MAAM,eAAe,KAAK,SAAS,EAAE,CAAC,CAAC;AAAA,IAC/L,EAAE,oBAAoB;AAAA,EACxB;AAEA,SAAO,aAAiC,EAAE,2BAA2B,GAAG;AAAA,IACtE,EAAE,OAAO,WAAW,OAAO,EAAE,sBAAsB,EAAE;AAAA,IACrD,EAAE,OAAO,QAAQ,OAAO,EAAE,mBAAmB,EAAE;AAAA,IAC/C,EAAE,OAAO,SAAS,OAAO,EAAE,oBAAoB,GAAG,MAAM,EAAE,wBAAwB,EAAE;AAAA,EACtF,CAAC;AACH;;;AC/BA,SAAS,KAAAC,UAAS;AAQlB,IAAM,qBAAqBC,GAAE,OAAO;AAAA,EAClC,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gGAAqB;AAC7D,CAAC;AAMD,eAAsB,eACpB,SACA,SACA,OACwB;AACxB,UAAQ,QAAQ,UAAU;AAAA,IACxB,KAAK;AACH,aAAO,oBAAoB,SAAS,OAAO;AAAA,IAC7C,KAAK;AACH,aAAO,eAAe,SAAS,OAAO;AAAA,IACxC,KAAK;AACH,aAAO,cAAc,SAAS,OAAO;AAAA,IACvC,KAAK;AACH,aAAO,sBAAsB,SAAS,KAAK;AAAA,IAC7C,KAAK;AACH,aAAO,oBAAoB,SAAS,OAAO;AAAA,IAC7C;AACE,UAAI,KAAK,6BAA6B,QAAQ,QAAQ,EAAE;AACxD,aAAO;AAAA,EACX;AACF;AAEA,eAAe,oBACb,SACA,SACwB;AACxB,MAAI,CAAC,QAAQ,SAAS;AACpB,QAAI,KAAK,YAAY,QAAQ,IAAI,uCAAuC;AACxE,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,MAAM,QAAQ,SAAS;AACxC,MAAI;AACJ,MAAI;AACF,SAAK,IAAI,OAAO,QAAQ,OAAO;AAAA,EACjC,QAAQ;AACN,QAAI,KAAK,YAAY,QAAQ,IAAI,6BAA6B,QAAQ,OAAO,EAAE;AAC/E,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,GAAG,KAAK,QAAQ;AAE9B,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,SAAS;AAC/B,SAAO,MAAM,KAAK,KAAK,MAAM,CAAC,KAAK;AACrC;AAEA,eAAe,eACb,SACA,SACwB;AACxB,MAAI,CAAC,QAAQ,SAAS;AACpB,QAAI,KAAK,YAAY,QAAQ,IAAI,kCAAkC;AACnE,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,QAAQ,IAAI;AACrC,MAAI;AACJ,MAAI;AACF,SAAK,IAAI,OAAO,QAAQ,OAAO;AAAA,EACjC,QAAQ;AACN,QAAI,KAAK,YAAY,QAAQ,IAAI,6BAA6B,QAAQ,OAAO,EAAE;AAC/E,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,GAAG,KAAK,UAAU;AAEhC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,SAAS;AAC/B,SAAO,MAAM,KAAK,KAAK,MAAM,CAAC,KAAK;AACrC;AAGA,IAAM,wBAAwB;AAE9B,eAAe,cACb,SACA,SACwB;AACxB,MAAI,CAAC,QAAQ,QAAQ;AACnB,QAAI,KAAK,YAAY,QAAQ,IAAI,gCAAgC;AACjE,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,eAAe,MAAM,QAAQ,SAAS,CAAC;AACxD,QAAM,aAAa,MAAM,QAAQ,IAAI;AAErC,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM;AAAA,MACvB,MACE,sBAAsB,cAAc;AAAA,QAClC,OAAO,SAAS,YAAY;AAAA,QAC5B,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,YACT,iBAAiB;AAAA,cACf,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,EAAE;AAAA,YACnD;AAAA,UACF;AAAA,UACA,EAAE,MAAM,QAAQ,SAAS,WAAW;AAAA,QACtC;AAAA,QACA,QAAQ;AAAA,QACR,aAAa;AAAA,MACf,CAAC;AAAA,MACH,EAAE,OAAO,aAAa;AAAA,IACxB;AAEA,WAAO,OAAO,SAAS;AAAA,EACzB,SAAS,OAAO;AACd,QAAI;AAAA,MACF,YAAY,QAAQ,IAAI,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAC3G;AACA,WAAO;AAAA,EACT;AACF;AAEA,eAAe,oBACb,SACA,SACwB;AACxB,MAAI,CAAC,QAAQ,YAAY;AACvB,QAAI,KAAK,YAAY,QAAQ,IAAI,4DAA4D;AAC7F,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,QAAQ,SAAS,QAAQ,UAAU;AACxD,QAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,aAAO;AAAA,IACT;AACA,WAAO,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,MAAM;AAAA,EACpE,SAAS,OAAO;AACd,QAAI;AAAA,MACF,YAAY,QAAQ,IAAI,sBAAsB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACtG;AACA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,sBACP,SACA,OACe;AACf,MAAI,CAAC,QAAQ,YAAY;AACvB,QAAI,KAAK,YAAY,QAAQ,IAAI,4CAA4C;AAC7E,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,gBAAgB,QAAQ,UAAU;AAEvD,MAAI,cAAc,KAAK,MAAM,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC7KA,IAAM,uBAAuB,CAAC,OAAO,OAAO,MAAM,MAAM,MAAM,MAAM,KAAK,GAAG;AAOrE,SAAS,kBAAkB,YAAgC;AAChE,QAAM,UAAU,WAAW,KAAK;AAChC,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,OAAO,OAAO,OAAO,mBAAmB;AAAA,EACnD;AAGA,MAAI,QAAQ,WAAW,GAAG,KAAK,CAAC,QAAQ,WAAW,IAAI,GAAG;AACxD,UAAM,QAAQ,QAAQ,MAAM,CAAC,EAAE,KAAK;AACpC,UAAMC,WAAU,aAAa,KAAK;AAClC,QAAIA,aAAY,QAAW;AACzB,aAAO,EAAE,OAAO,OAAO,OAAO,yBAAyB,KAAK,GAAG;AAAA,IACjE;AACA,WAAO,EAAE,OAAO,CAAC,SAASA,QAAO,EAAE;AAAA,EACrC;AAGA,QAAM,aAAa,eAAe,OAAO;AACzC,MAAI,YAAY;AACd,UAAM,EAAE,MAAM,UAAU,MAAM,IAAI;AAClC,UAAM,UAAU,aAAa,IAAI;AACjC,UAAM,WAAW,aAAa,KAAK;AACnC,QAAI,YAAY,QAAW;AACzB,aAAO,EAAE,OAAO,OAAO,OAAO,8BAA8B,IAAI,GAAG;AAAA,IACrE;AACA,QAAI,aAAa,QAAW;AAC1B,aAAO,EAAE,OAAO,OAAO,OAAO,+BAA+B,KAAK,GAAG;AAAA,IACvE;AACA,WAAO,EAAE,OAAO,QAAQ,SAAS,UAAU,QAAQ,EAAE;AAAA,EACvD;AAGA,QAAM,UAAU,aAAa,OAAO;AACpC,MAAI,YAAY,QAAW;AACzB,WAAO,EAAE,OAAO,OAAO,OAAO,4BAA4B,OAAO,GAAG;AAAA,EACtE;AACA,SAAO,EAAE,OAAO,SAAS,OAAO,EAAE;AACpC;AAEA,SAAS,eACP,MACsE;AAEtE,aAAW,MAAM,sBAAsB;AAErC,UAAM,MAAM,2BAA2B,MAAM,EAAE;AAC/C,QAAI,QAAQ,IAAI;AACd,aAAO;AAAA,QACL,MAAM,KAAK,MAAM,GAAG,GAAG,EAAE,KAAK;AAAA,QAC9B,UAAU;AAAA,QACV,OAAO,KAAK,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,2BAA2B,MAAc,IAAoB;AACpE,MAAI,WAAW;AACf,MAAI,WAAW;AACf,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,KAAK,KAAK,CAAC;AACjB,QAAI,OAAO,OAAO,CAAC,aAAa,MAAM,KAAK,KAAK,IAAI,CAAC,MAAM,OAAO;AAChE,iBAAW,CAAC;AAAA,IACd,WAAW,OAAO,OAAO,CAAC,aAAa,MAAM,KAAK,KAAK,IAAI,CAAC,MAAM,OAAO;AACvE,iBAAW,CAAC;AAAA,IACd,WAAW,CAAC,YAAY,CAAC,UAAU;AACjC,UAAI,KAAK,MAAM,GAAG,IAAI,GAAG,MAAM,MAAM,IAAI;AAGvC,YAAI,OAAO,OAAO,KAAK,IAAI,CAAC,MAAM,IAAK;AACvC,YAAI,OAAO,OAAO,KAAK,IAAI,CAAC,MAAM,IAAK;AACvC,YAAI,OAAO,OAAO,GAAG,WAAW,EAAG;AACnC,YAAI,OAAO,QAAQ,KAAK,IAAI,CAAC,MAAM,IAAK;AACxC,YAAI,OAAO,QAAQ,KAAK,IAAI,CAAC,MAAM,IAAK;AACxC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aAAa,KAAkC;AACtD,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,CAAC,QAAS,QAAO;AAGrB,MACG,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,KAC/C,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAChD;AACA,WAAO,QAAQ,MAAM,GAAG,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,QAAQ,GAAG;AAAA,EACtE;AAGA,MAAI,YAAY,OAAQ,QAAO;AAC/B,MAAI,YAAY,QAAS,QAAO;AAGhC,MAAI,kBAAkB,KAAK,OAAO,GAAG;AACnC,WAAO,OAAO,OAAO;AAAA,EACvB;AAGA,SAAO;AACT;AAEA,SAAS,SAAS,KAAuB;AACvC,MAAI,OAAO,QAAQ,UAAW,QAAO;AACrC,MAAI,OAAO,QAAQ,SAAU,QAAO,QAAQ;AAC5C,MAAI,OAAO,QAAQ,SAAU,QAAO,QAAQ,MAAM,QAAQ,WAAW,QAAQ;AAC7E,SAAO;AACT;AAEA,SAAS,QAAQ,MAAe,OAAgB,IAAiC;AAC/E,UAAQ,IAAI;AAAA,IACV,KAAK;AACH,aAAO,SAAS;AAAA,IAClB,KAAK;AACH,aAAO,SAAS;AAAA,IAClB,KAAK;AAEH,aAAO,OAAO,IAAI,MAAM,OAAO,KAAK;AAAA,IACtC,KAAK;AACH,aAAO,OAAO,IAAI,MAAM,OAAO,KAAK;AAAA,IACtC,KAAK;AACH,aAAO,SAAS,IAAI,IAAI,SAAS,KAAK;AAAA,IACxC,KAAK;AACH,aAAO,SAAS,IAAI,IAAI,SAAS,KAAK;AAAA,IACxC,KAAK;AACH,aAAO,SAAS,IAAI,KAAK,SAAS,KAAK;AAAA,IACzC,KAAK;AACH,aAAO,SAAS,IAAI,KAAK,SAAS,KAAK;AAAA,IACzC;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,SAAS,KAAsB;AACtC,MAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,MAAI,OAAO,QAAQ,UAAW,QAAO,MAAM,IAAI;AAC/C,QAAM,IAAI,OAAO,GAAG;AACpB,SAAO,OAAO,MAAM,CAAC,IAAI,IAAI;AAC/B;;;AClKA,SAAS,cAAAC,mBAAkB;AAiBpB,IAAM,gBAAN,MAAoB;AAAA,EAIzB,YAAY,aAAa,GAAG;AAH5B,SAAQ,QAAQ,oBAAI,IAAgC;AAIlD,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,KAAa,MAAsC;AAC7D,UAAM,MAAM,KAAK,SAAS,KAAK,IAAI;AACnC,UAAM,WAAW,KAAK,MAAM,IAAI,GAAG;AACnC,QAAI,UAAU;AAEZ,WAAK,MAAM,OAAO,GAAG;AACrB,WAAK,MAAM,IAAI,KAAK,QAAQ;AAC5B,aAAO,SAAS;AAAA,IAClB;AAEA,UAAM,WAAW,eAAe,KAAK,IAAI;AACzC,UAAM,gBAAgB,KAAK,KAAK,SAAS,SAAS,CAAC;AAEnD,SAAK,cAAc;AACnB,SAAK,MAAM,IAAI,KAAK;AAAA,MAClB,SAAS,KAAK,aAAa,GAAG;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,MAAc,MAAuB;AAC9C,WAAO,KAAK,aAAa,IAAI,MAAM,KAAK,aAAa,IAAI;AAAA,EAC3D;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA;AAAA,EAGA,IAAI,OAAe;AACjB,WAAO,KAAK,MAAM;AAAA,EACpB;AAAA,EAEQ,SAAS,KAAa,MAAsC;AAClE,UAAM,UAAU,KAAK,aAAa,GAAG;AACrC,UAAM,cAAc,MAAM,iBAAiB,QAAQ;AACnD,WAAO,GAAG,OAAO,IAAI,WAAW;AAAA,EAClC;AAAA,EAEQ,aAAa,KAAqB;AACxC,WAAOC,YAAW,QAAQ,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAAA,EACnE;AAAA,EAEQ,gBAAsB;AAC5B,WAAO,KAAK,MAAM,QAAQ,KAAK,YAAY;AAEzC,YAAM,YAAY,KAAK,MAAM,KAAK,EAAE,KAAK,EAAE;AAC3C,UAAI,cAAc,QAAW;AAC3B,aAAK,MAAM,OAAO,SAAS;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AACF;;;AC/EO,IAAM,iBAAN,MAAqB;AAAA,EAI1B,YAAY,UAAkB;AAC5B,SAAK,WAAW;AAChB,SAAK,SAAS,wBAAwB,QAAQ;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,eACE,iBACA,KACA,YAAY,KACJ;AACR,QAAI,KAAK,OAAO,WAAW,EAAG,QAAO,KAAK;AAE1C,UAAM,aAAa,gBAAgB,GAAG,eAAe,IAAI,GAAG,EAAE;AAC9D,QAAI,WAAW,WAAW,EAAG,QAAO,KAAK;AAEzC,UAAM,SAAS,KAAK,OACjB,IAAI,CAAC,WAAW;AAAA,MACf;AAAA,MACA,OAAO,oBAAoB,YAAY,MAAM,QAAQ;AAAA,IACvD,EAAE,EACD,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EACzB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEnC,QAAI,OAAO,WAAW,GAAG;AAEvB,YAAM,aAAa,KAAK,KAAK,KAAK,SAAS,SAAS,CAAC;AACrD,UAAI,cAAc,UAAW,QAAO,KAAK;AAEzC,aAAO,KAAK,SAAS,MAAM,GAAG,YAAY,CAAC,IAAI;AAAA,IACjD;AAGA,QAAI,SAAS;AACb,UAAM,WAA2B,CAAC;AAClC,eAAW,EAAE,MAAM,KAAK,QAAQ;AAC9B,UAAI,SAAS,MAAM,gBAAgB,WAAW;AAE5C;AAAA,MACF;AACA,eAAS,KAAK,KAAK;AACnB,gBAAU,MAAM;AAAA,IAClB;AAEA,QAAI,SAAS,WAAW,KAAK,OAAO,SAAS,GAAG;AAE9C,YAAM,OAAO,OAAO,CAAC,EAAE;AACvB,YAAM,WAAW,YAAY;AAC7B,aAAO,OAAO,KAAK,OAAO;AAAA,EAAK,KAAK,QAAQ,MAAM,GAAG,QAAQ,CAAC;AAAA;AAAA,IAChE;AAEA,WAAO,SAAS,IAAI,CAAC,MAAM,OAAO,EAAE,OAAO;AAAA,EAAK,EAAE,OAAO,EAAE,EAAE,KAAK,MAAM;AAAA,EAC1E;AAAA;AAAA,EAGA,UAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,IAAI,aAAqB;AACvB,WAAO,KAAK,OAAO;AAAA,EACrB;AACF;AAMA,SAAS,wBAAwB,UAAkC;AACjE,QAAM,QAAQ,SAAS,MAAM,IAAI;AACjC,QAAM,SAAyB,CAAC;AAChC,MAAI,iBAAiB;AACrB,MAAI,iBAA2B,CAAC;AAEhC,aAAW,QAAQ,OAAO;AACxB,UAAM,eAAe,KAAK,MAAM,gBAAgB;AAChD,QAAI,cAAc;AAEhB,UAAI,eAAe,SAAS,KAAK,gBAAgB;AAC/C,cAAMC,WAAU,eAAe,KAAK,IAAI,EAAE,KAAK;AAC/C,YAAIA,UAAS;AACX,iBAAO,KAAK,WAAW,kBAAkB,YAAYA,QAAO,CAAC;AAAA,QAC/D;AAAA,MACF;AACA,uBAAiB,aAAa,CAAC,EAAE,KAAK;AACtC,uBAAiB,CAAC;AAAA,IACpB,OAAO;AACL,qBAAe,KAAK,IAAI;AAAA,IAC1B;AAAA,EACF;AAGA,QAAM,UAAU,eAAe,KAAK,IAAI,EAAE,KAAK;AAC/C,MAAI,SAAS;AACX,WAAO,KAAK,WAAW,kBAAkB,YAAY,OAAO,CAAC;AAAA,EAC/D;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,SAAiB,SAA+B;AAClE,QAAM,WAAW,GAAG,OAAO,IAAI,OAAO;AACtC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,eAAe,KAAK,KAAK,SAAS,SAAS,CAAC;AAAA,IAC5C,UAAU,gBAAgB,QAAQ;AAAA,EACpC;AACF;AAOO,SAAS,gBAAgB,MAAwB;AACtD,QAAM,aAAa,KAAK,YAAY;AACpC,QAAM,QAAQ,oBAAI,IAAY;AAG9B,QAAM,WAAW,WAAW,MAAM,gBAAgB;AAClD,MAAI,UAAU;AACZ,eAAW,QAAQ,UAAU;AAC3B,YAAM,IAAI,KAAK,QAAQ,KAAK,EAAE,CAAC;AAAA,IACjC;AAAA,EACF;AAGA,QAAM,eAAe,WAAW,MAAM,sBAAsB;AAC5D,MAAI,cAAc;AAChB,eAAW,KAAK,cAAc;AAC5B,UAAI,CAAC,WAAW,IAAI,CAAC,GAAG;AACtB,cAAM,IAAI,CAAC;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,KAAK,MAAM,0CAA0C;AAC3E,MAAI,eAAe;AACjB,eAAW,KAAK,eAAe;AAC7B,YAAM,IAAI,CAAC;AAAA,IACb;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,KAAK;AAClB;AAMO,SAAS,oBACd,YACA,eACQ;AACR,MAAI,WAAW,WAAW,KAAK,cAAc,WAAW,EAAG,QAAO;AAElE,MAAI,aAAa;AACjB,aAAW,MAAM,YAAY;AAC3B,eAAW,MAAM,eAAe;AAC9B,UAAI,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,EAAE,GAAG;AACtC;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,SAAO,aAAa,WAAW;AACjC;AAEA,IAAM,aAAa,oBAAI,IAAI;AAAA,EACzB;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EACxD;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EACxD;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EAAO;AAAA,EACxD;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxD;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAQ;AAAA,EACxD;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EAAS;AAAA,EACtD;AAAA,EAAS;AAAA,EAAS;AAAA,EAAU;AAAA,EAAU;AAAA,EAAQ;AAAA,EAAQ;AACxD,CAAC;;;AbtID,eAAsB,QACpB,QACA,aACA,MAC0B;AAC1B,QAAM,aAAa,YAAY,IAAI;AACnC,QAAM,cAAc,CAAC,KAAK;AAC1B,QAAM,UAAU,KAAK,WAAW,IAAI,aAAa;AACjD,QAAM,UAAiC,CAAC;AACxC,MAAI,UAAU;AACd,MAAI;AACJ,QAAM,SAAiB,KAAK,UAAU,IAAI,WAAW;AACrD,QAAM,gBAAgB,KAAK,kBAAkB,MAAM,IAAI,YAAY;AACnE,QAAM,cAAc,kBAAkB;AAAA,IACpC,UAAU,OAAO;AAAA,IACjB,SAAS,OAAO;AAAA,EAClB,CAAC;AAED,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,iBAAiB,OAAO,kBAC1B,IAAI,eAAe,OAAO,eAAe,IACzC;AACJ,QAAM,kBAAkB,IAAI,gBAAgB;AAE5C,QAAM,UAAU,OAAO,aAAa,YAAY,SAAS;AAEzD,MAAI,OAAO,eAAe;AACxB,UAAM,MAAM,OAAO,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,EACvD;AAEA,MAAI;AAEF,QAAI,aAAa;AACf,YAAM,WAAW,KAAK,MAAM,gBAAgB,YAAY,SAAS,QAAQ;AACzE,YAAM,cAAc,cAAc;AAClC,kBAAY,MAAM,GAAG,QAAQ,gDAAa;AAC1C,YAAM,QAAQ,KAAK,UAAU;AAAA,QAC3B,UAAU,OAAO;AAAA,QACjB,SAAS,OAAO;AAAA,QAChB,OAAO,OAAO;AAAA,MAChB,CAAC;AAED,YAAM,QAAQ,oBAAoB,GAAI;AACtC,kBAAY,KAAK,kDAAU;AAG3B,UAAI,OAAO,UAAU;AACnB,YAAI;AACF,gBAAM,QAAQ,eAAe,OAAO,QAAQ;AAC5C,iBAAO,KAAK,6BAAS,OAAO,QAAQ,EAAE;AAAA,QACxC,SAAS,GAAG;AACV,iBAAO,KAAK,uEAAgB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AAEA,eAAW,QAAQ,YAAY,OAAO;AACpC,UAAI,QAAS;AACb,UAAI,KAAK,aAAa,SAAS;AAC7B,kBAAU;AACV,eAAO,KAAK,+BAA+B;AAC3C;AAAA,MACF;AAEA,aAAO,KAAK,QAAQ,KAAK,OAAO,IAAI,YAAY,MAAM,MAAM,KAAK,KAAK,WAAW,EAAE;AACnF,YAAM,QAAQ,KAAK,IAAI;AAGvB,UAAI,KAAK,WAAW;AAClB,cAAM,WAAW,KAAK,MAAM,gBAAgB,KAAK,SAAS;AAC1D,cAAM,aAAa,kBAAkB,QAAQ;AAC7C,oBAAY,IAAI;AAAA,UACd,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM,KAAK;AAAA,UACX,MAAM,EAAE,WAAW,KAAK,WAAW,UAAU,QAAQ,WAAW,OAAO,OAAO,WAAW,MAAM;AAAA,QACjG,CAAC;AACD,YAAI,CAAC,WAAW,OAAO;AACrB,iBAAO,KAAK,8BAA8B,KAAK,SAAS,EAAE;AAC1D,kBAAQ,KAAK;AAAA,YACX,SAAS,KAAK;AAAA,YACd,aAAa,KAAK;AAAA,YAClB,YAAY,KAAK,OAAO;AAAA,YACxB,QAAQ;AAAA,YACR,YAAY,KAAK,IAAI,IAAI;AAAA,YACzB,kBAAkB;AAAA,UACpB,CAAC;AACD;AAAA,QACF;AAAA,MACF;AAGA,UAAI,KAAK,UAAU;AACjB,cAAM,eAAe,MAAM;AAAA,UACzB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,gBAAQ,KAAK,YAAY;AACzB,YAAI,aAAa,WAAW,YAAY,YAAY,SAAS,aAAa;AACxE,iBAAO,MAAM,sCAAsC;AACnD,oBAAU;AAAA,QACZ;AACA;AAAA,MACF;AAGA,UAAI,KAAK,QAAQ,KAAK,OAAO;AAC3B,cAAM,aAAa,MAAM;AAAA,UACvB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,gBAAQ,KAAK,UAAU;AACvB,YAAI,WAAW,WAAW,YAAY,YAAY,SAAS,aAAa;AACtE,iBAAO,MAAM,sCAAsC;AACnD,oBAAU;AAAA,QACZ;AACA;AAAA,MACF;AAGA,UAAI,kBAAkB,MAAM,OAAO,gBAAgB,KAAK,KAAK,sBAAsB;AACjF,eAAO,KAAK,kCAAc,KAAK,OAAO,yBAAU,KAAK,SAAS,GAAG;AACjE,oBAAY,IAAI;AAAA,UACd,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM,KAAK;AAAA,UACX,MAAM,EAAE,WAAW,KAAK,WAAW,aAAa,KAAK,YAAY;AAAA,QACnE,CAAC;AAED,cAAM,SAAS,MAAM,KAAK,qBAAqB,QAAQ,MAAM,KAAK,SAAS;AAAA,UACzE,MAAM,YAAY,SAAS;AAAA,QAC7B,CAAC;AAED,oBAAY,IAAI;AAAA,UACd,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM,KAAK;AAAA,UACX,MAAM,EAAE,OAAO;AAAA,QACjB,CAAC;AAED,YAAI,WAAW,SAAS;AACtB,iBAAO,MAAM,gDAAkB,KAAK,OAAO,GAAG;AAC9C,oBAAU;AACV,kBAAQ,KAAK;AAAA,YACX,SAAS,KAAK;AAAA,YACd,aAAa,KAAK;AAAA,YAClB,YAAY,KAAK,OAAO;AAAA,YACxB,QAAQ;AAAA,YACR,YAAY,KAAK,IAAI,IAAI;AAAA,YACzB,OAAO;AAAA,UACT,CAAC;AACD;AAAA,QACF;AACA,YAAI,WAAW,QAAQ;AACrB,iBAAO,KAAK,4DAAoB,KAAK,OAAO,GAAG;AAC/C,kBAAQ,KAAK;AAAA,YACX,SAAS,KAAK;AAAA,YACd,aAAa,KAAK;AAAA,YAClB,YAAY,KAAK,OAAO;AAAA,YACxB,QAAQ;AAAA,YACR,YAAY,KAAK,IAAI,IAAI;AAAA,UAC3B,CAAC;AACD;AAAA,QACF;AAEA,eAAO,QAAQ,gDAAkB,KAAK,OAAO,GAAG;AAAA,MAClD;AAEA,UAAI;AACF,cAAM,aAAa,MAAM;AAAA,UACvB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,gBAAQ,KAAK,EAAE,GAAG,YAAY,SAAS,KAAK,SAAS,aAAa,KAAK,aAAa,YAAY,KAAK,OAAO,KAAK,CAAC;AAGlH,aAAK,MAAM;AAAA,UACT,KAAK;AAAA,UACL,YAAY,MAAM;AAAA,UAClB,WAAW,WAAW;AAAA,UACtB,KAAK;AAAA,UACL,KAAK,OAAO;AAAA,UACZ,KAAK;AAAA,QACP;AAGA,YAAI,WAAW,eAAe;AAC5B,eAAK,MAAM,IAAI,iBAAiB,WAAW,aAAa;AAAA,QAC1D;AAEA,YAAI,WAAW,WAAW,YAAY,YAAY,SAAS,aAAa;AACtE,iBAAO,MAAM,sCAAsC;AACnD,oBAAU;AACV;AAAA,QACF;AAGA,YAAI,KAAK,YAAY,KAAK,SAAS,SAAS,GAAG;AAC7C,gBAAM,oBAAoB,SAAS,MAAM,KAAK,OAAO,SAAS,aAAa,aAAa,MAAM;AAC9F,cAAI,QAAQ,QAAQ,SAAS,CAAC,EAAE,WAAW,YAAY,YAAY,SAAS,aAAa;AACvF,sBAAU;AAAA,UACZ;AAAA,QACF;AAGA,YAAI,KAAK,oBAAoB,KAAK,WAAW;AAC3C,gBAAM,wBAAwB,MAAM,KAAK,OAAO,KAAK,WAAW,aAAa,MAAM;AAAA,QACrF;AAGA,YAAI,OAAO,eAAe;AACxB,gBAAM,WAAW,QAAQ,OAAO,KAAK,OAAO,EAAE,SAAS,GAAG,GAAG,CAAC;AAC9D,cAAI;AACF,kBAAM,QAAQ,WAAWC,MAAK,OAAO,eAAe,QAAQ,CAAC;AAAA,UAC/D,QAAQ;AAAA,UAER;AAAA,QACF;AAGA,YAAI,UAAU,GAAG;AACf,gBAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAAA,QACjD;AAAA,MACF,SAAS,OAAO;AACd,cAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACtE,eAAO,MAAM,QAAQ;AACrB,oBAAY,IAAI;AAAA,UACd,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM,KAAK;AAAA,UACX,MAAM,EAAE,OAAO,SAAS;AAAA,QAC1B,CAAC;AACD,gBAAQ,KAAK;AAAA,UACX,SAAS,KAAK;AAAA,UACd,aAAa,KAAK;AAAA,UAClB,YAAY,KAAK,OAAO;AAAA,UACxB,QAAQ;AAAA,UACR,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,OAAO;AAAA,QACT,CAAC;AAED,YAAI,YAAY,SAAS,aAAa;AACpC,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AAEA,QAAI,eAAe,QAAQ,YAAY,GAAG;AACxC,UAAI;AACF,cAAM,SAAS,MAAM,QAAQ,cAAc;AAC3C,YAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,+BAAqB,OAAO;AAC5B,qBAAWC,MAAK,OAAO,OAAO;AAC5B,mBAAO,KAAK,6BAASA,EAAC,EAAE;AAAA,UAC1B;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AACV,eAAO,KAAK,uEAAgB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,MAC1E;AAAA,IACF;AAEA,QAAI,aAAa;AACf,UAAI;AACF,cAAM,QAAQ,MAAM;AAAA,MACtB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAGA,QAAM,iBAAiB,0BAA0B,EAAE,WAAW;AAC9D,MAAI,eAAe,aAAa,GAAG;AACjC,gBAAY,IAAI;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,MAAM;AAExB,QAAM,YAAY,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AAChE,QAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,EAAE;AAC5D,QAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AAG9D,QAAM,oBAAwD,KAAK,YAC/D,OAAO;AAAA,IACL,KAAK,UAAU,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,UAAW,MAAM,CAAC,CAAC,CAAC;AAAA,EAC3E,IACA;AAGJ,QAAM,kBAAkB,KAAK,kBACzB,KAAK,gBAAgB,YAAY,IACjC;AAEJ,SAAO;AAAA,IACL,kBAAkB,YAAY;AAAA,IAC9B,UAAU,YAAY,SAAS;AAAA,IAC/B,YAAY,YAAY,MAAM;AAAA,IAC9B,UAAU,YAAY;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,iBAAiB,KAAK,MAAM,YAAY,IAAI,IAAI,UAAU;AAAA,IAC1D,GAAI,qBAAqB,OAAO,KAAK,iBAAiB,EAAE,SAAS,IAAI,EAAE,kBAAkB,IAAI,CAAC;AAAA,IAC9F,GAAI,mBAAmB,gBAAgB,SAAS,IAAI,EAAE,gBAAgB,IAAI,CAAC;AAAA,IAC3E,GAAI,sBAAsB,mBAAmB,SAAS,IAAI,EAAE,YAAY,mBAAmB,IAAI,CAAC;AAAA,EAClG;AACF;AAGA,eAAe,oBACb,SACA,MACA,OACA,SACA,aACA,aACA,QACe;AACf,MAAI,CAAC,KAAK,YAAY,KAAK,SAAS,WAAW,EAAG;AAElD,QAAM,iBAAyC,CAAC;AAChD,aAAW,WAAW,KAAK,UAAU;AACnC,UAAM,QAAQ,MAAM,eAAe,SAAS,SAAS,KAAK;AAC1D,QAAI,UAAU,MAAM;AAClB,YAAM,IAAI,QAAQ,MAAM,KAAK;AAC7B,YAAM,cAAc,MAAM,YAAY,QAAQ,IAAI,IAAI,SAAS;AAC/D,qBAAe,QAAQ,IAAI,IAAI;AAC/B,aAAO,QAAQ,aAAa,QAAQ,IAAI,OAAO,WAAW,GAAG;AAC7D,kBAAY,IAAI;AAAA,QACd,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM,KAAK;AAAA,QACX,MAAM,EAAE,MAAM,QAAQ,MAAM,UAAU,QAAQ,UAAU,OAAO,YAAY;AAAA,MAC7E,CAAC;AAAA,IACH,WAAW,QAAQ,UAAU;AAC3B,aAAO,MAAM,qBAAqB,QAAQ,IAAI,UAAU;AACxD,cAAQ,QAAQ,SAAS,CAAC,EAAE,SAAS;AACrC,cAAQ,QAAQ,SAAS,CAAC,EAAE,QAAQ,qBAAqB,QAAQ,IAAI;AAAA,IACvE,OAAO;AACL,aAAO,KAAK,qBAAqB,QAAQ,IAAI,qBAAqB;AAAA,IACpE;AAAA,EACF;AACA,MAAI,OAAO,KAAK,cAAc,EAAE,SAAS,GAAG;AAC1C,YAAQ,QAAQ,SAAS,CAAC,EAAE,iBAAiB;AAAA,EAC/C;AACF;AAGA,eAAe,gBACb,SACA,MACA,aACA,QACA,MACA,aACA,SACA,QACA,eACA,gBACA,iBAC8B;AAC9B,QAAM,OAAO,KAAK;AAGlB,MAAI,KAAK,SAAS;AAChB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,QAAQ,KAAK;AACnB,QAAM,WAAW,KAAK;AACtB,QAAM,UAAU,KAAK,iBAAiB;AACtC,QAAM,aAAa,KAAK,mBAAmB;AAC3C,QAAM,iBAA0C,CAAC;AACjD,MAAI,aAAa;AACjB,MAAI,aAAa;AAEjB,cAAY,IAAI;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,KAAK;AAAA,IACX,MAAM,EAAE,WAAW,KAAK,WAAW,eAAe,SAAS,iBAAiB,WAAW;AAAA,EACzF,CAAC;AAED,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAEhC,QAAI,KAAK,aAAa,SAAS;AAC7B,mBAAa;AACb;AAAA,IACF;AAGA,UAAM,WAAW,MAAM,gBAAgB,KAAK,SAAU;AACtD,UAAM,aAAa,kBAAkB,QAAQ;AAC7C,gBAAY,IAAI;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,MAAM,EAAE,WAAW,GAAG,WAAW,KAAK,WAAW,UAAU,QAAQ,WAAW,MAAM;AAAA,IACtF,CAAC;AAED,QAAI,CAAC,WAAW,OAAO;AACrB,aAAO,KAAK,qCAAqC,CAAC,gBAAgB;AAClE;AAAA,IACF;AAGA,UAAM,IAAI,YAAY,OAAO,CAAC,CAAC;AAC/B;AAEA,WAAO,KAAK,QAAQ,KAAK,OAAO,cAAc,CAAC,IAAI,OAAO,EAAE;AAE5D,UAAM,EAAE,SAAS,aAAa,OAAO,IAAI,MAAM;AAAA,MAC7C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,mBAAe,KAAK,WAAW;AAC/B,QAAI,QAAQ;AACV,mBAAa;AACb;AAAA,IACF;AAAA,EACF;AAEA,cAAY,IAAI;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,KAAK;AAAA,IACX,MAAM,EAAE,YAAY,QAAQ,WAAW;AAAA,EACzC,CAAC;AAED,SAAO;AAAA,IACL,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,YAAY;AAAA,IACZ,QAAQ,aAAa,WAAW;AAAA,IAChC,YAAY,KAAK,IAAI,IAAI;AAAA,IACzB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB;AACF;AAGA,eAAe,mBACb,SACA,MACA,aACA,QACA,MACA,aACA,SACA,QACA,eACA,gBACA,iBAC8B;AAC9B,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,QAAQ,KAAK;AACnB,QAAM,OAAO,KAAK;AAClB,QAAM,WAAW,KAAK;AACtB,QAAM,UAAU,KAAK,iBAAiB;AACtC,QAAM,UAAU,KAAK,gBAAgB;AACrC,QAAM,WAAW,KAAK,iBAAiB;AAGvC,QAAM,aAAa,MAAM,gBAAgB,KAAK,OAAQ;AAGtD,MAAI;AACJ,MAAI,WAAW,WAAW,aAAa,GAAG;AAExC,UAAM,iBAAiB,WAAW,MAAM,cAAc,MAAM;AAC5D,QAAI,CAAC,KAAK,WAAW;AACnB,aAAO;AAAA,QACL,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,OAAO,uDAAuD,cAAc;AAAA,MAC9E;AAAA,IACF;AACA,YAAQ,KAAK,UAAU,OAAO,cAAc;AAAA,EAC9C,OAAO;AAEL,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,UAAU;AACpC,UAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,eAAO;AAAA,UACL,SAAS,KAAK;AAAA,UACd,aAAa,KAAK;AAAA,UAClB,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,YAAY,KAAK,IAAI,IAAI;AAAA,UACzB,OAAO,2CAA2C,OAAO,MAAM;AAAA,QACjE;AAAA,MACF;AACA,cAAQ;AAAA,IACV,QAAQ;AACN,aAAO;AAAA,QACL,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,YAAY;AAAA,QACZ,QAAQ;AAAA,QACR,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,OAAO,oCAAoC,WAAW,MAAM,GAAG,GAAG,CAAC;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAGA,QAAM,iBAAiB,MAAM,MAAM,GAAG,OAAO;AAE7C,cAAY,IAAI;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,KAAK;AAAA,IACX,MAAM;AAAA,MACJ,SAAS,KAAK;AAAA,MACd,WAAW,MAAM;AAAA,MACjB,gBAAgB,eAAe;AAAA,MAC/B,eAAe;AAAA,MACf,cAAc;AAAA,MACd,eAAe;AAAA,IACjB;AAAA,EACF,CAAC;AAED,QAAM,iBAA0C,CAAC;AACjD,MAAI,aAAa;AAEjB,WAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,QAAI,KAAK,aAAa,SAAS;AAC7B,mBAAa;AACb;AAAA,IACF;AAEA,UAAM,eAAe,SAAS,eAAe,CAAC,GAAG,UAAU,CAAC;AAE5D,WAAO,KAAK,WAAW,KAAK,OAAO,KAAK,IAAI,CAAC,IAAI,eAAe,MAAM,GAAG;AAEzE,UAAM,EAAE,SAAS,aAAa,OAAO,IAAI,MAAM;AAAA,MAC7C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,mBAAe,KAAK,WAAW;AAC/B,QAAI,QAAQ;AACV,mBAAa;AACb;AAAA,IACF;AAAA,EACF;AAGA,QAAM,iBAAiB,SAAS,QAAQ;AAExC,cAAY,IAAI;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,KAAK;AAAA,IACX,MAAM,EAAE,YAAY,eAAe,QAAQ,QAAQ,WAAW;AAAA,EAChE,CAAC;AAED,SAAO;AAAA,IACL,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,YAAY;AAAA,IACZ,QAAQ,aAAa,WAAW;AAAA,IAChC,YAAY,KAAK,IAAI,IAAI;AAAA,IACzB,gBAAgB,eAAe;AAAA,IAC/B,kBAAkB,MAAM;AAAA,IACxB,gBAAgB;AAAA,EAClB;AACF;AAGA,eAAe,gBACb,SACA,UACA,aACA,QACA,MACA,aACA,SACA,QACA,eACA,gBACA,iBAC8D;AAC9D,QAAM,QAAQ,KAAK;AACnB,QAAM,UAAiC,CAAC;AACxC,MAAI,SAAS;AAEb,aAAW,WAAW,UAAU;AAE9B,QAAI,QAAQ,WAAW;AACrB,YAAM,cAAc,MAAM,gBAAgB,QAAQ,SAAS;AAC3D,YAAM,UAAU,kBAAkB,WAAW;AAC7C,UAAI,CAAC,QAAQ,OAAO;AAClB,eAAO,KAAK,cAAc,QAAQ,OAAO,4BAA4B;AACrE,gBAAQ,KAAK;AAAA,UACX,SAAS,QAAQ;AAAA,UACjB,aAAa,QAAQ;AAAA,UACrB,YAAY,QAAQ,OAAO;AAAA,UAC3B,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,kBAAkB;AAAA,QACpB,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAGA,QAAI,QAAQ,UAAU;AACpB,YAAM,eAAe,MAAM;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,cAAQ,KAAK,YAAY;AACzB,UAAI,aAAa,WAAW,YAAY,YAAY,SAAS,aAAa;AACxE,iBAAS;AACT;AAAA,MACF;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,QAAQ,QAAQ,OAAO;AACjC,YAAM,aAAa,MAAM;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,cAAQ,KAAK,UAAU;AACvB,UAAI,WAAW,WAAW,YAAY,YAAY,SAAS,aAAa;AACtE,iBAAS;AACT;AAAA,MACF;AACA;AAAA,IACF;AAEA,QAAI;AACF,YAAM,YAAY,MAAM;AAAA,QACtB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,cAAQ,KAAK;AAAA,QACX,GAAG;AAAA,QACH,SAAS,QAAQ;AAAA,QACjB,aAAa,QAAQ;AAAA,QACrB,YAAY,QAAQ,OAAO;AAAA,MAC7B,CAAC;AAGD,YAAM;AAAA,QACJ,QAAQ;AAAA,QACR,YAAY,MAAM;AAAA,QAClB,UAAU,WAAW;AAAA,QACrB,QAAQ;AAAA,QACR,QAAQ,OAAO;AAAA,QACf,QAAQ;AAAA,MACV;AAGA,UAAI,UAAU,eAAe;AAC3B,cAAM,IAAI,iBAAiB,UAAU,aAAa;AAAA,MACpD;AAEA,UAAI,UAAU,WAAW,YAAY,YAAY,SAAS,aAAa;AACrE,iBAAS;AACT;AAAA,MACF;AAGA,UAAI,QAAQ,YAAY,QAAQ,SAAS,SAAS,GAAG;AACnD,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YACE,QAAQ,QAAQ,SAAS,CAAC,EAAE,WAAW,YACvC,YAAY,SAAS,aACrB;AACA,mBAAS;AACT;AAAA,QACF;AAAA,MACF;AAGA,UAAI,QAAQ,oBAAoB,KAAK,WAAW;AAC9C,cAAM,wBAAwB,SAAS,OAAO,KAAK,WAAW,aAAa,MAAM;AAAA,MACnF;AAGA,UAAI,UAAU,GAAG;AACf,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC;AAAA,MACjD;AAAA,IACF,SAAS,OAAO;AACd,YAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACtE,aAAO,MAAM,QAAQ;AACrB,cAAQ,KAAK;AAAA,QACX,SAAS,QAAQ;AAAA,QACjB,aAAa,QAAQ;AAAA,QACrB,YAAY,QAAQ,OAAO;AAAA,QAC3B,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,OAAO;AAAA,MACT,CAAC;AACD,UAAI,YAAY,SAAS,aAAa;AACpC,iBAAS;AACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,OAAO;AAC3B;AAGA,eAAe,kBACb,SACA,MACA,aACA,QACA,MACA,aACA,SACA,QACA,eACA,gBACA,iBAC8B;AAC9B,QAAM,QAAQ,KAAK,IAAI;AACvB,QAAM,QAAQ,KAAK;AACnB,QAAM,WAAW,KAAK;AAGtB,QAAM,gBAAgB,MAAM,gBAAgB,SAAS,KAAK;AAC1D,cAAY,IAAI;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,KAAK;AAAA,IACX,MAAM,EAAE,OAAO,SAAS,OAAO,UAAU,eAAe,WAAW,SAAS,MAAM,OAAO;AAAA,EAC3F,CAAC;AAGD,MAAI,eAAoC;AACxC,MAAI,aAAa;AAEjB,aAAW,cAAc,SAAS,OAAO;AACvC,UAAM,gBAAgB,MAAM,gBAAgB,WAAW,KAAK;AAC5D,QAAI,kBAAkB,eAAe;AACnC,qBAAe,WAAW;AAC1B,mBAAa,WAAW;AACxB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,gBAAgB,SAAS,SAAS;AACrC,mBAAe,SAAS,QAAQ;AAChC,iBAAa;AAAA,EACf;AAEA,MAAI,CAAC,cAAc;AACjB,WAAO,KAAK,iCAAiC,aAAa,aAAa;AACvE,gBAAY,IAAI;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,MAAM,EAAE,OAAO,cAAc;AAAA,IAC/B,CAAC;AACD,WAAO;AAAA,MACL,SAAS,KAAK;AAAA,MACd,aAAa,KAAK;AAAA,MAClB,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB,aAAa;AAAA,IACf;AAAA,EACF;AAEA,SAAO,KAAK,oBAAoB,UAAU,aAAa,aAAa,IAAI;AACxE,cAAY,IAAI;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,KAAK;AAAA,IACX,MAAM,EAAE,OAAO,eAAe,OAAO,YAAY,cAAc,aAAa,OAAO;AAAA,EACrF,CAAC;AAED,QAAM,EAAE,SAAS,YAAY,OAAO,IAAI,MAAM;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,cAAY,IAAI;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,KAAK;AAAA,IACX,MAAM,EAAE,OAAO,YAAY,OAAO;AAAA,EACpC,CAAC;AAED,SAAO;AAAA,IACL,SAAS,KAAK;AAAA,IACd,aAAa,KAAK;AAAA,IAClB,YAAY;AAAA,IACZ,QAAQ,SAAS,WAAW;AAAA,IAC5B,YAAY,KAAK,IAAI,IAAI;AAAA,IACzB,aAAa;AAAA,IACb,gBAAgB,CAAC,UAAU;AAAA,EAC7B;AACF;AAEA,eAAe,YACb,SACA,MACA,aACA,QACA,MACA,aACA,QACA,eACA,gBACA,iBAC+D;AAC/D,QAAM,QAAQ,KAAK,IAAI;AAGvB,MAAI,KAAK,OAAO,SAAS,YAAY;AACnC,UAAM,SAAS,KAAK,OAAO,OAAO,KAAK;AACvC,UAAM,MAAM,KAAK,MAAM,gBAAgB,MAAM;AAC7C,WAAO,KAAK,aAAa,KAAK,MAAM,cAAc,GAAG,CAAC,EAAE;AACxD,UAAM,QAAQ,SAAS,GAAG;AAC1B,UAAM,YAAY,MAAM,QAAQ,UAAU;AAC1C,UAAM,QAAQ,0BAA0B,MAAM,QAAQ,IAAI,GAAG,SAAS;AACtE,WAAO,EAAE,QAAQ,WAAW,YAAY,KAAK,IAAI,IAAI,MAAM;AAAA,EAC7D;AAEA,MAAI,KAAK,OAAO,SAAS,UAAU;AACjC,WAAO,KAAK,cAAc;AAC1B,UAAM,QAAQ,OAAO,MAAM;AAC3B,WAAO,EAAE,QAAQ,WAAW,YAAY,KAAK,IAAI,IAAI,MAAM;AAAA,EAC7D;AAEA,MAAI,KAAK,OAAO,SAAS,QAAQ;AAC/B,UAAM,QAAQ,KAAK,OAAO,QACtB,KAAK,MAAM,gBAAgB,KAAK,OAAO,KAAK,IAC5C,OAAO,YAAY,SAAS,cAAc;AAC9C,UAAM,KAAK,OAAO,KAAK;AACvB,WAAO,KAAK,SAAS,EAAE,IAAI;AAC3B,UAAM,QAAQ,KAAK,EAAE;AACrB,WAAO,EAAE,QAAQ,WAAW,YAAY,KAAK,IAAI,IAAI,MAAM;AAAA,EAC7D;AAGA,MAAI,KAAK,OAAO,SAAS,WAAW;AAClC,UAAM,SAAS,KAAK,MAAM,gBAAgB,KAAK,OAAO,UAAU,KAAK,OAAO,SAAS,EAAE;AACvF,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,QAAQ,UAAU,YAAY,KAAK,IAAI,IAAI,OAAO,OAAO,mCAAmC;AAAA,IACvG;AACA,WAAO,KAAK,2BAA2B;AACvC,gBAAY,IAAI;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,MAAM,EAAE,QAAQ,OAAO,MAAM,GAAG,GAAG,EAAE;AAAA,IACvC,CAAC;AACD,UAAM,SAAS,MAAM,QAAQ,SAAS,MAAM;AAC5C,UAAM,UAAU,MAAM,QAAQ,MAAM;AACpC,UAAM,mBAAmB,OAAO,WAAW,YAAY,WAAW,QAAQ,WAAW;AACrF,UAAM,YAAY,WAAW,QAAQ,WAAW,SAC5C,KACA,OAAO,WAAW,WAAW,SAAS,KAAK,UAAU,MAAM;AAC/D,gBAAY,IAAI;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,MAAM;AAAA,QACJ,YAAY,WAAW,OAAO,SAAS,OAAO;AAAA,QAC9C;AAAA,QACA,aAAa,UAAW,OAAqB,SAAS;AAAA,QACtD,eAAe,UAAU,MAAM,GAAG,GAAG;AAAA,QACrC,cAAc,UAAU;AAAA,QACxB;AAAA,MACF;AAAA,IACF,CAAC;AACD,QAAI,cAAc,IAAI;AACpB,aAAO,KAAK,+BAA+B;AAC3C,kBAAY,IAAI;AAAA,QACd,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM,KAAK;AAAA,QACX,MAAM,EAAE,QAAQ,OAAO,MAAM,GAAG,GAAG,EAAE;AAAA,MACvC,CAAC;AAAA,IACH;AACA,WAAO,EAAE,QAAQ,WAAW,YAAY,KAAK,IAAI,IAAI,OAAO,eAAe,UAAU;AAAA,EACvF;AAGA,MAAI,KAAK,OAAO,SAAS,UAAU;AACjC,QAAI,CAAC,KAAK,WAAW;AACnB,aAAO,EAAE,QAAQ,UAAU,YAAY,KAAK,IAAI,IAAI,OAAO,OAAO,4BAA4B;AAAA,IAChG;AACA,UAAM,aAAa,KAAK,MAAM,gBAAgB,KAAK,OAAO,oBAAoB,SAAS;AACvF,UAAM,SAAU,KAAK,OAAO,gBAAgB;AAC5C,UAAM,YAAY,OAAO,aAAa;AACtC,UAAM,aAAa,KAAK,MAAM;AAAA,MAC5B,KAAK,OAAO,cAAc,GAAG,SAAS,IAAI,UAAU,IAAI,MAAM;AAAA,IAChE;AACA,WAAO,KAAK,WAAW,UAAU,WAAM,UAAU,KAAK,MAAM,GAAG;AAC/D,UAAM,cAAc,KAAK,UAAU,OAAO,UAAU;AACpD,UAAM,aAAa,YAAY,SAAS,IACpC,KAAK,UAAU,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,IAC1C;AACJ,gBAAY,IAAI;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,MAAM;AAAA,QACJ;AAAA,QACA,WAAW,YAAY;AAAA,QACvB;AAAA,QACA,MAAM;AAAA,QACN;AAAA,MACF;AAAA,IACF,CAAC;AACD,UAAM,KAAK,UAAU,YAAY,YAAY,YAAY,MAAM;AAC/D,QAAI,KAAK,iBAAiB;AACxB,WAAK,gBAAgB,YAAY;AAAA,QAC/B,MAAM;AAAA,QACN,UAAU,WAAW,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,QACzC,aAAa,KAAK;AAAA,QAClB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AAAA,IACH;AACA,WAAO,EAAE,QAAQ,WAAW,YAAY,KAAK,IAAI,IAAI,OAAO,cAAc,WAAW;AAAA,EACvF;AAGA,MAAI,KAAK,OAAO,SAAS,YAAY;AACnC,UAAM,eAAe,KAAK,MAAM;AAAA,MAC9B,KAAK,OAAO,gBAAgB,iBAAiB,KAAK,IAAI,CAAC;AAAA,IACzD;AAEA,QAAI,KAAK,OAAO,UAAU;AAGxB,YAAM,iBAAiB,MAAM,QAAQ,iBAAiB;AACtD,YAAM,sBAAsB,qBAAqB,eAAe,MAAM,KAAK,OAAO,UAAU,eAAe,IAAI;AAC/G,YAAM,cAAc,oBAAoB;AACxC,UAAI,CAAC,aAAa;AAChB,cAAM,eAAe,gBACjB,cAAc,YAAY,eAAe,IAAI,IAC7C,eAAe;AACnB,cAAM,kBAAkB,iBACpB,eAAe,eAAe,KAAK,aAAa,KAAK,GAAG,IACxD,OAAO;AACX,cAAM,aAAa,MAAM;AAAA,UACvB;AAAA,UACA,KAAK,OAAO;AAAA,UACZ,KAAK;AAAA,UACL,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK,MAAM,wBAAwB;AAAA,QACrC;AACA,YAAI,CAAC,WAAW,KAAK;AACnB,iBAAO,EAAE,QAAQ,UAAU,YAAY,KAAK,IAAI,IAAI,OAAO,OAAO,sCAAsC;AAAA,QAC1G;AACA,eAAO,KAAK,cAAc,WAAW,GAAG,WAAM,YAAY,EAAE;AAC5D,cAAM,QAAQ,SAAS,IAAI,WAAW,GAAG,IAAI,YAAY;AAAA,MAC3D,OAAO;AACL,eAAO,KAAK,cAAc,WAAW,WAAM,YAAY,EAAE;AACzD,cAAM,QAAQ,SAAS,IAAI,WAAW,IAAI,YAAY;AAAA,MACxD;AAAA,IACF,OAAO;AAEL,aAAO,KAAK,yCAAoC,YAAY,EAAE;AAC9D,YAAM,QAAQ,gBAAgB,YAAY;AAAA,IAC5C;AAGA,QAAI,KAAK,iBAAiB;AACxB,WAAK,gBAAgB,YAAY;AAAA,QAC/B,MAAM;AAAA,QACN,UAAU,aAAa,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,QAC3C,aAAa,KAAK;AAAA,QAClB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AAAA,IACH;AAEA,WAAO,EAAE,QAAQ,WAAW,YAAY,KAAK,IAAI,IAAI,OAAO,gBAAgB,aAAa;AAAA,EAC3F;AAGA,MAAI,KAAK,OAAO,SAAS,UAAU;AACjC,WAAO,KAAK,qBAAqB,KAAK,WAAW,EAAE;AACnD,WAAO,EAAE,QAAQ,WAAW,YAAY,KAAK,IAAI,IAAI,MAAM;AAAA,EAC7D;AAGA,MAAI,KAAK,oBAAoB,KAAK,iBAAiB,SAAS,KAAK,CAAC,KAAK,OAAO,UAAU;AACtF,WAAO;AAAA,MACL,8CAA8C,KAAK,OAAO,IAAI;AAAA,IAChE;AACA,gBAAY,IAAI;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,MAAM,EAAE,oBAAoB,KAAK,OAAO,MAAM,gBAAgB,KAAK,iBAAiB,OAAO;AAAA,IAC7F,CAAC;AACD,WAAO,EAAE,QAAQ,WAAW,YAAY,KAAK,IAAI,IAAI,MAAM;AAAA,EAC7D;AAGA,MAAI,CAAC,KAAK,OAAO,UAAU;AACzB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB,OAAO;AAAA,MACP,aAAa;AAAA,QACX,YAAY;AAAA,UACV,MAAM,KAAK,OAAO;AAAA,UAClB,OAAO,KAAK,OAAO;AAAA,UACnB,KAAK,KAAK,OAAO;AAAA,QACnB;AAAA,QACA,SAAS,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,kBAAqC;AAAA,IACzC,YAAY;AAAA,IACZ,gBAAgB,CAAC,KAAM,GAAK;AAAA,IAC5B,uBAAuB;AAAA,IACvB,gBAAgB;AAAA,EAClB;AACA,QAAM,WAAW,OAAO,qBAAqB;AAC7C,QAAM,EAAE,WAAW,IAAI;AACvB,MAAI,WAAmC;AACvC,MAAI,eAAe;AACnB,MAAI;AACJ,MAAI,eAAe;AACnB,MAAI,qBAAqB;AACzB,MAAI,eAAe;AACnB,MAAI,WAAW;AACf,QAAM,iBAA2B,CAAC;AAClC,QAAM,eAAkC,CAAC;AACzC,MAAI,gBAAgB;AACpB,MAAI,6BAA6B;AACjC,MAAI;AACJ,MAAI;AAGJ,MAAI,KAAK,iBAAiB,KAAK,OAAO,UAAU;AAC9C,UAAM,WAAW,cAAc,KAAK,SAAS,KAAK,KAAK,KAAK,OAAO,QAAQ;AAC3E,UAAM,SAAS,YAAY,KAAK,eAAe,QAAQ;AACvD,QAAI,QAAQ;AACV,sBAAgB;AAChB,YAAM,iBAAiB,MAAM,QAAQ,iBAAiB;AACtD,YAAM,WAAW,eAAe;AAChC,qBAAe;AACf,iBAAW,eAAe;AAC1B,qBAAe;AACf,UAAI,sBAAsB,UAAU,OAAO,GAAG,MAAM,MAAM;AAExD,oBAAY,KAAK,eAAe,UAAU,OAAO,KAAK,kBAAkB,QAAQ,CAAC;AACjF,mBAAW,EAAE,KAAK,OAAO,KAAK,gBAAgB,eAAe,WAAW,YAAY;AACpF,oBAAY,IAAI;AAAA,UACd,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM,KAAK;AAAA,UACX,MAAM,EAAE,UAAU,KAAK,OAAO,KAAK,UAAU,OAAO,WAAW,EAAE;AAAA,QACnE,CAAC;AACD,eAAO,QAAQ,eAAe,OAAO,GAAG,EAAE;AAAA,MAC5C,OAAO;AAEL,6BAAqB,KAAK,eAAe,QAAQ;AACjD,oBAAY,IAAI;AAAA,UACd,OAAO;AAAA,UACP,OAAO;AAAA,UACP,MAAM,KAAK;AAAA,UACX,MAAM,EAAE,UAAU,KAAK,OAAO,IAAI;AAAA,QACpC,CAAC;AACD,eAAO,KAAK,iBAAiB,OAAO,GAAG,4CAA4C;AACnF,wBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,YAAY,KAAK,OAAO,UAAU;AAErC,QAAI,CAAC,cAAc;AACjB,YAAM,iBAAiB,MAAM,QAAQ,iBAAiB;AACtD,qBAAe,eAAe;AAC9B,iBAAW,eAAe;AAC1B,qBAAe;AAAA,IACjB;AAEA,UAAM,sBAAsB,qBAAqB,cAAc,KAAK,OAAO,UAAU,QAAQ;AAC7F,QAAI,oBAAoB,KAAK;AAC3B,iBAAW;AAAA,QACT,KAAK,oBAAoB;AAAA,QACzB,gBAAgB,mBAAmB,oBAAoB,SAAS,gBAAgB,oBAAoB,UAAU;AAAA,QAC9G,WAAW,wBAAwB,oBAAoB,SAAS;AAAA,MAClE;AACA,kBAAY,IAAI;AAAA,QACd,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM,KAAK;AAAA,QACX,MAAM;AAAA,UACJ,KAAK,oBAAoB;AAAA,UACzB,WAAW,oBAAoB;AAAA,UAC/B,YAAY,oBAAoB;AAAA,UAChC,UAAU,KAAK,OAAO;AAAA,QACxB;AAAA,MACF,CAAC;AACD,mCAA6B,SAAS,oBAAoB,GAAG,KAAK,oBAAoB,SAAS,gBAAgB,oBAAoB,UAAU;AAC7I,aAAO,QAAQ,2BAA2B,oBAAoB,GAAG,KAAK,oBAAoB,SAAS,gBAAgB,oBAAoB,UAAU,GAAG;AAAA,IACtJ,OAAO;AACL,mCAA6B;AAC7B,kBAAY,IAAI;AAAA,QACd,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM,KAAK;AAAA,QACX,MAAM,EAAE,UAAU,KAAK,OAAO,SAAS;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,WAAS,UAAU,GAAG,WAAW,cAAc,CAAC,UAAU,WAAW;AACnE,QAAI,UAAU,GAAG;AACf,aAAO,KAAK,iCAAiC,OAAO,IAAI,UAAU,MAAM;AAExE,UAAI,WAAW,SAAS,eAAe,QAAQ;AAE7C,cAAM,UAAU,SAAS,eAAe,UAAU,CAAC;AACnD,eAAO,KAAK,iBAAiB,UAAU,GAAI,0BAA0B;AACrE,cAAM,eAAe,MAAM,QAAQ,sBAAsB,cAAc,OAAO;AAE9E,YAAI,aAAa,SAAS;AACxB,iBAAO,QAAQ,0BAA0B;AACzC,yBAAe,aAAa;AAAA,QAC9B,OAAO;AAEL,sBAAY,IAAI;AAAA,YACd,OAAO;AAAA,YACP,OAAO;AAAA,YACP,MAAM,KAAK;AAAA,YACX,MAAM,EAAE,SAAS,UAAU,yBAAyB,WAAW,QAAQ;AAAA,UACzE,CAAC;AACD,iBAAO,KAAK,+CAA+C;AAC3D,gBAAMC,UAAS,WAAW,OAAO,YAAY,UAAU,GAAI;AAC3D,yBAAe,KAAKA,OAAM;AAC1B,uBAAa,KAAK;AAAA,YAChB;AAAA,YACA,iBAAiB;AAAA,YACjB,sBAAsB,sBAAsB,YAAY;AAAA,YACxD,eAAeA;AAAA,UACjB,CAAC;AACD,yBAAe;AACf,qBAAW,UAAU;AACrB;AAAA,QACF;AAAA,MACF,OAAO;AAEL,cAAM,MAAM,SAAS,qBAAqB;AAC1C,cAAM,QAAQ,oBAAoB,SAAS,cAAc;AACzD,uBAAe,MAAM,QAAQ,SAAS;AAAA,MACxC;AAAA,IACF,OAAO;AAEL,UAAI,CAAC,cAAc;AACjB,uBAAe,MAAM,QAAQ,SAAS;AAAA,MACxC;AAAA,IACF;AAEA,UAAM,kBAAkB,YAAY,KAAK,iBAAiB;AAE1D,gBAAY,IAAI;AAAA,MACd,OAAO;AAAA,MACP,OAAO,UAAU,IAAI,mBAAmB;AAAA,MACxC,MAAM,KAAK;AAAA,MACX,MAAM;AAAA,QACJ,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV;AAAA,QACA,GAAI,UAAU,IAAI,EAAE,gBAAgB,IAAI,CAAC;AAAA,MAC3C;AAAA,IACF,CAAC;AAED,UAAM,eAAe,mBAAmB,KAAK,OAAO,WAChD,gBAAgB,iBAAiB,KAAK,KAAK,KAAK,OAAO,QAAQ,IAC/D;AACJ,UAAM,eAAyC,UAAU,IACrD;AAAA,MACE;AAAA,MACA,oBAAoB,sBAAsB;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,IACF,IACA;AAEJ,UAAM,eAAe,gBACjB,cAAc,YAAY,YAAY,IACtC;AACJ,UAAM,kBAAkB,iBACpB,eAAe,eAAe,KAAK,aAAa,KAAK,GAAG,IACxD,OAAO;AACX,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA,KAAK,OAAO;AAAA,MACZ,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,MAAM,wBAAwB;AAAA,IACrC;AACA,eAAW,UAAU;AACrB,yBAAqB,SAAS;AAC9B,mBAAe,SAAS,UAAU;AAClC,mBAAe;AAEf,QAAI,SAAS,KAAK;AAChB,iBAAW;AACX;AAAA,IACF;AAEA,UAAM,SAAS,WAAW,UAAU,CAAC;AACrC,mBAAe,KAAK,MAAM;AAC1B,iBAAa,KAAK;AAAA,MAChB;AAAA,MACA;AAAA,MACA,sBAAsB,sBAAsB,YAAY;AAAA,MACxD,eAAe;AAAA,MACf,aAAa,SAAS,aAAa;AAAA,MACnC,UAAU,SAAS,QAAQ,MAAM,GAAG,GAAI;AAAA,MACxC,YAAY,SAAS,gBAAgB,MAAM,GAAG,GAAI;AAAA,MAClD,iBAAiB,aAAa,MAAM,GAAG,GAAI;AAAA,IAC7C,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,UAAU;AACb,gBAAY,IAAI;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,MAAM,EAAE,UAAU,cAAc;AAAA,IAClC,CAAC;AACD,WAAO,KAAK,mDAAmD;AAE/D,QAAI;AACF,YAAM,QAAQ,OAAO,QAAQ,GAAG;AAChC,YAAM,QAAQ,oBAAoB,GAAI;AACtC,YAAM,mBAAmB,MAAM,QAAQ,SAAS;AAEhD,UAAI,qBAAqB,cAAc;AACrC,cAAM,qBAAqB,gBACvB,cAAc,YAAY,gBAAgB,IAC1C;AACJ,cAAM,cAAc,iBAChB,eAAe,eAAe,KAAK,aAAa,KAAK,GAAG,IACxD,OAAO;AACX,cAAM,iBAAiB,MAAM;AAAA,UAC3B;AAAA,UACA,KAAK,OAAO;AAAA,UACZ,KAAK;AAAA,UACL,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,YACE,SAAS;AAAA,YACT,iBAAiB;AAAA,YACjB,gBAAgB,CAAC,GAAG,gBAAgB,yBAAyB;AAAA,YAC7D,cAAc,mBAAmB,KAAK,OAAO,WACzC,gBAAgB,iBAAiB,KAAK,KAAK,KAAK,OAAO,QAAQ,IAC/D;AAAA,UACN;AAAA,UACA,KAAK,MAAM,wBAAwB;AAAA,QACrC;AACA;AACA,6BAAqB,eAAe;AACpC,uBAAe,eAAe,UAAU;AACxC,uBAAe;AAEf,YAAI,eAAe,KAAK;AACtB,qBAAW;AACX,iBAAO,QAAQ,2BAA2B;AAE1C,cAAI,mBAAmB,KAAK,OAAO,UAAU;AAC3C,4BAAgB,OAAO,KAAK,KAAK,KAAK,OAAO,UAAU,qBAAqB,KAAK,SAAS,EAAE,QAAQ,SAAS,CAAC;AAAA,UAChH;AAAA,QACF,OAAO;AACL,uBAAa,KAAK;AAAA,YAChB,SAAS,WAAW;AAAA,YACpB,iBAAiB;AAAA,YACjB,sBAAsB,sBAAsB,gBAAgB;AAAA,YAC5D,eAAe;AAAA,YACf,aAAa,eAAe,aAAa;AAAA,YACzC,UAAU,eAAe,QAAQ,MAAM,GAAG,GAAI;AAAA,YAC9C,YAAY,eAAe,gBAAgB,MAAM,GAAG,GAAI;AAAA,YACxD,iBAAiB,iBAAiB,MAAM,GAAG,GAAI;AAAA,UACjD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,MAAI,CAAC,YAAY,OAAO,sBAAsB;AAC5C,WAAO,KAAK,kDAAkD;AAC9D,QAAI;AACF,YAAM,EAAE,aAAa,YAAY,IAAI,MAAM,QAAQ,0BAA0B;AAC7E,YAAM,eAAe,MAAM;AAAA,QACzB;AAAA,QACA;AAAA,QACA,KAAK,OAAO;AAAA,QACZ,KAAK;AAAA,QACL,KAAK;AAAA,QACL;AAAA,QACA;AAAA,MACF;AACA,UAAI,cAAc,KAAK;AACrB,mBAAW;AAAA,UACT,KAAK,aAAa;AAAA,UAClB,gBAAgB,uBAAuB,aAAa,UAAU;AAAA,UAC9D,WAAW,aAAa;AAAA,QAC1B;AACA,+BAAuB;AAAA,UACrB,iBAAiB,YAAY;AAAA,UAC7B,WAAW,aAAa;AAAA,UACxB,SAAS;AAAA,QACX;AACA,eAAO,QAAQ,+BAA+B,aAAa,GAAG,EAAE;AAEhE,YAAI,mBAAmB,KAAK,OAAO,UAAU;AAC3C,0BAAgB,OAAO,KAAK,KAAK,KAAK,OAAO,UAAU,qBAAqB,KAAK,SAAS,EAAE,QAAQ,SAAS,CAAC;AAAA,QAChH;AAAA,MACF,OAAO;AACL,+BAAuB;AAAA,UACrB,iBAAiB,YAAY;AAAA,UAC7B,WAAW,cAAc,aAAa;AAAA,UACtC,SAAS;AAAA,QACX;AACA,uBAAe,KAAK,sCAAsC;AAAA,MAC5D;AAAA,IACF,SAAS,OAAO;AACd,qBAAe,KAAK,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IACxG;AAAA,EACF;AAGA,MAAI,CAAC,YAAY,OAAO,qBAAqB;AAC3C,gBAAY,IAAI;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,MAAM,EAAE,eAAe;AAAA,IACzB,CAAC;AACD,WAAO,KAAK,8BAA8B;AAE1C,UAAM,kBAAkB,iBACpB,eAAe,eAAe,KAAK,aAAa,KAAK,GAAG,IACxD,OAAO;AACX,UAAM,iBAAiB,MAAM;AAAA,MAC3B;AAAA,MACA,EAAE,aAAa,KAAK,aAAa,QAAQ,KAAK,OAAO;AAAA,MACrD;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,gBAAY,IAAI;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,MAAM;AAAA,IACR,CAAC;AAED,0BAAsB;AAAA,MACpB,UAAU,eAAe;AAAA,MACzB,UAAU,eAAe;AAAA,MACzB,WAAW,eAAe;AAAA,MAC1B,SAAS,eAAe;AAAA,IAC1B;AAEA,QAAI,eAAe,WAAW,eAAe,gBAAgB;AAC3D,iBAAW;AAAA,QACT,KAAK,eAAe;AAAA,QACpB,gBAAgB,KAAK,UAAU,cAAc;AAAA,QAC7C,WAAW,eAAe;AAAA,MAC5B;AACA,aAAO,QAAQ,8BAA8B,eAAe,cAAc,KAAK,eAAe,mBAAmB,GAAG;AAElH,UAAI,mBAAmB,KAAK,OAAO,UAAU;AAC3C,wBAAgB,OAAO,KAAK,KAAK,KAAK,OAAO,UAAU,qBAAqB,KAAK,SAAS,EAAE,QAAQ,SAAS,eAAe,mBAAmB,GAAG,CAAC;AAAA,MACrJ;AAAA,IACJ,OAAO;AACL,aAAO,KAAK,mBAAmB,eAAe,mBAAmB,WAAM,eAAe,QAAQ,EAAE;AAAA,IAClG;AAAA,EACF;AAGA,QAAM,aAAa,WAAW,IAAI,WAAW,IAAI;AAEjD,MAAI,CAAC,UAAU;AACb,UAAM,eAAe,sBAAsB,YAAY;AACvD,UAAM,eAAe,KAAK,UAAU,KAAK,OAAO,QAAQ;AACxD,UAAM,YAAY,mBAAmB,MAAM,GAAG,GAAG;AAGjD,UAAM,kBAAkB,gBAAgB;AAAA,MACtC,OAAO,oCAAoC,QAAQ;AAAA,MACnD,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,IACF,CAAC;AAGD,QAAI,mBAAmB,KAAK,OAAO,UAAU;AAC3C,sBAAgB,OAAO,KAAK,KAAK,KAAK,OAAO,UAAU,iBAAiB,KAAK,OAAO;AAAA,IACtF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB,OAAO,oCAAoC,QAAQ,wBAAwB,YAAY,eAAe,YAAY,UAAU,SAAS;AAAA,MACrI;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,QACX,qBAAqB,aAAa,MAAM,GAAG,GAAI;AAAA,QAC/C;AAAA,QACA;AAAA,QACA,cAAc,gBAAgB,eAAe;AAAA,QAC7C,4BAA4B,8BAA8B;AAAA,QAC1D;AAAA,QACA;AAAA,QACA,mBAAmB;AAAA,QACnB,YAAY;AAAA,UACV,MAAM,KAAK,OAAO;AAAA,UAClB,UAAU,KAAK,OAAO;AAAA,UACtB,OAAO,KAAK,OAAO;AAAA,UACnB,KAAK,KAAK,OAAO;AAAA,QACnB;AAAA,QACA,SAAS,KAAK;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,cAAY,IAAI;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,KAAK;AAAA,IACX,MAAM,EAAE,UAAU,KAAK,OAAO,UAAU,aAAa,SAAS,KAAK,KAAK,KAAK,KAAK,SAAS;AAAA,EAC7F,CAAC;AAGD,MAAI,KAAK,iBAAiB,KAAK,OAAO,UAAU;AAC9C,UAAM,WAAW,cAAc,KAAK,SAAS,KAAK,KAAK,KAAK,OAAO,QAAQ;AAC3E,gBAAY,KAAK,eAAe,UAAU,SAAS,KAAK,kBAAkB,YAAY,CAAC;AAAA,EACzF;AAEA,SAAO,QAAQ,iBAAiB,SAAS,GAAG,GAAG,WAAW,IAAI,WAAW,QAAQ,eAAe,EAAE,EAAE;AACpG,QAAM,MAAM,IAAI,SAAS,GAAG;AAG5B,QAAM,QAAQ,aAAa,MAAM,KAAK,KAAK;AAE3C,QAAM,aAAa,KAAK,OAAO,aAC3B,KAAK,MAAM,gBAAgB,KAAK,OAAO,UAAU,IACjD;AAGJ,MAAI,CAAC,UAAU;AACb,UAAM,cAAc,MAAM,QAAQ,iBAAiB;AACnD,mBAAe,YAAY;AAC3B,eAAW,YAAY;AAAA,EACzB;AAEA,MAAI,aAAa,eAAe,cAAc,SAAS,KAAK,KAAK,OAAO,MAAM,OAAO,QAAQ;AAE7F,MAAI,WAAW,SAAS,SAAS,GAAG;AAClC,eAAW,KAAK,WAAW,UAAU;AACnC,aAAO,KAAK,uBAAuB,EAAE,OAAO,EAAE;AAAA,IAChD;AACA,gBAAY,IAAI;AAAA,MACd,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,MAAM,EAAE,UAAU,WAAW,SAAS;AAAA,IACxC,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,WAAW,OAAO;AACrB,UAAM,kBAAkB,WAAW,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,eAAe;AAGhF,QAAI,iBAAiB;AACnB,kBAAY,IAAI;AAAA,QACd,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM,KAAK;AAAA,QACX,MAAM,EAAE,QAAQ,WAAW,QAAQ,KAAK,SAAS,KAAK,YAAY,KAAK,OAAO,KAAK;AAAA,MACrF,CAAC;AACD,aAAO,KAAK,uEAAuE;AAGnF,YAAM,QAAQ,oBAAoB,GAAI;AACtC,YAAM,cAAc,MAAM,QAAQ,iBAAiB;AAEnD,UAAI,YAAY,KAAK,SAAS,GAAG,GAAG;AAClC,uBAAe,YAAY;AAC3B,mBAAW,YAAY;AACvB,qBAAa,eAAe,cAAc,SAAS,KAAK,KAAK,OAAO,MAAM,OAAO,QAAQ;AAEzF,YAAI,WAAW,SAAS,SAAS,GAAG;AAClC,qBAAW,KAAK,WAAW,UAAU;AACnC,mBAAO,KAAK,+BAA+B,EAAE,OAAO,EAAE;AAAA,UACxD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,WAAW,OAAO;AACrB,YAAM,gBAAgB,WAAW,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,IAAI;AACvE,kBAAY,IAAI;AAAA,QACd,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM,KAAK;AAAA,QACX,MAAM,EAAE,QAAQ,WAAW,QAAQ,KAAK,SAAS,KAAK,YAAY,KAAK,OAAO,KAAK;AAAA,MACrF,CAAC;AACD,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,YAAY,KAAK,IAAI,IAAI;AAAA,QACzB,OAAO,oCAAoC,aAAa;AAAA,QACxD;AAAA,QACA,cAAc,aAAa,SAAS,IAAI,eAAe;AAAA,QACvD,aAAa;AAAA,UACX,qBAAqB,aAAa,MAAM,GAAG,GAAI;AAAA,UAC/C;AAAA,UACA;AAAA,UACA,kBAAkB,WAAW,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE;AAAA,UACzE,oBAAoB,WAAW,SAAS,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE;AAAA,UAC7E,mBAAmB;AAAA,UACnB,YAAY;AAAA,YACV,MAAM,KAAK,OAAO;AAAA,YAClB,UAAU,KAAK,OAAO;AAAA,YACtB,OAAO,KAAK,OAAO;AAAA,YACnB,KAAK,KAAK,OAAO;AAAA,UACnB;AAAA,UACA,SAAS,KAAK;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,QAAQ,4BAA4B;AAAA,EAC7C;AAGA,QAAM,eAAe,QACjB,KAAK,MAAM,cAAc,KAAK,IAC9B;AAGJ,QAAM,YAAY,MAAM,QAAQ,IAAI;AACpC,QAAM,kBAAkB,MAAM,QAAQ,UAAU;AAEhD,UAAQ,KAAK,OAAO,MAAM;AAAA,IACxB,KAAK;AACH,aAAO,KAAK,UAAU,GAAG,EAAE;AAC3B,YAAM,QAAQ,MAAM,GAAG;AACvB;AAAA,IACF,KAAK;AACH,aAAO,KAAK,UAAU,GAAG,OAAO,gBAAgB,EAAE,GAAG;AACrD,YAAM,QAAQ,KAAK,KAAK,SAAS,EAAE;AACnC;AAAA,IACF,KAAK,UAAU;AACb,YAAM,oBAAoB,aAAa,KAAK,MAAM,cAAc,UAAU,IAAI;AAC9E,aAAO,KAAK,WAAW,GAAG,OAAO,qBAAqB,gBAAgB,EAAE,GAAG;AAC3E,YAAM,QAAQ,OAAO,KAAK,cAAc,SAAS,EAAE;AACnD;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO,KAAK,2BAA2B,GAAG,EAAE;AAC5C,YAAM,QAAQ,MAAM,GAAG;AACvB;AAAA,EACJ;AAGA,MAAI,KAAK,OAAO,SAAS,SAAS;AAChC,UAAM,QAAQ,0BAA0B,WAAW,eAAe;AAAA,EACpE;AAEA,QAAM,aAAa,KAAK,IAAI,IAAI;AAChC,cAAY,IAAI;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM,KAAK;AAAA,IACX,MAAM;AAAA,MACJ,MAAM,KAAK,OAAO;AAAA,MAClB;AAAA,MACA,OAAO;AAAA,MACP,QAAQ;AAAA,MACR;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,cAAc,aAAa,SAAS,IAAI,eAAe;AAAA,EACzD;AACF;AAGA,eAAe,wBACb,MACA,OACA,WAEA,aACA,QACe;AACf,MAAI,CAAC,KAAK,iBAAkB;AAE5B,aAAW,MAAM,KAAK,kBAAkB;AACtC,QAAI,GAAG,SAAS,UAAU;AACxB,UAAI,CAAC,GAAG,QAAQ;AACd,eAAO,KAAK,mCAAmC;AAC/C;AAAA,MACF;AACA,YAAM,WAAW,MAAM,IAAI,GAAG,MAAM;AACpC,UAAI,CAAC,UAAU;AACb,eAAO,KAAK,4BAA4B,GAAG,MAAM,sBAAsB;AACvE;AAAA,MACF;AAEA,6BAAuB,UAAU;AAAA,QAC/B;AAAA,QACA;AAAA,QACA,OAAO;AAAA,QACP,MAAM,KAAK;AAAA,QACX,YAAY,GAAG;AAAA,MACjB,CAAC;AAAA,IACH,WAAW,GAAG,SAAS,aAAa;AAClC,UAAI,CAAC,GAAG,SAAS,CAAC,GAAG,aAAa,CAAC,GAAG,gBAAgB;AACpD,eAAO,KAAK,qEAAqE;AACjF;AAAA,MACF;AACA,YAAM,SAAS,UAAU,UAAU;AAAA,QACjC,YAAY,GAAG;AAAA,QACf,OAAO,GAAG;AAAA,QACV,WAAW,GAAG;AAAA,MAChB,CAAC;AACD,YAAM,IAAI,GAAG,gBAAgB,MAAM;AACnC,aAAO,QAAQ,WAAW,GAAG,SAAS,IAAI,GAAG,UAAU,IAAI,GAAG,KAAK,QAAQ,MAAM,cAAS,GAAG,cAAc,IAAI;AAC/G,kBAAY,IAAI;AAAA,QACd,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM,KAAK;AAAA,QACX,MAAM,EAAE,YAAY,GAAG,YAAY,OAAO,GAAG,OAAO,WAAW,GAAG,WAAW,QAAQ,gBAAgB,GAAG,eAAe;AAAA,MACzH,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAGA,SAAS,aAAa,MAAkB,OAAyC;AAC/E,QAAM,WAAW,KAAK,OAAO;AAC7B,MAAI,aAAa,OAAW,QAAO;AACnC,SAAO,MAAM,gBAAgB,QAAQ;AACvC;AAGA,SAAS,sBAAsB,UAA0B;AACvD,SAAO,cAAc,QAAQ;AAC/B;;;Acj0DA,SAAS,aAAa,OAAqD;AACzE,QAAM,SAAgC,CAAC;AACvC,aAAW,QAAQ,OAAO;AACxB,WAAO,KAAK,IAAI;AAChB,QAAI,KAAK,gBAAgB;AACvB,iBAAW,aAAa,KAAK,gBAAgB;AAC3C,eAAO,KAAK,GAAG,aAAa,SAAS,CAAC;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,MAA2B,QAAsB;AACxE,QAAM,WAAW,eAAe,KAAK,UAAU;AAG/C,MAAI,KAAK,kBAAkB;AACzB,QAAI,KAAK,GAAG,MAAM,IAAI,KAAK,OAAO,IAAI,KAAK,WAAW,KAAK,EAAE,yBAAyB,CAAC,GAAG;AAC1F;AAAA,EACF;AAGA,MAAI,KAAK,gBAAgB,QAAW;AAClC,UAAM,aAAa,KAAK,eAAe,EAAE,gBAAgB,EAAE,YAAY;AACvE,UAAMC,OAAM,GAAG,MAAM,IAAI,KAAK,OAAO,IAAI,KAAK,WAAW,aAAa,UAAU,KAAK,QAAQ;AAC7F,QAAI,KAAK,WAAW,WAAW;AAC7B,UAAI,QAAQA,IAAG;AAAA,IACjB,WAAW,KAAK,WAAW,WAAW;AACpC,UAAI,KAAKA,IAAG;AAAA,IACd,OAAO;AACL,UAAI,MAAMA,IAAG;AAAA,IACf;AACA,QAAI,KAAK,gBAAgB;AACvB,iBAAW,cAAc,KAAK,gBAAgB;AAC5C,mBAAW,aAAa,YAAY;AAClC,0BAAgB,WAAW,GAAG,MAAM,IAAI;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAGA,MAAI,KAAK,mBAAmB,QAAW;AACrC,UAAM,YAAY,KAAK,qBAAqB,SACxC,YAAY,KAAK,gBAAgB,IAAI,EAAE,cAAc,CAAC,KACtD,GAAG,KAAK,cAAc,IAAI,EAAE,mBAAmB,CAAC;AACpD,UAAMA,OAAM,GAAG,MAAM,IAAI,KAAK,OAAO,IAAI,KAAK,WAAW,KAAK,SAAS,KAAK,QAAQ;AACpF,QAAI,KAAK,WAAW,WAAW;AAC7B,UAAI,QAAQA,IAAG;AAAA,IACjB,OAAO;AACL,UAAI,MAAMA,IAAG;AAAA,IACf;AAEA,QAAI,KAAK,gBAAgB;AACvB,eAAS,IAAI,GAAG,IAAI,KAAK,eAAe,QAAQ,KAAK;AACnD,YAAI,KAAK,GAAG,MAAM,KAAK,EAAE,kBAAkB,CAAC,IAAI,CAAC,GAAG;AACpD,mBAAW,aAAa,KAAK,eAAe,CAAC,GAAG;AAC9C,0BAAgB,WAAW,GAAG,MAAM,MAAM;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AACA;AAAA,EACF;AAGA,QAAM,MAAM,GAAG,MAAM,IAAI,KAAK,OAAO,IAAI,KAAK,WAAW,KAAK,QAAQ;AACtE,MAAI,KAAK,WAAW,WAAW;AAC7B,QAAI,QAAQ,GAAG;AACf,QAAI,KAAK,gBAAgB;AACvB,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,cAAc,GAAG;AAC/D,YAAI,KAAK,GAAG,MAAM,eAAe,IAAI,OAAO,KAAK,GAAG;AAAA,MACtD;AAAA,IACF;AACA,QAAI,KAAK,eAAe;AACtB,YAAM,UAAU,KAAK,cAAc,SAAS,KACxC,GAAG,KAAK,cAAc,MAAM,GAAG,EAAE,CAAC,QAClC,KAAK;AACT,UAAI,KAAK,GAAG,MAAM,gBAAgB,OAAO,EAAE;AAAA,IAC7C;AACA,QAAI,KAAK,gBAAgB;AACvB,UAAI,KAAK,GAAG,MAAM,iBAAiB,KAAK,cAAc,EAAE;AAAA,IAC1D;AACA,QAAI,KAAK,cAAc;AACrB,UAAI,KAAK,GAAG,MAAM,eAAe,KAAK,YAAY,EAAE;AAAA,IACtD;AAAA,EACF,WAAW,KAAK,WAAW,UAAU;AACnC,QAAI,MAAM,GAAG,GAAG,WAAW,KAAK,KAAK,EAAE;AAAA,EACzC,OAAO;AACL,QAAI,KAAK,GAAG,GAAG,KAAK,EAAE,gBAAgB,EAAE,YAAY,CAAC,GAAG;AAAA,EAC1D;AACF;AAEO,SAAS,YAAY,QAA+B;AAEzD,QAAM,eAAe;AAAA,IACnB,GAAG,wBAAwB,EAAE,OAAO,OAAO,iBAAiB,CAAC;AAAA,IAC7D,GAAG,qBAAqB,EAAE,KAAK,OAAO,SAAS,CAAC;AAAA,IAChD,GAAG,uBAAuB,EAAE,OAAO,OAAO,WAAW,CAAC;AAAA,IACtD,GAAG,sBAAsB,EAAE,UAAU,OAAO,UAAU,WAAW,OAAO,WAAW,QAAQ,OAAO,QAAQ,SAAS,OAAO,QAAQ,CAAC;AAAA,IACnI,GAAI,OAAO,UAAU,CAAC,EAAE,wBAAwB,CAAC,IAAI,CAAC;AAAA,IACtD,GAAG,0BAA0B,EAAE,UAAU,eAAe,OAAO,eAAe,EAAE,CAAC;AAAA,EACnF;AAGA,MAAI,OAAO,qBAAqB,OAAO,KAAK,OAAO,iBAAiB,EAAE,SAAS,GAAG;AAChF,UAAM,aAAa,OAAO,QAAQ,OAAO,iBAAiB,EACvD,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,cAAc,CAAC,GAAG,EAC9D,KAAK,IAAI;AACZ,iBAAa,KAAK,GAAG,mBAAmB,EAAE,MAAM,WAAW,CAAC,CAAC;AAAA,EAC/D;AAGA,MAAI,OAAO,mBAAmB,OAAO,gBAAgB,SAAS,GAAG;AAC/D,iBAAa,KAAK,GAAG,sBAAsB,EAAE,OAAO,OAAO,gBAAgB,OAAO,CAAC,CAAC;AAAA,EACtF;AAGA,MAAI,OAAO,aAAa,OAAO,UAAU,aAAa,GAAG;AACvD,UAAM,IAAI,OAAO;AACjB,UAAM,iBAAiB,sBAAsB,CAAC;AAC9C,UAAM,aAAa,iBAAiB,CAAC,IAAI,KAAK,QAAQ,CAAC;AACvD,UAAM,iBAAiB,OAAO,QAAQ,EAAE,SAAS,EAC9C,IAAI,CAAC,CAACC,IAAG,CAAC,MAAM,GAAGA,EAAC,IAAI,EAAE,KAAK,GAAG,EAClC,KAAK,GAAG;AACX,iBAAa;AAAA,MACX,OAAO,EAAE,UAAU,WAChB,eAAe,eAAe,CAAC,SAAS,EAAE,kBAAkB,eAAe,CAAC,eACtE,SAAS,OACd,EAAE,iBAAiB,QAAQ,CAAC,CAAC,MAC7B,EAAE,kBAAkB,KAAM,QAAQ,CAAC,CAAC,YAAO,cAAc;AAAA,IAC/D;AACA,QAAI,EAAE,WAAW,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,GAAG;AAClD,YAAM,eAAe,OAAO,QAAQ,EAAE,OAAO,EAC1C,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,KAAK,EAAE,iBAAiB,QAAQ,CAAC,CAAC,GAAG,EAC3D,KAAK,GAAG;AACX,mBAAa,KAAK,WAAW,YAAY,EAAE;AAAA,IAC7C;AAAA,EACF;AAEA,OAAK,aAAa,KAAK,IAAI,GAAG,EAAE,0BAA0B,CAAC;AAG3D,QAAM,eAAe,aAAa,OAAO,KAAK;AAC9C,QAAM,kBAAkB,aAAa;AAAA,IACnC,CAAC,MAAM,EAAE,eAAe,aAAa,EAAE,WAAW;AAAA,EACpD;AACA,QAAM,eAAe,aAAa;AAAA,IAChC,CAAC,MAAM,EAAE,eAAe,aAAa,EAAE,WAAW,cAAc,CAAC,EAAE,iBAAiB,EAAE,kBAAkB;AAAA,EAC1G;AACA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,QAAI,MAAM,qBAAqB,gBAAgB,MAAM,0BAAqB,gBAAgB,IAAI,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,EACpI;AACA,MAAI,aAAa,SAAS,GAAG;AAC3B,QAAI,KAAK,qBAAqB,aAAa,MAAM,iCAAiC;AAAA,EACpF;AAGA,aAAW,QAAQ,OAAO,OAAO;AAC/B,oBAAgB,MAAM,EAAE;AAAA,EAC1B;AACF;AAEO,SAAS,iBAAiB,QAAoC;AACnE,QAAM,eAAe;AAAA,IACnB,GAAG,wBAAwB,EAAE,OAAO,OAAO,iBAAiB,CAAC;AAAA,IAC7D,GAAG,2BAA2B,EAAE,OAAO,OAAO,UAAU,CAAC;AAAA,IACzD,GAAG,uBAAuB,EAAE,WAAW,OAAO,WAAW,QAAQ,OAAO,OAAO,CAAC;AAAA,IAChF,GAAG,0BAA0B,EAAE,UAAU,eAAe,OAAO,eAAe,EAAE,CAAC;AAAA,EACnF;AACA,OAAK,aAAa,KAAK,IAAI,GAAG,EAAE,sBAAsB,CAAC;AAGvD,aAAW,OAAO,OAAO,MAAM;AAC7B,UAAM,IAAI,IAAI;AACd,UAAM,SAAS,EAAE,WAAW,KAAK,CAAC,EAAE,UAAU,OAAO;AACrD,UAAM,WAAW,eAAe,EAAE,eAAe;AACjD,UAAM,MAAM,GAAG,IAAI,QAAQ,KAAK,MAAM,KAAK,EAAE,SAAS,IAAI,EAAE,UAAU,WAAW,QAAQ;AAEzF,QAAI,WAAW,MAAM;AACnB,UAAI,QAAQ,GAAG;AAAA,IACjB,OAAO;AACL,UAAI,MAAM,GAAG;AAEb,iBAAW,QAAQ,EAAE,OAAO;AAC1B,YAAI,KAAK,WAAW,UAAU;AAC5B,cAAI,MAAM,MAAM,KAAK,OAAO,IAAI,KAAK,WAAW,KAAK,KAAK,KAAK,EAAE;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACvMA,SAAS,KAAAC,UAAS;AAIlB,IAAM,sBAAsBC,GAAE,OAAO;AAAA,EACnC,QAAQA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,EAAE,SAAS,oEAAa;AACjE,CAAC;AASD,IAAM,mCAAmC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAMX,eAAsB,yBACpB,QACA,iBACiC;AACjC,QAAM,oBAAoB,OACvB,IAAI,CAAC,MAAM,YAAY,EAAE,IAAI,oBAAoB,EAAE,WAAW,GAAG,EACjE,KAAK,IAAI;AAEZ,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM;AAAA,MACvB,MACE,sBAAsB,cAAc;AAAA,QAClC,OAAO,SAAS,YAAY;AAAA,QAC5B,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,YACT,iBAAiB;AAAA,cACf,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,EAAE;AAAA,YACnD;AAAA,UACF;AAAA,UACA,EAAE,MAAM,QAAQ,SAAS,WAAW;AAAA,QACtC;AAAA,QACA,QAAQ;AAAA,QACR,aAAa;AAAA,MACf,CAAC;AAAA,MACH,EAAE,OAAO,gBAAgB;AAAA,IAC3B;AAEA,WAAO,OAAO;AAAA,EAChB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;AC9DA,IAAM,cAAc;AACpB,IAAM,oBAAoB;AAMnB,SAAS,gBACd,UACA,QACQ;AACR,MAAI,SAAS;AACb,WAAS,QAAQ,GAAG,QAAQ,mBAAmB,SAAS;AACtD,UAAM,OAAO,OAAO,QAAQ,aAAa,CAAC,OAAO,SAAiB;AAChE,YAAM,IAAI,OAAO,IAAI,IAAI;AACzB,aAAO,MAAM,SAAY,IAAI;AAAA,IAC/B,CAAC;AACD,QAAI,SAAS,OAAQ;AACrB,aAAS;AAAA,EACX;AACA,SAAO;AACT;;;AC+BA,eAAsB,qBACpB,aACA,OAC4B;AAC5B,QAAM,YAAY,YAAY,aAAa,CAAC;AAC5C,QAAM,SAAS,oBAAI,IAAoB;AACvC,QAAM,gBAAgB,oBAAI,IAAY;AACtC,QAAM,qBAA+B,CAAC;AAGtC,QAAM,cAAwB,CAAC;AAC/B,WAAS,mBAAmB,OAAuC;AACjE,eAAW,QAAQ,OAAO;AACxB,UAAI,KAAK,UAAU;AACjB,mBAAW,KAAK,KAAK,UAAU;AAC7B,sBAAY,KAAK,EAAE,IAAI;AAAA,QACzB;AAAA,MACF;AACA,UAAI,KAAK,OAAO;AACd,2BAAmB,KAAK,KAAK;AAAA,MAC/B;AACA,UAAI,KAAK,UAAU;AACjB,mBAAW,cAAc,KAAK,SAAS,OAAO;AAC5C,6BAAmB,WAAW,KAAK;AAAA,QACrC;AACA,YAAI,KAAK,SAAS,SAAS;AACzB,6BAAmB,KAAK,SAAS,QAAQ,KAAK;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,qBAAmB,YAAY,KAAK;AAGpC,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,GAAG;AACnD,QAAI,IAAI,WAAW;AACjB,oBAAc,IAAI,IAAI;AAAA,IACxB;AAAA,EACF;AAGA,QAAM,cAAc,oBAAI,IAAY;AACpC,MAAI,MAAM,SAAS;AACjB,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAM,QAAQ,MAAM,GAAG;AAC7D,aAAO,IAAI,KAAK,GAAG;AACnB,oBAAc,IAAI,GAAG;AACrB,kBAAY,IAAI,GAAG;AAAA,IACrB;AAAA,EACF;AAGA,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,GAAG;AACnD,QAAI,IAAI,WAAW,UAAU,CAAC,OAAO,IAAI,IAAI,GAAG;AAC9C,yBAAmB,KAAK,IAAI;AAAA,IAC9B;AAAA,EACF;AAGA,QAAM,iBAAiB,OAAO,QAAQ,SAAS,EAAE;AAAA,IAC/C,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,IAAI,IAAI,KAAK,CAAC,mBAAmB,SAAS,IAAI;AAAA,EACpE;AACA,QAAM,uBAAuB,oBAAI,IAAY;AAC7C,MAAI,eAAe,SAAS,KAAK,MAAM,iBAAiB;AACtD,UAAM,YAAY,MAAM;AAAA,MACtB,eAAe,IAAI,CAAC,CAAC,MAAM,GAAG,OAAO;AAAA,QACnC;AAAA,QACA,aAAa,IAAI,eAAe;AAAA,QAChC,UAAU,IAAI,aAAa;AAAA,MAC7B,EAAE;AAAA,MACF,MAAM;AAAA,IACR;AACA,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,GAAG;AACnD,UAAI,CAAC,OAAO,IAAI,IAAI,KAAK,KAAK;AAC5B,eAAO,IAAI,MAAM,GAAG;AACpB,6BAAqB,IAAI,IAAI;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAGA,MAAI,CAAC,MAAM,SAAS;AAClB,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,GAAG;AACnD,UAAI,IAAI,WAAW,SAAS,CAAC,OAAO,IAAI,IAAI,KAAK,IAAI,QAAQ;AAC3D,cAAM,SAAS,QAAQ,IAAI,IAAI,MAAM;AACrC,YAAI,WAAW,QAAW;AACxB,iBAAO,IAAI,MAAM,MAAM;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,GAAG;AACnD,QAAI,IAAI,WAAW,gBAAgB,CAAC,OAAO,IAAI,IAAI,KAAK,IAAI,YAAY;AACtE,YAAM,WAAW,gBAAgB,IAAI,YAAY,MAAM;AAEvD,UAAI,CAAC,iBAAiB,KAAK,QAAQ,GAAG;AACpC,eAAO,IAAI,MAAM,QAAQ;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAGA,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,GAAG;AACnD,QAAI,IAAI,WAAW,WAAW,CAAC,OAAO,IAAI,IAAI,KAAK,IAAI,UAAU,QAAW;AAC1E,aAAO,IAAI,MAAM,IAAI,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAKA,eAAsB,cACpB,aACA,QACwB;AAExB,QAAM,IAAI,QAAQ;AAClB,QAAM,YAAY,YAAY,aAAa,CAAC;AAG5C,QAAM,iBACJ,OAAO,QAAQ,SAAS,EAAE;AAAA,IACxB,CAAC,CAAC,IAAI,MACJ,CAAC,OAAO,SAAS,KAAK,IAAI,IAAI,KAC9B,UAAU,IAAI,GAAG,WAAW;AAAA,EAChC,KAAK,OAAO;AAEd,MAAI,gBAAgB;AAClB,MAAE,MAAM,EAAE,+BAA+B,CAAC;AAAA,EAC5C;AAEA,QAAM,aAAa,MAAM,qBAAqB,aAAa;AAAA,IACzD,SAAS,OAAO;AAAA,IAChB,iBAAiB,OAAO;AAAA,IACxB,SAAS;AAAA,EACX,CAAC;AAED,MAAI,gBAAgB;AAClB,MAAE,KAAK,GAAG,gCAAgC,EAAE,OAAO,WAAW,qBAAqB,KAAK,CAAC,CAAC;AAAA,EAC5F;AAGA,QAAM,kBAAkB,IAAI,IAAI,WAAW,WAAW;AACtD,QAAM,kBAAkB,OAAO,QAAQ,SAAS,EAAE;AAAA,IAChD,CAAC,CAAC,MAAM,GAAG,MACT,CAAC,WAAW,OAAO,IAAI,IAAI,KAC3B,CAAC,WAAW,mBAAmB,SAAS,IAAI,KAC5C,CAAC,gBAAgB,IAAI,IAAI,KACzB,IAAI,aAAa;AAAA,EACrB;AACA,MAAI,gBAAgB,SAAS,GAAG;AAC9B,QAAI,KAAK,GAAG,8BAA8B,EAAE,OAAO,gBAAgB,OAAO,CAAC,CAAC;AAC5E,eAAW,CAAC,MAAM,GAAG,KAAK,iBAAiB;AACzC,YAAM,SAAS,MAAM,WAAW,IAAI,eAAe,MAAM;AAAA,QACvD,aAAa,EAAE,qBAAqB;AAAA,QACpC,UAAU,CAAC,MAAO,CAAC,GAAG,KAAK,IAAI,GAAG,4BAA4B,EAAE,KAAK,CAAC,IAAI;AAAA,MAC5E,CAAC;AACD,iBAAW,OAAO,IAAI,MAAM,OAAO,KAAK,CAAC;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,mBAAmB;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,eAAe,WAAW;AAAA,IAC5B;AAAA,IACA,oBAAoB,WAAW;AAAA,IAC/B,aAAa,WAAW;AAAA,IACxB,cAAc,OAAO;AAAA,IACrB,sBAAsB,WAAW;AAAA,IACjC,aAAa,WAAW;AAAA,EAC1B;AACF;AAKO,SAAS,YACd,MACA,aACA,cACM;AACN,QAAM,QAAkB,CAAC;AAGzB,QAAM,KAAK,EAAE,sBAAsB,CAAC;AACpC,MAAI,KAAK,kBAAkB,OAAO,SAAS,KAAK,KAAK,mBAAmB,WAAW,GAAG;AACpF,UAAM,KAAK,OAAO,EAAE,aAAa,CAAC;AAAA,EACpC,OAAO;AACL,eAAW,CAAC,MAAM,KAAK,KAAK,KAAK,kBAAkB,QAAQ;AACzD,YAAM,UAAU,KAAK,kBAAkB,cAAc,IAAI,IAAI,IACzD,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC,UACrB,IAAI,KAAK;AACb,UAAI,SAAS;AACb,UAAI,KAAK,YAAY,IAAI,IAAI,GAAG;AAC9B,iBAAS,EAAE,qBAAqB;AAAA,MAClC,WAAW,KAAK,qBAAqB,IAAI,IAAI,GAAG;AAC9C,iBAAS,EAAE,qBAAqB;AAAA,MAClC;AACA,YAAM,KAAK,KAAK,IAAI,WAAM,OAAO,GAAG,MAAM,EAAE;AAAA,IAC9C;AACA,eAAW,QAAQ,KAAK,oBAAoB;AAC1C,YAAM,KAAK,KAAK,IAAI,WAAM,EAAE,wBAAwB,CAAC,EAAE;AAAA,IACzD;AAAA,EACF;AAGA,MAAI,KAAK,YAAY,SAAS,GAAG;AAG/B,QAASC,mBAAT,SACE,OACA,QACM;AACN,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,UAAU;AACjB,qBAAW,KAAK,KAAK,UAAU;AAC7B,kBAAM,KAAK,KAAK,EAAE,IAAI,WAAM,MAAM,QAAQ,KAAK,OAAO,KAAK,EAAE,QAAQ,GAAG;AAAA,UAC1E;AAAA,QACF;AACA,YAAI,KAAK,OAAO;AACd,UAAAA,iBAAgB,KAAK,OAAO,GAAG,MAAM,QAAQ,KAAK,OAAO,KAAK;AAAA,QAChE;AACA,YAAI,KAAK,UAAU;AACjB,qBAAW,cAAc,KAAK,SAAS,OAAO;AAC5C,YAAAA,iBAAgB,WAAW,OAAO,GAAG,MAAM,UAAU,KAAK,OAAO,IAAI,WAAW,KAAK,KAAK;AAAA,UAC5F;AACA,cAAI,KAAK,SAAS,SAAS;AACzB,YAAAA,iBAAgB,KAAK,SAAS,QAAQ,OAAO,GAAG,MAAM,UAAU,KAAK,OAAO,aAAa;AAAA,UAC3F;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAtBS,0BAAAA;AAFT,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,EAAE,yBAAyB,CAAC;AAwBvC,IAAAA,iBAAgB,YAAY,OAAO,EAAE;AAAA,EACvC;AAGA,QAAM,iBAAiB,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,SAAS;AAClE,QAAM,YAAY,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK;AACnE,QAAM,cAAc,YAAY,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ;AAC9D,MAAI,eAAe,SAAS,KAAK,UAAU,SAAS,KAAK,YAAY,SAAS,GAAG;AAC/E,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,EAAE,qBAAqB,CAAC;AACnC,eAAW,QAAQ,gBAAgB;AACjC,YAAM,KAAK,GAAG,0BAA0B,EAAE,SAAS,KAAK,SAAS,WAAW,KAAK,aAAa,GAAG,CAAC,CAAC;AAAA,IACrG;AACA,eAAW,QAAQ,WAAW;AAC5B,UAAI,KAAK,KAAM,SAAS;AACtB,cAAM,UAAU,KAAK,KAAM,iBAAiB;AAC5C,cAAM;AAAA,UACJ,GAAG,wBAAwB,EAAE,SAAS,KAAK,SAAS,KAAK,SAAS,UAAU,KAAK,MAAO,QAAQ,SAAS,KAAK,KAAM,QAAQ,CAAC;AAAA,QAC/H;AAAA,MACF,OAAO;AACL,cAAM,UAAU,KAAK,KAAM,iBAAiB;AAC5C,cAAM;AAAA,UACJ,GAAG,qBAAqB,EAAE,SAAS,KAAK,SAAS,KAAK,SAAS,UAAU,KAAK,MAAO,QAAQ,WAAW,KAAK,KAAM,aAAa,GAAG,CAAC;AAAA,QACtI;AAAA,MACF;AAAA,IACF;AACA,eAAW,QAAQ,aAAa;AAC9B,YAAM,aAAa,KAAK,SAAU,MAAM,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI;AACrE,YAAM;AAAA,QACJ,GAAG,uBAAuB,EAAE,SAAS,KAAK,SAAS,OAAO,KAAK,SAAU,OAAO,OAAO,WAAW,CAAC;AAAA,MACrG;AAAA,IACF;AAAA,EACF;AAGA,MAAI,KAAK,gBAAgB,iBAAiB,QAAW;AACnD,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,GAAG,qBAAqB,EAAE,OAAO,cAAc,MAAM,KAAK,aAAa,CAAC,CAAC;AAAA,EACtF;AAEA,QAAM,KAAK,GAAG,qBAAqB,EAAE,OAAO,YAAY,MAAM,OAAO,CAAC,CAAC;AAEvE,OAAK,MAAM,KAAK,IAAI,GAAG,EAAE,uBAAuB,CAAC;AACnD;AAKA,eAAsB,cAAgC;AACpD,SAAO,cAAc,EAAE,sBAAsB,GAAG,IAAI;AACtD;;;ACjUA,IAAM,uBAAuB;AAEtB,IAAM,eAAN,MAAmB;AAAA,EAAnB;AACL,SAAQ,QAAQ,oBAAI,IAAoB;AACxC,SAAQ,gBAAgB,oBAAI,IAAY;AACxC,SAAQ,KAAyB;AAAA,MAC/B,cAAc;AAAA,MACd,iBAAiB,CAAC;AAAA,MAClB,qBAAqB,CAAC;AAAA,MACtB,oBAAoB;AAAA,MACpB,eAAe;AAAA,MACf,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,gBAAgB;AAAA,MAChB,eAAe;AAAA,IACjB;AAAA;AAAA;AAAA,EAGA,KAAK,QAA6B,WAA8B;AAC9D,eAAW,CAAC,GAAG,CAAC,KAAK,QAAQ;AAC3B,WAAK,MAAM,IAAI,GAAG,CAAC;AAAA,IACrB;AACA,eAAW,KAAK,WAAW;AACzB,WAAK,cAAc,IAAI,CAAC;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,IAAI,MAAkC;AACpC,WAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EAC5B;AAAA,EAEA,IAAI,MAAc,OAAqB;AACrC,SAAK,MAAM,IAAI,MAAM,KAAK;AAAA,EAC5B;AAAA,EAEA,IAAI,MAAuB;AACzB,WAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EAC5B;AAAA,EAEA,YAAY,MAAuB;AACjC,WAAO,KAAK,cAAc,IAAI,IAAI;AAAA,EACpC;AAAA;AAAA,EAGA,mBAA6B;AAC3B,WAAO,MAAM,KAAK,KAAK,aAAa;AAAA,EACtC;AAAA;AAAA,EAGA,gBAAgB,UAA0B;AACxC,WAAO,gBAAgB,UAAU,KAAK,KAAK;AAAA,EAC7C;AAAA;AAAA,EAGA,cAAc,OAAuB;AACnC,QAAI,SAAS;AACb,eAAW,OAAO,KAAK,eAAe;AACpC,YAAM,MAAM,KAAK,MAAM,IAAI,GAAG;AAC9B,UAAI,OAAO,OAAO,SAAS,GAAG,GAAG;AAC/B,iBAAS,OAAO,WAAW,KAAK,MAAM;AAAA,MACxC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,UAA8B;AAC5B,WAAO,MAAM,KAAK,KAAK,MAAM,QAAQ,CAAC;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAe,SAAiB,MAAe,UAAmB,OAAsB;AACtF,QAAI,aAAa,UAAa,UAAU,QAAW;AACjD,WAAK,MAAM,IAAI,UAAU,OAAO,KAAK,CAAC;AAAA,IACxC;AACA,QAAI,SAAS,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AACrE,WAAK,MAAM,IAAI,SAAS,KAAK,UAAU,IAAI,CAAC;AAC5C,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAA+B,GAAG;AAC1E,aAAK,MAAM,IAAI,GAAG,OAAO,IAAI,GAAG,IAAI,OAAO,SAAS,EAAE,CAAC;AAAA,MACzD;AAAA,IACF,OAAO;AACL,WAAK,MAAM,IAAI,SAAS,OAAO,QAAQ,EAAE,CAAC;AAAA,IAC5C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,SAAiB,UAAyB;AACzD,SAAK,MAAM,OAAO,OAAO;AACzB,QAAI,UAAU;AACZ,WAAK,MAAM,OAAO,QAAQ;AAAA,IAC5B;AAEA,UAAM,SAAS,GAAG,OAAO;AACzB,eAAW,OAAO,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC,GAAG;AAC/C,UAAI,IAAI,WAAW,MAAM,GAAG;AAC1B,aAAK,MAAM,OAAO,GAAG;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,oBACE,aACA,gBACA,SACA,KACA,YACA,iBACM;AACN,SAAK,GAAG,aAAa;AAGrB,QAAI,SAAS;AACX,WAAK,GAAG;AACR,WAAK,GAAG,eAAe;AAAA,IACzB,OAAO;AACL,WAAK,GAAG,gBAAgB;AACxB,WAAK,GAAG;AAAA,IACV;AAGA,UAAM,UAAU,QAAQ,WAAW,KAAK,eAAe,WAAM,UAAU,OAAO,MAAM;AACpF,SAAK,GAAG,oBAAoB,KAAK,OAAO;AACxC,QAAI,KAAK,GAAG,oBAAoB,SAAS,sBAAsB;AAC7D,WAAK,GAAG,oBAAoB,MAAM;AAAA,IACpC;AAGA,SAAK,GAAG,qBAAqB;AAG7B,SAAK,sBAAsB,aAAa,KAAK,UAAU;AAEvD,SAAK,GAAG,UAAU;AAClB,SAAK,GAAG,iBAAiB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,0BAA8C;AAC5C,QAAI,KAAK,GAAG,oBAAoB,WAAW,EAAG,QAAO;AAErD,UAAM,QAAkB,CAAC;AAGzB,QAAI,KAAK,GAAG,gBAAgB,SAAS,GAAG;AACtC,YAAM,eAAe,KAAK,GAAG,gBAC1B,IAAI,CAACC,OAAM,GAAGA,GAAE,IAAI,UAAUA,GAAE,SAAS,IAAIA,GAAE,WAAW,GAAG,GAAG,EAChE,KAAK,UAAK;AACb,YAAM,KAAK,WAAW,YAAY,WAAM,KAAK,GAAG,YAAY,WAAW;AAAA,IACzE,OAAO;AACL,YAAM,KAAK,UAAU,KAAK,GAAG,YAAY,EAAE;AAAA,IAC7C;AAGA,UAAM,SAAS,KAAK,GAAG,oBAAoB,MAAM,EAAE,EAAE,KAAK,IAAI;AAC9D,UAAM,KAAK,WAAW,MAAM,EAAE;AAG9B,UAAM,cAAwB,CAAC;AAC/B,QAAI,KAAK,GAAG,gBAAgB,GAAG;AAC7B,kBAAY,KAAK,GAAG,KAAK,GAAG,aAAa,wBAAwB;AAAA,IACnE;AACA,QAAI,KAAK,GAAG,eAAe,GAAG;AAC5B,kBAAY,KAAK,GAAG,KAAK,GAAG,YAAY,uBAAuB;AAAA,IACjE;AACA,QAAI,YAAY,SAAS,GAAG;AAC1B,YAAM,KAAK,WAAW,YAAY,KAAK,IAAI,CAAC,EAAE;AAAA,IAChD;AAGA,UAAM,KAAK,QAAQ,KAAK,GAAG,kBAAkB,EAAE;AAE/C,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,sBACN,aACA,KACA,YACM;AACN,UAAM,UAAU,eAAe,GAAG;AAClC,UAAM,cAAc,eAAe,KAAK,GAAG,OAAO;AAGlD,UAAM,cAAc,YAAY,eAAe,KAAK,GAAG,YAAY;AAGnE,QAAI,eAAe,KAAK,GAAG,gBAAgB;AACzC,WAAK,GAAG;AAAA,IACV,OAAO;AACL,WAAK,GAAG,gBAAgB;AAAA,IAC1B;AAGA,UAAM,WAAW,uBAAuB,SAAS,YAAY,KAAK,GAAG,aAAa;AAElF,QAAI,aAAa,KAAK,GAAG,iBAAiB,eAAe,KAAK,GAAG,iBAAiB,IAAI;AAEpF,UAAI,KAAK,GAAG,iBAAiB,WAAW;AACtC,cAAM,YAAY,KAAK,GAAG,gBAAgB,KAAK,GAAG,gBAAgB,SAAS,CAAC;AAC5E,cAAM,YAAY,aAAa,UAAU,WAAW,KAAK,IAAI;AAC7D,aAAK,GAAG,gBAAgB,KAAK;AAAA,UAC3B,MAAM,KAAK,GAAG;AAAA,UACd;AAAA,UACA,SAAS,cAAc;AAAA,UACvB,SAAS,GAAG,KAAK,GAAG,YAAY;AAAA,QAClC,CAAC;AAAA,MACH;AACA,WAAK,GAAG,eAAe;AAAA,IACzB;AAAA,EACF;AACF;AAGA,SAAS,eAAe,KAAqB;AAC3C,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,WAAO,OAAO;AAAA,EAChB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,uBACP,SACA,YACA,eACQ;AAER,MAAI,yBAAyB,KAAK,OAAO,EAAG,QAAO;AACnD,MAAI,+BAA+B,KAAK,OAAO,EAAG,QAAO;AACzD,MAAI,mCAAmC,KAAK,OAAO,EAAG,QAAO;AAG7D,MAAI,eAAe,WAAW,iBAAiB,EAAG,QAAO;AACzD,MAAI,eAAe,aAAa,iBAAiB,EAAG,QAAO;AAC3D,MAAI,eAAe,WAAW,iBAAiB,EAAG,QAAO;AACzD,MAAI,eAAe,WAAY,QAAO;AAEtC,SAAO;AACT;;;ACrSA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,eAAe;AAiBxB,eAAsB,aACpB,MACmC;AACnC,QAAM,MAAM,MAAMC,UAAS,MAAM,OAAO;AACxC,QAAM,MAAM,QAAQ,IAAI,EAAE,YAAY;AAEtC,MAAI,QAAQ,SAAS;AACnB,UAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,QAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,YAAM,IAAI,MAAM,4CAA4C;AAAA,IAC9D;AACA,WAAO,KAAK,IAAI,CAAC,QAAiC;AAChD,YAAM,SAAiC,CAAC;AACxC,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,eAAO,CAAC,IAAI,OAAO,KAAK,EAAE;AAAA,MAC5B;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,SAAO,SAAS,GAAG;AACrB;AAEA,SAAS,SAAS,KAAuC;AACvD,QAAM,QAAQ,IAAI,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,MAAM,EAAE;AACjE,MAAI,MAAM,SAAS,EAAG,QAAO,CAAC;AAE9B,QAAM,UAAU,aAAa,MAAM,CAAC,CAAC;AACrC,QAAM,OAAiC,CAAC;AAExC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,SAAS,aAAa,MAAM,CAAC,CAAC;AACpC,UAAM,MAA8B,CAAC;AACrC,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,UAAI,QAAQ,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK;AAAA,IACjC;AACA,SAAK,KAAK,GAAG;AAAA,EACf;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,MAAwB;AAC5C,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU;AACd,MAAI,WAAW;AAEf,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,OAAO,KAAK,CAAC;AACnB,QAAI,UAAU;AACZ,UAAI,SAAS,KAAK;AAChB,YAAI,IAAI,IAAI,KAAK,UAAU,KAAK,IAAI,CAAC,MAAM,KAAK;AAC9C,qBAAW;AACX;AAAA,QACF,OAAO;AACL,qBAAW;AAAA,QACb;AAAA,MACF,OAAO;AACL,mBAAW;AAAA,MACb;AAAA,IACF,OAAO;AACL,UAAI,SAAS,KAAK;AAChB,mBAAW;AAAA,MACb,WAAW,SAAS,KAAK;AACvB,eAAO,KAAK,QAAQ,KAAK,CAAC;AAC1B,kBAAU;AAAA,MACZ,OAAO;AACL,mBAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACA,SAAO,KAAK,QAAQ,KAAK,CAAC;AAC1B,SAAO;AACT;AAgBA,eAAsB,aACpB,QACA,aACA,WACA,UACA,cACA,YAAiC,CAAC,GACH;AAC/B,QAAM,aAAa,YAAY,IAAI;AACnC,QAAM,SAAiB,UAAU,UAAU,IAAI,WAAW;AAC1D,QAAM,gBAAgB,UAAU,kBAAkB,MAAM,IAAI,YAAY;AACxE,QAAM,UAAU,YAAY,YAAY,WAAW,CAAC;AACpD,QAAM,iBAAiB,oBAAI,IAAoB;AAC/C,aAAW,CAAC,SAAS,SAAS,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC1D,mBAAe,IAAI,WAAW,OAAO;AAAA,EACvC;AAEA,QAAM,aAA2C,CAAC;AAClD,MAAI,YAAY;AAChB,MAAI,SAAS;AAIb,MAAI;AAEJ,MAAI,cAAc;AAChB,oBAAgB,IAAI,aAAa;AACjC,UAAM,IAAI,cAAc;AACxB,MAAE,MAAM,6EAAiB;AACzB,UAAM,cAAc,KAAK,YAAY,SAAS,UAAU;AAAA,MACtD,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,MAChB,OAAO,OAAO;AAAA,IAChB,CAAC;AACD,UAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAI,CAAC;AAC5C,MAAE,KAAK,0EAAc;AAAA,EACvB;AAEA,MAAI;AACF,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,MAAM,SAAS,CAAC;AACtB,YAAM,WAAW,OAAO,IAAI,CAAC,IAAI,SAAS,MAAM;AAChD,aAAO,KAAK;AAAA,eAAQ,QAAQ,eAAK;AAGjC,UAAI,gBAAgB,iBAAiB,OAAO,UAAU;AACpD,YAAI,cAAc,YAAY,GAAG;AAC/B,cAAI;AACF,kBAAM,cAAc,cAAc;AAAA,UACpC,QAAQ;AAAA,UAER;AAAA,QACF;AACA,YAAI;AACF,gBAAM,cAAc,eAAe,OAAO,QAAQ;AAClD,iBAAO,KAAK,6BAAS,OAAO,QAAQ,EAAE;AAAA,QACxC,SAAS,GAAG;AACV,iBAAO,KAAK,uEAAgB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,QAC1E;AAAA,MACF;AAGA,YAAM,WAAW,IAAI,aAAa;AAElC,YAAM,cAAc,UAAU,QAAQ;AACtC,YAAM,aAAa,IAAI,IAAI,WAAW;AAEtC,YAAM,gBAAgB,oBAAI,IAAY;AACtC,iBAAW,CAAC,GAAG,KAAK,aAAa;AAC/B,YAAI,UAAU,YAAY,GAAG,GAAG;AAC9B,wBAAc,IAAI,GAAG;AAAA,QACvB;AAAA,MACF;AAGA,iBAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AACpD,cAAM,UAAU,eAAe,IAAI,SAAS;AAC5C,YAAI,SAAS;AACX,qBAAW,IAAI,SAAS,KAAK;AAAA,QAC/B;AAAA,MACF;AAEA,eAAS,KAAK,YAAY,aAAa;AAGvC,UAAI,gBAAgB,iBAAiB,IAAI,GAAG;AAC1C,cAAM,WAAW,SAAS,gBAAgB,YAAY,SAAS,QAAQ;AACvE,cAAM,cAAc,SAAS,QAAQ;AACrC,cAAM,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,GAAG,CAAC;AAAA,MAC7C;AAEA,YAAM,YAAY;AAElB,YAAM,SAAS,MAAM,QAAQ,WAAW,aAAa;AAAA,QACnD,OAAO;AAAA,QACP,SAAS;AAAA,QACT,sBAAsB,UAAU;AAAA,QAChC,eAAe,UAAU;AAAA,QACzB;AAAA,QACA;AAAA,QACA,aAAa,UAAU;AAAA,MACzB,CAAC;AAED,iBAAW,KAAK,EAAE,UAAU,GAAG,UAAU,OAAO,CAAC;AAEjD,UAAI,OAAO,WAAW,KAAK,CAAC,OAAO,SAAS;AAC1C;AAAA,MACF,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAAA,EACF,UAAE;AACA,QAAI,eAAe;AAEjB,UAAI,cAAc,YAAY,GAAG;AAC/B,YAAI;AACF,gBAAM,cAAc,cAAc;AAAA,QACpC,QAAQ;AAAA,QAER;AAAA,MACF;AACA,UAAI;AACF,cAAM,cAAc,MAAM;AAAA,MAC5B,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,kBAAkB,YAAY;AAAA,IAC9B,WAAW,SAAS;AAAA,IACpB;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,iBAAiB,KAAK,MAAM,YAAY,IAAI,IAAI,UAAU;AAAA,EAC5D;AACF;;;ACpPA,SAAS,YAA0B;AACnC,SAAS,0BAA0B;AACnC,SAAS,0BAA0B;AACnC,SAAS,4BAA4B;AACrC,SAAS,yBAAyB;AAClC,SAAS,YAAY;AACrB,SAAS,aAA8B;AAMvC,IAAM,eAA6C;AAAA,EACjD,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AACX;AAEO,IAAM,gBAAN,MAAoB;AAAA,EAOzB,YAAY,QAA6B;AALzC,SAAQ,MAAmB;AAC3B,SAAQ,SAA4B;AACpC,SAAQ,UAA0B;AAClC,SAAQ,cAAc;AAGpB,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAmC;AACvC,QAAI,KAAK,YAAa;AACtB,SAAK,cAAc;AAEnB,UAAM,UAAU,KAAK,cAAc;AACnC,SAAK,MAAM,IAAI,KAAK;AAAA,MAClB,UAAU;AAAA,MACV,UAAU,EAAE,CAAC,aAAa,KAAK,OAAO,QAAQ,CAAC,GAAG,QAAQ;AAAA,MAC1D,OAAO,kBAAkB;AAAA,MACzB,QAAQ;AAAA,IACV,CAAC;AAGD,SAAK,mBAAmB;AAGxB,UAAM,KAAK,IAAI,WAAW;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAsB;AACpB,QAAI,CAAC,KAAK,IAAK,OAAM,IAAI,MAAM,gEAAgE;AAC/F,QAAI,CAAC,KAAK,SAAS;AACjB,YAAM,cAAc,aAAa,KAAK,OAAO,QAAQ;AACrD,WAAK,UAAU,KAAK,IAAI,QAAQ,GAAG,WAAW,IAAI,KAAK,OAAO,SAAS,EAAE;AAAA,IAC3E;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAAS,WAAqB,SAAsF;AAClH,QAAI,CAAC,KAAK,IAAK,OAAM,IAAI,MAAM,gEAAgE;AAC/F,SAAK,IAAI,SAAS,WAAW,CAAC,UAAU,QAAQ,EAAE,UAAU,MAAM,UAAU,OAAO,MAAM,MAAM,CAAC,CAAC;AAAA,EACnG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAyB;AAC7B,QAAI,KAAK,KAAK;AACZ,YAAM,KAAK,IAAI,SAAS;AACxB,WAAK,MAAM;AAAA,IACb;AACA,QAAI,KAAK,QAAQ;AACf,WAAK,OAAO,MAAM;AAClB,WAAK,SAAS;AAAA,IAChB;AACA,SAAK,UAAU;AACf,SAAK,cAAc;AAAA,EACrB;AAAA,EAEQ,gBAAgB;AACtB,YAAQ,KAAK,OAAO,UAAU;AAAA,MAC5B,KAAK;AAEH,eAAO,mBAAmB;AAAA,MAC5B,KAAK;AAEH,eAAO,mBAAmB;AAAA,MAC5B,KAAK;AAEH,eAAO,qBAAqB;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,qBAA2B;AACjC,UAAM,MAAM,IAAI,KAAK;AACrB,UAAM,WAAW,KAAK,OAAO;AAG7B,QAAI,KAAK,aAAa,QAAQ,IAAI,OAAO,MAAM;AAC7C,UAAI,CAAC,KAAK,IAAK,QAAO,EAAE,KAAK,uBAAuB,GAAG;AACvD,YAAM,iBAAkB,KAAK,IAAI,SAC/B,aAAa,QAAQ,CACvB;AACA,UAAI,CAAC,eAAgB,QAAO,EAAE,KAAK,oBAAoB,GAAG;AAC1D,aAAO,eAAe,EAAE,IAAI,GAAG;AAAA,IACjC,CAAC;AAED,SAAK,SAAS,MAAM,EAAE,OAAO,IAAI,OAAO,MAAM,KAAK,OAAO,aAAa,CAAC;AAAA,EAC1E;AACF;;;AChGO,SAAS,eACd,UACA,WACqB;AACrB,QAAM,YAAY,cAAc,QAAQ;AAGxC,QAAM,eACJ,WAAW,gBACX,YAAY,oBAAoB,KAChC,YAAY,qBAAqB,KACjC;AAGF,QAAM,oBACJ,WAAW,qBACX,YAAY,0BAA0B,KACtC,YAAY,2BAA2B,KACvC;AAEF,SAAO,EAAE,UAAU,WAAW,cAAc,kBAAkB;AAChE;AAEA,SAAS,cAAc,UAAgC;AACrD,QAAM,SAAuC;AAAA,IAC3C,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAEA,QAAM,SAAS,OAAO,QAAQ;AAC9B,QAAM,QAAQ,QAAQ,IAAI,MAAM;AAChC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,GAAG,MAAM,yCAAyC,QAAQ,YAAY;AAAA,EACxF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,KAAiC;AACpD,QAAM,IAAI,QAAQ,IAAI,GAAG;AACzB,MAAI,CAAC,EAAG,QAAO;AACf,QAAM,IAAI,OAAO,SAAS,GAAG,EAAE;AAC/B,SAAO,OAAO,MAAM,CAAC,IAAI,SAAY;AACvC;;;AClEA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAWA,IAAM,aAAa;AAAA,EACxB,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AACT;AAEA,IAAM,aAAqC;AAAA,EACzC,KAAK;AAAA;AAAA,EACL,QAAQ;AAAA;AAAA,EACR,MAAM;AAAA;AACR;AAEO,SAAS,kBAAkB,MAAkB,SAA4C;AAC9F,QAAM,YAAY,WAAW,KAAK,SAAS,KAAK;AAChD,QAAM,WAAW,SAAS,OAAO,GAAG,EAAE,gBAAgB,CAAC,GAAG,QAAQ,IAAI;AAAA,IAAO;AAE7E,SAAO,KAAK;AAAA,IACV,OAAO,EAAE,sBAAsB;AAAA,IAC/B,UAAU;AAAA,MACR,QAAQ;AAAA,QACN;AAAA,UACE,GAAG,4BAA4B;AAAA,YAC7B;AAAA,YACA,aAAa,KAAK;AAAA,YAClB;AAAA,YACA,WAAW,KAAK;AAAA,UAClB,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,MACD,QAAQ;AAAA,QACN,OAAO,EAAE,IAAI,WAAW,SAAS,OAAO,EAAE,oBAAoB,GAAG,OAAO,UAAU,CAAC;AAAA,QACnF,OAAO,EAAE,IAAI,WAAW,MAAM,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAAA,QAC3D,OAAO,EAAE,IAAI,WAAW,OAAO,OAAO,EAAE,kBAAkB,GAAG,OAAO,SAAS,CAAC;AAAA,MAChF,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAEO,SAAS,wBAAwB,MAAkB,YAAiC;AACzF,SAAO,KAAK;AAAA,IACV,UAAU;AAAA,MACR,QAAQ;AAAA,QACN,SAAS,SAAS,KAAK,OAAO,KAAK,KAAK,WAAW;AAAA,EAAK,UAAU,EAAE;AAAA,MACtE,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;AAIA,SAAS,YAAY,QAAwD;AAC3E,MAAI,eAAe,QAAQ;AACzB,UAAM,IAAI;AACV,QAAI,EAAE,WAAW,EAAG,QAAO;AAC3B,QAAI,EAAE,cAAc,EAAG,QAAO;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AACV,MAAI,EAAE,QAAS,QAAO;AACtB,MAAI,EAAE,WAAW,EAAG,QAAO;AAC3B,MAAI,EAAE,cAAc,EAAG,QAAO;AAC9B,SAAO;AACT;AAEO,SAAS,sBAAsB,QAA6D;AACjG,QAAM,UAAU,eAAe;AAC/B,SAAO,UACH,eAAe,MAA8B,IAC7C,gBAAgB,MAAyB;AAC/C;AAEA,SAAS,gBAAgB,QAAsC;AAC7D,QAAM,QAAQ,YAAY,MAAM;AAChC,QAAM,WAAW,OAAO,UAAU,eAAe,EAAE,eAAe,CAAC,KAAK;AAExE,QAAM,WAAwB;AAAA,IAC5B,QAAQ;AAAA,MACN,SAAS,IAAI,KAAK,IAAI,OAAO,gBAAgB,GAAG;AAAA,IAClD,CAAC;AAAA,IACD,OAAO;AAAA,MACL,MAAM,EAAE,OAAO,aAAa,OAAO,UAAU,OAAO,SAAS,GAAG,CAAC;AAAA,MACjE,MAAM,EAAE,OAAO,UAAU,OAAO,UAAU,OAAO,MAAM,GAAG,CAAC;AAAA,MAC3D,MAAM,EAAE,OAAO,WAAW,OAAO,UAAU,OAAO,OAAO,GAAG,CAAC;AAAA,MAC7D,MAAM,EAAE,OAAO,YAAY,OAAO,UAAU,eAAe,OAAO,eAAe,CAAC,GAAG,QAAQ,GAAG,CAAC;AAAA,IACnG,CAAC;AAAA,EACH;AAEA,QAAM,cAAc,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AACpE,MAAI,YAAY,SAAS,GAAG;AAC1B,aAAS,KAAK,QAAQ,CAAC;AACvB,aAAS;AAAA,MACP,QAAQ;AAAA,QACN,SAAS,IAAI,EAAE,kBAAkB,CAAC;AAAA,EAAM,kBAAkB,WAAW,CAAC,EAAE;AAAA,MAC1E,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,KAAK,EAAE,SAAS,CAAC;AAC1B;AAEA,SAAS,eAAe,QAA2C;AACjE,QAAM,QAAQ,YAAY,MAAM;AAEhC,QAAM,WAAwB;AAAA,IAC5B,QAAQ;AAAA,MACN,SAAS,IAAI,KAAK,IAAI,OAAO,gBAAgB,KAAK,EAAE,eAAe,CAAC,IAAI;AAAA,IAC1E,CAAC;AAAA,IACD,OAAO;AAAA,MACL,MAAM,EAAE,OAAO,SAAS,OAAO,GAAG,kBAAkB,EAAE,OAAO,OAAO,UAAU,CAAC,EAAE,CAAC;AAAA,MAClF,MAAM,EAAE,OAAO,aAAa,OAAO,UAAU,OAAO,SAAS,GAAG,CAAC;AAAA,MACjE,MAAM,EAAE,OAAO,UAAU,OAAO,UAAU,OAAO,MAAM,GAAG,CAAC;AAAA,MAC3D,MAAM,EAAE,OAAO,YAAY,OAAO,UAAU,eAAe,OAAO,eAAe,CAAC,GAAG,CAAC;AAAA,IACxF,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,OAAO,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,KAAK,EAAE,OAAO,OAAO;AACpF,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,WAAW,WAAW,MAAM,GAAG,EAAE,EAAE,IAAI,CAAC,QAAQ;AACpD,YAAM,SAAS,IAAI,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AACnE,YAAM,WAAW,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI;AAC7D,aAAO,KAAK,IAAI,QAAQ,KAAK,QAAQ;AAAA,IACvC,CAAC;AACD,QAAI,WAAW,SAAS,IAAI;AAC1B,eAAS,KAAK,GAAG,iBAAiB,EAAE,OAAO,WAAW,SAAS,GAAG,CAAC,CAAC;AAAA,IACtE;AACA,aAAS,KAAK,QAAQ,CAAC;AACvB,aAAS;AAAA,MACP,QAAQ;AAAA,QACN,SAAS,IAAI,EAAE,iBAAiB,CAAC;AAAA,EAAM,SAAS,KAAK,IAAI,CAAC,EAAE;AAAA,MAC9D,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,KAAK,EAAE,SAAS,CAAC;AAC1B;AAEO,SAAS,2BAA2B,QAAkC;AAC3E,QAAM,IAAI,OAAO;AAEjB,QAAM,WAAwB;AAAA,IAC5B,QAAQ;AAAA,MACN,SAAS,cAAc,GAAG,qBAAqB,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,GAAG;AAAA,IAClF,CAAC;AAAA,IACD,OAAO;AAAA,MACL,MAAM,EAAE,OAAO,aAAa,OAAO,UAAU,EAAE,SAAS,GAAG,CAAC;AAAA,MAC5D,MAAM,EAAE,OAAO,UAAU,OAAO,UAAU,EAAE,MAAM,GAAG,CAAC;AAAA,MACtD,MAAM,EAAE,OAAO,WAAW,OAAO,UAAU,EAAE,OAAO,GAAG,CAAC;AAAA,MACxD,MAAM,EAAE,OAAO,YAAY,OAAO,UAAU,eAAe,EAAE,eAAe,CAAC,GAAG,CAAC;AAAA,IACnF,CAAC;AAAA,EACH;AAGA,QAAM,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AAC/D,MAAI,YAAY,SAAS,GAAG;AAC1B,aAAS,KAAK,QAAQ,CAAC;AACvB,aAAS;AAAA,MACP,QAAQ;AAAA,QACN,SAAS,IAAI,EAAE,kBAAkB,CAAC;AAAA,EAAM,kBAAkB,aAAa,EAAE,OAAO,IAAI,aAAa,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE;AAAA,MAC7H,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,qBAA+B,CAAC;AACtC,QAAM,yBAAyB,OAAO,YAAY,OAAO,CAAC,MAAM,EAAE,cAAc;AAChF,aAAW,KAAK,uBAAuB,MAAM,GAAG,EAAE,GAAG;AACnD,UAAM,SAAS,EAAE,aAAa,UAAU,WAAW;AACnD,uBAAmB,KAAK,GAAG,MAAM,KAAK,EAAE,WAAW,YAAY,EAAE,eAAe,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EACjG;AACA,QAAM,qBAAqB,OAAO,YAAY,OAAO,CAAC,MAAM,EAAE,UAAU;AACxE,aAAW,KAAK,mBAAmB,MAAM,GAAG,EAAE,GAAG;AAC/C,UAAM,SAAS,EAAE,aAAa,UAAU,WAAW;AACnD,uBAAmB,KAAK,GAAG,MAAM,KAAK,EAAE,WAAW,WAAW,EAAE,WAAW,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EAC5F;AACA,QAAM,mBAAmB,uBAAuB,SAAS,mBAAmB;AAC5E,MAAI,mBAAmB,SAAS,KAAK,mBAAmB,mBAAmB,QAAQ;AACjF,uBAAmB,KAAK,GAAG,kBAAkB,EAAE,OAAO,mBAAmB,mBAAmB,OAAO,CAAC,CAAC;AAAA,EACvG;AACA,MAAI,mBAAmB,SAAS,GAAG;AACjC,aAAS,KAAK,QAAQ,CAAC;AACvB,aAAS;AAAA,MACP,QAAQ;AAAA,QACN,SAAS,IAAI,EAAE,uBAAuB,CAAC;AAAA,EAAM,mBAAmB,KAAK,IAAI,CAAC,EAAE;AAAA,MAC9E,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,OAAO,aAAa,SAAS,GAAG;AAClC,UAAM,QAAQ,OAAO,aAAa,MAAM,GAAG,EAAE,EAAE;AAAA,MAAI,CAAC,MAClD,MAAM,EAAE,OAAO,IAAI,EAAE,WAAW,WAAW,EAAE,UAAU,IAAI,EAAE,SAAS;AAAA,IACxE;AACA,QAAI,OAAO,aAAa,SAAS,IAAI;AACnC,YAAM,KAAK,GAAG,kBAAkB,EAAE,OAAO,OAAO,aAAa,SAAS,GAAG,CAAC,CAAC;AAAA,IAC7E;AACA,aAAS,KAAK,QAAQ,CAAC;AACvB,aAAS;AAAA,MACP,QAAQ;AAAA,QACN,SAAS,IAAI,EAAE,yBAAyB,CAAC;AAAA,EAAM,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,MACnE,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,KAAK,EAAE,SAAS,CAAC;AAC1B;AAIA,SAAS,kBACP,OACA,SACQ;AACR,QAAM,EAAE,QAAQ,IAAI,cAAc,KAAK,cAAc,MAAM,IAAI,WAAW,CAAC;AAC3E,QAAM,QAAQ,MAAM,MAAM,GAAG,KAAK,EAAE,IAAI,CAAC,MAAM;AAC7C,UAAM,SAAS,EAAE,QAAQ,KAAK,EAAE,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK;AAChE,UAAM,UAAU,eAAe,EAAE,aAAa,WAAW,EAAE,UAAU,MAAM;AAC3E,UAAM,cAAc,EAAE,kBAAkB,KAAK,EAAE,eAAe,MAAM;AACpE,WAAO,MAAM,EAAE,OAAO,IAAI,EAAE,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW;AAAA,EAC1E,CAAC;AACD,MAAI,MAAM,SAAS,OAAO;AACxB,UAAM,KAAK,GAAG,kBAAkB,EAAE,OAAO,MAAM,SAAS,MAAM,CAAC,CAAC;AAAA,EAClE;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC9OA,IAAM,gBAAoD;AAAA,EACxD,SAAS;AAAA;AAAA,EACT,MAAM;AAAA;AAAA,EACN,OAAO;AAAA;AACT;AAEO,IAAM,2BAAN,MAA+D;AAAA,EAMpE,YAAY,WAA0B,WAAmB;AAHzD,SAAQ,oBAAoB;AAC5B,SAAQ,iBAAgE;AAGtE,SAAK,YAAY;AACjB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,QAAQ,MAAkB,YAAoB,SAA4D;AAC9G,UAAM,KAAK,UAAU,kBAAkB;AACvC,SAAK,oBAAoB;AAEzB,UAAM,UAAU,KAAK,UAAU,WAAW;AAC1C,UAAM,OAAO,kBAAkB,MAAM,OAAO;AAC5C,UAAM,cAAc,MAAM,QAAQ,KAAK,IAAI;AAE3C,YAAQ,IAAI,eAAe,KAAK,OAAO,KAAK,EAAE,sBAAsB,CAAC,EAAE;AAEvE,WAAO,IAAI,QAA4B,CAAC,YAAY;AAClD,WAAK,iBAAiB;AAGtB,YAAM,QAAQ,WAAW,YAAY;AACnC,YAAI,KAAK,mBAAmB,SAAS;AACnC,eAAK,iBAAiB;AACtB,kBAAQ,IAAI,eAAe,KAAK,OAAO,KAAK,EAAE,sBAAsB,CAAC,EAAE;AACvE,cAAI;AACF,kBAAM,YAAY,KAAK,wBAAwB,MAAM,EAAE,sBAAsB,CAAC,CAAC;AAAA,UACjF,QAAQ;AAAA,UAAqB;AAC7B,kBAAQ,OAAO;AAAA,QACjB;AAAA,MACF,GAAG,KAAK,SAAS;AAGjB,YAAM,kBAAkB;AACxB,WAAK,iBAAiB,CAAC,WAA+B;AACpD,qBAAa,KAAK;AAClB,aAAK,iBAAiB;AAEtB,gBAAQ,IAAI,eAAe,KAAK,OAAO,KAAK,MAAM,EAAE;AAEpD,cAAM,cAAc,eAAe,MAAM;AACzC,oBAAY,KAAK,wBAAwB,MAAM,WAAW,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAC3E,wBAAgB,MAAM;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAyB;AAE7B,SAAK,iBAAiB;AACtB,SAAK,oBAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBAA4B;AAClC,QAAI,KAAK,kBAAmB;AAC5B,SAAK,oBAAoB;AAEzB,SAAK,UAAU;AAAA,MACb,CAAC,WAAW,SAAS,WAAW,MAAM,WAAW,KAAK;AAAA,MACtD,CAAC,UAAU;AACT,cAAM,YAAgD;AAAA,UACpD,CAAC,WAAW,OAAO,GAAG;AAAA,UACtB,CAAC,WAAW,IAAI,GAAG;AAAA,UACnB,CAAC,WAAW,KAAK,GAAG;AAAA,QACtB;AACA,cAAM,SAAS,UAAU,MAAM,QAAQ;AACvC,YAAI,UAAU,KAAK,gBAAgB;AACjC,eAAK,eAAe,MAAM;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,QAAoC;AAC1D,QAAM,QAAQ,cAAc,MAAM;AAClC,QAAM,SAAgG;AAAA,IACpG,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACA,SAAO,GAAG,KAAK,IAAI,EAAE,OAAO,MAAM,CAAC,CAAC;AACtC;;;ACnGO,SAAS,2BACd,MACA,WACA,WACsB;AACtB,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,IAAI,wBAAwB;AAAA,IACrC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,UAAI,CAAC,UAAW,OAAM,IAAI,MAAM,mDAAmD;AACnF,aAAO,IAAI,yBAAyB,WAAW,aAAa,GAAO;AAAA,EACvE;AACF;;;ACbO,IAAM,eAAN,MAAmD;AAAA,EAGxD,YAAY,WAA0B;AACpC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,MAAM,eAAe,QAA+D;AAClF,UAAM,KAAK,UAAU,kBAAkB;AACvC,UAAM,UAAU,KAAK,UAAU,WAAW;AAC1C,UAAM,OAAO,sBAAsB,MAAM;AACzC,UAAM,QAAQ,KAAK,IAAI;AAAA,EACzB;AAAA,EAEA,MAAM,mBAAmB,QAAoC;AAC3D,UAAM,KAAK,UAAU,kBAAkB;AACvC,UAAM,UAAU,KAAK,UAAU,WAAW;AAC1C,UAAM,OAAO,2BAA2B,MAAM;AAC9C,UAAM,QAAQ,KAAK,IAAI;AAAA,EACzB;AACF;;;ACZA,IAAM,2BAAN,MAA+D;AAAA,EAC7D,MAAM,iBAAgC;AAAA,EAEtC;AAAA,EACA,MAAM,qBAAoC;AAAA,EAE1C;AACF;AAEO,SAAS,2BACd,MACA,WACsB;AACtB,MAAI,CAAC,KAAM,QAAO,IAAI,yBAAyB;AAE/C,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,uDAAuD;AACvF,SAAO,IAAI,aAAa,SAAS;AACnC;AAGA,eAAsB,WAAW,IAAwC;AACvE,MAAI;AACF,UAAM,GAAG;AAAA,EACX,SAAS,OAAO;AACd,QAAI,KAAK,wBAAwB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EAC3F;AACF;;;ACvCA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,YAAAC,iBAAgB;AACzB,SAAS,iBAAiB;AAG1B,IAAM,qBACJ;AACF,IAAM,uBAAuB;AAE7B,IAAI,eAAiC;AAErC,SAAS,YAAuB;AAC9B,MAAI,CAAC,cAAc;AACjB,mBAAe,IAAI,UAAU,kBAAkB;AAAA,EACjD;AACA,SAAO;AACT;AAMA,eAAsB,qBACpB,gBACA,OACe;AACf,MAAI;AACF,UAAM,SAAS,UAAU;AACzB,UAAM,UAAU,MAAMC,UAAS,gBAAgB,OAAO;AAEtD,UAAM,OAAO,cAAc;AAAA,MACzB,YAAY;AAAA,MACZ;AAAA,MACA,UAAUC,UAAS,cAAc;AAAA,MACjC,iBAAiB,0DAA4B,KAAK;AAAA,IACpD,CAAC;AAAA,EACH,SAAS,OAAO;AACd,QAAI;AAAA,MACF,6BAA6B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACrF;AAAA,EACF;AACF;;;ACxCA,SAAS,KAAAC,UAAS;AAWlB,IAAM,mBAAmBC,GAAE;AAAA,EACzBA,GAAE,OAAO;AAAA,IACP,aAAaA,GAAE,OAAO,EAAE,SAAS,gEAAmB;AAAA,IACpD,iBAAiBA,GAAE,OAAO,EAAE,SAAS,4CAAS;AAAA,IAC9C,OAAOA,GAAE,OAAO,EAAE,SAAS,kDAAU;AAAA,IACrC,gBAAgBA,GAAE,OAAO,EAAE;AAAA,MACzB;AAAA,IACF;AAAA,IACA,YAAYA,GAAE,OAAO,EAAE;AAAA,MACrB;AAAA,IACF;AAAA,IACA,UAAUA,GAAE,KAAK,CAAC,SAAS,SAAS,CAAC,EAAE,SAAS,kEAA0B;AAAA,IAC1E,iBAAiBA,GAAE,KAAK;AAAA,MACtB;AAAA,MAAqB;AAAA,MAAiB;AAAA,MACtC;AAAA,MAAsB;AAAA,MAAiB;AAAA,IACzC,CAAC,EAAE,SAAS,EAAE,SAAS,wDAAW;AAAA,IAClC,mBAAmBA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0EAAc;AAAA,EAClE,CAAC;AACH;AAKA,eAAsB,mBACpB,QACA,aACA,uBACA,iBACsB;AACtB,QAAM,eAAe,oBAAoB,QAAQ,qBAAqB;AAGtE,QAAM,cAAc,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AACpE,MAAI,YAAY,WAAW,KAAK,aAAa,WAAW,GAAG;AACzD,WAAO,EAAE,iBAAiB,QAAQ,cAAc,CAAC,GAAG,aAAa,CAAC,EAAE;AAAA,EACtE;AAEA,QAAM,cAAc,MAAM,oBAAoB,QAAQ,aAAa,eAAe;AAClF,SAAO,EAAE,iBAAiB,QAAQ,cAAc,YAAY;AAC9D;AAEA,SAAS,oBACP,QACA,WACoB;AACpB,QAAM,WAA+B,CAAC;AACtC,aAAW,QAAQ,OAAO,OAAO;AAC/B,QAAI,KAAK,eAAe,UAAa,KAAK,cAAc,WAAW;AACjE,eAAS,KAAK;AAAA,QACZ,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,QACjB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,oBACb,QACA,aACA,iBAC4B;AAC5B,QAAM,cAAc,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AACpE,MAAI,YAAY,WAAW,EAAG,QAAO,CAAC;AAGtC,QAAM,aAAa,YAAY,IAAI,CAAC,MAAM;AACxC,UAAM,YAAY,EAAE,eAChB,EAAE,aAAa;AAAA,MAAI,CAAC,MAClB,aAAa,EAAE,OAAO,KAAK,EAAE,aAAa,eAAe,EAAE,oBAAoB,cAAc,EAAE,eAAe,GAAG,EAAE,cAAc,SAAS,EAAE,YAAY,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE;AAAA,IAC9K,EAAE,KAAK,IAAI,IACX;AACJ,UAAM,eAAe,EAAE,kBACnB;AAAA,oCAAc,EAAE,eAAe;AAAA,8BAAa,gBAAgB,EAAE,eAAe,CAAC,KAC9E;AACJ,WAAO,SAAS,EAAE,OAAO,KAAK,EAAE,WAAW;AAAA,wBAAY,EAAE,KAAK;AAAA,0CAAe,EAAE,cAAc,CAAC;AAAA,EAAK,SAAS,GAAG,YAAY;AAAA,EAC7H,CAAC;AAGD,QAAM,YAAY,YAAY,MAAM,IAAI,CAAC,MAAM;AAC7C,UAAM,WAAW,EAAE,OAAO,WAAW,KAAK,UAAU,EAAE,OAAO,QAAQ,IAAI;AACzE,WAAO,SAAS,EAAE,OAAO,KAAK,EAAE,WAAW;AAAA,oCAAc,EAAE,OAAO,IAAI;AAAA,8BAAa,QAAQ;AAAA,SAAY,EAAE,GAAG;AAAA,EAC9G,CAAC;AAED,QAAM,SAAS,0BAA0B;AACzC,QAAM,aAAa,0BAA0B,YAAY,WAAW,aAAa,eAAe;AAEhG,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,sBAAsB,UAAU;AAAA,MACvD,OAAO,SAAS,QAAQ;AAAA,MACxB,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,UACT,iBAAiB;AAAA,YACf,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,EAAE;AAAA,UACnD;AAAA,QACF;AAAA,QACA,EAAE,MAAM,QAAQ,SAAS,WAAW;AAAA,MACtC;AAAA,MACA,QAAQ;AAAA,MACR,aAAa;AAAA,IACf,CAAC;AACD,WAAO;AAAA,EACT,QAAQ;AAEN,WAAO,CAAC;AAAA,EACV;AACF;;;ACvHO,SAAS,iBAAiB,QAA2B;AAC1D,QAAM,IAAI,OAAO;AACjB,QAAM,cAAc,EAAE,SAAS;AAC/B,QAAM,cAAc,OAAO,aAAa,SAAS;AAEjD,MAAI,CAAC,eAAe,CAAC,aAAa;AAEhC,QAAI;AAAA,MACF,GAAG,+BAA+B,EAAE,OAAO,EAAE,YAAY,UAAU,eAAe,EAAE,eAAe,EAAE,CAAC;AAAA,IACxG;AACA;AAAA,EACF;AAGA,QAAM,eAAe;AAAA,IACnB,GAAG,wBAAwB,EAAE,OAAO,EAAE,iBAAiB,CAAC;AAAA,IACxD,GAAG,qBAAqB,EAAE,KAAK,EAAE,SAAS,CAAC;AAAA,IAC3C,GAAG,uBAAuB,EAAE,OAAO,EAAE,WAAW,CAAC;AAAA,IACjD,GAAG,sBAAsB,EAAE,UAAU,EAAE,UAAU,WAAW,EAAE,WAAW,QAAQ,EAAE,QAAQ,SAAS,EAAE,QAAQ,CAAC;AAAA,IAC/G,GAAI,EAAE,UAAU,CAAC,EAAE,wBAAwB,CAAC,IAAI,CAAC;AAAA,IACjD,GAAG,0BAA0B,EAAE,UAAU,eAAe,EAAE,eAAe,EAAE,CAAC;AAAA,EAC9E;AAGA,MAAI,EAAE,qBAAqB,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,GAAG;AACtE,UAAM,aAAa,OAAO,QAAQ,EAAE,iBAAiB,EAClD,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,cAAc,CAAC,GAAG,EAC9D,KAAK,IAAI;AACZ,iBAAa,KAAK,GAAG,mBAAmB,EAAE,MAAM,WAAW,CAAC,CAAC;AAAA,EAC/D;AAGA,MAAI,EAAE,mBAAmB,EAAE,gBAAgB,SAAS,GAAG;AACrD,iBAAa,KAAK,GAAG,sBAAsB,EAAE,OAAO,EAAE,gBAAgB,OAAO,CAAC,CAAC;AAAA,EACjF;AAEA,OAAK,aAAa,KAAK,IAAI,GAAG,EAAE,yBAAyB,CAAC;AAG1D,QAAM,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AAC/D,MAAI,YAAY,SAAS,GAAG;AAC1B,QAAI,MAAM,EAAE,yBAAyB,CAAC;AACtC,eAAW,KAAK,aAAa;AAC3B,YAAM,UAAU,EAAE,aAAa,cAAc,EAAE,UAAU,MAAM;AAC/D,YAAM,cAAc,EAAE,kBAAkB,KAAK,EAAE,eAAe,MAAM;AACpE,UAAI,MAAM,IAAI,EAAE,OAAO,IAAI,EAAE,WAAW,KAAK,EAAE,KAAK,GAAG,OAAO,GAAG,WAAW,EAAE;AAC9E,UAAI,EAAE,iBAAiB;AACrB,YAAI,KAAK,YAAO,gBAAgB,EAAE,eAAe,CAAC,EAAE;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAGA,QAAM,yBAAyB,OAAO,YAAY,OAAO,CAAC,MAAM,EAAE,cAAc;AAChF,MAAI,uBAAuB,SAAS,GAAG;AACrC,QAAI,KAAK,EAAE;AACX,QAAI,KAAK,EAAE,6BAA6B,CAAC;AACzC,eAAW,KAAK,wBAAwB;AACtC,YAAM,SAAS,EAAE,aAAa,UAAU,WAAM;AAC9C,UAAI,KAAK,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,EAAE,cAAc,EAAE;AAAA,IAC7D;AAAA,EACF;AAGA,QAAM,qBAAqB,OAAO,YAAY,OAAO,CAAC,MAAM,EAAE,UAAU;AACxE,MAAI,mBAAmB,SAAS,GAAG;AACjC,QAAI,KAAK,EAAE;AACX,QAAI,KAAK,EAAE,gCAAgC,CAAC;AAC5C,eAAW,KAAK,oBAAoB;AAClC,YAAM,SAAS,EAAE,aAAa,UAAU,WAAM;AAC9C,UAAI,KAAK,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,EAAE,UAAU,EAAE;AAAA,IACzD;AAAA,EACF;AAGA,MAAI,OAAO,aAAa,SAAS,GAAG;AAClC,QAAI,KAAK,EAAE;AACX,QAAI,KAAK,EAAE,2BAA2B,CAAC;AACvC,eAAW,KAAK,OAAO,cAAc;AACnC,UAAI;AAAA,QACF,GAAG,0BAA0B,EAAE,SAAS,EAAE,SAAS,aAAa,EAAE,aAAa,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU,CAAC;AAAA,MAC9H;AAAA,IACF;AAAA,EACF;AACF;;;AC6KO,SAAS,yBAAyB,YAAuC;AAC9E,QAAM,qBAAqB,KAAK,IAAI,aAAa,GAAG,CAAC;AACrD,QAAM,iBAA2B,CAAC;AAClC,WAAS,IAAI,GAAG,IAAI,oBAAoB,KAAK;AAC3C,mBAAe,KAAK,MAAO,IAAI,GAAI;AAAA,EACrC;AACA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,uBAAuB;AAAA,IACvB,gBAAgB;AAAA,EAClB;AACF;;;AChRA,YAAY,OAAO;AAGZ,IAAM,YAAN,MAAkC;AAAA,EACvC,KAAK,SAAuB;AAC1B,IAAE,MAAI,KAAK,OAAO;AAAA,EACpB;AAAA,EACA,QAAQ,SAAuB;AAC7B,IAAE,MAAI,QAAQ,OAAO;AAAA,EACvB;AAAA,EACA,MAAM,SAAuB;AAC3B,IAAE,MAAI,MAAM,OAAO;AAAA,EACrB;AAAA,EACA,KAAK,SAAuB;AAC1B,IAAE,MAAI,KAAK,OAAO;AAAA,EACpB;AAAA,EACA,KAAK,SAAuB;AAC1B,IAAE,MAAI,KAAK,OAAO;AAAA,EACpB;AAAA,EACA,MAAM,SAAuB;AAC3B,IAAE,MAAI,KAAK,WAAW,OAAO,EAAE;AAAA,EACjC;AACF;AAEO,IAAM,aAAN,MAAwC;AAAA,EAAxC;AACL,SAAQ,UAAY,UAAQ;AAAA;AAAA,EAE5B,MAAM,SAAuB;AAC3B,SAAK,QAAQ,MAAM,OAAO;AAAA,EAC5B;AAAA,EACA,KAAK,SAAuB;AAC1B,SAAK,QAAQ,KAAK,OAAO;AAAA,EAC3B;AACF;AAEO,IAAM,mBAAkC;AAAA,EAC7C,cAAc,MAAM,IAAI,UAAU;AAAA,EAClC,eAAe,MAAM,IAAI,WAAW;AACtC;;;ACMA,SAAS,iBAAiB,MAA2B,QAA0B;AAC7E,QAAM,QAAkB,CAAC;AACzB,QAAM,WAAW,GAAG,KAAK,UAAU;AAEnC,MAAI,KAAK,kBAAkB;AACzB,UAAM,KAAK,GAAG,MAAM,GAAG,KAAK,OAAO,eAAe,KAAK,WAAW,sBAAsB;AACxF,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,gBAAgB,QAAW;AAClC,UAAMC,OAAM,KAAK,WAAW,YAAY,SAAS,KAAK,WAAW,YAAY,YAAY;AACzF,UAAM,KAAK,GAAG,MAAM,GAAG,KAAK,OAAO,MAAMA,IAAG,KAAK,KAAK,WAAW,aAAa,KAAK,eAAe,UAAU,KAAK,QAAQ,GAAG;AAC5H,QAAI,KAAK,gBAAgB;AACvB,iBAAW,cAAc,KAAK,gBAAgB;AAC5C,mBAAW,OAAO,YAAY;AAC5B,gBAAM,KAAK,GAAG,iBAAiB,KAAK,GAAG,MAAM,IAAI,CAAC;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,mBAAmB,QAAW;AACrC,UAAMA,OAAM,KAAK,WAAW,YAAY,SAAS;AACjD,UAAM,YAAY,KAAK,qBAAqB,SACxC,YAAY,KAAK,gBAAgB,WACjC,GAAG,KAAK,cAAc;AAC1B,UAAM,KAAK,GAAG,MAAM,GAAG,KAAK,OAAO,MAAMA,IAAG,KAAK,KAAK,WAAW,KAAK,SAAS,KAAK,QAAQ,GAAG;AAC/F,QAAI,KAAK,gBAAgB;AACvB,eAAS,IAAI,GAAG,IAAI,KAAK,eAAe,QAAQ,KAAK;AACnD,cAAM,KAAK,GAAG,MAAM,eAAe,CAAC,GAAG;AACvC,mBAAW,OAAO,KAAK,eAAe,CAAC,GAAG;AACxC,gBAAM,KAAK,GAAG,iBAAiB,KAAK,GAAG,MAAM,MAAM,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,KAAK,WAAW,YAAY,SAAS,KAAK,WAAW,WAAW,WAAW;AACvF,QAAM,YAAY,KAAK,WAAW,YAAY,KAAK,QAAQ,kBAAa,KAAK,KAAK,KAAK;AACvF,QAAM,WAAW,KAAK,kBAAkB,KAAK,KAAK,eAAe,MAAM;AACvE,QAAM,QAAQ,KAAK,aAAa,cAAc,KAAK,UAAU,MAAM;AACnE,QAAM,KAAK,GAAG,MAAM,GAAG,KAAK,OAAO,MAAM,GAAG,KAAK,KAAK,WAAW,KAAK,QAAQ,IAAI,SAAS,GAAG,QAAQ,GAAG,KAAK,EAAE;AAEhH,SAAO;AACT;AAEA,SAAS,kBAAkB,MAAuB,aAA+B;AAC/E,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,aAAa,WAAW,qBAAgB;AACnD,QAAM,KAAK,EAAE;AAGb,MAAI,KAAK,YAAY;AACnB,UAAM,KAAK,yBAAyB,KAAK,WAAW,IAAI,EAAE;AAC1D,QAAI,KAAK,WAAW,MAAO,OAAM,KAAK,YAAY,KAAK,WAAW,KAAK,EAAE;AACzE,QAAI,KAAK,WAAW,IAAK,OAAM,KAAK,UAAU,KAAK,WAAW,GAAG,EAAE;AACnE,QAAI,KAAK,WAAW,UAAU;AAC5B,YAAM,KAAK,aAAa;AACxB,YAAM,KAAK,SAAS;AACpB,YAAM,KAAK,KAAK,UAAU,KAAK,WAAW,UAAU,MAAM,CAAC,CAAC;AAC5D,YAAM,KAAK,KAAK;AAAA,IAClB;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,KAAK,SAAS;AAChB,UAAM,KAAK,iBAAiB,KAAK,OAAO,EAAE;AAC1C,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,KAAK,cAAc;AACrB,UAAM,KAAK,sBAAsB,KAAK,YAAY,EAAE;AACpD,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,KAAK,mBAAmB;AAC1B,UAAM,IAAI,KAAK;AACf,UAAM,KAAK,sCAAsC,EAAE,UAAU,qBAAqB,EAAE,eAAe,KAAK,GAAG,CAAC,4BAA4B,EAAE,qBAAqB,oBAAoB,EAAE,cAAc,IAAI;AACvM,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,KAAK,4BAA4B;AACnC,UAAM,KAAK,8BAA8B,KAAK,0BAA0B,EAAE;AAC1E,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,KAAK,kBAAkB,KAAK,eAAe,SAAS,GAAG;AACzD,UAAM,KAAK,sBAAsB;AACjC,eAAW,KAAK,KAAK,gBAAgB;AACnC,YAAM,KAAK,KAAK,CAAC,EAAE;AAAA,IACrB;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,KAAK,sBAAsB,KAAK,mBAAmB,SAAS,GAAG;AACjE,UAAM,KAAK,0BAA0B;AACrC,eAAW,KAAK,KAAK,oBAAoB;AACvC,YAAM,KAAK,KAAK,CAAC,EAAE;AAAA,IACrB;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,KAAK,oBAAoB,KAAK,iBAAiB,SAAS,GAAG;AAC7D,UAAM,KAAK,wBAAwB;AACnC,eAAW,KAAK,KAAK,kBAAkB;AACrC,YAAM,KAAK,KAAK,CAAC,EAAE;AAAA,IACrB;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,KAAK,sBAAsB;AAC7B,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,oCAAoC,GAAG,eAAe,aAAa,GAAG,OAAO,EAAE;AAC1F,UAAM,KAAK,gBAAgB,GAAG,SAAS,EAAE;AACzC,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,KAAK,qBAAqB;AAC5B,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,gCAAgC,GAAG,QAAQ,aAAa,GAAG,OAAO,EAAE;AAC/E,UAAM,KAAK,eAAe,GAAG,QAAQ,EAAE;AACvC,UAAM,KAAK,gBAAgB,GAAG,SAAS,EAAE;AACzC,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,KAAK,oBAAoB;AAC3B,UAAM,KAAK,uBAAuB;AAClC,UAAM,KAAK,SAAS;AACpB,UAAM,KAAK,KAAK,kBAAkB;AAClC,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,KAAK,qBAAqB;AAC5B,UAAM,KAAK,wCAAwC;AACnD,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,KAAK,mBAAmB;AACnC,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,cAAmD,aAA+B;AAC5G,MAAI,CAAC,gBAAgB,aAAa,WAAW,EAAG,QAAO,CAAC;AAExD,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,aAAa,WAAW,uBAAkB;AACrD,QAAM,KAAK,EAAE;AAEb,aAAW,UAAU,cAAc;AACjC,UAAM,KAAK,gBAAgB,OAAO,OAAO,EAAE;AAC3C,UAAM,KAAK,uBAAuB,OAAO,eAAe,EAAE;AAC1D,UAAM,KAAK,oBAAoB,OAAO,oBAAoB,EAAE;AAC5D,UAAM,KAAK,qBAAqB,OAAO,aAAa,EAAE;AACtD,QAAI,OAAO,aAAa;AACtB,YAAM,KAAK,mBAAmB,OAAO,WAAW,EAAE;AAAA,IACpD;AAEA,QAAI,OAAO,YAAY;AACrB,YAAM,KAAK,gBAAgB;AAC3B,YAAM,KAAK,SAAS;AACpB,YAAM,KAAK,OAAO,UAAU;AAC5B,YAAM,KAAK,KAAK;AAAA,IAClB;AAEA,QAAI,OAAO,UAAU;AACnB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,WAAW;AACtB,YAAM,KAAK,+BAA+B,OAAO,OAAO,aAAa;AACrE,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,OAAO,QAAQ;AAC1B,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,YAAY;AAAA,IACzB;AAEA,QAAI,OAAO,iBAAiB;AAC1B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,WAAW;AACtB,YAAM,KAAK,sCAAsC,OAAO,OAAO,wBAAwB;AACvF,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,OAAO,eAAe;AACjC,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,YAAY;AAAA,IACzB;AAEA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO;AACT;AAMA,SAAS,qBACP,aACA,OACU;AACV,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,qBAAqB;AAChC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,kNAAwC;AACnD,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,wEAAiB;AAC5B,QAAM,KAAK,EAAE;AAEb,aAAW,QAAQ,aAAa;AAC9B,UAAM,KAAK,cAAc,KAAK,OAAO,KAAK,KAAK,WAAW,EAAE;AAC5D,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,6BAAc,KAAK,SAAS,SAAS,EAAE;AAClD,QAAI,KAAK,iBAAiB;AACxB,YAAM,KAAK,yBAAe,KAAK,eAAe,IAAI;AAClD,YAAM,KAAK,mCAAe,gBAAgB,KAAK,eAAe,CAAC,EAAE;AAAA,IACnE;AACA,QAAI,KAAK,eAAe,UAAa,KAAK,aAAa,GAAG;AACxD,YAAM,KAAK,+CAAiB,KAAK,UAAU,EAAE;AAAA,IAC/C;AAGA,QAAI,KAAK,aAAa;AACpB,YAAM,OAAO,KAAK;AAClB,UAAI,KAAK,YAAY,UAAU;AAC7B,cAAM,KAAK,mDAAgB;AAC3B,cAAM,KAAK,WAAW;AACtB,cAAM,KAAK,KAAK,KAAK,UAAU,KAAK,WAAW,QAAQ,CAAC,EAAE;AAC1D,cAAM,KAAK,OAAO;AAAA,MACpB;AACA,UAAI,KAAK,qBAAqB;AAC5B,cAAM,KAAK,qEAAmB;AAC9B,cAAM,KAAK,aAAa;AACxB,cAAM,KAAK,qGAAoC;AAC/C,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK,KAAK,KAAK,mBAAmB,EAAE;AAC1C,cAAM,KAAK,OAAO;AAClB,cAAM,KAAK,cAAc;AAAA,MAC3B;AACA,UAAI,KAAK,sBAAsB;AAC7B,cAAM,KAAK,mDAAyC,KAAK,qBAAqB,eAAe,aAAa,KAAK,qBAAqB,OAAO,EAAE;AAC7I,cAAM,KAAK,qBAAW,KAAK,qBAAqB,SAAS,EAAE;AAAA,MAC7D;AACA,UAAI,KAAK,qBAAqB;AAC5B,cAAM,KAAK,+CAAqC,KAAK,oBAAoB,QAAQ,aAAa,KAAK,oBAAoB,OAAO,EAAE;AAChI,cAAM,KAAK,qBAAW,KAAK,oBAAoB,QAAQ,EAAE;AAAA,MAC3D;AAAA,IACF;AAGA,QAAI,MAAM,wBAAwB;AAChC,YAAM,aAAa,MAAM,uBAAuB;AAAA,QAC9C,CAAC,MAAM,EAAE,gBAAgB,KAAK;AAAA,MAChC;AACA,UAAI,YAAY;AACd,YAAI,WAAW,gBAAgB;AAC7B,gBAAM,KAAK,wCAAoB,WAAW,cAAc,EAAE;AAAA,QAC5D;AACA,YAAI,WAAW,YAAY;AACzB,gBAAM,KAAK,2CAAuB,WAAW,UAAU,EAAE;AAAA,QAC3D;AACA,YAAI,WAAW,mBAAmB;AAChC,gBAAM,KAAK,mCAAe,WAAW,iBAAiB,EAAE;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,QAAM,KAAK,sDAAc;AACzB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,OAAO,MAAM,eAAe,cAAc,YAAY,IAAI,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC,GAAG;AAC1G,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,kEAAgB;AAC3B,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,SAAS;AACpB,QAAM,KAAK,iCAAiC,MAAM,eAAe,gBAAgB;AACjF,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AAEb,SAAO;AACT;AAMA,SAAS,qBACP,QACA,cACU;AACV,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,oBAAoB;AAC/B,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,gIAAsC;AACjD,QAAM,KAAK,EAAE;AAEb,QAAM,WAAWC,cAAa,OAAO,KAAK;AAE1C,QAAM,KAAK,GAAG,yBAAyB,CAAC;AAExC,MAAI,OAAO,aAAa,OAAO,UAAU,aAAa,GAAG;AACvD,UAAM,KAAK,GAAG,uBAAuB,OAAO,SAAS,CAAC;AAAA,EACxD;AAEA,QAAM,KAAK,GAAG,8BAA8B,cAAc,QAAQ,CAAC;AACnE,QAAM,KAAK,GAAG,wBAAwB,QAAQ,CAAC;AAE/C,QAAM,cAAc,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AAChE,QAAM,KAAK,GAAG,kCAAkC,WAAW,CAAC;AAC5D,QAAM,KAAK,GAAG,4BAA4B,cAAc,QAAQ,CAAC;AACjE,QAAM,KAAK,GAAG,6BAA6B,QAAQ,CAAC;AACpD,QAAM,KAAK,GAAG,8BAA8B,YAAY,CAAC;AAEzD,SAAO;AACT;AAGA,SAASA,cAAa,OAAqD;AACzE,QAAM,SAAgC,CAAC;AACvC,aAAW,QAAQ,OAAO;AACxB,WAAO,KAAK,IAAI;AAChB,QAAI,KAAK,gBAAgB;AACvB,iBAAW,aAAa,KAAK,gBAAgB;AAC3C,eAAO,KAAK,GAAGA,cAAa,SAAS,CAAC;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,4BAA4B,OAAkD;AAClG,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,oBAAoB;AAC/B,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,iBAAiB;AAC5B,QAAM,KAAK,gBAAe,oBAAI,KAAK,GAAE,YAAY,CAAC,EAAE;AACpD,QAAM,KAAK,sBAAsB,OAAO,gBAAgB,EAAE;AAC1D,QAAM,KAAK,2BAA2B,MAAM,eAAe,EAAE;AAC7D,QAAM,KAAK,oBAAoB,OAAO,QAAQ,EAAE;AAChD,QAAM,UAAU,OAAO,UACnB,YACA,OAAO,SAAS,IACd,WACA,MAAM,eACJ,UACA;AACR,QAAM,KAAK,kBAAkB,OAAO,EAAE;AACtC,QAAM,KAAK,EAAE;AAGb,MAAI,MAAM,cAAc,MAAM,WAAW,SAAS,GAAG;AACnD,UAAM,KAAK,yBAAyB;AACpC,UAAM,KAAK,GAAG,sBAAsB,MAAM,UAAU,CAAC;AACrD,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,MAAM,mBAAmB;AAC3B,UAAM,KAAK,MAAM;AACjB,UAAM,KAAK,uBAAuB;AAClC,UAAM,KAAK,eAAe,GAAG,IAAI,EAAE;AACnC,UAAM,KAAK,oBAAoB,GAAG,QAAQ,EAAE;AAC5C,UAAM,KAAK,wCAAwC,GAAG,YAAY,EAAE;AACpE,UAAM,KAAK,uBAAuB,GAAG,WAAW,EAAE;AAClD,UAAM,KAAK,kCAAkC,GAAG,UAAU,EAAE;AAC5D,QAAI,GAAG,OAAO;AACZ,YAAM,KAAK,cAAc;AACzB,iBAAW,QAAQ,GAAG,MAAM,MAAM,IAAI,GAAG;AACvC,cAAM,KAAK,OAAO,IAAI,EAAE;AAAA,MAC1B;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,MAAM,cAAc;AACtB,UAAM,KAAK,kBAAkB;AAC7B,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,MAAM,YAAY;AAC7B,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,QAAM,KAAK,sBAAsB;AACjC,QAAM,KAAK,sBAAsB,OAAO,UAAU,EAAE;AACpD,QAAM,KAAK,mBAAmB,OAAO,QAAQ,EAAE;AAC/C,QAAM,KAAK,oBAAoB,OAAO,SAAS,EAAE;AACjD,QAAM,KAAK,iBAAiB,OAAO,MAAM,EAAE;AAC3C,QAAM,KAAK,kBAAkB,OAAO,OAAO,EAAE;AAC7C,QAAM,KAAK,kBAAkB,OAAO,OAAO,EAAE;AAC7C,QAAM,KAAK,mBAAmB,OAAO,eAAe,IAAI;AACxD,QAAM,KAAK,EAAE;AAGb,QAAM,eAAeA,cAAa,OAAO,KAAK;AAC9C,QAAM,eAAe,aAAa,OAAO,CAAC,MAAM,EAAE,eAAe,SAAS;AAC1E,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,kBAAkB,aAAa,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AACxE,UAAM,eAAe,aAAa;AAAA,MAChC,CAAC,MAAM,EAAE,WAAW,cAAc,CAAC,EAAE,iBAAiB,EAAE,kBAAkB;AAAA,IAC5E;AACA,UAAM,iBAAiB,aAAa;AAAA,MAClC,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,iBAAiB,EAAE,kBAAkB;AAAA,IAC1E;AAEA,UAAM,KAAK,oBAAoB;AAC/B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,8BAA8B,aAAa,MAAM,EAAE;AAC9D,UAAM,KAAK,gCAAgC,eAAe,MAAM,EAAE;AAClE,UAAM,KAAK,mCAAmC,aAAa,MAAM,EAAE;AACnE,UAAM,KAAK,iBAAiB,gBAAgB,MAAM,EAAE;AACpD,UAAM,KAAK,EAAE;AAEb,QAAI,gBAAgB,SAAS,GAAG;AAC9B,YAAM,KAAK,sBAAsB;AACjC,YAAM,KAAK,EAAE;AACb,iBAAW,QAAQ,iBAAiB;AAClC,cAAM,KAAK,aAAa,KAAK,OAAO,OAAO,KAAK,WAAW,MAAM,KAAK,SAAS,SAAS,EAAE;AAAA,MAC5F;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,QAAI,aAAa,SAAS,GAAG;AAC3B,YAAM,KAAK,qCAAqC;AAChD,YAAM,KAAK,EAAE;AACb,iBAAW,QAAQ,cAAc;AAC/B,cAAM,KAAK,aAAa,KAAK,OAAO,OAAO,KAAK,WAAW,uCAAuC;AAAA,MACpG;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAGA,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,UAAM,KAAK,iBAAiB;AAC5B,eAAW,QAAQ,OAAO,OAAO;AAC/B,YAAM,KAAK,GAAG,iBAAiB,MAAM,EAAE,CAAC;AAAA,IAC1C;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,QAAM,cAAc,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ;AACpE,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,KAAK,4BAA4B;AACvC,UAAM,KAAK,EAAE;AAEb,eAAW,QAAQ,aAAa;AAE9B,UAAI,KAAK,gBAAgB,KAAK,aAAa,SAAS,GAAG;AACrD,cAAM,KAAK,GAAG,mBAAmB,KAAK,cAAc,KAAK,OAAO,CAAC;AAAA,MACnE;AAGA,UAAI,KAAK,aAAa;AACpB,cAAM,KAAK,GAAG,kBAAkB,KAAK,aAAa,KAAK,OAAO,CAAC;AAAA,MACjE;AAGA,UAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,gBAAgB,KAAK,aAAa,WAAW,IAAI;AAC/E,cAAM,KAAK,aAAa,KAAK,OAAO,oBAAe;AACnD,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,cAAc,KAAK,SAAS,SAAS,EAAE;AAClD,YAAI,KAAK,iBAAiB;AACxB,gBAAM,KAAK,iBAAiB,KAAK,eAAe,EAAE;AAAA,QACpD;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAGA,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,KAAK,GAAG,qBAAqB,aAAa,KAAK,CAAC;AAAA,EACxD;AAGA,QAAM,eAAe,MAAM,eAAe,MAAM,aAAa,MAAM,YAAY,IAAI,CAAC;AAGpF,QAAM,KAAK,GAAG,qBAAqB,QAAQ,YAAY,CAAC;AAGxD,QAAM,iBAAiB,IAAI,IAAI,YAAY,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAChE,QAAM,KAAK,GAAG,uBAAuB,cAAc;AAAA,IACjD,sBAAsB;AAAA,IACtB;AAAA,EACF,CAAC,CAAC;AAEF,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACrgBA,SAAS,aAAAC,YAAW,SAAAC,cAAa;AACjC,SAAS,WAAAC,gBAAe;AAExB,eAAe,gBACb,iBACA,QACA,SAOiB;AACjB,QAAM,gBAAgB,MAAM,4BAA4B;AAAA,IACtD;AAAA,IACA;AAAA,IACA,cAAc,QAAQ;AAAA,IACtB,cAAc,QAAQ;AAAA,IACtB,YAAY,QAAQ;AAAA,IACpB,mBAAmB,QAAQ;AAAA,IAC3B,wBAAwB,QAAQ;AAAA,EAClC,CAAC;AACD,QAAM,aAAa,gBAAgB,QAAQ,UAAU,YAAY;AACjE,QAAMD,OAAMC,SAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,QAAMF,WAAU,YAAY,eAAe,OAAO;AAClD,SAAO;AACT;AAEA,eAAe,OAAO;AACpB,QAAM,aAAa,YAAY,IAAI;AACnC,QAAM,SAAS,MAAM,UAAU;AAG/B,QAAM,SAAS,UAAU,OAAO,MAAM;AACtC,QAAM,WAAW,YAAY,MAAM;AACnC,SAAO,OAAO;AAGd,SAAO,wBAAwB,SAAS,SAAS;AACjD,SAAO,wBAAwB,SAAS,SAAS;AACjD,SAAO,yBAAyB,SAAS,SAAS;AAElD,sBAAoB,QAAQ,QAAQ;AAEpC,QAAM,UAAU,OAAO,aAAa;AACpC,QAAM,aAAa,yBAAyB,MAAM;AAGlD,QAAM,eAAe,OAAO,gBAAgB;AAC5C,QAAM,eACH,iBAAiB,SAAU,CAAC,CAAC,OAAO;AAGvC,QAAM,YAAY,eACd,IAAI;AAAA,IACF,eAAe,OAAO,cAAe,cAAgD;AAAA,MACnF,cAAc,OAAO;AAAA,MACrB,mBAAmB,OAAO;AAAA,IAC5B,CAAC;AAAA,EACH,IACA;AAGJ,QAAM,uBAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,OAAO;AAAA,EACT;AAGA,QAAM,uBAAuB,2BAA2B,OAAO,YAAY,SAAS;AAEpF,QAAM,OAAO,cAAc,uCAAuC,sBAAsB;AACxF,MAAI,KAAK,SAAS,gBAAgB,QAAQ,CAAC,EAAE;AAC7C,MAAI,KAAK,gBAAgB,OAAO,eAAe,EAAE;AACjD,MAAI,KAAK,aAAa,OAAO,QAAQ,EAAE;AACvC,MAAI,OAAO,SAAS;AAClB,QAAI,KAAK,EAAE,oBAAoB,CAAC;AAAA,EAClC;AACA,MAAI,OAAO,OAAO;AAChB,QAAI,KAAK,EAAE,kBAAkB,EAAE,QAAQ,WAAW,OAAO,MAAM,QAAQ,eAAe,SAAS,CAAC,CAAC;AAAA,EACnG;AACA,MAAI,OAAO,aAAa;AACtB,QAAI,KAAK,mBAAmB;AAC5B,QAAI,KAAK,gBAAgB,OAAO,cAAc,CAAC,EAAE;AACjD,QAAI,KAAK,4BAA4B,OAAO,yBAAyB,CAAC,EAAE;AACxE,QAAI,KAAK,mBAAmB,OAAO,sBAAsB,YAAY,UAAU,EAAE;AACjF,QAAI,KAAK,mBAAmB,OAAO,sBAAsB,YAAY,UAAU,EAAE;AACjF,QAAI,KAAK,oBAAoB,OAAO,uBAAuB,YAAY,UAAU,EAAE;AAAA,EACrF;AACA,MAAI,OAAO,cAAc,QAAW;AAClC,QAAI,KAAK,eAAe,OAAO,SAAS,IAAI;AAAA,EAC9C;AACA,MAAI,OAAO,eAAe;AACxB,QAAI,KAAK,gBAAgB,OAAO,aAAa,EAAE;AAAA,EACjD;AACA,MAAI,OAAO,iBAAiB;AAC1B,QAAI,KAAK,oBAAoB,OAAO,gBAAgB,MAAM,IAAI,EAAE,MAAM,SAAS;AAAA,EACjF;AACA,MAAI,OAAO,WAAW,OAAO,KAAK,OAAO,QAAQ,MAAM,EAAE,SAAS,GAAG;AACnE,QAAI,KAAK,YAAY,OAAO,KAAK,OAAO,QAAQ,MAAM,EAAE,MAAM,cAAc;AAAA,EAC9E;AACA,MAAI,OAAO,kBAAkB;AAC3B,QAAI,KAAK,yBAAyB;AAAA,EACpC;AACA,MAAI,iBAAiB,OAAO;AAC1B,QAAI,KAAK,kBAAkB,YAAY,EAAE;AAAA,EAC3C;AACA,MAAI,OAAO,YAAY;AACrB,QAAI,KAAK,WAAW,OAAO,UAAU,EAAE;AAAA,EACzC;AACA,MAAI,OAAO,aAAa;AACtB,QAAI,KAAK,gBAAgB;AAAA,EAC3B;AAGA,QAAM,YAAY,iBAAiB,aAAa;AAChD,QAAM,mBAAmB,MAAM,iBAAiB,cAAc;AAG9D,MAAI,OAAO,aAAa;AACtB,WAAO,oBAAoB,yBAAyB,OAAO,cAAc,CAAC;AAAA,EAC5E;AAGA,QAAM,cAAc,MAAM,sBAAsB,OAAO,eAAe;AAGtE,oBAAkB,YAAY,MAAM,QAAQ,QAAQ;AAGpD,QAAM,oBAAuC;AAAA,IAC3C,MAAM,YAAY,SAAS;AAAA,IAC3B,UAAU,YAAY,SAAS;AAAA,IAC/B,cAAc,YAAY,SAAS;AAAA,IACnC,aAAa,YAAY,SAAS;AAAA,IAClC,YAAY,YAAY,SAAS;AAAA,IACjC,OAAO,YAAY;AAAA,EACrB;AAGA,QAAM,gBAAgB,OAAO,sBACzB,MAAM,UAAU,OAAO,eAAe,IACtC;AAGJ,QAAM,eAAe,SAAS,OAAO;AACrC,QAAM,kBAAkB,IAAI,gBAAgB;AAC5C,MAAI;AACJ,MAAI,OAAO,SAAS,YAAY,GAAG;AACjC,gBAAY,WAAW,MAAM,gBAAgB,MAAM,GAAG,YAAY;AAAA,EACpE;AAEA,MAAI;AAEF,UAAM,OAAO,MAAM,cAAc,aAAa,MAAM;AAGpD,QAAI;AACJ,QAAI,OAAO,cAAc;AACvB,iBAAW,MAAM,aAAa,OAAO,YAAY;AACjD,yBAAmB,SAAS,QAAQ,QAAQ;AAC5C,UAAI,KAAK,cAAc,SAAS,MAAM,OAAO;AAAA,IAC/C;AAGA,gBAAY,MAAM,aAAa,UAAU,MAAM;AAC/C,UAAM,YAAY,MAAM,YAAY;AACpC,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,wBAAwB,CAAC;AAClC,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,QAAQ,IAAI,aAAa;AAC/B,UAAM,KAAK,KAAK,kBAAkB,QAAQ,KAAK,kBAAkB,aAAa;AAE9E,QAAI,OAAO,gBAAgB,UAAU;AAEnC,YAAM,cAAc,MAAM;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,iBAAiB;AAAA,QACxB;AAAA,UACE;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,eAAe;AAAA,UACf,aAAa,gBAAgB;AAAA,QAC/B;AAAA,MACF;AAEA,UAAI,OAAO,aAAa;AACtB,yBAAiB,WAAW;AAE5B,mBAAW,OAAO,YAAY,MAAM;AAClC,cAAI,IAAI,OAAO,SAAS,KAAK,IAAI,OAAO,SAAS;AAC/C,kBAAM,cAAc,MAAM;AAAA,cACxB,IAAI;AAAA,cACJ;AAAA,cACA,OAAO,yBAAyB;AAAA,cAChC,OAAO;AAAA,YACT;AACA,gBAAI,KAAK;AAAA,eAAQ,IAAI,QAAQ,oCAA0B;AACvD,6BAAiB,WAAW;AAAA,UAC9B;AAAA,QACF;AACA,cAAM,WAAW,MAAM,qBAAqB,eAAe,WAAW,CAAC;AAAA,MACzE,OAAO;AACL,yBAAiB,WAAW;AAC5B,cAAM,WAAW,MAAM,qBAAqB,eAAe,WAAW,CAAC;AAAA,MACzE;AAGA,UAAI,YAAY,SAAS,KAAK,OAAO,aAAa;AAChD,mBAAW,OAAO,YAAY,MAAM;AAClC,cAAI,IAAI,OAAO,SAAS,KAAK,IAAI,OAAO,WAAW,OAAO,aAAa;AACrE,kBAAM,aAAa,MAAM,gBAAgB,OAAO,iBAAiB,IAAI,QAAQ;AAAA,cAC3E,cAAc,OAAO;AAAA,cACrB;AAAA,cACA;AAAA,YACF,CAAC;AACD,gBAAI,KAAK,sBAAsB,UAAU,KAAK,IAAI,QAAQ,GAAG;AAE7D,kBAAM,qBAAqB,YAAY,YAAY,oBAAoB,IAAI,QAAQ;AACnF,gBAAI,CAAC,OAAO,YAAa;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,eAAe,YAAY,IAAI,IAAI,UAAU,CAAC,EAAE;AAChE,UAAI,YAAY,SAAS,EAAG,SAAQ,KAAK,CAAC;AAAA,IAC5C,OAAO;AAEL,YAAM,YAAY,IAAI,kBAAkB;AACxC,YAAM,kBAAkB,OAAO,YAC3B,IAAI,gBAAgB,OAAO,SAAS,IACpC;AAEJ,YAAM,YAAY,YAAY,IAAI;AAClC,YAAM,SAAS,MAAM,QAAQ,QAAQ,aAAa;AAAA,QAChD;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,aAAa,gBAAgB;AAAA,MAC/B,CAAC;AACD,UAAI,KAAK,wBAAwB,eAAe,YAAY,IAAI,IAAI,SAAS,CAAC,GAAG;AAGjF,YAAM,iBAAiB,cAAc,WAAW;AAChD,UAAI,eAAe,aAAa,GAAG;AACjC,eAAO,YAAY;AAAA,MACrB;AAGA,UAAI,UAAU,gBAAgB,EAAE,SAAS,KAAK,OAAO,WAAW;AAC9D,mBAAW,cAAc,UAAU,gBAAgB,GAAG;AACpD,gBAAM,UAAU,YAAY,YAAY,GAAG,OAAO,SAAS,IAAI,UAAU,SAAS,MAAM;AACxF,gBAAM,UAAU,YAAY,YAAY,GAAG,OAAO,SAAS,IAAI,UAAU,QAAQ,KAAK;AACtF,cAAI,KAAK,yBAAyB,OAAO,SAAS,IAAI,UAAU,UAAU,OAAO,SAAS,IAAI,UAAU,MAAM;AAAA,QAChH;AAAA,MACF;AAGA,UAAI,OAAO,kBAAkB,mBAAmB,gBAAgB,kBAAkB,EAAE,SAAS,GAAG;AAC9F,cAAM,MAAM,gBAAgB,kBAAkB;AAC9C,cAAM,aAAa,MAAM,gBAAgB,cAAc,KAAK,YAAY;AACxE,YAAI,KAAK,qBAAqB,UAAU,EAAE;AAAA,MAC5C;AAEA,UAAI;AAEJ,UAAI,OAAO,aAAa;AAEtB,cAAM,gBAAgB,YAAY,IAAI;AACtC,cAAM,cAAc,MAAM;AAAA,UACxB;AAAA,UACA;AAAA,UACA,OAAO,yBAAyB;AAAA,UAChC,OAAO;AAAA,QACT;AACA,YAAI,KAAK,uBAAuB,eAAe,YAAY,IAAI,IAAI,aAAa,CAAC,GAAG;AAEpF,yBAAiB,WAAW;AAC5B,iCAAyB,YAAY;AAErC,cAAM,YAAY,OAAO,SAAS,KAAK,OAAO,WAAW,YAAY,aAAa,SAAS;AAC3F,YAAI,WAAW;AACb,gBAAM,WAAW,MAAM,qBAAqB,qBAAqB,WAAW,KAAK,QAAQ,QAAQ,CAAC;AAAA,QACpG;AAAA,MACF,OAAO;AACL,oBAAY,MAAM;AAClB,cAAM,WAAW,MAAM,qBAAqB,eAAe,MAAM,CAAC;AAAA,MACpE;AAGA,UAAI,OAAO,SAAS,KAAK,OAAO,WAAW,OAAO,aAAa;AAC7D,cAAM,aAAa,MAAM,gBAAgB,OAAO,iBAAiB,QAAQ;AAAA,UACvE,cAAc,OAAO;AAAA,UACrB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,YAAI,KAAK,sBAAsB,UAAU,EAAE;AAE3C,cAAM,qBAAqB,YAAY,OAAO,gBAAgB;AAAA,MAChE;AAEA,YAAM,UAAU,eAAe,YAAY,IAAI,IAAI,UAAU,CAAC,EAAE;AAChE,UAAI,OAAO,SAAS,KAAK,OAAO,QAAS,SAAQ,KAAK,CAAC;AAAA,IACzD;AAAA,EACF,UAAE;AACA,QAAI,cAAc,OAAW,cAAa,SAAS;AAEnD,QAAI,eAAe;AACjB,YAAM,UAAU,aAAa;AAAA,IAC/B;AACA,UAAM,qBAAqB,UAAU;AACrC,UAAM,qBAAqB,UAAU;AACrC,UAAM,WAAW,QAAQ;AAAA,EAC3B;AACF;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,SAAO,gBAAgB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAC/E,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["join","p","readFile","z","z","z","z","z","z","operand","createHash","createHash","content","join","p","reason","msg","p","z","z","displayCaptures","p","readFile","readFile","readFile","basename","readFile","basename","z","z","tag","flattenSteps","writeFile","mkdir","dirname"]}
|