@embedpdf/core-acrojs 3.0.0-next.13 → 3.0.0-next.15
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/index.cjs +141 -128
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +30 -26
- package/dist/index.d.ts +30 -26
- package/dist/index.js +141 -128
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":[],"sources":["../src/actions.ts","../src/color.ts","../src/types.ts","../src/host.ts","../src/input.ts","../src/prelude.ts"],"sourcesContent":["import type { PdfActionNode, PdfActionTree } from '@embedpdf/engine-core/runtime';\n\n/**\n * Return executable JavaScript in PDF action order (root, then `/Next`\n * depth-first). A poisoned native snapshot is never partially executed.\n */\nexport function javaScriptSourcesFromActionTree(tree: PdfActionTree): string[] {\n if (tree.incomplete) {\n throw new Error('Refusing to execute an incomplete PDF action tree');\n }\n\n const sources: string[] = [];\n const visit = (node: PdfActionNode): void => {\n // Only the javascript arm is collected; rendition `/JS` deliberately\n // waits for a rendition interpreter.\n if (node.type === 'javascript') sources.push(node.script);\n for (const child of node.next) visit(child);\n };\n if (tree.root) visit(tree.root);\n return sources;\n}\n\n/** One event source that preserves the tree's shared field overlay. */\nexport function javaScriptProgramFromActionTree(tree: PdfActionTree): string {\n return javaScriptSourcesFromActionTree(tree).join('\\n;\\n');\n}\n","import type { ScriptColorArray } from './types';\n\n/**\n * Host-side Acrobat color-array conversions — the commit sinks and world\n * builders cross the Acrobat-array ↔ renderer-color boundary through these.\n * The PRELUDE inlines its own identical formulas (it must stay\n * self-contained); `prelude.test.ts` pins the two implementations together.\n *\n * Conversion vectors (the documented Acrobat semantics):\n * G → RGB: replicate the gray component.\n * CMYK → RGB: component = 1 − min(1, channel + k).\n * RGB → G: luminosity 0.3r + 0.59g + 0.11b.\n * RGB → CMYK: k = 1 − max(r,g,b); channels = 1 − component − k.\n * T (transparent) converts to itself only.\n */\nexport function scriptColorToRgb(\n color: ScriptColorArray,\n): { r: number; g: number; b: number } | null {\n switch (color[0]) {\n case 'T':\n return null;\n case 'G':\n return { r: color[1], g: color[1], b: color[1] };\n case 'RGB':\n return { r: color[1], g: color[2], b: color[3] };\n case 'CMYK': {\n const [, c, m, y, k] = color;\n return {\n r: 1 - Math.min(1, c + k),\n g: 1 - Math.min(1, m + k),\n b: 1 - Math.min(1, y + k),\n };\n }\n }\n}\n\nconst clamp01 = (value: number): number => Math.min(1, Math.max(0, value));\nconst hex = (value: number): string =>\n Math.round(clamp01(value) * 255)\n .toString(16)\n .padStart(2, '0');\n\n/** Acrobat array → CSS hex, or null for transparent. */\nexport function scriptColorToCss(color: ScriptColorArray): string | null {\n const rgb = scriptColorToRgb(color);\n return rgb === null ? null : `#${hex(rgb.r)}${hex(rgb.g)}${hex(rgb.b)}`;\n}\n\n/** CSS hex (#rgb/#rrggbb) → Acrobat RGB array; null/undefined → transparent. */\nexport function cssToScriptColor(css: string | null | undefined): ScriptColorArray {\n if (!css) return ['T'];\n const raw = css.trim().replace(/^#/, '');\n const long =\n raw.length === 3\n ? raw\n .split('')\n .map((ch) => ch + ch)\n .join('')\n : raw;\n if (!/^[0-9a-fA-F]{6}$/.test(long)) return ['T'];\n const channel = (offset: number) => parseInt(long.slice(offset, offset + 2), 16) / 255;\n return ['RGB', channel(0), channel(2), channel(4)];\n}\n\n/** Structural validation for values scripts assign. */\nexport function isScriptColorArray(value: unknown): value is ScriptColorArray {\n if (!Array.isArray(value) || value.length === 0) return false;\n const [space, ...parts] = value as [unknown, ...unknown[]];\n const counts: Record<string, number> = { T: 0, G: 1, RGB: 3, CMYK: 4 };\n const expected = counts[String(space)];\n return (\n expected !== undefined &&\n parts.length === expected &&\n parts.every((part) => typeof part === 'number' && Number.isFinite(part))\n );\n}\n","import type {\n AnnotationRef,\n FormEffect,\n FormFieldDisplay,\n FormFieldFamily,\n FormFieldRef,\n} from '@embedpdf/engine-core/runtime';\n\n/** JSON-safe value vocabulary exposed through Acrobat's `event` and `Field`. */\nexport type ScriptValue = string | number | boolean | null | string[];\n\nexport interface ScriptFieldOption {\n label: string;\n value: string;\n}\n\n/** Detached field state supplied to one script transaction. */\nexport interface ScriptFieldInput {\n ref: FormFieldRef;\n name: string;\n family: FormFieldFamily;\n value: ScriptValue;\n defaultValue: ScriptValue;\n display: FormFieldDisplay;\n readOnly: boolean;\n required: boolean;\n options?: ScriptFieldOption[];\n}\n\nexport interface ScriptIdentity {\n /** Acrobat `identity.name`. Empty when the embedder did not configure it. */\n name: string;\n loginName: string;\n corporation: string;\n email: string;\n}\n\nexport interface ScriptDocumentInput {\n id: string;\n fileName: string;\n pageCount: number;\n /** Zero-based current page, matching Acrobat `this.pageNum`. */\n pageNumber: number;\n}\n\n/** Required deterministic environment. `utcOffsetMinutes` is local minus UTC. */\nexport interface ScriptEnvironment {\n nowMs: number;\n utcOffsetMinutes: number;\n randomSeed: number;\n}\n\nexport type ScriptEventKind =\n | 'name-tree-boot'\n | 'widget-activate'\n | 'field-keystroke'\n | 'field-validate'\n | 'field-calculate'\n | 'field-format';\n\nexport interface ScriptEventInput {\n kind: ScriptEventKind;\n /**\n * Explicit Acrobat `event.type` / `event.name` overrides for action-driven\n * runs (built from the dispatcher's trigger provenance — `Field` × `Mouse\n * Enter`, `Page` × `Open`, …; the `Annot` type is an EmbedPDF EXTENSION,\n * Acrobat has no event type for plain-annotation events). When omitted the\n * prelude derives them from `kind` (the K/V/C/F pipeline path).\n */\n type?: string;\n name?: string;\n target?: FormFieldRef;\n source?: FormFieldRef;\n value?: ScriptValue;\n change?: string;\n selStart?: number;\n selEnd?: number;\n willCommit?: boolean;\n modifier?: boolean;\n shift?: boolean;\n}\n\n/**\n * An Acrobat color: `['T']` transparent, `['G', g]`, `['RGB', r, g, b]`,\n * `['CMYK', c, m, y, k]` — components 0..1. The wire format scripts read and\n * write; conversion to renderer/engine colors happens host-side (color.ts).\n */\nexport type ScriptColorArray =\n | ['T']\n | ['G', number]\n | ['RGB', number, number, number]\n | ['CMYK', number, number, number, number];\n\n/**\n * One script-addressable annotation in the prefetched world — every subtype\n * EXCEPT link and widget (Acrobat serves those through `Link`/`Field`\n * objects; here they are separate event planes). Curated read surface only —\n * never a raw dictionary.\n */\nexport interface ScriptAnnotInput {\n ref: AnnotationRef;\n /** `/NM` — the `getAnnot(nPage, name)` key. Empty when the PDF has none. */\n name: string;\n /** The engine subtype (e.g. `'square'`). */\n subtype: string;\n /** Zero-based page index (Acrobat's `page`). */\n page: number;\n /** PDF-space `[llx, lly, urx, ury]`. */\n rect: [number, number, number, number];\n contents: string;\n /** `/T` author and `/Subj` — read-only in v1 (collab identity stamping). */\n author: string;\n subject: string;\n strokeColor: ScriptColorArray;\n fillColor: ScriptColorArray;\n opacity: number;\n /** `/BS /W` border width in points. */\n width: number;\n /** Border style: `'S'` solid or `'D'` dashed. */\n borderStyle: 'S' | 'D';\n dash: number[];\n hidden: boolean;\n print: boolean;\n readOnly: boolean;\n locked: boolean;\n noView: boolean;\n toggleNoView: boolean;\n /** True for kinds whose appearance cannot be re-derived from properties\n * (stamps, images): appearance writes are refused with a diagnostic. */\n opaqueBody: boolean;\n}\n\n/** The curated WRITE patch one script staged for one annotation — a\n * canonical per-annot diff (last-write-wins per key, derived at run end\n * exactly like form effects). Visibility keys ride `flags` so the commit\n * sink maps them onto ONE engine flags patch. */\nexport interface ScriptAnnotEffect {\n ref: AnnotationRef;\n patch: {\n strokeColor?: ScriptColorArray;\n fillColor?: ScriptColorArray;\n opacity?: number;\n width?: number;\n borderStyle?: 'S' | 'D';\n dash?: number[];\n rect?: [number, number, number, number];\n contents?: string;\n flags?: Partial<{\n hidden: boolean;\n print: boolean;\n readOnly: boolean;\n locked: boolean;\n noView: boolean;\n toggleNoView: boolean;\n }>;\n };\n}\n\n/**\n * The writable-property validity matrix, keyed by engine subtype — the ONE\n * exported table (the prelude inlines an identical copy; a parity test pins\n * them together, and plugin-annotation drift-guards this against the kind\n * registry's PropSpecs). Flags + contents are writable everywhere\n * script-addressable; appearance keys vary by kind.\n */\nexport const ANNOT_WRITABLE_KEYS: Readonly<Record<string, readonly string[]>> = Object.freeze({\n square: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n circle: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n polygon: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n polyline: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n line: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n ink: ['strokeColor', 'opacity', 'width', 'rect'],\n 'free-text': ['strokeColor', 'fillColor', 'opacity', 'rect'],\n highlight: ['strokeColor', 'opacity'],\n underline: ['strokeColor', 'opacity'],\n squiggly: ['strokeColor', 'opacity'],\n strikeout: ['strokeColor', 'opacity'],\n caret: ['strokeColor', 'opacity'],\n text: ['strokeColor', 'opacity', 'rect'],\n stamp: ['rect'],\n 'file-attachment': ['strokeColor', 'opacity'],\n});\n\n/** Complete input for one deterministic run. No ambient host values are read. */\nexport interface ScriptInput {\n document: ScriptDocumentInput;\n identity: ScriptIdentity;\n environment: ScriptEnvironment;\n fields: ScriptFieldInput[];\n /** The prefetched annots plane (page-scoped — see the D6 deviation). */\n annots?: ScriptAnnotInput[];\n /** Zero-based page indexes the plane covers. */\n annotPages?: number[];\n /** True when annotPages spans the whole document (no scope diagnostic). */\n annotsCoverDocument?: boolean;\n event: ScriptEventInput;\n}\n\nexport type ScriptUiEffect =\n | { kind: 'alert'; message: string; icon: number; title?: string }\n | { kind: 'print' }\n | { kind: 'gotoPage'; page: number }\n /** `doc.submitForm(...)` — a submit INTENT, resolved and sink-routed\n * outside the VM (never a network call from here). `fieldNames` are\n * include-mode (Acrobat's aFields); `null` = the whole eligible form. */\n | {\n kind: 'submitForm';\n url: string | null;\n fieldNames: string[] | null;\n includeEmpty: boolean;\n format?: 'fdf' | 'html' | 'xfdf' | 'pdf';\n method?: 'post' | 'get';\n };\n\nexport type ScriptDiagnosticCode =\n | 'blocked-network'\n | 'unsupported-api'\n | 'invalid-field-value'\n // A script failed and was degraded to a warning. Boot errors must never\n // disable interactive filling, and a K/V/C/F exception must never destroy\n // the user's input (only an explicit `event.rc = false` rejects).\n | 'script-error'\n // A script-produced UI effect was withheld by permission (e.g. a print\n // request without `doc.print` authority) — observable, never silent.\n | 'ui-effect-suppressed';\n\nexport interface ScriptDiagnostic {\n code: ScriptDiagnosticCode;\n message: string;\n}\n\n// ── the sandbox contract (owned HERE; implementations re-export) ──────────\n// core-js-sandbox depends on this package, so the structural interface must\n// live on this side of the edge — the reverse import would be a cycle.\n\n/** One isolated, stateful Acrobat-JavaScript realm for one PDF document. */\nexport interface ScriptSandbox {\n /** True after explicit disposal or a resource/runtime fault. */\n readonly disposed: boolean;\n /** Evaluate document name-tree sources once. Top-level effects are returned\n * so the orchestrator can include them in the first transaction. */\n boot(sources: string[], input: ScriptInput, budget?: ScriptBudget): ScriptOutput;\n /** Run one event program against the realm's persistent globals. */\n run(source: string, input: ScriptInput, budget?: ScriptBudget): ScriptOutput;\n /** Release the realm. Idempotent. */\n dispose(): void;\n}\n\nexport type ScriptSandboxFactory = () => Promise<ScriptSandbox>;\n\nexport interface ScriptExecutionError {\n kind: 'exception' | 'budget' | 'invalid-output';\n message: string;\n stack?: string;\n}\n\nexport interface ScriptEventOutput {\n rc: boolean;\n value: ScriptValue;\n change: string;\n selStart: number;\n selEnd: number;\n}\n\n/**\n * Effects are committed only by the originating client's orchestrator, in\n * the DECLARED cross-plane order: `formEffects` first (field order — matching\n * the derive-by-diff model), then `annotEffects` (annot order); the first\n * failing effect marks every later effect in BOTH streams skipped.\n */\nexport interface ScriptOutput {\n event: ScriptEventOutput;\n formEffects: FormEffect[];\n annotEffects: ScriptAnnotEffect[];\n uiEffects: ScriptUiEffect[];\n diagnostics: ScriptDiagnostic[];\n error?: ScriptExecutionError;\n}\n\nexport interface ScriptBudget {\n maxExecutionMs: number;\n maxMemoryBytes: number;\n maxStackBytes: number;\n maxEffects: number;\n maxOutputBytes: number;\n}\n\nexport const DEFAULT_SCRIPT_BUDGET: Readonly<ScriptBudget> = Object.freeze({\n maxExecutionMs: 50,\n maxMemoryBytes: 16 * 1024 * 1024,\n maxStackBytes: 512 * 1024,\n maxEffects: 256,\n maxOutputBytes: 1024 * 1024,\n});\n\n/**\n * The shipped security posture (updated per phase — the live authority for\n * per-type × origin decisions is the actions plugin's policy; these\n * constants DOCUMENT the posture, they do not enforce it). The only\n * configurable switch is explicit opt-in.\n */\nexport interface ScriptSecurityPolicy {\n enabled: boolean;\n executionOwner: 'originating-client-only';\n nameTreeBoot: 'lazy-first-transaction';\n /** Submit is a sink chain — embedder handler → the document's HOME\n * (`doc.forms.submit`, engine-asserted) → blocked. Never auto-network. */\n submitForm: 'sink-chain';\n openAction: 'execute-lifecycle';\n pageActions: 'execute-lifecycle';\n /** WC/WS/DS/WP/DP run when the VERB OWNER dispatches them. */\n catalogLifecycleActions: 'execute-on-verb';\n annotationActions: 'execute-full-matrix';\n}\n\nexport const DEFAULT_SCRIPT_SECURITY_POLICY: Readonly<ScriptSecurityPolicy> = Object.freeze({\n enabled: false,\n executionOwner: 'originating-client-only',\n nameTreeBoot: 'lazy-first-transaction',\n submitForm: 'sink-chain',\n openAction: 'execute-lifecycle',\n pageActions: 'execute-lifecycle',\n catalogLifecycleActions: 'execute-on-verb',\n annotationActions: 'execute-full-matrix',\n});\n\n/** The shipped dispatch matrix; extracted actions outside it remain data\n * only. (Historical note: v1 froze everything beyond K/V/C/F as\n * preserve-only; phases 1–4 executed the rest.) */\nexport const SCRIPT_EVENT_MATRIX = Object.freeze({\n nameTree: 'lazy-first-originating-field-transaction',\n field: Object.freeze({\n keystroke: 'execute-on-commit',\n validate: 'execute',\n calculate: 'execute-in-calculation-order',\n format: 'execute-after-value-calculation',\n }),\n openAction: 'execute-lifecycle',\n page: 'execute-lifecycle',\n catalogLifecycle: 'execute-on-verb',\n annotation: Object.freeze({\n widgetActivate: 'execute-on-originating-client',\n other: 'execute-full-matrix',\n }),\n submitForm: 'sink-chain',\n} as const);\n\n/** Functions installed into the isolated VM global by `PRELUDE_SOURCE`. */\nexport interface AcroJsVmGlobal {\n __acrojsBoot(\n sources: string[],\n input: ScriptInput,\n budget?: Pick<ScriptBudget, 'maxEffects'>,\n ): ScriptOutput;\n __acrojsRun(\n source: string,\n input: ScriptInput,\n budget?: Pick<ScriptBudget, 'maxEffects'>,\n ): ScriptOutput;\n}\n","import type { DocumentHandle } from '@embedpdf/engine-core/runtime';\n\nimport { DEFAULT_SCRIPT_BUDGET } from './types';\nimport type {\n ScriptAnnotInput,\n ScriptBudget,\n ScriptDocumentInput,\n ScriptEnvironment,\n ScriptEventInput,\n ScriptFieldInput,\n ScriptIdentity,\n ScriptInput,\n ScriptOutput,\n ScriptSandbox,\n ScriptSandboxFactory,\n} from './types';\n\n/** The per-run world a CALLER supplies (fields snapshot, prefetched annots\n * plane, the event). Document/identity/environment come from the host. */\nexport interface ScriptWorldInput {\n fields: ScriptFieldInput[];\n annots?: ScriptAnnotInput[];\n annotPages?: number[];\n annotsCoverDocument?: boolean;\n /** Zero-based current page for `this.pageNum` — overrides the host's\n * document input (the form pipeline anchors it on the target field). */\n pageNumber?: number;\n event: ScriptEventInput;\n}\n\nexport interface ScriptTransaction {\n /**\n * Run the name-tree boot if it has not run in this realm yet; returns the\n * boot output exactly ONCE (its effects belong to the first transaction —\n * commit them, tag their UI effects `phase: 'boot'`), null thereafter.\n */\n boot(world: ScriptWorldInput, budget?: ScriptBudget): Promise<ScriptOutput | null>;\n /** One deterministic run against the shared realm. Auto-boots defensively\n * (that boot's output is then returned by the next `boot()` call).\n * `budget` overrides the host default per run — the form pipeline slices\n * ONE transaction-wide time budget across its K/V/C/F passes. */\n run(program: string, world: ScriptWorldInput, budget?: ScriptBudget): Promise<ScriptOutput>;\n}\n\nexport interface ScriptHostOptions {\n sandboxFactory: ScriptSandboxFactory;\n document: () => ScriptDocumentInput;\n identity: () => ScriptIdentity;\n /** Deterministic environment per run; `sequence` is the host's monotonic\n * run counter (seed derivation — see {@link seedFrom}). */\n environment: (sequence: number) => ScriptEnvironment;\n /** Name-tree programs, fetched lazily once per realm build. */\n bootSources: () => Promise<string[]>;\n budget?: ScriptBudget;\n}\n\n/**\n * The ONE realm per document (umbrella law #5): a name-tree function must be\n * callable from a page-open script and a field calculate alike.\n *\n * `transaction(body)` is the realm mutex, and the body performs EVERYTHING\n * for one logical script transaction — world prefetch, VM run(s), document\n * commits through the owner sinks, model reconciliation — BEFORE the mutex\n * releases, so the next transaction always prefetches post-commit truth\n * (the commit-inside-the-boundary law). Lock hierarchy: caller queues\n * (actions dispatch / form mutation) acquire this queue, never the reverse,\n * and commit sinks called inside the body never re-enter it.\n *\n * Fault ladder: a sandbox that reports itself disposed (interrupt/memory\n * faults) poisons the realm for the REST of the current transaction; the\n * next transaction rebuilds it lazily and re-runs the boot. Boot errors\n * degrade (diagnose, continue) — they never brick scripting.\n */\nexport interface ScriptHost {\n transaction<T>(body: (txn: ScriptTransaction) => Promise<T>): Promise<T>;\n dispose(): void;\n}\n\n/** FNV-1a over `documentId:sequence` — the deterministic default random seed\n * (ported verbatim from the form controller; exported for callers building\n * `ScriptHostOptions.environment`). */\nexport function seedFrom(documentId: string, sequence: number): number {\n let hash = 2166136261;\n for (const char of `${documentId}:${sequence}`) {\n hash ^= char.charCodeAt(0);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\n/** Engine JWT/session identity composed under embedder overrides — the\n * standard `ScriptHostOptions.identity` builder. */\nexport function resolveScriptIdentity(\n doc: DocumentHandle,\n overrides?: Partial<ScriptIdentity> | (() => Partial<ScriptIdentity>),\n): ScriptIdentity {\n const claims = doc.security.identity;\n const supplied = typeof overrides === 'function' ? overrides() : (overrides ?? {});\n return {\n name: supplied.name ?? claims?.display_name ?? claims?.user_id ?? '',\n loginName: supplied.loginName ?? claims?.user_id ?? '',\n corporation: supplied.corporation ?? claims?.group_id ?? '',\n email: supplied.email ?? '',\n };\n}\n\nexport function createScriptHost(options: ScriptHostOptions): ScriptHost {\n const budget = options.budget ?? DEFAULT_SCRIPT_BUDGET;\n\n // Deliberately NOT @embedpdf/core's createSerialQueue: this package is a\n // dependency-light leaf (engine-core types only) and must not pull the\n // kernel toolkit in. Identical contract, documented twin.\n let tail: Promise<void> = Promise.resolve();\n const enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n const result = tail.then(operation, operation);\n tail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n\n let sandboxPromise: Promise<ScriptSandbox> | null = null;\n let booted = false;\n let pendingBoot: ScriptOutput | null = null;\n let bootSourcesCache: Promise<string[]> | null = null;\n let sequence = 0;\n let disposed = false;\n\n const ensureSandbox = (): Promise<ScriptSandbox> => {\n sandboxPromise ??= options.sandboxFactory();\n return sandboxPromise;\n };\n\n const inputFor = (world: ScriptWorldInput): ScriptInput => ({\n document: {\n ...options.document(),\n ...(world.pageNumber !== undefined ? { pageNumber: world.pageNumber } : {}),\n },\n identity: options.identity(),\n environment: options.environment(sequence++),\n fields: world.fields,\n ...(world.annots ? { annots: world.annots } : {}),\n ...(world.annotPages ? { annotPages: world.annotPages } : {}),\n ...(world.annotsCoverDocument !== undefined\n ? { annotsCoverDocument: world.annotsCoverDocument }\n : {}),\n event: world.event,\n });\n\n /** A resource fault poisons the realm: rebuild + re-boot lazily NEXT time. */\n const noteFault = (sandbox: ScriptSandbox): void => {\n if (!sandbox.disposed) return;\n sandboxPromise = null;\n booted = false;\n pendingBoot = null;\n };\n\n const bootNow = async (\n world: ScriptWorldInput,\n runBudget?: ScriptBudget,\n ): Promise<ScriptOutput | null> => {\n if (booted) return null;\n // Degrade-never-brick: mark booted BEFORE running, exactly the\n // controller's law — a hostile boot script must not re-run per event.\n booted = true;\n const sandbox = await ensureSandbox();\n bootSourcesCache ??= options.bootSources();\n let sources: string[] = [];\n try {\n sources = await bootSourcesCache;\n } catch (error) {\n bootSourcesCache = null; // transient read failure — retry on rebuild\n // Degrade OBSERVABLY: a synthetic boot output carries the diagnostic\n // so the caller surfaces \"the name tree could not even be read\".\n return {\n event: { rc: true, value: null, change: '', selStart: 0, selEnd: 0 },\n formEffects: [],\n annotEffects: [],\n uiEffects: [],\n diagnostics: [\n {\n code: 'script-error',\n message: `Document boot script failed (continuing without it): ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n };\n }\n if (sources.length === 0) return null;\n const output = sandbox.boot(\n sources,\n inputFor({ ...world, event: { kind: 'name-tree-boot' } }),\n runBudget ?? budget,\n );\n noteFault(sandbox);\n return output;\n };\n\n const runNow = async (\n program: string,\n world: ScriptWorldInput,\n runBudget?: ScriptBudget,\n ): Promise<ScriptOutput> => {\n if (!booted) {\n // Defensive auto-boot; the output waits for the next explicit boot().\n pendingBoot = await bootNow(world, runBudget);\n }\n const sandbox = await ensureSandbox();\n const output = sandbox.run(program, inputFor(world), runBudget ?? budget);\n noteFault(sandbox);\n return output;\n };\n\n return {\n transaction<T>(body: (txn: ScriptTransaction) => Promise<T>): Promise<T> {\n if (disposed) return Promise.reject(new Error('script host is disposed'));\n return enqueue(() =>\n body({\n boot: async (world, runBudget) => {\n if (pendingBoot) {\n const output = pendingBoot;\n pendingBoot = null;\n return output;\n }\n return bootNow(world, runBudget);\n },\n run: (program, world, runBudget) => runNow(program, world, runBudget),\n }),\n );\n },\n dispose() {\n disposed = true;\n const dying = sandboxPromise;\n sandboxPromise = null;\n booted = false;\n pendingBoot = null;\n void dying?.then((sandbox) => sandbox.dispose()).catch(() => undefined);\n },\n };\n}\n","import type {\n FormFieldDTO,\n FormFieldFamily,\n FormSnapshot,\n FormValueEntry,\n} from '@embedpdf/engine-core/runtime';\n\nimport type { ScriptFieldInput, ScriptValue } from './types';\n\nfunction valueFromEntry(entry: FormValueEntry): ScriptValue {\n switch (entry.kind) {\n case 'scalar':\n return entry.value;\n case 'array':\n return [...entry.values];\n case 'none':\n case 'unsupported':\n return null;\n }\n}\n\nfunction fieldValueFromEntry(family: FormFieldFamily, entry: FormValueEntry): ScriptValue {\n if ((family === 'checkbox' || family === 'radio') && entry.kind === 'none') return 'Off';\n return valueFromEntry(entry);\n}\n\n/** Build the VM's detached field view from the engine's lossless snapshot. */\nexport function scriptFieldsFromSnapshot(snapshot: FormSnapshot): ScriptFieldInput[] {\n return snapshot.fields.map((field: FormFieldDTO) => ({\n ref: field.ref,\n name: field.name,\n family: field.family,\n value: fieldValueFromEntry(field.family, field.valueEntry),\n defaultValue: fieldValueFromEntry(field.family, field.defaultValueEntry),\n // Form DTOs do not yet aggregate widget visibility; annotation joins may\n // override this when the orchestrator has that plane loaded.\n display: 'visible',\n readOnly: field.flags.readOnly,\n required: field.flags.required,\n ...('options' in field\n ? { options: field.options.map((option) => ({ label: option.label, value: option.value })) }\n : {}),\n }));\n}\n","/**\n * Install the curated Acrobat object model into an isolated JavaScript realm.\n *\n * This function must remain self-contained: no imports and no closed-over\n * values. The sandbox ships `installAcroJs.toString()` into QuickJS, while\n * tests execute the same source in a Node VM. Types disappear at build time.\n */\nexport function installAcroJs(g: Record<string, unknown>): void {\n type AnyRecord = Record<string, unknown>;\n type FieldRecord = {\n input: AnyRecord;\n originalValue: unknown;\n value: unknown;\n originalDisplay: string;\n display: string;\n wrapper: AnyRecord;\n };\n type AnnotRecord = {\n input: AnyRecord;\n /** Writable-key snapshots: original vs current — effects are the diff. */\n original: AnyRecord;\n current: AnyRecord;\n wrapper: AnyRecord;\n };\n type RunState = {\n input: AnyRecord;\n fields: FieldRecord[];\n fieldsByName: Map<string, FieldRecord>;\n fieldsByRef: Map<string, FieldRecord>;\n annots: AnnotRecord[];\n annotsByPage: Map<number, AnnotRecord[]>;\n annotPages: Set<number>;\n annotsCoverDocument: boolean;\n event: AnyRecord;\n resetRefs: AnyRecord[];\n resetKeys: Set<string>;\n uiEffects: AnyRecord[];\n diagnostics: AnyRecord[];\n randomState: number;\n maxEffects: number;\n };\n\n const host = g as AnyRecord;\n const NativeDate = Date;\n let state: RunState | null = null;\n\n const cloneValue = (value: unknown): unknown =>\n Array.isArray(value) ? value.map((item) => String(item)) : value;\n const sameValue = (a: unknown, b: unknown): boolean => {\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((item, index) => item === b[index]);\n }\n return a === b;\n };\n const refKey = (ref: unknown): string => {\n const value = ref as AnyRecord | null | undefined;\n return value?.kind === 'objectNumber'\n ? `obj:${String(value.fieldObjectNumber)}`\n : `fqn:${String(value?.name ?? '')}`;\n };\n const diagnostic = (code: string, message: string): void => {\n state?.diagnostics.push({ code, message });\n };\n const blocked = (api: string): undefined => {\n diagnostic('blocked-network', `${api} is blocked by the scripting policy`);\n return undefined;\n };\n const numberValue = (value: unknown): number => {\n if (typeof value === 'number') return Number.isFinite(value) ? value : 0;\n const parsed = Number(String(value ?? '').replace(/[^0-9+\\-.]/g, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n };\n const displayToCode = (display: string): number =>\n display === 'hidden' ? 1 : display === 'noPrint' ? 2 : display === 'noView' ? 3 : 0;\n const codeToDisplay = (code: unknown): string =>\n Number(code) === 1\n ? 'hidden'\n : Number(code) === 2\n ? 'noPrint'\n : Number(code) === 3\n ? 'noView'\n : 'visible';\n const eventName = (kind: string): string =>\n kind === 'widget-activate'\n ? 'Mouse Up'\n : kind === 'field-keystroke'\n ? 'Keystroke'\n : kind === 'field-validate'\n ? 'Validate'\n : kind === 'field-calculate'\n ? 'Calculate'\n : kind === 'field-format'\n ? 'Format'\n : 'Open';\n\n const doc: AnyRecord = {};\n\n const makeField = (record: FieldRecord): AnyRecord => {\n const input = record.input;\n const wrapper: AnyRecord = {};\n Object.defineProperties(wrapper, {\n name: { enumerable: true, get: () => input.name },\n type: { enumerable: true, get: () => input.family },\n value: {\n enumerable: true,\n get: () => cloneValue(record.value),\n set: (value: unknown) => {\n record.value = cloneValue(value);\n },\n },\n valueAsString: {\n enumerable: true,\n get: () =>\n Array.isArray(record.value) ? record.value.join(',') : String(record.value ?? ''),\n },\n defaultValue: { enumerable: true, get: () => cloneValue(input.defaultValue) },\n readonly: {\n enumerable: true,\n get: () => Boolean(input.readOnly),\n set: () => {\n diagnostic('unsupported-api', 'Field.readonly writes are not supported in v1');\n },\n },\n required: {\n enumerable: true,\n get: () => Boolean(input.required),\n set: () => {\n diagnostic('unsupported-api', 'Field.required writes are not supported in v1');\n },\n },\n display: {\n enumerable: true,\n get: () => displayToCode(record.display),\n set: (value: unknown) => {\n record.display = codeToDisplay(value);\n },\n },\n source: { enumerable: false, get: () => doc },\n });\n wrapper.setFocus = () => diagnostic('unsupported-api', 'Field.setFocus is not supported in v1');\n return wrapper;\n };\n\n const getField = (name: unknown): AnyRecord | null =>\n state?.fieldsByName.get(String(name))?.wrapper ?? null;\n\n // ── the annots plane (curated; self-contained twins of src/color.ts and\n // types.ts ANNOT_WRITABLE_KEYS — parity tests pin them) ───────────────\n const ANNOT_WRITABLE: Record<string, string[]> = {\n square: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n circle: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n polygon: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n polyline: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n line: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n ink: ['strokeColor', 'opacity', 'width', 'rect'],\n 'free-text': ['strokeColor', 'fillColor', 'opacity', 'rect'],\n highlight: ['strokeColor', 'opacity'],\n underline: ['strokeColor', 'opacity'],\n squiggly: ['strokeColor', 'opacity'],\n strikeout: ['strokeColor', 'opacity'],\n caret: ['strokeColor', 'opacity'],\n text: ['strokeColor', 'opacity', 'rect'],\n stamp: ['rect'],\n 'file-attachment': ['strokeColor', 'opacity'],\n };\n const ANNOT_FLAG_KEYS = ['hidden', 'print', 'readOnly', 'locked', 'noView', 'toggleNoView'];\n const ACROBAT_TYPE: Record<string, string> = {\n square: 'Square',\n circle: 'Circle',\n line: 'Line',\n polygon: 'Polygon',\n polyline: 'PolyLine',\n ink: 'Ink',\n 'free-text': 'FreeText',\n highlight: 'Highlight',\n underline: 'Underline',\n squiggly: 'Squiggly',\n strikeout: 'StrikeOut',\n text: 'Text',\n stamp: 'Stamp',\n caret: 'Caret',\n 'file-attachment': 'FileAttachment',\n };\n const isColorArray = (value: unknown): boolean => {\n if (!Array.isArray(value) || value.length === 0) return false;\n const counts: Record<string, number> = { T: 0, G: 1, RGB: 3, CMYK: 4 };\n const expected = counts[String(value[0])];\n return (\n expected !== undefined &&\n value.length === expected + 1 &&\n value.slice(1).every((part) => typeof part === 'number' && isFinite(Number(part)))\n );\n };\n const colorToRgbTriple = (value: unknown): number[] | null => {\n const color = value as unknown[];\n const space = String(color[0]);\n if (space === 'T') return null;\n if (space === 'G') return [Number(color[1]), Number(color[1]), Number(color[1])];\n if (space === 'RGB') return [Number(color[1]), Number(color[2]), Number(color[3])];\n const c = Number(color[1]);\n const m = Number(color[2]);\n const y = Number(color[3]);\n const k = Number(color[4]);\n return [1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];\n };\n const sameAnnotValue = (a: unknown, b: unknown): boolean => {\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((item, index) => item === b[index]);\n }\n return a === b;\n };\n const cloneAnnotValue = (value: unknown): unknown => (Array.isArray(value) ? [...value] : value);\n\n const makeAnnot = (record: AnnotRecord): AnyRecord => {\n const input = record.input;\n const subtype = String(input.subtype);\n const writable = ANNOT_WRITABLE[subtype] ?? [];\n const wrapper: AnyRecord = {};\n const stage = (key: string, value: unknown, validate: (v: unknown) => boolean): void => {\n // Flags and contents are writable on every script-addressable subtype;\n // appearance keys follow the per-subtype matrix.\n if (key !== 'contents' && ANNOT_FLAG_KEYS.indexOf(key) < 0 && writable.indexOf(key) < 0) {\n diagnostic(\n 'unsupported-api',\n `Annot.${key} is not writable on subtype '${subtype}' (write ignored)`,\n );\n return;\n }\n if (input.opaqueBody && ANNOT_FLAG_KEYS.indexOf(key) < 0 && key !== 'contents') {\n diagnostic(\n 'unsupported-api',\n `Annot.${key}: '${subtype}' has an opaque appearance (write ignored)`,\n );\n return;\n }\n if (!validate(value)) {\n diagnostic('invalid-field-value', `Annot.${key}: invalid value (write ignored)`);\n return;\n }\n record.current[key] = cloneAnnotValue(value);\n };\n const prop = (key: string, validate: (v: unknown) => boolean): PropertyDescriptor => ({\n enumerable: true,\n get: () => cloneAnnotValue(record.current[key]),\n set: (value: unknown) => stage(key, value, validate),\n });\n const isNum = (v: unknown) => typeof v === 'number' && isFinite(v);\n const isBool = (v: unknown) => typeof v === 'boolean';\n Object.defineProperties(wrapper, {\n name: { enumerable: true, get: () => String(input.name ?? '') },\n type: { enumerable: true, get: () => ACROBAT_TYPE[subtype] ?? subtype },\n page: { enumerable: true, get: () => Number(input.page ?? 0) },\n author: { enumerable: true, get: () => String(input.author ?? '') },\n subject: { enumerable: true, get: () => String(input.subject ?? '') },\n strokeColor: prop('strokeColor', isColorArray),\n fillColor: prop('fillColor', isColorArray),\n opacity: prop('opacity', (v) => isNum(v) && Number(v) >= 0 && Number(v) <= 1),\n width: prop('width', (v) => isNum(v) && Number(v) >= 0),\n style: prop('borderStyle', (v) => v === 'S' || v === 'D'),\n dash: prop('dash', (v) => Array.isArray(v) && v.every(isNum)),\n rect: prop('rect', (v) => Array.isArray(v) && v.length === 4 && v.every(isNum)),\n contents: prop('contents', (v) => typeof v === 'string'),\n hidden: prop('hidden', isBool),\n print: prop('print', isBool),\n readOnly: prop('readOnly', isBool),\n lock: prop('locked', isBool),\n noView: prop('noView', isBool),\n toggleNoView: prop('toggleNoView', isBool),\n doc: { enumerable: false, get: () => doc },\n });\n wrapper.getProps = () => {\n const out: AnyRecord = {};\n for (const key of Object.keys(record.current)) out[key] = cloneAnnotValue(record.current[key]);\n return out;\n };\n wrapper.setProps = (props: unknown) => {\n const source = (props ?? {}) as AnyRecord;\n for (const key of Object.keys(source)) {\n const alias = key === 'style' ? 'borderStyle' : key === 'lock' ? 'locked' : key;\n void alias;\n (wrapper as AnyRecord)[key] = source[key];\n }\n };\n return wrapper;\n };\n\n const getAnnots = (spec?: unknown): AnyRecord[] | null => {\n if (!state) return null;\n const nPage = (spec as AnyRecord | undefined)?.nPage;\n if (nPage === undefined || nPage === null) {\n if (!state.annotsCoverDocument) {\n diagnostic(\n 'unsupported-api',\n 'getAnnots: whole-document search is limited to the prefetched pages (compatibility deviation)',\n );\n }\n return state.annots.length ? state.annots.map((record) => record.wrapper) : null;\n }\n const page = Math.trunc(Number(nPage));\n if (!state.annotPages.has(page)) {\n diagnostic(\n 'unsupported-api',\n `getAnnots: page ${page} is outside the prefetched annots plane (compatibility deviation)`,\n );\n return null;\n }\n const records = state.annotsByPage.get(page) ?? [];\n return records.length ? records.map((record) => record.wrapper) : null;\n };\n const getAnnot = (nPage: unknown, name: unknown): AnyRecord | null => {\n const records = getAnnots({ nPage });\n if (!records) return null;\n for (const wrapper of records) {\n if (String((wrapper as AnyRecord).name) === String(name)) return wrapper;\n }\n return null;\n };\n doc.getAnnots = getAnnots;\n doc.getAnnot = getAnnot;\n\n Object.defineProperties(doc, {\n documentFileName: {\n enumerable: true,\n get: () => String((state?.input.document as AnyRecord | undefined)?.fileName ?? ''),\n },\n numFields: { enumerable: true, get: () => state?.fields.length ?? 0 },\n pageNum: {\n enumerable: true,\n get: () => Number((state?.input.document as AnyRecord | undefined)?.pageNumber ?? 0),\n set: (value: unknown) => {\n const page = Math.trunc(Number(value));\n if (Number.isFinite(page)) state?.uiEffects.push({ kind: 'gotoPage', page });\n },\n },\n });\n doc.getField = getField;\n doc.getNthFieldName = (index: unknown) =>\n String(state?.fields[Math.trunc(Number(index))]?.input.name ?? '');\n doc.resetForm = (names?: unknown) => {\n if (!state) return;\n const requested =\n names === undefined\n ? state.fields\n : (Array.isArray(names) ? names : [names])\n .map((name) => state!.fieldsByName.get(String(name)))\n .filter((field): field is FieldRecord => field !== undefined);\n for (const field of requested) {\n field.value = cloneValue(field.input.defaultValue);\n const key = refKey(field.input.ref);\n if (!state.resetKeys.has(key)) {\n state.resetKeys.add(key);\n state.resetRefs.push(field.input.ref as AnyRecord);\n }\n }\n };\n doc.print = () => state?.uiEffects.push({ kind: 'print' });\n // Acrobat's doc.submitForm: positional (cURL, bFDF, bEmpty, aFields) or a\n // single argument object ({cURL, aFields, bEmpty, cSubmitAs, bGet}). It\n // emits a submit INTENT — resolution (Table 239/240 semantics) and the\n // sink chain (embedder handler → the document's home → blocked) live\n // outside the VM; nothing here touches a network.\n doc.submitForm = (cUrlOrArgs?: unknown, bFDF?: unknown, bEmpty?: unknown, aFields?: unknown) => {\n if (!state) return;\n const args: AnyRecord =\n cUrlOrArgs !== null && typeof cUrlOrArgs === 'object'\n ? (cUrlOrArgs as AnyRecord)\n : { cURL: cUrlOrArgs, bFDF: bFDF, bEmpty: bEmpty, aFields: aFields };\n const names = Array.isArray(args.aFields)\n ? (args.aFields as unknown[]).map((name) => String(name))\n : null;\n const submitAs = args.cSubmitAs === undefined ? undefined : String(args.cSubmitAs).toUpperCase();\n const format =\n submitAs === 'FDF'\n ? 'fdf'\n : submitAs === 'XFDF'\n ? 'xfdf'\n : submitAs === 'HTML'\n ? 'html'\n : submitAs === 'PDF'\n ? 'pdf'\n : args.bFDF === false\n ? 'html'\n : undefined;\n state.uiEffects.push({\n kind: 'submitForm',\n url: args.cURL === undefined || args.cURL === null ? null : String(args.cURL),\n fieldNames: names,\n includeEmpty: Boolean(args.bEmpty),\n ...(format === undefined ? {} : { format }),\n ...(args.bGet === undefined ? {} : { method: args.bGet ? 'get' : 'post' }),\n });\n };\n doc.mailDoc = () => blocked('mailDoc');\n doc.getURL = () => blocked('getURL');\n\n const app = {\n // Viewer identity — the properties Adobe's ubiquitous version-check\n // boilerplate (`!ADBE::…VersChk…` name-tree scripts) branches on. Honest\n // values for an emulated modern-Reader-level environment, so those\n // scripts take their \"viewer is current\" paths instead of tripping over\n // `undefined`. Deliberately NO `xfa_installed`: we never claim XFA.\n platform: 'WIN',\n language: 'ENU',\n viewerType: 'Reader',\n viewerVariation: 'Reader',\n viewerVersion: 21,\n formsVersion: 21,\n alert: (message: unknown, icon?: unknown, _type?: unknown, title?: unknown): number => {\n state?.uiEffects.push({\n kind: 'alert',\n message: String(message),\n icon: Number.isFinite(Number(icon)) ? Number(icon) : 0,\n ...(title === undefined ? {} : { title: String(title) }),\n });\n return 1;\n },\n beep: () => diagnostic('unsupported-api', 'app.beep is not supported in v1'),\n response: () => {\n diagnostic('unsupported-api', 'app.response is not supported in v1');\n return null;\n },\n launchURL: () => blocked('app.launchURL'),\n // Acrobat's contract when a viewer component (e.g. the XFA plugin) is not\n // available is `undefined` — NEVER a throw. A web viewer has no\n // installable components, so \"not available\" is always the truthful\n // answer; Adobe's XFA-check boilerplate calls this after its upgrade nag.\n findComponent: (): undefined => {\n diagnostic('unsupported-api', 'app.findComponent: no installable components in this viewer');\n return undefined;\n },\n };\n\n const pad = (value: number, length = 2): string => String(value).padStart(length, '0');\n const monthShort = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ];\n const monthLong = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ];\n const printd = (format: unknown, inputDate: unknown): string => {\n const environment = (state?.input.environment ?? {}) as AnyRecord;\n const date =\n inputDate && typeof (inputDate as AnyRecord).getTime === 'function'\n ? new NativeDate(Number((inputDate as { getTime(): number }).getTime()))\n : new NativeDate(Number(environment.nowMs ?? 0));\n const local = new NativeDate(\n date.getTime() + Number(environment.utcOffsetMinutes ?? 0) * 60000,\n );\n const year = local.getUTCFullYear();\n const month = local.getUTCMonth();\n const day = local.getUTCDate();\n const hour = local.getUTCHours();\n const minute = local.getUTCMinutes();\n const second = local.getUTCSeconds();\n const hour12 = hour % 12 === 0 ? 12 : hour % 12;\n const tokens: Record<string, string> = {\n yyyy: String(year),\n yy: pad(year % 100),\n mmmm: monthLong[month],\n mmm: monthShort[month],\n mm: pad(month + 1),\n m: String(month + 1),\n dd: pad(day),\n d: String(day),\n HH: pad(hour),\n hh: pad(hour12),\n h: String(hour12),\n H: String(hour),\n MM: pad(minute),\n M: String(minute),\n ss: pad(second),\n tt: hour < 12 ? 'am' : 'pm',\n };\n // Single pass, longest tokens first; replacements are never re-scanned, so\n // an emitted 'am'/'pm' cannot collide with the month token.\n return String(format).replace(\n /yyyy|mmmm|mmm|yy|mm|dd|HH|hh|MM|ss|tt|m|d|H|h|M/g,\n (token) => tokens[token],\n );\n };\n const util = {\n printd,\n printf: (format: unknown, ...values: unknown[]): string => {\n let index = 0;\n return String(format).replace(/%(?:,?\\d*(?:\\.\\d+)?)?[dfs]/g, (token) => {\n const value = values[index++];\n if (token.endsWith('s')) return String(value ?? '');\n if (token.endsWith('d')) return String(Math.trunc(numberValue(value)));\n const precision = /\\.(\\d+)/.exec(token)?.[1];\n return numberValue(value).toFixed(precision ? Number(precision) : 0);\n });\n },\n };\n\n const begin = (input: AnyRecord, budget?: AnyRecord): void => {\n const fields: FieldRecord[] = ((input.fields as AnyRecord[] | undefined) ?? []).map((field) => {\n const record: FieldRecord = {\n input: field,\n originalValue: cloneValue(field.value),\n value: cloneValue(field.value),\n originalDisplay: String(field.display ?? 'visible'),\n display: String(field.display ?? 'visible'),\n wrapper: {},\n };\n record.wrapper = makeField(record);\n return record;\n });\n const fieldsByName = new Map(fields.map((field) => [String(field.input.name), field]));\n const fieldsByRef = new Map(fields.map((field) => [refKey(field.input.ref), field]));\n const annots: AnnotRecord[] = ((input.annots as AnyRecord[] | undefined) ?? []).map(\n (annot) => {\n const writableSnapshot = (): AnyRecord => ({\n strokeColor: cloneAnnotValue(annot.strokeColor ?? ['T']),\n fillColor: cloneAnnotValue(annot.fillColor ?? ['T']),\n opacity: Number(annot.opacity ?? 1),\n width: Number(annot.width ?? 1),\n borderStyle: String(annot.borderStyle ?? 'S'),\n dash: cloneAnnotValue(annot.dash ?? []),\n rect: cloneAnnotValue(annot.rect ?? [0, 0, 0, 0]),\n contents: String(annot.contents ?? ''),\n hidden: Boolean(annot.hidden),\n print: Boolean(annot.print),\n readOnly: Boolean(annot.readOnly),\n locked: Boolean(annot.locked),\n noView: Boolean(annot.noView),\n toggleNoView: Boolean(annot.toggleNoView),\n });\n const record: AnnotRecord = {\n input: annot,\n original: writableSnapshot(),\n current: writableSnapshot(),\n wrapper: {},\n };\n record.wrapper = makeAnnot(record);\n return record;\n },\n );\n const annotsByPage = new Map<number, AnnotRecord[]>();\n for (const record of annots) {\n const page = Number(record.input.page ?? 0);\n const bucket = annotsByPage.get(page);\n if (bucket) bucket.push(record);\n else annotsByPage.set(page, [record]);\n }\n const eventInput = (input.event ?? {}) as AnyRecord;\n const target = fieldsByRef.get(refKey(eventInput.target));\n const source = fieldsByRef.get(refKey(eventInput.source));\n const initialValue =\n eventInput.value !== undefined\n ? cloneValue(eventInput.value)\n : cloneValue(target?.value ?? null);\n const eventType =\n eventInput.type !== undefined\n ? String(eventInput.type)\n : eventInput.kind === 'name-tree-boot'\n ? 'Doc'\n : 'Field';\n const event: AnyRecord = {\n // Explicit type/name (action-driven runs, from trigger provenance)\n // beat the kind-derived defaults (the K/V/C/F pipeline path).\n name: eventInput.name !== undefined\n ? String(eventInput.name)\n : eventName(String(eventInput.kind ?? '')),\n type: eventType,\n // Doc-typed events target the Doc object (Acrobat's WillSave\n // boilerplate does `event.target.getField(...)`); field targets win\n // when present (a widget-anchored run).\n target: target?.wrapper ?? (eventType === 'Doc' ? doc : null),\n targetName: String(target?.input.name ?? ''),\n source: source?.wrapper ?? { source: doc },\n value: initialValue,\n change: String(eventInput.change ?? ''),\n selStart: Math.max(0, Math.trunc(Number(eventInput.selStart ?? 0))),\n selEnd: Math.max(0, Math.trunc(Number(eventInput.selEnd ?? 0))),\n willCommit: Boolean(eventInput.willCommit),\n modifier: Boolean(eventInput.modifier),\n shift: Boolean(eventInput.shift),\n rc: true,\n };\n state = {\n input,\n fields,\n fieldsByName,\n fieldsByRef,\n annots,\n annotsByPage,\n annotPages: new Set(\n ((input.annotPages as unknown[] | undefined) ?? []).map((page) => Math.trunc(Number(page))),\n ),\n annotsCoverDocument: Boolean(input.annotsCoverDocument),\n event,\n resetRefs: [],\n resetKeys: new Set(),\n uiEffects: [],\n diagnostics: [],\n randomState: Number((input.environment as AnyRecord | undefined)?.randomSeed ?? 1) >>> 0,\n maxEffects: Math.max(1, Math.trunc(Number(budget?.maxEffects ?? 256))),\n };\n host.event = event;\n host.identity = { ...((input.identity as AnyRecord | undefined) ?? {}) };\n };\n\n const formValue = (field: FieldRecord, value: unknown): AnyRecord | null => {\n const family = String(field.input.family);\n if (family === 'text') return { type: 'text', value: String(value ?? '') };\n if (family === 'checkbox' || family === 'radio') {\n const token =\n value === null || value === undefined || String(value) === 'Off' ? null : String(value);\n return { type: 'toggle', state: token };\n }\n if (family === 'combobox') {\n const selected = Array.isArray(value) ? value.slice(0, 1).map(String) : [String(value ?? '')];\n return { type: 'choice', values: selected };\n }\n if (family === 'listbox') {\n return {\n type: 'choice',\n values: Array.isArray(value) ? value.map(String) : [String(value ?? '')],\n };\n }\n diagnostic(\n 'invalid-field-value',\n `field '${String(field.input.name)}' cannot accept a scripted value`,\n );\n return null;\n };\n\n const eventOutput = (): AnyRecord => ({\n rc: Boolean(state?.event.rc),\n value: cloneValue(state?.event.value ?? null),\n change: String(state?.event.change ?? ''),\n selStart: Math.max(0, Math.trunc(Number(state?.event.selStart ?? 0))),\n selEnd: Math.max(0, Math.trunc(Number(state?.event.selEnd ?? 0))),\n });\n\n const finish = (): AnyRecord => {\n if (!state) throw new Error('AcroJS run state was not initialized');\n const eventInput = state.input.event as AnyRecord;\n const target = state.fieldsByRef.get(refKey(eventInput.target));\n const kind = String(eventInput.kind ?? '');\n if (target && kind === 'field-calculate') target.value = cloneValue(state.event.value);\n\n const formEffects: AnyRecord[] = [];\n if (state.resetRefs.length > 0) formEffects.push({ kind: 'reset', refs: [...state.resetRefs] });\n for (const field of state.fields) {\n const key = refKey(field.input.ref);\n // A reset effect is replayed before the value effects below, so reset\n // fields start from their default rather than the transaction input.\n // This preserves reset -> rewrite-to-original sequences.\n const valueBaseline = state.resetKeys.has(key)\n ? field.input.defaultValue\n : field.originalValue;\n if (!sameValue(field.value, valueBaseline)) {\n const value = formValue(field, field.value);\n if (value) formEffects.push({ kind: 'setValue', ref: field.input.ref, value });\n }\n if (field.display !== field.originalDisplay) {\n formEffects.push({ kind: 'setDisplay', ref: field.input.ref, display: field.display });\n }\n }\n if (target && kind === 'field-format') {\n formEffects.push({\n kind: 'setAppearanceText',\n ref: target.input.ref,\n text: String(state.event.value ?? ''),\n });\n }\n // Annot effects: the canonical per-annot diff, exactly the fields model —\n // last write wins per key, ordered by the input plane's annot order.\n const annotEffects: AnyRecord[] = [];\n for (const record of state.annots) {\n const patch: AnyRecord = {};\n const flags: AnyRecord = {};\n for (const key of Object.keys(record.current)) {\n if (sameAnnotValue(record.current[key], record.original[key])) continue;\n if (ANNOT_FLAG_KEYS.indexOf(key) >= 0) flags[key] = record.current[key];\n else patch[key] = cloneAnnotValue(record.current[key]);\n }\n if (Object.keys(flags).length > 0) patch.flags = flags;\n if (Object.keys(patch).length > 0) annotEffects.push({ ref: record.input.ref, patch });\n }\n\n const totalEffects = formEffects.length + annotEffects.length + state.uiEffects.length;\n if (totalEffects > state.maxEffects) {\n return {\n event: eventOutput(),\n formEffects: [],\n annotEffects: [],\n uiEffects: [],\n diagnostics: [...state.diagnostics],\n error: {\n kind: 'budget',\n message: `script produced ${totalEffects} effects; limit is ${state.maxEffects}`,\n },\n };\n }\n return {\n event: eventOutput(),\n formEffects,\n annotEffects,\n uiEffects: [...state.uiEffects],\n diagnostics: [...state.diagnostics],\n };\n };\n\n const failed = (error: unknown): AnyRecord => ({\n event: eventOutput(),\n formEffects: [],\n annotEffects: [],\n uiEffects: [],\n diagnostics: [...(state?.diagnostics ?? [])],\n error: {\n kind: 'exception',\n message: error instanceof Error ? error.message : String(error),\n ...(error instanceof Error && error.stack ? { stack: error.stack } : {}),\n },\n });\n\n const evaluate = (source: string): unknown => {\n // Indirect eval is deliberate: name-tree declarations must persist in the\n // isolated realm's global scope for later field events.\n return (0, eval)(source);\n };\n\n const boot = (sources: unknown, input: unknown, budget?: unknown): AnyRecord => {\n begin(input as AnyRecord, budget as AnyRecord | undefined);\n try {\n for (const source of (sources as unknown[]) ?? []) evaluate(String(source));\n return finish();\n } catch (error) {\n return failed(error);\n }\n };\n const run = (source: unknown, input: unknown, budget?: unknown): AnyRecord => {\n begin(input as AnyRecord, budget as AnyRecord | undefined);\n try {\n evaluate(String(source));\n return finish();\n } catch (error) {\n return failed(error);\n }\n };\n\n // PDF scripts share this realm, but they must not replace the host-owned\n // transaction boundary for later events in the same document.\n Object.defineProperties(host, {\n __acrojsBoot: { configurable: false, writable: false, value: boot },\n __acrojsRun: { configurable: false, writable: false, value: run },\n });\n\n host.app = app;\n host.util = util;\n host.display = Object.freeze({ visible: 0, hidden: 1, noPrint: 2, noView: 3 });\n // The standard Acrobat color object: constants + convert/equal with the\n // documented G/RGB/CMYK vectors (self-contained twin of src/color.ts).\n host.color = Object.freeze({\n transparent: Object.freeze(['T']),\n black: Object.freeze(['G', 0]),\n white: Object.freeze(['G', 1]),\n gray: Object.freeze(['G', 0.5]),\n ltGray: Object.freeze(['G', 0.75]),\n dkGray: Object.freeze(['G', 0.25]),\n red: Object.freeze(['RGB', 1, 0, 0]),\n green: Object.freeze(['RGB', 0, 1, 0]),\n blue: Object.freeze(['RGB', 0, 0, 1]),\n cyan: Object.freeze(['CMYK', 1, 0, 0, 0]),\n magenta: Object.freeze(['CMYK', 0, 1, 0, 0]),\n yellow: Object.freeze(['CMYK', 0, 0, 1, 0]),\n convert: (value: unknown, space: unknown): unknown[] => {\n if (!isColorArray(value)) return ['T'];\n const target = String(space);\n const rgb = colorToRgbTriple(value);\n if (target === 'T' || rgb === null) return ['T'];\n if (target === 'G') return ['G', 0.3 * rgb[0] + 0.59 * rgb[1] + 0.11 * rgb[2]];\n if (target === 'RGB') return ['RGB', rgb[0], rgb[1], rgb[2]];\n if (target === 'CMYK') {\n const k = 1 - Math.max(rgb[0], rgb[1], rgb[2]);\n return ['CMYK', 1 - rgb[0] - k, 1 - rgb[1] - k, 1 - rgb[2] - k, k];\n }\n return ['T'];\n },\n equal: (a: unknown, b: unknown): boolean => {\n if (!isColorArray(a) || !isColorArray(b)) return false;\n const left = colorToRgbTriple(a);\n const right = colorToRgbTriple(b);\n if (left === null || right === null) return left === right;\n return left.every((component, index) => Math.abs(component - right[index]) < 1e-6);\n },\n });\n host.getField = getField;\n host.getAnnots = getAnnots;\n host.getAnnot = getAnnot;\n host.resetForm = doc.resetForm;\n host.print = doc.print;\n host.submitForm = doc.submitForm;\n host.mailDoc = doc.mailDoc;\n host.getURL = doc.getURL;\n Object.defineProperties(host, {\n documentFileName: { configurable: true, get: () => doc.documentFileName },\n numFields: { configurable: true, get: () => doc.numFields },\n pageNum: {\n configurable: true,\n get: () => doc.pageNum,\n set: (value: unknown) => {\n doc.pageNum = value;\n },\n },\n });\n\n class FixedDate extends NativeDate {\n constructor(...args: unknown[]) {\n if (args.length === 0) {\n super(Number(((state?.input.environment ?? {}) as AnyRecord).nowMs ?? 0));\n } else if (args.length === 1) {\n super(args[0] as string | number);\n } else {\n super(\n Number(args[0]),\n Number(args[1]),\n Number(args[2] ?? 1),\n Number(args[3] ?? 0),\n Number(args[4] ?? 0),\n Number(args[5] ?? 0),\n Number(args[6] ?? 0),\n );\n }\n }\n static override now(): number {\n return Number(((state?.input.environment ?? {}) as AnyRecord).nowMs ?? 0);\n }\n }\n host.Date = FixedDate;\n\n const math = host.Math as Math | undefined;\n if (math) {\n math.random = () => {\n if (!state) return 0;\n state.randomState = (1664525 * state.randomState + 1013904223) >>> 0;\n return state.randomState / 0x100000000;\n };\n }\n\n host.AFSimple_Calculate = (operation: unknown, names: unknown): void => {\n const requested = Array.isArray(names) ? names : String(names).split(',');\n const values = requested.map((name) => numberValue(getField(String(name).trim())?.value));\n const op = String(operation).toUpperCase();\n const value =\n values.length === 0\n ? 0\n : op === 'PRD'\n ? values.reduce((a, b) => a * b, 1)\n : op === 'AVG'\n ? values.reduce((a, b) => a + b, 0) / values.length\n : op === 'MIN'\n ? Math.min(...values)\n : op === 'MAX'\n ? Math.max(...values)\n : values.reduce((a, b) => a + b, 0);\n if (state) state.event.value = value;\n };\n host.AFNumber_Format = (\n decimals: unknown,\n separatorStyle: unknown,\n _negativeStyle: unknown,\n _currencyStyle: unknown,\n currency: unknown,\n prepend: unknown,\n ): void => {\n if (!state) return;\n const places = Math.max(0, Math.min(10, Math.trunc(Number(decimals))));\n let formatted = numberValue(state.event.value).toFixed(places);\n if (Number(separatorStyle) === 0 || Number(separatorStyle) === 2) {\n const [whole, fraction] = formatted.split('.');\n formatted = `${whole.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')}${fraction === undefined ? '' : `.${fraction}`}`;\n }\n const symbol = String(currency ?? '');\n state.event.value = prepend ? `${symbol}${formatted}` : `${formatted}${symbol}`;\n };\n host.AFPercent_Format = (decimals: unknown): void => {\n if (!state) return;\n const places = Math.max(0, Math.min(10, Math.trunc(Number(decimals))));\n state.event.value = `${(numberValue(state.event.value) * 100).toFixed(places)}%`;\n };\n // ── Acrobat AF support library ─────────────────────────────────────────\n // Deterministic subset of Acrobat's AFxxx forms helpers. Everything reads\n // only the injected environment; keystroke helpers validate the committed\n // value (this pipeline runs K once, on commit, as a full replacement).\n\n const DATE_FORMATS = [\n 'm/d',\n 'm/d/yy',\n 'mm/dd/yy',\n 'mm/yy',\n 'd-mmm',\n 'd-mmm-yy',\n 'dd-mmm-yy',\n 'yy-mm-dd',\n 'mmm-yy',\n 'mmmm-yy',\n 'mmm d, yyyy',\n 'mmmm d, yyyy',\n 'm/d/yy h:MM tt',\n 'm/d/yy HH:MM',\n ];\n const TIME_FORMATS = ['HH:MM', 'h:MM tt', 'HH:MM:ss', 'h:MM:ss tt'];\n\n const rejectWithAlert = (message: string): void => {\n if (!state) return;\n state.uiEffects.push({ kind: 'alert', message, icon: 0 });\n state.event.rc = false;\n };\n const formatMismatch = (): void =>\n rejectWithAlert(\n `The value entered does not match the format of the field [ ${String(\n state?.event.targetName ?? '',\n )} ]`,\n );\n const dateMismatch = (format: unknown): void =>\n rejectWithAlert(\n `Invalid date/time: please ensure that the date/time exists. Field [ ${String(\n state?.event.targetName ?? '',\n )} ] should match format ${String(format ?? '')}`,\n );\n\n const mergeChange = (eventObject?: unknown): string => {\n const e = (eventObject ?? state?.event ?? {}) as AnyRecord;\n const value = String(e.value ?? '');\n if (e.willCommit) return value;\n const start = Math.max(0, Math.trunc(Number(e.selStart ?? 0)));\n const end = Math.max(start, Math.trunc(Number(e.selEnd ?? 0)));\n return value.slice(0, start) + String(e.change ?? '') + value.slice(end);\n };\n host.AFMergeChange = mergeChange;\n\n const makeNumber = (value: unknown): number | null => {\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n let text = String(value ?? '').trim();\n if (text === '') return null;\n text = text.replace(/[^0-9,.\\-+eE]/g, '');\n if (text.includes(',') && text.includes('.')) {\n // The last separator is the decimal: \"1,234.56\" vs \"1.234,56\".\n text =\n text.lastIndexOf(',') > text.lastIndexOf('.')\n ? text.replace(/\\./g, '').replace(',', '.')\n : text.replace(/,/g, '');\n } else if (text.includes(',')) {\n // A single comma reads as the decimal separator; several are thousands.\n text = (text.match(/,/g) ?? []).length === 1 ? text.replace(',', '.') : text.replace(/,/g, '');\n }\n const parsed = Number(text);\n return text !== '' && Number.isFinite(parsed) ? parsed : null;\n };\n host.AFMakeNumber = makeNumber;\n\n host.AFExtractNums = (value: unknown): string[] | null => {\n const matches = String(value ?? '').match(/\\d+/g);\n return matches && matches.length > 0 ? [...matches] : null;\n };\n\n const validNumberText = (text: string, separatorStyle: number): boolean => {\n const trimmed = text.trim();\n if (trimmed === '') return true;\n const decimalComma = separatorStyle === 2 || separatorStyle === 3;\n const pattern = decimalComma\n ? /^[+-]?(\\d+|\\d{1,3}(\\.\\d{3})+)?(,\\d*)?$/\n : /^[+-]?(\\d+|\\d{1,3}(,\\d{3})+)?(\\.\\d*)?$/;\n return pattern.test(trimmed) && /\\d/.test(trimmed);\n };\n host.AFNumber_Keystroke = (\n _decimals: unknown,\n separatorStyle: unknown,\n _negativeStyle: unknown,\n _currencyStyle: unknown,\n currency: unknown,\n ): void => {\n if (!state || !state.event.willCommit) return;\n const proposed = mergeChange(state.event);\n const cleaned = currency ? proposed.split(String(currency)).join('') : proposed;\n if (!validNumberText(cleaned, Math.trunc(Number(separatorStyle)))) formatMismatch();\n };\n host.AFPercent_Keystroke = (_decimals: unknown, separatorStyle: unknown): void => {\n if (!state || !state.event.willCommit) return;\n const cleaned = mergeChange(state.event).replace(/%\\s*$/, '');\n if (!validNumberText(cleaned, Math.trunc(Number(separatorStyle)))) formatMismatch();\n };\n\n const digitsOf = (value: unknown): string => String(value ?? '').replace(/\\D/g, '');\n const afSpecialFormat = (psf: unknown): void => {\n if (!state) return;\n const digits = digitsOf(state.event.value);\n const kind = Math.trunc(Number(psf));\n let formatted = String(state.event.value ?? '');\n if (kind === 0) formatted = digits.slice(0, 5);\n else if (kind === 1) formatted = `${digits.slice(0, 5)}-${digits.slice(5, 9)}`;\n else if (kind === 2)\n formatted =\n digits.length >= 10\n ? `(${digits.slice(0, 3)}) ${digits.slice(3, 6)}-${digits.slice(6, 10)}`\n : `${digits.slice(0, 3)}-${digits.slice(3, 7)}`;\n else if (kind === 3) formatted = `${digits.slice(0, 3)}-${digits.slice(3, 5)}-${digits.slice(5, 9)}`;\n state.event.value = formatted;\n };\n host.AFSpecial_Format = afSpecialFormat;\n host.AFSpecial_Keystroke = (psf: unknown): void => {\n if (!state || !state.event.willCommit) return;\n const merged = mergeChange(state.event);\n if (merged.trim() === '') return;\n const digits = digitsOf(merged).length;\n const kind = Math.trunc(Number(psf));\n const valid =\n kind === 0\n ? digits === 5\n : kind === 1\n ? digits === 9\n : kind === 2\n ? digits === 7 || digits === 10\n : digits === 9;\n if (!valid) formatMismatch();\n };\n\n host.AFRange_Validate = (\n useGreater: unknown,\n greaterThan: unknown,\n useLess: unknown,\n lessThan: unknown,\n ): void => {\n if (!state) return;\n const value = makeNumber(state.event.value);\n if (value === null) return;\n const hasGreater = Boolean(useGreater);\n const hasLess = Boolean(useLess);\n const low = Number(greaterThan);\n const high = Number(lessThan);\n if ((!hasGreater || value >= low) && (!hasLess || value <= high)) return;\n rejectWithAlert(\n hasGreater && hasLess\n ? `Invalid value: must be greater than or equal to ${low} and less than or equal to ${high}.`\n : hasGreater\n ? `Invalid value: must be greater than or equal to ${low}.`\n : `Invalid value: must be less than or equal to ${high}.`,\n );\n };\n\n interface WallTime {\n y: number;\n m: number;\n d: number;\n H: number;\n M: number;\n S: number;\n }\n const nowWall = (): WallTime => {\n const env = (state?.input.environment ?? {}) as AnyRecord;\n const local = new NativeDate(\n Number(env.nowMs ?? 0) + Number(env.utcOffsetMinutes ?? 0) * 60000,\n );\n return {\n y: local.getUTCFullYear(),\n m: local.getUTCMonth() + 1,\n d: local.getUTCDate(),\n H: 0,\n M: 0,\n S: 0,\n };\n };\n /** printd adds the environment offset itself, so a wall time converts back. */\n const wallDate = (parts: WallTime): Date => {\n const env = (state?.input.environment ?? {}) as AnyRecord;\n return new NativeDate(\n NativeDate.UTC(parts.y, parts.m - 1, parts.d, parts.H, parts.M, parts.S) -\n Number(env.utcOffsetMinutes ?? 0) * 60000,\n );\n };\n\n /** Lenient scand-style parse: numbers mapped by the format's token order,\n * month names accepted, missing parts defaulted like Acrobat's scand. */\n const parseDateLoose = (raw: unknown, format: unknown): WallTime | null => {\n const text = String(raw ?? '').trim();\n if (text === '') return null;\n const lower = text.toLowerCase();\n let namedMonth: number | null = null;\n for (let index = 0; index < 12; index += 1) {\n if (lower.indexOf(monthShort[index].toLowerCase()) >= 0) {\n namedMonth = index + 1;\n break;\n }\n }\n const timeMatch = /(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*(am|pm)?/i.exec(text);\n let H = 0;\n let M = 0;\n let S = 0;\n if (timeMatch) {\n H = Number(timeMatch[1]);\n M = Number(timeMatch[2]);\n S = Number(timeMatch[3] ?? 0);\n const marker = String(timeMatch[4] ?? '').toLowerCase();\n if (marker === 'pm' && H < 12) H += 12;\n if (marker === 'am' && H === 12) H = 0;\n if (H > 23 || M > 59 || S > 59) return null;\n }\n const dateText = timeMatch\n ? text.slice(0, timeMatch.index) + text.slice(timeMatch.index + timeMatch[0].length)\n : text;\n const numbers = (dateText.match(/\\d+/g) ?? []).map((token) => Number(token));\n const order: Array<'y' | 'm' | 'd'> = [];\n for (const token of String(format ?? '').match(/yyyy|mmmm|mmm|yy|mm|dd|m|d/g) ?? []) {\n const kind = (token[0] === 'y' ? 'y' : token[0] === 'm' ? 'm' : 'd') as 'y' | 'm' | 'd';\n if (order.indexOf(kind) < 0) order.push(kind);\n }\n let y: number | null = null;\n let m: number | null = namedMonth;\n let d: number | null = null;\n let cursor = 0;\n for (const kind of order) {\n if (kind === 'm' && namedMonth !== null) continue;\n if (cursor >= numbers.length) break;\n const value = numbers[cursor];\n cursor += 1;\n if (kind === 'y') y = value;\n else if (kind === 'm') m = value;\n else d = value;\n }\n if (y === null && m === null && d === null && !timeMatch) return null;\n const today = nowWall();\n if (y === null) y = today.y;\n else if (y < 100) y = y < 50 ? 2000 + y : 1900 + y;\n if (m === null) m = today.m;\n if (d === null) d = 1;\n if (m < 1 || m > 12 || d < 1 || d > 31) return null;\n const probe = new NativeDate(NativeDate.UTC(y, m - 1, d));\n if (\n probe.getUTCFullYear() !== y ||\n probe.getUTCMonth() !== m - 1 ||\n probe.getUTCDate() !== d\n ) {\n return null;\n }\n return { y, m, d, H, M, S };\n };\n\n const afDateFormatEx = (format: unknown): void => {\n if (!state) return;\n const raw = String(state.event.value ?? '');\n if (raw.trim() === '') return;\n let date: Date = new FixedDate(raw);\n if (Number.isNaN(date.getTime())) {\n const parts = parseDateLoose(raw, format);\n if (!parts) return; // unparsable: leave the value untouched\n date = wallDate(parts);\n }\n state.event.value = printd(format, date);\n };\n host.AFDate_FormatEx = afDateFormatEx;\n host.AFDate_Format = (index: unknown): void =>\n afDateFormatEx(DATE_FORMATS[Math.trunc(Number(index))] ?? 'm/d/yy');\n\n const afDateKeystrokeEx = (format: unknown): void => {\n if (!state || !state.event.willCommit) return;\n const merged = mergeChange(state.event);\n if (merged.trim() === '') return;\n if (!parseDateLoose(merged, format)) dateMismatch(format);\n };\n host.AFDate_KeystrokeEx = afDateKeystrokeEx;\n host.AFDate_Keystroke = (index: unknown): void =>\n afDateKeystrokeEx(DATE_FORMATS[Math.trunc(Number(index))] ?? 'm/d/yy');\n\n const afTimeFormatEx = (format: unknown): void => {\n if (!state) return;\n const raw = String(state.event.value ?? '');\n if (raw.trim() === '') return;\n const parts = parseDateLoose(raw, format);\n if (!parts) return;\n state.event.value = printd(format, wallDate(parts));\n };\n host.AFTime_FormatEx = afTimeFormatEx;\n host.AFTime_Format = (index: unknown): void =>\n afTimeFormatEx(TIME_FORMATS[Math.trunc(Number(index))] ?? 'HH:MM');\n host.AFTime_Keystroke = (index: unknown): void => {\n if (!state || !state.event.willCommit) return;\n const merged = mergeChange(state.event);\n if (merged.trim() === '') return;\n if (!parseDateLoose(merged, TIME_FORMATS[Math.trunc(Number(index))] ?? 'HH:MM')) {\n dateMismatch(TIME_FORMATS[Math.trunc(Number(index))] ?? 'HH:MM');\n }\n };\n\n // QuickJS does not provide browser networking, but explicitly shadow these\n // names so a future adapter cannot accidentally inject ambient authority.\n host.fetch = undefined;\n host.XMLHttpRequest = undefined;\n host.WebSocket = undefined;\n}\n\n/** The exact self-contained source evaluated in Node parity tests and QuickJS. */\nexport const PRELUDE_SOURCE = `(${installAcroJs.toString()})(globalThis);`;\n"],"mappings":";;;;;;AAMA,SAAgB,gCAAgC,MAA+B;CAC7E,IAAI,KAAK,YACP,MAAM,IAAI,MAAM,mDAAmD;CAGrE,MAAM,UAAoB,CAAC;CAC3B,MAAM,SAAS,SAA8B;EAG3C,IAAI,KAAK,SAAS,cAAc,QAAQ,KAAK,KAAK,MAAM;EACxD,KAAK,MAAM,SAAS,KAAK,MAAM,MAAM,KAAK;CAC5C;CACA,IAAI,KAAK,MAAM,MAAM,KAAK,IAAI;CAC9B,OAAO;AACT;;AAGA,SAAgB,gCAAgC,MAA6B;CAC3E,OAAO,gCAAgC,IAAI,CAAC,CAAC,KAAK,OAAO;AAC3D;;;;;;;;;;;;;;;;ACVA,SAAgB,iBACd,OAC4C;CAC5C,QAAQ,MAAM,IAAd;EACE,KAAK,KACH,OAAO;EACT,KAAK,KACH,OAAO;GAAE,GAAG,MAAM;GAAI,GAAG,MAAM;GAAI,GAAG,MAAM;EAAG;EACjD,KAAK,OACH,OAAO;GAAE,GAAG,MAAM;GAAI,GAAG,MAAM;GAAI,GAAG,MAAM;EAAG;EACjD,KAAK,QAAQ;GACX,MAAM,GAAG,GAAG,GAAG,GAAG,KAAK;GACvB,OAAO;IACL,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IACxB,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IACxB,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;GAC1B;EACF;CACF;AACF;AAEA,MAAM,WAAW,UAA0B,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC;AACzE,MAAM,OAAO,UACX,KAAK,MAAM,QAAQ,KAAK,IAAI,GAAG,CAAC,CAC7B,SAAS,EAAE,CAAC,CACZ,SAAS,GAAG,GAAG;;AAGpB,SAAgB,iBAAiB,OAAwC;CACvE,MAAM,MAAM,iBAAiB,KAAK;CAClC,OAAO,QAAQ,OAAO,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;AACtE;;AAGA,SAAgB,iBAAiB,KAAkD;CACjF,IAAI,CAAC,KAAK,OAAO,CAAC,GAAG;CACrB,MAAM,MAAM,IAAI,KAAK,CAAC,CAAC,QAAQ,MAAM,EAAE;CACvC,MAAM,OACJ,IAAI,WAAW,IACX,IACG,MAAM,EAAE,CAAC,CACT,KAAK,OAAO,KAAK,EAAE,CAAC,CACpB,KAAK,EAAE,IACV;CACN,IAAI,CAAC,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,GAAG;CAC/C,MAAM,WAAW,WAAmB,SAAS,KAAK,MAAM,QAAQ,SAAS,CAAC,GAAG,EAAE,IAAI;CACnF,OAAO;EAAC;EAAO,QAAQ,CAAC;EAAG,QAAQ,CAAC;EAAG,QAAQ,CAAC;CAAC;AACnD;;AAGA,SAAgB,mBAAmB,OAA2C;CAC5E,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG,OAAO;CACxD,MAAM,CAAC,OAAO,GAAG,SAAS;CAE1B,MAAM,WAAW;EADwB,GAAG;EAAG,GAAG;EAAG,KAAK;EAAG,MAAM;CAC7C,EAAE,OAAO,KAAK;CACpC,OACE,aAAa,KAAA,KACb,MAAM,WAAW,YACjB,MAAM,OAAO,SAAS,OAAO,SAAS,YAAY,OAAO,SAAS,IAAI,CAAC;AAE3E;;;;;;;;;;AC0FA,MAAa,sBAAmE,OAAO,OAAO;CAC5F,QAAQ;EAAC;EAAe;EAAa;EAAW;EAAS;EAAe;EAAQ;CAAM;CACtF,QAAQ;EAAC;EAAe;EAAa;EAAW;EAAS;EAAe;EAAQ;CAAM;CACtF,SAAS;EAAC;EAAe;EAAa;EAAW;EAAS;EAAe;EAAQ;CAAM;CACvF,UAAU;EAAC;EAAe;EAAa;EAAW;EAAS;EAAe;EAAQ;CAAM;CACxF,MAAM;EAAC;EAAe;EAAa;EAAW;EAAS;EAAe;EAAQ;CAAM;CACpF,KAAK;EAAC;EAAe;EAAW;EAAS;CAAM;CAC/C,aAAa;EAAC;EAAe;EAAa;EAAW;CAAM;CAC3D,WAAW,CAAC,eAAe,SAAS;CACpC,WAAW,CAAC,eAAe,SAAS;CACpC,UAAU,CAAC,eAAe,SAAS;CACnC,WAAW,CAAC,eAAe,SAAS;CACpC,OAAO,CAAC,eAAe,SAAS;CAChC,MAAM;EAAC;EAAe;EAAW;CAAM;CACvC,OAAO,CAAC,MAAM;CACd,mBAAmB,CAAC,eAAe,SAAS;AAC9C,CAAC;AA0GD,MAAa,wBAAgD,OAAO,OAAO;CACzE,gBAAgB;CAChB,gBAAgB,KAAK,OAAO;CAC5B,eAAe,MAAM;CACrB,YAAY;CACZ,gBAAgB,OAAO;AACzB,CAAC;AAsBD,MAAa,iCAAiE,OAAO,OAAO;CAC1F,SAAS;CACT,gBAAgB;CAChB,cAAc;CACd,YAAY;CACZ,YAAY;CACZ,aAAa;CACb,yBAAyB;CACzB,mBAAmB;AACrB,CAAC;;;;AAKD,MAAa,sBAAsB,OAAO,OAAO;CAC/C,UAAU;CACV,OAAO,OAAO,OAAO;EACnB,WAAW;EACX,UAAU;EACV,WAAW;EACX,QAAQ;CACV,CAAC;CACD,YAAY;CACZ,MAAM;CACN,kBAAkB;CAClB,YAAY,OAAO,OAAO;EACxB,gBAAgB;EAChB,OAAO;CACT,CAAC;CACD,YAAY;AACd,CAAU;;;;;;ACxQV,SAAgB,SAAS,YAAoB,UAA0B;CACrE,IAAI,OAAO;CACX,KAAK,MAAM,QAAQ,GAAG,WAAW,GAAG,YAAY;EAC9C,QAAQ,KAAK,WAAW,CAAC;EACzB,OAAO,KAAK,KAAK,MAAM,QAAQ;CACjC;CACA,OAAO,SAAS;AAClB;;;AAIA,SAAgB,sBACd,KACA,WACgB;CAChB,MAAM,SAAS,IAAI,SAAS;CAC5B,MAAM,WAAW,OAAO,cAAc,aAAa,UAAU,IAAK,aAAa,CAAC;CAChF,OAAO;EACL,MAAM,SAAS,QAAQ,QAAQ,gBAAgB,QAAQ,WAAW;EAClE,WAAW,SAAS,aAAa,QAAQ,WAAW;EACpD,aAAa,SAAS,eAAe,QAAQ,YAAY;EACzD,OAAO,SAAS,SAAS;CAC3B;AACF;AAEA,SAAgB,iBAAiB,SAAwC;CACvE,MAAM,SAAS,QAAQ,UAAU;CAKjC,IAAI,OAAsB,QAAQ,QAAQ;CAC1C,MAAM,WAAc,cAA4C;EAC9D,MAAM,SAAS,KAAK,KAAK,WAAW,SAAS;EAC7C,OAAO,OAAO,WACN,KAAA,SACA,KAAA,CACR;EACA,OAAO;CACT;CAEA,IAAI,iBAAgD;CACpD,IAAI,SAAS;CACb,IAAI,cAAmC;CACvC,IAAI,mBAA6C;CACjD,IAAI,WAAW;CACf,IAAI,WAAW;CAEf,MAAM,sBAA8C;EAClD,mBAAA,iBAAmB,QAAQ,eAAe;EAC1C,OAAO;CACT;CAEA,MAAM,YAAY,WAA0C;EAC1D,UAAU;GACR,GAAG,QAAQ,SAAS;GACpB,GAAI,MAAM,eAAe,KAAA,IAAY,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;EAC3E;EACA,UAAU,QAAQ,SAAS;EAC3B,aAAa,QAAQ,YAAY,UAAU;EAC3C,QAAQ,MAAM;EACd,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;EAC/C,GAAI,MAAM,aAAa,EAAE,YAAY,MAAM,WAAW,IAAI,CAAC;EAC3D,GAAI,MAAM,wBAAwB,KAAA,IAC9B,EAAE,qBAAqB,MAAM,oBAAoB,IACjD,CAAC;EACL,OAAO,MAAM;CACf;;CAGA,MAAM,aAAa,YAAiC;EAClD,IAAI,CAAC,QAAQ,UAAU;EACvB,iBAAiB;EACjB,SAAS;EACT,cAAc;CAChB;CAEA,MAAM,UAAU,OACd,OACA,cACiC;EACjC,IAAI,QAAQ,OAAO;EAGnB,SAAS;EACT,MAAM,UAAU,MAAM,cAAc;EACpC,qBAAA,mBAAqB,QAAQ,YAAY;EACzC,IAAI,UAAoB,CAAC;EACzB,IAAI;GACF,UAAU,MAAM;EAClB,SAAS,OAAO;GACd,mBAAmB;GAGnB,OAAO;IACL,OAAO;KAAE,IAAI;KAAM,OAAO;KAAM,QAAQ;KAAI,UAAU;KAAG,QAAQ;IAAE;IACnE,aAAa,CAAC;IACd,cAAc,CAAC;IACf,WAAW,CAAC;IACZ,aAAa,CACX;KACE,MAAM;KACN,SAAS,wDAAwD,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;IACxH,CACF;GACF;EACF;EACA,IAAI,QAAQ,WAAW,GAAG,OAAO;EACjC,MAAM,SAAS,QAAQ,KACrB,SACA,SAAS;GAAE,GAAG;GAAO,OAAO,EAAE,MAAM,iBAAiB;EAAE,CAAC,GACxD,aAAa,MACf;EACA,UAAU,OAAO;EACjB,OAAO;CACT;CAEA,MAAM,SAAS,OACb,SACA,OACA,cAC0B;EAC1B,IAAI,CAAC,QAEH,cAAc,MAAM,QAAQ,OAAO,SAAS;EAE9C,MAAM,UAAU,MAAM,cAAc;EACpC,MAAM,SAAS,QAAQ,IAAI,SAAS,SAAS,KAAK,GAAG,aAAa,MAAM;EACxE,UAAU,OAAO;EACjB,OAAO;CACT;CAEA,OAAO;EACL,YAAe,MAA0D;GACvE,IAAI,UAAU,OAAO,QAAQ,uBAAO,IAAI,MAAM,yBAAyB,CAAC;GACxE,OAAO,cACL,KAAK;IACH,MAAM,OAAO,OAAO,cAAc;KAChC,IAAI,aAAa;MACf,MAAM,SAAS;MACf,cAAc;MACd,OAAO;KACT;KACA,OAAO,QAAQ,OAAO,SAAS;IACjC;IACA,MAAM,SAAS,OAAO,cAAc,OAAO,SAAS,OAAO,SAAS;GACtE,CAAC,CACH;EACF;EACA,UAAU;GACR,WAAW;GACX,MAAM,QAAQ;GACd,iBAAiB;GACjB,SAAS;GACT,cAAc;GACd,OAAY,MAAM,YAAY,QAAQ,QAAQ,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS;EACxE;CACF;AACF;;;ACtOA,SAAS,eAAe,OAAoC;CAC1D,QAAQ,MAAM,MAAd;EACE,KAAK,UACH,OAAO,MAAM;EACf,KAAK,SACH,OAAO,CAAC,GAAG,MAAM,MAAM;EACzB,KAAK;EACL,KAAK,eACH,OAAO;CACX;AACF;AAEA,SAAS,oBAAoB,QAAyB,OAAoC;CACxF,KAAK,WAAW,cAAc,WAAW,YAAY,MAAM,SAAS,QAAQ,OAAO;CACnF,OAAO,eAAe,KAAK;AAC7B;;AAGA,SAAgB,yBAAyB,UAA4C;CACnF,OAAO,SAAS,OAAO,KAAK,WAAyB;EACnD,KAAK,MAAM;EACX,MAAM,MAAM;EACZ,QAAQ,MAAM;EACd,OAAO,oBAAoB,MAAM,QAAQ,MAAM,UAAU;EACzD,cAAc,oBAAoB,MAAM,QAAQ,MAAM,iBAAiB;EAGvE,SAAS;EACT,UAAU,MAAM,MAAM;EACtB,UAAU,MAAM,MAAM;EACtB,GAAI,aAAa,QACb,EAAE,SAAS,MAAM,QAAQ,KAAK,YAAY;GAAE,OAAO,OAAO;GAAO,OAAO,OAAO;EAAM,EAAE,EAAE,IACzF,CAAC;CACP,EAAE;AACJ;;;;;;;;;;ACpCA,SAAgB,cAAc,GAAkC;CAmC9D,MAAM,OAAO;CACb,MAAM,aAAa;CACnB,IAAI,QAAyB;CAE7B,MAAM,cAAc,UAClB,MAAM,QAAQ,KAAK,IAAI,MAAM,KAAK,SAAS,OAAO,IAAI,CAAC,IAAI;CAC7D,MAAM,aAAa,GAAY,MAAwB;EACrD,IAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,GACrC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,MAAM,UAAU,SAAS,EAAE,MAAM;EAE5E,OAAO,MAAM;CACf;CACA,MAAM,UAAU,QAAyB;EACvC,MAAM,QAAQ;EACd,OAAO,OAAO,SAAS,iBACnB,OAAO,OAAO,MAAM,iBAAiB,MACrC,OAAO,OAAO,OAAO,QAAQ,EAAE;CACrC;CACA,MAAM,cAAc,MAAc,YAA0B;EAC1D,OAAO,YAAY,KAAK;GAAE;GAAM;EAAQ,CAAC;CAC3C;CACA,MAAM,WAAW,QAA2B;EAC1C,WAAW,mBAAmB,GAAG,IAAI,oCAAoC;CAE3E;CACA,MAAM,eAAe,UAA2B;EAC9C,IAAI,OAAO,UAAU,UAAU,OAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;EACvE,MAAM,SAAS,OAAO,OAAO,SAAS,EAAE,CAAC,CAAC,QAAQ,eAAe,EAAE,CAAC;EACpE,OAAO,OAAO,SAAS,MAAM,IAAI,SAAS;CAC5C;CACA,MAAM,iBAAiB,YACrB,YAAY,WAAW,IAAI,YAAY,YAAY,IAAI,YAAY,WAAW,IAAI;CACpF,MAAM,iBAAiB,SACrB,OAAO,IAAI,MAAM,IACb,WACA,OAAO,IAAI,MAAM,IACf,YACA,OAAO,IAAI,MAAM,IACf,WACA;CACV,MAAM,aAAa,SACjB,SAAS,oBACL,aACA,SAAS,oBACP,cACA,SAAS,mBACP,aACA,SAAS,oBACP,cACA,SAAS,iBACP,WACA;CAEd,MAAM,MAAiB,CAAC;CAExB,MAAM,aAAa,WAAmC;EACpD,MAAM,QAAQ,OAAO;EACrB,MAAM,UAAqB,CAAC;EAC5B,OAAO,iBAAiB,SAAS;GAC/B,MAAM;IAAE,YAAY;IAAM,WAAW,MAAM;GAAK;GAChD,MAAM;IAAE,YAAY;IAAM,WAAW,MAAM;GAAO;GAClD,OAAO;IACL,YAAY;IACZ,WAAW,WAAW,OAAO,KAAK;IAClC,MAAM,UAAmB;KACvB,OAAO,QAAQ,WAAW,KAAK;IACjC;GACF;GACA,eAAe;IACb,YAAY;IACZ,WACE,MAAM,QAAQ,OAAO,KAAK,IAAI,OAAO,MAAM,KAAK,GAAG,IAAI,OAAO,OAAO,SAAS,EAAE;GACpF;GACA,cAAc;IAAE,YAAY;IAAM,WAAW,WAAW,MAAM,YAAY;GAAE;GAC5E,UAAU;IACR,YAAY;IACZ,WAAW,QAAQ,MAAM,QAAQ;IACjC,WAAW;KACT,WAAW,mBAAmB,+CAA+C;IAC/E;GACF;GACA,UAAU;IACR,YAAY;IACZ,WAAW,QAAQ,MAAM,QAAQ;IACjC,WAAW;KACT,WAAW,mBAAmB,+CAA+C;IAC/E;GACF;GACA,SAAS;IACP,YAAY;IACZ,WAAW,cAAc,OAAO,OAAO;IACvC,MAAM,UAAmB;KACvB,OAAO,UAAU,cAAc,KAAK;IACtC;GACF;GACA,QAAQ;IAAE,YAAY;IAAO,WAAW;GAAI;EAC9C,CAAC;EACD,QAAQ,iBAAiB,WAAW,mBAAmB,uCAAuC;EAC9F,OAAO;CACT;CAEA,MAAM,YAAY,SAChB,OAAO,aAAa,IAAI,OAAO,IAAI,CAAC,CAAC,EAAE,WAAW;CAIpD,MAAM,iBAA2C;EAC/C,QAAQ;GAAC;GAAe;GAAa;GAAW;GAAS;GAAe;GAAQ;EAAM;EACtF,QAAQ;GAAC;GAAe;GAAa;GAAW;GAAS;GAAe;GAAQ;EAAM;EACtF,SAAS;GAAC;GAAe;GAAa;GAAW;GAAS;GAAe;GAAQ;EAAM;EACvF,UAAU;GAAC;GAAe;GAAa;GAAW;GAAS;GAAe;GAAQ;EAAM;EACxF,MAAM;GAAC;GAAe;GAAa;GAAW;GAAS;GAAe;GAAQ;EAAM;EACpF,KAAK;GAAC;GAAe;GAAW;GAAS;EAAM;EAC/C,aAAa;GAAC;GAAe;GAAa;GAAW;EAAM;EAC3D,WAAW,CAAC,eAAe,SAAS;EACpC,WAAW,CAAC,eAAe,SAAS;EACpC,UAAU,CAAC,eAAe,SAAS;EACnC,WAAW,CAAC,eAAe,SAAS;EACpC,OAAO,CAAC,eAAe,SAAS;EAChC,MAAM;GAAC;GAAe;GAAW;EAAM;EACvC,OAAO,CAAC,MAAM;EACd,mBAAmB,CAAC,eAAe,SAAS;CAC9C;CACA,MAAM,kBAAkB;EAAC;EAAU;EAAS;EAAY;EAAU;EAAU;CAAc;CAC1F,MAAM,eAAuC;EAC3C,QAAQ;EACR,QAAQ;EACR,MAAM;EACN,SAAS;EACT,UAAU;EACV,KAAK;EACL,aAAa;EACb,WAAW;EACX,WAAW;EACX,UAAU;EACV,WAAW;EACX,MAAM;EACN,OAAO;EACP,OAAO;EACP,mBAAmB;CACrB;CACA,MAAM,gBAAgB,UAA4B;EAChD,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG,OAAO;EAExD,MAAM,WAAW;GADwB,GAAG;GAAG,GAAG;GAAG,KAAK;GAAG,MAAM;EAC7C,EAAE,OAAO,MAAM,EAAE;EACvC,OACE,aAAa,KAAA,KACb,MAAM,WAAW,WAAW,KAC5B,MAAM,MAAM,CAAC,CAAC,CAAC,OAAO,SAAS,OAAO,SAAS,YAAY,SAAS,OAAO,IAAI,CAAC,CAAC;CAErF;CACA,MAAM,oBAAoB,UAAoC;EAC5D,MAAM,QAAQ;EACd,MAAM,QAAQ,OAAO,MAAM,EAAE;EAC7B,IAAI,UAAU,KAAK,OAAO;EAC1B,IAAI,UAAU,KAAK,OAAO;GAAC,OAAO,MAAM,EAAE;GAAG,OAAO,MAAM,EAAE;GAAG,OAAO,MAAM,EAAE;EAAC;EAC/E,IAAI,UAAU,OAAO,OAAO;GAAC,OAAO,MAAM,EAAE;GAAG,OAAO,MAAM,EAAE;GAAG,OAAO,MAAM,EAAE;EAAC;EACjF,MAAM,IAAI,OAAO,MAAM,EAAE;EACzB,MAAM,IAAI,OAAO,MAAM,EAAE;EACzB,MAAM,IAAI,OAAO,MAAM,EAAE;EACzB,MAAM,IAAI,OAAO,MAAM,EAAE;EACzB,OAAO;GAAC,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;EAAC;CAChF;CACA,MAAM,kBAAkB,GAAY,MAAwB;EAC1D,IAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,GACrC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,MAAM,UAAU,SAAS,EAAE,MAAM;EAE5E,OAAO,MAAM;CACf;CACA,MAAM,mBAAmB,UAA6B,MAAM,QAAQ,KAAK,IAAI,CAAC,GAAG,KAAK,IAAI;CAE1F,MAAM,aAAa,WAAmC;EACpD,MAAM,QAAQ,OAAO;EACrB,MAAM,UAAU,OAAO,MAAM,OAAO;EACpC,MAAM,WAAW,eAAe,YAAY,CAAC;EAC7C,MAAM,UAAqB,CAAC;EAC5B,MAAM,SAAS,KAAa,OAAgB,aAA4C;GAGtF,IAAI,QAAQ,cAAc,gBAAgB,QAAQ,GAAG,IAAI,KAAK,SAAS,QAAQ,GAAG,IAAI,GAAG;IACvF,WACE,mBACA,SAAS,IAAI,+BAA+B,QAAQ,kBACtD;IACA;GACF;GACA,IAAI,MAAM,cAAc,gBAAgB,QAAQ,GAAG,IAAI,KAAK,QAAQ,YAAY;IAC9E,WACE,mBACA,SAAS,IAAI,KAAK,QAAQ,2CAC5B;IACA;GACF;GACA,IAAI,CAAC,SAAS,KAAK,GAAG;IACpB,WAAW,uBAAuB,SAAS,IAAI,gCAAgC;IAC/E;GACF;GACA,OAAO,QAAQ,OAAO,gBAAgB,KAAK;EAC7C;EACA,MAAM,QAAQ,KAAa,cAA2D;GACpF,YAAY;GACZ,WAAW,gBAAgB,OAAO,QAAQ,IAAI;GAC9C,MAAM,UAAmB,MAAM,KAAK,OAAO,QAAQ;EACrD;EACA,MAAM,SAAS,MAAe,OAAO,MAAM,YAAY,SAAS,CAAC;EACjE,MAAM,UAAU,MAAe,OAAO,MAAM;EAC5C,OAAO,iBAAiB,SAAS;GAC/B,MAAM;IAAE,YAAY;IAAM,WAAW,OAAO,MAAM,QAAQ,EAAE;GAAE;GAC9D,MAAM;IAAE,YAAY;IAAM,WAAW,aAAa,YAAY;GAAQ;GACtE,MAAM;IAAE,YAAY;IAAM,WAAW,OAAO,MAAM,QAAQ,CAAC;GAAE;GAC7D,QAAQ;IAAE,YAAY;IAAM,WAAW,OAAO,MAAM,UAAU,EAAE;GAAE;GAClE,SAAS;IAAE,YAAY;IAAM,WAAW,OAAO,MAAM,WAAW,EAAE;GAAE;GACpE,aAAa,KAAK,eAAe,YAAY;GAC7C,WAAW,KAAK,aAAa,YAAY;GACzC,SAAS,KAAK,YAAY,MAAM,MAAM,CAAC,KAAK,OAAO,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC;GAC5E,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC;GACtD,OAAO,KAAK,gBAAgB,MAAM,MAAM,OAAO,MAAM,GAAG;GACxD,MAAM,KAAK,SAAS,MAAM,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM,KAAK,CAAC;GAC5D,MAAM,KAAK,SAAS,MAAM,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,KAAK,EAAE,MAAM,KAAK,CAAC;GAC9E,UAAU,KAAK,aAAa,MAAM,OAAO,MAAM,QAAQ;GACvD,QAAQ,KAAK,UAAU,MAAM;GAC7B,OAAO,KAAK,SAAS,MAAM;GAC3B,UAAU,KAAK,YAAY,MAAM;GACjC,MAAM,KAAK,UAAU,MAAM;GAC3B,QAAQ,KAAK,UAAU,MAAM;GAC7B,cAAc,KAAK,gBAAgB,MAAM;GACzC,KAAK;IAAE,YAAY;IAAO,WAAW;GAAI;EAC3C,CAAC;EACD,QAAQ,iBAAiB;GACvB,MAAM,MAAiB,CAAC;GACxB,KAAK,MAAM,OAAO,OAAO,KAAK,OAAO,OAAO,GAAG,IAAI,OAAO,gBAAgB,OAAO,QAAQ,IAAI;GAC7F,OAAO;EACT;EACA,QAAQ,YAAY,UAAmB;GACrC,MAAM,SAAU,SAAS,CAAC;GAC1B,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAGlC,QAAuB,OAAO,OAAO;EAEzC;EACA,OAAO;CACT;CAEA,MAAM,aAAa,SAAuC;EACxD,IAAI,CAAC,OAAO,OAAO;EACnB,MAAM,QAAS,MAAgC;EAC/C,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM;GACzC,IAAI,CAAC,MAAM,qBACT,WACE,mBACA,+FACF;GAEF,OAAO,MAAM,OAAO,SAAS,MAAM,OAAO,KAAK,WAAW,OAAO,OAAO,IAAI;EAC9E;EACA,MAAM,OAAO,KAAK,MAAM,OAAO,KAAK,CAAC;EACrC,IAAI,CAAC,MAAM,WAAW,IAAI,IAAI,GAAG;GAC/B,WACE,mBACA,mBAAmB,KAAK,kEAC1B;GACA,OAAO;EACT;EACA,MAAM,UAAU,MAAM,aAAa,IAAI,IAAI,KAAK,CAAC;EACjD,OAAO,QAAQ,SAAS,QAAQ,KAAK,WAAW,OAAO,OAAO,IAAI;CACpE;CACA,MAAM,YAAY,OAAgB,SAAoC;EACpE,MAAM,UAAU,UAAU,EAAE,MAAM,CAAC;EACnC,IAAI,CAAC,SAAS,OAAO;EACrB,KAAK,MAAM,WAAW,SACpB,IAAI,OAAQ,QAAsB,IAAI,MAAM,OAAO,IAAI,GAAG,OAAO;EAEnE,OAAO;CACT;CACA,IAAI,YAAY;CAChB,IAAI,WAAW;CAEf,OAAO,iBAAiB,KAAK;EAC3B,kBAAkB;GAChB,YAAY;GACZ,WAAW,QAAQ,OAAO,MAAM,SAAA,EAAoC,YAAY,EAAE;EACpF;EACA,WAAW;GAAE,YAAY;GAAM,WAAW,OAAO,OAAO,UAAU;EAAE;EACpE,SAAS;GACP,YAAY;GACZ,WAAW,QAAQ,OAAO,MAAM,SAAA,EAAoC,cAAc,CAAC;GACnF,MAAM,UAAmB;IACvB,MAAM,OAAO,KAAK,MAAM,OAAO,KAAK,CAAC;IACrC,IAAI,OAAO,SAAS,IAAI,GAAG,OAAO,UAAU,KAAK;KAAE,MAAM;KAAY;IAAK,CAAC;GAC7E;EACF;CACF,CAAC;CACD,IAAI,WAAW;CACf,IAAI,mBAAmB,UACrB,OAAO,OAAO,OAAO,KAAK,MAAM,OAAO,KAAK,CAAC,EAAE,EAAE,MAAM,QAAQ,EAAE;CACnE,IAAI,aAAa,UAAoB;EACnC,IAAI,CAAC,OAAO;EACZ,MAAM,YACJ,UAAU,KAAA,IACN,MAAM,UACL,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAA,CACnC,KAAK,SAAS,MAAO,aAAa,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,CACpD,QAAQ,UAAgC,UAAU,KAAA,CAAS;EACpE,KAAK,MAAM,SAAS,WAAW;GAC7B,MAAM,QAAQ,WAAW,MAAM,MAAM,YAAY;GACjD,MAAM,MAAM,OAAO,MAAM,MAAM,GAAG;GAClC,IAAI,CAAC,MAAM,UAAU,IAAI,GAAG,GAAG;IAC7B,MAAM,UAAU,IAAI,GAAG;IACvB,MAAM,UAAU,KAAK,MAAM,MAAM,GAAgB;GACnD;EACF;CACF;CACA,IAAI,cAAc,OAAO,UAAU,KAAK,EAAE,MAAM,QAAQ,CAAC;CAMzD,IAAI,cAAc,YAAsB,MAAgB,QAAkB,YAAsB;EAC9F,IAAI,CAAC,OAAO;EACZ,MAAM,OACJ,eAAe,QAAQ,OAAO,eAAe,WACxC,aACD;GAAE,MAAM;GAAkB;GAAc;GAAiB;EAAQ;EACvE,MAAM,QAAQ,MAAM,QAAQ,KAAK,OAAO,IACnC,KAAK,QAAsB,KAAK,SAAS,OAAO,IAAI,CAAC,IACtD;EACJ,MAAM,WAAW,KAAK,cAAc,KAAA,IAAY,KAAA,IAAY,OAAO,KAAK,SAAS,CAAC,CAAC,YAAY;EAC/F,MAAM,SACJ,aAAa,QACT,QACA,aAAa,SACX,SACA,aAAa,SACX,SACA,aAAa,QACX,QACA,KAAK,SAAS,QACZ,SACA,KAAA;EACd,MAAM,UAAU,KAAK;GACnB,MAAM;GACN,KAAK,KAAK,SAAS,KAAA,KAAa,KAAK,SAAS,OAAO,OAAO,OAAO,KAAK,IAAI;GAC5E,YAAY;GACZ,cAAc,QAAQ,KAAK,MAAM;GACjC,GAAI,WAAW,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO;GACzC,GAAI,KAAK,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,QAAQ,KAAK,OAAO,QAAQ,OAAO;EAC1E,CAAC;CACH;CACA,IAAI,gBAAgB,QAAQ,SAAS;CACrC,IAAI,eAAe,QAAQ,QAAQ;CAEnC,MAAM,MAAM;EAMV,UAAU;EACV,UAAU;EACV,YAAY;EACZ,iBAAiB;EACjB,eAAe;EACf,cAAc;EACd,QAAQ,SAAkB,MAAgB,OAAiB,UAA4B;GACrF,OAAO,UAAU,KAAK;IACpB,MAAM;IACN,SAAS,OAAO,OAAO;IACvB,MAAM,OAAO,SAAS,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,IAAI;IACrD,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,OAAO,KAAK,EAAE;GACxD,CAAC;GACD,OAAO;EACT;EACA,YAAY,WAAW,mBAAmB,iCAAiC;EAC3E,gBAAgB;GACd,WAAW,mBAAmB,qCAAqC;GACnE,OAAO;EACT;EACA,iBAAiB,QAAQ,eAAe;EAKxC,qBAAgC;GAC9B,WAAW,mBAAmB,6DAA6D;EAE7F;CACF;CAEA,MAAM,OAAO,OAAe,SAAS,MAAc,OAAO,KAAK,CAAC,CAAC,SAAS,QAAQ,GAAG;CACrF,MAAM,aAAa;EACjB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM,YAAY;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM,UAAU,QAAiB,cAA+B;EAC9D,MAAM,cAAe,OAAO,MAAM,eAAe,CAAC;EAClD,MAAM,OACJ,aAAa,OAAQ,UAAwB,YAAY,aACrD,IAAI,WAAW,OAAQ,UAAoC,QAAQ,CAAC,CAAC,IACrE,IAAI,WAAW,OAAO,YAAY,SAAS,CAAC,CAAC;EACnD,MAAM,QAAQ,IAAI,WAChB,KAAK,QAAQ,IAAI,OAAO,YAAY,oBAAoB,CAAC,IAAI,GAC/D;EACA,MAAM,OAAO,MAAM,eAAe;EAClC,MAAM,QAAQ,MAAM,YAAY;EAChC,MAAM,MAAM,MAAM,WAAW;EAC7B,MAAM,OAAO,MAAM,YAAY;EAC/B,MAAM,SAAS,MAAM,cAAc;EACnC,MAAM,SAAS,MAAM,cAAc;EACnC,MAAM,SAAS,OAAO,OAAO,IAAI,KAAK,OAAO;EAC7C,MAAM,SAAiC;GACrC,MAAM,OAAO,IAAI;GACjB,IAAI,IAAI,OAAO,GAAG;GAClB,MAAM,UAAU;GAChB,KAAK,WAAW;GAChB,IAAI,IAAI,QAAQ,CAAC;GACjB,GAAG,OAAO,QAAQ,CAAC;GACnB,IAAI,IAAI,GAAG;GACX,GAAG,OAAO,GAAG;GACb,IAAI,IAAI,IAAI;GACZ,IAAI,IAAI,MAAM;GACd,GAAG,OAAO,MAAM;GAChB,GAAG,OAAO,IAAI;GACd,IAAI,IAAI,MAAM;GACd,GAAG,OAAO,MAAM;GAChB,IAAI,IAAI,MAAM;GACd,IAAI,OAAO,KAAK,OAAO;EACzB;EAGA,OAAO,OAAO,MAAM,CAAC,CAAC,QACpB,qDACC,UAAU,OAAO,MACpB;CACF;CACA,MAAM,OAAO;EACX;EACA,SAAS,QAAiB,GAAG,WAA8B;GACzD,IAAI,QAAQ;GACZ,OAAO,OAAO,MAAM,CAAC,CAAC,QAAQ,gCAAgC,UAAU;IACtE,MAAM,QAAQ,OAAO;IACrB,IAAI,MAAM,SAAS,GAAG,GAAG,OAAO,OAAO,SAAS,EAAE;IAClD,IAAI,MAAM,SAAS,GAAG,GAAG,OAAO,OAAO,KAAK,MAAM,YAAY,KAAK,CAAC,CAAC;IACrE,MAAM,YAAY,UAAU,KAAK,KAAK,CAAC,GAAG;IAC1C,OAAO,YAAY,KAAK,CAAC,CAAC,QAAQ,YAAY,OAAO,SAAS,IAAI,CAAC;GACrE,CAAC;EACH;CACF;CAEA,MAAM,SAAS,OAAkB,WAA6B;EAC5D,MAAM,UAA0B,MAAM,UAAsC,CAAC,EAAA,CAAG,KAAK,UAAU;GAC7F,MAAM,SAAsB;IAC1B,OAAO;IACP,eAAe,WAAW,MAAM,KAAK;IACrC,OAAO,WAAW,MAAM,KAAK;IAC7B,iBAAiB,OAAO,MAAM,WAAW,SAAS;IAClD,SAAS,OAAO,MAAM,WAAW,SAAS;IAC1C,SAAS,CAAC;GACZ;GACA,OAAO,UAAU,UAAU,MAAM;GACjC,OAAO;EACT,CAAC;EACD,MAAM,eAAe,IAAI,IAAI,OAAO,KAAK,UAAU,CAAC,OAAO,MAAM,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC;EACrF,MAAM,cAAc,IAAI,IAAI,OAAO,KAAK,UAAU,CAAC,OAAO,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC;EACnF,MAAM,UAA0B,MAAM,UAAsC,CAAC,EAAA,CAAG,KAC7E,UAAU;GACT,MAAM,0BAAqC;IACzC,aAAa,gBAAgB,MAAM,eAAe,CAAC,GAAG,CAAC;IACvD,WAAW,gBAAgB,MAAM,aAAa,CAAC,GAAG,CAAC;IACnD,SAAS,OAAO,MAAM,WAAW,CAAC;IAClC,OAAO,OAAO,MAAM,SAAS,CAAC;IAC9B,aAAa,OAAO,MAAM,eAAe,GAAG;IAC5C,MAAM,gBAAgB,MAAM,QAAQ,CAAC,CAAC;IACtC,MAAM,gBAAgB,MAAM,QAAQ;KAAC;KAAG;KAAG;KAAG;IAAC,CAAC;IAChD,UAAU,OAAO,MAAM,YAAY,EAAE;IACrC,QAAQ,QAAQ,MAAM,MAAM;IAC5B,OAAO,QAAQ,MAAM,KAAK;IAC1B,UAAU,QAAQ,MAAM,QAAQ;IAChC,QAAQ,QAAQ,MAAM,MAAM;IAC5B,QAAQ,QAAQ,MAAM,MAAM;IAC5B,cAAc,QAAQ,MAAM,YAAY;GAC1C;GACA,MAAM,SAAsB;IAC1B,OAAO;IACP,UAAU,iBAAiB;IAC3B,SAAS,iBAAiB;IAC1B,SAAS,CAAC;GACZ;GACA,OAAO,UAAU,UAAU,MAAM;GACjC,OAAO;EACT,CACF;EACA,MAAM,+BAAe,IAAI,IAA2B;EACpD,KAAK,MAAM,UAAU,QAAQ;GAC3B,MAAM,OAAO,OAAO,OAAO,MAAM,QAAQ,CAAC;GAC1C,MAAM,SAAS,aAAa,IAAI,IAAI;GACpC,IAAI,QAAQ,OAAO,KAAK,MAAM;QACzB,aAAa,IAAI,MAAM,CAAC,MAAM,CAAC;EACtC;EACA,MAAM,aAAc,MAAM,SAAS,CAAC;EACpC,MAAM,SAAS,YAAY,IAAI,OAAO,WAAW,MAAM,CAAC;EACxD,MAAM,SAAS,YAAY,IAAI,OAAO,WAAW,MAAM,CAAC;EACxD,MAAM,eACJ,WAAW,UAAU,KAAA,IACjB,WAAW,WAAW,KAAK,IAC3B,WAAW,QAAQ,SAAS,IAAI;EACtC,MAAM,YACJ,WAAW,SAAS,KAAA,IAChB,OAAO,WAAW,IAAI,IACtB,WAAW,SAAS,mBAClB,QACA;EACR,MAAM,QAAmB;GAGvB,MAAM,WAAW,SAAS,KAAA,IACtB,OAAO,WAAW,IAAI,IACtB,UAAU,OAAO,WAAW,QAAQ,EAAE,CAAC;GAC3C,MAAM;GAIN,QAAQ,QAAQ,YAAY,cAAc,QAAQ,MAAM;GACxD,YAAY,OAAO,QAAQ,MAAM,QAAQ,EAAE;GAC3C,QAAQ,QAAQ,WAAW,EAAE,QAAQ,IAAI;GACzC,OAAO;GACP,QAAQ,OAAO,WAAW,UAAU,EAAE;GACtC,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,WAAW,YAAY,CAAC,CAAC,CAAC;GAClE,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,WAAW,UAAU,CAAC,CAAC,CAAC;GAC9D,YAAY,QAAQ,WAAW,UAAU;GACzC,UAAU,QAAQ,WAAW,QAAQ;GACrC,OAAO,QAAQ,WAAW,KAAK;GAC/B,IAAI;EACN;EACA,QAAQ;GACN;GACA;GACA;GACA;GACA;GACA;GACA,YAAY,IAAI,KACZ,MAAM,cAAwC,CAAC,EAAA,CAAG,KAAK,SAAS,KAAK,MAAM,OAAO,IAAI,CAAC,CAAC,CAC5F;GACA,qBAAqB,QAAQ,MAAM,mBAAmB;GACtD;GACA,WAAW,CAAC;GACZ,2BAAW,IAAI,IAAI;GACnB,WAAW,CAAC;GACZ,aAAa,CAAC;GACd,aAAa,OAAQ,MAAM,aAAuC,cAAc,CAAC,MAAM;GACvF,YAAY,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,QAAQ,cAAc,GAAG,CAAC,CAAC;EACvE;EACA,KAAK,QAAQ;EACb,KAAK,WAAW,EAAE,GAAK,MAAM,YAAsC,CAAC,EAAG;CACzE;CAEA,MAAM,aAAa,OAAoB,UAAqC;EAC1E,MAAM,SAAS,OAAO,MAAM,MAAM,MAAM;EACxC,IAAI,WAAW,QAAQ,OAAO;GAAE,MAAM;GAAQ,OAAO,OAAO,SAAS,EAAE;EAAE;EACzE,IAAI,WAAW,cAAc,WAAW,SAGtC,OAAO;GAAE,MAAM;GAAU,OADvB,UAAU,QAAQ,UAAU,KAAA,KAAa,OAAO,KAAK,MAAM,QAAQ,OAAO,OAAO,KAAK;EAClD;EAExC,IAAI,WAAW,YAEb,OAAO;GAAE,MAAM;GAAU,QADR,MAAM,QAAQ,KAAK,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,OAAO,SAAS,EAAE,CAAC;EAClD;EAE5C,IAAI,WAAW,WACb,OAAO;GACL,MAAM;GACN,QAAQ,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,CAAC,OAAO,SAAS,EAAE,CAAC;EACzE;EAEF,WACE,uBACA,UAAU,OAAO,MAAM,MAAM,IAAI,EAAE,iCACrC;EACA,OAAO;CACT;CAEA,MAAM,qBAAgC;EACpC,IAAI,QAAQ,OAAO,MAAM,EAAE;EAC3B,OAAO,WAAW,OAAO,MAAM,SAAS,IAAI;EAC5C,QAAQ,OAAO,OAAO,MAAM,UAAU,EAAE;EACxC,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,OAAO,MAAM,YAAY,CAAC,CAAC,CAAC;EACpE,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,OAAO,MAAM,UAAU,CAAC,CAAC,CAAC;CAClE;CAEA,MAAM,eAA0B;EAC9B,IAAI,CAAC,OAAO,MAAM,IAAI,MAAM,sCAAsC;EAClE,MAAM,aAAa,MAAM,MAAM;EAC/B,MAAM,SAAS,MAAM,YAAY,IAAI,OAAO,WAAW,MAAM,CAAC;EAC9D,MAAM,OAAO,OAAO,WAAW,QAAQ,EAAE;EACzC,IAAI,UAAU,SAAS,mBAAmB,OAAO,QAAQ,WAAW,MAAM,MAAM,KAAK;EAErF,MAAM,cAA2B,CAAC;EAClC,IAAI,MAAM,UAAU,SAAS,GAAG,YAAY,KAAK;GAAE,MAAM;GAAS,MAAM,CAAC,GAAG,MAAM,SAAS;EAAE,CAAC;EAC9F,KAAK,MAAM,SAAS,MAAM,QAAQ;GAChC,MAAM,MAAM,OAAO,MAAM,MAAM,GAAG;GAIlC,MAAM,gBAAgB,MAAM,UAAU,IAAI,GAAG,IACzC,MAAM,MAAM,eACZ,MAAM;GACV,IAAI,CAAC,UAAU,MAAM,OAAO,aAAa,GAAG;IAC1C,MAAM,QAAQ,UAAU,OAAO,MAAM,KAAK;IAC1C,IAAI,OAAO,YAAY,KAAK;KAAE,MAAM;KAAY,KAAK,MAAM,MAAM;KAAK;IAAM,CAAC;GAC/E;GACA,IAAI,MAAM,YAAY,MAAM,iBAC1B,YAAY,KAAK;IAAE,MAAM;IAAc,KAAK,MAAM,MAAM;IAAK,SAAS,MAAM;GAAQ,CAAC;EAEzF;EACA,IAAI,UAAU,SAAS,gBACrB,YAAY,KAAK;GACf,MAAM;GACN,KAAK,OAAO,MAAM;GAClB,MAAM,OAAO,MAAM,MAAM,SAAS,EAAE;EACtC,CAAC;EAIH,MAAM,eAA4B,CAAC;EACnC,KAAK,MAAM,UAAU,MAAM,QAAQ;GACjC,MAAM,QAAmB,CAAC;GAC1B,MAAM,QAAmB,CAAC;GAC1B,KAAK,MAAM,OAAO,OAAO,KAAK,OAAO,OAAO,GAAG;IAC7C,IAAI,eAAe,OAAO,QAAQ,MAAM,OAAO,SAAS,IAAI,GAAG;IAC/D,IAAI,gBAAgB,QAAQ,GAAG,KAAK,GAAG,MAAM,OAAO,OAAO,QAAQ;SAC9D,MAAM,OAAO,gBAAgB,OAAO,QAAQ,IAAI;GACvD;GACA,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG,MAAM,QAAQ;GACjD,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG,aAAa,KAAK;IAAE,KAAK,OAAO,MAAM;IAAK;GAAM,CAAC;EACvF;EAEA,MAAM,eAAe,YAAY,SAAS,aAAa,SAAS,MAAM,UAAU;EAChF,IAAI,eAAe,MAAM,YACvB,OAAO;GACL,OAAO,YAAY;GACnB,aAAa,CAAC;GACd,cAAc,CAAC;GACf,WAAW,CAAC;GACZ,aAAa,CAAC,GAAG,MAAM,WAAW;GAClC,OAAO;IACL,MAAM;IACN,SAAS,mBAAmB,aAAa,qBAAqB,MAAM;GACtE;EACF;EAEF,OAAO;GACL,OAAO,YAAY;GACnB;GACA;GACA,WAAW,CAAC,GAAG,MAAM,SAAS;GAC9B,aAAa,CAAC,GAAG,MAAM,WAAW;EACpC;CACF;CAEA,MAAM,UAAU,WAA+B;EAC7C,OAAO,YAAY;EACnB,aAAa,CAAC;EACd,cAAc,CAAC;EACf,WAAW,CAAC;EACZ,aAAa,CAAC,GAAI,OAAO,eAAe,CAAC,CAAE;EAC3C,OAAO;GACL,MAAM;GACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;GAC9D,GAAI,iBAAiB,SAAS,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,IAAI,CAAC;EACxE;CACF;CAEA,MAAM,YAAY,WAA4B;EAG5C,QAAQ,GAAG,KAAA,CAAM,MAAM;CACzB;CAEA,MAAM,QAAQ,SAAkB,OAAgB,WAAgC;EAC9E,MAAM,OAAoB,MAA+B;EACzD,IAAI;GACF,KAAK,MAAM,UAAW,WAAyB,CAAC,GAAG,SAAS,OAAO,MAAM,CAAC;GAC1E,OAAO,OAAO;EAChB,SAAS,OAAO;GACd,OAAO,OAAO,KAAK;EACrB;CACF;CACA,MAAM,OAAO,QAAiB,OAAgB,WAAgC;EAC5E,MAAM,OAAoB,MAA+B;EACzD,IAAI;GACF,SAAS,OAAO,MAAM,CAAC;GACvB,OAAO,OAAO;EAChB,SAAS,OAAO;GACd,OAAO,OAAO,KAAK;EACrB;CACF;CAIA,OAAO,iBAAiB,MAAM;EAC5B,cAAc;GAAE,cAAc;GAAO,UAAU;GAAO,OAAO;EAAK;EAClE,aAAa;GAAE,cAAc;GAAO,UAAU;GAAO,OAAO;EAAI;CAClE,CAAC;CAED,KAAK,MAAM;CACX,KAAK,OAAO;CACZ,KAAK,UAAU,OAAO,OAAO;EAAE,SAAS;EAAG,QAAQ;EAAG,SAAS;EAAG,QAAQ;CAAE,CAAC;CAG7E,KAAK,QAAQ,OAAO,OAAO;EACzB,aAAa,OAAO,OAAO,CAAC,GAAG,CAAC;EAChC,OAAO,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;EAC7B,OAAO,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;EAC7B,MAAM,OAAO,OAAO,CAAC,KAAK,EAAG,CAAC;EAC9B,QAAQ,OAAO,OAAO,CAAC,KAAK,GAAI,CAAC;EACjC,QAAQ,OAAO,OAAO,CAAC,KAAK,GAAI,CAAC;EACjC,KAAK,OAAO,OAAO;GAAC;GAAO;GAAG;GAAG;EAAC,CAAC;EACnC,OAAO,OAAO,OAAO;GAAC;GAAO;GAAG;GAAG;EAAC,CAAC;EACrC,MAAM,OAAO,OAAO;GAAC;GAAO;GAAG;GAAG;EAAC,CAAC;EACpC,MAAM,OAAO,OAAO;GAAC;GAAQ;GAAG;GAAG;GAAG;EAAC,CAAC;EACxC,SAAS,OAAO,OAAO;GAAC;GAAQ;GAAG;GAAG;GAAG;EAAC,CAAC;EAC3C,QAAQ,OAAO,OAAO;GAAC;GAAQ;GAAG;GAAG;GAAG;EAAC,CAAC;EAC1C,UAAU,OAAgB,UAA8B;GACtD,IAAI,CAAC,aAAa,KAAK,GAAG,OAAO,CAAC,GAAG;GACrC,MAAM,SAAS,OAAO,KAAK;GAC3B,MAAM,MAAM,iBAAiB,KAAK;GAClC,IAAI,WAAW,OAAO,QAAQ,MAAM,OAAO,CAAC,GAAG;GAC/C,IAAI,WAAW,KAAK,OAAO,CAAC,KAAK,KAAM,IAAI,KAAK,MAAO,IAAI,KAAK,MAAO,IAAI,EAAE;GAC7E,IAAI,WAAW,OAAO,OAAO;IAAC;IAAO,IAAI;IAAI,IAAI;IAAI,IAAI;GAAE;GAC3D,IAAI,WAAW,QAAQ;IACrB,MAAM,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;IAC7C,OAAO;KAAC;KAAQ,IAAI,IAAI,KAAK;KAAG,IAAI,IAAI,KAAK;KAAG,IAAI,IAAI,KAAK;KAAG;IAAC;GACnE;GACA,OAAO,CAAC,GAAG;EACb;EACA,QAAQ,GAAY,MAAwB;GAC1C,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,OAAO;GACjD,MAAM,OAAO,iBAAiB,CAAC;GAC/B,MAAM,QAAQ,iBAAiB,CAAC;GAChC,IAAI,SAAS,QAAQ,UAAU,MAAM,OAAO,SAAS;GACrD,OAAO,KAAK,OAAO,WAAW,UAAU,KAAK,IAAI,YAAY,MAAM,MAAM,IAAI,IAAI;EACnF;CACF,CAAC;CACD,KAAK,WAAW;CAChB,KAAK,YAAY;CACjB,KAAK,WAAW;CAChB,KAAK,YAAY,IAAI;CACrB,KAAK,QAAQ,IAAI;CACjB,KAAK,aAAa,IAAI;CACtB,KAAK,UAAU,IAAI;CACnB,KAAK,SAAS,IAAI;CAClB,OAAO,iBAAiB,MAAM;EAC5B,kBAAkB;GAAE,cAAc;GAAM,WAAW,IAAI;EAAiB;EACxE,WAAW;GAAE,cAAc;GAAM,WAAW,IAAI;EAAU;EAC1D,SAAS;GACP,cAAc;GACd,WAAW,IAAI;GACf,MAAM,UAAmB;IACvB,IAAI,UAAU;GAChB;EACF;CACF,CAAC;CAED,MAAM,kBAAkB,WAAW;EACjC,YAAY,GAAG,MAAiB;GAC9B,IAAI,KAAK,WAAW,GAClB,MAAM,QAAS,OAAO,MAAM,eAAe,CAAC,EAAA,CAAiB,SAAS,CAAC,CAAC;QACnE,IAAI,KAAK,WAAW,GACzB,MAAM,KAAK,EAAqB;QAEhC,MACE,OAAO,KAAK,EAAE,GACd,OAAO,KAAK,EAAE,GACd,OAAO,KAAK,MAAM,CAAC,GACnB,OAAO,KAAK,MAAM,CAAC,GACnB,OAAO,KAAK,MAAM,CAAC,GACnB,OAAO,KAAK,MAAM,CAAC,GACnB,OAAO,KAAK,MAAM,CAAC,CACrB;EAEJ;EACA,OAAgB,MAAc;GAC5B,OAAO,QAAS,OAAO,MAAM,eAAe,CAAC,EAAA,CAAiB,SAAS,CAAC;EAC1E;CACF;CACA,KAAK,OAAO;CAEZ,MAAM,OAAO,KAAK;CAClB,IAAI,MACF,KAAK,eAAe;EAClB,IAAI,CAAC,OAAO,OAAO;EACnB,MAAM,cAAe,UAAU,MAAM,cAAc,eAAgB;EACnE,OAAO,MAAM,cAAc;CAC7B;CAGF,KAAK,sBAAsB,WAAoB,UAAyB;EAEtE,MAAM,UADY,MAAM,QAAQ,KAAK,IAAI,QAAQ,OAAO,KAAK,CAAC,CAAC,MAAM,GAAG,EAAA,CAC/C,KAAK,SAAS,YAAY,SAAS,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;EACxF,MAAM,KAAK,OAAO,SAAS,CAAC,CAAC,YAAY;EACzC,MAAM,QACJ,OAAO,WAAW,IACd,IACA,OAAO,QACL,OAAO,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC,IAChC,OAAO,QACL,OAAO,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO,SAC3C,OAAO,QACL,KAAK,IAAI,GAAG,MAAM,IAClB,OAAO,QACL,KAAK,IAAI,GAAG,MAAM,IAClB,OAAO,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC;EAC9C,IAAI,OAAO,MAAM,MAAM,QAAQ;CACjC;CACA,KAAK,mBACH,UACA,gBACA,gBACA,gBACA,UACA,YACS;EACT,IAAI,CAAC,OAAO;EACZ,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC,CAAC;EACrE,IAAI,YAAY,YAAY,MAAM,MAAM,KAAK,CAAC,CAAC,QAAQ,MAAM;EAC7D,IAAI,OAAO,cAAc,MAAM,KAAK,OAAO,cAAc,MAAM,GAAG;GAChE,MAAM,CAAC,OAAO,YAAY,UAAU,MAAM,GAAG;GAC7C,YAAY,GAAG,MAAM,QAAQ,yBAAyB,GAAG,IAAI,aAAa,KAAA,IAAY,KAAK,IAAI;EACjG;EACA,MAAM,SAAS,OAAO,YAAY,EAAE;EACpC,MAAM,MAAM,QAAQ,UAAU,GAAG,SAAS,cAAc,GAAG,YAAY;CACzE;CACA,KAAK,oBAAoB,aAA4B;EACnD,IAAI,CAAC,OAAO;EACZ,MAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,OAAO,QAAQ,CAAC,CAAC,CAAC;EACrE,MAAM,MAAM,QAAQ,IAAI,YAAY,MAAM,MAAM,KAAK,IAAI,IAAA,CAAK,QAAQ,MAAM,EAAE;CAChF;CAMA,MAAM,eAAe;EACnB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM,eAAe;EAAC;EAAS;EAAW;EAAY;CAAY;CAElE,MAAM,mBAAmB,YAA0B;EACjD,IAAI,CAAC,OAAO;EACZ,MAAM,UAAU,KAAK;GAAE,MAAM;GAAS;GAAS,MAAM;EAAE,CAAC;EACxD,MAAM,MAAM,KAAK;CACnB;CACA,MAAM,uBACJ,gBACE,8DAA8D,OAC5D,OAAO,MAAM,cAAc,EAC7B,EAAE,GACJ;CACF,MAAM,gBAAgB,WACpB,gBACE,uEAAuE,OACrE,OAAO,MAAM,cAAc,EAC7B,EAAE,yBAAyB,OAAO,UAAU,EAAE,GAChD;CAEF,MAAM,eAAe,gBAAkC;EACrD,MAAM,IAAK,eAAe,OAAO,SAAS,CAAC;EAC3C,MAAM,QAAQ,OAAO,EAAE,SAAS,EAAE;EAClC,IAAI,EAAE,YAAY,OAAO;EACzB,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;EAC7D,MAAM,MAAM,KAAK,IAAI,OAAO,KAAK,MAAM,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;EAC7D,OAAO,MAAM,MAAM,GAAG,KAAK,IAAI,OAAO,EAAE,UAAU,EAAE,IAAI,MAAM,MAAM,GAAG;CACzE;CACA,KAAK,gBAAgB;CAErB,MAAM,cAAc,UAAkC;EACpD,IAAI,OAAO,UAAU,UAAU,OAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;EACvE,IAAI,OAAO,OAAO,SAAS,EAAE,CAAC,CAAC,KAAK;EACpC,IAAI,SAAS,IAAI,OAAO;EACxB,OAAO,KAAK,QAAQ,kBAAkB,EAAE;EACxC,IAAI,KAAK,SAAS,GAAG,KAAK,KAAK,SAAS,GAAG,GAEzC,OACE,KAAK,YAAY,GAAG,IAAI,KAAK,YAAY,GAAG,IACxC,KAAK,QAAQ,OAAO,EAAE,CAAC,CAAC,QAAQ,KAAK,GAAG,IACxC,KAAK,QAAQ,MAAM,EAAE;OACtB,IAAI,KAAK,SAAS,GAAG,GAE1B,QAAQ,KAAK,MAAM,IAAI,KAAK,CAAC,EAAA,CAAG,WAAW,IAAI,KAAK,QAAQ,KAAK,GAAG,IAAI,KAAK,QAAQ,MAAM,EAAE;EAE/F,MAAM,SAAS,OAAO,IAAI;EAC1B,OAAO,SAAS,MAAM,OAAO,SAAS,MAAM,IAAI,SAAS;CAC3D;CACA,KAAK,eAAe;CAEpB,KAAK,iBAAiB,UAAoC;EACxD,MAAM,UAAU,OAAO,SAAS,EAAE,CAAC,CAAC,MAAM,MAAM;EAChD,OAAO,WAAW,QAAQ,SAAS,IAAI,CAAC,GAAG,OAAO,IAAI;CACxD;CAEA,MAAM,mBAAmB,MAAc,mBAAoC;EACzE,MAAM,UAAU,KAAK,KAAK;EAC1B,IAAI,YAAY,IAAI,OAAO;EAK3B,QAJqB,mBAAmB,KAAK,mBAAmB,IAE5D,2CACA,yCAAA,CACW,KAAK,OAAO,KAAK,KAAK,KAAK,OAAO;CACnD;CACA,KAAK,sBACH,WACA,gBACA,gBACA,gBACA,aACS;EACT,IAAI,CAAC,SAAS,CAAC,MAAM,MAAM,YAAY;EACvC,MAAM,WAAW,YAAY,MAAM,KAAK;EACxC,MAAM,UAAU,WAAW,SAAS,MAAM,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI;EACvE,IAAI,CAAC,gBAAgB,SAAS,KAAK,MAAM,OAAO,cAAc,CAAC,CAAC,GAAG,eAAe;CACpF;CACA,KAAK,uBAAuB,WAAoB,mBAAkC;EAChF,IAAI,CAAC,SAAS,CAAC,MAAM,MAAM,YAAY;EACvC,MAAM,UAAU,YAAY,MAAM,KAAK,CAAC,CAAC,QAAQ,SAAS,EAAE;EAC5D,IAAI,CAAC,gBAAgB,SAAS,KAAK,MAAM,OAAO,cAAc,CAAC,CAAC,GAAG,eAAe;CACpF;CAEA,MAAM,YAAY,UAA2B,OAAO,SAAS,EAAE,CAAC,CAAC,QAAQ,OAAO,EAAE;CAClF,MAAM,mBAAmB,QAAuB;EAC9C,IAAI,CAAC,OAAO;EACZ,MAAM,SAAS,SAAS,MAAM,MAAM,KAAK;EACzC,MAAM,OAAO,KAAK,MAAM,OAAO,GAAG,CAAC;EACnC,IAAI,YAAY,OAAO,MAAM,MAAM,SAAS,EAAE;EAC9C,IAAI,SAAS,GAAG,YAAY,OAAO,MAAM,GAAG,CAAC;OACxC,IAAI,SAAS,GAAG,YAAY,GAAG,OAAO,MAAM,GAAG,CAAC,EAAE,GAAG,OAAO,MAAM,GAAG,CAAC;OACtE,IAAI,SAAS,GAChB,YACE,OAAO,UAAU,KACb,IAAI,OAAO,MAAM,GAAG,CAAC,EAAE,IAAI,OAAO,MAAM,GAAG,CAAC,EAAE,GAAG,OAAO,MAAM,GAAG,EAAE,MACnE,GAAG,OAAO,MAAM,GAAG,CAAC,EAAE,GAAG,OAAO,MAAM,GAAG,CAAC;OAC7C,IAAI,SAAS,GAAG,YAAY,GAAG,OAAO,MAAM,GAAG,CAAC,EAAE,GAAG,OAAO,MAAM,GAAG,CAAC,EAAE,GAAG,OAAO,MAAM,GAAG,CAAC;EACjG,MAAM,MAAM,QAAQ;CACtB;CACA,KAAK,mBAAmB;CACxB,KAAK,uBAAuB,QAAuB;EACjD,IAAI,CAAC,SAAS,CAAC,MAAM,MAAM,YAAY;EACvC,MAAM,SAAS,YAAY,MAAM,KAAK;EACtC,IAAI,OAAO,KAAK,MAAM,IAAI;EAC1B,MAAM,SAAS,SAAS,MAAM,CAAC,CAAC;EAChC,MAAM,OAAO,KAAK,MAAM,OAAO,GAAG,CAAC;EASnC,IAAI,EAPF,SAAS,IACL,WAAW,IACX,SAAS,IACP,WAAW,IACX,SAAS,IACP,WAAW,KAAK,WAAW,KAC3B,WAAW,IACT,eAAe;CAC7B;CAEA,KAAK,oBACH,YACA,aACA,SACA,aACS;EACT,IAAI,CAAC,OAAO;EACZ,MAAM,QAAQ,WAAW,MAAM,MAAM,KAAK;EAC1C,IAAI,UAAU,MAAM;EACpB,MAAM,aAAa,QAAQ,UAAU;EACrC,MAAM,UAAU,QAAQ,OAAO;EAC/B,MAAM,MAAM,OAAO,WAAW;EAC9B,MAAM,OAAO,OAAO,QAAQ;EAC5B,KAAK,CAAC,cAAc,SAAS,SAAS,CAAC,WAAW,SAAS,OAAO;EAClE,gBACE,cAAc,UACV,mDAAmD,IAAI,6BAA6B,KAAK,KACzF,aACE,mDAAmD,IAAI,KACvD,gDAAgD,KAAK,EAC7D;CACF;CAUA,MAAM,gBAA0B;EAC9B,MAAM,MAAO,OAAO,MAAM,eAAe,CAAC;EAC1C,MAAM,QAAQ,IAAI,WAChB,OAAO,IAAI,SAAS,CAAC,IAAI,OAAO,IAAI,oBAAoB,CAAC,IAAI,GAC/D;EACA,OAAO;GACL,GAAG,MAAM,eAAe;GACxB,GAAG,MAAM,YAAY,IAAI;GACzB,GAAG,MAAM,WAAW;GACpB,GAAG;GACH,GAAG;GACH,GAAG;EACL;CACF;;CAEA,MAAM,YAAY,UAA0B;EAC1C,MAAM,MAAO,OAAO,MAAM,eAAe,CAAC;EAC1C,OAAO,IAAI,WACT,WAAW,IAAI,MAAM,GAAG,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,IACrE,OAAO,IAAI,oBAAoB,CAAC,IAAI,GACxC;CACF;;;CAIA,MAAM,kBAAkB,KAAc,WAAqC;EACzE,MAAM,OAAO,OAAO,OAAO,EAAE,CAAC,CAAC,KAAK;EACpC,IAAI,SAAS,IAAI,OAAO;EACxB,MAAM,QAAQ,KAAK,YAAY;EAC/B,IAAI,aAA4B;EAChC,KAAK,IAAI,QAAQ,GAAG,QAAQ,IAAI,SAAS,GACvC,IAAI,MAAM,QAAQ,WAAW,MAAM,CAAC,YAAY,CAAC,KAAK,GAAG;GACvD,aAAa,QAAQ;GACrB;EACF;EAEF,MAAM,YAAY,6CAA6C,KAAK,IAAI;EACxE,IAAI,IAAI;EACR,IAAI,IAAI;EACR,IAAI,IAAI;EACR,IAAI,WAAW;GACb,IAAI,OAAO,UAAU,EAAE;GACvB,IAAI,OAAO,UAAU,EAAE;GACvB,IAAI,OAAO,UAAU,MAAM,CAAC;GAC5B,MAAM,SAAS,OAAO,UAAU,MAAM,EAAE,CAAC,CAAC,YAAY;GACtD,IAAI,WAAW,QAAQ,IAAI,IAAI,KAAK;GACpC,IAAI,WAAW,QAAQ,MAAM,IAAI,IAAI;GACrC,IAAI,IAAI,MAAM,IAAI,MAAM,IAAI,IAAI,OAAO;EACzC;EAIA,MAAM,YAHW,YACb,KAAK,MAAM,GAAG,UAAU,KAAK,IAAI,KAAK,MAAM,UAAU,QAAQ,UAAU,EAAE,CAAC,MAAM,IACjF,KAAA,CACsB,MAAM,MAAM,KAAK,CAAC,EAAA,CAAG,KAAK,UAAU,OAAO,KAAK,CAAC;EAC3E,MAAM,QAAgC,CAAC;EACvC,KAAK,MAAM,SAAS,OAAO,UAAU,EAAE,CAAC,CAAC,MAAM,6BAA6B,KAAK,CAAC,GAAG;GACnF,MAAM,OAAQ,MAAM,OAAO,MAAM,MAAM,MAAM,OAAO,MAAM,MAAM;GAChE,IAAI,MAAM,QAAQ,IAAI,IAAI,GAAG,MAAM,KAAK,IAAI;EAC9C;EACA,IAAI,IAAmB;EACvB,IAAI,IAAmB;EACvB,IAAI,IAAmB;EACvB,IAAI,SAAS;EACb,KAAK,MAAM,QAAQ,OAAO;GACxB,IAAI,SAAS,OAAO,eAAe,MAAM;GACzC,IAAI,UAAU,QAAQ,QAAQ;GAC9B,MAAM,QAAQ,QAAQ;GACtB,UAAU;GACV,IAAI,SAAS,KAAK,IAAI;QACjB,IAAI,SAAS,KAAK,IAAI;QACtB,IAAI;EACX;EACA,IAAI,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,CAAC,WAAW,OAAO;EACjE,MAAM,QAAQ,QAAQ;EACtB,IAAI,MAAM,MAAM,IAAI,MAAM;OACrB,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,MAAO,IAAI,OAAO;EACjD,IAAI,MAAM,MAAM,IAAI,MAAM;EAC1B,IAAI,MAAM,MAAM,IAAI;EACpB,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,IAAI,OAAO;EAC/C,MAAM,QAAQ,IAAI,WAAW,WAAW,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;EACxD,IACE,MAAM,eAAe,MAAM,KAC3B,MAAM,YAAY,MAAM,IAAI,KAC5B,MAAM,WAAW,MAAM,GAEvB,OAAO;EAET,OAAO;GAAE;GAAG;GAAG;GAAG;GAAG;GAAG;EAAE;CAC5B;CAEA,MAAM,kBAAkB,WAA0B;EAChD,IAAI,CAAC,OAAO;EACZ,MAAM,MAAM,OAAO,MAAM,MAAM,SAAS,EAAE;EAC1C,IAAI,IAAI,KAAK,MAAM,IAAI;EACvB,IAAI,OAAa,IAAI,UAAU,GAAG;EAClC,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG;GAChC,MAAM,QAAQ,eAAe,KAAK,MAAM;GACxC,IAAI,CAAC,OAAO;GACZ,OAAO,SAAS,KAAK;EACvB;EACA,MAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;CACzC;CACA,KAAK,kBAAkB;CACvB,KAAK,iBAAiB,UACpB,eAAe,aAAa,KAAK,MAAM,OAAO,KAAK,CAAC,MAAM,QAAQ;CAEpE,MAAM,qBAAqB,WAA0B;EACnD,IAAI,CAAC,SAAS,CAAC,MAAM,MAAM,YAAY;EACvC,MAAM,SAAS,YAAY,MAAM,KAAK;EACtC,IAAI,OAAO,KAAK,MAAM,IAAI;EAC1B,IAAI,CAAC,eAAe,QAAQ,MAAM,GAAG,aAAa,MAAM;CAC1D;CACA,KAAK,qBAAqB;CAC1B,KAAK,oBAAoB,UACvB,kBAAkB,aAAa,KAAK,MAAM,OAAO,KAAK,CAAC,MAAM,QAAQ;CAEvE,MAAM,kBAAkB,WAA0B;EAChD,IAAI,CAAC,OAAO;EACZ,MAAM,MAAM,OAAO,MAAM,MAAM,SAAS,EAAE;EAC1C,IAAI,IAAI,KAAK,MAAM,IAAI;EACvB,MAAM,QAAQ,eAAe,KAAK,MAAM;EACxC,IAAI,CAAC,OAAO;EACZ,MAAM,MAAM,QAAQ,OAAO,QAAQ,SAAS,KAAK,CAAC;CACpD;CACA,KAAK,kBAAkB;CACvB,KAAK,iBAAiB,UACpB,eAAe,aAAa,KAAK,MAAM,OAAO,KAAK,CAAC,MAAM,OAAO;CACnE,KAAK,oBAAoB,UAAyB;EAChD,IAAI,CAAC,SAAS,CAAC,MAAM,MAAM,YAAY;EACvC,MAAM,SAAS,YAAY,MAAM,KAAK;EACtC,IAAI,OAAO,KAAK,MAAM,IAAI;EAC1B,IAAI,CAAC,eAAe,QAAQ,aAAa,KAAK,MAAM,OAAO,KAAK,CAAC,MAAM,OAAO,GAC5E,aAAa,aAAa,KAAK,MAAM,OAAO,KAAK,CAAC,MAAM,OAAO;CAEnE;CAIA,KAAK,QAAQ,KAAA;CACb,KAAK,iBAAiB,KAAA;CACtB,KAAK,YAAY,KAAA;AACnB;;AAGA,MAAa,iBAAiB,IAAI,cAAc,SAAS,EAAE"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/actions.ts","../src/color.ts","../src/types.ts","../src/host.ts","../src/input.ts","../src/prelude.ts"],"sourcesContent":["import type { PdfActionNode, PdfActionTree } from '@embedpdf/engine-core/runtime';\n\n/**\n * Return executable JavaScript in PDF action order (root, then `/Next`\n * depth-first). A poisoned native snapshot is never partially executed. Any\n * kind of destination will do: only the scripts are read.\n */\nexport function javaScriptSourcesFromActionTree<Destination>(\n tree: PdfActionTree<Destination>,\n): string[] {\n if (tree.incomplete) {\n throw new Error('Refusing to execute an incomplete PDF action tree');\n }\n\n const sources: string[] = [];\n const visit = (node: PdfActionNode<Destination>): void => {\n // Only the javascript arm is collected; rendition `/JS` deliberately\n // waits for a rendition interpreter.\n if (node.type === 'javascript') sources.push(node.script);\n for (const child of node.next) visit(child);\n };\n if (tree.root) visit(tree.root);\n return sources;\n}\n\n/** One event source that preserves the tree's shared field overlay. */\nexport function javaScriptProgramFromActionTree<Destination>(\n tree: PdfActionTree<Destination>,\n): string {\n return javaScriptSourcesFromActionTree(tree).join('\\n;\\n');\n}\n","import type { ScriptColorArray } from './types';\n\n/**\n * Host-side Acrobat color-array conversions — the commit sinks and world\n * builders cross the Acrobat-array ↔ renderer-color boundary through these.\n * The prelude inlines its own identical formulas (it must stay\n * self-contained); `prelude.test.ts` pins the two implementations together.\n *\n * Conversion vectors (the documented Acrobat semantics):\n * G → RGB: replicate the gray component.\n * CMYK → RGB: component = 1 − min(1, channel + k).\n * RGB → G: luminosity 0.3r + 0.59g + 0.11b.\n * RGB → CMYK: k = 1 − max(r,g,b); channels = 1 − component − k.\n * T (transparent) converts to itself only.\n */\nexport function scriptColorToRgb(\n color: ScriptColorArray,\n): { r: number; g: number; b: number } | null {\n switch (color[0]) {\n case 'T':\n return null;\n case 'G':\n return { r: color[1], g: color[1], b: color[1] };\n case 'RGB':\n return { r: color[1], g: color[2], b: color[3] };\n case 'CMYK': {\n const [, cyan, magenta, yellow, black] = color;\n return {\n r: 1 - Math.min(1, cyan + black),\n g: 1 - Math.min(1, magenta + black),\n b: 1 - Math.min(1, yellow + black),\n };\n }\n }\n}\n\nconst clamp01 = (value: number): number => Math.min(1, Math.max(0, value));\nconst hex = (value: number): string =>\n Math.round(clamp01(value) * 255)\n .toString(16)\n .padStart(2, '0');\n\n/** Acrobat array → CSS hex, or null for transparent. */\nexport function scriptColorToCss(color: ScriptColorArray): string | null {\n const rgb = scriptColorToRgb(color);\n return rgb === null ? null : `#${hex(rgb.r)}${hex(rgb.g)}${hex(rgb.b)}`;\n}\n\n/** CSS hex (#rgb/#rrggbb) → Acrobat RGB array; null/undefined → transparent. */\nexport function cssToScriptColor(css: string | null | undefined): ScriptColorArray {\n if (!css) return ['T'];\n const raw = css.trim().replace(/^#/, '');\n const long =\n raw.length === 3\n ? raw\n .split('')\n .map((ch) => ch + ch)\n .join('')\n : raw;\n if (!/^[0-9a-fA-F]{6}$/.test(long)) return ['T'];\n const channel = (offset: number) => parseInt(long.slice(offset, offset + 2), 16) / 255;\n return ['RGB', channel(0), channel(2), channel(4)];\n}\n\n/** Structural validation for values scripts assign. */\nexport function isScriptColorArray(value: unknown): value is ScriptColorArray {\n if (!Array.isArray(value) || value.length === 0) return false;\n const [space, ...parts] = value as [unknown, ...unknown[]];\n const counts: Record<string, number> = { T: 0, G: 1, RGB: 3, CMYK: 4 };\n const expected = counts[String(space)];\n return (\n expected !== undefined &&\n parts.length === expected &&\n parts.every((part) => typeof part === 'number' && Number.isFinite(part))\n );\n}\n","import type {\n AnnotationRef,\n FormEffect,\n FormFieldDisplay,\n FormFieldFamily,\n FormFieldRef,\n} from '@embedpdf/engine-core/runtime';\n\n/** JSON-safe value vocabulary exposed through Acrobat's `event` and `Field`. */\nexport type ScriptValue = string | number | boolean | null | string[];\n\nexport interface ScriptFieldOption {\n label: string;\n value: string;\n}\n\n/** Detached field state supplied to one script transaction. */\nexport interface ScriptFieldInput {\n ref: FormFieldRef;\n name: string;\n family: FormFieldFamily;\n value: ScriptValue;\n defaultValue: ScriptValue;\n display: FormFieldDisplay;\n readOnly: boolean;\n required: boolean;\n options?: ScriptFieldOption[];\n /** A checkbox's or radio group's widget export values, in widget order (Acrobat `exportValues`). */\n exportValues?: string[];\n}\n\nexport interface ScriptIdentity {\n /** Acrobat `identity.name`. Empty when the embedder did not configure it. */\n name: string;\n loginName: string;\n corporation: string;\n email: string;\n}\n\nexport interface ScriptDocumentInput {\n id: string;\n fileName: string;\n pageCount: number;\n /** Zero-based current page, matching Acrobat `this.pageNum`. */\n pageNumber: number;\n}\n\n/** Required deterministic environment. `utcOffsetMinutes` is local minus UTC. */\nexport interface ScriptEnvironment {\n nowMs: number;\n utcOffsetMinutes: number;\n randomSeed: number;\n}\n\nexport type ScriptEventKind =\n | 'name-tree-boot'\n | 'widget-activate'\n | 'field-keystroke'\n | 'field-validate'\n | 'field-calculate'\n | 'field-format';\n\nexport interface ScriptEventInput {\n kind: ScriptEventKind;\n /**\n * Explicit Acrobat `event.type` / `event.name` overrides for action-driven\n * runs (built from the dispatcher's trigger provenance — `Field` × `Mouse\n * Enter`, `Page` × `Open`, …; the `Annot` type is an EmbedPDF extension,\n * Acrobat has no event type for plain-annotation events). When omitted the\n * prelude derives them from `kind` (the K/V/C/F pipeline path).\n */\n type?: string;\n name?: string;\n target?: FormFieldRef;\n source?: FormFieldRef;\n value?: ScriptValue;\n change?: string;\n selStart?: number;\n selEnd?: number;\n willCommit?: boolean;\n modifier?: boolean;\n shift?: boolean;\n}\n\n/**\n * An Acrobat color: `['T']` transparent, `['G', g]`, `['RGB', r, g, b]`,\n * `['CMYK', c, m, y, k]` — components 0..1. The wire format scripts read and\n * write; conversion to renderer/engine colors happens host-side (color.ts).\n */\nexport type ScriptColorArray =\n | ['T']\n | ['G', number]\n | ['RGB', number, number, number]\n | ['CMYK', number, number, number, number];\n\n/**\n * One script-addressable annotation in the prefetched world — every subtype\n * except link and widget (Acrobat serves those through `Link`/`Field`\n * objects; here they are separate event planes). Curated read surface only —\n * never a raw dictionary.\n */\nexport interface ScriptAnnotInput {\n ref: AnnotationRef;\n /** `/NM` — the `getAnnot(nPage, name)` key. Empty when the PDF has none. */\n name: string;\n /** The engine subtype (e.g. `'square'`). */\n subtype: string;\n /** Zero-based page index (Acrobat's `page`). */\n page: number;\n /** PDF-space `[llx, lly, urx, ury]`. */\n rect: [number, number, number, number];\n contents: string;\n /** `/T` author and `/Subj` — read-only in v1 (collab identity stamping). */\n author: string;\n subject: string;\n strokeColor: ScriptColorArray;\n fillColor: ScriptColorArray;\n opacity: number;\n /** `/BS /W` border width in points. */\n width: number;\n /** Border style: `'S'` solid or `'D'` dashed. */\n borderStyle: 'S' | 'D';\n dash: number[];\n hidden: boolean;\n print: boolean;\n readOnly: boolean;\n locked: boolean;\n noView: boolean;\n toggleNoView: boolean;\n /** True for kinds whose appearance cannot be re-derived from properties\n * (stamps, images): appearance writes are refused with a diagnostic. */\n opaqueBody: boolean;\n}\n\n/** The curated write patch one script staged for one annotation — a\n * canonical per-annot diff (last-write-wins per key, derived at run end\n * exactly like form effects). Visibility keys ride `flags` so the commit\n * sink maps them onto one engine flags patch. */\nexport interface ScriptAnnotEffect {\n ref: AnnotationRef;\n patch: {\n strokeColor?: ScriptColorArray;\n fillColor?: ScriptColorArray;\n opacity?: number;\n width?: number;\n borderStyle?: 'S' | 'D';\n dash?: number[];\n rect?: [number, number, number, number];\n contents?: string;\n flags?: Partial<{\n hidden: boolean;\n print: boolean;\n readOnly: boolean;\n locked: boolean;\n noView: boolean;\n toggleNoView: boolean;\n }>;\n };\n}\n\n/**\n * The writable-property validity matrix, keyed by engine subtype — the one\n * exported table (the prelude inlines an identical copy; a parity test pins\n * them together, and plugin-annotation drift-guards this against the kind\n * registry's FieldSpecs). Flags + contents are writable everywhere\n * script-addressable; appearance keys vary by kind.\n */\nexport const ANNOT_WRITABLE_KEYS: Readonly<Record<string, readonly string[]>> = Object.freeze({\n square: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n circle: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n polygon: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n polyline: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n line: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n ink: ['strokeColor', 'opacity', 'width', 'rect'],\n 'free-text': ['strokeColor', 'fillColor', 'opacity', 'rect'],\n highlight: ['strokeColor', 'opacity'],\n underline: ['strokeColor', 'opacity'],\n squiggly: ['strokeColor', 'opacity'],\n strikeout: ['strokeColor', 'opacity'],\n caret: ['strokeColor', 'opacity'],\n text: ['strokeColor', 'opacity', 'rect'],\n stamp: ['rect'],\n 'file-attachment': ['strokeColor', 'opacity'],\n});\n\n/** Complete input for one deterministic run. No ambient host values are read. */\nexport interface ScriptInput {\n document: ScriptDocumentInput;\n identity: ScriptIdentity;\n environment: ScriptEnvironment;\n fields: ScriptFieldInput[];\n /** The prefetched annots plane. It covers only the pages in `annotPages`;\n * `getAnnots` reports a compatibility deviation for any other page. */\n annots?: ScriptAnnotInput[];\n /** Zero-based page indexes the plane covers. */\n annotPages?: number[];\n /** True when annotPages spans the whole document (no scope diagnostic). */\n annotsCoverDocument?: boolean;\n event: ScriptEventInput;\n}\n\nexport type ScriptUiEffect =\n | { kind: 'alert'; message: string; icon: number; title?: string }\n | { kind: 'print' }\n | { kind: 'gotoPage'; page: number }\n /** `doc.submitForm(...)` — a submit intent, resolved and sink-routed\n * outside the VM (never a network call from here). `fieldNames` are\n * include-mode (Acrobat's aFields); `null` = the whole eligible form. */\n | {\n kind: 'submitForm';\n url: string | null;\n fieldNames: string[] | null;\n includeEmpty: boolean;\n format?: 'fdf' | 'html' | 'xfdf' | 'pdf';\n method?: 'post' | 'get';\n };\n\nexport type ScriptDiagnosticCode =\n | 'blocked-network'\n | 'unsupported-api'\n | 'invalid-field-value'\n // A script failed and was degraded to a warning. Boot errors must never\n // disable interactive filling, and a K/V/C/F exception must never destroy\n // the user's input (only an explicit `event.rc = false` rejects).\n | 'script-error'\n // A script-produced UI effect was withheld by permission (e.g. a print\n // request without `doc.print` authority) — observable, never silent.\n | 'ui-effect-suppressed';\n\nexport interface ScriptDiagnostic {\n code: ScriptDiagnosticCode;\n message: string;\n}\n\n// ── the sandbox contract (owned here; implementations re-export) ──────────\n// core-js-sandbox depends on this package, so the structural interface must\n// live on this side of the edge — the reverse import would be a cycle.\n\n/** One isolated, stateful Acrobat-JavaScript realm for one PDF document. */\nexport interface ScriptSandbox {\n /** True after explicit disposal or a resource/runtime fault. */\n readonly disposed: boolean;\n /** Evaluate document name-tree sources once. Top-level effects are returned\n * so the orchestrator can include them in the first transaction. */\n boot(sources: string[], input: ScriptInput, budget?: ScriptBudget): ScriptOutput;\n /** Run one event program against the realm's persistent globals. */\n run(source: string, input: ScriptInput, budget?: ScriptBudget): ScriptOutput;\n /** Release the realm. Idempotent. */\n dispose(): void;\n}\n\nexport type ScriptSandboxFactory = () => Promise<ScriptSandbox>;\n\nexport interface ScriptExecutionError {\n kind: 'exception' | 'budget' | 'invalid-output';\n message: string;\n stack?: string;\n}\n\nexport interface ScriptEventOutput {\n rc: boolean;\n value: ScriptValue;\n change: string;\n selStart: number;\n selEnd: number;\n}\n\n/**\n * Effects are committed only by the originating client's orchestrator, in\n * the declared cross-plane order: `formEffects` first (field order — matching\n * the derive-by-diff model), then `annotEffects` (annot order); the first\n * failing effect marks every later effect in both streams skipped.\n */\nexport interface ScriptOutput {\n event: ScriptEventOutput;\n formEffects: FormEffect[];\n annotEffects: ScriptAnnotEffect[];\n uiEffects: ScriptUiEffect[];\n diagnostics: ScriptDiagnostic[];\n error?: ScriptExecutionError;\n}\n\nexport interface ScriptBudget {\n maxExecutionMs: number;\n maxMemoryBytes: number;\n maxStackBytes: number;\n maxEffects: number;\n maxOutputBytes: number;\n}\n\nexport const DEFAULT_SCRIPT_BUDGET: Readonly<ScriptBudget> = Object.freeze({\n maxExecutionMs: 50,\n maxMemoryBytes: 16 * 1024 * 1024,\n maxStackBytes: 512 * 1024,\n maxEffects: 256,\n maxOutputBytes: 1024 * 1024,\n});\n\n/**\n * The shipped security posture (updated per phase — the live authority for\n * per-type × origin decisions is the actions plugin's policy; these\n * constants document the posture, they do not enforce it). The only\n * configurable switch is explicit opt-in.\n */\nexport interface ScriptSecurityPolicy {\n enabled: boolean;\n executionOwner: 'originating-client-only';\n nameTreeBoot: 'lazy-first-transaction';\n /** Submit is a sink chain — embedder handler → the document's home\n * (`doc.forms.submit`, engine-asserted) → blocked. Never auto-network. */\n submitForm: 'sink-chain';\n openAction: 'execute-lifecycle';\n pageActions: 'execute-lifecycle';\n /** WC/WS/DS/WP/DP run when the verb owner dispatches them. */\n catalogLifecycleActions: 'execute-on-verb';\n annotationActions: 'execute-full-matrix';\n}\n\nexport const DEFAULT_SCRIPT_SECURITY_POLICY: Readonly<ScriptSecurityPolicy> = Object.freeze({\n enabled: false,\n executionOwner: 'originating-client-only',\n nameTreeBoot: 'lazy-first-transaction',\n submitForm: 'sink-chain',\n openAction: 'execute-lifecycle',\n pageActions: 'execute-lifecycle',\n catalogLifecycleActions: 'execute-on-verb',\n annotationActions: 'execute-full-matrix',\n});\n\n/** The shipped dispatch matrix; extracted actions outside it remain data\n * only. (Historical note: v1 froze everything beyond K/V/C/F as\n * preserve-only; phases 1–4 executed the rest.) */\nexport const SCRIPT_EVENT_MATRIX = Object.freeze({\n nameTree: 'lazy-first-originating-field-transaction',\n field: Object.freeze({\n keystroke: 'execute-on-commit',\n validate: 'execute',\n calculate: 'execute-in-calculation-order',\n format: 'execute-after-value-calculation',\n }),\n openAction: 'execute-lifecycle',\n page: 'execute-lifecycle',\n catalogLifecycle: 'execute-on-verb',\n annotation: Object.freeze({\n widgetActivate: 'execute-on-originating-client',\n other: 'execute-full-matrix',\n }),\n submitForm: 'sink-chain',\n} as const);\n\n/** Functions installed into the isolated VM global by `PRELUDE_SOURCE`. */\nexport interface AcroJsVmGlobal {\n __acrojsBoot(\n sources: string[],\n input: ScriptInput,\n budget?: Pick<ScriptBudget, 'maxEffects'>,\n ): ScriptOutput;\n __acrojsRun(\n source: string,\n input: ScriptInput,\n budget?: Pick<ScriptBudget, 'maxEffects'>,\n ): ScriptOutput;\n}\n","import type { DocumentHandle } from '@embedpdf/engine-core/runtime';\n\nimport { DEFAULT_SCRIPT_BUDGET } from './types';\nimport type {\n ScriptAnnotInput,\n ScriptBudget,\n ScriptDocumentInput,\n ScriptEnvironment,\n ScriptEventInput,\n ScriptFieldInput,\n ScriptIdentity,\n ScriptInput,\n ScriptOutput,\n ScriptSandbox,\n ScriptSandboxFactory,\n} from './types';\n\n/** The per-run world a caller supplies (fields snapshot, prefetched annots\n * plane, the event). Document/identity/environment come from the host. */\nexport interface ScriptWorldInput {\n fields: ScriptFieldInput[];\n annots?: ScriptAnnotInput[];\n annotPages?: number[];\n annotsCoverDocument?: boolean;\n /** Zero-based current page for `this.pageNum` — overrides the host's\n * document input (the form pipeline anchors it on the target field). */\n pageNumber?: number;\n event: ScriptEventInput;\n}\n\nexport interface ScriptTransaction {\n /**\n * Run the name-tree boot if it has not run in this realm yet; returns the\n * boot output exactly once (its effects belong to the first transaction —\n * commit them, tag their UI effects `phase: 'boot'`), null thereafter.\n */\n boot(world: ScriptWorldInput, budget?: ScriptBudget): Promise<ScriptOutput | null>;\n /** One deterministic run against the shared realm. Auto-boots defensively\n * (that boot's output is then returned by the next `boot()` call).\n * `budget` overrides the host default per run — the form pipeline slices\n * one transaction-wide time budget across its K/V/C/F passes. */\n run(program: string, world: ScriptWorldInput, budget?: ScriptBudget): Promise<ScriptOutput>;\n}\n\nexport interface ScriptHostOptions {\n sandboxFactory: ScriptSandboxFactory;\n document: () => ScriptDocumentInput;\n identity: () => ScriptIdentity;\n /** Deterministic environment per run; `sequence` is the host's monotonic\n * run counter (seed derivation — see {@link seedFrom}). */\n environment: (sequence: number) => ScriptEnvironment;\n /** Name-tree programs, fetched lazily once per realm build. */\n bootSources: () => Promise<string[]>;\n budget?: ScriptBudget;\n}\n\n/**\n * The one realm per document: a name-tree function must be\n * callable from a page-open script and a field calculate alike.\n *\n * `transaction(body)` is the realm mutex, and the body performs everything\n * for one logical script transaction — world prefetch, VM run(s), document\n * commits through the owner sinks, model reconciliation — before the mutex\n * releases, so the next transaction always prefetches post-commit truth\n * (the commit-inside-the-boundary law). Lock hierarchy: caller queues\n * (actions dispatch / form mutation) acquire this queue, never the reverse,\n * and commit sinks called inside the body never re-enter it.\n *\n * Fault ladder: a sandbox that reports itself disposed (interrupt/memory\n * faults) poisons the realm for the REST of the current transaction; the\n * next transaction rebuilds it lazily and re-runs the boot. Boot errors\n * degrade (diagnose, continue) — they never brick scripting.\n */\nexport interface ScriptHost {\n transaction<T>(body: (txn: ScriptTransaction) => Promise<T>): Promise<T>;\n dispose(): void;\n}\n\n/** FNV-1a over `documentId:sequence` — the deterministic default random seed\n * (ported verbatim from the form controller; exported for callers building\n * `ScriptHostOptions.environment`). */\nexport function seedFrom(documentId: string, sequence: number): number {\n let hash = 2166136261;\n for (const char of `${documentId}:${sequence}`) {\n hash ^= char.charCodeAt(0);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\n/** The session's identity, as Acrobat JavaScript's `identity` object, under\n * embedder overrides — the standard `ScriptHostOptions.identity` builder. */\nexport function resolveScriptIdentity(\n doc: DocumentHandle,\n overrides?: Partial<ScriptIdentity> | (() => Partial<ScriptIdentity>),\n): ScriptIdentity {\n const identity = doc.security.identity;\n const supplied = typeof overrides === 'function' ? overrides() : (overrides ?? {});\n return {\n name: supplied.name ?? identity?.displayName ?? identity?.userId ?? '',\n loginName: supplied.loginName ?? identity?.userId ?? '',\n corporation: supplied.corporation ?? identity?.organization ?? '',\n email: supplied.email ?? identity?.email ?? '',\n };\n}\n\nexport function createScriptHost(options: ScriptHostOptions): ScriptHost {\n const budget = options.budget ?? DEFAULT_SCRIPT_BUDGET;\n\n // Deliberately not @embedpdf/core's createSerialQueue: this package is a\n // dependency-light leaf (engine-core types only) and must not pull the\n // kernel toolkit in. Identical contract, documented twin.\n let tail: Promise<void> = Promise.resolve();\n const enqueue = <T>(operation: () => Promise<T>): Promise<T> => {\n const result = tail.then(operation, operation);\n tail = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n };\n\n let sandboxPromise: Promise<ScriptSandbox> | null = null;\n let booted = false;\n let pendingBoot: ScriptOutput | null = null;\n let bootSourcesCache: Promise<string[]> | null = null;\n let sequence = 0;\n let disposed = false;\n\n const ensureSandbox = (): Promise<ScriptSandbox> => {\n sandboxPromise ??= options.sandboxFactory();\n return sandboxPromise;\n };\n\n const inputFor = (world: ScriptWorldInput): ScriptInput => ({\n document: {\n ...options.document(),\n ...(world.pageNumber !== undefined ? { pageNumber: world.pageNumber } : {}),\n },\n identity: options.identity(),\n environment: options.environment(sequence++),\n fields: world.fields,\n ...(world.annots ? { annots: world.annots } : {}),\n ...(world.annotPages ? { annotPages: world.annotPages } : {}),\n ...(world.annotsCoverDocument !== undefined\n ? { annotsCoverDocument: world.annotsCoverDocument }\n : {}),\n event: world.event,\n });\n\n /** A resource fault poisons the realm: rebuild + re-boot lazily next time. */\n const noteFault = (sandbox: ScriptSandbox): void => {\n if (!sandbox.disposed) return;\n sandboxPromise = null;\n booted = false;\n pendingBoot = null;\n };\n\n const bootNow = async (\n world: ScriptWorldInput,\n runBudget?: ScriptBudget,\n ): Promise<ScriptOutput | null> => {\n if (booted) return null;\n // Degrade-never-brick: mark booted before running, exactly the\n // controller's law — a hostile boot script must not re-run per event.\n booted = true;\n const sandbox = await ensureSandbox();\n bootSourcesCache ??= options.bootSources();\n let sources: string[] = [];\n try {\n sources = await bootSourcesCache;\n } catch (error) {\n bootSourcesCache = null; // transient read failure — retry on rebuild\n // Degrade observably: a synthetic boot output carries the diagnostic\n // so the caller surfaces \"the name tree could not even be read\".\n return {\n event: { rc: true, value: null, change: '', selStart: 0, selEnd: 0 },\n formEffects: [],\n annotEffects: [],\n uiEffects: [],\n diagnostics: [\n {\n code: 'script-error',\n message: `Document boot script failed (continuing without it): ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n };\n }\n if (sources.length === 0) return null;\n const output = sandbox.boot(\n sources,\n inputFor({ ...world, event: { kind: 'name-tree-boot' } }),\n runBudget ?? budget,\n );\n noteFault(sandbox);\n return output;\n };\n\n const runNow = async (\n program: string,\n world: ScriptWorldInput,\n runBudget?: ScriptBudget,\n ): Promise<ScriptOutput> => {\n if (!booted) {\n // Defensive auto-boot; the output waits for the next explicit boot().\n pendingBoot = await bootNow(world, runBudget);\n }\n const sandbox = await ensureSandbox();\n const output = sandbox.run(program, inputFor(world), runBudget ?? budget);\n noteFault(sandbox);\n return output;\n };\n\n return {\n transaction<T>(body: (txn: ScriptTransaction) => Promise<T>): Promise<T> {\n if (disposed) return Promise.reject(new Error('script host is disposed'));\n return enqueue(() =>\n body({\n boot: async (world, runBudget) => {\n if (pendingBoot) {\n const output = pendingBoot;\n pendingBoot = null;\n return output;\n }\n return bootNow(world, runBudget);\n },\n run: (program, world, runBudget) => runNow(program, world, runBudget),\n }),\n );\n },\n dispose() {\n disposed = true;\n const dying = sandboxPromise;\n sandboxPromise = null;\n booted = false;\n pendingBoot = null;\n void dying?.then((sandbox) => sandbox.dispose()).catch(() => undefined);\n },\n };\n}\n","import type {\n FormFieldDisplay,\n FormFieldDTO,\n FormSnapshot,\n FormValueEntry,\n WidgetAnnotation,\n} from '@embedpdf/engine-core/runtime';\n\nimport type { ScriptFieldInput, ScriptValue } from './types';\n\nfunction valueFromEntry(entry: FormValueEntry): ScriptValue {\n switch (entry.kind) {\n case 'scalar':\n return entry.value;\n case 'array':\n return [...entry.values];\n case 'none':\n case 'unsupported':\n return null;\n }\n}\n\n/**\n * A field value as scripts see it. A checkbox or radio group shows the export\n * value of its checked widget, as Acrobat's `field.value` does, or `'Off'`.\n */\nfunction fieldValueFromEntry(field: FormFieldDTO, entry: FormValueEntry): ScriptValue {\n if (field.family !== 'checkbox' && field.family !== 'radio') return valueFromEntry(entry);\n if (entry.kind !== 'scalar') return 'Off';\n const checked = field.widgets.find((widget) => widget.onState === entry.value);\n return checked?.exportValue ?? entry.value;\n}\n\n/**\n * How a widget shows, as Acrobat's `field.display` reads its flags: hidden;\n * on screen but not printed; printed but not on screen; or visible.\n */\nfunction displayOf(row: WidgetAnnotation | undefined): FormFieldDisplay {\n if (!row) return 'visible';\n if (row.hidden) return 'hidden';\n if (row.noView) return 'noView';\n return row.print ? 'visible' : 'noPrint';\n}\n\n/** Build the VM's detached field view from the engine's lossless snapshot. */\nexport function scriptFieldsFromSnapshot(snapshot: FormSnapshot): ScriptFieldInput[] {\n const rows = new Map(\n snapshot.widgets.map((row) => [\n row.ref.kind === 'objectNumber' ? row.ref.objectNumber : 0,\n row,\n ]),\n );\n return snapshot.fields.map((field: FormFieldDTO) => ({\n ref: field.ref,\n name: field.name,\n family: field.family,\n value: fieldValueFromEntry(field, field.valueEntry),\n defaultValue: fieldValueFromEntry(field, field.defaultValueEntry),\n // A field shows as its first widget does.\n display: displayOf(rows.get(field.widgets?.[0]?.objectNumber ?? -1)),\n readOnly: field.readOnly,\n required: field.required,\n ...('options' in field\n ? { options: field.options.map((option) => ({ label: option.label, value: option.value })) }\n : {}),\n ...(field.family === 'checkbox' || field.family === 'radio'\n ? { exportValues: field.widgets.map((widget) => widget.exportValue) }\n : {}),\n }));\n}\n","/**\n * Install the curated Acrobat object model into an isolated JavaScript realm.\n *\n * This function must remain self-contained: no imports and no closed-over\n * values. The sandbox ships `installAcroJs.toString()` into QuickJS, while\n * tests execute the same source in a Node VM. Types disappear at build time.\n */\nexport function installAcroJs(globalObject: Record<string, unknown>): void {\n type AnyRecord = Record<string, unknown>;\n type FieldRecord = {\n input: AnyRecord;\n originalValue: unknown;\n value: unknown;\n originalDisplay: string;\n display: string;\n wrapper: AnyRecord;\n };\n type AnnotRecord = {\n input: AnyRecord;\n /** Writable-key snapshots: original vs current — effects are the diff. */\n original: AnyRecord;\n current: AnyRecord;\n wrapper: AnyRecord;\n };\n type RunState = {\n input: AnyRecord;\n fields: FieldRecord[];\n fieldsByName: Map<string, FieldRecord>;\n fieldsByRef: Map<string, FieldRecord>;\n annots: AnnotRecord[];\n annotsByPage: Map<number, AnnotRecord[]>;\n annotPages: Set<number>;\n annotsCoverDocument: boolean;\n event: AnyRecord;\n resetRefs: AnyRecord[];\n resetKeys: Set<string>;\n uiEffects: AnyRecord[];\n diagnostics: AnyRecord[];\n randomState: number;\n maxEffects: number;\n };\n\n const host = globalObject as AnyRecord;\n const NativeDate = Date;\n let state: RunState | null = null;\n\n const cloneValue = (value: unknown): unknown =>\n Array.isArray(value) ? value.map((item) => String(item)) : value;\n const sameValue = (left: unknown, right: unknown): boolean => {\n if (Array.isArray(left) && Array.isArray(right)) {\n return left.length === right.length && left.every((item, index) => item === right[index]);\n }\n return left === right;\n };\n const refKey = (ref: unknown): string => {\n const value = ref as AnyRecord | null | undefined;\n return value?.kind === 'objectNumber'\n ? `obj:${String(value.objectNumber)}`\n : `fqn:${String(value?.name ?? '')}`;\n };\n const diagnostic = (code: string, message: string): void => {\n state?.diagnostics.push({ code, message });\n };\n const blocked = (api: string): undefined => {\n diagnostic('blocked-network', `${api} is blocked by the scripting policy`);\n return undefined;\n };\n const numberValue = (value: unknown): number => {\n if (typeof value === 'number') return Number.isFinite(value) ? value : 0;\n const parsed = Number(String(value ?? '').replace(/[^0-9+\\-.]/g, ''));\n return Number.isFinite(parsed) ? parsed : 0;\n };\n const displayToCode = (display: string): number =>\n display === 'hidden' ? 1 : display === 'noPrint' ? 2 : display === 'noView' ? 3 : 0;\n const codeToDisplay = (code: unknown): string =>\n Number(code) === 1\n ? 'hidden'\n : Number(code) === 2\n ? 'noPrint'\n : Number(code) === 3\n ? 'noView'\n : 'visible';\n const eventName = (kind: string): string =>\n kind === 'widget-activate'\n ? 'Mouse Up'\n : kind === 'field-keystroke'\n ? 'Keystroke'\n : kind === 'field-validate'\n ? 'Validate'\n : kind === 'field-calculate'\n ? 'Calculate'\n : kind === 'field-format'\n ? 'Format'\n : 'Open';\n\n const doc: AnyRecord = {};\n\n const makeField = (record: FieldRecord): AnyRecord => {\n const input = record.input;\n const wrapper: AnyRecord = {};\n Object.defineProperties(wrapper, {\n name: { enumerable: true, get: () => input.name },\n type: { enumerable: true, get: () => input.family },\n value: {\n enumerable: true,\n get: () => cloneValue(record.value),\n set: (value: unknown) => {\n record.value = cloneValue(value);\n },\n },\n valueAsString: {\n enumerable: true,\n get: () =>\n Array.isArray(record.value) ? record.value.join(',') : String(record.value ?? ''),\n },\n defaultValue: { enumerable: true, get: () => cloneValue(input.defaultValue) },\n readonly: {\n enumerable: true,\n get: () => Boolean(input.readOnly),\n set: () => {\n diagnostic('unsupported-api', 'Field.readonly writes are not supported in v1');\n },\n },\n required: {\n enumerable: true,\n get: () => Boolean(input.required),\n set: () => {\n diagnostic('unsupported-api', 'Field.required writes are not supported in v1');\n },\n },\n display: {\n enumerable: true,\n get: () => displayToCode(record.display),\n set: (value: unknown) => {\n record.display = codeToDisplay(value);\n },\n },\n source: { enumerable: false, get: () => doc },\n });\n wrapper.setFocus = () => diagnostic('unsupported-api', 'Field.setFocus is not supported in v1');\n return wrapper;\n };\n\n const getField = (name: unknown): AnyRecord | null =>\n state?.fieldsByName.get(String(name))?.wrapper ?? null;\n\n // ── the annots plane (curated; self-contained twins of src/color.ts and\n // types.ts ANNOT_WRITABLE_KEYS — parity tests pin them) ───────────────\n const ANNOT_WRITABLE: Record<string, string[]> = {\n square: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n circle: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n polygon: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n polyline: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n line: ['strokeColor', 'fillColor', 'opacity', 'width', 'borderStyle', 'dash', 'rect'],\n ink: ['strokeColor', 'opacity', 'width', 'rect'],\n 'free-text': ['strokeColor', 'fillColor', 'opacity', 'rect'],\n highlight: ['strokeColor', 'opacity'],\n underline: ['strokeColor', 'opacity'],\n squiggly: ['strokeColor', 'opacity'],\n strikeout: ['strokeColor', 'opacity'],\n caret: ['strokeColor', 'opacity'],\n text: ['strokeColor', 'opacity', 'rect'],\n stamp: ['rect'],\n 'file-attachment': ['strokeColor', 'opacity'],\n };\n const ANNOT_FLAG_KEYS = ['hidden', 'print', 'readOnly', 'locked', 'noView', 'toggleNoView'];\n const ACROBAT_TYPE: Record<string, string> = {\n square: 'Square',\n circle: 'Circle',\n line: 'Line',\n polygon: 'Polygon',\n polyline: 'PolyLine',\n ink: 'Ink',\n 'free-text': 'FreeText',\n highlight: 'Highlight',\n underline: 'Underline',\n squiggly: 'Squiggly',\n strikeout: 'StrikeOut',\n text: 'Text',\n stamp: 'Stamp',\n caret: 'Caret',\n 'file-attachment': 'FileAttachment',\n };\n const isColorArray = (value: unknown): boolean => {\n if (!Array.isArray(value) || value.length === 0) return false;\n const counts: Record<string, number> = { T: 0, G: 1, RGB: 3, CMYK: 4 };\n const expected = counts[String(value[0])];\n return (\n expected !== undefined &&\n value.length === expected + 1 &&\n value.slice(1).every((part) => typeof part === 'number' && isFinite(Number(part)))\n );\n };\n const colorToRgbTriple = (value: unknown): number[] | null => {\n const color = value as unknown[];\n const space = String(color[0]);\n if (space === 'T') return null;\n if (space === 'G') return [Number(color[1]), Number(color[1]), Number(color[1])];\n if (space === 'RGB') return [Number(color[1]), Number(color[2]), Number(color[3])];\n const cyan = Number(color[1]);\n const magenta = Number(color[2]);\n const yellow = Number(color[3]);\n const black = Number(color[4]);\n return [\n 1 - Math.min(1, cyan + black),\n 1 - Math.min(1, magenta + black),\n 1 - Math.min(1, yellow + black),\n ];\n };\n const sameAnnotValue = (left: unknown, right: unknown): boolean => {\n if (Array.isArray(left) && Array.isArray(right)) {\n return left.length === right.length && left.every((item, index) => item === right[index]);\n }\n return left === right;\n };\n const cloneAnnotValue = (value: unknown): unknown => (Array.isArray(value) ? [...value] : value);\n\n const makeAnnot = (record: AnnotRecord): AnyRecord => {\n const input = record.input;\n const subtype = String(input.subtype);\n const writable = ANNOT_WRITABLE[subtype] ?? [];\n const wrapper: AnyRecord = {};\n const stage = (key: string, value: unknown, validate: (value: unknown) => boolean): void => {\n // Flags and contents are writable on every script-addressable subtype;\n // appearance keys follow the per-subtype matrix.\n if (key !== 'contents' && ANNOT_FLAG_KEYS.indexOf(key) < 0 && writable.indexOf(key) < 0) {\n diagnostic(\n 'unsupported-api',\n `Annot.${key} is not writable on subtype '${subtype}' (write ignored)`,\n );\n return;\n }\n if (input.opaqueBody && ANNOT_FLAG_KEYS.indexOf(key) < 0 && key !== 'contents') {\n diagnostic(\n 'unsupported-api',\n `Annot.${key}: '${subtype}' has an opaque appearance (write ignored)`,\n );\n return;\n }\n if (!validate(value)) {\n diagnostic('invalid-field-value', `Annot.${key}: invalid value (write ignored)`);\n return;\n }\n record.current[key] = cloneAnnotValue(value);\n };\n const prop = (key: string, validate: (value: unknown) => boolean): PropertyDescriptor => ({\n enumerable: true,\n get: () => cloneAnnotValue(record.current[key]),\n set: (value: unknown) => stage(key, value, validate),\n });\n const isNum = (value: unknown) => typeof value === 'number' && isFinite(value);\n const isBool = (value: unknown) => typeof value === 'boolean';\n Object.defineProperties(wrapper, {\n name: { enumerable: true, get: () => String(input.name ?? '') },\n type: { enumerable: true, get: () => ACROBAT_TYPE[subtype] ?? subtype },\n page: { enumerable: true, get: () => Number(input.page ?? 0) },\n author: { enumerable: true, get: () => String(input.author ?? '') },\n subject: { enumerable: true, get: () => String(input.subject ?? '') },\n strokeColor: prop('strokeColor', isColorArray),\n fillColor: prop('fillColor', isColorArray),\n opacity: prop('opacity', (value) => isNum(value) && Number(value) >= 0 && Number(value) <= 1),\n width: prop('width', (value) => isNum(value) && Number(value) >= 0),\n style: prop('borderStyle', (value) => value === 'S' || value === 'D'),\n dash: prop('dash', (value) => Array.isArray(value) && value.every(isNum)),\n rect: prop(\n 'rect',\n (value) => Array.isArray(value) && value.length === 4 && value.every(isNum),\n ),\n contents: prop('contents', (value) => typeof value === 'string'),\n hidden: prop('hidden', isBool),\n print: prop('print', isBool),\n readOnly: prop('readOnly', isBool),\n lock: prop('locked', isBool),\n noView: prop('noView', isBool),\n toggleNoView: prop('toggleNoView', isBool),\n doc: { enumerable: false, get: () => doc },\n });\n wrapper.getProps = () => {\n const out: AnyRecord = {};\n for (const key of Object.keys(record.current))\n out[key] = cloneAnnotValue(record.current[key]);\n return out;\n };\n wrapper.setProps = (props: unknown) => {\n const source = (props ?? {}) as AnyRecord;\n for (const key of Object.keys(source)) {\n const alias = key === 'style' ? 'borderStyle' : key === 'lock' ? 'locked' : key;\n void alias;\n (wrapper as AnyRecord)[key] = source[key];\n }\n };\n return wrapper;\n };\n\n const getAnnots = (spec?: unknown): AnyRecord[] | null => {\n if (!state) return null;\n const nPage = (spec as AnyRecord | undefined)?.nPage;\n if (nPage === undefined || nPage === null) {\n if (!state.annotsCoverDocument) {\n diagnostic(\n 'unsupported-api',\n 'getAnnots: whole-document search is limited to the prefetched pages (compatibility deviation)',\n );\n }\n return state.annots.length ? state.annots.map((record) => record.wrapper) : null;\n }\n const page = Math.trunc(Number(nPage));\n if (!state.annotPages.has(page)) {\n diagnostic(\n 'unsupported-api',\n `getAnnots: page ${page} is outside the prefetched annots plane (compatibility deviation)`,\n );\n return null;\n }\n const records = state.annotsByPage.get(page) ?? [];\n return records.length ? records.map((record) => record.wrapper) : null;\n };\n const getAnnot = (nPage: unknown, name: unknown): AnyRecord | null => {\n const records = getAnnots({ nPage });\n if (!records) return null;\n for (const wrapper of records) {\n if (String((wrapper as AnyRecord).name) === String(name)) return wrapper;\n }\n return null;\n };\n doc.getAnnots = getAnnots;\n doc.getAnnot = getAnnot;\n\n Object.defineProperties(doc, {\n documentFileName: {\n enumerable: true,\n get: () => String((state?.input.document as AnyRecord | undefined)?.fileName ?? ''),\n },\n numFields: { enumerable: true, get: () => state?.fields.length ?? 0 },\n pageNum: {\n enumerable: true,\n get: () => Number((state?.input.document as AnyRecord | undefined)?.pageNumber ?? 0),\n set: (value: unknown) => {\n const page = Math.trunc(Number(value));\n if (Number.isFinite(page)) state?.uiEffects.push({ kind: 'gotoPage', page });\n },\n },\n });\n doc.getField = getField;\n doc.getNthFieldName = (index: unknown) =>\n String(state?.fields[Math.trunc(Number(index))]?.input.name ?? '');\n doc.resetForm = (names?: unknown) => {\n if (!state) return;\n const requested =\n names === undefined\n ? state.fields\n : (Array.isArray(names) ? names : [names])\n .map((name) => state!.fieldsByName.get(String(name)))\n .filter((field): field is FieldRecord => field !== undefined);\n for (const field of requested) {\n field.value = cloneValue(field.input.defaultValue);\n const key = refKey(field.input.ref);\n if (!state.resetKeys.has(key)) {\n state.resetKeys.add(key);\n state.resetRefs.push(field.input.ref as AnyRecord);\n }\n }\n };\n doc.print = () => state?.uiEffects.push({ kind: 'print' });\n // Acrobat's doc.submitForm: positional (cURL, bFDF, bEmpty, aFields) or a\n // single argument object ({cURL, aFields, bEmpty, cSubmitAs, bGet}). It\n // emits a submit intent — resolution (Table 239/240 semantics) and the\n // sink chain (embedder handler → the document's home → blocked) live\n // outside the VM; nothing here touches a network.\n doc.submitForm = (cUrlOrArgs?: unknown, bFDF?: unknown, bEmpty?: unknown, aFields?: unknown) => {\n if (!state) return;\n const args: AnyRecord =\n cUrlOrArgs !== null && typeof cUrlOrArgs === 'object'\n ? (cUrlOrArgs as AnyRecord)\n : { cURL: cUrlOrArgs, bFDF, bEmpty, aFields };\n const names = Array.isArray(args.aFields)\n ? (args.aFields as unknown[]).map((name) => String(name))\n : null;\n const submitAs =\n args.cSubmitAs === undefined ? undefined : String(args.cSubmitAs).toUpperCase();\n const format =\n submitAs === 'FDF'\n ? 'fdf'\n : submitAs === 'XFDF'\n ? 'xfdf'\n : submitAs === 'HTML'\n ? 'html'\n : submitAs === 'PDF'\n ? 'pdf'\n : args.bFDF === false\n ? 'html'\n : undefined;\n state.uiEffects.push({\n kind: 'submitForm',\n url: args.cURL === undefined || args.cURL === null ? null : String(args.cURL),\n fieldNames: names,\n includeEmpty: Boolean(args.bEmpty),\n ...(format === undefined ? {} : { format }),\n ...(args.bGet === undefined ? {} : { method: args.bGet ? 'get' : 'post' }),\n });\n };\n doc.mailDoc = () => blocked('mailDoc');\n doc.getURL = () => blocked('getURL');\n\n const app = {\n // Viewer identity — the properties Adobe's ubiquitous version-check\n // boilerplate (`!ADBE::…VersChk…` name-tree scripts) branches on. Honest\n // values for an emulated modern-Reader-level environment, so those\n // scripts take their \"viewer is current\" paths instead of tripping over\n // `undefined`. Deliberately no `xfa_installed`: we never claim XFA.\n platform: 'WIN',\n language: 'ENU',\n viewerType: 'Reader',\n viewerVariation: 'Reader',\n viewerVersion: 21,\n formsVersion: 21,\n alert: (message: unknown, icon?: unknown, _type?: unknown, title?: unknown): number => {\n state?.uiEffects.push({\n kind: 'alert',\n message: String(message),\n icon: Number.isFinite(Number(icon)) ? Number(icon) : 0,\n ...(title === undefined ? {} : { title: String(title) }),\n });\n return 1;\n },\n beep: () => diagnostic('unsupported-api', 'app.beep is not supported in v1'),\n response: () => {\n diagnostic('unsupported-api', 'app.response is not supported in v1');\n return null;\n },\n launchURL: () => blocked('app.launchURL'),\n // Acrobat's contract when a viewer component (e.g. the XFA plugin) is not\n // available is `undefined` — never a throw. A web viewer has no\n // installable components, so \"not available\" is always the truthful\n // answer; Adobe's XFA-check boilerplate calls this after its upgrade nag.\n findComponent: (): undefined => {\n diagnostic('unsupported-api', 'app.findComponent: no installable components in this viewer');\n return undefined;\n },\n };\n\n const pad = (value: number, length = 2): string => String(value).padStart(length, '0');\n const monthShort = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n ];\n const monthLong = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ];\n const printd = (format: unknown, inputDate: unknown): string => {\n const environment = (state?.input.environment ?? {}) as AnyRecord;\n const date =\n inputDate && typeof (inputDate as AnyRecord).getTime === 'function'\n ? new NativeDate(Number((inputDate as { getTime(): number }).getTime()))\n : new NativeDate(Number(environment.nowMs ?? 0));\n const local = new NativeDate(\n date.getTime() + Number(environment.utcOffsetMinutes ?? 0) * 60000,\n );\n const year = local.getUTCFullYear();\n const month = local.getUTCMonth();\n const day = local.getUTCDate();\n const hour = local.getUTCHours();\n const minute = local.getUTCMinutes();\n const second = local.getUTCSeconds();\n const hour12 = hour % 12 === 0 ? 12 : hour % 12;\n const tokens: Record<string, string> = {\n yyyy: String(year),\n yy: pad(year % 100),\n mmmm: monthLong[month],\n mmm: monthShort[month],\n mm: pad(month + 1),\n m: String(month + 1),\n dd: pad(day),\n d: String(day),\n HH: pad(hour),\n hh: pad(hour12),\n h: String(hour12),\n H: String(hour),\n MM: pad(minute),\n M: String(minute),\n ss: pad(second),\n tt: hour < 12 ? 'am' : 'pm',\n };\n // Single pass, longest tokens first; replacements are never re-scanned, so\n // an emitted 'am'/'pm' cannot collide with the month token.\n return String(format).replace(\n /yyyy|mmmm|mmm|yy|mm|dd|HH|hh|MM|ss|tt|m|d|H|h|M/g,\n (token) => tokens[token],\n );\n };\n const util = {\n printd,\n printf: (format: unknown, ...values: unknown[]): string => {\n let index = 0;\n return String(format).replace(/%(?:,?\\d*(?:\\.\\d+)?)?[dfs]/g, (token) => {\n const value = values[index++];\n if (token.endsWith('s')) return String(value ?? '');\n if (token.endsWith('d')) return String(Math.trunc(numberValue(value)));\n const precision = /\\.(\\d+)/.exec(token)?.[1];\n return numberValue(value).toFixed(precision ? Number(precision) : 0);\n });\n },\n };\n\n const begin = (input: AnyRecord, budget?: AnyRecord): void => {\n const fields: FieldRecord[] = ((input.fields as AnyRecord[] | undefined) ?? []).map((field) => {\n const record: FieldRecord = {\n input: field,\n originalValue: cloneValue(field.value),\n value: cloneValue(field.value),\n originalDisplay: String(field.display ?? 'visible'),\n display: String(field.display ?? 'visible'),\n wrapper: {},\n };\n record.wrapper = makeField(record);\n return record;\n });\n const fieldsByName = new Map(fields.map((field) => [String(field.input.name), field]));\n const fieldsByRef = new Map(fields.map((field) => [refKey(field.input.ref), field]));\n const annots: AnnotRecord[] = ((input.annots as AnyRecord[] | undefined) ?? []).map(\n (annotation) => {\n const writableSnapshot = (): AnyRecord => ({\n strokeColor: cloneAnnotValue(annotation.strokeColor ?? ['T']),\n fillColor: cloneAnnotValue(annotation.fillColor ?? ['T']),\n opacity: Number(annotation.opacity ?? 1),\n width: Number(annotation.width ?? 1),\n borderStyle: String(annotation.borderStyle ?? 'S'),\n dash: cloneAnnotValue(annotation.dash ?? []),\n rect: cloneAnnotValue(annotation.rect ?? [0, 0, 0, 0]),\n contents: String(annotation.contents ?? ''),\n hidden: Boolean(annotation.hidden),\n print: Boolean(annotation.print),\n readOnly: Boolean(annotation.readOnly),\n locked: Boolean(annotation.locked),\n noView: Boolean(annotation.noView),\n toggleNoView: Boolean(annotation.toggleNoView),\n });\n const record: AnnotRecord = {\n input: annotation,\n original: writableSnapshot(),\n current: writableSnapshot(),\n wrapper: {},\n };\n record.wrapper = makeAnnot(record);\n return record;\n },\n );\n const annotsByPage = new Map<number, AnnotRecord[]>();\n for (const record of annots) {\n const page = Number(record.input.page ?? 0);\n const bucket = annotsByPage.get(page);\n if (bucket) bucket.push(record);\n else annotsByPage.set(page, [record]);\n }\n const eventInput = (input.event ?? {}) as AnyRecord;\n const target = fieldsByRef.get(refKey(eventInput.target));\n const source = fieldsByRef.get(refKey(eventInput.source));\n const initialValue =\n eventInput.value !== undefined\n ? cloneValue(eventInput.value)\n : cloneValue(target?.value ?? null);\n const eventType =\n eventInput.type !== undefined\n ? String(eventInput.type)\n : eventInput.kind === 'name-tree-boot'\n ? 'Doc'\n : 'Field';\n const event: AnyRecord = {\n // Explicit type/name (action-driven runs, from trigger provenance)\n // beat the kind-derived defaults (the K/V/C/F pipeline path).\n name:\n eventInput.name !== undefined\n ? String(eventInput.name)\n : eventName(String(eventInput.kind ?? '')),\n type: eventType,\n // Doc-typed events target the Doc object (Acrobat's WillSave\n // boilerplate does `event.target.getField(...)`); field targets win\n // when present (a widget-anchored run).\n target: target?.wrapper ?? (eventType === 'Doc' ? doc : null),\n targetName: String(target?.input.name ?? ''),\n source: source?.wrapper ?? { source: doc },\n value: initialValue,\n change: String(eventInput.change ?? ''),\n selStart: Math.max(0, Math.trunc(Number(eventInput.selStart ?? 0))),\n selEnd: Math.max(0, Math.trunc(Number(eventInput.selEnd ?? 0))),\n willCommit: Boolean(eventInput.willCommit),\n modifier: Boolean(eventInput.modifier),\n shift: Boolean(eventInput.shift),\n rc: true,\n };\n state = {\n input,\n fields,\n fieldsByName,\n fieldsByRef,\n annots,\n annotsByPage,\n annotPages: new Set(\n ((input.annotPages as unknown[] | undefined) ?? []).map((page) => Math.trunc(Number(page))),\n ),\n annotsCoverDocument: Boolean(input.annotsCoverDocument),\n event,\n resetRefs: [],\n resetKeys: new Set(),\n uiEffects: [],\n diagnostics: [],\n randomState: Number((input.environment as AnyRecord | undefined)?.randomSeed ?? 1) >>> 0,\n maxEffects: Math.max(1, Math.trunc(Number(budget?.maxEffects ?? 256))),\n };\n host.event = event;\n host.identity = { ...((input.identity as AnyRecord | undefined) ?? {}) };\n };\n\n const formValue = (field: FieldRecord, value: unknown): AnyRecord | null => {\n const family = String(field.input.family);\n if (family === 'text') return { value: String(value ?? '') };\n if (family === 'checkbox' || family === 'radio') {\n // A toggle's script value is its export value, 'Off' when clear.\n return {\n value:\n value === null || value === undefined || String(value) === 'Off' ? null : String(value),\n };\n }\n if (family === 'combobox') {\n const selected = Array.isArray(value) ? value[0] : value;\n const text = selected === null || selected === undefined ? '' : String(selected);\n return { value: text === '' ? null : text };\n }\n if (family === 'listbox') {\n if (Array.isArray(value)) return { selectedValues: value.map(String) };\n return {\n selectedValues:\n value === null || value === undefined || value === '' ? [] : [String(value)],\n };\n }\n diagnostic(\n 'invalid-field-value',\n `field '${String(field.input.name)}' cannot accept a scripted value`,\n );\n return null;\n };\n\n const eventOutput = (): AnyRecord => ({\n rc: Boolean(state?.event.rc),\n value: cloneValue(state?.event.value ?? null),\n change: String(state?.event.change ?? ''),\n selStart: Math.max(0, Math.trunc(Number(state?.event.selStart ?? 0))),\n selEnd: Math.max(0, Math.trunc(Number(state?.event.selEnd ?? 0))),\n });\n\n const finish = (): AnyRecord => {\n if (!state) throw new Error('AcroJS run state was not initialized');\n const eventInput = state.input.event as AnyRecord;\n const target = state.fieldsByRef.get(refKey(eventInput.target));\n const kind = String(eventInput.kind ?? '');\n if (target && kind === 'field-calculate') target.value = cloneValue(state.event.value);\n\n const formEffects: AnyRecord[] = [];\n if (state.resetRefs.length > 0) formEffects.push({ kind: 'reset', refs: [...state.resetRefs] });\n for (const field of state.fields) {\n const key = refKey(field.input.ref);\n // A reset effect is replayed before the value effects below, so reset\n // fields start from their default rather than the transaction input.\n // This preserves reset -> rewrite-to-original sequences.\n const valueBaseline = state.resetKeys.has(key)\n ? field.input.defaultValue\n : field.originalValue;\n if (!sameValue(field.value, valueBaseline)) {\n const value = formValue(field, field.value);\n if (value) formEffects.push({ kind: 'setValue', ref: field.input.ref, value });\n }\n if (field.display !== field.originalDisplay) {\n formEffects.push({ kind: 'setDisplay', ref: field.input.ref, display: field.display });\n }\n }\n if (target && kind === 'field-format') {\n formEffects.push({\n kind: 'setAppearanceText',\n ref: target.input.ref,\n text: String(state.event.value ?? ''),\n });\n }\n // Annot effects: the canonical per-annot diff, exactly the fields model —\n // last write wins per key, ordered by the input plane's annot order.\n const annotEffects: AnyRecord[] = [];\n for (const record of state.annots) {\n const patch: AnyRecord = {};\n const flags: AnyRecord = {};\n for (const key of Object.keys(record.current)) {\n if (sameAnnotValue(record.current[key], record.original[key])) continue;\n if (ANNOT_FLAG_KEYS.indexOf(key) >= 0) flags[key] = record.current[key];\n else patch[key] = cloneAnnotValue(record.current[key]);\n }\n if (Object.keys(flags).length > 0) patch.flags = flags;\n if (Object.keys(patch).length > 0) annotEffects.push({ ref: record.input.ref, patch });\n }\n\n const totalEffects = formEffects.length + annotEffects.length + state.uiEffects.length;\n if (totalEffects > state.maxEffects) {\n return {\n event: eventOutput(),\n formEffects: [],\n annotEffects: [],\n uiEffects: [],\n diagnostics: [...state.diagnostics],\n error: {\n kind: 'budget',\n message: `script produced ${totalEffects} effects; limit is ${state.maxEffects}`,\n },\n };\n }\n return {\n event: eventOutput(),\n formEffects,\n annotEffects,\n uiEffects: [...state.uiEffects],\n diagnostics: [...state.diagnostics],\n };\n };\n\n const failed = (error: unknown): AnyRecord => ({\n event: eventOutput(),\n formEffects: [],\n annotEffects: [],\n uiEffects: [],\n diagnostics: [...(state?.diagnostics ?? [])],\n error: {\n kind: 'exception',\n message: error instanceof Error ? error.message : String(error),\n ...(error instanceof Error && error.stack ? { stack: error.stack } : {}),\n },\n });\n\n const evaluate = (source: string): unknown => {\n // Indirect eval is deliberate: name-tree declarations must persist in the\n // isolated realm's global scope for later field events.\n return (0, eval)(source);\n };\n\n const boot = (sources: unknown, input: unknown, budget?: unknown): AnyRecord => {\n begin(input as AnyRecord, budget as AnyRecord | undefined);\n try {\n for (const source of (sources as unknown[]) ?? []) evaluate(String(source));\n return finish();\n } catch (error) {\n return failed(error);\n }\n };\n const run = (source: unknown, input: unknown, budget?: unknown): AnyRecord => {\n begin(input as AnyRecord, budget as AnyRecord | undefined);\n try {\n evaluate(String(source));\n return finish();\n } catch (error) {\n return failed(error);\n }\n };\n\n // PDF scripts share this realm, but they must not replace the host-owned\n // transaction boundary for later events in the same document.\n Object.defineProperties(host, {\n __acrojsBoot: { configurable: false, writable: false, value: boot },\n __acrojsRun: { configurable: false, writable: false, value: run },\n });\n\n host.app = app;\n host.util = util;\n host.display = Object.freeze({ visible: 0, hidden: 1, noPrint: 2, noView: 3 });\n // The standard Acrobat color object: constants + convert/equal with the\n // documented G/RGB/CMYK vectors (self-contained twin of src/color.ts).\n host.color = Object.freeze({\n transparent: Object.freeze(['T']),\n black: Object.freeze(['G', 0]),\n white: Object.freeze(['G', 1]),\n gray: Object.freeze(['G', 0.5]),\n ltGray: Object.freeze(['G', 0.75]),\n dkGray: Object.freeze(['G', 0.25]),\n red: Object.freeze(['RGB', 1, 0, 0]),\n green: Object.freeze(['RGB', 0, 1, 0]),\n blue: Object.freeze(['RGB', 0, 0, 1]),\n cyan: Object.freeze(['CMYK', 1, 0, 0, 0]),\n magenta: Object.freeze(['CMYK', 0, 1, 0, 0]),\n yellow: Object.freeze(['CMYK', 0, 0, 1, 0]),\n convert: (value: unknown, space: unknown): unknown[] => {\n if (!isColorArray(value)) return ['T'];\n const target = String(space);\n const rgb = colorToRgbTriple(value);\n if (target === 'T' || rgb === null) return ['T'];\n if (target === 'G') return ['G', 0.3 * rgb[0] + 0.59 * rgb[1] + 0.11 * rgb[2]];\n if (target === 'RGB') return ['RGB', rgb[0], rgb[1], rgb[2]];\n if (target === 'CMYK') {\n const black = 1 - Math.max(rgb[0], rgb[1], rgb[2]);\n return ['CMYK', 1 - rgb[0] - black, 1 - rgb[1] - black, 1 - rgb[2] - black, black];\n }\n return ['T'];\n },\n equal: (left: unknown, right: unknown): boolean => {\n if (!isColorArray(left) || !isColorArray(right)) return false;\n const leftRgb = colorToRgbTriple(left);\n const rightRgb = colorToRgbTriple(right);\n if (leftRgb === null || rightRgb === null) return leftRgb === rightRgb;\n return leftRgb.every((component, index) => Math.abs(component - rightRgb[index]) < 1e-6);\n },\n });\n host.getField = getField;\n host.getAnnots = getAnnots;\n host.getAnnot = getAnnot;\n host.resetForm = doc.resetForm;\n host.print = doc.print;\n host.submitForm = doc.submitForm;\n host.mailDoc = doc.mailDoc;\n host.getURL = doc.getURL;\n Object.defineProperties(host, {\n documentFileName: { configurable: true, get: () => doc.documentFileName },\n numFields: { configurable: true, get: () => doc.numFields },\n pageNum: {\n configurable: true,\n get: () => doc.pageNum,\n set: (value: unknown) => {\n doc.pageNum = value;\n },\n },\n });\n\n class FixedDate extends NativeDate {\n constructor(...args: unknown[]) {\n if (args.length === 0) {\n super(Number(((state?.input.environment ?? {}) as AnyRecord).nowMs ?? 0));\n } else if (args.length === 1) {\n super(args[0] as string | number);\n } else {\n super(\n Number(args[0]),\n Number(args[1]),\n Number(args[2] ?? 1),\n Number(args[3] ?? 0),\n Number(args[4] ?? 0),\n Number(args[5] ?? 0),\n Number(args[6] ?? 0),\n );\n }\n }\n static override now(): number {\n return Number(((state?.input.environment ?? {}) as AnyRecord).nowMs ?? 0);\n }\n }\n host.Date = FixedDate;\n\n const math = host.Math as Math | undefined;\n if (math) {\n math.random = () => {\n if (!state) return 0;\n state.randomState = (1664525 * state.randomState + 1013904223) >>> 0;\n return state.randomState / 0x100000000;\n };\n }\n\n host.AFSimple_Calculate = (operation: unknown, names: unknown): void => {\n const requested = Array.isArray(names) ? names : String(names).split(',');\n const values = requested.map((name) => numberValue(getField(String(name).trim())?.value));\n const op = String(operation).toUpperCase();\n const value =\n values.length === 0\n ? 0\n : op === 'PRD'\n ? values.reduce((left, right) => left * right, 1)\n : op === 'AVG'\n ? values.reduce((left, right) => left + right, 0) / values.length\n : op === 'MIN'\n ? Math.min(...values)\n : op === 'MAX'\n ? Math.max(...values)\n : values.reduce((left, right) => left + right, 0);\n if (state) state.event.value = value;\n };\n host.AFNumber_Format = (\n decimals: unknown,\n separatorStyle: unknown,\n _negativeStyle: unknown,\n _currencyStyle: unknown,\n currency: unknown,\n prepend: unknown,\n ): void => {\n if (!state) return;\n const places = Math.max(0, Math.min(10, Math.trunc(Number(decimals))));\n let formatted = numberValue(state.event.value).toFixed(places);\n if (Number(separatorStyle) === 0 || Number(separatorStyle) === 2) {\n const [whole, fraction] = formatted.split('.');\n formatted = `${whole.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',')}${fraction === undefined ? '' : `.${fraction}`}`;\n }\n const symbol = String(currency ?? '');\n state.event.value = prepend ? `${symbol}${formatted}` : `${formatted}${symbol}`;\n };\n host.AFPercent_Format = (decimals: unknown): void => {\n if (!state) return;\n const places = Math.max(0, Math.min(10, Math.trunc(Number(decimals))));\n state.event.value = `${(numberValue(state.event.value) * 100).toFixed(places)}%`;\n };\n // ── Acrobat AF support library ─────────────────────────────────────────\n // Deterministic subset of Acrobat's AFxxx forms helpers. Everything reads\n // only the injected environment; keystroke helpers validate the committed\n // value (this pipeline runs K once, on commit, as a full replacement).\n\n const DATE_FORMATS = [\n 'm/d',\n 'm/d/yy',\n 'mm/dd/yy',\n 'mm/yy',\n 'd-mmm',\n 'd-mmm-yy',\n 'dd-mmm-yy',\n 'yy-mm-dd',\n 'mmm-yy',\n 'mmmm-yy',\n 'mmm d, yyyy',\n 'mmmm d, yyyy',\n 'm/d/yy h:MM tt',\n 'm/d/yy HH:MM',\n ];\n const TIME_FORMATS = ['HH:MM', 'h:MM tt', 'HH:MM:ss', 'h:MM:ss tt'];\n\n const rejectWithAlert = (message: string): void => {\n if (!state) return;\n state.uiEffects.push({ kind: 'alert', message, icon: 0 });\n state.event.rc = false;\n };\n const formatMismatch = (): void =>\n rejectWithAlert(\n `The value entered does not match the format of the field [ ${String(\n state?.event.targetName ?? '',\n )} ]`,\n );\n const dateMismatch = (format: unknown): void =>\n rejectWithAlert(\n `Invalid date/time: please ensure that the date/time exists. Field [ ${String(\n state?.event.targetName ?? '',\n )} ] should match format ${String(format ?? '')}`,\n );\n\n const mergeChange = (eventObject?: unknown): string => {\n const event = (eventObject ?? state?.event ?? {}) as AnyRecord;\n const value = String(event.value ?? '');\n if (event.willCommit) return value;\n const start = Math.max(0, Math.trunc(Number(event.selStart ?? 0)));\n const end = Math.max(start, Math.trunc(Number(event.selEnd ?? 0)));\n return value.slice(0, start) + String(event.change ?? '') + value.slice(end);\n };\n host.AFMergeChange = mergeChange;\n\n const makeNumber = (value: unknown): number | null => {\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n let text = String(value ?? '').trim();\n if (text === '') return null;\n text = text.replace(/[^0-9,.\\-+eE]/g, '');\n if (text.includes(',') && text.includes('.')) {\n // The last separator is the decimal: \"1,234.56\" vs \"1.234,56\".\n text =\n text.lastIndexOf(',') > text.lastIndexOf('.')\n ? text.replace(/\\./g, '').replace(',', '.')\n : text.replace(/,/g, '');\n } else if (text.includes(',')) {\n // A single comma reads as the decimal separator; several are thousands.\n text =\n (text.match(/,/g) ?? []).length === 1 ? text.replace(',', '.') : text.replace(/,/g, '');\n }\n const parsed = Number(text);\n return text !== '' && Number.isFinite(parsed) ? parsed : null;\n };\n host.AFMakeNumber = makeNumber;\n\n host.AFExtractNums = (value: unknown): string[] | null => {\n const matches = String(value ?? '').match(/\\d+/g);\n return matches && matches.length > 0 ? [...matches] : null;\n };\n\n const validNumberText = (text: string, separatorStyle: number): boolean => {\n const trimmed = text.trim();\n if (trimmed === '') return true;\n const decimalComma = separatorStyle === 2 || separatorStyle === 3;\n const pattern = decimalComma\n ? /^[+-]?(\\d+|\\d{1,3}(\\.\\d{3})+)?(,\\d*)?$/\n : /^[+-]?(\\d+|\\d{1,3}(,\\d{3})+)?(\\.\\d*)?$/;\n return pattern.test(trimmed) && /\\d/.test(trimmed);\n };\n host.AFNumber_Keystroke = (\n _decimals: unknown,\n separatorStyle: unknown,\n _negativeStyle: unknown,\n _currencyStyle: unknown,\n currency: unknown,\n ): void => {\n if (!state || !state.event.willCommit) return;\n const proposed = mergeChange(state.event);\n const cleaned = currency ? proposed.split(String(currency)).join('') : proposed;\n if (!validNumberText(cleaned, Math.trunc(Number(separatorStyle)))) formatMismatch();\n };\n host.AFPercent_Keystroke = (_decimals: unknown, separatorStyle: unknown): void => {\n if (!state || !state.event.willCommit) return;\n const cleaned = mergeChange(state.event).replace(/%\\s*$/, '');\n if (!validNumberText(cleaned, Math.trunc(Number(separatorStyle)))) formatMismatch();\n };\n\n const digitsOf = (value: unknown): string => String(value ?? '').replace(/\\D/g, '');\n const afSpecialFormat = (psf: unknown): void => {\n if (!state) return;\n const digits = digitsOf(state.event.value);\n const kind = Math.trunc(Number(psf));\n let formatted = String(state.event.value ?? '');\n if (kind === 0) formatted = digits.slice(0, 5);\n else if (kind === 1) formatted = `${digits.slice(0, 5)}-${digits.slice(5, 9)}`;\n else if (kind === 2)\n formatted =\n digits.length >= 10\n ? `(${digits.slice(0, 3)}) ${digits.slice(3, 6)}-${digits.slice(6, 10)}`\n : `${digits.slice(0, 3)}-${digits.slice(3, 7)}`;\n else if (kind === 3)\n formatted = `${digits.slice(0, 3)}-${digits.slice(3, 5)}-${digits.slice(5, 9)}`;\n state.event.value = formatted;\n };\n host.AFSpecial_Format = afSpecialFormat;\n host.AFSpecial_Keystroke = (psf: unknown): void => {\n if (!state || !state.event.willCommit) return;\n const merged = mergeChange(state.event);\n if (merged.trim() === '') return;\n const digits = digitsOf(merged).length;\n const kind = Math.trunc(Number(psf));\n const valid =\n kind === 0\n ? digits === 5\n : kind === 1\n ? digits === 9\n : kind === 2\n ? digits === 7 || digits === 10\n : digits === 9;\n if (!valid) formatMismatch();\n };\n\n host.AFRange_Validate = (\n useGreater: unknown,\n greaterThan: unknown,\n useLess: unknown,\n lessThan: unknown,\n ): void => {\n if (!state) return;\n const value = makeNumber(state.event.value);\n if (value === null) return;\n const hasGreater = Boolean(useGreater);\n const hasLess = Boolean(useLess);\n const low = Number(greaterThan);\n const high = Number(lessThan);\n if ((!hasGreater || value >= low) && (!hasLess || value <= high)) return;\n rejectWithAlert(\n hasGreater && hasLess\n ? `Invalid value: must be greater than or equal to ${low} and less than or equal to ${high}.`\n : hasGreater\n ? `Invalid value: must be greater than or equal to ${low}.`\n : `Invalid value: must be less than or equal to ${high}.`,\n );\n };\n\n interface WallTime {\n y: number;\n m: number;\n d: number;\n H: number;\n M: number;\n S: number;\n }\n const nowWall = (): WallTime => {\n const env = (state?.input.environment ?? {}) as AnyRecord;\n const local = new NativeDate(\n Number(env.nowMs ?? 0) + Number(env.utcOffsetMinutes ?? 0) * 60000,\n );\n return {\n y: local.getUTCFullYear(),\n m: local.getUTCMonth() + 1,\n d: local.getUTCDate(),\n H: 0,\n M: 0,\n S: 0,\n };\n };\n /** printd adds the environment offset itself, so a wall time converts back. */\n const wallDate = (parts: WallTime): Date => {\n const env = (state?.input.environment ?? {}) as AnyRecord;\n return new NativeDate(\n NativeDate.UTC(parts.y, parts.m - 1, parts.d, parts.H, parts.M, parts.S) -\n Number(env.utcOffsetMinutes ?? 0) * 60000,\n );\n };\n\n /** Lenient scand-style parse: numbers mapped by the format's token order,\n * month names accepted, missing parts defaulted like Acrobat's scand. */\n const parseDateLoose = (raw: unknown, format: unknown): WallTime | null => {\n const text = String(raw ?? '').trim();\n if (text === '') return null;\n const lower = text.toLowerCase();\n let namedMonth: number | null = null;\n for (let index = 0; index < 12; index += 1) {\n if (lower.indexOf(monthShort[index].toLowerCase()) >= 0) {\n namedMonth = index + 1;\n break;\n }\n }\n const timeMatch = /(\\d{1,2}):(\\d{2})(?::(\\d{2}))?\\s*(am|pm)?/i.exec(text);\n let hours = 0;\n let minutes = 0;\n let seconds = 0;\n if (timeMatch) {\n hours = Number(timeMatch[1]);\n minutes = Number(timeMatch[2]);\n seconds = Number(timeMatch[3] ?? 0);\n const marker = String(timeMatch[4] ?? '').toLowerCase();\n if (marker === 'pm' && hours < 12) hours += 12;\n if (marker === 'am' && hours === 12) hours = 0;\n if (hours > 23 || minutes > 59 || seconds > 59) return null;\n }\n const dateText = timeMatch\n ? text.slice(0, timeMatch.index) + text.slice(timeMatch.index + timeMatch[0].length)\n : text;\n const numbers = (dateText.match(/\\d+/g) ?? []).map((token) => Number(token));\n const order: Array<'y' | 'm' | 'd'> = [];\n for (const token of String(format ?? '').match(/yyyy|mmmm|mmm|yy|mm|dd|m|d/g) ?? []) {\n const kind = (token[0] === 'y' ? 'y' : token[0] === 'm' ? 'm' : 'd') as 'y' | 'm' | 'd';\n if (order.indexOf(kind) < 0) order.push(kind);\n }\n let year: number | null = null;\n let month: number | null = namedMonth;\n let day: number | null = null;\n let cursor = 0;\n for (const kind of order) {\n if (kind === 'm' && namedMonth !== null) continue;\n if (cursor >= numbers.length) break;\n const value = numbers[cursor];\n cursor += 1;\n if (kind === 'y') year = value;\n else if (kind === 'm') month = value;\n else day = value;\n }\n if (year === null && month === null && day === null && !timeMatch) return null;\n const today = nowWall();\n if (year === null) year = today.y;\n else if (year < 100) year = year < 50 ? 2000 + year : 1900 + year;\n if (month === null) month = today.m;\n if (day === null) day = 1;\n if (month < 1 || month > 12 || day < 1 || day > 31) return null;\n const probe = new NativeDate(NativeDate.UTC(year, month - 1, day));\n if (\n probe.getUTCFullYear() !== year ||\n probe.getUTCMonth() !== month - 1 ||\n probe.getUTCDate() !== day\n ) {\n return null;\n }\n return { y: year, m: month, d: day, H: hours, M: minutes, S: seconds };\n };\n\n const afDateFormatEx = (format: unknown): void => {\n if (!state) return;\n const raw = String(state.event.value ?? '');\n if (raw.trim() === '') return;\n let date: Date = new FixedDate(raw);\n if (Number.isNaN(date.getTime())) {\n const parts = parseDateLoose(raw, format);\n if (!parts) return; // unparsable: leave the value untouched\n date = wallDate(parts);\n }\n state.event.value = printd(format, date);\n };\n host.AFDate_FormatEx = afDateFormatEx;\n host.AFDate_Format = (index: unknown): void =>\n afDateFormatEx(DATE_FORMATS[Math.trunc(Number(index))] ?? 'm/d/yy');\n\n const afDateKeystrokeEx = (format: unknown): void => {\n if (!state || !state.event.willCommit) return;\n const merged = mergeChange(state.event);\n if (merged.trim() === '') return;\n if (!parseDateLoose(merged, format)) dateMismatch(format);\n };\n host.AFDate_KeystrokeEx = afDateKeystrokeEx;\n host.AFDate_Keystroke = (index: unknown): void =>\n afDateKeystrokeEx(DATE_FORMATS[Math.trunc(Number(index))] ?? 'm/d/yy');\n\n const afTimeFormatEx = (format: unknown): void => {\n if (!state) return;\n const raw = String(state.event.value ?? '');\n if (raw.trim() === '') return;\n const parts = parseDateLoose(raw, format);\n if (!parts) return;\n state.event.value = printd(format, wallDate(parts));\n };\n host.AFTime_FormatEx = afTimeFormatEx;\n host.AFTime_Format = (index: unknown): void =>\n afTimeFormatEx(TIME_FORMATS[Math.trunc(Number(index))] ?? 'HH:MM');\n host.AFTime_Keystroke = (index: unknown): void => {\n if (!state || !state.event.willCommit) return;\n const merged = mergeChange(state.event);\n if (merged.trim() === '') return;\n if (!parseDateLoose(merged, TIME_FORMATS[Math.trunc(Number(index))] ?? 'HH:MM')) {\n dateMismatch(TIME_FORMATS[Math.trunc(Number(index))] ?? 'HH:MM');\n }\n };\n\n // QuickJS does not provide browser networking, but explicitly shadow these\n // names so a future adapter cannot accidentally inject ambient authority.\n host.fetch = undefined;\n host.XMLHttpRequest = undefined;\n host.WebSocket = undefined;\n}\n\n/** The exact self-contained source evaluated in Node parity tests and QuickJS. */\nexport const PRELUDE_SOURCE = `(${installAcroJs.toString()})(globalThis);`;\n"],"mappings":"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"}
|