@fixback/sdk 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +12 -2
  2. package/dist/capture/extract-dom.d.ts +33 -0
  3. package/dist/connect.d.ts +47 -0
  4. package/dist/dom.d.ts +7 -19
  5. package/dist/element-picker.d.ts +1 -1
  6. package/dist/error-capture.d.ts +21 -64
  7. package/dist/fixback.umd.js +36 -202
  8. package/dist/fixback.umd.js.map +1 -1
  9. package/dist/identity.d.ts +6 -1
  10. package/dist/index.d.ts +17 -15
  11. package/dist/index.mjs +3577 -3683
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/init.d.ts +62 -96
  14. package/dist/mount.d.ts +46 -0
  15. package/dist/overlay/dom.d.ts +16 -0
  16. package/dist/overlay/icons.d.ts +23 -0
  17. package/dist/overlay/marking.d.ts +64 -0
  18. package/dist/overlay/send.d.ts +65 -0
  19. package/dist/overlay/view.d.ts +78 -0
  20. package/dist/overlay-styles.d.ts +1 -1
  21. package/dist/overlay.d.ts +40 -41
  22. package/dist/package.json +3 -0
  23. package/dist/report.d.ts +9 -13
  24. package/dist/reporter-session-store.d.ts +17 -0
  25. package/dist/session.d.ts +27 -0
  26. package/dist/submit.d.ts +51 -8
  27. package/dist/trace/instrument/beacon.d.ts +16 -0
  28. package/dist/trace/instrument/console.d.ts +11 -0
  29. package/dist/trace/instrument/fetch.d.ts +16 -0
  30. package/dist/trace/instrument/index.d.ts +64 -0
  31. package/dist/trace/instrument/navigation.d.ts +12 -0
  32. package/dist/trace/instrument/ui.d.ts +23 -0
  33. package/dist/trace/instrument/window.d.ts +66 -0
  34. package/dist/trace/instrument/xhr.d.ts +15 -0
  35. package/dist/version.d.ts +1 -1
  36. package/package.json +8 -5
  37. package/dist/boot.d.ts +0 -74
  38. package/dist/breadcrumbs.d.ts +0 -327
  39. package/dist/invite.d.ts +0 -104
  40. package/dist/onboarding-styles.d.ts +0 -8
  41. package/dist/onboarding.d.ts +0 -44
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["EventType"],"sources":["../src/boot.ts","../../sdk-core/src/fingerprint.ts","../../sdk-core/src/scrub.ts","../../sdk-core/src/backoff.ts","../src/dom.ts","../src/element-picker.ts","../src/breadcrumbs.ts","../src/annotation.ts","../src/report.ts","../src/submit.ts","../src/version.ts","../src/error-capture.ts","../src/identity.ts","../src/invite.ts","../src/styles.ts","../src/launcher.ts","../src/onboarding-styles.ts","../src/onboarding.ts","../src/draw-surface.ts","../src/region-capture.ts","../src/overlay-styles.ts","../src/overlay.ts","../../../node_modules/.pnpm/@rrweb+record@2.1.1/node_modules/@rrweb/record/dist/record.js","../../../node_modules/.pnpm/@rrweb+types@2.1.1/node_modules/@rrweb/types/dist/types.js","../src/replay.ts","../src/init.ts"],"sourcesContent":["/**\n * The ingest **boot** wire-contract, vendored.\n *\n * The SDK deliberately does not import `@fixback/shared` — that package is\n * private and server-shaped (ticket #47). The boot request/response is small and\n * stable, so the exact slice the SDK needs is copied here. Keep it in lock-step\n * with the server: the request body accepted by `POST /api/ingest/boot`\n * (`apps/api/src/ingest/ingest.controller.ts`) and the `BootAnswer` returned by\n * `evaluateBoot` (`apps/api/src/ingest/reporter-identity.ts`).\n */\n\n/** A Project's Gate — who may submit. Mirrors the server's `ProjectGate`. */\nexport type ProjectGate = \"open\" | \"invited\" | \"internal\";\n\n/** The trust tier a Reporter holds. Mirrors the server's `ReporterTier`. */\nexport type ReporterTier = \"public\" | \"invited\" | \"internal\";\n\n/**\n * Optional identity evidence the SDK forwards to boot. None of it is a tier: the\n * server re-derives trust from this evidence and never honours a self-declared\n * tier, so the SDK does not send one.\n */\nexport interface IdentityInputs {\n readonly signedIdentity?: string;\n readonly reporterId?: string;\n readonly anonymousId?: string;\n}\n\n/** The JSON body `POST /api/ingest/boot` accepts. */\nexport interface BootRequest extends IdentityInputs {\n readonly key: string;\n}\n\n/**\n * The Project's effective console/network capture config, served on the boot answer\n * (spec #122 §L; ticket #138). Each flag is the per-project master toggle ANDed with\n * that stream's own toggle, so the SDK gates instrumentation on one boolean per\n * stream. Optional on the wire: an older server that does not send it (or a\n * malformed value) is treated as **capture on** — default-on, matching the server\n * default — and `init` options override whatever is served.\n */\nexport interface CaptureConfig {\n readonly console: boolean;\n readonly network: boolean;\n /**\n * The Project's session-replay toggle (issue #189, ADR-0024). Optional on the\n * wire: a server predating replay omits it, which — like the other streams —\n * means **capture on**.\n */\n readonly replay?: boolean;\n}\n\n/**\n * The boot answer: whether this origin is allowlisted, the Project's Gate, the\n * caller's derived tier (`null` when a presented identity was refused), whether a\n * submission would be accepted right now, and the Project's capture config. The\n * launcher shows only when `canSubmit` is true.\n */\nexport interface BootAnswer {\n readonly originAllowed: boolean;\n readonly gate: ProjectGate;\n readonly tier: ReporterTier | null;\n readonly canSubmit: boolean;\n /** The Project's console/network capture config; absent ⇒ default-on (#138). */\n readonly capture?: CaptureConfig;\n}\n\n/** Join an API base URL with the boot path, tolerating a trailing slash. */\nexport function bootEndpoint(apiUrl: string): string {\n return `${apiUrl.replace(/\\/+$/, \"\")}/api/ingest/boot`;\n}\n\n/** Narrow an unknown JSON body to a `BootAnswer` before the SDK trusts it. */\nfunction isBootAnswer(value: unknown): value is BootAnswer {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n return (\n typeof v.originAllowed === \"boolean\" &&\n typeof v.canSubmit === \"boolean\" &&\n typeof v.gate === \"string\" &&\n (v.tier === null || typeof v.tier === \"string\")\n );\n}\n\n/**\n * Ask ingest whether a submission would be accepted for this key / origin / Gate.\n * Resolves to the boot answer, or `null` when Fixback could not be reached, the\n * key was refused, or the response was not a boot answer. It never throws: any\n * non-answer is treated by the caller as \"do not show the launcher\", so a Fixback\n * outage stays invisible to the host page (ticket #47: \"fails quietly\").\n *\n * The browser attaches the `Origin` header itself on this cross-origin request —\n * the server reads it to decide `originAllowed` — so the SDK neither sets nor\n * needs to set it. `fetchImpl` is injectable purely so the boot call is testable.\n */\nexport async function requestBoot(\n apiUrl: string,\n request: BootRequest,\n fetchImpl: typeof fetch = fetch,\n): Promise<BootAnswer | null> {\n let response: Response;\n try {\n response = await fetchImpl(bootEndpoint(apiUrl), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(request),\n });\n } catch {\n return null; // network error / Fixback unreachable\n }\n\n if (!response.ok) return null; // 401 unknown key, or any other refusal\n\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n return null;\n }\n\n return isBootAnswer(body) ? body : null;\n}\n","/**\n * The cross-surface error **fingerprint** (research `sentry-error-capture-findings.md`\n * §7.2; ADR-0027/0028) — the pure, runtime-agnostic key by which the same logical\n * error groups together, computed the **same way** on every SDK.\n *\n * `computeFingerprint(type, value, stack)` hashes the error type, a normalised\n * message, and a compact top-frames signature. It only has to be stable and\n * well-distributed (the client key is a flood guard; the server does canonical\n * cross-session clustering), so a dependency-free FNV-1a hash is right. The\n * `normalize` shape and the frame limit are **starting points** from research\n * (ticket #92), tunable — never a frozen magic set.\n */\n\nconst UUID_RE =\n /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;\nconst URL_RE = /\\bhttps?:\\/\\/[^\\s\"')]+/gi;\nconst HEX_0X_RE = /\\b0x[0-9a-f]+\\b/gi;\nconst HEX_RUN_RE = /\\b[0-9a-f]{8,}\\b/gi;\nconst DIGIT_RUN_RE = /\\d{4,}/g;\n\n/** How many top stack frames feed the fingerprint (research §7.2). */\nconst FINGERPRINT_FRAME_LIMIT = 5;\n\n/**\n * Collapse the volatile parts of an error message so a changing string doesn't\n * split one bug: UUIDs, URLs, `0x…` and long hex runs, and long digit runs are\n * replaced with stable placeholders. Short numbers and stable text are kept so\n * genuinely distinct bugs stay distinct. A small, dependency-free regex set —\n * tunable per ticket #92, never a frozen magic set.\n */\nexport function normalize(value: string): string {\n if (typeof value !== \"string\" || value.length === 0) return \"\";\n return value\n .replace(UUID_RE, \"<uuid>\")\n .replace(URL_RE, \"<url>\")\n .replace(HEX_0X_RE, \"<hex>\")\n .replace(HEX_RUN_RE, \"<hex>\")\n .replace(DIGIT_RUN_RE, \"<n>\")\n .trim();\n}\n\n/**\n * A dependency-free FNV-1a hash rendered in base-36. It only has to be stable and\n * well-distributed within one session (the client key is a flood guard; the server\n * does canonical cross-session clustering), so a non-cryptographic hash is right.\n */\nexport function hashString(input: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(36);\n}\n\n/** Reduce a frame location to `basename:line:col`, dropping origin and query. */\nfunction compactLocation(location: string): string {\n const noQuery = location.replace(/\\?[^:]*/, \"\");\n const lastSlash = noQuery.lastIndexOf(\"/\");\n return lastSlash >= 0 ? noQuery.slice(lastSlash + 1) : noQuery;\n}\n\n/** Parse one stack line into a compact `function@basename:line:col` frame id. */\nfunction parseFrame(line: string): string | null {\n // V8: \"at fn (loc)\" | \"at loc\"\n const v8Named = line.match(/^at\\s+(.+?)\\s+\\((.+)\\)$/);\n if (v8Named) return `${v8Named[1] ?? \"\"}@${compactLocation(v8Named[2] ?? \"\")}`;\n const v8Bare = line.match(/^at\\s+(.+)$/);\n if (v8Bare) return `@${compactLocation(v8Bare[1] ?? \"\")}`;\n // Firefox / Safari: \"fn@loc\" | \"@loc\"\n const at = line.indexOf(\"@\");\n if (at >= 0) {\n const fn = line.slice(0, at);\n return `${fn}@${compactLocation(line.slice(at + 1))}`;\n }\n return null;\n}\n\n/**\n * Extract a compact, stable signature of the top in-app frames of a stack: up to\n * {@link FINGERPRINT_FRAME_LIMIT} frames as `function@basename:line:col`, origin\n * and cache-busting query stripped so a per-deploy asset hash doesn't matter within\n * a session. Returns `\"\"` when there is no usable stack (message-only fallback).\n */\nexport function extractTopFrames(\n stack: string | undefined,\n limit = FINGERPRINT_FRAME_LIMIT,\n): string {\n if (typeof stack !== \"string\" || stack.length === 0) return \"\";\n const frames: string[] = [];\n for (const raw of stack.split(\"\\n\")) {\n const frame = parseFrame(raw.trim());\n if (frame) {\n frames.push(frame);\n if (frames.length >= limit) break;\n }\n }\n return frames.join(\" < \");\n}\n\n/**\n * The per-session fingerprint (research §7.2):\n * `hash(errorType + \"|\" + normalize(value) + \"|\" + topFrames)`. Stack frames\n * dominate when present; otherwise it falls back to type + normalized value.\n */\nexport function computeFingerprint(\n type: string,\n value: string,\n stack?: string,\n): string {\n return hashString(`${type}|${normalize(value)}|${extractTopFrames(stack)}`);\n}\n","/**\n * The single client-side **scrub choke point** every report passes through\n * before transport (spec 0003 §C; research `sentry-error-capture-findings.md`\n * §7.4) — the SDK's `beforeSend` equivalent, shared runtime-agnostically across\n * surfaces (ADR-0028).\n *\n * Masking is the SDK's job, done before anything leaves the process. The\n * screenshot is masked at capture, and breadcrumbs never record a value or a\n * body at the source; `runBeforeSend` is the **last** gate over the assembled\n * report. Its default scrubbers are **on**: they strip credentials, query\n * strings, and bearer tokens from URLs, and redact obvious PII (emails, long\n * digit runs, bearer tokens) from crumb and error text. The result is then handed\n * to an optional per-project hook that can mutate it further or drop the whole\n * report by returning `null`.\n *\n * The hook is **synchronous and network-free** by contract, and both manual\n * (overlay) and automatic (error-capture) reports run through the very same\n * choke point. A project relaxes the defaults with `scrub: false`, or reshapes\n * the draft in its own hook — never a silent raw send.\n */\n\nimport type { Breadcrumb, BreadcrumbData, ConsoleArg } from \"./breadcrumb\";\nimport type { ReportContent } from \"./wire\";\n\n/** The per-project client scrub hook. Return `null` to drop the whole report. */\nexport type BeforeSend = (draft: ReportContent) => ReportContent | null;\n\n/** Options for {@link runBeforeSend}. */\nexport interface BeforeSendOptions {\n /** The per-project hook, run **after** the default scrubbers. */\n readonly hook?: BeforeSend | null;\n /** Run the built-in default scrubbers first. Defaults to `true`. */\n readonly scrub?: boolean;\n}\n\n/** A digit run at least this long is treated as sensitive (phone, card, id). */\nconst MIN_DIGIT_RUN = 7;\nconst EMAIL_RE = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi;\nconst DIGIT_RUN_RE = new RegExp(`\\\\d{${MIN_DIGIT_RUN},}`, \"g\");\nconst BEARER_RE = /\\b(bearer|token)\\s+[\\w.\\-~+/]+=*/gi;\n/** An http(s) URL embedded in free text (e.g. a console log line). */\nconst URL_IN_TEXT_RE = /\\bhttps?:\\/\\/[^\\s\"'<>]+/gi;\n\n/**\n * Redact obvious PII from free text: email addresses, `Bearer <token>` /\n * `token <value>` pairs, and long digit runs. Conservative by design — it keeps\n * the shape of the message readable while removing the sensitive spans.\n */\nexport function redactPii(text: string): string {\n if (typeof text !== \"string\" || text.length === 0) return text;\n return text\n .replace(EMAIL_RE, \"[redacted-email]\")\n .replace(BEARER_RE, (_match, keyword: string) => `${keyword} [redacted]`)\n .replace(DIGIT_RUN_RE, \"[redacted-number]\");\n}\n\n/**\n * Redact PII from the **path** portion of a URL (spec #122 §E, ticket #139):\n * emails and long digit runs in path (or fragment-route) segments — a network\n * list shows URLs prominently, so an identifier baked into a path\n * (`/users/jane@acme.app`, `/card/4111111111111111`) must not leak. Deliberately\n * narrower than {@link redactPii}: no bearer/token rule (URL credentials are\n * already stripped by {@link scrubUrl}) and it is only ever applied to the\n * post-authority remainder, so a host or port with digits is never touched.\n */\nfunction redactPathPii(pathAndBeyond: string): string {\n return pathAndBeyond\n .replace(EMAIL_RE, \"[redacted-email]\")\n .replace(DIGIT_RUN_RE, \"[redacted-number]\");\n}\n\n/**\n * Strip the sensitive parts of a URL: userinfo credentials\n * (`scheme://user:pass@host`), the entire query string, a token-bearing\n * fragment (one that carries `key=value`), and PII (emails, long digit runs) in\n * the **path segments** (#139). Plain hash routes (`#/checkout`) are kept. Works\n * on absolute and relative URLs alike, with no dependency and no throw. The host\n * (authority) is never redacted — only the path and any surviving fragment route.\n */\nexport function scrubUrl(url: string): string {\n if (typeof url !== \"string\" || url.length === 0) return url;\n let out = url;\n // Drop userinfo credentials: scheme://user:pass@host → scheme://host\n out = out.replace(/(^[a-z][a-z0-9+.-]*:\\/\\/)[^/@?#]*@/i, \"$1\");\n // Drop the query string entirely (everything from '?' up to a '#').\n out = out.replace(/\\?[^#]*/, \"\");\n // Drop a token-bearing fragment (it carries '='); keep plain hash routes.\n out = out.replace(/#.*$/, (fragment) =>\n fragment.includes(\"=\") ? \"\" : fragment,\n );\n // Redact PII in the path (and any kept fragment route), never in the authority.\n // Split off `scheme://authority` (or a protocol-relative `//authority`) so a\n // host/port that contains digits is preserved; the remainder is the path onward.\n const absolute = out.match(/^([a-z][a-z0-9+.-]*:\\/\\/[^/?#]*)([\\s\\S]*)$/i);\n if (absolute) return absolute[1] + redactPathPii(absolute[2] ?? \"\");\n const protocolRelative = out.match(/^(\\/\\/[^/?#]*)([\\s\\S]*)$/);\n if (protocolRelative) {\n return protocolRelative[1] + redactPathPii(protocolRelative[2] ?? \"\");\n }\n // A relative URL is all path — redact the whole thing.\n return redactPathPii(out);\n}\n\ntype MutableBreadcrumbData = { -readonly [K in keyof BreadcrumbData]: BreadcrumbData[K] };\ntype MutableBreadcrumb = { -readonly [K in keyof Breadcrumb]: Breadcrumb[K] };\ntype MutableContent = { -readonly [K in keyof ReportContent]: ReportContent[K] };\n\nfunction scrubCrumbData(data: BreadcrumbData): BreadcrumbData {\n const next: MutableBreadcrumbData = { ...data };\n if (typeof next.url === \"string\") next.url = scrubUrl(next.url);\n if (typeof next.from === \"string\") next.from = scrubUrl(next.from);\n if (typeof next.to === \"string\") next.to = scrubUrl(next.to);\n return next;\n}\n\n/** Scrub a crumb's free-text message: strip URL query strings, then redact PII. */\nfunction scrubMessage(message: string): string {\n return redactPii(message.replace(URL_IN_TEXT_RE, (url) => scrubUrl(url)));\n}\n\n/**\n * Scrub the string leaves of a structured console-arg value (spec #122 §C/§E) — the\n * value a `json` arg carries. Walks arrays and plain objects, applying the same\n * URL-strip + PII redaction as a crumb message to every nested string, so a value\n * logged through `console.*` is swept just like the flattened preview.\n */\nfunction scrubArgValue(value: unknown): unknown {\n if (typeof value === \"string\") return scrubMessage(value);\n if (Array.isArray(value)) return value.map(scrubArgValue);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [key, v] of Object.entries(value as Record<string, unknown>)) {\n out[key] = scrubArgValue(v);\n }\n return out;\n }\n return value;\n}\n\n/**\n * Scrub one structured console argument (spec #122 §C): redact PII / strip URL query\n * strings from a `string` value, from every string leaf of a `json` value, and from an\n * `error` value's `message` and `stack`. Other tags (`number`/`bool`/`null`) carry no\n * free text and pass through unchanged.\n */\nfunction scrubConsoleArg(arg: ConsoleArg): ConsoleArg {\n switch (arg.t) {\n case \"string\":\n return typeof arg.v === \"string\" ? { t: \"string\", v: scrubMessage(arg.v) } : arg;\n case \"json\":\n return { t: \"json\", v: scrubArgValue(arg.v) };\n case \"error\": {\n if (!arg.v || typeof arg.v !== \"object\") return arg;\n const v = arg.v as { message?: unknown; stack?: unknown };\n const next: Record<string, unknown> = { ...v };\n if (typeof next.message === \"string\") next.message = scrubMessage(next.message);\n if (typeof next.stack === \"string\") next.stack = scrubMessage(next.stack);\n return { t: \"error\", v: next };\n }\n default:\n return arg;\n }\n}\n\nfunction scrubCrumb(crumb: Breadcrumb): Breadcrumb {\n const next: MutableBreadcrumb = { ...crumb };\n if (typeof next.message === \"string\") next.message = scrubMessage(next.message);\n if (next.data) next.data = scrubCrumbData(next.data);\n // A rich network crumb (#139) carries its scrubbed URL at the top level — sweep it\n // again here (idempotent) so the choke point holds whether the URL rode in `data`\n // (a legacy thin crumb) or top-level, and path-PII redaction is never skipped.\n if (typeof next.url === \"string\") next.url = scrubUrl(next.url);\n // A console crumb's structured args carry the same free text as its preview — sweep\n // them too, so PII redaction holds whether a value is read from `message` or `args`.\n if (Array.isArray(next.args)) next.args = next.args.map(scrubConsoleArg);\n return next;\n}\n\n/**\n * Apply the built-in default scrubbers to a report draft: strip the page URL,\n * and scrub every crumb's URLs and redact PII from its text. The Reporter's own\n * `comment` is intentionally left untouched — it is authored on purpose, not\n * scraped. The screenshot and input values are masked elsewhere (at capture and\n * at crumb creation); this is the final URL/PII sweep.\n */\nexport function applyDefaultScrub(draft: ReportContent): ReportContent {\n const next: MutableContent = { ...draft };\n if (typeof next.url === \"string\") next.url = scrubUrl(next.url);\n if (next.trace && next.trace.length > 0) {\n next.trace = next.trace.map(scrubCrumb);\n }\n // The structured stack frames (#117) carry script URLs — sweep them again here\n // (idempotent, like the crumb URLs) so the choke point holds regardless of\n // where the frames were parsed.\n if (next.errorFrames && next.errorFrames.length > 0) {\n next.errorFrames = next.errorFrames.map((frame) => ({\n ...frame,\n file: scrubUrl(frame.file),\n }));\n }\n return next;\n}\n\n/**\n * Run the report draft through the client scrub choke point: the default\n * scrubbers first (unless `scrub` is `false`), then the optional per-project\n * hook. Returns the scrubbed (and possibly hook-mutated) draft, or `null` when\n * the hook drops the report. A hook that throws is treated as a no-op — the\n * already-scrubbed draft is kept, so a buggy hook never breaks the report path\n * nor leaks unscrubbed data.\n */\nexport function runBeforeSend(\n draft: ReportContent,\n options: BeforeSendOptions = {},\n): ReportContent | null {\n const current =\n options.scrub === false ? draft : applyDefaultScrub(draft);\n const hook = options.hook;\n if (!hook) return current;\n try {\n const result = hook(current);\n return result ?? null;\n } catch {\n return current;\n }\n}\n","/**\n * Client-side backpressure for **automatic** error reports (spec 0003 §E/§H,\n * ticket #89) — the pure, runtime-agnostic backoff every SDK shares (ADR-0028).\n * When ingest sheds `source: error` load it answers `429` with a `Retry-After`;\n * the SDK honours it by holding a pause window during which further automatic\n * reports are dropped without touching the network. **Manual** reports — a human\n * clicking Send — never consult this gate.\n *\n * This is the transport's counterpart to the server's per-Project token bucket\n * (`apps/api/src/ingest/auto-report-rate-limiter.ts`): one shared window per page,\n * so a 429 from one auto-report shed applies to the auto-reports that follow it.\n * The clock is injectable so the window is unit-tested deterministically, never on\n * wall time — mirroring the server limiter's `Clock`.\n */\n\n/** A source of the current time in epoch milliseconds — injectable for tests. */\nexport type Clock = () => number;\n\n/** The hold window applied when a `429` carries no usable `Retry-After` (spec §E). */\nexport const DEFAULT_RETRY_AFTER_SECONDS = 60;\n\n/**\n * Parse a `Retry-After` header into whole seconds to hold for. Handles both HTTP\n * forms — a delta-seconds integer and an HTTP-date (measured from `now`, rounded up\n * and clamped at zero) — and falls back to {@link DEFAULT_RETRY_AFTER_SECONDS} when\n * the header is absent, blank, or unparseable. Ingest sends the delta-seconds form;\n * the date form is handled for spec-completeness.\n */\nexport function parseRetryAfter(\n header: string | null | undefined,\n now: number,\n): number {\n if (header == null) return DEFAULT_RETRY_AFTER_SECONDS;\n const value = header.trim();\n if (value === \"\") return DEFAULT_RETRY_AFTER_SECONDS;\n\n if (/^\\d+$/.test(value)) {\n return Number(value);\n }\n\n const when = Date.parse(value);\n if (!Number.isNaN(when)) {\n return Math.max(0, Math.ceil((when - now) / 1000));\n }\n\n return DEFAULT_RETRY_AFTER_SECONDS;\n}\n\n/**\n * A single pause window for automatic (`source: error`) reports. `hold` opens (or\n * extends) it from a `429`'s `Retry-After`; `isPaused` reports whether it is still\n * open. The default instance in the SDK's transport is shared across a page's\n * reports so the hold persists across successive automatic submissions.\n */\nexport class AutoReportBackoff {\n /** Epoch ms until which automatic reports are held; `0` when clear. */\n private pausedUntil = 0;\n\n constructor(private readonly now: Clock = Date.now) {}\n\n /** Is the automatic-report pause window currently open? */\n isPaused(): boolean {\n return this.now() < this.pausedUntil;\n }\n\n /** Whole seconds remaining in the pause window (`0` when clear). */\n retryAfterSeconds(): number {\n return Math.max(0, Math.ceil((this.pausedUntil - this.now()) / 1000));\n }\n\n /**\n * Open (or extend) the window from a `429`'s `Retry-After` value, returning the\n * seconds it will hold for. The window only ever grows — a shorter later hold\n * never clips a longer one already in effect.\n */\n hold(retryAfterHeader: string | null | undefined): number {\n const now = this.now();\n const seconds = parseRetryAfter(retryAfterHeader, now);\n const until = now + seconds * 1000;\n if (until > this.pausedUntil) this.pausedUntil = until;\n return seconds;\n }\n}\n","/**\n * Small DOM helpers shared across the SDK's report surfaces.\n *\n * The SDK mounts its own host elements into the host page — the launcher and the\n * overlay panel — each tagged with a `data-fixback-*` marker attribute (the\n * element-picker's highlight lives inside the overlay's shadow, so it is covered\n * by the shadow-boundary walk below). These helpers let the picker skip the SDK's\n * own UI and let the screenshot exclude it, so a report never captures or targets\n * Fixback's chrome.\n */\n\n/** Marker attributes on the SDK's own host elements in the light DOM. */\nexport const FIXBACK_HOST_MARKERS = [\n \"data-fixback-root\",\n \"data-fixback-overlay\",\n] as const;\n\nconst HOST_SELECTOR = FIXBACK_HOST_MARKERS.map((m) => `[${m}]`).join(\",\");\n\n/**\n * Is this node itself one of the SDK's own host elements (the launcher / overlay\n * roots)? A self-only check — the screenshot's clone walk excludes a node's whole\n * subtree once the host is matched, so catching the host is enough to keep all of\n * Fixback's chrome (light DOM and its shadow tree) out of a capture.\n */\nexport function isFixbackHostElement(node: Node | null | undefined): boolean {\n return (\n node instanceof Element &&\n FIXBACK_HOST_MARKERS.some((marker) => node.hasAttribute(marker))\n );\n}\n\n/**\n * Is this node part of the SDK's own UI? Walks up parents and out through any\n * Shadow DOM boundary (via `getRootNode().host`), so a click inside the overlay's\n * shadow is recognised as Fixback's own — not a host-page element to pick.\n */\nexport function isFixbackNode(node: EventTarget | null | undefined): boolean {\n let current: Node | null = node instanceof Node ? node : null;\n while (current) {\n if (current instanceof Element) {\n for (const marker of FIXBACK_HOST_MARKERS) {\n if (current.hasAttribute(marker)) return true;\n }\n }\n const root = current.getRootNode();\n if (root instanceof ShadowRoot && root !== current) {\n current = root.host;\n continue;\n }\n current = current.parentNode;\n }\n return false;\n}\n\n/**\n * Remove the SDK's own host elements from a (cloned) subtree, so a captured\n * screenshot never contains the launcher, overlay, or picker highlight.\n */\nexport function stripFixbackNodes(root: ParentNode): void {\n for (const el of Array.from(root.querySelectorAll(HOST_SELECTOR))) {\n el.remove();\n }\n}\n","import { isFixbackNode } from \"./dom\";\nimport type { ElementRect, SelectedElement } from \"./report\";\n\n/**\n * Escape a string for use in a CSS selector, preferring the platform's\n * `CSS.escape` and falling back to a conservative backslash escape where it is\n * unavailable (older engines, some test environments).\n */\nfunction cssEscape(value: string): string {\n const api = (globalThis as { CSS?: { escape?: (v: string) => string } }).CSS;\n if (api?.escape) return api.escape(value);\n return value.replace(/[^\\w-]/g, (ch) => `\\\\${ch}`);\n}\n\n/** The 1-based position of `el` among its same-tag siblings (`:nth-of-type`). */\nfunction nthOfType(el: Element): number {\n let n = 1;\n let sib = el.previousElementSibling;\n while (sib) {\n if (sib.tagName === el.tagName) n += 1;\n sib = sib.previousElementSibling;\n }\n return n;\n}\n\n/**\n * A stable CSS selector for `el`: its own id when it has one, otherwise a path of\n * tag (with `:nth-of-type` to disambiguate same-tag siblings) climbing until it\n * reaches an ancestor with an id — the shortest anchor that still resolves.\n */\nexport function cssSelectorFor(el: Element): string {\n if (el.id) return `#${cssEscape(el.id)}`;\n\n const parts: string[] = [];\n let node: Element | null = el;\n while (node && node.tagName.toLowerCase() !== \"html\") {\n if (node.id) {\n parts.unshift(`#${cssEscape(node.id)}`);\n break;\n }\n const tag = node.tagName.toLowerCase();\n const parent: Element | null = node.parentElement;\n if (parent) {\n const sameTag = Array.from(parent.children).filter(\n (c) => c.tagName === node!.tagName,\n );\n parts.unshift(\n sameTag.length > 1 ? `${tag}:nth-of-type(${nthOfType(node)})` : tag,\n );\n } else {\n parts.unshift(tag);\n }\n node = parent;\n }\n return parts.join(\" > \");\n}\n\n/** One node's readable label: `tag`, `tag#id`, or `tag.firstClass`. */\nfunction describeNode(el: Element): string {\n const tag = el.tagName.toLowerCase();\n if (el.id) return `${tag}#${el.id}`;\n const firstClass = el.classList[0];\n return firstClass ? `${tag}.${firstClass}` : tag;\n}\n\n/** A readable ancestry path from the document root down to `el`. */\nexport function domPathFor(el: Element): string {\n const chain: string[] = [];\n let node: Element | null = el;\n while (node) {\n chain.unshift(describeNode(node));\n node = node.parentElement;\n }\n return chain.join(\" > \");\n}\n\nfunction roundedRect(el: Element): ElementRect {\n const r = el.getBoundingClientRect();\n return {\n x: Math.round(r.x),\n y: Math.round(r.y),\n width: Math.round(r.width),\n height: Math.round(r.height),\n };\n}\n\n/**\n * Describe a picked element as the Annotation ingest stores: a stable selector, a\n * readable DOM path, the tag, and the viewport bounding rect (spec MVP §B).\n */\nexport function describeElement(el: Element): SelectedElement {\n return {\n selector: cssSelectorFor(el),\n domPath: domPathFor(el),\n tag: el.tagName.toLowerCase(),\n rect: roundedRect(el),\n };\n}\n\n/** Options for {@link startElementPicker}. */\nexport interface ElementPickerOptions {\n /** Document to attach to. Defaults to the global `document`. */\n readonly doc?: Document;\n /** Called with the element being hovered (or `null` over nothing pickable). */\n readonly onHover?: (element: Element | null) => void;\n /** Called with the element the Reporter clicked to pin. */\n readonly onPick: (element: Element) => void;\n /** Called when the Reporter presses Escape to abandon the pick. */\n readonly onCancel?: () => void;\n /** Return true to skip a node (defaults to skipping the SDK's own UI). */\n readonly ignore?: (element: Element) => boolean;\n}\n\n/** A running element-picker; call {@link ElementPicker.stop} to detach it. */\nexport interface ElementPicker {\n stop(): void;\n}\n\n/**\n * Enter element-select mode: as the Reporter moves over the host page the element\n * under the pointer is reported through `onHover` (the overlay draws a highlight),\n * a click pins it through `onPick`, and Escape abandons through `onCancel`. The\n * click that pins is swallowed (prevent-default + stop-propagation) so it never\n * also activates the host page. The SDK's own UI is skipped by default, so the\n * Reporter can never pick the overlay itself.\n *\n * Listeners are attached in the capture phase so the pick is intercepted before\n * any host-page handler sees it; `stop()` (called automatically on pick/cancel)\n * detaches them all.\n */\nexport function startElementPicker(options: ElementPickerOptions): ElementPicker {\n const doc = options.doc ?? document;\n const ignore = options.ignore ?? isFixbackNode;\n let current: Element | null = null;\n let stopped = false;\n\n function resolveTarget(event: Event): Element | null {\n const path =\n typeof event.composedPath === \"function\" ? event.composedPath() : [];\n const deepest = path[0] ?? event.target;\n if (deepest instanceof Element) return ignore(deepest) ? null : deepest;\n return null;\n }\n\n function onOver(event: Event): void {\n if (stopped) return;\n current = resolveTarget(event);\n options.onHover?.(current);\n }\n\n function onClick(event: MouseEvent): void {\n if (stopped) return;\n const el = resolveTarget(event) ?? current;\n if (!el) return; // nothing pickable under the pointer — let the click pass\n event.preventDefault();\n event.stopPropagation();\n stop();\n options.onPick(el);\n }\n\n function onKey(event: KeyboardEvent): void {\n if (stopped) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n stop();\n options.onCancel?.();\n }\n }\n\n function stop(): void {\n if (stopped) return;\n stopped = true;\n doc.removeEventListener(\"mouseover\", onOver, true);\n doc.removeEventListener(\"click\", onClick, true);\n doc.removeEventListener(\"keydown\", onKey, true);\n current = null;\n }\n\n doc.addEventListener(\"mouseover\", onOver, true);\n doc.addEventListener(\"click\", onClick, true);\n doc.addEventListener(\"keydown\", onKey, true);\n\n return { stop };\n}\n","/**\n * The thin trace **breadcrumb ring buffer** and its capture instrumentation\n * (spec 0003 §C; research `sentry-error-capture-findings.md` §7.5).\n *\n * A fixed-size FIFO buffer of the most recent activity — console, navigation,\n * network metadata, masked user actions, and the failing error — that rides on a\n * report as Evidence. It is trimmed exactly like Sentry (`crumbs.slice(-N)`),\n * defaults to a deliberately thin `N ≈ 30` because it ships on **every** payload,\n * and takes an optional age cap. A `beforeBreadcrumb(crumb) => crumb | null`\n * filter lets a Project mute or edit crumbs before they enter the buffer.\n *\n * Everything private is kept out **at the source**: `ui.input` records that an\n * input changed, never its value; `fetch`/`xhr` crumbs carry method + URL +\n * status only, **never** bodies; URLs are scrubbed as the crumb is built. The\n * `beforeSend` choke point (`scrub.ts`) is the final gate over the whole report.\n *\n * The SDK stays dependency-free and must never throw into the host page, so every\n * instrumentation hook is wrapped: a capture failure is swallowed and the original\n * behaviour (the real `console`, `fetch`, navigation) always runs.\n */\n\nimport {\n type Breadcrumb,\n type BreadcrumbCategory,\n type BreadcrumbData,\n type BreadcrumbLevel,\n type ConsoleArg,\n type ConsoleArgType,\n type NetworkApi,\n type NetworkOutcome,\n scrubUrl,\n type SourceLocation,\n} from \"@fixback/sdk-core\";\n\nimport { isFixbackNode } from \"./dom\";\nimport { cssSelectorFor } from \"./element-picker\";\n\n// The trace breadcrumb wire types are owned by the core (ADR-0028); re-export them\n// so `./breadcrumbs` stays the SDK's import path for them. The ring buffer and the\n// DOM instrumentation that produce them live in this module.\nexport type {\n Breadcrumb,\n BreadcrumbCategory,\n BreadcrumbData,\n BreadcrumbLevel,\n ConsoleArg,\n ConsoleArgType,\n NetworkApi,\n NetworkOutcome,\n SourceLocation,\n};\n\n/**\n * The three independent trace streams (spec #122 §A, decision D6). Each is its own\n * FIFO ring with its own size budget, so a chatty stream can't evict another's\n * lead-up. Every {@link BreadcrumbCategory} maps to exactly one stream via\n * {@link streamOf}.\n */\nexport type TraceStream = \"network\" | \"console\" | \"breadcrumbs\";\n\n/**\n * Per-stream ring budgets — starting points from the grill (D6): network is the\n * chattiest, breadcrumbs the sparsest. Per-project tunable, never frozen.\n */\nexport const DEFAULT_STREAM_BUDGETS: Readonly<Record<TraceStream, number>> = {\n network: 100,\n console: 80,\n breadcrumbs: 40,\n};\n\n/**\n * The shared age cap (spec #122 §A): entries older than this are pruned from every\n * stream, whichever trims first. ~3 minutes and — unlike the thin buffer's\n * off-by-default cap — **on** by default, so an idle tab never ships stale context.\n */\nexport const DEFAULT_MAX_AGE_MS = 3 * 60 * 1000;\n\n/**\n * Console levels captured by default (spec #122 §C, decision D7): **all** of them, so\n * the Console tab is a real console and not just an error log. Eviction priority (not\n * capture) is what keeps a chatty app's `log`/`info`/`debug` from burying the signal —\n * see {@link PINNED_CONSOLE_LEVELS}.\n */\nexport const DEFAULT_CONSOLE_LEVELS: readonly BreadcrumbLevel[] = [\n \"log\",\n \"info\",\n \"warn\",\n \"error\",\n \"assert\",\n \"debug\",\n];\n\n/**\n * The console levels **pinned** against eviction (spec #122 §C, decision D7). When the\n * console stream overflows its budget, `warn`/`error`/`assert` are retained ahead of\n * `log`/`info`/`debug`, so an error is never evicted by a burst of chatter — the\n * low-priority levels fill the remainder and are dropped first.\n */\nexport const PINNED_CONSOLE_LEVELS: readonly BreadcrumbLevel[] = [\n \"warn\",\n \"error\",\n \"assert\",\n];\n\n/** Whether a console level is pinned against eviction (see {@link PINNED_CONSOLE_LEVELS}). */\nfunction isPinnedConsoleLevel(level: BreadcrumbLevel | undefined): boolean {\n return level !== undefined && PINNED_CONSOLE_LEVELS.includes(level);\n}\n\n/**\n * The console levels for which `source` (`file:line`) is captured (ticket #159).\n *\n * Capturing a call site constructs a `new Error()` to read its stack on **every** console\n * call — a measurable hot-page cost when a chatty app logs in a tight loop (spec #122's\n * \"hot-page performance budget\" open question, handed onward from the grill). The\n * spec-sanctioned mitigation (decision D7) narrows source capture to the **levels that\n * matter for debugging** — the same `warn`/`error`/`assert` that are pinned against\n * eviction — so `log`/`info`/`debug` pay no per-call stack cost and simply omit `source`.\n * Full-fidelity `source` is preserved exactly where it earns its keep: on warnings,\n * errors, and failed assertions. Per-project tunability of this set is future work; today\n * it deliberately mirrors {@link PINNED_CONSOLE_LEVELS} so \"what survives eviction\" and\n * \"what carries a call site\" stay one idea.\n */\nexport const SOURCE_CAPTURE_LEVELS: readonly BreadcrumbLevel[] =\n PINNED_CONSOLE_LEVELS;\n\n/** Whether a console level captures `source` `file:line` (see {@link SOURCE_CAPTURE_LEVELS}). */\nfunction capturesSource(level: BreadcrumbLevel): boolean {\n return SOURCE_CAPTURE_LEVELS.includes(level);\n}\n\n/**\n * Which stream a crumb's category belongs to (spec #122 §A). Network APIs\n * (`fetch` / `xhr` / `beacon`) form the network stream, `console` its own, and\n * everything else (navigation, masked UI events, the failing error) breadcrumbs.\n */\nexport function streamOf(category: string): TraceStream {\n if (category === \"console\") return \"console\";\n if (category === \"fetch\" || category === \"xhr\" || category === \"beacon\") {\n return \"network\";\n }\n return \"breadcrumbs\";\n}\n\n/** Filters or edits each crumb before it enters the buffer; `null` drops it. */\nexport type BeforeBreadcrumb = (crumb: Breadcrumb) => Breadcrumb | null;\n\n/** Configuration for {@link createBreadcrumbBuffer}. All values are optional. */\nexport interface BreadcrumbBufferConfig {\n /**\n * Per-stream size budgets (oldest drop, independently per stream). Any stream\n * omitted falls back to {@link DEFAULT_STREAM_BUDGETS}.\n */\n readonly budgets?: Partial<Record<TraceStream, number>>;\n /**\n * Shared age cap in ms: entries older than this are dropped from every stream.\n * Defaults to {@link DEFAULT_MAX_AGE_MS} (on); pass `0` (or a non-positive value)\n * to disable age pruning.\n */\n readonly maxAgeMs?: number;\n /** A per-crumb filter (mute a category, edit, or drop by returning `null`). */\n readonly beforeBreadcrumb?: BeforeBreadcrumb | null;\n /** Epoch clock source, injectable for tests. Defaults to `Date.now`. */\n readonly now?: () => number;\n /** High-res monotonic clock, injectable for tests. Defaults to `performance.now`. */\n readonly mono?: () => number;\n /** Stable id generator, injectable for tests. Defaults to a per-buffer sequence. */\n readonly nextId?: () => string;\n}\n\n/** A live trace buffer. */\nexport interface BreadcrumbBuffer {\n /** Record a crumb (subject to `beforeBreadcrumb`, id/mono stamping, size, and age trimming). */\n add(crumb: Breadcrumb): void;\n /** The current crumbs, merged across streams and ordered in time — a fresh array. */\n snapshot(): Breadcrumb[];\n /** Drop every crumb. */\n clear(): void;\n}\n\nfunction normalizeBudget(value: number | undefined, fallback: number): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 1) {\n return fallback;\n }\n return Math.floor(value);\n}\n\n/** The default high-res clock: `performance.now()` where available, else `Date.now`. */\nfunction defaultMono(): number {\n return typeof performance !== \"undefined\" &&\n typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n\n/** A per-buffer id factory: a short random salt + a base-36 sequence, stable once assigned. */\nfunction createIdFactory(): () => string {\n const salt = Math.random().toString(36).slice(2, 8);\n let seq = 0;\n return () => `${salt}${(seq++).toString(36)}`;\n}\n\n/** The streams, in a fixed order for a deterministic merge. */\nconst STREAMS: readonly TraceStream[] = [\"network\", \"console\", \"breadcrumbs\"];\n\n/** One held entry, tagged with its insertion order for a stable cross-stream sort. */\ninterface HeldCrumb {\n readonly crumb: Breadcrumb;\n readonly seq: number;\n}\n\n/**\n * Trim the **console** stream to its budget with eviction priority (spec #122 §C,\n * decision D7): `warn`/`error`/`assert` are pinned, so the oldest `log`/`info`/`debug`\n * entries are dropped first; a pinned entry is evicted only when dropping every\n * low-priority one still leaves the stream over budget (oldest pinned first). Survivors\n * keep their insertion order. A plain FIFO `slice(-budget)` handles every other stream.\n */\nfunction trimConsoleStream(held: HeldCrumb[], budget: number): HeldCrumb[] {\n const over = held.length - budget;\n if (over <= 0) return held;\n const drop = new Set<number>();\n // First: oldest low-priority (not pinned) entries, until enough room is freed.\n for (let i = 0; i < held.length && drop.size < over; i += 1) {\n if (!isPinnedConsoleLevel(held[i]!.crumb.level)) drop.add(i);\n }\n // Then, only if the low-priority ones weren't enough: oldest pinned entries.\n for (let i = 0; i < held.length && drop.size < over; i += 1) {\n if (!drop.has(i)) drop.add(i);\n }\n return held.filter((_, i) => !drop.has(i));\n}\n\n/**\n * Create the per-stream trace buffer (spec #122 §A/§B). It holds **three\n * independent FIFO rings** — `network`, `console`, `breadcrumbs` — each trimmed to\n * its own budget so a chatty stream never evicts another's lead-up, plus a shared\n * age cap. On `add`, a crumb passes through `beforeBreadcrumb`, is stamped with a\n * stable `id` and a high-res `mono` timestamp (and an epoch `timestamp` if it has\n * none), routed to its stream, then that stream is pruned by age and trimmed to its\n * budget. `snapshot` prunes by age again, then merges the three streams into one\n * `mono`-ordered array for transport — so the wire keeps its single `trace` field.\n */\nexport function createBreadcrumbBuffer(\n config: BreadcrumbBufferConfig = {},\n): BreadcrumbBuffer {\n const budgets: Record<TraceStream, number> = {\n network: normalizeBudget(config.budgets?.network, DEFAULT_STREAM_BUDGETS.network),\n console: normalizeBudget(config.budgets?.console, DEFAULT_STREAM_BUDGETS.console),\n breadcrumbs: normalizeBudget(\n config.budgets?.breadcrumbs,\n DEFAULT_STREAM_BUDGETS.breadcrumbs,\n ),\n };\n const maxAgeMs =\n config.maxAgeMs === undefined ? DEFAULT_MAX_AGE_MS : config.maxAgeMs;\n const beforeBreadcrumb = config.beforeBreadcrumb;\n const now = config.now ?? Date.now;\n const mono = config.mono ?? defaultMono;\n const nextId = config.nextId ?? createIdFactory();\n\n const streams: Record<TraceStream, HeldCrumb[]> = {\n network: [],\n console: [],\n breadcrumbs: [],\n };\n let seq = 0;\n\n function pruneByAge(): void {\n if (typeof maxAgeMs !== \"number\" || maxAgeMs <= 0) return;\n const cutoff = now() - maxAgeMs;\n for (const stream of STREAMS) {\n const held = streams[stream];\n if (held.length > 0) {\n streams[stream] = held.filter((h) => h.crumb.timestamp >= cutoff);\n }\n }\n }\n\n return {\n add(crumb: Breadcrumb): void {\n let entry: Breadcrumb | null = crumb;\n if (beforeBreadcrumb) {\n try {\n entry = beforeBreadcrumb(crumb);\n } catch {\n // A throwing filter must never break capture; keep the (already\n // masked) crumb rather than silently erasing the trace.\n entry = crumb;\n }\n }\n if (!entry) return;\n // Stamp a stable id + high-res mono (and an epoch timestamp if absent) so\n // every entry orders and cross-links exactly, whatever stream it lands in.\n const stamped: Breadcrumb = {\n ...entry,\n id: entry.id ?? nextId(),\n timestamp: typeof entry.timestamp === \"number\" ? entry.timestamp : now(),\n mono: typeof entry.mono === \"number\" ? entry.mono : mono(),\n };\n const stream = streamOf(stamped.category);\n streams[stream].push({ crumb: stamped, seq: seq++ });\n // Age-prune every stream first (it may reassign the array), then trim this\n // stream to its own budget — a flood here never evicts another stream.\n pruneByAge();\n const held = streams[stream];\n const budget = budgets[stream];\n if (held.length > budget) {\n streams[stream] =\n stream === \"console\"\n ? trimConsoleStream(held, budget)\n : held.slice(-budget);\n }\n },\n snapshot(): Breadcrumb[] {\n pruneByAge();\n const merged: HeldCrumb[] = [];\n for (const stream of STREAMS) merged.push(...streams[stream]);\n // Order in time by the high-res mono clock (every entry has one), with the\n // insertion sequence as a stable tiebreak so equal clocks never scramble.\n merged.sort((a, b) => {\n const am =\n typeof a.crumb.mono === \"number\" ? a.crumb.mono : a.crumb.timestamp;\n const bm =\n typeof b.crumb.mono === \"number\" ? b.crumb.mono : b.crumb.timestamp;\n return am - bm || a.seq - b.seq;\n });\n return merged.map((h) => h.crumb);\n },\n clear(): void {\n streams.network = [];\n streams.console = [];\n streams.breadcrumbs = [];\n seq = 0;\n },\n };\n}\n\n// --- Pure crumb builders -----------------------------------------------------\n\n/** Longest crumb message kept; a huge log line is truncated, never dropped. */\nconst MAX_MESSAGE_LENGTH = 300;\n\n/**\n * Longest scrubbed URL kept on a crumb (spec #122 §F): capped at assembly so an\n * over-long URL is truncated, never dropped and never allowed to bloat a report.\n */\nexport const MAX_URL_LENGTH = 2048;\n\n/**\n * Structured console argument caps (spec #122 §C/§F), all applied **at assembly** so a\n * single console crumb can never bloat a report:\n * - {@link MAX_ARG_DEPTH} bounds how deep a `json` argument is cloned (deeper nodes\n * collapse to an `[Object]`/`[Array]` marker);\n * - {@link MAX_ARG_ITEMS} bounds how many keys/elements are kept at each level;\n * - {@link MAX_ARG_STRING_LENGTH} truncates a single over-long string value;\n * - {@link MAX_CONSOLE_ARGS_BYTES} bounds the serialized size of the whole args array\n * (trailing args are dropped to fit), kept well under ingest's per-entry byte cap.\n */\nexport const MAX_ARG_DEPTH = 4;\nexport const MAX_ARG_ITEMS = 100;\nexport const MAX_ARG_STRING_LENGTH = 1024;\nexport const MAX_CONSOLE_ARGS_BYTES = 4096;\n\n/** Longest Error `stack` kept on a structured `error` arg, truncated never dropped. */\nconst MAX_ERROR_STACK_LENGTH = 2048;\n\n/** Truncate a string to `max` with an ellipsis marker; keeps the value, never drops it. */\nfunction capLength(value: string, max: number): string {\n return value.length > max ? `${value.slice(0, max)}…` : value;\n}\n\nfunction stringifyArg(arg: unknown): string {\n if (typeof arg === \"string\") return arg;\n if (arg instanceof Error) return `${arg.name}: ${arg.message}`;\n if (arg === null || arg === undefined) return String(arg);\n if (typeof arg === \"number\" || typeof arg === \"boolean\") return String(arg);\n try {\n return JSON.stringify(arg) ?? String(arg);\n } catch {\n return \"[object]\";\n }\n}\n\nfunction joinArgs(args: readonly unknown[]): string {\n const text = args.map(stringifyArg).join(\" \");\n return text.length > MAX_MESSAGE_LENGTH\n ? `${text.slice(0, MAX_MESSAGE_LENGTH)}…`\n : text;\n}\n\n/** An Error rendered to a structured, size-capped `{ name, message, stack? }`. */\nfunction describeErrorValue(error: Error): {\n name: string;\n message: string;\n stack?: string;\n} {\n const out: { name: string; message: string; stack?: string } = {\n name: error.name || \"Error\",\n message: capLength(String(error.message ?? \"\"), MAX_ARG_STRING_LENGTH),\n };\n if (typeof error.stack === \"string\" && error.stack.length > 0) {\n out.stack = capLength(error.stack, MAX_ERROR_STACK_LENGTH);\n }\n return out;\n}\n\n/**\n * Build a JSON-safe, depth-/breadth-/string-capped clone of a value for a `json`\n * console argument. Beyond {@link MAX_ARG_DEPTH} the node collapses to a marker;\n * at each level at most {@link MAX_ARG_ITEMS} keys/elements are kept; strings are\n * truncated to {@link MAX_ARG_STRING_LENGTH}; circular references become\n * `\"[Circular]\"`; and exotic values (bigint / symbol / function / undefined) are\n * rendered to safe text — so the result is always serializable and bounded.\n */\nfunction safeCloneValue(\n value: unknown,\n depth: number,\n seen: Set<object>,\n): unknown {\n if (value === null) return null;\n const type = typeof value;\n if (type === \"string\") return capLength(value as string, MAX_ARG_STRING_LENGTH);\n if (type === \"number\") return Number.isFinite(value as number) ? value : String(value);\n if (type === \"boolean\") return value;\n if (type === \"bigint\") return `${(value as bigint).toString()}n`;\n if (type === \"symbol\") return (value as symbol).toString();\n if (type === \"function\") return \"[Function]\";\n if (type === \"undefined\") return null;\n const obj = value as object;\n if (value instanceof Error) {\n const { name, message } = describeErrorValue(value);\n return { name, message };\n }\n if (seen.has(obj)) return \"[Circular]\";\n if (depth <= 0) return Array.isArray(value) ? \"[Array]\" : \"[Object]\";\n seen.add(obj);\n try {\n if (Array.isArray(value)) {\n const items = value\n .slice(0, MAX_ARG_ITEMS)\n .map((item) => safeCloneValue(item, depth - 1, seen));\n if (value.length > MAX_ARG_ITEMS) {\n items.push(`… ${value.length - MAX_ARG_ITEMS} more`);\n }\n return items;\n }\n const source = value as Record<string, unknown>;\n const keys = Object.keys(source);\n const out: Record<string, unknown> = {};\n for (const key of keys.slice(0, MAX_ARG_ITEMS)) {\n const child = source[key];\n // Undefined / function values JSON drops anyway — omit them for a clean clone.\n if (typeof child === \"undefined\" || typeof child === \"function\") continue;\n out[key] = safeCloneValue(child, depth - 1, seen);\n }\n if (keys.length > MAX_ARG_ITEMS) out[\"…\"] = `${keys.length - MAX_ARG_ITEMS} more`;\n return out;\n } finally {\n seen.delete(obj);\n }\n}\n\n/** Classify one console argument into a type-tagged {@link ConsoleArg} (spec #122 §C). */\nexport function toConsoleArg(value: unknown): ConsoleArg {\n if (value === null || value === undefined) return { t: \"null\", v: null };\n const type = typeof value;\n if (type === \"string\") {\n return { t: \"string\", v: capLength(value as string, MAX_ARG_STRING_LENGTH) };\n }\n if (type === \"number\") {\n return Number.isFinite(value as number)\n ? { t: \"number\", v: value }\n : { t: \"string\", v: String(value) };\n }\n if (type === \"boolean\") return { t: \"bool\", v: value };\n if (type === \"bigint\") return { t: \"string\", v: `${(value as bigint).toString()}n` };\n if (type === \"symbol\") return { t: \"string\", v: (value as symbol).toString() };\n if (type === \"function\") return { t: \"string\", v: \"[Function]\" };\n if (value instanceof Error) return { t: \"error\", v: describeErrorValue(value) };\n return { t: \"json\", v: safeCloneValue(value, MAX_ARG_DEPTH, new Set()) };\n}\n\n/** The serialized UTF-8 byte length of a value; `Infinity` when it cannot serialize. */\nfunction serializedBytes(value: unknown): number {\n try {\n const json = JSON.stringify(value) ?? \"\";\n return typeof TextEncoder !== \"undefined\"\n ? new TextEncoder().encode(json).length\n : json.length;\n } catch {\n return Number.POSITIVE_INFINITY;\n }\n}\n\n/**\n * Cap an entry's structured args to {@link MAX_CONSOLE_ARGS_BYTES} (spec #122 §F):\n * drop trailing args until the array fits, keeping the earliest (usually the format\n * string / main message); if even a single arg is over budget, keep one honest\n * placeholder rather than an unbounded value. Per-arg depth/breadth/string caps bound\n * most cases already — this is the whole-entry backstop.\n */\nfunction capConsoleArgs(args: ConsoleArg[]): ConsoleArg[] {\n if (serializedBytes(args) <= MAX_CONSOLE_ARGS_BYTES) return args;\n let out = args.slice();\n while (out.length > 1 && serializedBytes(out) > MAX_CONSOLE_ARGS_BYTES) {\n out = out.slice(0, -1);\n }\n if (out.length === 1 && serializedBytes(out) > MAX_CONSOLE_ARGS_BYTES) {\n return [{ t: \"string\", v: \"[trace: console argument omitted (too large)]\" }];\n }\n return out;\n}\n\n/**\n * A `console` crumb from a captured call's level and arguments (spec #122 §C). The\n * `message` is the one-line preview (flattened, truncated); `args` preserves each\n * argument as a structured, type-tagged, size-capped value so the Console tab can\n * render objects/errors expandably; `source` is the best-effort `file:line`, attached\n * only when the stack yielded one. Args are omitted entirely for a no-argument call.\n */\nexport function consoleCrumb(\n level: BreadcrumbLevel,\n args: readonly unknown[],\n timestamp: number,\n source?: SourceLocation,\n): Breadcrumb {\n const structured = capConsoleArgs(args.map(toConsoleArg));\n const crumb: Breadcrumb = {\n category: \"console\",\n level,\n message: joinArgs(args),\n timestamp,\n ...(structured.length > 0 ? { args: structured } : {}),\n ...(source ? { source } : {}),\n };\n return crumb;\n}\n\n/** A `navigation` crumb; both URLs are scrubbed and length-capped as the crumb is built. */\nexport function navigationCrumb(\n from: string,\n to: string,\n timestamp: number,\n): Breadcrumb {\n const fromUrl = capLength(scrubUrl(from), MAX_URL_LENGTH);\n const toUrl = capLength(scrubUrl(to), MAX_URL_LENGTH);\n return {\n category: \"navigation\",\n message: `${fromUrl} → ${toUrl}`,\n timestamp,\n data: { from: fromUrl, to: toUrl },\n };\n}\n\n/**\n * Classify an HTTP status into a {@link NetworkOutcome} (spec #122 §D). A missing or\n * `0` status is a `network-error` (a request that never got a response); otherwise\n * the 4xx/5xx classes flag failures and everything else is `ok`. Used both as the\n * fallback outcome and by the thin {@link fetchCrumb} / {@link xhrCrumb} builders.\n */\nexport function outcomeFromStatus(status: number | undefined): NetworkOutcome {\n if (typeof status !== \"number\" || status <= 0) return \"network-error\";\n if (status >= 500) return \"http-5xx\";\n if (status >= 400) return \"http-4xx\";\n return \"ok\";\n}\n\n/**\n * The trivially-known byte size of a request body (spec #122 §D) — a string's UTF-8\n * length, a `Blob`'s `.size`, or an `ArrayBuffer`/typed-array `.byteLength`. Anything\n * that would require **reading** the body (a `ReadableStream`, `FormData`, a `Request`\n * with a stream body) returns `undefined` — the \"never read the body\" line holds.\n */\nexport function trivialBodySize(body: unknown): number | undefined {\n if (typeof body === \"string\") return utf8ByteLength(body);\n if (typeof Blob !== \"undefined\" && body instanceof Blob) return body.size;\n if (typeof ArrayBuffer !== \"undefined\") {\n if (body instanceof ArrayBuffer) return body.byteLength;\n if (ArrayBuffer.isView(body)) return (body as ArrayBufferView).byteLength;\n }\n return undefined;\n}\n\nfunction utf8ByteLength(value: string): number {\n try {\n return typeof TextEncoder !== \"undefined\"\n ? new TextEncoder().encode(value).length\n : value.length;\n } catch {\n return value.length;\n }\n}\n\n/** Parse a `content-length` header into a non-negative byte count, or `undefined`. */\nexport function parseContentLength(value: string | null | undefined): number | undefined {\n if (typeof value !== \"string\") return undefined;\n const bytes = Number.parseInt(value, 10);\n return Number.isFinite(bytes) && bytes >= 0 ? bytes : undefined;\n}\n\n/** The media type from a `content-type` header (the part before any `;` parameters). */\nexport function contentTypeOf(value: string | null | undefined): string | undefined {\n if (typeof value !== \"string\" || value.length === 0) return undefined;\n const media = value.split(\";\")[0]?.trim();\n return media && media.length > 0 ? media : undefined;\n}\n\n/** The rich metadata a network crumb records (spec #122 §D) — never a body or header. */\nexport interface NetworkCrumbInput {\n readonly api: NetworkApi;\n readonly method: string;\n /** The raw request URL — scrubbed (query dropped, path PII redacted) as the crumb is built. */\n readonly url: string;\n readonly status?: number;\n readonly statusText?: string;\n readonly durationMs?: number;\n readonly reqSize?: number;\n readonly respSize?: number;\n readonly contentType?: string;\n readonly outcome: NetworkOutcome;\n}\n\n/**\n * A network crumb (`fetch` / `xhr` / `beacon`) with the rich, metadata-only fields\n * the Network tab renders (spec #122 §D, ticket #139): api, method, scrubbed URL,\n * status + statusText, duration, request/response sizes, content type, and a failure\n * outcome. The URL is scrubbed and length-capped at assembly. The shape has **no field\n * for a request/response body or an arbitrary header**, so neither can ever be\n * recorded; only a positive status, and fields that were actually supplied, ride along.\n */\nexport function networkCrumb(input: NetworkCrumbInput, timestamp: number): Breadcrumb {\n const url = capLength(scrubUrl(input.url), MAX_URL_LENGTH);\n const hasStatus = typeof input.status === \"number\" && input.status > 0;\n const statusPart = hasStatus ? ` → ${input.status}` : \"\";\n const outcomePart = input.outcome !== \"ok\" ? ` (${input.outcome})` : \"\";\n return {\n category: input.api,\n api: input.api,\n method: input.method,\n url,\n message: `${input.method} ${url}${statusPart}${outcomePart}`,\n timestamp,\n ...(hasStatus ? { status: input.status } : {}),\n ...(input.statusText ? { statusText: input.statusText } : {}),\n ...(typeof input.durationMs === \"number\" ? { durationMs: input.durationMs } : {}),\n ...(typeof input.reqSize === \"number\" ? { reqSize: input.reqSize } : {}),\n ...(typeof input.respSize === \"number\" ? { respSize: input.respSize } : {}),\n ...(input.contentType ? { contentType: input.contentType } : {}),\n outcome: input.outcome,\n };\n}\n\n/**\n * A thin `fetch` crumb from method + URL + status (outcome derived from the status).\n * The instrumentation uses {@link networkCrumb} directly to carry the full metadata;\n * this convenience builder seeds a network crumb from a status alone.\n */\nexport function fetchCrumb(\n method: string,\n url: string,\n status: number | undefined,\n timestamp: number,\n): Breadcrumb {\n return networkCrumb(\n { api: \"fetch\", method, url, status, outcome: outcomeFromStatus(status) },\n timestamp,\n );\n}\n\n/** A thin `xhr` crumb from method + URL + status (outcome derived from the status). */\nexport function xhrCrumb(\n method: string,\n url: string,\n status: number | undefined,\n timestamp: number,\n): Breadcrumb {\n return networkCrumb(\n { api: \"xhr\", method, url, status, outcome: outcomeFromStatus(status) },\n timestamp,\n );\n}\n\nfunction safeSelector(target: Element): string {\n try {\n return cssSelectorFor(target);\n } catch {\n return target.tagName ? target.tagName.toLowerCase() : \"unknown\";\n }\n}\n\n/** A `ui.click` crumb: a masked target selector only — no text or value. */\nexport function clickCrumb(target: Element, timestamp: number): Breadcrumb {\n const selector = safeSelector(target);\n return {\n category: \"ui.click\",\n message: `click ${selector}`,\n timestamp,\n data: { target: selector },\n };\n}\n\n/**\n * A `ui.input` crumb: records **that** an input changed and which field, never\n * the value typed into it. The `target` element's `.value` is never read.\n */\nexport function inputCrumb(target: Element, timestamp: number): Breadcrumb {\n const selector = safeSelector(target);\n return {\n category: \"ui.input\",\n message: `input ${selector}`,\n timestamp,\n data: { target: selector },\n };\n}\n\nfunction describeError(error: unknown): { name: string; message: string } {\n if (error instanceof Error) {\n return { name: error.name || \"Error\", message: error.message };\n }\n if (typeof error === \"string\") return { name: \"Error\", message: error };\n return { name: \"Error\", message: stringifyArg(error) };\n}\n\n/**\n * An `error` crumb for the failing exception or rejection that ends the trace. When\n * `causedBy` is given (an auto-captured error), it rides on the crumb as the causal\n * pointer to the ids of the entries immediately preceding the throw (spec #122 §F).\n */\nexport function errorCrumb(\n error: unknown,\n timestamp: number,\n causedBy?: readonly string[],\n): Breadcrumb {\n const { name, message } = describeError(error);\n const crumb: Breadcrumb = {\n category: \"error\",\n level: \"error\",\n message: message ? `${name}: ${message}` : name,\n timestamp,\n data: { errorType: name },\n };\n return causedBy && causedBy.length > 0 ? { ...crumb, causedBy } : crumb;\n}\n\n// --- Instrumentation ---------------------------------------------------------\n\n/** Detaches an installed instrumentation, restoring the original behaviour. */\nexport type Teardown = () => void;\n\ntype AnyFn = (...args: unknown[]) => unknown;\ntype ConsoleLike = Partial<Record<BreadcrumbLevel, AnyFn>>;\ntype FetchFn = (\n input: string | URL | Request,\n init?: RequestInit,\n) => Promise<Response>;\n\ninterface HistoryLike {\n pushState(data: unknown, unused: string, url?: string | URL | null): void;\n replaceState(data: unknown, unused: string, url?: string | URL | null): void;\n}\n\ninterface XhrInstance {\n status: number;\n statusText?: string;\n open(method: string, url: string | URL, ...rest: unknown[]): void;\n send(body?: unknown): void;\n getResponseHeader?(name: string): string | null;\n addEventListener(type: string, listener: () => void): void;\n removeEventListener(type: string, listener: () => void): void;\n}\ninterface XhrConstructor {\n new (): XhrInstance;\n prototype: XhrInstance;\n}\n\n/** The `navigator.sendBeacon` surface the beacon instrumentation wraps. */\nexport interface BeaconNavigator {\n sendBeacon?: (url: string | URL, data?: BodyInit | null) => boolean;\n}\n\n/** The structural window surface the instrumentation reaches into. */\nexport interface InstrumentWindow {\n fetch?: FetchFn;\n history?: HistoryLike;\n location?: { href: string };\n XMLHttpRequest?: XhrConstructor;\n navigator?: BeaconNavigator;\n addEventListener(\n type: string,\n listener: (event: Event) => void,\n options?: boolean | AddEventListenerOptions,\n ): void;\n removeEventListener(\n type: string,\n listener: (event: Event) => void,\n options?: boolean | EventListenerOptions,\n ): void;\n}\n\n/** Options for {@link instrumentBreadcrumbs} and the individual installers. */\nexport interface InstrumentOptions {\n readonly win?: InstrumentWindow;\n readonly doc?: Document;\n readonly consoleObj?: ConsoleLike;\n readonly consoleLevels?: readonly BreadcrumbLevel[];\n /** Skip URLs (e.g. the SDK's own ingest calls) so they never become crumbs. */\n readonly ignoreUrl?: (url: string) => boolean;\n readonly now?: () => number;\n /**\n * High-res monotonic clock (spec #122 §D) — used to measure a request's duration as\n * a delta around the wrapped call. Defaults to `performance.now`; injectable for tests.\n */\n readonly mono?: () => number;\n /**\n * Whether to instrument the **console** stream (spec #122 §L; ticket #138).\n * Defaults to `true`; pass `false` and `console` is never wrapped, so no console\n * entry is ever recorded — the per-project toggle stops the stream at its source.\n */\n readonly captureConsole?: boolean;\n /**\n * Whether to instrument the **network** stream — `fetch` and `XHR` (spec #122 §L;\n * ticket #138). Defaults to `true`; pass `false` and neither is wrapped, so no\n * network entry is ever recorded. Navigation and masked UI events are unaffected.\n */\n readonly captureNetwork?: boolean;\n}\n\nfunction noop(): void {\n /* nothing installed */\n}\n\n/**\n * Parse a single stack line into a `{ file, line }` location, or `undefined`. Handles\n * V8 (`at fn (file:line:col)` / `at file:line:col`) and Firefox/Safari (`fn@file:line:col`)\n * frames; a query string on the asset URL is dropped (a cache-buster, or defensively a\n * token) both for parse safety and privacy.\n */\nfunction parseStackFrame(line: string): SourceLocation | undefined {\n let loc: string | undefined;\n const v8Named = line.match(/^at\\s+.+?\\s+\\((.+)\\)$/);\n if (v8Named) {\n loc = v8Named[1];\n } else {\n const v8Bare = line.match(/^at\\s+(.+)$/);\n if (v8Bare) {\n loc = v8Bare[1];\n } else {\n const at = line.indexOf(\"@\");\n if (at >= 0) loc = line.slice(at + 1);\n }\n }\n if (!loc) return undefined;\n loc = loc.replace(/\\?[^:]*/, \"\");\n const m = loc.match(/^(.*):(\\d+):\\d+$/) ?? loc.match(/^(.*):(\\d+)$/);\n if (!m) return undefined;\n const file = m[1] ?? \"\";\n const lineNo = Number(m[2]);\n if (!file || !Number.isFinite(lineNo)) return undefined;\n return { file, line: lineNo };\n}\n\n/**\n * The best-effort `file:line` a console call was made from (spec #122 §C). Parses the\n * frames of a stack, skipping `skipFrames` leading (SDK-internal) frames so the source\n * points at the host code that called `console.*`. Returns `undefined` when no frame\n * yields a usable location — the crumb then simply omits `source`.\n */\nexport function sourceFromStack(\n stack: string | undefined,\n skipFrames = 0,\n): SourceLocation | undefined {\n if (typeof stack !== \"string\" || stack.length === 0) return undefined;\n const frames: SourceLocation[] = [];\n for (const raw of stack.split(\"\\n\")) {\n const frame = parseStackFrame(raw.trim());\n if (frame) frames.push(frame);\n }\n return frames[skipFrames];\n}\n\n/**\n * Frames between `new Error()` (created inside the console wrapper) and the host caller:\n * just the wrapper frame itself. Skipping it points {@link sourceFromStack} at the app\n * code. The wrapper is called through the console object's property, so it is not a\n * direct-call inlining candidate — keeping this skip count stable.\n */\nconst CONSOLE_SOURCE_SKIP_FRAMES = 1;\n\n/** Wrap `console` methods so calls at the captured levels become crumbs. */\nexport function instrumentConsole(\n buffer: BreadcrumbBuffer,\n consoleObj: ConsoleLike,\n levels: readonly BreadcrumbLevel[],\n now: () => number,\n): Teardown {\n const restores: Teardown[] = [];\n for (const level of levels) {\n const original = consoleObj[level];\n if (typeof original !== \"function\") continue;\n // Decide once per level — not once per call — whether this level pays the\n // source-capture cost. Only the levels that matter for debugging construct a\n // `new Error()` to read the call site; the chatty log/info/debug skip it entirely\n // so a tight logging loop stays cheap (ticket #159; see SOURCE_CAPTURE_LEVELS).\n const withSource = capturesSource(level);\n const wrapper = (...args: unknown[]): unknown => {\n // Capture the call site before anything else so the wrapper is the top frame —\n // but only for the levels that keep a source (the hot-page budget, ticket #159).\n let source: SourceLocation | undefined;\n if (withSource) {\n try {\n source = sourceFromStack(new Error().stack, CONSOLE_SOURCE_SKIP_FRAMES);\n } catch {\n source = undefined;\n }\n }\n try {\n if (level === \"assert\") {\n // console.assert records only when the asserted condition is falsy.\n if (!args[0]) {\n buffer.add(consoleCrumb(\"assert\", args.slice(1), now(), source));\n }\n } else {\n buffer.add(consoleCrumb(level, args, now(), source));\n }\n } catch {\n // Capture must never throw into the host page.\n }\n return original.apply(consoleObj, args);\n };\n consoleObj[level] = wrapper;\n restores.push(() => {\n consoleObj[level] = original;\n });\n }\n return () => {\n for (const restore of restores) restore();\n };\n}\n\nfunction requestUrl(input: string | URL | Request): string {\n if (typeof input === \"string\") return input;\n if (input instanceof URL) return input.toString();\n return input.url;\n}\n\nfunction requestMethod(\n input: string | URL | Request,\n init: RequestInit | undefined,\n): string {\n const method =\n init?.method ??\n (typeof input === \"object\" && \"method\" in input ? input.method : undefined) ??\n \"GET\";\n return method.toUpperCase();\n}\n\n/** Read one response header defensively — `null` on an opaque response or any throw. */\nfunction safeResponseHeader(response: Response, name: string): string | null {\n try {\n return response.headers?.get?.(name) ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Classify a settled `fetch` response into a {@link NetworkOutcome} (spec #122 §D). An\n * opaque cross-origin response (status masked to `0`) is `opaque-cors`; otherwise the\n * outcome follows the HTTP status.\n */\nfunction classifyFetchResponse(response: Response): NetworkOutcome {\n if (response.type === \"opaque\" || response.type === \"opaqueredirect\") {\n return \"opaque-cors\";\n }\n return outcomeFromStatus(response.status);\n}\n\n/**\n * Classify a rejected `fetch` into a {@link NetworkOutcome} (spec #122 §D) by the\n * error's name: an `AbortError` is `aborted`, a `TimeoutError` (an `AbortSignal.timeout`)\n * is `timeout`, and anything else is a plain `network-error`.\n */\nfunction classifyFetchError(error: unknown): NetworkOutcome {\n const name =\n typeof error === \"object\" && error !== null && \"name\" in error\n ? String((error as { name?: unknown }).name)\n : \"\";\n if (name === \"AbortError\") return \"aborted\";\n if (name === \"TimeoutError\") return \"timeout\";\n return \"network-error\";\n}\n\n/**\n * Wrap `fetch` to record a rich network crumb on settlement (spec #122 §D, ticket\n * #139): method, scrubbed URL, status + statusText, a `performance.now()` duration,\n * request size (only when the body is trivially sized), response size (from the\n * `content-length` header only), content type, and a failure outcome. The **original**\n * outcome is returned untouched — the response is passed through **without its body\n * being read** (only two metadata headers are inspected), and a rejection is re-thrown\n * so the caller's `unhandledrejection` semantics are preserved.\n */\nexport function instrumentFetch(\n buffer: BreadcrumbBuffer,\n win: InstrumentWindow,\n ignoreUrl: (url: string) => boolean,\n now: () => number,\n mono: () => number = defaultMono,\n): Teardown {\n const original = win.fetch;\n if (typeof original !== \"function\") return noop;\n const wrapper: FetchFn = (\n input: string | URL | Request,\n init?: RequestInit,\n ): Promise<Response> => {\n const url = requestUrl(input);\n const method = requestMethod(input, init);\n // Size only a body passed literally in `init` — never a `Request`'s stream body.\n const reqSize = trivialBodySize(init?.body);\n const started = mono();\n // Native `fetch` must run against the window, so bind the receiver rather\n // than forward whatever `this` a free call carries.\n const promise = original.call(win, input, init);\n if (ignoreUrl(url)) return promise;\n return promise.then(\n (response) => {\n try {\n buffer.add(\n networkCrumb(\n {\n api: \"fetch\",\n method,\n url,\n status: response.status || undefined,\n statusText: response.statusText || undefined,\n durationMs: Math.max(0, mono() - started),\n reqSize,\n respSize: parseContentLength(\n safeResponseHeader(response, \"content-length\"),\n ),\n contentType: contentTypeOf(\n safeResponseHeader(response, \"content-type\"),\n ),\n outcome: classifyFetchResponse(response),\n },\n now(),\n ),\n );\n } catch {\n /* never throw into the host page */\n }\n return response;\n },\n (error: unknown) => {\n try {\n buffer.add(\n networkCrumb(\n {\n api: \"fetch\",\n method,\n url,\n durationMs: Math.max(0, mono() - started),\n reqSize,\n outcome: classifyFetchError(error),\n },\n now(),\n ),\n );\n } catch {\n /* never throw into the host page */\n }\n throw error;\n },\n );\n };\n win.fetch = wrapper;\n return () => {\n win.fetch = original;\n };\n}\n\ninterface XhrMeta {\n __fixbackMeta?: { method: string; url: string };\n}\n\n/** Read one XHR response header defensively — `null` when unavailable or on any throw. */\nfunction safeXhrHeader(xhr: XhrInstance, name: string): string | null {\n try {\n return typeof xhr.getResponseHeader === \"function\"\n ? xhr.getResponseHeader(name)\n : null;\n } catch {\n return null;\n }\n}\n\n/** Read an XHR's `statusText` defensively — `undefined` when empty or on any throw. */\nfunction safeXhrStatusText(xhr: XhrInstance): string | undefined {\n try {\n return xhr.statusText || undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Patch `XMLHttpRequest` to record a rich network crumb when a request settles (spec\n * #122 §D, ticket #139): method, scrubbed URL, status + statusText, a `performance.now()`\n * duration, request size (only when the body is trivially sized), response size (from\n * the `content-length` header only), content type, and a failure outcome distinguished\n * by which terminal event fired (`error` / `timeout` / `abort` / `load`). The `send`\n * body argument is **never read for content** — only its trivially-known size — so a body\n * can never reach the buffer.\n */\nexport function instrumentXhr(\n buffer: BreadcrumbBuffer,\n win: InstrumentWindow,\n ignoreUrl: (url: string) => boolean,\n now: () => number,\n mono: () => number = defaultMono,\n): Teardown {\n const ctor = win.XMLHttpRequest;\n if (typeof ctor !== \"function\") return noop;\n const proto = ctor.prototype;\n const originalOpen = proto.open;\n const originalSend = proto.send;\n\n proto.open = function (\n this: XhrInstance & XhrMeta,\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ): void {\n this.__fixbackMeta = { method: String(method).toUpperCase(), url: String(url) };\n return originalOpen.call(this, method, url, ...rest);\n };\n\n proto.send = function (this: XhrInstance & XhrMeta, body?: unknown): void {\n const meta = this.__fixbackMeta;\n if (meta && !ignoreUrl(meta.url)) {\n const started = mono();\n const reqSize = trivialBodySize(body);\n // The terminal event names the outcome; `loadend` always follows exactly one of\n // load/error/timeout/abort, so by the time we record, `settled` is set.\n let settled: NetworkOutcome | undefined;\n const onLoad = (): void => {\n settled = outcomeFromStatus(this.status || undefined);\n };\n const onError = (): void => {\n settled = \"network-error\";\n };\n const onTimeout = (): void => {\n settled = \"timeout\";\n };\n const onAbort = (): void => {\n settled = \"aborted\";\n };\n // An arrow captures the request instance as `this` without aliasing it.\n const onDone = (): void => {\n try {\n buffer.add(\n networkCrumb(\n {\n api: \"xhr\",\n method: meta.method,\n url: meta.url,\n status: this.status || undefined,\n statusText: safeXhrStatusText(this),\n durationMs: Math.max(0, mono() - started),\n reqSize,\n respSize: parseContentLength(safeXhrHeader(this, \"content-length\")),\n contentType: contentTypeOf(safeXhrHeader(this, \"content-type\")),\n outcome: settled ?? outcomeFromStatus(this.status || undefined),\n },\n now(),\n ),\n );\n } catch {\n /* never throw into the host page */\n }\n this.removeEventListener(\"load\", onLoad);\n this.removeEventListener(\"error\", onError);\n this.removeEventListener(\"timeout\", onTimeout);\n this.removeEventListener(\"abort\", onAbort);\n this.removeEventListener(\"loadend\", onDone);\n };\n this.addEventListener(\"load\", onLoad);\n this.addEventListener(\"error\", onError);\n this.addEventListener(\"timeout\", onTimeout);\n this.addEventListener(\"abort\", onAbort);\n this.addEventListener(\"loadend\", onDone);\n }\n return originalSend.call(this, body);\n };\n\n return () => {\n proto.open = originalOpen;\n proto.send = originalSend;\n };\n}\n\n/**\n * Wrap `navigator.sendBeacon` to record a network crumb for each beacon (spec #122 §D,\n * ticket #139). `sendBeacon` is fire-and-forget with a **synchronous boolean** return —\n * `true` when the user agent queued the beacon, `false` when it declined — so wrapping\n * must return that boolean unchanged: the original is called first and its result both\n * classifies the crumb (`ok` / `network-error`) and is returned to the caller. Only the\n * URL and the trivially-known request size are recorded (no response exists to read);\n * capture failure is swallowed and the boolean still returned, and if the original itself\n * throws we record best-effort and re-throw so the contract is preserved exactly.\n */\nexport function instrumentBeacon(\n buffer: BreadcrumbBuffer,\n win: InstrumentWindow,\n ignoreUrl: (url: string) => boolean,\n now: () => number,\n): Teardown {\n const nav = win.navigator;\n if (!nav || typeof nav.sendBeacon !== \"function\") return noop;\n const original = nav.sendBeacon;\n const record = (url: string, data: unknown, outcome: NetworkOutcome): void => {\n if (ignoreUrl(url)) return;\n try {\n buffer.add(\n networkCrumb(\n { api: \"beacon\", method: \"POST\", url, reqSize: trivialBodySize(data), outcome },\n now(),\n ),\n );\n } catch {\n /* never throw into the host page */\n }\n };\n const wrapper = function (url: string | URL, data?: BodyInit | null): boolean {\n const target = typeof url === \"string\" ? url : String(url);\n let queued: boolean;\n try {\n queued = original.call(nav, url, data);\n } catch (error) {\n // The original threw: record a best-effort failure, then preserve semantics.\n record(target, data, \"network-error\");\n throw error;\n }\n record(target, data, queued ? \"ok\" : \"network-error\");\n return queued;\n };\n nav.sendBeacon = wrapper;\n return () => {\n nav.sendBeacon = original;\n };\n}\n\n/** Record a `navigation` crumb on `pushState`/`replaceState`/pop/hash changes. */\nexport function instrumentNavigation(\n buffer: BreadcrumbBuffer,\n win: InstrumentWindow,\n now: () => number,\n): Teardown {\n const history = win.history;\n const location = win.location;\n if (!history || !location) return noop;\n\n let last = location.href;\n const record = (to: string): void => {\n try {\n buffer.add(navigationCrumb(last, to, now()));\n } catch {\n /* never throw into the host page */\n }\n last = to;\n };\n\n const originalPush = history.pushState;\n const originalReplace = history.replaceState;\n\n history.pushState = function (\n this: HistoryLike,\n data: unknown,\n unused: string,\n url?: string | URL | null,\n ): void {\n const result = originalPush.call(this, data, unused, url);\n record(location.href);\n return result;\n };\n history.replaceState = function (\n this: HistoryLike,\n data: unknown,\n unused: string,\n url?: string | URL | null,\n ): void {\n const result = originalReplace.call(this, data, unused, url);\n record(location.href);\n return result;\n };\n\n const onPopState = (): void => record(location.href);\n const onHashChange = (): void => record(location.href);\n win.addEventListener(\"popstate\", onPopState);\n win.addEventListener(\"hashchange\", onHashChange);\n\n return () => {\n history.pushState = originalPush;\n history.replaceState = originalReplace;\n win.removeEventListener(\"popstate\", onPopState);\n win.removeEventListener(\"hashchange\", onHashChange);\n };\n}\n\nfunction eventTargetElement(event: Event): Element | null {\n const path =\n typeof event.composedPath === \"function\" ? event.composedPath() : [];\n const deepest = path[0] ?? event.target;\n return deepest instanceof Element ? deepest : null;\n}\n\n/** Listen (capture-phase) for clicks and input changes as masked crumbs. */\nexport function instrumentUiEvents(\n buffer: BreadcrumbBuffer,\n doc: Document,\n now: () => number,\n): Teardown {\n const onClick = (event: Event): void => {\n const target = eventTargetElement(event);\n if (!target || isFixbackNode(target)) return;\n try {\n buffer.add(clickCrumb(target, now()));\n } catch {\n /* never throw into the host page */\n }\n };\n const onInput = (event: Event): void => {\n const target = eventTargetElement(event);\n if (!target || isFixbackNode(target)) return;\n try {\n buffer.add(inputCrumb(target, now()));\n } catch {\n /* never throw into the host page */\n }\n };\n doc.addEventListener(\"click\", onClick, true);\n doc.addEventListener(\"input\", onInput, true);\n return () => {\n doc.removeEventListener(\"click\", onClick, true);\n doc.removeEventListener(\"input\", onInput, true);\n };\n}\n\n/**\n * Install every capture hook onto a window/document and return a single teardown\n * that removes them all. Each hook is independent and defensive: a failure in one\n * never blocks the others, and none can throw into the host page.\n */\nexport function instrumentBreadcrumbs(\n buffer: BreadcrumbBuffer,\n options: InstrumentOptions = {},\n): Teardown {\n const win =\n options.win ?? (globalThis as unknown as InstrumentWindow | undefined);\n const doc =\n options.doc ??\n (typeof document !== \"undefined\" ? document : undefined);\n const consoleObj =\n options.consoleObj ??\n (typeof console !== \"undefined\"\n ? (console as unknown as ConsoleLike)\n : undefined);\n const levels = options.consoleLevels ?? DEFAULT_CONSOLE_LEVELS;\n const ignoreUrl = options.ignoreUrl ?? (() => false);\n const now = options.now ?? Date.now;\n const mono = options.mono ?? defaultMono;\n // Per-project capture toggles (#138): a stream is captured unless explicitly\n // turned off, so a boot config that omits it — or an older server — stays on.\n const captureConsole = options.captureConsole !== false;\n const captureNetwork = options.captureNetwork !== false;\n\n const teardowns: Teardown[] = [];\n if (consoleObj && captureConsole) {\n teardowns.push(instrumentConsole(buffer, consoleObj, levels, now));\n }\n if (win) {\n if (captureNetwork) {\n teardowns.push(instrumentFetch(buffer, win, ignoreUrl, now, mono));\n teardowns.push(instrumentXhr(buffer, win, ignoreUrl, now, mono));\n teardowns.push(instrumentBeacon(buffer, win, ignoreUrl, now));\n }\n teardowns.push(instrumentNavigation(buffer, win, now));\n }\n if (doc) {\n teardowns.push(instrumentUiEvents(buffer, doc, now));\n }\n\n return () => {\n for (const teardown of teardowns) {\n try {\n teardown();\n } catch {\n /* teardown is best-effort */\n }\n }\n };\n}\n","/**\n * The Annotation & vector-marks geometry (spec 0003 §B/§D).\n *\n * The Annotation **wire types** (`Annotation`, `Mark` and friends, `Point`,\n * `Rect`, `SelectedElement`) live in `@fixback/sdk-core` (ADR-0028) so every\n * surface shares one shape; this module re-exports them and holds the browser's\n * pure geometry and Send-assembly used by the region-capture and draw controllers\n * and the overlay. Marks live in the **screenshot's coordinate space** (the full\n * viewport the screenshot is rasterised at), never baked into the PNG: the\n * dashboard composites them at view time (#91).\n */\n\nimport {\n type Annotation,\n type ArrowMark,\n type BoxMark,\n type DrawTool,\n type Mark,\n type PenMark,\n type Point,\n type Rect,\n type SelectedElement,\n type TextMark,\n} from \"@fixback/sdk-core\";\n\n// Re-export the shared wire types so `./annotation` stays the SDK's import path\n// for them — the shapes are owned by the core.\nexport type {\n Annotation,\n ArrowMark,\n BoxMark,\n DrawTool,\n Mark,\n PenMark,\n Point,\n Rect,\n TextMark,\n};\n\n/**\n * The default mark colour — Signal's danger red, matching the frozen Reporter\n * prototype's draw layer (`docs/design/Fixback Reporter.dc.html`).\n */\nexport const MARK_COLOR = \"#e5484d\";\n\n/**\n * Normalise a drag from a start to an end point into a positive-extent rect\n * (top-left origin, non-negative width/height), rounded to whole pixels — the\n * screenshot is a pixel raster, so sub-pixel extents carry no meaning. Shared by\n * region-capture and the box mark.\n */\nexport function normalizeRect(x0: number, y0: number, x1: number, y1: number): Rect {\n return {\n x: Math.round(Math.min(x0, x1)),\n y: Math.round(Math.min(y0, y1)),\n width: Math.round(Math.abs(x1 - x0)),\n height: Math.round(Math.abs(y1 - y0)),\n };\n}\n\n/**\n * The three points of an arrow's head, given its line `(x0,y0)→(x1,y1)` and a head\n * length: the tip, then the two barbs splayed ±30° behind it. Pure geometry the\n * draw surface renders as a filled triangle at the arrow's tip.\n */\nexport function arrowHeadPoints(\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n size = 14,\n): [Point, Point, Point] {\n const angle = Math.atan2(y1 - y0, x1 - x0);\n return [\n { x: x1, y: y1 },\n {\n x: x1 - size * Math.cos(angle - Math.PI / 6),\n y: y1 - size * Math.sin(angle - Math.PI / 6),\n },\n {\n x: x1 - size * Math.cos(angle + Math.PI / 6),\n y: y1 - size * Math.sin(angle + Math.PI / 6),\n },\n ];\n}\n\n/**\n * Assemble the structured Annotation from whatever a Reporter marked, dropping\n * empty layers: no element, no region, and an empty marks list are omitted, so the\n * result is `undefined` when nothing was marked. Marks are copied into a plain,\n * independent array so the annotation is a serialisable snapshot decoupled from the\n * live draw state.\n */\nexport function assembleAnnotation(parts: {\n readonly element?: SelectedElement | null;\n readonly region?: Rect | null;\n readonly marks?: ReadonlyArray<Mark> | null;\n}): Annotation | undefined {\n const annotation: {\n element?: SelectedElement;\n region?: Rect;\n marks?: ReadonlyArray<Mark>;\n } = {};\n if (parts.element) annotation.element = parts.element;\n if (parts.region) annotation.region = parts.region;\n if (parts.marks && parts.marks.length > 0) annotation.marks = parts.marks.slice();\n return Object.keys(annotation).length > 0 ? annotation : undefined;\n}\n","/**\n * Assembling the ingest **feedback** content from what a Reporter composed in the\n * overlay, plus the browser-side environment capture and Release validation.\n *\n * The shared wire shapes it produces — `ReportContent`, `CaptureEnvironment`,\n * `CapturedFrame`, `SelectedElement`, `ElementRect`, `FeedbackSource` — live in\n * `@fixback/sdk-core` (ADR-0028), so the browser and backend SDKs speak the same\n * shape; this module re-exports them for the SDK's public surface and holds only\n * the browser-specific assembly (`assembleContent`, `collectEnvironment`) and the\n * `release` validation. Keep the shapes in lock-step with the server: the JSON\n * `payload` accepted by `POST /api/ingest/feedback`\n * (`apps/api/src/ingest/ingest.controller.ts`).\n */\n\nimport {\n type CaptureEnvironment,\n type CapturedFrame,\n type ElementRect,\n type FeedbackSource,\n type ReportContent,\n type SelectedElement,\n} from \"@fixback/sdk-core\";\n\nimport { assembleAnnotation, type Annotation, type Mark, type Rect } from \"./annotation\";\nimport type { Breadcrumb } from \"./breadcrumbs\";\n\n// Re-export the shared wire shapes so the SDK's public surface (index.ts) and its\n// internal modules keep one import path — the shapes are owned by the core.\nexport type {\n CaptureEnvironment,\n CapturedFrame,\n ElementRect,\n FeedbackSource,\n ReportContent,\n SelectedElement,\n};\n\n/** The longest release string the server accepts (mirrors `RELEASE_MAX_LENGTH`). */\nconst RELEASE_MAX_LENGTH = 100;\n\n/** Release names the server reserves (mirrors the shared release rules). */\nconst RESERVED_RELEASES = new Set([\".\", \"..\", \"latest\"]);\n\n/**\n * Validate + trim a builder-supplied release (#117, ADR-0024), mirroring the\n * server's rules by value: 1–100 visible characters, no whitespace, control\n * characters, or path separators, and not a reserved name. Returns `undefined`\n * for an invalid value — the SDK drops it (with a warning at `init`) rather than\n * shipping a value the server would discard.\n */\nexport function normaliseRelease(value: string): string | undefined {\n const trimmed = value.trim();\n if (trimmed.length === 0 || trimmed.length > RELEASE_MAX_LENGTH) return undefined;\n if (RESERVED_RELEASES.has(trimmed)) return undefined;\n // eslint-disable-next-line no-control-regex\n if (/[\\s/\\\\\\u0000-\\u001f\\u007f]/.test(trimmed)) return undefined;\n return trimmed;\n}\n\n/**\n * What the overlay hands to {@link assembleContent} when the Reporter sends. The\n * three marking layers arrive flat (`element` / `region` / `marks`); `assembleContent`\n * folds whatever is present into the structured {@link Annotation}.\n */\nexport interface ReportDraft {\n readonly comment?: string;\n readonly element?: SelectedElement;\n readonly region?: Rect;\n readonly marks?: ReadonlyArray<Mark>;\n readonly url?: string;\n readonly environment?: CaptureEnvironment;\n readonly trace?: readonly Breadcrumb[];\n /** The Reporter's self-provided display name / email (spec §F), if the SDK holds them. */\n readonly reporterName?: string;\n readonly reporterEmail?: string;\n}\n\n/**\n * Read the capture environment off a window: the viewport size, the browser's\n * user-agent, and the SDK version. A dimension is recorded only when it is a\n * positive number (a headless/zero viewport records nothing rather than an\n * invalid `0`, which the server would reject).\n */\nexport function collectEnvironment(\n win: Window,\n sdkVersion: string,\n release?: string,\n): CaptureEnvironment {\n const env: {\n viewportWidth?: number;\n viewportHeight?: number;\n browser?: string;\n sdkVersion?: string;\n release?: string;\n } = {};\n\n const width = win.innerWidth;\n if (typeof width === \"number\" && width > 0) env.viewportWidth = Math.round(width);\n const height = win.innerHeight;\n if (typeof height === \"number\" && height > 0) {\n env.viewportHeight = Math.round(height);\n }\n\n const ua = win.navigator?.userAgent;\n if (typeof ua === \"string\" && ua.length > 0) env.browser = ua;\n\n if (sdkVersion.length > 0) env.sdkVersion = sdkVersion;\n\n // The Release, already validated at `init` (#117, ADR-0024).\n if (release && release.length > 0) env.release = release;\n\n return env;\n}\n\n/**\n * Assemble the ingest content from what the Reporter composed. Empty pieces are\n * dropped rather than sent as blanks: a whitespace-only comment, an absent\n * element, or an empty environment are simply omitted, so the payload carries\n * only what was actually provided (mirroring the server's all-optional content).\n */\nexport function assembleContent(draft: ReportDraft): ReportContent {\n const content: {\n comment?: string;\n reporterName?: string;\n reporterEmail?: string;\n url?: string;\n environment?: CaptureEnvironment;\n annotation?: Annotation;\n trace?: readonly Breadcrumb[];\n } = {};\n\n const comment = draft.comment?.trim();\n if (comment) content.comment = comment;\n\n // The Reporter's self-provided display fields ride along, trimmed; a blank is\n // dropped rather than sent, exactly as the comment is (spec §F).\n const reporterName = draft.reporterName?.trim();\n if (reporterName) content.reporterName = reporterName;\n const reporterEmail = draft.reporterEmail?.trim();\n if (reporterEmail) content.reporterEmail = reporterEmail;\n\n if (draft.url) content.url = draft.url;\n\n if (draft.environment && Object.keys(draft.environment).length > 0) {\n content.environment = draft.environment;\n }\n\n const annotation = assembleAnnotation({\n element: draft.element,\n region: draft.region,\n marks: draft.marks,\n });\n if (annotation) content.annotation = annotation;\n\n // Only a non-empty trace rides along — an empty buffer is simply omitted.\n if (draft.trace && draft.trace.length > 0) content.trace = draft.trace;\n\n return content;\n}\n","import { AutoReportBackoff } from \"@fixback/sdk-core\";\n\nimport type { IdentityInputs, ReporterTier } from \"./boot\";\nimport type { FeedbackSource, ReportContent } from \"./report\";\n\n/**\n * The multipart feedback submission — the transport half of the capture loop.\n *\n * `POST /api/ingest/feedback` (spec MVP §C; tickets #50/#53) is a multipart\n * request: a single text part `payload` carrying the JSON (publishable key +\n * identity evidence + content) and an optional binary `replay` part — the buffered\n * rrweb window (ADR-0024), from which the annotated still is reconstructed downstream\n * (ADR-0027), so the browser SDK rasterises and sends no screenshot. The content-type\n * header is deliberately not set, so the runtime writes the `multipart/form-data`\n * boundary itself. Like `requestBoot`, this never throws: an unreachable Fixback or a\n * refusal is a quiet result, so a Fixback problem never breaks the host page.\n *\n * The `payload` carries the full report content — the structured `annotation`\n * (element + region + marks, kept vector), the masked `trace` buffer, and the\n * `source` provenance (spec §D). Automatic reports (`source: error`) additionally\n * honour ingest's `429` + `Retry-After` backpressure: while the hold window is open\n * they are dropped without touching the network. Manual reports are never gated\n * (spec §E/§H).\n */\n\n/**\n * The multipart field the replay window is sent under (mirrors the server). A\n * **file part**, deliberately not a field inside `payload`: rrweb events dwarf\n * the JSON payload, and multipart text fields are size-capped far below what a\n * DOM recording needs (ADR-0024).\n */\nconst REPLAY_FIELD = \"replay\";\n\n/** What ingest returns for an accepted submission (vendored server shape). */\nexport interface RecordedFeedback {\n readonly feedbackId: string;\n readonly issueId: string;\n readonly reporterId: string;\n readonly tier: ReporterTier;\n}\n\n/**\n * The buffered replay window to attach, if any — the rrweb events a\n * `ReplaySnapshot` holds (replay.ts). Serialized into its own binary part.\n */\nexport interface SubmitReplay {\n readonly events: readonly unknown[];\n}\n\n/** Everything a single feedback submission carries. */\nexport interface SubmitInput {\n readonly key: string;\n readonly identity?: IdentityInputs;\n readonly content: ReportContent;\n readonly replay?: SubmitReplay | null;\n}\n\n/** The outcome of a submission — never an exception. */\nexport type SubmitResult =\n | { readonly ok: true; readonly feedback: RecordedFeedback | null }\n | {\n readonly ok: false;\n readonly reason: \"unreachable\" | \"refused\";\n readonly status?: number;\n }\n | {\n /**\n * A `source: error` report shed under ingest backpressure (spec §E/§H) — either\n * held locally because the window is still open, or answered `429` by ingest,\n * which opened/extended the window. Carries the seconds left to wait. Manual\n * reports never produce this.\n */\n readonly ok: false;\n readonly reason: \"backpressure\";\n readonly retryAfterSeconds: number;\n };\n\n/**\n * The shared `source: error` backpressure window for the page. One instance so a\n * `429` from an auto-report holds the auto-reports that follow it; tests inject\n * their own {@link AutoReportBackoff} to isolate the clock.\n */\nconst defaultBackoff = new AutoReportBackoff();\n\n/** Join an API base URL with the feedback path, tolerating a trailing slash. */\nexport function feedbackEndpoint(apiUrl: string): string {\n return `${apiUrl.replace(/\\/+$/, \"\")}/api/ingest/feedback`;\n}\n\n/** Drop `undefined` identity fields so the payload carries only what was given. */\nfunction compactIdentity(identity: IdentityInputs | undefined): IdentityInputs {\n if (!identity) return {};\n const out: { signedIdentity?: string; reporterId?: string; anonymousId?: string } = {};\n if (identity.signedIdentity) out.signedIdentity = identity.signedIdentity;\n if (identity.reporterId) out.reporterId = identity.reporterId;\n if (identity.anonymousId) out.anonymousId = identity.anonymousId;\n return out;\n}\n\n/**\n * Submit a report to ingest. Assembles the `payload` JSON (key + identity +\n * content, with an explicit `source` stamped) and the optional `replay` window\n * into a `FormData`, posts it, and resolves to the recorded Feedback on success\n * or a named failure otherwise.\n *\n * A `source: error` report first consults the shared backpressure window: while it\n * is open the report is dropped without a request (spec §E/§H). Ingest's `429` +\n * `Retry-After` opens/extends that window (default 60 s if the header is absent).\n * Manual reports (`source: reporter`, the default) never consult the window and a\n * non-2xx for them stays a plain refusal. The `fetchImpl` and `backoff` seams exist\n * purely so the call is testable.\n */\nexport async function submitReport(\n apiUrl: string,\n input: SubmitInput,\n fetchImpl: typeof fetch = fetch,\n backoff: AutoReportBackoff = defaultBackoff,\n): Promise<SubmitResult> {\n const source: FeedbackSource = input.content.source ?? \"reporter\";\n const isError = source === \"error\";\n\n // Client-side backpressure: shed auto-reports while the hold window is open,\n // without touching the network. Manual reports are never gated.\n if (isError && backoff.isPaused()) {\n return {\n ok: false,\n reason: \"backpressure\",\n retryAfterSeconds: backoff.retryAfterSeconds(),\n };\n }\n\n const payload = {\n key: input.key,\n ...compactIdentity(input.identity),\n ...input.content,\n source,\n };\n\n const form = new FormData();\n form.append(\"payload\", JSON.stringify(payload));\n if (input.replay && input.replay.events.length > 0) {\n // Serialization can throw on exotic event content; a report must still ship\n // without its replay rather than not at all.\n try {\n const json = JSON.stringify(input.replay.events);\n form.append(\n REPLAY_FIELD,\n new Blob([json], { type: \"application/json\" }),\n \"replay.json\",\n );\n } catch {\n // Ship the report without replay.\n }\n }\n\n let response: Response;\n try {\n response = await fetchImpl(feedbackEndpoint(apiUrl), {\n method: \"POST\",\n body: form,\n });\n } catch {\n return { ok: false, reason: \"unreachable\" };\n }\n\n if (!response.ok) {\n // A `429` for an auto-report is backpressure, not a refusal: open/extend the\n // hold window from `Retry-After` and report the wait. Manual reports never 429\n // here, so any non-2xx for them stays a plain refusal.\n if (isError && response.status === 429) {\n const retryAfterSeconds = backoff.hold(response.headers.get(\"Retry-After\"));\n return { ok: false, reason: \"backpressure\", retryAfterSeconds };\n }\n return { ok: false, reason: \"refused\", status: response.status };\n }\n\n try {\n const feedback = (await response.json()) as RecordedFeedback;\n return { ok: true, feedback };\n } catch {\n // Accepted, but the body wasn't the expected JSON — still a success.\n return { ok: true, feedback: null };\n }\n}\n","/**\n * The SDK's own version string, reported to ingest as `environment.sdkVersion`\n * (spec MVP §B/§E). Kept as an inlined constant rather than a runtime `package.json`\n * import, so the published bundle stays a single self-contained file.\n *\n * It must equal `package.json`'s `version`. Two things keep it there: the Changesets\n * `version` step syncs it automatically (`scripts/sync-sdk-version.mjs`, wired into\n * `version-packages`), and `version.test.ts` fails the build if the two ever drift —\n * so a stale dogfood version (the SDK reporting an old number on our own dashboard)\n * can't slip through. Do not hand-edit this line to a value other than\n * `package.json`'s version.\n */\nexport const SDK_VERSION = \"0.5.0\";\n","/**\n * Automatic error capture — the SDK's signature capability: **errors report\n * themselves, no prompt** (spec 0003 §E, ADR-0011; research\n * `sentry-error-capture-findings.md` §7.1–7.3, §7.6).\n *\n * Exactly **two capture-phase listeners** (`window` `error` +\n * `unhandledrejection`) turn uncaught exceptions and unhandled rejections into\n * `source: error` Feedback (stamped `Kind = bug` server-side, ADR-0023) for the current session's Reporter — no\n * native-API monkeypatching, no library. Each firing is deduped by a per-session\n * fingerprint, rate-limited by a token-bucket burst limiter and a per-session cap,\n * scrubbed through the same `beforeSend` choke point as manual reports (§C), and\n * shipped through the same transport (which honours ingest's `429` / `Retry-After`\n * backpressure, ticket #89). `console.error` is **not** promoted — it stays\n * breadcrumb-only Evidence.\n *\n * Per-firing order (research §7.1): **`canSubmit`/Gate → dedup → rate-limit/cap →\n * `beforeSend` scrub → enqueue Feedback**. The Gate is honoured by construction:\n * `init` installs this only when boot returned `canSubmit`, so an auto-error is\n * never filed where a manual report would be refused, and it inherits the session\n * Reporter's server-derived tier.\n *\n * The whole module is defensive — every handler is wrapped so a Fixback problem\n * (or an error thrown while capturing an error) never surfaces on the host page.\n * The fingerprint/`normalize` shape and the limiter numbers are **starting points**\n * from research (ticket #92), exposed as config — tunable, not frozen.\n */\n\nimport {\n type BeforeSend,\n type CapturedFrame,\n computeFingerprint,\n extractTopFrames,\n hashString,\n normalize,\n type ReportContent,\n runBeforeSend,\n scrubUrl,\n} from \"@fixback/sdk-core\";\n\nimport type { IdentityInputs } from \"./boot\";\nimport {\n type Breadcrumb,\n type BreadcrumbBuffer,\n errorCrumb,\n type Teardown,\n} from \"./breadcrumbs\";\nimport type { ReporterDisplay } from \"./invite\";\nimport { assembleContent, collectEnvironment } from \"./report\";\nimport type { ReplaySource } from \"./replay\";\nimport { submitReport, type SubmitInput, type SubmitResult } from \"./submit\";\nimport { SDK_VERSION } from \"./version\";\n\nexport type { Teardown };\n\n// The pure fingerprint helpers live in @fixback/sdk-core (ADR-0028), so the same\n// logical error groups identically across surfaces (ADR-0027). Re-exported here so\n// the SDK keeps one import path for them.\nexport { computeFingerprint, extractTopFrames, hashString, normalize };\n\n/** Burst limiter capacity — how many auto-reports may fire back-to-back (§E). */\nexport const DEFAULT_BURST_CAPACITY = 5;\n/** Burst limiter refill — one token returns every this-many ms (§E). */\nexport const DEFAULT_BURST_REFILL_MS = 2_000;\n/** Per-session ceiling on distinct auto-Feedback; beyond it, only a dropped-count (§E). */\nexport const DEFAULT_MAX_DISTINCT_AUTO = 20;\n\n/** How many preceding entries an auto-error's causal pointer names (spec #122 §F). */\nconst CAUSED_BY_LIMIT = 5;\n\n/**\n * The ids of up to the last {@link CAUSED_BY_LIMIT} entries preceding the throw, in\n * time order — the causal pointer an auto-captured error carries (spec #122 §F), so a\n * machine-filed crash names its lead-up. Entries without an id are skipped.\n */\nfunction precedingIds(entries: readonly Breadcrumb[] | undefined): string[] {\n if (!entries || entries.length === 0) return [];\n const ids: string[] = [];\n for (let i = entries.length - 1; i >= 0 && ids.length < CAUSED_BY_LIMIT; i -= 1) {\n const id = entries[i]?.id;\n if (typeof id === \"string\" && id.length > 0) ids.unshift(id);\n }\n return ids;\n}\n\n/** The most structured frames shipped per auto report (mirrors `MAX_CAPTURED_FRAMES`). */\nconst STRUCTURED_FRAME_LIMIT = 30;\n\n/** Split a `file:line:col` location into its parts; null when it has no line. */\nfunction parseLocation(\n location: string,\n): { file: string; line: number; column: number | null } | null {\n // The file may itself contain colons (https://…), so split from the right.\n const match = location.match(/^(.*?):(\\d+)(?::(\\d+))?$/);\n if (!match) return null;\n const file = match[1] ?? \"\";\n if (file.length === 0 || file === \"native\" || file.includes(\"<anonymous>\")) {\n return null;\n }\n const line = Number(match[2]);\n if (!Number.isFinite(line)) return null;\n const column = match[3] !== undefined ? Number(match[3]) : null;\n return { file, line, column };\n}\n\n/**\n * Extract **structured** frames from a stack for the wire (#117, ADR-0024) —\n * unlike {@link extractTopFrames} (a compact fingerprint signature that drops the\n * origin), these keep the full script URL, because server-side symbolication\n * matches it against uploaded sourcemap paths. URLs are scrubbed (query dropped,\n * PII redacted) before they leave the page; unlocatable frames (`native`,\n * `<anonymous>`, eval) are skipped; the count is capped.\n */\nexport function extractStructuredFrames(\n stack: string | undefined,\n limit = STRUCTURED_FRAME_LIMIT,\n): CapturedFrame[] {\n if (typeof stack !== \"string\" || stack.length === 0) return [];\n const frames: CapturedFrame[] = [];\n for (const raw of stack.split(\"\\n\")) {\n if (frames.length >= limit) break;\n const line = raw.trim();\n let fn: string | null = null;\n let location: string | null = null;\n // V8: \"at fn (loc)\" | \"at loc\"\n const v8Named = line.match(/^at\\s+(.+?)\\s+\\((.+)\\)$/);\n const v8Bare = v8Named ? null : line.match(/^at\\s+(.+)$/);\n const geckoAt = v8Named || v8Bare ? -1 : line.indexOf(\"@\");\n if (v8Named) {\n fn = v8Named[1] ?? null;\n location = v8Named[2] ?? null;\n } else if (v8Bare) {\n location = v8Bare[1] ?? null;\n } else if (geckoAt >= 0) {\n // Firefox / Safari: \"fn@loc\" | \"@loc\"\n fn = geckoAt > 0 ? line.slice(0, geckoAt) : null;\n location = line.slice(geckoAt + 1);\n }\n if (!location) continue;\n const parsed = parseLocation(location);\n if (!parsed) continue;\n frames.push({\n file: scrubUrl(parsed.file),\n line: parsed.line,\n column: parsed.column,\n function: fn && fn.length > 0 ? fn : null,\n });\n }\n return frames;\n}\n\n// --- Burst limiter (token bucket, research §7.3) ------------------------------\n\n/** Configuration for {@link TokenBucket}. */\nexport interface TokenBucketOptions {\n readonly capacity: number;\n readonly refillIntervalMs: number;\n /** Clock source, injectable for tests. Defaults to `Date.now`. */\n readonly now?: () => number;\n}\n\n/**\n * A token bucket: starts full at `capacity`, refills one token every\n * `refillIntervalMs`, and refuses (`take() === false`) when empty. So a fast error\n * loop that dodges dedup with distinct fingerprints still can't machine-gun ingest.\n * The clock is injectable so the window is unit-tested deterministically.\n */\nexport class TokenBucket {\n private tokens: number;\n private last: number;\n private readonly now: () => number;\n\n constructor(private readonly options: TokenBucketOptions) {\n this.now = options.now ?? Date.now;\n this.tokens = Math.max(0, options.capacity);\n this.last = this.now();\n }\n\n /** Consume a token if one is available (refilling first), else refuse. */\n take(): boolean {\n const now = this.now();\n const { capacity, refillIntervalMs } = this.options;\n if (refillIntervalMs > 0 && now > this.last) {\n const refill = Math.floor((now - this.last) / refillIntervalMs);\n if (refill > 0) {\n this.tokens = Math.min(capacity, this.tokens + refill);\n this.last += refill * refillIntervalMs;\n }\n }\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n return false;\n }\n}\n\n// --- Error extraction ---------------------------------------------------------\n\n/** The distilled shape a fingerprint + report is built from. */\ninterface ExtractedError {\n readonly type: string;\n readonly value: string;\n readonly stack?: string;\n /** The original throwable (Error or rejection reason) for the trace crumb. */\n readonly original: unknown;\n}\n\ninterface ErrorLike {\n name?: unknown;\n message?: unknown;\n stack?: unknown;\n}\n\nfunction asString(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value == null) return \"\";\n try {\n return String(value);\n } catch {\n return \"\";\n }\n}\n\n/** Distil an uncaught `error` event into a fingerprint-able shape, or `null`. */\nfunction extractFromErrorEvent(event: Event): ExtractedError | null {\n const e = event as ErrorEvent & { error?: unknown };\n const error = e.error;\n if (error && typeof error === \"object\") {\n const err = error as ErrorLike;\n return {\n type: asString(err.name) || \"Error\",\n value: asString(err.message) || asString(e.message),\n stack: typeof err.stack === \"string\" ? err.stack : undefined,\n original: error,\n };\n }\n // No Error object: a message-only event (some browsers) is still capturable.\n const message = asString(e.message);\n if (message) return { type: \"Error\", value: message, original: message };\n // A resource-load error (img/script) has neither — never an uncaught exception.\n return null;\n}\n\n/** Distil an `unhandledrejection` event into a fingerprint-able shape, or `null`. */\nfunction extractFromRejectionEvent(event: Event): ExtractedError | null {\n const reason = (event as Event & { reason?: unknown }).reason;\n if (reason && typeof reason === \"object\") {\n const err = reason as ErrorLike;\n const type = asString(err.name) || \"UnhandledRejection\";\n const value = asString(err.message) || asString(reason);\n return {\n type,\n value,\n stack: typeof err.stack === \"string\" ? err.stack : undefined,\n original: reason,\n };\n }\n const value = asString(reason);\n return { type: \"UnhandledRejection\", value, original: reason ?? value };\n}\n\n// --- The capture controller ---------------------------------------------------\n\n/** Injectable collaborators, defaulted to the real implementations. */\nexport interface AutoCaptureDeps {\n readonly submitReport: (\n apiUrl: string,\n input: SubmitInput,\n fetchImpl?: typeof fetch,\n ) => Promise<SubmitResult>;\n}\n\n/** Configuration for {@link installErrorCapture}. */\nexport interface AutoCaptureConfig {\n readonly apiUrl: string;\n readonly key: string;\n readonly identity?: IdentityInputs;\n /**\n * The Reporter's self-provided display name / email (spec §F). Carried on\n * auto-captured Feedback too, so a machine-filed crash still names whose session it\n * was — display only, never a trust signal.\n */\n readonly display?: ReporterDisplay;\n /** The window whose global handlers are installed. Defaults to `window`. */\n readonly win?: Window;\n /** The document used for capture + environment. Defaults to the window's. */\n readonly doc?: Document;\n readonly sdkVersion?: string;\n /**\n * The host app's **Release** (#117, ADR-0024) — already validated by `init`\n * (`normaliseRelease`). Stamped into every auto report's environment so the\n * server can symbolicate the captured frames against this build's sourcemaps.\n */\n readonly release?: string;\n /** The shared trace buffer; the failing error is added to it before filing. */\n readonly buffer?: BreadcrumbBuffer | null;\n /**\n * The shared replay recorder (ADR-0024); the buffered window rides on a rich\n * first report — the moment before an uncaught error is exactly what replay\n * exists to show. Light count-update flushes never re-send it.\n */\n readonly replay?: ReplaySource | null;\n /** Per-project client scrub hook, run at the `beforeSend` choke point (§C). */\n readonly beforeSend?: BeforeSend;\n /** Run the built-in default scrubbers. Defaults to `true` (private-by-default). */\n readonly scrub?: boolean;\n readonly deps?: Partial<AutoCaptureDeps>;\n /** Burst limiter capacity. Defaults to {@link DEFAULT_BURST_CAPACITY}. */\n readonly burstCapacity?: number;\n /** Burst limiter refill interval (ms). Defaults to {@link DEFAULT_BURST_REFILL_MS}. */\n readonly burstRefillMs?: number;\n /** Per-session distinct-Feedback cap. Defaults to {@link DEFAULT_MAX_DISTINCT_AUTO}. */\n readonly maxDistinct?: number;\n /** Clock source, injectable for tests. Defaults to `Date.now`. */\n readonly now?: () => number;\n}\n\n/** A per-session record of one fingerprinted error. */\ninterface AutoEntry {\n count: number;\n firstAt: number;\n lastAt: number;\n /** The occurrence count last shipped to ingest (`0` until the first send). */\n sentCount: number;\n /** The structured frames parsed from the first firing's stack (#117), if any. */\n frames: readonly CapturedFrame[];\n}\n\n/** What to include when filing — a first report is rich; a flush is a light count update. */\ninterface FileOptions {\n /**\n * Include the buffered replay window (ADR-0024) — the rich first report only. Since\n * ADR-0027 this also governs the still: it is reconstructed from that window\n * downstream, so a report with no replay carries no still (the SDK rasterises none).\n */\n readonly trace: boolean;\n}\n\n/** A running auto-capture: its teardown, plus the local dropped-count (spec §E). */\nexport interface AutoCaptureHandle {\n /** Remove the two global handlers and the flush hooks. Safe to call repeatedly. */\n readonly destroy: Teardown;\n /**\n * Distinct auto-Feedback dropped by the burst limiter or the per-session cap —\n * the \"keep only a local dropped-count\" fallback beyond the guardrails (spec §E).\n */\n droppedCount(): number;\n}\n\nconst NOOP_HANDLE: AutoCaptureHandle = { destroy: () => {}, droppedCount: () => 0 };\n\n/**\n * Install automatic error capture on a window and return a handle whose `destroy`\n * removes every listener it added (the two global handlers plus the flush hooks).\n * The caller (`init`) installs this only after boot returned `canSubmit`, so the\n * Gate is respected and the auto-error inherits the session Reporter's tier.\n */\nexport function installErrorCapture(config: AutoCaptureConfig): AutoCaptureHandle {\n const maybeWin =\n config.win ?? (typeof window !== \"undefined\" ? window : undefined);\n if (!maybeWin) return NOOP_HANDLE;\n const win: Window = maybeWin;\n const doc: Document | undefined =\n config.doc ??\n win.document ??\n (typeof document !== \"undefined\" ? document : undefined);\n\n const now = config.now ?? Date.now;\n const sdkVersion = config.sdkVersion ?? SDK_VERSION;\n const maxDistinct = config.maxDistinct ?? DEFAULT_MAX_DISTINCT_AUTO;\n const submitReportFn = config.deps?.submitReport ?? submitReport;\n\n const bucket = new TokenBucket({\n capacity: config.burstCapacity ?? DEFAULT_BURST_CAPACITY,\n refillIntervalMs: config.burstRefillMs ?? DEFAULT_BURST_REFILL_MS,\n now,\n });\n\n const seen = new Map<string, AutoEntry>();\n /** Distinct auto-Feedback dropped by the burst limiter or the session cap. */\n let dropped = 0;\n\n /**\n * Build the `source: error` content for a fingerprint at a given occurrence\n * count. No Kind rides along (ADR-0023): the server stamps a `source: error`\n * Issue `bug` deterministically — an uncaught error proves itself.\n */\n function buildContent(fp: string, occurrences: number, opts: FileOptions): ReportContent {\n const base = assembleContent({\n url: win.location?.href,\n environment: collectEnvironment(win, sdkVersion, config.release),\n trace: opts.trace ? config.buffer?.snapshot() : undefined,\n reporterName: config.display?.name,\n reporterEmail: config.display?.email,\n });\n const frames = seen.get(fp)?.frames;\n return {\n ...base,\n source: \"error\",\n errorSignature: fp,\n occurrences,\n // The structured frames (#117) ride with the rich first report only — a\n // flush is a light count update, like the screenshot and trace.\n ...(opts.trace && frames && frames.length > 0 ? { errorFrames: frames } : {}),\n };\n }\n\n /**\n * Assemble, scrub, (optionally) screenshot, and ship one auto-Feedback. Sets the\n * entry's `sentCount` optimistically so a concurrent flush never double-sends,\n * and rolls it back on a failed send so the flush can retry the count update. A\n * `beforeSend` that returns `null` drops the report without transport.\n */\n async function file(fp: string, occurrences: number, opts: FileOptions): Promise<void> {\n const entry = seen.get(fp);\n if (!entry) return;\n const previouslySent = entry.sentCount;\n entry.sentCount = occurrences;\n try {\n const draft = buildContent(fp, occurrences, opts);\n const content = runBeforeSend(draft, {\n hook: config.beforeSend,\n scrub: config.scrub,\n });\n if (!content) return; // dropped at the client scrub choke point — no transport.\n\n // The buffered replay window rides with the rich first report only — the trace\n // flag marks exactly those sends (a flush is a light count update). Since ADR-0027\n // the still is reconstructed from this window downstream; the SDK ships no raster.\n const replay = opts.trace ? (config.replay?.snapshot() ?? null) : null;\n\n const result = await submitReportFn(config.apiUrl, {\n key: config.key,\n identity: config.identity,\n content,\n replay,\n });\n if (!result.ok && entry.sentCount === occurrences) {\n // Held under backpressure, refused, or unreachable — let a later flush retry.\n entry.sentCount = previouslySent;\n }\n } catch {\n if (entry.sentCount === occurrences) entry.sentCount = previouslySent;\n // The error path must never throw into the host page.\n }\n }\n\n /** Handle one distilled error: dedup → burst limiter → session cap → file. */\n function handle(extracted: ExtractedError): void {\n const fp = computeFingerprint(extracted.type, extracted.value, extracted.stack);\n const existing = seen.get(fp);\n if (existing) {\n // Dedup: one Feedback per fingerprint per session; count locally, flush later.\n existing.count += 1;\n existing.lastAt = now();\n return;\n }\n if (!bucket.take()) {\n dropped += 1; // burst limiter\n return;\n }\n if (seen.size >= maxDistinct) {\n dropped += 1; // per-session cap — keep only the local dropped-count\n return;\n }\n const at = now();\n seen.set(fp, {\n count: 1,\n firstAt: at,\n lastAt: at,\n sentCount: 0,\n // Parsed once per fingerprint, from the first firing's stack (#117) — the\n // wire shape symbolication consumes, scrubbed like every captured URL.\n frames: extractStructuredFrames(extracted.stack),\n });\n // The failing error joins the trace so the lead-up and the failure both show,\n // carrying a causal pointer to the ids of the entries that preceded the throw.\n try {\n const causedBy = precedingIds(config.buffer?.snapshot());\n config.buffer?.add(errorCrumb(extracted.original, at, causedBy));\n } catch {\n /* capture must never throw into the host page */\n }\n void file(fp, 1, { trace: true });\n }\n\n const onError = (event: Event): void => {\n try {\n const extracted = extractFromErrorEvent(event);\n if (extracted) handle(extracted);\n } catch {\n /* never throw into the host page */\n }\n };\n\n const onRejection = (event: Event): void => {\n try {\n const extracted = extractFromRejectionEvent(event);\n if (extracted) handle(extracted);\n } catch {\n /* never throw into the host page */\n }\n };\n\n /** Flush the final occurrence count of every fingerprint that grew since its send. */\n const flush = (): void => {\n try {\n for (const [fp, entry] of seen) {\n if (entry.count > entry.sentCount) {\n void file(fp, entry.count, { trace: false });\n }\n }\n } catch {\n /* best-effort on unload */\n }\n };\n\n const onVisibility = (): void => {\n if (doc?.visibilityState === \"hidden\") flush();\n };\n\n win.addEventListener(\"error\", onError, true);\n win.addEventListener(\"unhandledrejection\", onRejection, true);\n win.addEventListener(\"pagehide\", flush);\n doc?.addEventListener(\"visibilitychange\", onVisibility);\n\n return {\n destroy: () => {\n win.removeEventListener(\"error\", onError, true);\n win.removeEventListener(\"unhandledrejection\", onRejection, true);\n win.removeEventListener(\"pagehide\", flush);\n doc?.removeEventListener(\"visibilitychange\", onVisibility);\n },\n droppedCount: () => dropped,\n };\n}\n","/**\n * The Public Reporter's stable, first-party anonymous id.\n *\n * When the host site does not supply its own identity, the SDK establishes a\n * per-browser id and persists it, so repeated boots from the same browser are one\n * Reporter (the server counts distinct Reporters by it). Persistence is\n * best-effort: if storage is unavailable (private mode, blocked cookies), we fall\n * back to an ephemeral id rather than throw — the SDK must never disturb the host\n * page.\n */\n\nconst STORAGE_KEY = \"fixback.anonymousId\";\n\n/** A random id: a UUID where the platform offers one, else a compact fallback. */\nfunction generateId(): string {\n const c: Crypto | undefined = globalThis.crypto;\n if (c && typeof c.randomUUID === \"function\") return c.randomUUID();\n return `fb-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n/** Return this browser's anonymous id, creating and persisting one on first use. */\nexport function ensureAnonymousId(): string {\n try {\n const store = globalThis.localStorage;\n const existing = store.getItem(STORAGE_KEY);\n if (existing) return existing;\n const id = generateId();\n store.setItem(STORAGE_KEY, id);\n return id;\n } catch {\n // Storage blocked or absent — an ephemeral id keeps this boot working.\n return generateId();\n }\n}\n","/**\n * Invite redemption & reporter identity (spec §F).\n *\n * The zero-integration path for an invited tester: detect an invite token on the\n * page (`?fixback_invite=<token>`) or an explicit `redeem()` call, read the\n * Invite's public status, and — on confirmation — redeem it into a persisted\n * `reporterId` the SDK thereafter presents as an identity input.\n *\n * This module is the wire + storage half (pure enough to unit-test directly): the\n * two invite endpoints, the localStorage persistence scoped by publishable key,\n * and the URL token detection / one-time consumption. The onboarding modal is\n * `onboarding.ts`; `init` wires the two together.\n *\n * Like `boot.ts`, the wire types are a **vendored** slice of the server contract\n * (`apps/api/src/invites/invite-redemption.controller.ts`) — the SDK never imports\n * the private server package. Keep them in lock-step with that controller.\n */\n\nimport type { ReporterTier } from \"./boot\";\n\n/** The Invite's shape. Mirrors the server's `InviteKind`. */\nexport type InviteKind = \"targeted\" | \"shared\";\n\n/** The dead/unknown states a status or redeem read can resolve to. */\nexport type InviteDeadStatus = \"revoked\" | \"expired\" | \"exhausted\" | \"not_found\";\n\n/**\n * The public status of an Invite (`GET /api/invites/:token`). A live (`pending`)\n * Invite reveals the minimal facts the onboarding modal needs — the Project, the\n * Invite's shape, and the **server-derived** tier the redemption would grant; a\n * dead or unknown token reveals only its state.\n */\nexport type InviteStatusAnswer =\n | {\n readonly status: \"pending\";\n readonly projectId: string;\n readonly kind: InviteKind;\n readonly tier: ReporterTier;\n }\n | { readonly status: InviteDeadStatus };\n\n/**\n * The result of redeeming an Invite (`POST /api/invites/:token/redeem`): the\n * minted Reporter (its handle + server-derived tier + Project), or why it was\n * refused.\n */\nexport type RedeemAnswer =\n | {\n readonly status: \"redeemed\";\n readonly reporterId: string;\n readonly tier: ReporterTier;\n readonly projectId: string;\n }\n | { readonly status: InviteDeadStatus };\n\n/**\n * The self-provided display fields captured in the onboarding modal. They ride\n * along as a Reporter's chosen name / email — **never** a trust signal (the tier\n * is always server-derived, spec §F).\n */\nexport interface ReporterDisplay {\n readonly name?: string;\n readonly email?: string;\n}\n\n/** A persisted redeemed Reporter: the server handle plus the display fields. */\nexport interface StoredReporter extends ReporterDisplay {\n readonly reporterId: string;\n}\n\n/** The URL query parameter that carries an invite token. */\nexport const INVITE_QUERY_PARAM = \"fixback_invite\";\n\n/** localStorage namespace for a redeemed Reporter, scoped by publishable key. */\nconst REPORTER_STORAGE_PREFIX = \"fixback:reporter:\";\n\n// ---------------------------------------------------------------------------\n// URL token detection & one-time consumption\n// ---------------------------------------------------------------------------\n\n/**\n * Read the invite token from a page URL's `?fixback_invite=` param. Returns the\n * token, or `null` when absent, empty, or the URL cannot be parsed — never throws.\n */\nexport function readInviteToken(href: string): string | null {\n try {\n const token = new URL(href).searchParams.get(INVITE_QUERY_PARAM);\n return token && token.length > 0 ? token : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Strip the invite token from the address bar (one-time consumption, spec §F) via\n * `history.replaceState`, so a reload or a shared link cannot re-trigger — or\n * re-consume — an already-redeemed Invite. Other params, the path, and the hash\n * are preserved. Best-effort: it never throws into the host page.\n */\nexport function stripInviteToken(win: Window): void {\n try {\n const url = new URL(win.location.href);\n if (!url.searchParams.has(INVITE_QUERY_PARAM)) return;\n url.searchParams.delete(INVITE_QUERY_PARAM);\n const query = url.searchParams.toString();\n const next = `${url.pathname}${query ? `?${query}` : \"\"}${url.hash}`;\n win.history.replaceState(win.history.state, \"\", next);\n } catch {\n // Never disturb the host page over a cosmetic URL rewrite.\n }\n}\n\n// ---------------------------------------------------------------------------\n// Persistence (scoped by publishable key)\n// ---------------------------------------------------------------------------\n\nfunction reporterStorageKey(key: string): string {\n return `${REPORTER_STORAGE_PREFIX}${key}`;\n}\n\n/** The ambient localStorage, or `null` when it is absent or blocked. */\nfunction safeStorage(): Storage | null {\n try {\n return globalThis.localStorage ?? null;\n } catch {\n return null;\n }\n}\n\n/** A trimmed non-empty string, or `undefined` — so blanks are never stored. */\nfunction cleanField(value: string | undefined): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\n/**\n * Persist a redeemed Reporter for `key`. The `reporterId` is the identity the SDK\n * presents on later boots; the display name / email ride along as chosen fields.\n * Best-effort — storage being unavailable (private mode) is never fatal.\n */\nexport function persistReporter(\n key: string,\n reporter: StoredReporter,\n store: Storage | null = safeStorage(),\n): void {\n if (!store) return;\n const name = cleanField(reporter.name);\n const email = cleanField(reporter.email);\n const payload: StoredReporter = {\n reporterId: reporter.reporterId,\n ...(name ? { name } : {}),\n ...(email ? { email } : {}),\n };\n try {\n store.setItem(reporterStorageKey(key), JSON.stringify(payload));\n } catch {\n // Storage blocked or full — the redemption still succeeded in this session.\n }\n}\n\n/**\n * Read the redeemed Reporter persisted for `key`, or `null` when none is stored,\n * the record is malformed, or it carries no `reporterId`. Never throws.\n */\nexport function readStoredReporter(\n key: string,\n store: Storage | null = safeStorage(),\n): StoredReporter | null {\n if (!store) return null;\n try {\n const raw = store.getItem(reporterStorageKey(key));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as Partial<StoredReporter>;\n if (typeof parsed?.reporterId !== \"string\" || parsed.reporterId.length === 0) {\n return null;\n }\n const name = cleanField(parsed.name);\n const email = cleanField(parsed.email);\n return {\n reporterId: parsed.reporterId,\n ...(name ? { name } : {}),\n ...(email ? { email } : {}),\n };\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Wire client\n// ---------------------------------------------------------------------------\n\n/** Join an API base URL with the invite status path, tolerating a trailing slash. */\nexport function inviteStatusEndpoint(apiUrl: string, token: string): string {\n return `${apiUrl.replace(/\\/+$/, \"\")}/api/invites/${encodeURIComponent(token)}`;\n}\n\n/** Join an API base URL with the redeem path for a token. */\nexport function redeemEndpoint(apiUrl: string, token: string): string {\n return `${inviteStatusEndpoint(apiUrl, token)}/redeem`;\n}\n\nconst DEAD_STATUSES = new Set<InviteDeadStatus>([\n \"revoked\",\n \"expired\",\n \"exhausted\",\n \"not_found\",\n]);\n\nfunction isTier(value: unknown): value is ReporterTier {\n return value === \"public\" || value === \"invited\" || value === \"internal\";\n}\n\n/** Narrow an unknown JSON body to an {@link InviteStatusAnswer}. */\nfunction isInviteStatusAnswer(value: unknown): value is InviteStatusAnswer {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n if (v.status === \"pending\") {\n return (\n typeof v.projectId === \"string\" &&\n (v.kind === \"targeted\" || v.kind === \"shared\") &&\n isTier(v.tier)\n );\n }\n return typeof v.status === \"string\" && DEAD_STATUSES.has(v.status as InviteDeadStatus);\n}\n\n/** Narrow an unknown JSON body to a {@link RedeemAnswer}. */\nfunction isRedeemAnswer(value: unknown): value is RedeemAnswer {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value as Record<string, unknown>;\n if (v.status === \"redeemed\") {\n return (\n typeof v.reporterId === \"string\" &&\n typeof v.projectId === \"string\" &&\n isTier(v.tier)\n );\n }\n return typeof v.status === \"string\" && DEAD_STATUSES.has(v.status as InviteDeadStatus);\n}\n\nasync function readJson(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return null;\n }\n}\n\n/**\n * Read an Invite's public status. Resolves to the answer, or `null` when Fixback\n * could not be reached or the body was not a recognised answer. The endpoint\n * answers 200 for a live or dead Invite and 404 (with a JSON body) for an unknown\n * token, so the body — not the HTTP status — is what the caller narrows on. Never\n * throws: an outage stays invisible to the host page.\n */\nexport async function fetchInviteStatus(\n apiUrl: string,\n token: string,\n fetchImpl: typeof fetch = fetch,\n): Promise<InviteStatusAnswer | null> {\n let response: Response;\n try {\n response = await fetchImpl(inviteStatusEndpoint(apiUrl, token), {\n method: \"GET\",\n headers: { accept: \"application/json\" },\n });\n } catch {\n return null;\n }\n const body = await readJson(response);\n return isInviteStatusAnswer(body) ? body : null;\n}\n\n/**\n * Redeem an Invite by token, minting and returning a Reporter. Resolves to the\n * answer, or `null` on an unreachable API or an unrecognised body. Never throws.\n */\nexport async function redeemInviteToken(\n apiUrl: string,\n token: string,\n fetchImpl: typeof fetch = fetch,\n): Promise<RedeemAnswer | null> {\n let response: Response;\n try {\n response = await fetchImpl(redeemEndpoint(apiUrl, token), {\n method: \"POST\",\n headers: { accept: \"application/json\" },\n });\n } catch {\n return null;\n }\n const body = await readJson(response);\n return isRedeemAnswer(body) ? body : null;\n}\n","/**\n * The launcher's isolated styles.\n *\n * These live inside the launcher's Shadow DOM (see `launcher.ts`), so nothing\n * here can reach the host page and nothing on the host page can reach in. The\n * token values are **vendored** Signal design tokens — copied from\n * `packages/ui/src/tokens.css` rather than imported, because the SDK must not\n * depend on `@fixback/ui` at runtime (ticket #47). Keep them in sync by value.\n *\n * The launcher is the prototype's polished pill (spec 0003 §A): a bottom-right\n * **Feedback** pill that **hover-peeks**, can be **tucked away** (sliding off\n * behind an edge nub, with a corner hover-zone to bring it back), a first-visit\n * **welcome toast**, and a **reduce-motion** mode that stills the pulse. Every\n * piece — pill, nub, corner zone, welcome toast — lives in this one Shadow DOM.\n *\n * Motion is driven by two host-element attributes the mount toggles:\n * `data-fb-hidden` (tucked away) and `data-fb-peeking` (peeked back on hover);\n * `data-fb-reduce-motion` (or the OS `prefers-reduced-motion`) stills it all.\n */\nexport const LAUNCHER_STYLES = `\n:host {\n /* Vendored Signal tokens (packages/ui/src/tokens.css). */\n --fb-color-accent: #2f6fed;\n --fb-color-accent-hover: #245fd0;\n --fb-color-on-emphasis: #ffffff;\n --fb-color-text: #0f1720;\n /* Inverse (dark) surface for the toasts — Signal --fb-ink-900. */\n --fb-color-surface-inverse: #0f1720;\n --fb-font-sans: \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto,\n Helvetica, Arial, sans-serif;\n\n display: block;\n color: var(--fb-color-text);\n font-family: var(--fb-font-sans);\n font-size: 13px;\n line-height: 1.4;\n -webkit-font-smoothing: antialiased;\n}\n\n/* The pill: Feedback button + divider + tuck control, anchored bottom-right. */\n.fb-launcher {\n position: fixed;\n right: 20px;\n bottom: 20px;\n z-index: 2;\n display: inline-flex;\n align-items: stretch;\n box-sizing: border-box;\n height: 40px;\n margin: 0;\n border-radius: 999px;\n background: var(--fb-color-accent);\n box-shadow:\n 0 6px 18px rgba(15, 23, 32, 0.16),\n 0 1px 2px rgba(15, 23, 32, 0.12);\n transform: translateX(0);\n transition:\n transform 340ms cubic-bezier(0.2, 0.8, 0.3, 1),\n background-color 120ms ease;\n}\n\n.fb-launcher:hover {\n background: var(--fb-color-accent-hover);\n}\n\n.fb-launcher__button {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n box-sizing: border-box;\n height: 100%;\n margin: 0;\n padding: 0 6px 0 16px;\n border: 0;\n background: transparent;\n color: var(--fb-color-on-emphasis);\n font-family: inherit;\n font-size: 13px;\n font-weight: 600;\n letter-spacing: 0.01em;\n cursor: pointer;\n}\n\n.fb-launcher__button:focus-visible,\n.fb-launcher__tuck:focus-visible {\n outline: 2px solid var(--fb-color-on-emphasis);\n outline-offset: -3px;\n border-radius: 999px;\n}\n\n.fb-launcher__icon {\n display: block;\n flex: none;\n width: 16px;\n height: 16px;\n}\n\n.fb-launcher__label {\n white-space: nowrap;\n}\n\n.fb-launcher__divider {\n width: 1px;\n margin: 9px 0;\n flex: none;\n background: rgba(255, 255, 255, 0.28);\n}\n\n.fb-launcher__tuck {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: 32px;\n height: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: rgba(255, 255, 255, 0.82);\n cursor: pointer;\n}\n\n.fb-launcher__tuck:hover {\n color: var(--fb-color-on-emphasis);\n}\n\n.fb-launcher__tuck-icon {\n display: block;\n width: 14px;\n height: 14px;\n transition: transform 340ms cubic-bezier(0.2, 0.8, 0.3, 1);\n}\n\n/* Tucked away: mirror the chevron so it points left — back into view. */\n:host([data-fb-hidden]) .fb-launcher__tuck-icon {\n transform: scaleX(-1);\n}\n\n/* The corner hover-zone that peeks a tucked launcher back — inert until tucked,\n * so it never swallows the host page's own bottom-right clicks. */\n.fb-launcher__peekzone {\n position: fixed;\n right: 0;\n bottom: 0;\n z-index: 1;\n width: 160px;\n height: 160px;\n pointer-events: none;\n}\n\n/* The edge nub: the visible re-reveal affordance, hidden until tucked. */\n.fb-launcher__nub {\n position: fixed;\n right: 0;\n bottom: 22px;\n z-index: 2;\n width: 13px;\n height: 42px;\n border-radius: 9px 0 0 9px;\n background: var(--fb-color-accent);\n box-shadow: -6px 5px 18px rgba(47, 111, 237, 0.4);\n cursor: pointer;\n opacity: 0;\n transform: translateX(10px);\n pointer-events: none;\n transition:\n opacity 220ms ease,\n transform 220ms ease;\n}\n\n/* Tucked and not peeking: slide the pill off, reveal the nub, arm the zone. */\n:host([data-fb-hidden]:not([data-fb-peeking])) .fb-launcher {\n transform: translateX(calc(100% + 30px));\n}\n\n:host([data-fb-hidden]:not([data-fb-peeking])) .fb-launcher__nub {\n opacity: 1;\n transform: none;\n pointer-events: auto;\n}\n\n:host([data-fb-hidden]) .fb-launcher__peekzone {\n pointer-events: auto;\n}\n\n/* The first-visit welcome toast, above the pill. */\n.fb-launcher__welcome {\n position: fixed;\n right: 20px;\n bottom: 70px;\n z-index: 5;\n box-sizing: border-box;\n max-width: 210px;\n padding: 9px 13px;\n color: #fff;\n font-size: 12px;\n line-height: 1.45;\n background: var(--fb-color-surface-inverse);\n border-radius: 10px;\n box-shadow: 0 12px 30px rgba(15, 40, 70, 0.32);\n animation: fbToast 300ms ease both;\n}\n\n.fb-launcher__welcome strong {\n color: #8fc0ff;\n font-weight: 600;\n}\n\n/* The pulse that draws the eye while the welcome shows. */\n.fb-launcher--pulse {\n animation: fbPulse 1.8s ease-in-out 2;\n}\n\n@keyframes fbPulse {\n 0%,\n 100% {\n box-shadow:\n 0 6px 18px rgba(15, 23, 32, 0.16),\n 0 0 0 0 rgba(47, 111, 237, 0.45);\n }\n 50% {\n box-shadow:\n 0 6px 18px rgba(15, 23, 32, 0.16),\n 0 0 0 12px rgba(47, 111, 237, 0);\n }\n}\n\n@keyframes fbToast {\n from {\n opacity: 0;\n transform: translateY(14px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n}\n\n/* Reduce motion — the explicit opt-in and the OS setting both still it all. */\n:host([data-fb-reduce-motion]) .fb-launcher,\n:host([data-fb-reduce-motion]) .fb-launcher__nub,\n:host([data-fb-reduce-motion]) .fb-launcher__tuck-icon {\n transition: none;\n}\n\n:host([data-fb-reduce-motion]) .fb-launcher--pulse,\n:host([data-fb-reduce-motion]) .fb-launcher__welcome {\n animation: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fb-launcher,\n .fb-launcher__nub,\n .fb-launcher__tuck-icon {\n transition: none;\n }\n .fb-launcher--pulse,\n .fb-launcher__welcome {\n animation: none;\n }\n}\n`;\n","import { LAUNCHER_STYLES } from \"./styles\";\n\n/** Marks the SDK's host element in the light DOM, so it is findable and unique. */\nexport const ROOT_ATTRIBUTE = \"data-fixback-root\";\n\n/**\n * Dispatched from the host element when the launcher is activated. The report\n * overlay this opens is wired in `init`; this event is the seam it hangs off. It\n * is `composed` so host-page listeners outside the Shadow DOM can hear it.\n */\nexport const LAUNCH_EVENT = \"fixback:launch\";\n\n/** Storage-key namespace for the first-visit welcome flag, scoped per key. */\nconst WELCOME_STORAGE_PREFIX = \"fixback:welcomed:\";\n\n/** How long the welcome toast (and its pulse) linger before self-dismissing. */\nconst WELCOME_MS = 5000;\n/** Grace period before a peeked-open launcher tucks itself back on pointer-out. */\nconst PEEK_OUT_MS = 280;\n\nconst FEEDBACK_ICON =\n '<svg class=\"fb-launcher__icon\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\">' +\n '<path fill=\"currentColor\" d=\"M3.25 2h9.5A1.25 1.25 0 0 1 14 3.25v6.5A1.25 1.25 0 0 1 12.75 11H7.6l-3.19 2.55A.6.6 0 0 1 3.4 13.1V11h-.15A1.25 1.25 0 0 1 2 9.75v-6.5A1.25 1.25 0 0 1 3.25 2Z\"/>' +\n \"</svg>\";\n\n/**\n * The tuck control's chevron. It points **right** — the direction the pill tucks\n * away toward — and the stylesheet mirrors it to point **left** (back into view)\n * while the launcher is tucked, so the one control reads as a direction toggle.\n */\nconst TUCK_ICON =\n '<svg class=\"fb-launcher__tuck-icon\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">' +\n '<path d=\"M6 4l4 4-4 4\"/>' +\n \"</svg>\";\n\n/** Options that shape a mounted launcher. */\nexport interface LauncherOptions {\n /**\n * The Project's publishable key. Scopes the first-visit welcome flag so the\n * welcome greets once per key per browser.\n */\n readonly key?: string;\n /**\n * Still the pulse and motion. An explicit opt-in that complements the OS-level\n * `prefers-reduced-motion` (which the styles already honour on their own).\n */\n readonly reduceMotion?: boolean;\n}\n\n/** A mounted launcher and the handle needed to remove it again. */\nexport interface Launcher {\n readonly host: HTMLElement;\n /** Clears the launcher's pending timers. Called by {@link unmountLauncher}. */\n readonly dispose: () => void;\n}\n\n/**\n * Read the first-visit welcome flag and mark it seen, returning whether the\n * welcome should greet now. Never throws: when storage is unavailable (SSR,\n * sandboxed frame, blocked cookies) it greets without persisting.\n */\nfunction claimFirstVisitWelcome(win: Window | null, key: string | undefined): boolean {\n const flag = WELCOME_STORAGE_PREFIX + (key ?? \"default\");\n try {\n const storage = win?.localStorage;\n if (!storage) return true;\n if (storage.getItem(flag) === \"1\") return false;\n storage.setItem(flag, \"1\");\n return true;\n } catch {\n return true;\n }\n}\n\n/**\n * Mount the launcher into `target` (typically `document.body`). Everything the\n * launcher draws — the **Feedback** pill, its **tuck** control, the edge **nub**\n * and corner **hover-zone** that peek it back, and the first-visit **welcome**\n * toast — lives inside one open Shadow DOM, so its styles are fully isolated\n * from the host page and vice-versa. The host element is\n * fixed-positioned and out of flow, so mounting never shifts the host page's\n * layout. Only one launcher can exist at a time — an earlier one is removed first.\n *\n * Tuck/peek state is expressed as `data-fb-hidden` / `data-fb-peeking` attributes\n * on the host, which the Shadow DOM stylesheet animates; `reduceMotion` sets\n * `data-fb-reduce-motion`, which (with the OS `prefers-reduced-motion`) stills it.\n */\nexport function mountLauncher(\n target: HTMLElement,\n options: LauncherOptions = {},\n): Launcher {\n const doc = target.ownerDocument;\n const win = doc.defaultView;\n\n const previous = doc.querySelector(`[${ROOT_ATTRIBUTE}]`);\n if (previous) previous.remove();\n\n const host = doc.createElement(\"div\");\n host.setAttribute(ROOT_ATTRIBUTE, \"\");\n // Positioning is inlined on the host (not in the Shadow DOM sheet) so it holds\n // even against a hostile host-page reset, and so the launcher is anchored to\n // the viewport without ever participating in the page's flow.\n host.style.cssText =\n \"position:fixed;right:20px;bottom:20px;z-index:2147483000;margin:0;padding:0;border:0;\";\n if (options.reduceMotion) host.setAttribute(\"data-fb-reduce-motion\", \"true\");\n\n const shadow = host.attachShadow({ mode: \"open\" });\n\n const style = doc.createElement(\"style\");\n style.textContent = LAUNCHER_STYLES;\n shadow.appendChild(style);\n\n // --- The pill: Feedback button + divider + tuck control ---\n const pill = doc.createElement(\"div\");\n pill.className = \"fb-launcher\";\n\n const button = doc.createElement(\"button\");\n button.type = \"button\";\n button.className = \"fb-launcher__button\";\n button.setAttribute(\"aria-haspopup\", \"dialog\");\n button.setAttribute(\"aria-label\", \"Give feedback\");\n button.innerHTML = `${FEEDBACK_ICON}<span class=\"fb-launcher__label\">Feedback</span>`;\n button.addEventListener(\"click\", () => {\n host.dispatchEvent(\n new CustomEvent(LAUNCH_EVENT, { bubbles: true, composed: true }),\n );\n });\n\n const divider = doc.createElement(\"span\");\n divider.className = \"fb-launcher__divider\";\n divider.setAttribute(\"aria-hidden\", \"true\");\n\n const tuck = doc.createElement(\"button\");\n tuck.type = \"button\";\n tuck.className = \"fb-launcher__tuck\";\n tuck.setAttribute(\"data-fb-tuck\", \"\");\n tuck.setAttribute(\"aria-label\", \"Hide feedback button\");\n tuck.title = \"Tuck away\";\n tuck.innerHTML = TUCK_ICON;\n\n pill.append(button, divider, tuck);\n\n // --- The peek chrome: corner hover-zone + edge nub ---\n const peekzone = doc.createElement(\"div\");\n peekzone.className = \"fb-launcher__peekzone\";\n peekzone.setAttribute(\"aria-hidden\", \"true\");\n\n const nub = doc.createElement(\"div\");\n nub.className = \"fb-launcher__nub\";\n nub.setAttribute(\"role\", \"button\");\n nub.setAttribute(\"tabindex\", \"0\");\n nub.setAttribute(\"aria-label\", \"Show feedback button\");\n\n shadow.append(pill, peekzone, nub);\n\n // --- Tuck / peek / welcome state ---\n let hidden = false;\n let peeking = false;\n let peekTimer: ReturnType<typeof setTimeout> | undefined;\n let welcomeTimer: ReturnType<typeof setTimeout> | undefined;\n let welcome: HTMLElement | undefined;\n\n const syncState = (): void => {\n if (hidden) host.setAttribute(\"data-fb-hidden\", \"true\");\n else host.removeAttribute(\"data-fb-hidden\");\n if (hidden && peeking) host.setAttribute(\"data-fb-peeking\", \"true\");\n else host.removeAttribute(\"data-fb-peeking\");\n // The tuck control is a toggle: label it for the direction it will move next.\n tuck.setAttribute(\n \"aria-label\",\n hidden ? \"Show feedback button\" : \"Hide feedback button\",\n );\n tuck.title = hidden ? \"Bring back\" : \"Tuck away\";\n };\n\n const dismissWelcome = (): void => {\n if (welcomeTimer !== undefined) {\n clearTimeout(welcomeTimer);\n welcomeTimer = undefined;\n }\n pill.classList.remove(\"fb-launcher--pulse\");\n welcome?.remove();\n welcome = undefined;\n };\n\n const peekIn = (): void => {\n if (peekTimer !== undefined) {\n clearTimeout(peekTimer);\n peekTimer = undefined;\n }\n if (!peeking) {\n peeking = true;\n syncState();\n }\n };\n\n const peekOut = (): void => {\n if (peekTimer !== undefined) clearTimeout(peekTimer);\n peekTimer = setTimeout(() => {\n peekTimer = undefined;\n peeking = false;\n syncState();\n }, PEEK_OUT_MS);\n };\n\n // Hovering the pill, the nub, or the corner zone all keep the launcher peeked.\n for (const el of [pill, peekzone, nub]) {\n el.addEventListener(\"mouseenter\", peekIn);\n el.addEventListener(\"mouseleave\", peekOut);\n }\n\n const showLauncher = (): void => {\n if (peekTimer !== undefined) {\n clearTimeout(peekTimer);\n peekTimer = undefined;\n }\n hidden = false;\n peeking = false;\n syncState();\n };\n\n const hideLauncher = (): void => {\n dismissWelcome();\n hidden = true;\n peeking = false;\n syncState();\n };\n\n // The tuck control toggles: it tucks the launcher away, and — once tucked and\n // peeked back into reach on hover — brings it fully back, mirroring the chevron.\n tuck.addEventListener(\"click\", () => {\n if (hidden) showLauncher();\n else hideLauncher();\n });\n\n // The nub is a real re-reveal control for pointers that can't hover (touch,\n // keyboard): clicking or Enter/Space brings the launcher fully back.\n nub.addEventListener(\"click\", showLauncher);\n nub.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") {\n event.preventDefault();\n showLauncher();\n }\n });\n\n // --- First-visit welcome + its pulse ---\n if (claimFirstVisitWelcome(win, options.key)) {\n welcome = doc.createElement(\"div\");\n welcome.className = \"fb-launcher__welcome\";\n welcome.setAttribute(\"role\", \"status\");\n welcome.innerHTML =\n \"You're all set — tap <strong>Feedback</strong> any time to report something.\";\n shadow.appendChild(welcome);\n if (!options.reduceMotion) pill.classList.add(\"fb-launcher--pulse\");\n welcomeTimer = setTimeout(dismissWelcome, WELCOME_MS);\n }\n\n target.appendChild(host);\n\n const dispose = (): void => {\n if (peekTimer !== undefined) clearTimeout(peekTimer);\n if (welcomeTimer !== undefined) clearTimeout(welcomeTimer);\n };\n\n return { host, dispose };\n}\n\n/** Remove a mounted launcher. Safe to call more than once. */\nexport function unmountLauncher(launcher: Launcher): void {\n launcher.dispose();\n launcher.host.remove();\n}\n","/**\n * Styles for the invite onboarding modal (spec §F) — the Signal look of the\n * frozen Reporter prototype (`docs/design/Fixback Reporter.dc.html`), scoped to\n * the modal's own Shadow DOM so the host page is never touched and never touches\n * it. Tokens mirror `overlay-styles.ts` so launcher, overlay, and modal read as\n * one system.\n */\nexport const ONBOARDING_STYLES = `\n:host {\n --fb-color-accent: #2f6fed;\n --fb-color-accent-hover: #245fd0;\n --fb-color-on-emphasis: #ffffff;\n --fb-color-ink: #0f1720;\n --fb-color-text: #1a2530;\n --fb-color-muted: #5a6875;\n --fb-color-faint: #9aa7b2;\n --fb-color-hint: #b7c1cb;\n --fb-color-border: #dce3ea;\n --fb-color-border-soft: #e6ebf0;\n --fb-color-surface: #ffffff;\n --fb-color-card: #f6f8fa;\n --fb-color-accent-bg: #eaf1fe;\n --fb-color-success: #2f9e5b;\n --fb-font-sans: \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto,\n Helvetica, Arial, sans-serif;\n --fb-font-mono: \"IBM Plex Mono\", ui-monospace, \"SFMono-Regular\", Menlo, Consolas,\n monospace;\n all: initial;\n}\n\n*, *::before, *::after { box-sizing: border-box; }\n\n.fb-ob-backdrop {\n position: fixed;\n inset: 0;\n z-index: 2147483010;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n background: rgba(15, 23, 32, 0.55);\n backdrop-filter: blur(3px);\n font-family: var(--fb-font-sans);\n color: var(--fb-color-text);\n animation: fb-ob-fade 0.25s ease both;\n}\n\n.fb-ob-panel {\n width: 400px;\n max-width: 100%;\n background: var(--fb-color-surface);\n border-radius: 16px;\n box-shadow: 0 30px 70px rgba(15, 40, 70, 0.4);\n overflow: hidden;\n animation: fb-ob-pop 0.32s cubic-bezier(0.2, 0.8, 0.3, 1) both;\n}\n\n.fb-ob-head {\n padding: 22px 24px 0;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.fb-ob-mark {\n width: 22px;\n height: 22px;\n border-radius: 6px;\n background: var(--fb-color-accent);\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.fb-ob-mark::after {\n content: \"\";\n width: 7px;\n height: 7px;\n border-radius: 2px;\n background: #fff;\n}\n.fb-ob-brand { font-size: 15px; font-weight: 600; color: var(--fb-color-ink); }\n.fb-ob-chip {\n margin-left: auto;\n font-family: var(--fb-font-mono);\n font-size: 10px;\n color: #8a97a3;\n border: 1px solid var(--fb-color-border-soft);\n border-radius: 6px;\n padding: 2px 7px;\n}\n\n.fb-ob-body { padding: 16px 24px 8px; }\n.fb-ob-title {\n font-size: 19px;\n font-weight: 700;\n color: var(--fb-color-ink);\n letter-spacing: -0.01em;\n}\n.fb-ob-lede {\n font-size: 13.5px;\n color: var(--fb-color-muted);\n line-height: 1.5;\n margin: 7px 0 0;\n}\n.fb-ob-lede strong { color: var(--fb-color-text); }\n\n.fb-ob-card {\n margin: 16px 0;\n padding: 13px 14px;\n background: var(--fb-color-card);\n border: 1px solid var(--fb-color-border-soft);\n border-radius: 10px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n}\n.fb-ob-row { display: flex; align-items: center; gap: 10px; }\n.fb-ob-row + .fb-ob-row {\n border-top: 1px solid #eef2f6;\n padding-top: 10px;\n}\n.fb-ob-rowlabel {\n font-family: var(--fb-font-mono);\n font-size: 10px;\n color: var(--fb-color-faint);\n width: 70px;\n flex: none;\n}\n.fb-ob-site { font-size: 13px; color: var(--fb-color-text); font-weight: 500; }\n.fb-ob-tier {\n font-size: 11px;\n font-weight: 600;\n color: var(--fb-color-accent);\n background: var(--fb-color-accent-bg);\n padding: 3px 9px;\n border-radius: 6px;\n}\n.fb-ob-tiernote { font-size: 11.5px; color: #8a97a3; }\n\n.fb-ob-fieldlabel {\n display: block;\n font-family: var(--fb-font-mono);\n font-size: 10px;\n letter-spacing: 0.05em;\n text-transform: uppercase;\n color: var(--fb-color-faint);\n margin-bottom: 6px;\n}\n.fb-ob-fields { display: flex; gap: 8px; }\n.fb-ob-input {\n height: 38px;\n padding: 0 12px;\n border: 1px solid var(--fb-color-border);\n border-radius: 9px;\n font-family: inherit;\n font-size: 13px;\n color: var(--fb-color-text);\n outline: none;\n min-width: 0;\n}\n.fb-ob-input:focus { border-color: var(--fb-color-accent); }\n.fb-ob-name { flex: 1; }\n.fb-ob-email { flex: 1.3; font-family: var(--fb-font-mono); font-size: 12.5px; color: var(--fb-color-muted); }\n\n.fb-ob-privacy {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n margin-top: 14px;\n font-size: 11.5px;\n color: #8a97a3;\n line-height: 1.5;\n}\n.fb-ob-privacy svg { flex: none; margin-top: 1px; }\n.fb-ob-privacy strong { color: var(--fb-color-muted); }\n\n.fb-ob-foot { padding: 16px 24px 22px; }\n.fb-ob-confirm {\n width: 100%;\n height: 44px;\n border: 0;\n border-radius: 11px;\n background: var(--fb-color-accent);\n color: var(--fb-color-on-emphasis);\n font-family: inherit;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n}\n.fb-ob-confirm:hover { background: var(--fb-color-accent-hover); }\n.fb-ob-confirm:disabled { opacity: 0.6; cursor: default; }\n\n@keyframes fb-ob-fade { from { opacity: 0; } to { opacity: 1; } }\n@keyframes fb-ob-pop {\n from { opacity: 0; transform: translateY(8px) scale(0.98); }\n to { opacity: 1; transform: none; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fb-ob-backdrop, .fb-ob-panel { animation: none; }\n}\n`;\n","/**\n * The invite onboarding modal (spec §F) — the SDK-rendered redemption screen an\n * invited tester sees when a page carries an invite token. It shows the site\n * they were invited to, the **server-derived** access tier the redemption grants,\n * a private-by-default note, and a \"Continue as\" name / email, then confirms.\n *\n * Built to the frozen Signal Reporter prototype\n * (`docs/design/Fixback Reporter.dc.html`). It mounts lazily inside its own open\n * Shadow DOM so the host page is fully isolated, and — like the launcher and\n * overlay — never throws into the host page. It renders only data the SDK\n * truthfully holds: the site's own origin and the server-derived tier. The name /\n * email are **self-provided display fields**, never a trust signal (§F).\n */\n\nimport type { ReporterTier } from \"./boot\";\nimport type { ReporterDisplay } from \"./invite\";\nimport { ONBOARDING_STYLES } from \"./onboarding-styles\";\n\n/** Marks the modal's host element in the light DOM, so it is findable and unique. */\nexport const ONBOARDING_ATTRIBUTE = \"data-fixback-onboard\";\n\n/** The access badge label for each tier (the redemption grants invited or internal). */\nconst TIER_LABEL: Record<ReporterTier, string> = {\n invited: \"Invited tester\",\n internal: \"Internal\",\n public: \"Public\",\n};\n\n/** A short, plain-language note on what the tier means for a submission. */\nconst TIER_NOTE: Record<ReporterTier, string> = {\n invited: \"reviewed before it ships\",\n internal: \"ships straight through\",\n public: \"tracked, not auto-shipped\",\n};\n\nconst SHIELD_ICON =\n '<svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"#2f9e5b\" stroke-width=\"1.5\" aria-hidden=\"true\">' +\n '<path d=\"M8 1.8 13.5 4v3.5c0 3.6-2.4 5.6-5.5 6.7C4.9 13.1 2.5 11.1 2.5 7.5V4z\"/>' +\n '<path d=\"M5.8 8 7.3 9.5 10.3 6.2\"/></svg>';\n\n/** Configuration for {@link createOnboardingModal}. */\nexport interface OnboardingConfig {\n /** The site the tester was invited to — its origin (`window.location.host`). */\n readonly origin: string;\n /** The **server-derived** tier the redemption grants (from the invite status). */\n readonly tier: ReporterTier;\n /** Prefill the Continue-as fields from a previously stored display identity. */\n readonly defaults?: ReporterDisplay;\n /** Called with the self-provided display fields when the tester confirms. */\n readonly onConfirm: (display: ReporterDisplay) => void;\n /** Where to mount the modal host. Defaults to `document.body`. */\n readonly target?: HTMLElement;\n /** The document to build in. Defaults to the target's owner document. */\n readonly doc?: Document;\n}\n\n/** A mounted onboarding modal. */\nexport interface OnboardingModal {\n destroy(): void;\n readonly host: HTMLElement;\n}\n\n/** Minimal typed `createElement` helper — attributes plus string / node children. */\nfunction h<K extends keyof HTMLElementTagNameMap>(\n doc: Document,\n tag: K,\n props: Partial<Record<string, string>> = {},\n children: ReadonlyArray<Node | string> = [],\n): HTMLElementTagNameMap[K] {\n const node = doc.createElement(tag);\n for (const [name, value] of Object.entries(props)) {\n if (value !== undefined) node.setAttribute(name, value);\n }\n for (const child of children) {\n node.appendChild(typeof child === \"string\" ? doc.createTextNode(child) : child);\n }\n return node;\n}\n\n/** A trimmed, non-empty field or `undefined` — display fields are never blanks. */\nfunction field(value: string): string | undefined {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\n/**\n * Render the onboarding modal into `target` (default `document.body`) and return a\n * handle to remove it. Confirming reads the name / email, fires `onConfirm` once\n * (further clicks are ignored while the caller redeems), and leaves teardown to\n * the caller so it can strip the token and mount the launcher first.\n */\nexport function createOnboardingModal(config: OnboardingConfig): OnboardingModal {\n const target = config.target ?? document.body;\n const doc = config.doc ?? target.ownerDocument;\n\n // Only one onboarding modal can exist at a time — an earlier one is removed\n // first, so a repeated trigger never stacks two dialogs.\n doc.querySelector(`[${ONBOARDING_ATTRIBUTE}]`)?.remove();\n\n const host = h(doc, \"div\", { [ONBOARDING_ATTRIBUTE]: \"\" });\n const shadow = host.attachShadow({ mode: \"open\" });\n\n const style = doc.createElement(\"style\");\n style.textContent = ONBOARDING_STYLES;\n shadow.appendChild(style);\n\n // Header — brand + \"invite link\" chip.\n const head = h(doc, \"div\", { class: \"fb-ob-head\" }, [\n h(doc, \"span\", { class: \"fb-ob-mark\" }),\n h(doc, \"span\", { class: \"fb-ob-brand\" }, [\"Fixback\"]),\n h(doc, \"span\", { class: \"fb-ob-chip\" }, [\"invite link\"]),\n ]);\n\n // Lede — names the site by its origin (no inviter identity is fetched or shown).\n const lede = h(doc, \"p\", { class: \"fb-ob-lede\" }, [\n \"You've been invited to give feedback on \",\n h(doc, \"strong\", {}, [config.origin]),\n \". Point, mark up, send.\",\n ]);\n\n // Info card — the site and the server-derived access tier.\n const siteRow = h(doc, \"div\", { class: \"fb-ob-row\" }, [\n h(doc, \"span\", { class: \"fb-ob-rowlabel\" }, [\"SITE\"]),\n h(doc, \"span\", { class: \"fb-ob-site\" }, [config.origin]),\n ]);\n const accessRow = h(doc, \"div\", { class: \"fb-ob-row\" }, [\n h(doc, \"span\", { class: \"fb-ob-rowlabel\" }, [\"ACCESS\"]),\n h(doc, \"span\", { class: \"fb-ob-tier\" }, [TIER_LABEL[config.tier]]),\n h(doc, \"span\", { class: \"fb-ob-tiernote\" }, [TIER_NOTE[config.tier]]),\n ]);\n const card = h(doc, \"div\", { class: \"fb-ob-card\" }, [siteRow, accessRow]);\n\n // Continue-as fields.\n const nameInput = h(doc, \"input\", {\n class: \"fb-ob-input fb-ob-name\",\n type: \"text\",\n \"aria-label\": \"Name\",\n placeholder: \"Name\",\n });\n const emailInput = h(doc, \"input\", {\n class: \"fb-ob-input fb-ob-email\",\n type: \"email\",\n \"aria-label\": \"Email\",\n placeholder: \"email@example.com\",\n });\n if (config.defaults?.name) nameInput.value = config.defaults.name;\n if (config.defaults?.email) emailInput.value = config.defaults.email;\n\n const privacy = h(doc, \"div\", { class: \"fb-ob-privacy\" });\n const icon = h(doc, \"span\");\n icon.innerHTML = SHIELD_ICON;\n privacy.appendChild(icon.firstChild ?? doc.createTextNode(\"\"));\n privacy.appendChild(\n h(doc, \"span\", {}, [\n h(doc, \"strong\", {}, [\"Private by default.\"]),\n \" Anything you type is masked before it leaves your browser.\",\n ]),\n );\n\n const body = h(doc, \"div\", { class: \"fb-ob-body\" }, [\n h(doc, \"div\", { class: \"fb-ob-title\" }, [\"You're invited to give feedback\"]),\n lede,\n card,\n h(doc, \"label\", { class: \"fb-ob-fieldlabel\", for: \"fb-ob-name-input\" }, [\"Continue as\"]),\n h(doc, \"div\", { class: \"fb-ob-fields\" }, [nameInput, emailInput]),\n privacy,\n ]);\n nameInput.id = \"fb-ob-name-input\";\n\n const confirm = h(doc, \"button\", { type: \"button\", class: \"fb-ob-confirm\" }, [\n \"Start giving feedback\",\n ]);\n const foot = h(doc, \"div\", { class: \"fb-ob-foot\" }, [confirm]);\n\n const panel = h(\n doc,\n \"div\",\n { class: \"fb-ob-panel\", role: \"dialog\", \"aria-modal\": \"true\", \"aria-label\": \"Fixback invite\" },\n [head, body, foot],\n );\n const backdrop = h(doc, \"div\", { class: \"fb-ob-backdrop\" }, [panel]);\n shadow.appendChild(backdrop);\n\n let confirmed = false;\n confirm.addEventListener(\"click\", () => {\n if (confirmed) return;\n confirmed = true;\n confirm.disabled = true;\n const display: ReporterDisplay = {\n ...(field(nameInput.value) ? { name: field(nameInput.value) } : {}),\n ...(field(emailInput.value) ? { email: field(emailInput.value) } : {}),\n };\n config.onConfirm(display);\n });\n\n target.appendChild(host);\n return {\n host,\n destroy: () => host.remove(),\n };\n}\n","/**\n * The draw surface — arrow / box / pen / text marking over the captured frame\n * (spec 0003 §B, the Reporter prototype's draw toolbar). It is the interactive\n * editor behind the overlay's draw mode: a tool, a live preview, a committed list\n * of {@link Mark}s with undo, and an SVG it renders into. Marks are recorded in\n * **screenshot (viewport) coordinates** so they compose over the full masked\n * screenshot; the overlay reads {@link DrawSurface.marks} when the Reporter\n * attaches.\n *\n * Pointer listeners are capture-phase on the document, so a stroke is intercepted\n * before the host page; a stroke that begins on interactive chrome (the toolbar,\n * the label input) is ignored so the toolbar stays clickable. The surface draws\n * nothing into the host page — only into the SVG the overlay hands it inside its\n * own Shadow DOM.\n */\n\nimport {\n arrowHeadPoints,\n MARK_COLOR,\n type ArrowMark,\n type BoxMark,\n type DrawTool,\n type Mark,\n type PenMark,\n type Point,\n} from \"./annotation\";\n\n/** A mark mid-drag — always a stroke (arrow/box/pen); text is entered via the input. */\ntype StrokePreview = ArrowMark | BoxMark | PenMark;\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\n/** Stroke width for every mark, in px (matches the prototype). */\nconst STROKE_WIDTH = \"3\";\n\n/** The smallest arrow/box drag that commits, in px — smaller is a stray click. */\nconst MIN_DRAG = 4;\n\n/** The label font, vendored to match the overlay's Signal sans stack. */\nconst LABEL_FONT =\n '600 16px \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif';\n\n/** Options for {@link startDrawSurface}. */\nexport interface DrawSurfaceOptions {\n /** Document to attach to. Defaults to the global `document`. */\n readonly doc?: Document;\n /** The (viewport-filling) SVG the surface renders committed marks + preview into. */\n readonly svg: SVGSVGElement;\n /** The inline label input the text tool shows, positions, and reads. */\n readonly textInput: HTMLInputElement;\n /** Mark colour. Defaults to {@link MARK_COLOR}. */\n readonly color?: string;\n /** Marks to seed from, so re-entering draw continues an existing annotation. */\n readonly initialMarks?: ReadonlyArray<Mark>;\n /** Notified with a fresh snapshot whenever the committed marks change. */\n readonly onChange?: (marks: ReadonlyArray<Mark>) => void;\n}\n\n/** A running draw surface. */\nexport interface DrawSurface {\n /** Switch the active tool. */\n setTool(tool: DrawTool): void;\n /** The active tool. */\n getTool(): DrawTool;\n /** Remove the most recently committed mark. */\n undo(): void;\n /** A snapshot of the committed marks, in screenshot coordinates. */\n marks(): ReadonlyArray<Mark>;\n /** Detach all listeners and hide the label input. */\n stop(): void;\n}\n\n/**\n * Begin drawing. The returned surface tracks a tool, a live preview stroke, and the\n * committed marks; `marks()` snapshots them for the overlay's Send assembly. Text\n * labels are entered through the provided input (Enter commits, Escape/blur-empty\n * discards). `stop()` detaches everything.\n */\nexport function startDrawSurface(options: DrawSurfaceOptions): DrawSurface {\n const doc = options.doc ?? document;\n const { svg, textInput } = options;\n const color = options.color ?? MARK_COLOR;\n\n let tool: DrawTool = \"arrow\";\n let committed: Mark[] = options.initialMarks ? options.initialMarks.slice() : [];\n let preview: StrokePreview | null = null;\n let drawing = false;\n let pendingText: Point | null = null;\n let stopped = false;\n\n function emitChange(): void {\n options.onChange?.(committed.slice());\n }\n\n function point(event: MouseEvent): Point {\n return { x: Math.round(event.clientX), y: Math.round(event.clientY) };\n }\n\n /** Does the event begin on interactive chrome (a button/input in the path)? */\n function hitsChrome(event: Event): boolean {\n const path =\n typeof event.composedPath === \"function\" ? event.composedPath() : [event.target];\n for (const node of path) {\n if (node === doc) break;\n if (node instanceof Element) {\n const tag = node.tagName;\n if (tag === \"BUTTON\" || tag === \"INPUT\" || tag === \"TEXTAREA\") return true;\n }\n }\n return false;\n }\n\n function meaningful(mark: Mark): boolean {\n if (mark.type === \"pen\") return mark.points.length > 1;\n if (mark.type === \"text\") return mark.text.trim().length > 0;\n return Math.abs(mark.x1 - mark.x0) > MIN_DRAG || Math.abs(mark.y1 - mark.y0) > MIN_DRAG;\n }\n\n function onDown(event: MouseEvent): void {\n if (stopped || drawing || hitsChrome(event)) return;\n const p = point(event);\n if (tool === \"text\") {\n openText(p);\n return;\n }\n if (event.cancelable) event.preventDefault();\n drawing = true;\n preview =\n tool === \"pen\"\n ? { type: \"pen\", points: [p], color }\n : { type: tool, x0: p.x, y0: p.y, x1: p.x, y1: p.y, color };\n render();\n }\n\n function onMove(event: MouseEvent): void {\n if (stopped || !drawing || !preview) return;\n const p = point(event);\n if (preview.type === \"pen\") {\n preview = { type: \"pen\", points: [...preview.points, p], color: preview.color };\n } else {\n preview = { ...preview, x1: p.x, y1: p.y };\n }\n render();\n }\n\n function onUp(): void {\n if (stopped || !drawing) return;\n drawing = false;\n const pv = preview;\n preview = null;\n if (pv && meaningful(pv)) {\n committed = [...committed, pv];\n emitChange();\n }\n render();\n }\n\n function openText(p: Point): void {\n pendingText = p;\n textInput.value = \"\";\n textInput.style.display = \"block\";\n textInput.style.left = `${p.x}px`;\n textInput.style.top = `${p.y}px`;\n textInput.onkeydown = onTextKey;\n textInput.onblur = commitText;\n // Focus on the next tick so the current click doesn't immediately blur it.\n setTimeout(() => {\n try {\n textInput.focus();\n } catch {\n /* focus is best-effort — never throw into the host page */\n }\n }, 0);\n }\n\n function onTextKey(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n commitText();\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n discardText();\n }\n }\n\n function commitText(): void {\n if (!pendingText) return;\n const text = textInput.value.trim();\n const at = pendingText;\n discardText();\n if (text.length > 0) {\n committed = [...committed, { type: \"text\", x: at.x, y: at.y, text, color }];\n emitChange();\n render();\n }\n }\n\n function discardText(): void {\n pendingText = null;\n textInput.onkeydown = null;\n textInput.onblur = null;\n textInput.value = \"\";\n textInput.style.display = \"none\";\n }\n\n function render(): void {\n while (svg.firstChild) svg.removeChild(svg.firstChild);\n for (const mark of committed) svg.appendChild(renderMark(doc, mark));\n if (preview) svg.appendChild(renderMark(doc, preview));\n }\n\n function stop(): void {\n if (stopped) return;\n stopped = true;\n doc.removeEventListener(\"mousedown\", onDown, true);\n doc.removeEventListener(\"mousemove\", onMove, true);\n doc.removeEventListener(\"mouseup\", onUp, true);\n discardText();\n }\n\n doc.addEventListener(\"mousedown\", onDown, true);\n doc.addEventListener(\"mousemove\", onMove, true);\n doc.addEventListener(\"mouseup\", onUp, true);\n render();\n\n return {\n setTool: (next) => {\n tool = next;\n },\n getTool: () => tool,\n undo: () => {\n if (committed.length === 0) return;\n committed = committed.slice(0, -1);\n emitChange();\n render();\n },\n marks: () => committed.slice(),\n stop,\n };\n}\n\n/** Build the SVG element(s) for one mark, in the mark's own coordinate space. */\nfunction renderMark(doc: Document, mark: Mark): SVGElement {\n switch (mark.type) {\n case \"box\": {\n const rect = svgEl(doc, \"rect\", {\n x: String(Math.min(mark.x0, mark.x1)),\n y: String(Math.min(mark.y0, mark.y1)),\n width: String(Math.abs(mark.x1 - mark.x0)),\n height: String(Math.abs(mark.y1 - mark.y0)),\n rx: \"2\",\n fill: \"none\",\n stroke: mark.color,\n \"stroke-width\": STROKE_WIDTH,\n });\n return rect;\n }\n case \"pen\": {\n return svgEl(doc, \"polyline\", {\n points: mark.points.map((p) => `${p.x},${p.y}`).join(\" \"),\n fill: \"none\",\n stroke: mark.color,\n \"stroke-width\": STROKE_WIDTH,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n });\n }\n case \"text\": {\n const text = svgEl(doc, \"text\", {\n x: String(mark.x),\n y: String(mark.y),\n fill: mark.color,\n style: `font:${LABEL_FONT}`,\n });\n text.textContent = mark.text;\n return text;\n }\n case \"arrow\": {\n const group = svgEl(doc, \"g\", {});\n group.appendChild(\n svgEl(doc, \"line\", {\n x1: String(mark.x0),\n y1: String(mark.y0),\n x2: String(mark.x1),\n y2: String(mark.y1),\n stroke: mark.color,\n \"stroke-width\": STROKE_WIDTH,\n \"stroke-linecap\": \"round\",\n }),\n );\n const head = arrowHeadPoints(mark.x0, mark.y0, mark.x1, mark.y1);\n group.appendChild(\n svgEl(doc, \"polygon\", {\n points: head.map((p) => `${p.x},${p.y}`).join(\" \"),\n fill: mark.color,\n }),\n );\n return group;\n }\n }\n}\n\n/** Create a namespaced SVG element with the given attributes. */\nfunction svgEl(\n doc: Document,\n tag: string,\n attrs: Record<string, string>,\n): SVGElement {\n const node = doc.createElementNS(SVG_NS, tag) as SVGElement;\n for (const [name, value] of Object.entries(attrs)) node.setAttribute(name, value);\n return node;\n}\n","/**\n * Region-capture — drag a rectangle over the page to focus the report on one area\n * (spec 0003 §B, the Reporter prototype's capture layer). It produces a `region`\n * rect in screenshot (viewport) coordinates; Escape or a too-small drag abandons\n * it. One of the overlay's three composable, optional marking layers, alongside\n * element-pick and draw.\n *\n * Listeners are attached in the **capture phase** so the drag is intercepted before\n * any host-page handler sees it. It is armed deliberately — the overlay lays a\n * full-screen capture layer over the page (and hides the panel) while it runs — so\n * it captures whatever the Reporter drags, its own layer included. Purely a producer\n * of a `Rect`: it draws nothing; the overlay renders the live selection box from\n * `onProgress`.\n */\n\nimport { normalizeRect, type Rect } from \"./annotation\";\n\n/** Options for {@link startRegionCapture}. */\nexport interface RegionCaptureOptions {\n /** Document to attach to. Defaults to the global `document`. */\n readonly doc?: Document;\n /** Called on each drag update with the current rect (to draw a selection box). */\n readonly onProgress?: (rect: Rect) => void;\n /** Called with the captured rect when the drag ends large enough to keep. */\n readonly onComplete: (rect: Rect) => void;\n /** Called when the capture is abandoned (Escape, or a drag below the floor). */\n readonly onCancel?: () => void;\n /** Minimum width and height, in px, to count as a capture. Defaults to 12. */\n readonly minSize?: number;\n}\n\n/** A running region-capture; call {@link RegionCapture.stop} to detach it. */\nexport interface RegionCapture {\n stop(): void;\n}\n\n/** The smallest drag that counts as a region (matches the prototype's 12px floor). */\nconst DEFAULT_MIN_SIZE = 12;\n\n/**\n * Enter region-capture mode: the next drag on the host page draws out a rectangle,\n * reported live through `onProgress` and committed through `onComplete` on release\n * (when it clears the size floor). Escape, or a drag too small to be meaningful,\n * calls `onCancel`. `stop()` (called automatically on complete/cancel) detaches all\n * listeners.\n */\nexport function startRegionCapture(options: RegionCaptureOptions): RegionCapture {\n const doc = options.doc ?? document;\n const minSize = options.minSize ?? DEFAULT_MIN_SIZE;\n let start: { x: number; y: number } | null = null;\n let stopped = false;\n\n function onDown(event: MouseEvent): void {\n if (stopped || start) return;\n start = { x: event.clientX, y: event.clientY };\n if (event.cancelable) event.preventDefault();\n }\n\n function onMove(event: MouseEvent): void {\n if (stopped || !start) return;\n options.onProgress?.(normalizeRect(start.x, start.y, event.clientX, event.clientY));\n }\n\n function onUp(event: MouseEvent): void {\n if (stopped || !start) return;\n const rect = normalizeRect(start.x, start.y, event.clientX, event.clientY);\n start = null;\n stop();\n if (rect.width < minSize || rect.height < minSize) {\n options.onCancel?.();\n return;\n }\n options.onComplete(rect);\n }\n\n function onKey(event: KeyboardEvent): void {\n if (stopped) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n stop();\n options.onCancel?.();\n }\n }\n\n function stop(): void {\n if (stopped) return;\n stopped = true;\n doc.removeEventListener(\"mousedown\", onDown, true);\n doc.removeEventListener(\"mousemove\", onMove, true);\n doc.removeEventListener(\"mouseup\", onUp, true);\n doc.removeEventListener(\"keydown\", onKey, true);\n start = null;\n }\n\n doc.addEventListener(\"mousedown\", onDown, true);\n doc.addEventListener(\"mousemove\", onMove, true);\n doc.addEventListener(\"mouseup\", onUp, true);\n doc.addEventListener(\"keydown\", onKey, true);\n\n return { stop };\n}\n","/**\n * The report overlay's isolated styles, built to the frozen Signal Reporter\n * overlay (`docs/design/Fixback Visual Identity.dc.html`, badge `1d`). Like the\n * launcher's styles these live inside the overlay's Shadow DOM, so nothing here\n * reaches the host page and nothing on the host page reaches in. Token values are\n * vendored Signal tokens (copied from `packages/ui/src/tokens.css`, not imported —\n * the SDK must not depend on `@fixback/ui` at runtime). Keep them in sync by value.\n */\nexport const OVERLAY_STYLES = `\n:host {\n --fb-color-accent: #2f6fed;\n --fb-color-accent-hover: #245fd0;\n --fb-color-on-emphasis: #ffffff;\n --fb-color-ink: #0f1720;\n --fb-color-text: #1a2530;\n --fb-color-muted: #5a6875;\n --fb-color-faint: #9aa7b2;\n --fb-color-border: #e0e6ec;\n --fb-color-border-soft: #e6ebf0;\n --fb-color-surface: #ffffff;\n --fb-color-bug: #e5484d;\n --fb-color-bug-bg: #fdecec;\n --fb-color-impr: #2f6fed;\n --fb-color-impr-bg: #eaf1fe;\n --fb-color-success: #2f9e5b;\n --fb-font-sans: \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto,\n Helvetica, Arial, sans-serif;\n --fb-font-mono: \"IBM Plex Mono\", ui-monospace, \"SFMono-Regular\", Menlo, Consolas,\n monospace;\n\n display: block;\n color: var(--fb-color-text);\n font-family: var(--fb-font-sans);\n font-size: 13px;\n line-height: 1.45;\n -webkit-font-smoothing: antialiased;\n}\n\n* { box-sizing: border-box; }\n\n.fb-ov-panel {\n width: 300px;\n max-width: calc(100vw - 40px);\n background: var(--fb-color-surface);\n border: 1px solid var(--fb-color-border);\n border-radius: 13px;\n box-shadow: 0 18px 44px rgba(20, 40, 70, 0.2);\n overflow: hidden;\n}\n\n.fb-ov-head {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 12px 14px;\n border-bottom: 1px solid var(--fb-color-border-soft);\n}\n.fb-ov-mark-sq {\n width: 13px;\n height: 13px;\n border-radius: 4px;\n background: var(--fb-color-accent);\n flex: none;\n}\n.fb-ov-brand { font-size: 14px; font-weight: 600; color: var(--fb-color-ink); }\n.fb-ov-tier {\n flex: none;\n font-family: var(--fb-font-mono);\n font-size: 9.5px;\n color: var(--fb-color-faint);\n border: 1px solid var(--fb-color-border-soft);\n border-radius: 5px;\n padding: 1px 6px;\n}\n.fb-ov-close {\n margin-left: auto;\n border: 0;\n background: none;\n color: var(--fb-color-faint);\n font-size: 16px;\n line-height: 1;\n padding: 2px 4px;\n cursor: pointer;\n border-radius: 6px;\n}\n.fb-ov-close:hover { color: var(--fb-color-muted); background: #f4f7fa; }\n\n.fb-ov-mark {\n margin: 12px 14px 10px;\n min-height: 52px;\n border-radius: 9px;\n border: 1px solid var(--fb-color-border-soft);\n background: repeating-linear-gradient(135deg, #f4f7fa, #f4f7fa 7px, #eaeff4 7px, #eaeff4 14px);\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n gap: 6px;\n padding: 10px 12px;\n}\n.fb-ov-selector {\n display: none;\n max-width: 100%;\n font-family: var(--fb-font-mono);\n font-size: 10px;\n color: var(--fb-color-on-emphasis);\n background: var(--fb-color-accent);\n padding: 3px 8px;\n border-radius: 5px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.fb-ov-mark.has-element .fb-ov-selector { display: inline-block; }\n.fb-ov-mark-caption { font-size: 10px; color: var(--fb-color-faint); font-family: var(--fb-font-mono); }\n\n.fb-ov-comment {\n display: block;\n width: calc(100% - 28px);\n margin: 0 14px 10px;\n min-height: 62px;\n resize: vertical;\n font-family: inherit;\n font-size: 13px;\n color: var(--fb-color-text);\n border: 1px solid var(--fb-color-border-soft);\n border-radius: 9px;\n padding: 10px 11px;\n}\n.fb-ov-comment::placeholder { color: var(--fb-color-faint); }\n.fb-ov-comment:focus-visible { outline: 2px solid var(--fb-color-accent); outline-offset: 1px; }\n\n.fb-ov-status { padding: 0 14px; font-size: 11px; min-height: 0; }\n.fb-ov-status.is-error { color: var(--fb-color-bug); }\n\n.fb-ov-tools { display: flex; align-items: center; gap: 7px; padding: 8px 14px 14px; }\n.fb-ov-pickbtn,\n.fb-ov-capturebtn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-family: inherit;\n font-size: 12px;\n color: var(--fb-color-muted);\n background: var(--fb-color-surface);\n border: 1px solid var(--fb-color-border);\n border-radius: 8px;\n padding: 8px 11px;\n cursor: pointer;\n}\n.fb-ov-capturebtn { padding: 8px 9px; }\n.fb-ov-pickbtn:hover,\n.fb-ov-capturebtn:hover { border-color: #cfd8e2; }\n.fb-ov-pickbtn.is-active,\n.fb-ov-capturebtn.is-active,\n.fb-ov-capturebtn.is-attached {\n color: var(--fb-color-accent);\n border-color: var(--fb-color-accent);\n background: var(--fb-color-impr-bg);\n}\n.fb-ov-pickbtn__glyph { font-size: 14px; line-height: 1; }\n.fb-ov-icon { display: block; }\n\n.fb-ov-send {\n margin-left: auto;\n font-family: inherit;\n font-size: 13px;\n font-weight: 600;\n color: var(--fb-color-on-emphasis);\n background: var(--fb-color-accent);\n border: 0;\n border-radius: 8px;\n padding: 9px 18px;\n cursor: pointer;\n}\n.fb-ov-send:hover { background: var(--fb-color-accent-hover); }\n.fb-ov-send:disabled { opacity: 0.6; cursor: default; }\n\n.fb-ov-done { display: none; padding: 24px 18px; text-align: center; }\n.fb-ov-panel.is-sent .fb-ov-form { display: none; }\n.fb-ov-panel.is-sent .fb-ov-done { display: block; }\n.fb-ov-done__check {\n width: 40px; height: 40px; margin: 0 auto 12px;\n border-radius: 50%;\n background: #e7f6ee; color: var(--fb-color-success);\n display: flex; align-items: center; justify-content: center;\n font-size: 20px; font-weight: 700;\n}\n.fb-ov-done__title { font-size: 15px; font-weight: 600; color: var(--fb-color-ink); }\n.fb-ov-done__sub { font-size: 12px; color: var(--fb-color-muted); margin-top: 4px; }\n\n/* The panel is hidden while any full-screen marking layer is active. */\n.fb-ov-panel.is-marking { visibility: hidden; }\n\n.fb-ov-pick,\n.fb-ov-capture,\n.fb-ov-draw { position: fixed; inset: 0; z-index: 2147483002; display: none; }\n.fb-ov-pick.is-visible,\n.fb-ov-capture.is-visible,\n.fb-ov-draw.is-visible { display: block; }\n\n/* Element-pick highlight layer — visual only, never intercepts host events. */\n.fb-ov-pick { pointer-events: none; }\n.fb-ov-highlight {\n position: absolute;\n border: 2px dashed var(--fb-color-accent);\n border-radius: 6px;\n box-shadow: 0 0 0 3px rgba(47, 111, 237, 0.14);\n transition: all 60ms ease;\n}\n.fb-ov-hint {\n position: absolute;\n top: 16px;\n left: 50%;\n transform: translateX(-50%);\n font-family: var(--fb-font-mono);\n font-size: 11px;\n color: var(--fb-color-on-emphasis);\n background: var(--fb-color-ink);\n padding: 6px 12px;\n border-radius: 7px;\n box-shadow: 0 8px 20px rgba(20, 40, 70, 0.25);\n}\n\n/* Region-capture layer — a dim wash with a live selection box. */\n.fb-ov-capture { cursor: crosshair; }\n.fb-ov-capture-dim { position: absolute; inset: 0; background: rgba(15, 23, 32, 0.28); }\n.fb-ov-capture-sel {\n position: absolute;\n border: 2px solid var(--fb-color-accent);\n border-radius: 4px;\n box-shadow: 0 0 0 100vmax rgba(15, 23, 32, 0.32);\n}\n\n/* Draw layer — the mark SVG, the region frame, the label input, and the toolbar. */\n.fb-ov-draw-svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none; }\n.fb-ov-draw-frame {\n position: absolute;\n border: 1px solid rgba(47, 111, 237, 0.5);\n border-radius: 4px;\n box-shadow: 0 0 0 100vmax rgba(15, 23, 32, 0.18);\n pointer-events: none;\n}\n.fb-ov-draw-text {\n position: absolute;\n display: none;\n font-family: var(--fb-font-sans);\n font-size: 15px;\n font-weight: 600;\n color: var(--fb-color-bug);\n background: rgba(255, 255, 255, 0.92);\n border: 1px dashed var(--fb-color-bug);\n border-radius: 4px;\n padding: 2px 6px;\n outline: none;\n z-index: 3;\n}\n.fb-ov-draw-toolbar {\n position: fixed;\n left: 50%;\n bottom: 26px;\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n gap: 5px;\n background: var(--fb-color-ink);\n border-radius: 12px;\n padding: 7px;\n box-shadow: 0 16px 40px rgba(15, 40, 70, 0.4);\n}\n.fb-ov-drawtool {\n width: 34px;\n height: 34px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: #c4ccd4;\n cursor: pointer;\n font-family: inherit;\n}\n.fb-ov-drawtool:hover { background: rgba(255, 255, 255, 0.08); color: #fff; }\n.fb-ov-drawtool.is-active { background: var(--fb-color-accent); color: var(--fb-color-on-emphasis); }\n.fb-ov-drawtool__t { font-weight: 700; font-size: 14px; line-height: 1; }\n.fb-ov-draw-divider { width: 1px; height: 22px; background: #2a343e; margin: 0 3px; }\n.fb-ov-draw-undo {\n width: 34px;\n height: 34px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: #c4ccd4;\n cursor: pointer;\n}\n.fb-ov-draw-undo:hover:not(:disabled) { background: rgba(255, 255, 255, 0.08); color: #fff; }\n.fb-ov-draw-undo:disabled { opacity: 0.4; cursor: default; }\n.fb-ov-draw-cancel {\n height: 34px;\n padding: 0 12px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: var(--fb-color-faint);\n font-family: inherit;\n font-size: 12.5px;\n cursor: pointer;\n}\n.fb-ov-draw-cancel:hover { color: #fff; }\n.fb-ov-draw-attach {\n height: 34px;\n padding: 0 15px;\n border: 0;\n border-radius: 8px;\n background: var(--fb-color-accent);\n color: var(--fb-color-on-emphasis);\n font-family: inherit;\n font-size: 12.5px;\n font-weight: 600;\n cursor: pointer;\n}\n.fb-ov-draw-attach:hover { background: var(--fb-color-accent-hover); }\n\n@media (prefers-reduced-motion: reduce) {\n .fb-ov-highlight { transition: none; }\n}\n`;\n","import { runBeforeSend, type BeforeSend } from \"@fixback/sdk-core\";\n\nimport type { DrawTool, Mark, Rect } from \"./annotation\";\nimport type { IdentityInputs, ProjectGate, ReporterTier } from \"./boot\";\nimport type { Breadcrumb } from \"./breadcrumbs\";\nimport type { ReporterDisplay } from \"./invite\";\nimport { startDrawSurface, type DrawSurface } from \"./draw-surface\";\nimport {\n describeElement,\n startElementPicker,\n type ElementPicker,\n type ElementPickerOptions,\n} from \"./element-picker\";\nimport {\n assembleContent,\n collectEnvironment,\n type SelectedElement,\n} from \"./report\";\nimport { startRegionCapture, type RegionCapture } from \"./region-capture\";\nimport { OVERLAY_STYLES } from \"./overlay-styles\";\nimport type { ReplaySnapshot, ReplaySource } from \"./replay\";\nimport { submitReport, type SubmitInput, type SubmitResult } from \"./submit\";\nimport { SDK_VERSION } from \"./version\";\n\n/** Marks the overlay's host element in the light DOM (skipped by capture/picker). */\nexport const OVERLAY_ATTRIBUTE = \"data-fixback-overlay\";\n\n/** The SVG namespace, for the draw surface's mark layer. */\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\n/** The draw tools, in toolbar order (spec §B, the Reporter prototype). */\nconst DRAW_TOOLS: ReadonlyArray<{ tool: DrawTool; label: string }> = [\n { tool: \"arrow\", label: \"Arrow\" },\n { tool: \"box\", label: \"Box\" },\n { tool: \"pen\", label: \"Pen\" },\n { tool: \"text\", label: \"Text label\" },\n];\n\n/** How long the confirmation shows before the overlay closes itself. */\nconst AUTO_CLOSE_MS = 1800;\n\ntype SubmitReportFn = (\n apiUrl: string,\n input: SubmitInput,\n fetchImpl?: typeof fetch,\n) => Promise<SubmitResult>;\ntype StartPickerFn = (options: ElementPickerOptions) => ElementPicker;\n\n/** Injectable collaborators, defaulted to the real implementations. */\nexport interface OverlayDeps {\n readonly submitReport: SubmitReportFn;\n readonly startElementPicker: StartPickerFn;\n}\n\n/** A read-only view of the trace buffer the overlay attaches to a report. */\nexport interface BreadcrumbSource {\n snapshot(): readonly Breadcrumb[];\n}\n\n/** Configuration for {@link createOverlay}. */\nexport interface OverlayConfig {\n readonly apiUrl: string;\n readonly key: string;\n readonly identity?: IdentityInputs;\n /**\n * The Project's Gate, forwarded verbatim from the boot answer. Reserved for\n * Gate-aware launcher / redemption behaviour (spec §A/§F); the overlay itself\n * does not read it yet, but `init` plumbs it through here (ticket #85 / §G).\n */\n readonly gate?: ProjectGate;\n /**\n * The Reporter's **server-derived** trust tier from the boot answer, or `null`\n * when a presented identity was refused. Rendered as a **display-only** chip in\n * the overlay header (spec §G) — never a trust signal, never read for a decision,\n * and never sent back to the server. When `null`/absent no tier is asserted.\n */\n readonly tier?: ReporterTier | null;\n readonly sdkVersion?: string;\n /** The host app's Release (#117, ADR-0024), validated by `init`; rides in the environment. */\n readonly release?: string;\n /**\n * The Reporter's self-provided display name / email (spec §F), when the SDK holds\n * them (from a redemption in this session or a prior one). They ride along with the\n * report so a Member sees who filed it — display only, never a trust signal.\n */\n readonly display?: ReporterDisplay;\n /** Where to mount the overlay host. Defaults to `document.body`. */\n readonly target?: HTMLElement;\n readonly doc?: Document;\n readonly win?: Window;\n readonly deps?: Partial<OverlayDeps>;\n /** The trace buffer whose snapshot rides on each report (spec §C). */\n readonly buffer?: BreadcrumbSource | null;\n /** The replay recorder whose buffered window rides on each report (ADR-0024). */\n readonly replay?: ReplaySource | null;\n /** Per-project client scrub hook, run at the `beforeSend` choke point. */\n readonly beforeSend?: BeforeSend;\n /** Run the built-in default scrubbers. Defaults to `true` (private-by-default). */\n readonly scrub?: boolean;\n}\n\n/** A mounted overlay the launcher opens. */\nexport interface OverlayController {\n open(): void;\n close(): void;\n destroy(): void;\n readonly isOpen: boolean;\n}\n\n/** Which full-screen marking mode is active, if any. */\ntype MarkMode = \"compose\" | \"picking\" | \"capturing\" | \"drawing\";\n\ninterface Refs {\n readonly panel: HTMLElement;\n readonly mark: HTMLElement;\n readonly selector: HTMLElement;\n readonly caption: HTMLElement;\n readonly comment: HTMLTextAreaElement;\n readonly status: HTMLElement;\n readonly pickBtn: HTMLButtonElement;\n readonly captureBtn: HTMLButtonElement;\n readonly sendBtn: HTMLButtonElement;\n readonly highlight: HTMLElement;\n readonly pickLayer: HTMLElement;\n readonly captureLayer: HTMLElement;\n readonly selBox: HTMLElement;\n readonly drawLayer: HTMLElement;\n readonly drawSvg: SVGSVGElement;\n readonly drawText: HTMLInputElement;\n readonly drawFrame: HTMLElement;\n readonly drawTools: Map<DrawTool, HTMLButtonElement>;\n readonly undoBtn: HTMLButtonElement;\n}\n\nfunction h<K extends keyof HTMLElementTagNameMap>(\n doc: Document,\n tag: K,\n props: Partial<Record<string, string>> = {},\n children: ReadonlyArray<Node | string> = [],\n): HTMLElementTagNameMap[K] {\n const node = doc.createElement(tag);\n for (const [name, value] of Object.entries(props)) {\n if (value !== undefined) node.setAttribute(name, value);\n }\n for (const child of children) {\n node.appendChild(typeof child === \"string\" ? doc.createTextNode(child) : child);\n }\n return node;\n}\n\n/** Create a namespaced SVG element with attributes and optional SVG children. */\nfunction svgNode(\n doc: Document,\n tag: string,\n attrs: Record<string, string> = {},\n children: ReadonlyArray<SVGElement> = [],\n): SVGElement {\n const node = doc.createElementNS(SVG_NS, tag) as SVGElement;\n for (const [name, value] of Object.entries(attrs)) node.setAttribute(name, value);\n for (const child of children) node.appendChild(child);\n return node;\n}\n\n/**\n * Create the report overlay — the on-page panel a Reporter files a report from,\n * built to the frozen Signal Reporter prototype (`docs/design/Fixback Reporter.dc.html`).\n * It mounts lazily inside its own Shadow DOM (isolated from the host page, and\n * marked so the replay recorder and element-picker skip it), opens on the launcher's\n * `fixback:launch` seam, and offers three **composable, optional** marking layers\n * over the current view (spec §B): **element-pick**, **region-capture** (drag), and\n * **draw** (arrow / box / pen / text, with undo / cancel / attach). The marks are\n * viewport-space vectors composited at view time (spec §D), never baked into an\n * image; the still they annotate is a frame of the buffered rrweb window\n * (reconstructed downstream since ADR-0027), so the SDK rasterises nothing. On Send\n * it assembles the structured Annotation (`{ element?, region?, marks? }`) and\n * submits to ingest — showing a confirmation on success and failing quietly otherwise.\n */\nexport function createOverlay(config: OverlayConfig): OverlayController {\n const doc = config.doc ?? document;\n const win = config.win ?? doc.defaultView ?? window;\n const sdkVersion = config.sdkVersion ?? SDK_VERSION;\n const deps: OverlayDeps = {\n submitReport: config.deps?.submitReport ?? submitReport,\n startElementPicker: config.deps?.startElementPicker ?? startElementPicker,\n };\n\n let host: HTMLElement | null = null;\n let refs: Refs | null = null;\n let picker: ElementPicker | null = null;\n let regionCapture: RegionCapture | null = null;\n let drawSurface: DrawSurface | null = null;\n let pendingRegion: Rect | null = null;\n let autoClose: ReturnType<typeof setTimeout> | null = null;\n let open = false;\n /**\n * The replay window frozen when the overlay opened (ADR-0024): the recorder\n * keeps rotating its buckets while the Reporter composes, so the window that\n * ships is the lead-up to *opening* the overlay — the bug — not to Send.\n */\n let openedReplay: ReplaySnapshot | null = null;\n let mode: MarkMode = \"compose\";\n\n const state: {\n selectedElement: SelectedElement | null;\n region: Rect | null;\n marks: Mark[];\n phase: \"compose\" | \"sending\" | \"sent\";\n } = { selectedElement: null, region: null, marks: [], phase: \"compose\" };\n\n function setStatus(message: string, isError: boolean): void {\n if (!refs) return;\n refs.status.textContent = message;\n refs.status.classList.toggle(\"is-error\", isError);\n }\n\n /** Show exactly one full-screen marking layer, hiding the panel while it runs. */\n function setMode(next: MarkMode): void {\n mode = next;\n if (!refs) return;\n const marking = next !== \"compose\";\n refs.panel.classList.toggle(\"is-marking\", marking);\n refs.pickLayer.classList.toggle(\"is-visible\", next === \"picking\");\n refs.captureLayer.classList.toggle(\"is-visible\", next === \"capturing\");\n refs.drawLayer.classList.toggle(\"is-visible\", next === \"drawing\");\n refs.pickBtn.classList.toggle(\"is-active\", next === \"picking\");\n refs.captureBtn.classList.toggle(\"is-active\", next === \"capturing\" || next === \"drawing\");\n }\n\n /** Reflect the current marking state in the compose panel's mark region. */\n function renderMarking(): void {\n if (!refs) return;\n const hasElement = !!state.selectedElement;\n const hasRegion = !!state.region;\n const markCount = state.marks.length;\n\n refs.mark.classList.toggle(\"has-element\", hasElement);\n refs.selector.textContent = hasElement ? state.selectedElement!.selector : \"\";\n\n refs.pickBtn.textContent = \"\";\n refs.pickBtn.append(\n glyph(doc),\n doc.createTextNode(hasElement ? \"Change element\" : \"Pick element\"),\n );\n refs.captureBtn.classList.toggle(\"is-attached\", hasRegion || markCount > 0);\n\n const bits: string[] = [];\n if (hasElement) bits.push(\"Element\");\n if (hasRegion) bits.push(\"Region\");\n if (markCount > 0) bits.push(`${markCount} mark${markCount === 1 ? \"\" : \"s\"}`);\n refs.caption.textContent = bits.length\n ? `${bits.join(\" · \")} · masked session replay on Send`\n : \"Masked session replay attached on Send\";\n }\n\n function positionHighlight(element: Element | null): void {\n if (!refs) return;\n if (!element) {\n refs.highlight.style.display = \"none\";\n return;\n }\n const rect = element.getBoundingClientRect();\n refs.highlight.style.display = \"block\";\n refs.highlight.style.left = `${rect.left}px`;\n refs.highlight.style.top = `${rect.top}px`;\n refs.highlight.style.width = `${rect.width}px`;\n refs.highlight.style.height = `${rect.height}px`;\n }\n\n // ---- element-pick -------------------------------------------------------\n\n function stopPicker(): void {\n picker?.stop();\n picker = null;\n }\n\n function endPick(): void {\n if (refs) refs.highlight.style.display = \"none\";\n stopPicker();\n if (mode === \"picking\") setMode(\"compose\");\n }\n\n function beginPick(): void {\n if (!refs) return;\n closeMarkingModes();\n setMode(\"picking\");\n picker = deps.startElementPicker({\n doc,\n onHover: positionHighlight,\n onPick: (element) => {\n state.selectedElement = describeElement(element);\n endPick();\n renderMarking();\n },\n onCancel: endPick,\n });\n }\n\n // ---- region-capture -----------------------------------------------------\n\n function positionSelBox(rect: Rect | null): void {\n if (!refs) return;\n const box = refs.selBox;\n if (!rect) {\n box.style.display = \"none\";\n return;\n }\n box.style.display = \"block\";\n box.style.left = `${rect.x}px`;\n box.style.top = `${rect.y}px`;\n box.style.width = `${rect.width}px`;\n box.style.height = `${rect.height}px`;\n }\n\n function stopRegionCapture(): void {\n regionCapture?.stop();\n regionCapture = null;\n }\n\n function beginCapture(): void {\n if (!refs) return;\n closeMarkingModes();\n positionSelBox(null);\n setMode(\"capturing\");\n regionCapture = startRegionCapture({\n doc,\n onProgress: positionSelBox,\n onComplete: (rect) => {\n stopRegionCapture();\n positionSelBox(null);\n beginDraw(rect);\n },\n onCancel: () => {\n stopRegionCapture();\n positionSelBox(null);\n setMode(\"compose\");\n },\n });\n }\n\n // ---- draw ---------------------------------------------------------------\n\n function positionDrawFrame(region: Rect): void {\n if (!refs) return;\n refs.drawFrame.style.left = `${region.x}px`;\n refs.drawFrame.style.top = `${region.y}px`;\n refs.drawFrame.style.width = `${region.width}px`;\n refs.drawFrame.style.height = `${region.height}px`;\n }\n\n function setDrawTool(tool: DrawTool): void {\n drawSurface?.setTool(tool);\n if (!refs) return;\n for (const [value, button] of refs.drawTools) {\n button.classList.toggle(\"is-active\", value === tool);\n }\n }\n\n function onMarksChange(marks: ReadonlyArray<Mark>): void {\n if (refs) refs.undoBtn.disabled = marks.length === 0;\n }\n\n function stopDrawSurface(): void {\n drawSurface?.stop();\n drawSurface = null;\n }\n\n function beginDraw(region: Rect): void {\n if (!refs) return;\n pendingRegion = region;\n positionDrawFrame(region);\n setMode(\"drawing\");\n drawSurface = startDrawSurface({\n doc,\n svg: refs.drawSvg,\n textInput: refs.drawText,\n initialMarks: state.marks,\n onChange: onMarksChange,\n });\n setDrawTool(\"arrow\");\n onMarksChange(state.marks);\n }\n\n function attachDraw(): void {\n if (drawSurface) {\n state.marks = drawSurface.marks().slice();\n if (pendingRegion) state.region = pendingRegion;\n }\n endDraw();\n renderMarking();\n }\n\n function cancelDraw(): void {\n // Discard the in-flight capture; previously attached marking is untouched.\n endDraw();\n renderMarking();\n }\n\n function endDraw(): void {\n stopDrawSurface();\n pendingRegion = null;\n if (mode === \"drawing\") setMode(\"compose\");\n }\n\n /** Tear down any active marking mode (before starting another, or on close). */\n function closeMarkingModes(): void {\n stopPicker();\n stopRegionCapture();\n stopDrawSurface();\n pendingRegion = null;\n positionSelBox(null);\n if (refs) refs.highlight.style.display = \"none\";\n if (mode !== \"compose\") setMode(\"compose\");\n }\n\n // ---- send ---------------------------------------------------------------\n\n function clearAutoClose(): void {\n if (autoClose !== null) {\n clearTimeout(autoClose);\n autoClose = null;\n }\n }\n\n async function send(): Promise<void> {\n if (!refs || state.phase === \"sending\") return;\n closeMarkingModes();\n state.phase = \"sending\";\n refs.sendBtn.disabled = true;\n refs.sendBtn.textContent = \"Sending…\";\n setStatus(\"\", false);\n try {\n const assembled = assembleContent({\n comment: refs.comment.value,\n element: state.selectedElement ?? undefined,\n region: state.region ?? undefined,\n marks: state.marks.length > 0 ? state.marks : undefined,\n url: win.location?.href,\n environment: collectEnvironment(win, sdkVersion, config.release),\n trace: config.buffer?.snapshot(),\n reporterName: config.display?.name,\n reporterEmail: config.display?.email,\n });\n // The single client-side scrub choke point (spec §C): default scrubbers +\n // the per-project hook run before transport; a `null` result drops the\n // report entirely.\n const content = runBeforeSend(assembled, {\n hook: config.beforeSend,\n scrub: config.scrub,\n });\n if (!content) {\n state.phase = \"sent\";\n refs.panel.classList.add(\"is-sent\");\n autoClose = setTimeout(close, AUTO_CLOSE_MS);\n return;\n }\n // The buffered replay window rides as its own part (ADR-0024): the frame the\n // Reporter annotated is reconstructed from it downstream (ADR-0027), so the SDK\n // ships no rasterised screenshot. It is the window frozen when the overlay\n // opened (the lead-up to the bug), read after the scrub hook accepted the report\n // — a dropped report sends nothing.\n const replay = openedReplay ?? config.replay?.snapshot() ?? null;\n const result = await deps.submitReport(config.apiUrl, {\n key: config.key,\n identity: config.identity,\n content,\n replay,\n });\n if (result.ok) {\n state.phase = \"sent\";\n refs.panel.classList.add(\"is-sent\");\n autoClose = setTimeout(close, AUTO_CLOSE_MS);\n } else {\n resetSendControl();\n setStatus(\n result.reason === \"unreachable\"\n ? \"Couldn't reach Fixback — try again.\"\n : \"Fixback couldn't accept this report.\",\n true,\n );\n }\n } catch {\n resetSendControl();\n setStatus(\"Something went wrong — try again.\", true);\n }\n }\n\n function resetSendControl(): void {\n state.phase = \"compose\";\n if (!refs) return;\n refs.sendBtn.disabled = false;\n refs.sendBtn.textContent = \"Send\";\n }\n\n // ---- build --------------------------------------------------------------\n\n function build(): void {\n host = h(doc, \"div\", { [OVERLAY_ATTRIBUTE]: \"\" });\n host.style.cssText =\n \"position:fixed;right:20px;bottom:84px;z-index:2147483001;margin:0;padding:0;border:0;display:none;\";\n const shadow = host.attachShadow({ mode: \"open\" });\n\n const style = doc.createElement(\"style\");\n style.textContent = OVERLAY_STYLES;\n shadow.appendChild(style);\n\n // Header\n const closeBtn = h(doc, \"button\", { type: \"button\", class: \"fb-ov-close\", \"aria-label\": \"Close\" }, [\"✕\"]);\n const head = h(doc, \"div\", { class: \"fb-ov-head\" }, [\n h(doc, \"span\", { class: \"fb-ov-mark-sq\" }),\n h(doc, \"span\", { class: \"fb-ov-brand\" }, [\"Fixback\"]),\n ]);\n // Display-only trust tier chip — present only when boot derived a tier. It\n // reflects the server-derived value verbatim; the client never asserts trust.\n if (config.tier != null) {\n head.appendChild(\n h(doc, \"span\", { class: \"fb-ov-tier\", \"aria-label\": `Trust tier: ${config.tier}` }, [config.tier]),\n );\n }\n head.appendChild(closeBtn);\n\n // Annotation / screenshot marking region\n const selector = h(doc, \"span\", { class: \"fb-ov-selector\" });\n const caption = h(doc, \"span\", { class: \"fb-ov-mark-caption\" });\n const mark = h(doc, \"div\", { class: \"fb-ov-mark\" }, [selector, caption]);\n\n // Comment\n const comment = h(doc, \"textarea\", {\n class: \"fb-ov-comment\",\n placeholder: \"Describe what you saw or want…\",\n \"aria-label\": \"Comment\",\n });\n\n // Status + tools\n const status = h(doc, \"div\", { class: \"fb-ov-status\", role: \"status\", \"aria-live\": \"polite\" });\n const pickBtn = h(doc, \"button\", { type: \"button\", class: \"fb-ov-pickbtn\", title: \"Point at an element\" });\n pickBtn.addEventListener(\"click\", () => {\n if (state.phase === \"sending\") return;\n if (mode === \"picking\") endPick();\n else beginPick();\n });\n const captureBtn = h(doc, \"button\", {\n type: \"button\",\n class: \"fb-ov-capturebtn\",\n title: \"Capture a region and draw\",\n \"aria-label\": \"Capture a region and draw\",\n });\n captureBtn.appendChild(captureGlyph(doc));\n captureBtn.addEventListener(\"click\", () => {\n if (state.phase === \"sending\") return;\n beginCapture();\n });\n const sendBtn = h(doc, \"button\", { type: \"button\", class: \"fb-ov-send\" }, [\"Send\"]);\n sendBtn.addEventListener(\"click\", () => void send());\n const tools = h(doc, \"div\", { class: \"fb-ov-tools\" }, [pickBtn, captureBtn, sendBtn]);\n\n const form = h(doc, \"div\", { class: \"fb-ov-form\" }, [mark, comment, status, tools]);\n\n // Confirmation\n const done = h(doc, \"div\", { class: \"fb-ov-done\" }, [\n h(doc, \"div\", { class: \"fb-ov-done__check\" }, [\"✓\"]),\n h(doc, \"div\", { class: \"fb-ov-done__title\" }, [\"Report sent\"]),\n h(doc, \"div\", { class: \"fb-ov-done__sub\" }, [\"Thanks — the team can see it now.\"]),\n ]);\n\n const panel = h(doc, \"div\", {\n class: \"fb-ov-panel\",\n role: \"dialog\",\n \"aria-label\": \"Fixback feedback\",\n }, [head, form, done]);\n\n // Element-pick highlight layer (visual only; never intercepts host events)\n const highlight = h(doc, \"div\", { class: \"fb-ov-highlight\" });\n highlight.style.display = \"none\";\n const pickLayer = h(doc, \"div\", { class: \"fb-ov-pick\" }, [\n h(doc, \"div\", { class: \"fb-ov-hint\" }, [\"Click the element you mean · Esc to cancel\"]),\n highlight,\n ]);\n\n // Region-capture layer (a dim + a live selection box)\n const selBox = h(doc, \"div\", { class: \"fb-ov-capture-sel\" });\n selBox.style.display = \"none\";\n const captureLayer = h(doc, \"div\", { class: \"fb-ov-capture\" }, [\n h(doc, \"div\", { class: \"fb-ov-capture-dim\" }),\n h(doc, \"div\", { class: \"fb-ov-hint\" }, [\"Drag to capture an area · Esc to cancel\"]),\n selBox,\n ]);\n\n // Draw layer: the mark SVG, the label input, the region frame, and the toolbar.\n const drawSvg = svgNode(doc, \"svg\", {\n class: \"fb-ov-draw-svg\",\n width: \"100%\",\n height: \"100%\",\n }) as SVGSVGElement;\n const drawText = h(doc, \"input\", {\n class: \"fb-ov-draw-text\",\n placeholder: \"label…\",\n \"aria-label\": \"Mark label\",\n });\n drawText.style.display = \"none\";\n const drawFrame = h(doc, \"div\", { class: \"fb-ov-draw-frame\" });\n\n const drawTools = new Map<DrawTool, HTMLButtonElement>();\n const toolButtons: HTMLButtonElement[] = [];\n for (const { tool, label } of DRAW_TOOLS) {\n const button = h(doc, \"button\", {\n type: \"button\",\n class: \"fb-ov-drawtool\",\n \"data-tool\": tool,\n title: label,\n \"aria-label\": label,\n });\n button.appendChild(drawToolGlyph(doc, tool));\n button.addEventListener(\"click\", () => setDrawTool(tool));\n drawTools.set(tool, button);\n toolButtons.push(button);\n }\n const undoBtn = h(doc, \"button\", { type: \"button\", class: \"fb-ov-draw-undo\", title: \"Undo\", \"aria-label\": \"Undo\" });\n undoBtn.appendChild(undoGlyph(doc));\n undoBtn.addEventListener(\"click\", () => drawSurface?.undo());\n const cancelDrawBtn = h(doc, \"button\", { type: \"button\", class: \"fb-ov-draw-cancel\" }, [\"Cancel\"]);\n cancelDrawBtn.addEventListener(\"click\", () => cancelDraw());\n const attachBtn = h(doc, \"button\", { type: \"button\", class: \"fb-ov-draw-attach\" }, [\"Attach\"]);\n attachBtn.addEventListener(\"click\", () => attachDraw());\n const drawToolbar = h(doc, \"div\", { class: \"fb-ov-draw-toolbar\" }, [\n ...toolButtons,\n h(doc, \"span\", { class: \"fb-ov-draw-divider\" }),\n undoBtn,\n cancelDrawBtn,\n attachBtn,\n ]);\n const drawLayer = h(doc, \"div\", { class: \"fb-ov-draw\" }, [drawFrame, drawSvg, drawText, drawToolbar]);\n\n shadow.append(panel, pickLayer, captureLayer, drawLayer);\n\n closeBtn.addEventListener(\"click\", close);\n\n (config.target ?? doc.body).appendChild(host);\n refs = {\n panel,\n mark,\n selector,\n caption,\n comment,\n status,\n pickBtn,\n captureBtn,\n sendBtn,\n highlight,\n pickLayer,\n captureLayer,\n selBox,\n drawLayer,\n drawSvg,\n drawText,\n drawFrame,\n drawTools,\n undoBtn,\n };\n }\n\n function ensureBuilt(): void {\n if (!host || !refs) build();\n }\n\n function openOverlay(): void {\n ensureBuilt();\n if (!host || !refs) return;\n clearAutoClose();\n closeMarkingModes();\n // Freeze the replay window NOW (ADR-0024): opening the overlay is the\n // moment closest to the bug, and the recorder's buckets keep rotating while\n // the Reporter composes — a snapshot at Send would show the composition,\n // not the lead-up. The SDK's own chrome is blocked from the recording\n // either way; this pins *when* the window ends.\n openedReplay = config.replay?.snapshot() ?? null;\n state.phase = \"compose\";\n state.selectedElement = null;\n state.region = null;\n state.marks = [];\n refs.panel.classList.remove(\"is-sent\");\n refs.comment.value = \"\";\n resetSendControl();\n setStatus(\"\", false);\n renderMarking();\n host.style.display = \"block\";\n open = true;\n try {\n refs.comment.focus();\n } catch {\n /* focus is best-effort — never let it throw into the host page */\n }\n }\n\n function close(): void {\n clearAutoClose();\n closeMarkingModes();\n if (host) host.style.display = \"none\";\n open = false;\n openedReplay = null;\n }\n\n function destroy(): void {\n clearAutoClose();\n closeMarkingModes();\n host?.remove();\n host = null;\n refs = null;\n open = false;\n }\n\n return {\n open: openOverlay,\n close,\n destroy,\n get isOpen() {\n return open;\n },\n };\n}\n\n/** The crosshair glyph on the element-pick control (matches the `⌖` in the prototype). */\nfunction glyph(doc: Document): HTMLElement {\n return h(doc, \"span\", { class: \"fb-ov-pickbtn__glyph\", \"aria-hidden\": \"true\" }, [\"⌖\"]);\n}\n\n/** The frame glyph on the region-capture control (matches the prototype's crop icon). */\nfunction captureGlyph(doc: Document): SVGElement {\n return svgNode(\n doc,\n \"svg\",\n { class: \"fb-ov-icon\", width: \"14\", height: \"14\", viewBox: \"0 0 16 16\", fill: \"none\", stroke: \"currentColor\", \"stroke-width\": \"1.5\", \"aria-hidden\": \"true\" },\n [svgNode(doc, \"path\", { d: \"M2 5V2h3M14 5V2h-3M2 11v3h3M14 11v3h-3\" })],\n );\n}\n\n/** The undo glyph on the draw toolbar. */\nfunction undoGlyph(doc: Document): SVGElement {\n return svgNode(\n doc,\n \"svg\",\n { class: \"fb-ov-icon\", width: \"15\", height: \"15\", viewBox: \"0 0 16 16\", fill: \"none\", stroke: \"currentColor\", \"stroke-width\": \"1.6\", \"aria-hidden\": \"true\" },\n [svgNode(doc, \"path\", { d: \"M6 4 3 7l3 3M3 7h6a4 4 0 0 1 0 8H7\" })],\n );\n}\n\n/** The per-tool glyph on the draw toolbar (matches the prototype's icons). */\nfunction drawToolGlyph(doc: Document, tool: DrawTool): Node {\n if (tool === \"text\") {\n return h(doc, \"span\", { class: \"fb-ov-drawtool__t\", \"aria-hidden\": \"true\" }, [\"T\"]);\n }\n const paths: Record<Exclude<DrawTool, \"text\">, SVGElement> = {\n arrow: svgNode(doc, \"path\", { d: \"M3 13 13 3M7 3h6v6\" }),\n box: svgNode(doc, \"rect\", { x: \"2.5\", y: \"3.5\", width: \"11\", height: \"9\", rx: \"1\" }),\n pen: svgNode(doc, \"path\", { d: \"M3 13l1-3 6-6 2 2-6 6-3 1Z\" }),\n };\n return svgNode(\n doc,\n \"svg\",\n { class: \"fb-ov-icon\", width: \"15\", height: \"15\", viewBox: \"0 0 16 16\", fill: \"none\", stroke: \"currentColor\", \"stroke-width\": \"1.6\", \"aria-hidden\": \"true\" },\n [paths[tool]],\n );\n}\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nvar _a;\nvar EventType = /* @__PURE__ */ ((EventType2) => {\n EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n EventType2[EventType2[\"Asset\"] = 7] = \"Asset\";\n return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n IncrementalSource2[IncrementalSource2[\"CustomElement\"] = 16] = \"CustomElement\";\n return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n return MouseInteractions2;\n})(MouseInteractions || {});\nvar PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {\n PointerTypes2[PointerTypes2[\"Mouse\"] = 0] = \"Mouse\";\n PointerTypes2[PointerTypes2[\"Pen\"] = 1] = \"Pen\";\n PointerTypes2[PointerTypes2[\"Touch\"] = 2] = \"Touch\";\n return PointerTypes2;\n})(PointerTypes || {});\nvar CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n return CanvasContext2;\n})(CanvasContext || {});\nvar MediaInteractions = /* @__PURE__ */ ((MediaInteractions2) => {\n MediaInteractions2[MediaInteractions2[\"Play\"] = 0] = \"Play\";\n MediaInteractions2[MediaInteractions2[\"Pause\"] = 1] = \"Pause\";\n MediaInteractions2[MediaInteractions2[\"Seeked\"] = 2] = \"Seeked\";\n MediaInteractions2[MediaInteractions2[\"VolumeChange\"] = 3] = \"VolumeChange\";\n MediaInteractions2[MediaInteractions2[\"RateChange\"] = 4] = \"RateChange\";\n return MediaInteractions2;\n})(MediaInteractions || {});\nvar NodeType = /* @__PURE__ */ ((NodeType2) => {\n NodeType2[NodeType2[\"Document\"] = 0] = \"Document\";\n NodeType2[NodeType2[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType2[NodeType2[\"Element\"] = 2] = \"Element\";\n NodeType2[NodeType2[\"Text\"] = 3] = \"Text\";\n NodeType2[NodeType2[\"CDATA\"] = 4] = \"CDATA\";\n NodeType2[NodeType2[\"Comment\"] = 5] = \"Comment\";\n return NodeType2;\n})(NodeType || {});\nconst testableAccessors = {\n Node: [\n \"childNodes\",\n \"parentNode\",\n \"parentElement\",\n \"textContent\",\n \"ownerDocument\"\n ],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nconst untaintedBaseIframeCleanup = {};\nconst isAngularZonePresent = () => {\n return !!globalThis.Zone;\n};\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const defaultObj = globalThis[key];\n const defaultPrototype = defaultObj.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a2, _b;\n return Boolean(\n (_b = (_a2 = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a2.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a2;\n return typeof defaultPrototype[method] === \"function\" && ((_a2 = defaultPrototype[method]) == null ? void 0 : _a2.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype;\n return defaultObj.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n iframeEl.style.display = \"none\";\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype;\n const untaintedObject = win[key].prototype;\n if (!untaintedObject) {\n iframeEl.remove();\n return defaultPrototype;\n }\n const ua = navigator.userAgent;\n if (ua.includes(\"Safari\") && !ua.includes(\"Chrome\")) {\n iframeEl.classList.add(\"rr-block\");\n iframeEl.setAttribute(\"__rrwebUntaintedMutationObserver\", \"\");\n untaintedBaseIframeCleanup[key] = () => iframeEl.remove();\n } else {\n iframeEl.remove();\n }\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a2;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a2 = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a2.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction ownerDocument(n) {\n return getUntaintedAccessor(\"Node\", n, \"ownerDocument\");\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return [\n getUntaintedPrototype(\"MutationObserver\").constructor,\n untaintedBaseIframeCleanup[\"MutationObserver\"] ?? (() => {\n })\n ];\n}\nlet nowTimestamp = Date.now;\nif (!/* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString())) {\n nowTimestamp = () => (/* @__PURE__ */ new Date()).getTime();\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return () => {\n };\n }\n const original = source[name];\n const wrapped = replacement(original);\n if (typeof wrapped === \"function\") {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original\n }\n });\n }\n source[name] = wrapped;\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n };\n }\n}\nconst index = {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n nowTimestamp,\n mutationObserverCtor,\n patch\n};\nfunction isElement(n) {\n return n.nodeType === n.ELEMENT_NODE;\n}\nfunction isShadowRoot(n) {\n const hostEl = (\n // anchor and textarea elements also have a `host` property\n // but only shadow roots have a `mode` property\n n && \"host\" in n && \"mode\" in n && index.host(n) || null\n );\n return Boolean(\n hostEl && \"shadowRoot\" in hostEl && index.shadowRoot(hostEl) === n\n );\n}\nfunction isNativeShadowDom(shadowRoot2) {\n return Object.prototype.toString.call(shadowRoot2) === \"[object ShadowRoot]\";\n}\nfunction fixBrowserCompatibilityIssuesInCSS(cssText) {\n if (cssText.includes(\" background-clip: text;\") && !cssText.includes(\" -webkit-background-clip: text;\")) {\n cssText = cssText.replace(\n /\\sbackground-clip:\\s*text;/g,\n \" -webkit-background-clip: text; background-clip: text;\"\n );\n }\n return cssText;\n}\nfunction escapeImportStatement(rule) {\n const { cssText } = rule;\n if (cssText.split('\"').length < 3) return cssText;\n const statement = [\"@import\", `url(${JSON.stringify(rule.href)})`];\n if (rule.layerName === \"\") {\n statement.push(`layer`);\n } else if (rule.layerName) {\n statement.push(`layer(${rule.layerName})`);\n }\n if (rule.supportsText) {\n statement.push(`supports(${rule.supportsText})`);\n }\n if (rule.media.length) {\n statement.push(rule.media.mediaText);\n }\n return statement.join(\" \") + \";\";\n}\nfunction stringifyStylesheet(s) {\n try {\n const rules = s.rules || s.cssRules;\n if (!rules) {\n return null;\n }\n let sheetHref = s.href;\n if (!sheetHref && s.ownerNode) {\n sheetHref = s.ownerNode.baseURI;\n }\n const stringifiedRules = Array.from(\n rules,\n (rule) => stringifyRule(rule, sheetHref)\n ).join(\"\");\n return fixBrowserCompatibilityIssuesInCSS(stringifiedRules);\n } catch (error) {\n return null;\n }\n}\nfunction stringifyRule(rule, sheetHref) {\n if (isCSSImportRule(rule)) {\n let importStringified;\n try {\n importStringified = // for same-origin stylesheets,\n // we can access the imported stylesheet rules directly\n stringifyStylesheet(rule.styleSheet) || // work around browser issues with the raw string `@import url(...)` statement\n escapeImportStatement(rule);\n } catch (error) {\n importStringified = rule.cssText;\n }\n if (rule.styleSheet.href) {\n return absolutifyURLs(importStringified, rule.styleSheet.href);\n }\n return importStringified;\n } else {\n let ruleStringified = rule.cssText;\n if (isCSSStyleRule(rule) && rule.selectorText.includes(\":\")) {\n ruleStringified = fixSafariColons(ruleStringified);\n }\n if (sheetHref) {\n return absolutifyURLs(ruleStringified, sheetHref);\n }\n return ruleStringified;\n }\n}\nfunction fixSafariColons(cssStringified) {\n const regex = /(\\[(?:[\\w-]+)[^\\\\])(:(?:[\\w-]+)\\])/gm;\n return cssStringified.replace(regex, \"$1\\\\$2\");\n}\nfunction isCSSImportRule(rule) {\n return \"styleSheet\" in rule;\n}\nfunction isCSSStyleRule(rule) {\n return \"selectorText\" in rule;\n}\nclass Mirror {\n constructor() {\n __publicField(this, \"idNodeMap\", /* @__PURE__ */ new Map());\n __publicField(this, \"nodeMetaMap\", /* @__PURE__ */ new WeakMap());\n }\n getId(n) {\n var _a2;\n if (!n) return -1;\n const id = (_a2 = this.getMeta(n)) == null ? void 0 : _a2.id;\n return id ?? -1;\n }\n getNode(id) {\n return this.idNodeMap.get(id) || null;\n }\n getIds() {\n return Array.from(this.idNodeMap.keys());\n }\n getMeta(n) {\n return this.nodeMetaMap.get(n) || null;\n }\n // removes the node from idNodeMap\n // doesn't remove the node from nodeMetaMap\n removeNodeFromMap(n) {\n const id = this.getId(n);\n this.idNodeMap.delete(id);\n if (n.childNodes) {\n n.childNodes.forEach(\n (childNode) => this.removeNodeFromMap(childNode)\n );\n }\n }\n has(id) {\n return this.idNodeMap.has(id);\n }\n hasNode(node) {\n return this.nodeMetaMap.has(node);\n }\n add(n, meta) {\n const id = meta.id;\n this.idNodeMap.set(id, n);\n this.nodeMetaMap.set(n, meta);\n }\n replace(id, n) {\n const oldNode = this.getNode(id);\n if (oldNode) {\n const meta = this.nodeMetaMap.get(oldNode);\n if (meta) this.nodeMetaMap.set(n, meta);\n }\n this.idNodeMap.set(id, n);\n }\n reset() {\n this.idNodeMap = /* @__PURE__ */ new Map();\n this.nodeMetaMap = /* @__PURE__ */ new WeakMap();\n }\n}\nfunction createMirror() {\n return new Mirror();\n}\nfunction maskInputValue({\n element,\n maskInputOptions,\n tagName,\n type,\n value,\n maskInputFn\n}) {\n let text = value || \"\";\n const actualType = type && toLowerCase(type);\n if (maskInputOptions[tagName.toLowerCase()] || actualType && maskInputOptions[actualType]) {\n if (maskInputFn) {\n text = maskInputFn(text, element);\n } else {\n text = \"*\".repeat(text.length);\n }\n }\n return text;\n}\nfunction toLowerCase(str) {\n return str.toLowerCase();\n}\nconst ORIGINAL_ATTRIBUTE_NAME = \"__rrweb_original__\";\nfunction is2DCanvasBlank(canvas) {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return true;\n const chunkSize = 50;\n for (let x = 0; x < canvas.width; x += chunkSize) {\n for (let y = 0; y < canvas.height; y += chunkSize) {\n const getImageData = ctx.getImageData;\n const originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData ? getImageData[ORIGINAL_ATTRIBUTE_NAME] : getImageData;\n const pixelBuffer = new Uint32Array(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n originalGetImageData.call(\n ctx,\n x,\n y,\n Math.min(chunkSize, canvas.width - x),\n Math.min(chunkSize, canvas.height - y)\n ).data.buffer\n );\n if (pixelBuffer.some((pixel) => pixel !== 0)) return false;\n }\n }\n return true;\n}\nfunction getInputType(element) {\n const type = element.type;\n return element.hasAttribute(\"data-rr-is-password\") ? \"password\" : type ? (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n toLowerCase(type)\n ) : null;\n}\nfunction extractFileExtension(path, baseURL) {\n let url;\n try {\n url = new URL(path, baseURL ?? window.location.href);\n } catch (err) {\n return null;\n }\n const regex = /\\.([0-9a-z]+)(?:$)/i;\n const match = url.pathname.match(regex);\n return (match == null ? void 0 : match[1]) ?? null;\n}\nfunction extractOrigin(url) {\n let origin = \"\";\n if (url.indexOf(\"//\") > -1) {\n origin = url.split(\"/\").slice(0, 3).join(\"/\");\n } else {\n origin = url.split(\"/\")[0];\n }\n origin = origin.split(\"?\")[0];\n return origin;\n}\nconst URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\nconst URL_PROTOCOL_MATCH = /^(?:[a-z+]+:)?\\/\\//i;\nconst URL_WWW_MATCH = /^www\\..*/i;\nconst DATA_URI = /^(data:)([^,]*),(.*)/i;\nfunction absolutifyURLs(cssText, href) {\n return (cssText || \"\").replace(\n URL_IN_CSS_REF,\n (origin, quote1, path1, quote2, path2, path3) => {\n const filePath = path1 || path2 || path3;\n const maybeQuote = quote1 || quote2 || \"\";\n if (!filePath) {\n return origin;\n }\n if (URL_PROTOCOL_MATCH.test(filePath) || URL_WWW_MATCH.test(filePath)) {\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\n }\n if (DATA_URI.test(filePath)) {\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\n }\n if (filePath[0] === \"/\") {\n return `url(${maybeQuote}${extractOrigin(href) + filePath}${maybeQuote})`;\n }\n const filePathNoHash = filePath.split(\"#\")[0];\n const maybeHash = filePath.substring(filePathNoHash.length);\n const stack = href.split(\"#\")[0].split(\"/\");\n const parts = filePathNoHash.split(\"/\");\n stack.pop();\n for (const part of parts) {\n if (part === \".\") {\n continue;\n } else if (part === \"..\") {\n stack.pop();\n } else {\n stack.push(part);\n }\n }\n return `url(${maybeQuote}${stack.join(\"/\")}${maybeHash}${maybeQuote})`;\n }\n );\n}\nfunction normalizeCssString(cssText, _testNoPxNorm = false) {\n if (_testNoPxNorm) {\n return cssText.replace(/(\\/\\*[^*]*\\*\\/)|[\\s;]/g, \"\");\n } else {\n return cssText.replace(/(\\/\\*[^*]*\\*\\/)|[\\s;]/g, \"\").replace(/0px/g, \"0\");\n }\n}\nfunction splitCssText(cssText, style, _testNoPxNorm = false) {\n const childNodes2 = Array.from(style.childNodes);\n const splits = [];\n let iterCount = 0;\n if (childNodes2.length > 1 && cssText && typeof cssText === \"string\") {\n let cssTextNorm = normalizeCssString(cssText, _testNoPxNorm);\n const normFactor = cssTextNorm.length / cssText.length;\n for (let i = 1; i < childNodes2.length; i++) {\n if (childNodes2[i].textContent && typeof childNodes2[i].textContent === \"string\") {\n const textContentNorm = normalizeCssString(\n childNodes2[i].textContent,\n _testNoPxNorm\n );\n const jLimit = 100;\n let j = 3;\n for (; j < textContentNorm.length; j++) {\n if (\n // keep consuming css identifiers (to get a decent chunk more quickly)\n textContentNorm[j].match(/[a-zA-Z0-9]/) || // substring needs to be unique to this section\n textContentNorm.indexOf(textContentNorm.substring(0, j), 1) !== -1\n ) {\n continue;\n }\n break;\n }\n for (; j < textContentNorm.length; j++) {\n let startSubstring = textContentNorm.substring(0, j);\n let cssNormSplits = cssTextNorm.split(startSubstring);\n let splitNorm = -1;\n if (cssNormSplits.length === 2) {\n splitNorm = cssNormSplits[0].length;\n } else if (cssNormSplits.length > 2 && cssNormSplits[0] === \"\" && childNodes2[i - 1].textContent !== \"\") {\n splitNorm = cssTextNorm.indexOf(startSubstring, 1);\n } else if (cssNormSplits.length === 1) {\n startSubstring = startSubstring.substring(\n 0,\n startSubstring.length - 1\n );\n cssNormSplits = cssTextNorm.split(startSubstring);\n if (cssNormSplits.length <= 1) {\n splits.push(cssText);\n return splits;\n }\n j = jLimit + 1;\n } else if (j === textContentNorm.length - 1) {\n splitNorm = cssTextNorm.indexOf(startSubstring);\n }\n if (cssNormSplits.length >= 2 && j > jLimit) {\n const prevTextContent = childNodes2[i - 1].textContent;\n if (prevTextContent && typeof prevTextContent === \"string\") {\n const prevMinLength = normalizeCssString(prevTextContent).length;\n splitNorm = cssTextNorm.indexOf(startSubstring, prevMinLength);\n }\n if (splitNorm === -1) {\n splitNorm = cssNormSplits[0].length;\n }\n }\n if (splitNorm !== -1) {\n let k = Math.floor(splitNorm / normFactor);\n for (; k > 0 && k < cssText.length; ) {\n iterCount += 1;\n if (iterCount > 50 * childNodes2.length) {\n splits.push(cssText);\n return splits;\n }\n const normPart = normalizeCssString(\n cssText.substring(0, k),\n _testNoPxNorm\n );\n if (normPart.length === splitNorm) {\n splits.push(cssText.substring(0, k));\n cssText = cssText.substring(k);\n cssTextNorm = cssTextNorm.substring(splitNorm);\n break;\n } else if (normPart.length < splitNorm) {\n k += Math.max(\n 1,\n Math.floor((splitNorm - normPart.length) / normFactor)\n );\n } else {\n k -= Math.max(\n 1,\n Math.floor((normPart.length - splitNorm) * normFactor)\n );\n }\n }\n break;\n }\n }\n }\n }\n }\n splits.push(cssText);\n return splits;\n}\nfunction markCssSplits(cssText, style) {\n return splitCssText(cssText, style).join(\"/* rr_split */\");\n}\nlet _id = 1;\nconst tagNameRegex = new RegExp(\"[^a-z0-9-_:]\");\nconst IGNORED_NODE = -2;\nfunction genId() {\n return _id++;\n}\nfunction getValidTagName(element) {\n if (element instanceof HTMLFormElement) {\n return \"form\";\n }\n const processedTagName = toLowerCase(element.tagName);\n if (tagNameRegex.test(processedTagName)) {\n return \"div\";\n }\n return processedTagName;\n}\nlet canvasService;\nlet canvasCtx;\nconst SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\nconst SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\n if (attributeValue.trim() === \"\") {\n return attributeValue;\n }\n let pos = 0;\n function collectCharacters(regEx) {\n let chars2;\n const match = regEx.exec(attributeValue.substring(pos));\n if (match) {\n chars2 = match[0];\n pos += chars2.length;\n return chars2;\n }\n return \"\";\n }\n const output = [];\n while (true) {\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\n if (pos >= attributeValue.length) {\n break;\n }\n let url = collectCharacters(SRCSET_NOT_SPACES);\n if (url.slice(-1) === \",\") {\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\n output.push(url);\n } else {\n let descriptorsStr = \"\";\n url = absoluteToDoc(doc, url);\n let inParens = false;\n while (true) {\n const c = attributeValue.charAt(pos);\n if (c === \"\") {\n output.push((url + descriptorsStr).trim());\n break;\n } else if (!inParens) {\n if (c === \",\") {\n pos += 1;\n output.push((url + descriptorsStr).trim());\n break;\n } else if (c === \"(\") {\n inParens = true;\n }\n } else {\n if (c === \")\") {\n inParens = false;\n }\n }\n descriptorsStr += c;\n pos += 1;\n }\n }\n }\n return output.join(\", \");\n}\nconst cachedDocument = /* @__PURE__ */ new WeakMap();\nfunction absoluteToDoc(doc, attributeValue) {\n if (!attributeValue || attributeValue.trim() === \"\") {\n return attributeValue;\n }\n return getHref(doc, attributeValue);\n}\nfunction isSVGElement(el) {\n return Boolean(el.tagName === \"svg\" || el.ownerSVGElement);\n}\nfunction getHref(doc, customHref) {\n let a = cachedDocument.get(doc);\n if (!a) {\n a = doc.createElement(\"a\");\n cachedDocument.set(doc, a);\n }\n if (!customHref) {\n customHref = \"\";\n } else if (customHref.startsWith(\"blob:\") || customHref.startsWith(\"data:\")) {\n return customHref;\n }\n a.setAttribute(\"href\", customHref);\n return a.href;\n}\nfunction transformAttribute(doc, tagName, name, value) {\n if (!value) {\n return value;\n }\n if (name === \"src\" || name === \"href\" && !(tagName === \"use\" && value[0] === \"#\")) {\n return absoluteToDoc(doc, value);\n } else if (name === \"xlink:href\" && value[0] !== \"#\") {\n return absoluteToDoc(doc, value);\n } else if (name === \"background\" && [\"table\", \"td\", \"th\"].includes(tagName)) {\n return absoluteToDoc(doc, value);\n } else if (name === \"srcset\") {\n return getAbsoluteSrcsetString(doc, value);\n } else if (name === \"style\") {\n return absolutifyURLs(value, getHref(doc));\n } else if (tagName === \"object\" && name === \"data\") {\n return absoluteToDoc(doc, value);\n }\n return value;\n}\nfunction ignoreAttribute(tagName, name, _value) {\n return [\"video\", \"audio\"].includes(tagName) && name === \"autoplay\";\n}\nfunction _isBlockedElement(element, blockClass, blockSelector) {\n try {\n if (typeof blockClass === \"string\") {\n if (element.classList.contains(blockClass)) {\n return true;\n }\n } else {\n for (let eIndex = element.classList.length; eIndex--; ) {\n const className = element.classList[eIndex];\n if (blockClass.test(className)) {\n return true;\n }\n }\n }\n if (blockSelector) {\n return element.matches(blockSelector);\n }\n } catch (e) {\n }\n return false;\n}\nfunction classMatchesRegex(node, regex, checkAncestors) {\n if (!node) return false;\n if (node.nodeType !== node.ELEMENT_NODE) {\n if (!checkAncestors) return false;\n return classMatchesRegex(index.parentNode(node), regex, checkAncestors);\n }\n for (let eIndex = node.classList.length; eIndex--; ) {\n const className = node.classList[eIndex];\n if (regex.test(className)) {\n return true;\n }\n }\n if (!checkAncestors) return false;\n return classMatchesRegex(index.parentNode(node), regex, checkAncestors);\n}\nfunction needMaskingText(node, maskTextClass, maskTextSelector, checkAncestors) {\n let el;\n if (isElement(node)) {\n el = node;\n if (!index.childNodes(el).length) {\n return false;\n }\n } else if (index.parentElement(node) === null) {\n return false;\n } else {\n el = index.parentElement(node);\n }\n try {\n if (typeof maskTextClass === \"string\") {\n if (checkAncestors) {\n if (el.closest(`.${maskTextClass}`)) return true;\n } else {\n if (el.classList.contains(maskTextClass)) return true;\n }\n } else {\n if (classMatchesRegex(el, maskTextClass, checkAncestors)) return true;\n }\n if (maskTextSelector) {\n if (checkAncestors) {\n if (el.closest(maskTextSelector)) return true;\n } else {\n if (el.matches(maskTextSelector)) return true;\n }\n }\n } catch (e) {\n }\n return false;\n}\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\n const win = iframeEl.contentWindow;\n if (!win) {\n return;\n }\n let fired = false;\n let readyState;\n try {\n readyState = win.document.readyState;\n } catch (error) {\n return;\n }\n if (readyState !== \"complete\") {\n const timer = setTimeout(() => {\n if (!fired) {\n listener();\n fired = true;\n }\n }, iframeLoadTimeout);\n iframeEl.addEventListener(\"load\", () => {\n clearTimeout(timer);\n fired = true;\n listener();\n });\n return;\n }\n const blankUrl = \"about:blank\";\n if (win.location.href !== blankUrl || iframeEl.src === blankUrl || iframeEl.src === \"\") {\n setTimeout(listener, 0);\n return iframeEl.addEventListener(\"load\", listener);\n }\n iframeEl.addEventListener(\"load\", listener);\n}\nfunction onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) {\n let fired = false;\n let styleSheetLoaded;\n try {\n styleSheetLoaded = link.sheet;\n } catch (error) {\n return;\n }\n if (styleSheetLoaded) return;\n const timer = setTimeout(() => {\n if (!fired) {\n listener();\n fired = true;\n }\n }, styleSheetLoadTimeout);\n link.addEventListener(\"load\", () => {\n clearTimeout(timer);\n fired = true;\n listener();\n });\n}\nfunction serializeNode(n, options) {\n const {\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n needsMask,\n inlineStylesheet,\n maskInputOptions = {},\n maskTextFn,\n maskInputFn,\n dataURLOptions = {},\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement = false,\n cssCaptured = false\n } = options;\n const rootId = getRootId(doc, mirror2);\n switch (n.nodeType) {\n case n.DOCUMENT_NODE:\n if (n.compatMode !== \"CSS1Compat\") {\n return {\n type: NodeType.Document,\n childNodes: [],\n compatMode: n.compatMode\n // probably \"BackCompat\"\n };\n } else {\n return {\n type: NodeType.Document,\n childNodes: []\n };\n }\n case n.DOCUMENT_TYPE_NODE:\n return {\n type: NodeType.DocumentType,\n name: n.name,\n publicId: n.publicId,\n systemId: n.systemId,\n rootId\n };\n case n.ELEMENT_NODE:\n return serializeElementNode(n, {\n doc,\n blockClass,\n blockSelector,\n inlineStylesheet,\n maskInputOptions,\n maskInputFn,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement,\n rootId\n });\n case n.TEXT_NODE:\n return serializeTextNode(n, {\n doc,\n needsMask,\n maskTextFn,\n rootId,\n cssCaptured\n });\n case n.CDATA_SECTION_NODE:\n return {\n type: NodeType.CDATA,\n textContent: \"\",\n rootId\n };\n case n.COMMENT_NODE:\n return {\n type: NodeType.Comment,\n textContent: index.textContent(n) || \"\",\n rootId\n };\n default:\n return false;\n }\n}\nfunction getRootId(doc, mirror2) {\n if (!mirror2.hasNode(doc)) return void 0;\n const docId = mirror2.getId(doc);\n return docId === 1 ? void 0 : docId;\n}\nfunction serializeTextNode(n, options) {\n const { needsMask, maskTextFn, rootId, cssCaptured } = options;\n const parent = index.parentNode(n);\n const parentTagName = parent && parent.tagName;\n let textContent2 = \"\";\n const isStyle = parentTagName === \"STYLE\" ? true : void 0;\n const isScript = parentTagName === \"SCRIPT\" ? true : void 0;\n if (isScript) {\n textContent2 = \"SCRIPT_PLACEHOLDER\";\n } else if (!cssCaptured) {\n textContent2 = index.textContent(n);\n if (isStyle && textContent2) {\n textContent2 = absolutifyURLs(textContent2, getHref(options.doc));\n }\n }\n if (!isStyle && !isScript && textContent2 && needsMask) {\n textContent2 = maskTextFn ? maskTextFn(textContent2, index.parentElement(n)) : textContent2.replace(/[\\S]/g, \"*\");\n }\n return {\n type: NodeType.Text,\n textContent: textContent2 || \"\",\n rootId\n };\n}\nfunction serializeElementNode(n, options) {\n const {\n doc,\n blockClass,\n blockSelector,\n inlineStylesheet,\n maskInputOptions = {},\n maskInputFn,\n dataURLOptions = {},\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement = false,\n rootId\n } = options;\n const needBlock = _isBlockedElement(n, blockClass, blockSelector);\n const tagName = getValidTagName(n);\n let attributes = {};\n const len = n.attributes.length;\n for (let i = 0; i < len; i++) {\n const attr = n.attributes[i];\n if (!ignoreAttribute(tagName, attr.name, attr.value)) {\n attributes[attr.name] = transformAttribute(\n doc,\n tagName,\n toLowerCase(attr.name),\n attr.value\n );\n }\n }\n if (tagName === \"link\" && inlineStylesheet) {\n const stylesheet = Array.from(doc.styleSheets).find((s) => {\n return s.href === n.href;\n });\n let cssText = null;\n if (stylesheet) {\n cssText = stringifyStylesheet(stylesheet);\n }\n if (cssText) {\n delete attributes.rel;\n delete attributes.href;\n attributes._cssText = cssText;\n }\n }\n if (tagName === \"style\" && n.sheet) {\n let cssText = stringifyStylesheet(\n n.sheet\n );\n if (cssText) {\n if (n.childNodes.length > 1) {\n cssText = markCssSplits(cssText, n);\n }\n attributes._cssText = cssText;\n }\n }\n if ([\"input\", \"textarea\", \"select\"].includes(tagName)) {\n const value = n.value;\n const checked = n.checked;\n if (attributes.type !== \"radio\" && attributes.type !== \"checkbox\" && attributes.type !== \"submit\" && attributes.type !== \"button\" && value) {\n attributes.value = maskInputValue({\n element: n,\n type: getInputType(n),\n tagName,\n value,\n maskInputOptions,\n maskInputFn\n });\n } else if (checked) {\n attributes.checked = checked;\n }\n }\n if (tagName === \"option\") {\n if (n.selected && !maskInputOptions[\"select\"]) {\n attributes.selected = true;\n } else {\n delete attributes.selected;\n }\n }\n if (tagName === \"dialog\" && n.open) {\n attributes.rr_open_mode = n.matches(\"dialog:modal\") ? \"modal\" : \"non-modal\";\n }\n if (tagName === \"canvas\" && recordCanvas) {\n if (n.__context === \"2d\") {\n if (!is2DCanvasBlank(n)) {\n attributes.rr_dataURL = n.toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality\n );\n }\n } else if (!(\"__context\" in n)) {\n const canvasDataURL = n.toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality\n );\n const blankCanvas = doc.createElement(\"canvas\");\n blankCanvas.width = n.width;\n blankCanvas.height = n.height;\n const blankCanvasDataURL = blankCanvas.toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality\n );\n if (canvasDataURL !== blankCanvasDataURL) {\n attributes.rr_dataURL = canvasDataURL;\n }\n }\n }\n if (tagName === \"img\" && inlineImages) {\n if (!canvasService) {\n canvasService = doc.createElement(\"canvas\");\n canvasCtx = canvasService.getContext(\"2d\");\n }\n const image = n;\n const imageSrc = image.currentSrc || image.getAttribute(\"src\") || \"<unknown-src>\";\n const priorCrossOrigin = image.crossOrigin;\n const recordInlineImage = () => {\n image.removeEventListener(\"load\", recordInlineImage);\n try {\n canvasService.width = image.naturalWidth;\n canvasService.height = image.naturalHeight;\n canvasCtx.drawImage(image, 0, 0);\n attributes.rr_dataURL = canvasService.toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality\n );\n } catch (err) {\n if (image.crossOrigin !== \"anonymous\") {\n image.crossOrigin = \"anonymous\";\n if (image.complete && image.naturalWidth !== 0)\n recordInlineImage();\n else image.addEventListener(\"load\", recordInlineImage);\n return;\n } else {\n console.warn(\n `Cannot inline img src=${imageSrc}! Error: ${err}`\n );\n }\n }\n if (image.crossOrigin === \"anonymous\") {\n priorCrossOrigin ? attributes.crossOrigin = priorCrossOrigin : image.removeAttribute(\"crossorigin\");\n }\n };\n if (image.complete && image.naturalWidth !== 0) recordInlineImage();\n else image.addEventListener(\"load\", recordInlineImage);\n }\n if ([\"audio\", \"video\"].includes(tagName)) {\n const mediaAttributes = attributes;\n mediaAttributes.rr_mediaState = n.paused ? \"paused\" : \"played\";\n mediaAttributes.rr_mediaCurrentTime = n.currentTime;\n mediaAttributes.rr_mediaPlaybackRate = n.playbackRate;\n mediaAttributes.rr_mediaMuted = n.muted;\n mediaAttributes.rr_mediaLoop = n.loop;\n mediaAttributes.rr_mediaVolume = n.volume;\n }\n if (!newlyAddedElement) {\n if (n.scrollLeft) {\n attributes.rr_scrollLeft = n.scrollLeft;\n }\n if (n.scrollTop) {\n attributes.rr_scrollTop = n.scrollTop;\n }\n }\n if (needBlock) {\n const { width, height } = n.getBoundingClientRect();\n attributes = {\n class: attributes.class,\n rr_width: `${width}px`,\n rr_height: `${height}px`\n };\n }\n if (tagName === \"iframe\" && !keepIframeSrcFn(attributes.src)) {\n if (!n.contentDocument) {\n attributes.rr_src = attributes.src;\n }\n delete attributes.src;\n }\n let isCustomElement;\n try {\n if (customElements.get(tagName)) isCustomElement = true;\n } catch (e) {\n }\n return {\n type: NodeType.Element,\n tagName,\n attributes,\n childNodes: [],\n isSVG: isSVGElement(n) || void 0,\n needBlock,\n rootId,\n isCustom: isCustomElement\n };\n}\nfunction lowerIfExists(maybeAttr) {\n if (maybeAttr === void 0 || maybeAttr === null) {\n return \"\";\n } else {\n return maybeAttr.toLowerCase();\n }\n}\nfunction slimDOMDefaults(_slimDOMOptions) {\n if (_slimDOMOptions === true || _slimDOMOptions === \"all\") {\n return {\n script: true,\n comment: true,\n headFavicon: true,\n headWhitespace: true,\n headMetaSocial: true,\n headMetaRobots: true,\n headMetaHttpEquiv: true,\n headMetaVerification: true,\n // the following are off for slimDOMOptions === true,\n // as they destroy some (hidden) info:\n headMetaAuthorship: _slimDOMOptions === \"all\",\n headMetaDescKeywords: _slimDOMOptions === \"all\",\n headTitleMutations: _slimDOMOptions === \"all\"\n };\n } else if (_slimDOMOptions) {\n return _slimDOMOptions;\n }\n return {};\n}\nfunction slimDOMExcluded(sn, slimDOMOptions) {\n if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\n return true;\n } else if (sn.type === NodeType.Element) {\n if (slimDOMOptions.script && // script tag\n (sn.tagName === \"script\" || // (module)preload link\n sn.tagName === \"link\" && (sn.attributes.rel === \"preload\" && sn.attributes.as === \"script\" || sn.attributes.rel === \"modulepreload\") || // prefetch link\n sn.tagName === \"link\" && sn.attributes.rel === \"prefetch\" && typeof sn.attributes.href === \"string\" && extractFileExtension(sn.attributes.href) === \"js\")) {\n return true;\n } else if (slimDOMOptions.headFavicon && (sn.tagName === \"link\" && sn.attributes.rel === \"shortcut icon\" || sn.tagName === \"meta\" && (lowerIfExists(sn.attributes.name).match(\n /^msapplication-tile(image|color)$/\n ) || lowerIfExists(sn.attributes.name) === \"application-name\" || lowerIfExists(sn.attributes.rel) === \"icon\" || lowerIfExists(sn.attributes.rel) === \"apple-touch-icon\" || lowerIfExists(sn.attributes.rel) === \"shortcut icon\"))) {\n return true;\n } else if (sn.tagName === \"meta\") {\n if (slimDOMOptions.headMetaDescKeywords && lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\n return true;\n } else if (slimDOMOptions.headMetaSocial && (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) || // og = opengraph (facebook)\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) || lowerIfExists(sn.attributes.name) === \"pinterest\")) {\n return true;\n } else if (slimDOMOptions.headMetaRobots && (lowerIfExists(sn.attributes.name) === \"robots\" || lowerIfExists(sn.attributes.name) === \"googlebot\" || lowerIfExists(sn.attributes.name) === \"bingbot\")) {\n return true;\n } else if (slimDOMOptions.headMetaHttpEquiv && sn.attributes[\"http-equiv\"] !== void 0) {\n return true;\n } else if (slimDOMOptions.headMetaAuthorship && (lowerIfExists(sn.attributes.name) === \"author\" || lowerIfExists(sn.attributes.name) === \"generator\" || lowerIfExists(sn.attributes.name) === \"framework\" || lowerIfExists(sn.attributes.name) === \"publisher\" || lowerIfExists(sn.attributes.name) === \"progid\" || lowerIfExists(sn.attributes.property).match(/^article:/) || lowerIfExists(sn.attributes.property).match(/^product:/))) {\n return true;\n } else if (slimDOMOptions.headMetaVerification && (lowerIfExists(sn.attributes.name) === \"google-site-verification\" || lowerIfExists(sn.attributes.name) === \"yandex-verification\" || lowerIfExists(sn.attributes.name) === \"csrf-token\" || lowerIfExists(sn.attributes.name) === \"p:domain_verify\" || lowerIfExists(sn.attributes.name) === \"verify-v1\" || lowerIfExists(sn.attributes.name) === \"verification\" || lowerIfExists(sn.attributes.name) === \"shopify-checkout-api-token\")) {\n return true;\n }\n }\n }\n return false;\n}\nfunction serializeNodeWithId(n, options) {\n const {\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n maskTextClass,\n maskTextSelector,\n skipChild = false,\n inlineStylesheet = true,\n maskInputOptions = {},\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions = {},\n inlineImages = false,\n recordCanvas = false,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout = 5e3,\n onStylesheetLoad,\n stylesheetLoadTimeout = 5e3,\n keepIframeSrcFn = () => false,\n newlyAddedElement = false,\n cssCaptured = false\n } = options;\n let { needsMask } = options;\n let { preserveWhiteSpace = true } = options;\n if (!needsMask) {\n const checkAncestors = needsMask === void 0;\n needsMask = needMaskingText(\n n,\n maskTextClass,\n maskTextSelector,\n checkAncestors\n );\n }\n const _serializedNode = serializeNode(n, {\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n needsMask,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement,\n cssCaptured\n });\n if (!_serializedNode) {\n console.warn(n, \"not serialized\");\n return null;\n }\n let id;\n if (mirror2.hasNode(n)) {\n id = mirror2.getId(n);\n } else if (slimDOMExcluded(_serializedNode, slimDOMOptions) || !preserveWhiteSpace && _serializedNode.type === NodeType.Text && !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, \"\").length) {\n id = IGNORED_NODE;\n } else {\n id = genId();\n }\n const serializedNode = Object.assign(_serializedNode, { id });\n mirror2.add(n, serializedNode);\n if (id === IGNORED_NODE) {\n return null;\n }\n if (onSerialize) {\n onSerialize(n);\n }\n let recordChild = !skipChild;\n if (serializedNode.type === NodeType.Element) {\n recordChild = recordChild && !serializedNode.needBlock;\n delete serializedNode.needBlock;\n const shadowRootEl = index.shadowRoot(n);\n if (shadowRootEl && isNativeShadowDom(shadowRootEl))\n serializedNode.isShadowHost = true;\n }\n if ((serializedNode.type === NodeType.Document || serializedNode.type === NodeType.Element) && recordChild) {\n if (slimDOMOptions.headWhitespace && serializedNode.type === NodeType.Element && serializedNode.tagName === \"head\") {\n preserveWhiteSpace = false;\n }\n const bypassOptions = {\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n needsMask,\n maskTextClass,\n maskTextSelector,\n skipChild,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n cssCaptured: false\n };\n if (serializedNode.type === NodeType.Element && serializedNode.tagName === \"textarea\" && serializedNode.attributes.value !== void 0) ;\n else {\n if (serializedNode.type === NodeType.Element && serializedNode.attributes._cssText !== void 0 && typeof serializedNode.attributes._cssText === \"string\") {\n bypassOptions.cssCaptured = true;\n }\n for (const childN of Array.from(index.childNodes(n))) {\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n }\n let shadowRootEl = null;\n if (isElement(n) && (shadowRootEl = index.shadowRoot(n))) {\n for (const childN of Array.from(index.childNodes(shadowRootEl))) {\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n isNativeShadowDom(shadowRootEl) && (serializedChildNode.isShadow = true);\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n }\n }\n const parent = index.parentNode(n);\n if (parent && isShadowRoot(parent) && isNativeShadowDom(parent)) {\n serializedNode.isShadow = true;\n }\n if (serializedNode.type === NodeType.Element && serializedNode.tagName === \"iframe\") {\n onceIframeLoaded(\n n,\n () => {\n const iframeDoc = n.contentDocument;\n if (iframeDoc && onIframeLoad) {\n const serializedIframeNode = serializeNodeWithId(iframeDoc, {\n doc: iframeDoc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n needsMask,\n maskTextClass,\n maskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn\n });\n if (serializedIframeNode) {\n onIframeLoad(\n n,\n serializedIframeNode\n );\n }\n }\n },\n iframeLoadTimeout\n );\n }\n if (serializedNode.type === NodeType.Element && serializedNode.tagName === \"link\" && typeof serializedNode.attributes.rel === \"string\" && (serializedNode.attributes.rel === \"stylesheet\" || serializedNode.attributes.rel === \"preload\" && typeof serializedNode.attributes.href === \"string\" && extractFileExtension(serializedNode.attributes.href) === \"css\")) {\n onceStylesheetLoaded(\n n,\n () => {\n if (onStylesheetLoad) {\n const serializedLinkNode = serializeNodeWithId(n, {\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n needsMask,\n maskTextClass,\n maskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn\n });\n if (serializedLinkNode) {\n onStylesheetLoad(\n n,\n serializedLinkNode\n );\n }\n }\n },\n stylesheetLoadTimeout\n );\n }\n return serializedNode;\n}\nfunction snapshot(n, options) {\n const {\n mirror: mirror2 = new Mirror(),\n blockClass = \"rr-block\",\n blockSelector = null,\n maskTextClass = \"rr-mask\",\n maskTextSelector = null,\n inlineStylesheet = true,\n inlineImages = false,\n recordCanvas = false,\n maskAllInputs = false,\n maskTextFn,\n maskInputFn,\n slimDOM = false,\n dataURLOptions,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn = () => false\n } = options;\n const maskInputOptions = maskAllInputs === true ? {\n color: true,\n date: true,\n \"datetime-local\": true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n password: true\n } : maskAllInputs === false ? {\n password: true\n } : maskAllInputs;\n const slimDOMOptions = slimDOMDefaults(slimDOM);\n return serializeNodeWithId(n, {\n doc: n,\n mirror: mirror2,\n blockClass,\n blockSelector,\n maskTextClass,\n maskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n newlyAddedElement: false\n });\n}\nclass BaseRRNode {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any\n constructor(..._args) {\n __publicField(this, \"parentElement\", null);\n __publicField(this, \"parentNode\", null);\n __publicField(this, \"ownerDocument\");\n __publicField(this, \"firstChild\", null);\n __publicField(this, \"lastChild\", null);\n __publicField(this, \"previousSibling\", null);\n __publicField(this, \"nextSibling\", null);\n __publicField(this, \"ELEMENT_NODE\", 1);\n __publicField(this, \"TEXT_NODE\", 3);\n // corresponding nodeType value of standard HTML Node\n __publicField(this, \"nodeType\");\n __publicField(this, \"nodeName\");\n __publicField(this, \"RRNodeType\");\n }\n get childNodes() {\n const childNodes2 = [];\n let childIterator = this.firstChild;\n while (childIterator) {\n childNodes2.push(childIterator);\n childIterator = childIterator.nextSibling;\n }\n return childNodes2;\n }\n contains(node) {\n if (!(node instanceof BaseRRNode)) return false;\n else if (node.ownerDocument !== this.ownerDocument) return false;\n else if (node === this) return true;\n while (node.parentNode) {\n if (node.parentNode === this) return true;\n node = node.parentNode;\n }\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n appendChild(_newChild) {\n throw new Error(\n `RRDomException: Failed to execute 'appendChild' on 'RRNode': This RRNode type does not support this method.`\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n insertBefore(_newChild, _refChild) {\n throw new Error(\n `RRDomException: Failed to execute 'insertBefore' on 'RRNode': This RRNode type does not support this method.`\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n removeChild(_node) {\n throw new Error(\n `RRDomException: Failed to execute 'removeChild' on 'RRNode': This RRNode type does not support this method.`\n );\n }\n toString() {\n return \"RRNode\";\n }\n}\nfunction on(type, fn, target = document) {\n const options = { capture: true, passive: true };\n target.addEventListener(type, fn, options);\n return () => target.removeEventListener(type, fn, options);\n}\nconst DEPARTED_MIRROR_ACCESS_WARNING = \"Please stop import mirror directly. Instead of that,\\r\\nnow you can use replayer.getMirror() to access the mirror instance of a replayer,\\r\\nor you can use record.mirror to access the mirror instance during recording.\";\nlet _mirror = {\n map: {},\n getId() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return -1;\n },\n getNode() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return null;\n },\n removeNodeFromMap() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n },\n has() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return false;\n },\n reset() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n }\n};\nif (typeof window !== \"undefined\" && window.Proxy && window.Reflect) {\n _mirror = new Proxy(_mirror, {\n get(target, prop, receiver) {\n if (prop === \"map\") {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n}\nfunction throttle(func, wait, options = {}) {\n let timeout = null;\n let previous = 0;\n return function(...args) {\n const now = Date.now();\n if (!previous && options.leading === false) {\n previous = now;\n }\n const remaining = wait - (now - previous);\n const context = this;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(context, args);\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(() => {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n func.apply(context, args);\n }, remaining);\n }\n };\n}\nfunction hookSetter(target, key, d, isRevoked, win = window) {\n const original = win.Object.getOwnPropertyDescriptor(target, key);\n win.Object.defineProperty(\n target,\n key,\n isRevoked ? d : {\n set(value) {\n setTimeout(() => {\n d.set.call(this, value);\n }, 0);\n if (original && original.set) {\n original.set.call(this, value);\n }\n }\n }\n );\n return () => hookSetter(target, key, original || {}, true);\n}\nfunction getWindowScroll(win) {\n var _a2, _b, _c, _d;\n const doc = win.document;\n return {\n left: doc.scrollingElement ? doc.scrollingElement.scrollLeft : win.pageXOffset !== void 0 ? win.pageXOffset : doc.documentElement.scrollLeft || (doc == null ? void 0 : doc.body) && ((_a2 = index.parentElement(doc.body)) == null ? void 0 : _a2.scrollLeft) || ((_b = doc == null ? void 0 : doc.body) == null ? void 0 : _b.scrollLeft) || 0,\n top: doc.scrollingElement ? doc.scrollingElement.scrollTop : win.pageYOffset !== void 0 ? win.pageYOffset : (doc == null ? void 0 : doc.documentElement.scrollTop) || (doc == null ? void 0 : doc.body) && ((_c = index.parentElement(doc.body)) == null ? void 0 : _c.scrollTop) || ((_d = doc == null ? void 0 : doc.body) == null ? void 0 : _d.scrollTop) || 0\n };\n}\nfunction getWindowHeight() {\n return window.innerHeight || document.documentElement && document.documentElement.clientHeight || document.body && document.body.clientHeight;\n}\nfunction getWindowWidth() {\n return window.innerWidth || document.documentElement && document.documentElement.clientWidth || document.body && document.body.clientWidth;\n}\nfunction closestElementOfNode(node) {\n if (!node) {\n return null;\n }\n const el = node.nodeType === node.ELEMENT_NODE ? node : index.parentElement(node);\n return el;\n}\nfunction isBlocked(node, blockClass, blockSelector, checkAncestors) {\n if (!node) {\n return false;\n }\n const el = closestElementOfNode(node);\n if (!el) {\n return false;\n }\n try {\n if (typeof blockClass === \"string\") {\n if (el.classList.contains(blockClass)) return true;\n if (checkAncestors && el.closest(\".\" + blockClass) !== null) return true;\n } else {\n if (classMatchesRegex(el, blockClass, checkAncestors)) return true;\n }\n } catch (e) {\n }\n if (blockSelector) {\n if (el.matches(blockSelector)) return true;\n if (checkAncestors && el.closest(blockSelector) !== null) return true;\n }\n return false;\n}\nfunction isSerialized(n, mirror2) {\n return mirror2.getId(n) !== -1;\n}\nfunction isIgnored(n, mirror2, slimDOMOptions) {\n if (n.tagName === \"TITLE\" && slimDOMOptions.headTitleMutations) {\n return true;\n }\n return mirror2.getId(n) === IGNORED_NODE;\n}\nfunction isAncestorRemoved(target, mirror2) {\n if (isShadowRoot(target)) {\n return false;\n }\n const id = mirror2.getId(target);\n if (!mirror2.has(id)) {\n return true;\n }\n const parent = index.parentNode(target);\n if (parent && parent.nodeType === target.DOCUMENT_NODE) {\n return false;\n }\n if (!parent) {\n return true;\n }\n return isAncestorRemoved(parent, mirror2);\n}\nfunction legacy_isTouchEvent(event) {\n return Boolean(event.changedTouches);\n}\nfunction polyfill(win = window) {\n if (\"NodeList\" in win && !win.NodeList.prototype.forEach) {\n win.NodeList.prototype.forEach = Array.prototype.forEach;\n }\n if (\"DOMTokenList\" in win && !win.DOMTokenList.prototype.forEach) {\n win.DOMTokenList.prototype.forEach = Array.prototype.forEach;\n }\n}\nfunction isSerializedIframe(n, mirror2) {\n return Boolean(n.nodeName === \"IFRAME\" && mirror2.getMeta(n));\n}\nfunction isSerializedStylesheet(n, mirror2) {\n return Boolean(\n n.nodeName === \"LINK\" && n.nodeType === n.ELEMENT_NODE && n.getAttribute && n.getAttribute(\"rel\") === \"stylesheet\" && mirror2.getMeta(n)\n );\n}\nfunction hasShadowRoot(n) {\n if (!n) return false;\n if (n instanceof BaseRRNode && \"shadowRoot\" in n) {\n return Boolean(n.shadowRoot);\n }\n return Boolean(index.shadowRoot(n));\n}\nclass StyleSheetMirror {\n constructor() {\n __publicField(this, \"id\", 1);\n __publicField(this, \"styleIDMap\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"idStyleMap\", /* @__PURE__ */ new Map());\n }\n getId(stylesheet) {\n return this.styleIDMap.get(stylesheet) ?? -1;\n }\n has(stylesheet) {\n return this.styleIDMap.has(stylesheet);\n }\n /**\n * @returns If the stylesheet is in the mirror, returns the id of the stylesheet. If not, return the new assigned id.\n */\n add(stylesheet, id) {\n if (this.has(stylesheet)) return this.getId(stylesheet);\n let newId;\n if (id === void 0) {\n newId = this.id++;\n } else newId = id;\n this.styleIDMap.set(stylesheet, newId);\n this.idStyleMap.set(newId, stylesheet);\n return newId;\n }\n getStyle(id) {\n return this.idStyleMap.get(id) || null;\n }\n reset() {\n this.styleIDMap = /* @__PURE__ */ new WeakMap();\n this.idStyleMap = /* @__PURE__ */ new Map();\n this.id = 1;\n }\n generateId() {\n return this.id++;\n }\n}\nfunction getShadowHost(n) {\n var _a2;\n let shadowHost = null;\n if (\"getRootNode\" in n && ((_a2 = index.getRootNode(n)) == null ? void 0 : _a2.nodeType) === Node.DOCUMENT_FRAGMENT_NODE && index.host(index.getRootNode(n)))\n shadowHost = index.host(index.getRootNode(n));\n return shadowHost;\n}\nfunction getRootShadowHost(n) {\n let rootShadowHost = n;\n let shadowHost;\n while (shadowHost = getShadowHost(rootShadowHost))\n rootShadowHost = shadowHost;\n return rootShadowHost;\n}\nfunction shadowHostInDom(n) {\n const doc = index.ownerDocument(n);\n if (!doc) return false;\n const shadowHost = getRootShadowHost(n);\n return index.contains(doc, shadowHost);\n}\nfunction inDom(n) {\n const doc = index.ownerDocument(n);\n if (!doc) return false;\n return index.contains(doc, n) || shadowHostInDom(n);\n}\nfunction isNodeInLinkedList(n) {\n return \"__ln\" in n;\n}\nclass DoubleLinkedList {\n constructor() {\n __publicField(this, \"length\", 0);\n __publicField(this, \"head\", null);\n __publicField(this, \"tail\", null);\n }\n get(position) {\n if (position >= this.length) {\n throw new Error(\"Position outside of list range\");\n }\n let current = this.head;\n for (let index2 = 0; index2 < position; index2++) {\n current = (current == null ? void 0 : current.next) || null;\n }\n return current;\n }\n addNode(n) {\n const node = {\n value: n,\n previous: null,\n next: null\n };\n n.__ln = node;\n if (n.previousSibling && isNodeInLinkedList(n.previousSibling)) {\n const current = n.previousSibling.__ln.next;\n node.next = current;\n node.previous = n.previousSibling.__ln;\n n.previousSibling.__ln.next = node;\n if (current) {\n current.previous = node;\n }\n } else if (n.nextSibling && isNodeInLinkedList(n.nextSibling) && n.nextSibling.__ln.previous) {\n const current = n.nextSibling.__ln.previous;\n node.previous = current;\n node.next = n.nextSibling.__ln;\n n.nextSibling.__ln.previous = node;\n if (current) {\n current.next = node;\n }\n } else {\n if (this.head) {\n this.head.previous = node;\n }\n node.next = this.head;\n this.head = node;\n }\n if (node.next === null) {\n this.tail = node;\n }\n this.length++;\n }\n removeNode(n) {\n const current = n.__ln;\n if (!this.head) {\n return;\n }\n if (!current.previous) {\n this.head = current.next;\n if (this.head) {\n this.head.previous = null;\n } else {\n this.tail = null;\n }\n } else {\n current.previous.next = current.next;\n if (current.next) {\n current.next.previous = current.previous;\n } else {\n this.tail = current.previous;\n }\n }\n if (n.__ln) {\n delete n.__ln;\n }\n this.length--;\n }\n}\nconst moveKey = (id, parentId) => `${id}@${parentId}`;\nclass MutationBuffer {\n constructor() {\n __publicField(this, \"frozen\", false);\n __publicField(this, \"locked\", false);\n __publicField(this, \"texts\", []);\n __publicField(this, \"attributes\", []);\n __publicField(this, \"attributeMap\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"removes\", []);\n __publicField(this, \"mapRemoves\", []);\n __publicField(this, \"movedMap\", {});\n /**\n * the browser MutationObserver emits multiple mutations after\n * a delay for performance reasons, making tracing added nodes hard\n * in our `processMutations` callback function.\n * For example, if we append an element el_1 into body, and then append\n * another element el_2 into el_1, these two mutations may be passed to the\n * callback function together when the two operations were done.\n * Generally we need to trace child nodes of newly added nodes, but in this\n * case if we count el_2 as el_1's child node in the first mutation record,\n * then we will count el_2 again in the second mutation record which was\n * duplicated.\n * To avoid of duplicate counting added nodes, we use a Set to store\n * added nodes and its child nodes during iterate mutation records. Then\n * collect added nodes from the Set which have no duplicate copy. But\n * this also causes newly added nodes will not be serialized with id ASAP,\n * which means all the id related calculation should be lazy too.\n */\n __publicField(this, \"addedSet\", /* @__PURE__ */ new Set());\n __publicField(this, \"movedSet\", /* @__PURE__ */ new Set());\n __publicField(this, \"droppedSet\", /* @__PURE__ */ new Set());\n __publicField(this, \"removesSubTreeCache\", /* @__PURE__ */ new Set());\n __publicField(this, \"mutationCb\");\n __publicField(this, \"blockClass\");\n __publicField(this, \"blockSelector\");\n __publicField(this, \"maskTextClass\");\n __publicField(this, \"maskTextSelector\");\n __publicField(this, \"inlineStylesheet\");\n __publicField(this, \"maskInputOptions\");\n __publicField(this, \"maskTextFn\");\n __publicField(this, \"maskInputFn\");\n __publicField(this, \"keepIframeSrcFn\");\n __publicField(this, \"recordCanvas\");\n __publicField(this, \"inlineImages\");\n __publicField(this, \"slimDOMOptions\");\n __publicField(this, \"dataURLOptions\");\n __publicField(this, \"doc\");\n __publicField(this, \"mirror\");\n __publicField(this, \"iframeManager\");\n __publicField(this, \"stylesheetManager\");\n __publicField(this, \"shadowDomManager\");\n __publicField(this, \"canvasManager\");\n __publicField(this, \"processedNodeManager\");\n __publicField(this, \"unattachedDoc\");\n __publicField(this, \"processMutations\", (mutations) => {\n mutations.forEach(this.processMutation);\n this.emit();\n });\n __publicField(this, \"emit\", () => {\n if (this.frozen || this.locked) {\n return;\n }\n const adds = [];\n const addedIds = /* @__PURE__ */ new Set();\n const addList = new DoubleLinkedList();\n const getNextId = (n) => {\n let ns = n;\n let nextId = IGNORED_NODE;\n while (nextId === IGNORED_NODE) {\n ns = ns && ns.nextSibling;\n nextId = ns && this.mirror.getId(ns);\n }\n return nextId;\n };\n const pushAdd = (n) => {\n const parent = index.parentNode(n);\n if (!parent || !inDom(n)) {\n return;\n }\n let cssCaptured = false;\n if (n.nodeType === Node.TEXT_NODE) {\n const parentTag = parent.tagName;\n if (parentTag === \"TEXTAREA\") {\n return;\n } else if (parentTag === \"STYLE\" && this.addedSet.has(parent)) {\n cssCaptured = true;\n }\n }\n const parentId = isShadowRoot(parent) ? this.mirror.getId(getShadowHost(n)) : this.mirror.getId(parent);\n const nextId = getNextId(n);\n if (parentId === -1 || nextId === -1) {\n return addList.addNode(n);\n }\n const sn = serializeNodeWithId(n, {\n doc: this.doc,\n mirror: this.mirror,\n blockClass: this.blockClass,\n blockSelector: this.blockSelector,\n maskTextClass: this.maskTextClass,\n maskTextSelector: this.maskTextSelector,\n skipChild: true,\n newlyAddedElement: true,\n inlineStylesheet: this.inlineStylesheet,\n maskInputOptions: this.maskInputOptions,\n maskTextFn: this.maskTextFn,\n maskInputFn: this.maskInputFn,\n slimDOMOptions: this.slimDOMOptions,\n dataURLOptions: this.dataURLOptions,\n recordCanvas: this.recordCanvas,\n inlineImages: this.inlineImages,\n onSerialize: (currentN) => {\n if (isSerializedIframe(currentN, this.mirror)) {\n this.iframeManager.addIframe(currentN);\n }\n if (isSerializedStylesheet(currentN, this.mirror)) {\n this.stylesheetManager.trackLinkElement(\n currentN\n );\n }\n if (hasShadowRoot(n)) {\n this.shadowDomManager.addShadowRoot(index.shadowRoot(n), this.doc);\n }\n },\n onIframeLoad: (iframe, childSn) => {\n this.iframeManager.attachIframe(iframe, childSn);\n this.shadowDomManager.observeAttachShadow(iframe);\n },\n onStylesheetLoad: (link, childSn) => {\n this.stylesheetManager.attachLinkElement(link, childSn);\n },\n cssCaptured\n });\n if (sn) {\n adds.push({\n parentId,\n nextId,\n node: sn\n });\n addedIds.add(sn.id);\n }\n };\n while (this.mapRemoves.length) {\n this.mirror.removeNodeFromMap(this.mapRemoves.shift());\n }\n for (const n of this.movedSet) {\n if (isParentRemoved(this.removesSubTreeCache, n, this.mirror) && !this.movedSet.has(index.parentNode(n))) {\n continue;\n }\n pushAdd(n);\n }\n for (const n of this.addedSet) {\n if (!isAncestorInSet(this.droppedSet, n) && !isParentRemoved(this.removesSubTreeCache, n, this.mirror)) {\n pushAdd(n);\n } else if (isAncestorInSet(this.movedSet, n)) {\n pushAdd(n);\n } else {\n this.droppedSet.add(n);\n }\n }\n let candidate = null;\n while (addList.length) {\n let node = null;\n if (candidate) {\n const parentId = this.mirror.getId(index.parentNode(candidate.value));\n const nextId = getNextId(candidate.value);\n if (parentId !== -1 && nextId !== -1) {\n node = candidate;\n }\n }\n if (!node) {\n let tailNode = addList.tail;\n while (tailNode) {\n const _node = tailNode;\n tailNode = tailNode.previous;\n if (_node) {\n const parentId = this.mirror.getId(index.parentNode(_node.value));\n const nextId = getNextId(_node.value);\n if (nextId === -1) continue;\n else if (parentId !== -1) {\n node = _node;\n break;\n } else {\n const unhandledNode = _node.value;\n const parent = index.parentNode(unhandledNode);\n if (parent && parent.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n const shadowHost = index.host(parent);\n const parentId2 = this.mirror.getId(shadowHost);\n if (parentId2 !== -1) {\n node = _node;\n break;\n }\n }\n }\n }\n }\n }\n if (!node) {\n while (addList.head) {\n addList.removeNode(addList.head.value);\n }\n break;\n }\n candidate = node.previous;\n addList.removeNode(node.value);\n pushAdd(node.value);\n }\n const payload = {\n texts: this.texts.map((text) => {\n const n = text.node;\n const parent = index.parentNode(n);\n if (parent && parent.tagName === \"TEXTAREA\") {\n this.genTextAreaValueMutation(parent);\n }\n return {\n id: this.mirror.getId(n),\n value: text.value\n };\n }).filter((text) => !addedIds.has(text.id)).filter((text) => this.mirror.has(text.id)),\n attributes: this.attributes.map((attribute) => {\n const { attributes } = attribute;\n if (typeof attributes.style === \"string\") {\n const diffAsStr = JSON.stringify(attribute.styleDiff);\n const unchangedAsStr = JSON.stringify(attribute._unchangedStyles);\n if (diffAsStr.length < attributes.style.length) {\n if ((diffAsStr + unchangedAsStr).split(\"var(\").length === attributes.style.split(\"var(\").length) {\n attributes.style = attribute.styleDiff;\n }\n }\n }\n return {\n id: this.mirror.getId(attribute.node),\n attributes\n };\n }).filter((attribute) => !addedIds.has(attribute.id)).filter((attribute) => this.mirror.has(attribute.id)),\n removes: this.removes,\n adds\n };\n if (!payload.texts.length && !payload.attributes.length && !payload.removes.length && !payload.adds.length) {\n return;\n }\n this.texts = [];\n this.attributes = [];\n this.attributeMap = /* @__PURE__ */ new WeakMap();\n this.removes = [];\n this.addedSet = /* @__PURE__ */ new Set();\n this.movedSet = /* @__PURE__ */ new Set();\n this.droppedSet = /* @__PURE__ */ new Set();\n this.removesSubTreeCache = /* @__PURE__ */ new Set();\n this.movedMap = {};\n this.mutationCb(payload);\n });\n __publicField(this, \"genTextAreaValueMutation\", (textarea) => {\n let item = this.attributeMap.get(textarea);\n if (!item) {\n item = {\n node: textarea,\n attributes: {},\n styleDiff: {},\n _unchangedStyles: {}\n };\n this.attributes.push(item);\n this.attributeMap.set(textarea, item);\n }\n const value = Array.from(\n index.childNodes(textarea),\n (cn) => index.textContent(cn) || \"\"\n ).join(\"\");\n item.attributes.value = maskInputValue({\n element: textarea,\n maskInputOptions: this.maskInputOptions,\n tagName: textarea.tagName,\n type: getInputType(textarea),\n value,\n maskInputFn: this.maskInputFn\n });\n });\n __publicField(this, \"processMutation\", (m) => {\n if (isIgnored(m.target, this.mirror, this.slimDOMOptions)) {\n return;\n }\n switch (m.type) {\n case \"characterData\": {\n const value = index.textContent(m.target);\n if (!isBlocked(m.target, this.blockClass, this.blockSelector, false) && value !== m.oldValue) {\n this.texts.push({\n value: needMaskingText(\n m.target,\n this.maskTextClass,\n this.maskTextSelector,\n true\n // checkAncestors\n ) && value ? this.maskTextFn ? this.maskTextFn(value, closestElementOfNode(m.target)) : value.replace(/[\\S]/g, \"*\") : value,\n node: m.target\n });\n }\n break;\n }\n case \"attributes\": {\n const target = m.target;\n let attributeName = m.attributeName;\n let value = m.target.getAttribute(attributeName);\n if (attributeName === \"value\") {\n const type = getInputType(target);\n value = maskInputValue({\n element: target,\n maskInputOptions: this.maskInputOptions,\n tagName: target.tagName,\n type,\n value,\n maskInputFn: this.maskInputFn\n });\n }\n if (isBlocked(m.target, this.blockClass, this.blockSelector, false) || value === m.oldValue) {\n return;\n }\n let item = this.attributeMap.get(m.target);\n if (target.tagName === \"IFRAME\" && attributeName === \"src\" && !this.keepIframeSrcFn(value)) {\n if (!target.contentDocument) {\n attributeName = \"rr_src\";\n } else {\n return;\n }\n }\n if (!item) {\n item = {\n node: m.target,\n attributes: {},\n styleDiff: {},\n _unchangedStyles: {}\n };\n this.attributes.push(item);\n this.attributeMap.set(m.target, item);\n }\n if (attributeName === \"type\" && target.tagName === \"INPUT\" && (m.oldValue || \"\").toLowerCase() === \"password\") {\n target.setAttribute(\"data-rr-is-password\", \"true\");\n }\n if (!ignoreAttribute(target.tagName, attributeName)) {\n item.attributes[attributeName] = transformAttribute(\n this.doc,\n toLowerCase(target.tagName),\n toLowerCase(attributeName),\n value\n );\n if (attributeName === \"style\") {\n if (!this.unattachedDoc) {\n try {\n this.unattachedDoc = document.implementation.createHTMLDocument();\n } catch (e) {\n this.unattachedDoc = this.doc;\n }\n }\n const old = this.unattachedDoc.createElement(\"span\");\n if (m.oldValue) {\n old.setAttribute(\"style\", m.oldValue);\n }\n for (const pname of Array.from(target.style)) {\n const newValue = target.style.getPropertyValue(pname);\n const newPriority = target.style.getPropertyPriority(pname);\n if (newValue !== old.style.getPropertyValue(pname) || newPriority !== old.style.getPropertyPriority(pname)) {\n if (newPriority === \"\") {\n item.styleDiff[pname] = newValue;\n } else {\n item.styleDiff[pname] = [newValue, newPriority];\n }\n } else {\n item._unchangedStyles[pname] = [newValue, newPriority];\n }\n }\n for (const pname of Array.from(old.style)) {\n if (target.style.getPropertyValue(pname) === \"\") {\n item.styleDiff[pname] = false;\n }\n }\n } else if (attributeName === \"open\" && target.tagName === \"DIALOG\") {\n if (target.matches(\"dialog:modal\")) {\n item.attributes[\"rr_open_mode\"] = \"modal\";\n } else {\n item.attributes[\"rr_open_mode\"] = \"non-modal\";\n }\n }\n }\n break;\n }\n case \"childList\": {\n if (isBlocked(m.target, this.blockClass, this.blockSelector, true))\n return;\n if (m.target.tagName === \"TEXTAREA\") {\n this.genTextAreaValueMutation(m.target);\n return;\n }\n m.addedNodes.forEach((n) => this.genAdds(n, m.target));\n m.removedNodes.forEach((n) => {\n const nodeId = this.mirror.getId(n);\n const parentId = isShadowRoot(m.target) ? this.mirror.getId(index.host(m.target)) : this.mirror.getId(m.target);\n if (isBlocked(m.target, this.blockClass, this.blockSelector, false) || isIgnored(n, this.mirror, this.slimDOMOptions) || !isSerialized(n, this.mirror)) {\n return;\n }\n if (this.addedSet.has(n)) {\n deepDelete(this.addedSet, n);\n this.droppedSet.add(n);\n } else if (this.addedSet.has(m.target) && nodeId === -1) ;\n else if (isAncestorRemoved(m.target, this.mirror)) ;\n else if (this.movedSet.has(n) && this.movedMap[moveKey(nodeId, parentId)]) {\n deepDelete(this.movedSet, n);\n } else {\n this.removes.push({\n parentId,\n id: nodeId,\n isShadow: isShadowRoot(m.target) && isNativeShadowDom(m.target) ? true : void 0\n });\n processRemoves(n, this.removesSubTreeCache);\n }\n this.mapRemoves.push(n);\n });\n break;\n }\n }\n });\n /**\n * Make sure you check if `n`'s parent is blocked before calling this function\n * */\n __publicField(this, \"genAdds\", (n, target) => {\n if (this.processedNodeManager.inOtherBuffer(n, this)) return;\n if (this.addedSet.has(n) || this.movedSet.has(n)) return;\n if (this.mirror.hasNode(n)) {\n if (isIgnored(n, this.mirror, this.slimDOMOptions)) {\n return;\n }\n this.movedSet.add(n);\n let targetId = null;\n if (target && this.mirror.hasNode(target)) {\n targetId = this.mirror.getId(target);\n }\n if (targetId && targetId !== -1) {\n this.movedMap[moveKey(this.mirror.getId(n), targetId)] = true;\n }\n } else {\n this.addedSet.add(n);\n this.droppedSet.delete(n);\n }\n if (!isBlocked(n, this.blockClass, this.blockSelector, false)) {\n index.childNodes(n).forEach((childN) => this.genAdds(childN));\n if (hasShadowRoot(n)) {\n index.childNodes(index.shadowRoot(n)).forEach((childN) => {\n this.processedNodeManager.add(childN, this);\n this.genAdds(childN, n);\n });\n }\n }\n });\n }\n init(options) {\n [\n \"mutationCb\",\n \"blockClass\",\n \"blockSelector\",\n \"maskTextClass\",\n \"maskTextSelector\",\n \"inlineStylesheet\",\n \"maskInputOptions\",\n \"maskTextFn\",\n \"maskInputFn\",\n \"keepIframeSrcFn\",\n \"recordCanvas\",\n \"inlineImages\",\n \"slimDOMOptions\",\n \"dataURLOptions\",\n \"doc\",\n \"mirror\",\n \"iframeManager\",\n \"stylesheetManager\",\n \"shadowDomManager\",\n \"canvasManager\",\n \"processedNodeManager\"\n ].forEach((key) => {\n this[key] = options[key];\n });\n }\n freeze() {\n this.frozen = true;\n this.canvasManager.freeze();\n }\n unfreeze() {\n this.frozen = false;\n this.canvasManager.unfreeze();\n this.emit();\n }\n isFrozen() {\n return this.frozen;\n }\n lock() {\n this.locked = true;\n this.canvasManager.lock();\n }\n unlock() {\n this.locked = false;\n this.canvasManager.unlock();\n this.emit();\n }\n reset() {\n this.shadowDomManager.reset();\n this.canvasManager.reset();\n }\n}\nfunction deepDelete(addsSet, n) {\n addsSet.delete(n);\n index.childNodes(n).forEach((childN) => deepDelete(addsSet, childN));\n}\nfunction processRemoves(n, cache) {\n const queue = [n];\n while (queue.length) {\n const next = queue.pop();\n if (cache.has(next)) continue;\n cache.add(next);\n index.childNodes(next).forEach((n2) => queue.push(n2));\n }\n return;\n}\nfunction isParentRemoved(removes, n, mirror2) {\n if (removes.size === 0) return false;\n return _isParentRemoved(removes, n);\n}\nfunction _isParentRemoved(removes, n, _mirror2) {\n const node = index.parentNode(n);\n if (!node) return false;\n return removes.has(node);\n}\nfunction isAncestorInSet(set, n) {\n if (set.size === 0) return false;\n return _isAncestorInSet(set, n);\n}\nfunction _isAncestorInSet(set, n) {\n const parent = index.parentNode(n);\n if (!parent) {\n return false;\n }\n if (set.has(parent)) {\n return true;\n }\n return _isAncestorInSet(set, parent);\n}\nlet errorHandler;\nfunction registerErrorHandler(handler) {\n errorHandler = handler;\n}\nfunction unregisterErrorHandler() {\n errorHandler = void 0;\n}\nconst callbackWrapper = (cb) => {\n if (!errorHandler) {\n return cb;\n }\n const rrwebWrapped = (...rest) => {\n try {\n return cb(...rest);\n } catch (error) {\n if (errorHandler && errorHandler(error) === true) {\n return;\n }\n throw error;\n }\n };\n return rrwebWrapped;\n};\nconst mutationBuffers = [];\nfunction getEventTarget(event) {\n try {\n if (\"composedPath\" in event) {\n const path = event.composedPath();\n if (path.length) {\n return path[0];\n }\n } else if (\"path\" in event && event.path.length) {\n return event.path[0];\n }\n } catch {\n }\n return event && event.target;\n}\nfunction initMutationObserver(options, rootEl) {\n const mutationBuffer = new MutationBuffer();\n mutationBuffers.push(mutationBuffer);\n mutationBuffer.init(options);\n const [ObserverCtor, iframeCleanup] = mutationObserverCtor();\n const observer = new ObserverCtor(\n callbackWrapper(mutationBuffer.processMutations.bind(mutationBuffer))\n );\n observer.observe(rootEl, {\n attributes: true,\n attributeOldValue: true,\n characterData: true,\n characterDataOldValue: true,\n childList: true,\n subtree: true\n });\n return [observer, iframeCleanup];\n}\nfunction initMoveObserver({\n mousemoveCb,\n sampling,\n doc,\n mirror: mirror2\n}) {\n if (sampling.mousemove === false) {\n return () => {\n };\n }\n const threshold = typeof sampling.mousemove === \"number\" ? sampling.mousemove : 50;\n const callbackThreshold = typeof sampling.mousemoveCallback === \"number\" ? sampling.mousemoveCallback : 500;\n let positions = [];\n let timeBaseline;\n const wrappedCb = throttle(\n callbackWrapper(\n (source) => {\n const totalOffset = Date.now() - timeBaseline;\n mousemoveCb(\n positions.map((p) => {\n p.timeOffset -= totalOffset;\n return p;\n }),\n source\n );\n positions = [];\n timeBaseline = null;\n }\n ),\n callbackThreshold\n );\n const updatePosition = callbackWrapper(\n throttle(\n callbackWrapper((evt) => {\n const target = getEventTarget(evt);\n const { clientX, clientY } = legacy_isTouchEvent(evt) ? evt.changedTouches[0] : evt;\n if (!timeBaseline) {\n timeBaseline = nowTimestamp();\n }\n positions.push({\n x: clientX,\n y: clientY,\n id: mirror2.getId(target),\n timeOffset: nowTimestamp() - timeBaseline\n });\n wrappedCb(\n typeof DragEvent !== \"undefined\" && evt instanceof DragEvent ? IncrementalSource.Drag : evt instanceof MouseEvent ? IncrementalSource.MouseMove : IncrementalSource.TouchMove\n );\n }),\n threshold,\n {\n trailing: false\n }\n )\n );\n const handlers = [\n on(\"mousemove\", updatePosition, doc),\n on(\"touchmove\", updatePosition, doc),\n on(\"drag\", updatePosition, doc)\n ];\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initMouseInteractionObserver({\n mouseInteractionCb,\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n sampling\n}) {\n if (sampling.mouseInteraction === false) {\n return () => {\n };\n }\n const disableMap = sampling.mouseInteraction === true || sampling.mouseInteraction === void 0 ? {} : sampling.mouseInteraction;\n const handlers = [];\n let currentPointerType = null;\n const getHandler = (eventKey) => {\n return (event) => {\n const target = getEventTarget(event);\n if (isBlocked(target, blockClass, blockSelector, true)) {\n return;\n }\n let pointerType = null;\n let thisEventKey = eventKey;\n if (\"pointerType\" in event) {\n switch (event.pointerType) {\n case \"mouse\":\n pointerType = PointerTypes.Mouse;\n break;\n case \"touch\":\n pointerType = PointerTypes.Touch;\n break;\n case \"pen\":\n pointerType = PointerTypes.Pen;\n break;\n }\n if (pointerType === PointerTypes.Touch) {\n if (MouseInteractions[eventKey] === MouseInteractions.MouseDown) {\n thisEventKey = \"TouchStart\";\n } else if (MouseInteractions[eventKey] === MouseInteractions.MouseUp) {\n thisEventKey = \"TouchEnd\";\n }\n } else if (pointerType === PointerTypes.Pen) ;\n } else if (legacy_isTouchEvent(event)) {\n pointerType = PointerTypes.Touch;\n }\n if (pointerType !== null) {\n currentPointerType = pointerType;\n if (thisEventKey.startsWith(\"Touch\") && pointerType === PointerTypes.Touch || thisEventKey.startsWith(\"Mouse\") && pointerType === PointerTypes.Mouse) {\n pointerType = null;\n }\n } else if (MouseInteractions[eventKey] === MouseInteractions.Click) {\n pointerType = currentPointerType;\n currentPointerType = null;\n }\n const e = legacy_isTouchEvent(event) ? event.changedTouches[0] : event;\n if (!e) {\n return;\n }\n const id = mirror2.getId(target);\n const { clientX, clientY } = e;\n callbackWrapper(mouseInteractionCb)({\n type: MouseInteractions[thisEventKey],\n id,\n x: clientX,\n y: clientY,\n ...pointerType !== null && { pointerType }\n });\n };\n };\n Object.keys(MouseInteractions).filter(\n (key) => Number.isNaN(Number(key)) && !key.endsWith(\"_Departed\") && disableMap[key] !== false\n ).forEach((eventKey) => {\n let eventName = toLowerCase(eventKey);\n const handler = getHandler(eventKey);\n if (window.PointerEvent) {\n switch (MouseInteractions[eventKey]) {\n case MouseInteractions.MouseDown:\n case MouseInteractions.MouseUp:\n eventName = eventName.replace(\n \"mouse\",\n \"pointer\"\n );\n break;\n case MouseInteractions.TouchStart:\n case MouseInteractions.TouchEnd:\n return;\n }\n }\n handlers.push(on(eventName, handler, doc));\n });\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initScrollObserver({\n scrollCb,\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n sampling\n}) {\n const updatePosition = callbackWrapper(\n throttle(\n callbackWrapper((evt) => {\n const target = getEventTarget(evt);\n if (!target || isBlocked(target, blockClass, blockSelector, true)) {\n return;\n }\n const id = mirror2.getId(target);\n if (target === doc && doc.defaultView) {\n const scrollLeftTop = getWindowScroll(doc.defaultView);\n scrollCb({\n id,\n x: scrollLeftTop.left,\n y: scrollLeftTop.top\n });\n } else {\n scrollCb({\n id,\n x: target.scrollLeft,\n y: target.scrollTop\n });\n }\n }),\n sampling.scroll || 100\n )\n );\n return on(\"scroll\", updatePosition, doc);\n}\nfunction initViewportResizeObserver({ viewportResizeCb }, { win }) {\n let lastH = -1;\n let lastW = -1;\n const updateDimension = callbackWrapper(\n throttle(\n callbackWrapper(() => {\n const height = getWindowHeight();\n const width = getWindowWidth();\n if (lastH !== height || lastW !== width) {\n viewportResizeCb({\n width: Number(width),\n height: Number(height)\n });\n lastH = height;\n lastW = width;\n }\n }),\n 200\n )\n );\n return on(\"resize\", updateDimension, win);\n}\nconst INPUT_TAGS = [\"INPUT\", \"TEXTAREA\", \"SELECT\"];\nconst lastInputValueMap = /* @__PURE__ */ new WeakMap();\nfunction initInputObserver({\n inputCb,\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n ignoreClass,\n ignoreSelector,\n maskInputOptions,\n maskInputFn,\n sampling,\n userTriggeredOnInput\n}) {\n function eventHandler(event) {\n let target = getEventTarget(event);\n const userTriggered = event.isTrusted;\n const tagName = target && target.tagName;\n if (target && tagName === \"OPTION\") {\n target = index.parentElement(target);\n }\n if (!target || !tagName || INPUT_TAGS.indexOf(tagName) < 0 || isBlocked(target, blockClass, blockSelector, true)) {\n return;\n }\n if (target.classList.contains(ignoreClass) || ignoreSelector && target.matches(ignoreSelector)) {\n return;\n }\n let text = target.value;\n let isChecked = false;\n const type = getInputType(target) || \"\";\n if (type === \"radio\" || type === \"checkbox\") {\n isChecked = target.checked;\n } else if (maskInputOptions[tagName.toLowerCase()] || maskInputOptions[type]) {\n text = maskInputValue({\n element: target,\n maskInputOptions,\n tagName,\n type,\n value: text,\n maskInputFn\n });\n }\n cbWithDedup(\n target,\n userTriggeredOnInput ? { text, isChecked, userTriggered } : { text, isChecked }\n );\n const name = target.name;\n if (type === \"radio\" && name && isChecked) {\n doc.querySelectorAll(`input[type=\"radio\"][name=\"${name}\"]`).forEach((el) => {\n if (el !== target) {\n const text2 = el.value;\n cbWithDedup(\n el,\n userTriggeredOnInput ? { text: text2, isChecked: !isChecked, userTriggered: false } : { text: text2, isChecked: !isChecked }\n );\n }\n });\n }\n }\n function cbWithDedup(target, v) {\n const lastInputValue = lastInputValueMap.get(target);\n if (!lastInputValue || lastInputValue.text !== v.text || lastInputValue.isChecked !== v.isChecked) {\n lastInputValueMap.set(target, v);\n const id = mirror2.getId(target);\n callbackWrapper(inputCb)({\n ...v,\n id\n });\n }\n }\n const events = sampling.input === \"last\" ? [\"change\"] : [\"input\", \"change\"];\n const handlers = events.map(\n (eventName) => on(eventName, callbackWrapper(eventHandler), doc)\n );\n const currentWindow = doc.defaultView;\n if (!currentWindow) {\n return () => {\n handlers.forEach((h) => h());\n };\n }\n const propertyDescriptor = currentWindow.Object.getOwnPropertyDescriptor(\n currentWindow.HTMLInputElement.prototype,\n \"value\"\n );\n const hookProperties = [\n [currentWindow.HTMLInputElement.prototype, \"value\"],\n [currentWindow.HTMLInputElement.prototype, \"checked\"],\n [currentWindow.HTMLSelectElement.prototype, \"value\"],\n [currentWindow.HTMLTextAreaElement.prototype, \"value\"],\n // Some UI library use selectedIndex to set select value\n [currentWindow.HTMLSelectElement.prototype, \"selectedIndex\"],\n [currentWindow.HTMLOptionElement.prototype, \"selected\"]\n ];\n if (propertyDescriptor && propertyDescriptor.set) {\n handlers.push(\n ...hookProperties.map(\n (p) => hookSetter(\n p[0],\n p[1],\n {\n set() {\n callbackWrapper(eventHandler)({\n target: this,\n isTrusted: false\n // userTriggered to false as this could well be programmatic\n });\n }\n },\n false,\n currentWindow\n )\n )\n );\n }\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction getNestedCSSRulePositions(rule) {\n const positions = [];\n function recurse(childRule, pos) {\n if (hasNestedCSSRule(\"CSSGroupingRule\") && childRule.parentRule instanceof CSSGroupingRule || hasNestedCSSRule(\"CSSMediaRule\") && childRule.parentRule instanceof CSSMediaRule || hasNestedCSSRule(\"CSSSupportsRule\") && childRule.parentRule instanceof CSSSupportsRule || hasNestedCSSRule(\"CSSConditionRule\") && childRule.parentRule instanceof CSSConditionRule) {\n const rules = Array.from(\n childRule.parentRule.cssRules\n );\n const index2 = rules.indexOf(childRule);\n pos.unshift(index2);\n return recurse(childRule.parentRule, pos);\n } else if (childRule.parentStyleSheet) {\n const rules = Array.from(childRule.parentStyleSheet.cssRules);\n const index2 = rules.indexOf(childRule);\n pos.unshift(index2);\n }\n return pos;\n }\n return recurse(rule, positions);\n}\nfunction getIdAndStyleId(sheet, mirror2, styleMirror) {\n let id, styleId;\n if (!sheet) return {};\n if (sheet.ownerNode) id = mirror2.getId(sheet.ownerNode);\n else styleId = styleMirror.getId(sheet);\n return {\n styleId,\n id\n };\n}\nfunction initStyleSheetObserver({ styleSheetRuleCb, mirror: mirror2, stylesheetManager }, { win }) {\n if (!win.CSSStyleSheet || !win.CSSStyleSheet.prototype) {\n return () => {\n };\n }\n const insertRule = win.CSSStyleSheet.prototype.insertRule;\n win.CSSStyleSheet.prototype.insertRule = new Proxy(insertRule, {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n const [rule, index2] = argumentsList;\n const { id, styleId } = getIdAndStyleId(\n thisArg,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleSheetRuleCb({\n id,\n styleId,\n adds: [{ rule, index: index2 }]\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n });\n win.CSSStyleSheet.prototype.addRule = function(selector, styleBlock, index2 = this.cssRules.length) {\n const rule = `${selector} { ${styleBlock} }`;\n return win.CSSStyleSheet.prototype.insertRule.apply(this, [rule, index2]);\n };\n const deleteRule = win.CSSStyleSheet.prototype.deleteRule;\n win.CSSStyleSheet.prototype.deleteRule = new Proxy(deleteRule, {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n const [index2] = argumentsList;\n const { id, styleId } = getIdAndStyleId(\n thisArg,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleSheetRuleCb({\n id,\n styleId,\n removes: [{ index: index2 }]\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n });\n win.CSSStyleSheet.prototype.removeRule = function(index2) {\n return win.CSSStyleSheet.prototype.deleteRule.apply(this, [index2]);\n };\n let replace;\n if (win.CSSStyleSheet.prototype.replace) {\n replace = win.CSSStyleSheet.prototype.replace;\n win.CSSStyleSheet.prototype.replace = new Proxy(replace, {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n const [text] = argumentsList;\n const { id, styleId } = getIdAndStyleId(\n thisArg,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleSheetRuleCb({\n id,\n styleId,\n replace: text\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n });\n }\n let replaceSync;\n if (win.CSSStyleSheet.prototype.replaceSync) {\n replaceSync = win.CSSStyleSheet.prototype.replaceSync;\n win.CSSStyleSheet.prototype.replaceSync = new Proxy(replaceSync, {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n const [text] = argumentsList;\n const { id, styleId } = getIdAndStyleId(\n thisArg,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleSheetRuleCb({\n id,\n styleId,\n replaceSync: text\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n });\n }\n const supportedNestedCSSRuleTypes = {};\n if (canMonkeyPatchNestedCSSRule(\"CSSGroupingRule\")) {\n supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule;\n } else {\n if (canMonkeyPatchNestedCSSRule(\"CSSMediaRule\")) {\n supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule;\n }\n if (canMonkeyPatchNestedCSSRule(\"CSSConditionRule\")) {\n supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule;\n }\n if (canMonkeyPatchNestedCSSRule(\"CSSSupportsRule\")) {\n supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule;\n }\n }\n const unmodifiedFunctions = {};\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\n unmodifiedFunctions[typeKey] = {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n insertRule: type.prototype.insertRule,\n // eslint-disable-next-line @typescript-eslint/unbound-method\n deleteRule: type.prototype.deleteRule\n };\n type.prototype.insertRule = new Proxy(\n unmodifiedFunctions[typeKey].insertRule,\n {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n const [rule, index2] = argumentsList;\n const { id, styleId } = getIdAndStyleId(\n thisArg.parentStyleSheet,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleSheetRuleCb({\n id,\n styleId,\n adds: [\n {\n rule,\n index: [\n ...getNestedCSSRulePositions(thisArg),\n index2 || 0\n // defaults to 0\n ]\n }\n ]\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n }\n );\n type.prototype.deleteRule = new Proxy(\n unmodifiedFunctions[typeKey].deleteRule,\n {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n const [index2] = argumentsList;\n const { id, styleId } = getIdAndStyleId(\n thisArg.parentStyleSheet,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleSheetRuleCb({\n id,\n styleId,\n removes: [\n { index: [...getNestedCSSRulePositions(thisArg), index2] }\n ]\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n }\n );\n });\n return callbackWrapper(() => {\n win.CSSStyleSheet.prototype.insertRule = insertRule;\n win.CSSStyleSheet.prototype.deleteRule = deleteRule;\n replace && (win.CSSStyleSheet.prototype.replace = replace);\n replaceSync && (win.CSSStyleSheet.prototype.replaceSync = replaceSync);\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\n type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule;\n type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule;\n });\n });\n}\nfunction initAdoptedStyleSheetObserver({\n mirror: mirror2,\n stylesheetManager\n}, host2) {\n var _a2, _b, _c;\n let hostId = null;\n if (host2.nodeName === \"#document\") hostId = mirror2.getId(host2);\n else hostId = mirror2.getId(index.host(host2));\n const patchTarget = host2.nodeName === \"#document\" ? (_a2 = host2.defaultView) == null ? void 0 : _a2.Document : (_c = (_b = host2.ownerDocument) == null ? void 0 : _b.defaultView) == null ? void 0 : _c.ShadowRoot;\n const originalPropertyDescriptor = (patchTarget == null ? void 0 : patchTarget.prototype) ? Object.getOwnPropertyDescriptor(\n patchTarget == null ? void 0 : patchTarget.prototype,\n \"adoptedStyleSheets\"\n ) : void 0;\n if (hostId === null || hostId === -1 || !patchTarget || !originalPropertyDescriptor)\n return () => {\n };\n Object.defineProperty(host2, \"adoptedStyleSheets\", {\n configurable: originalPropertyDescriptor.configurable,\n enumerable: originalPropertyDescriptor.enumerable,\n get() {\n var _a3;\n return (_a3 = originalPropertyDescriptor.get) == null ? void 0 : _a3.call(this);\n },\n set(sheets) {\n var _a3;\n const result = (_a3 = originalPropertyDescriptor.set) == null ? void 0 : _a3.call(this, sheets);\n if (hostId !== null && hostId !== -1) {\n try {\n stylesheetManager.adoptStyleSheets(sheets, hostId);\n } catch (e) {\n }\n }\n return result;\n }\n });\n return callbackWrapper(() => {\n Object.defineProperty(host2, \"adoptedStyleSheets\", {\n configurable: originalPropertyDescriptor.configurable,\n enumerable: originalPropertyDescriptor.enumerable,\n // eslint-disable-next-line @typescript-eslint/unbound-method\n get: originalPropertyDescriptor.get,\n // eslint-disable-next-line @typescript-eslint/unbound-method\n set: originalPropertyDescriptor.set\n });\n });\n}\nfunction initStyleDeclarationObserver({\n styleDeclarationCb,\n mirror: mirror2,\n ignoreCSSAttributes,\n stylesheetManager\n}, { win }) {\n const setProperty = win.CSSStyleDeclaration.prototype.setProperty;\n win.CSSStyleDeclaration.prototype.setProperty = new Proxy(setProperty, {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n var _a2;\n const [property, value, priority] = argumentsList;\n if (ignoreCSSAttributes.has(property)) {\n return setProperty.apply(thisArg, [property, value, priority]);\n }\n const { id, styleId } = getIdAndStyleId(\n (_a2 = thisArg.parentRule) == null ? void 0 : _a2.parentStyleSheet,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleDeclarationCb({\n id,\n styleId,\n set: {\n property,\n value,\n priority\n },\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n index: getNestedCSSRulePositions(thisArg.parentRule)\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n });\n const removeProperty = win.CSSStyleDeclaration.prototype.removeProperty;\n win.CSSStyleDeclaration.prototype.removeProperty = new Proxy(removeProperty, {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n var _a2;\n const [property] = argumentsList;\n if (ignoreCSSAttributes.has(property)) {\n return removeProperty.apply(thisArg, [property]);\n }\n const { id, styleId } = getIdAndStyleId(\n (_a2 = thisArg.parentRule) == null ? void 0 : _a2.parentStyleSheet,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleDeclarationCb({\n id,\n styleId,\n remove: {\n property\n },\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n index: getNestedCSSRulePositions(thisArg.parentRule)\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n });\n return callbackWrapper(() => {\n win.CSSStyleDeclaration.prototype.setProperty = setProperty;\n win.CSSStyleDeclaration.prototype.removeProperty = removeProperty;\n });\n}\nfunction initMediaInteractionObserver({\n mediaInteractionCb,\n blockClass,\n blockSelector,\n mirror: mirror2,\n sampling,\n doc\n}) {\n const handler = callbackWrapper(\n (type) => throttle(\n callbackWrapper((event) => {\n const target = getEventTarget(event);\n if (!target || isBlocked(target, blockClass, blockSelector, true)) {\n return;\n }\n const { currentTime, volume, muted, playbackRate, loop } = target;\n mediaInteractionCb({\n type,\n id: mirror2.getId(target),\n currentTime,\n volume,\n muted,\n playbackRate,\n loop\n });\n }),\n sampling.media || 500\n )\n );\n const handlers = [\n on(\"play\", handler(MediaInteractions.Play), doc),\n on(\"pause\", handler(MediaInteractions.Pause), doc),\n on(\"seeked\", handler(MediaInteractions.Seeked), doc),\n on(\"volumechange\", handler(MediaInteractions.VolumeChange), doc),\n on(\"ratechange\", handler(MediaInteractions.RateChange), doc)\n ];\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initFontObserver({ fontCb, doc }) {\n const win = doc.defaultView;\n if (!win) {\n return () => {\n };\n }\n const handlers = [];\n const fontMap = /* @__PURE__ */ new WeakMap();\n const originalFontFace = win.FontFace;\n win.FontFace = function FontFace(family, source, descriptors) {\n const fontFace = new originalFontFace(family, source, descriptors);\n fontMap.set(fontFace, {\n family,\n buffer: typeof source !== \"string\",\n descriptors,\n fontSource: typeof source === \"string\" ? source : JSON.stringify(Array.from(new Uint8Array(source)))\n });\n return fontFace;\n };\n const restoreHandler = patch(\n doc.fonts,\n \"add\",\n function(original) {\n return function(fontFace) {\n setTimeout(\n callbackWrapper(() => {\n const p = fontMap.get(fontFace);\n if (p) {\n fontCb(p);\n fontMap.delete(fontFace);\n }\n }),\n 0\n );\n return original.apply(this, [fontFace]);\n };\n }\n );\n handlers.push(() => {\n win.FontFace = originalFontFace;\n });\n handlers.push(restoreHandler);\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initSelectionObserver(param) {\n const { doc, mirror: mirror2, blockClass, blockSelector, selectionCb } = param;\n let collapsed = true;\n const updateSelection = callbackWrapper(() => {\n const selection = doc.getSelection();\n if (!selection || collapsed && (selection == null ? void 0 : selection.isCollapsed)) return;\n collapsed = selection.isCollapsed || false;\n const ranges = [];\n const count = selection.rangeCount || 0;\n for (let i = 0; i < count; i++) {\n const range = selection.getRangeAt(i);\n const { startContainer, startOffset, endContainer, endOffset } = range;\n const blocked = isBlocked(startContainer, blockClass, blockSelector, true) || isBlocked(endContainer, blockClass, blockSelector, true);\n if (blocked) continue;\n ranges.push({\n start: mirror2.getId(startContainer),\n startOffset,\n end: mirror2.getId(endContainer),\n endOffset\n });\n }\n selectionCb({ ranges });\n });\n updateSelection();\n return on(\"selectionchange\", updateSelection);\n}\nfunction initCustomElementObserver({\n doc,\n customElementCb\n}) {\n const win = doc.defaultView;\n if (!win || !win.customElements) return () => {\n };\n const restoreHandler = patch(\n win.customElements,\n \"define\",\n function(original) {\n return function(name, constructor, options) {\n try {\n customElementCb({\n define: {\n name\n }\n });\n } catch (e) {\n console.warn(`Custom element callback failed for ${name}`);\n }\n return original.apply(this, [name, constructor, options]);\n };\n }\n );\n return restoreHandler;\n}\nfunction mergeHooks(o, hooks) {\n const {\n mutationCb,\n mousemoveCb,\n mouseInteractionCb,\n scrollCb,\n viewportResizeCb,\n inputCb,\n mediaInteractionCb,\n styleSheetRuleCb,\n styleDeclarationCb,\n canvasMutationCb,\n fontCb,\n selectionCb,\n customElementCb\n } = o;\n o.mutationCb = (...p) => {\n if (hooks.mutation) {\n hooks.mutation(...p);\n }\n mutationCb(...p);\n };\n o.mousemoveCb = (...p) => {\n if (hooks.mousemove) {\n hooks.mousemove(...p);\n }\n mousemoveCb(...p);\n };\n o.mouseInteractionCb = (...p) => {\n if (hooks.mouseInteraction) {\n hooks.mouseInteraction(...p);\n }\n mouseInteractionCb(...p);\n };\n o.scrollCb = (...p) => {\n if (hooks.scroll) {\n hooks.scroll(...p);\n }\n scrollCb(...p);\n };\n o.viewportResizeCb = (...p) => {\n if (hooks.viewportResize) {\n hooks.viewportResize(...p);\n }\n viewportResizeCb(...p);\n };\n o.inputCb = (...p) => {\n if (hooks.input) {\n hooks.input(...p);\n }\n inputCb(...p);\n };\n o.mediaInteractionCb = (...p) => {\n if (hooks.mediaInteaction) {\n hooks.mediaInteaction(...p);\n }\n mediaInteractionCb(...p);\n };\n o.styleSheetRuleCb = (...p) => {\n if (hooks.styleSheetRule) {\n hooks.styleSheetRule(...p);\n }\n styleSheetRuleCb(...p);\n };\n o.styleDeclarationCb = (...p) => {\n if (hooks.styleDeclaration) {\n hooks.styleDeclaration(...p);\n }\n styleDeclarationCb(...p);\n };\n o.canvasMutationCb = (...p) => {\n if (hooks.canvasMutation) {\n hooks.canvasMutation(...p);\n }\n canvasMutationCb(...p);\n };\n o.fontCb = (...p) => {\n if (hooks.font) {\n hooks.font(...p);\n }\n fontCb(...p);\n };\n o.selectionCb = (...p) => {\n if (hooks.selection) {\n hooks.selection(...p);\n }\n selectionCb(...p);\n };\n o.customElementCb = (...c) => {\n if (hooks.customElement) {\n hooks.customElement(...c);\n }\n customElementCb(...c);\n };\n}\nfunction initObservers(o, hooks = {}) {\n const currentWindow = o.doc.defaultView;\n if (!currentWindow) {\n return () => {\n };\n }\n mergeHooks(o, hooks);\n let mutationObserver;\n let cleanupMutationIframe = () => {\n };\n if (o.recordDOM) {\n [mutationObserver, cleanupMutationIframe] = initMutationObserver(o, o.doc);\n }\n const mousemoveHandler = initMoveObserver(o);\n const mouseInteractionHandler = initMouseInteractionObserver(o);\n const scrollHandler = initScrollObserver(o);\n const viewportResizeHandler = initViewportResizeObserver(o, {\n win: currentWindow\n });\n const inputHandler = initInputObserver(o);\n const mediaInteractionHandler = initMediaInteractionObserver(o);\n let styleSheetObserver = () => {\n };\n let adoptedStyleSheetObserver = () => {\n };\n let styleDeclarationObserver = () => {\n };\n let fontObserver = () => {\n };\n if (o.recordDOM) {\n styleSheetObserver = initStyleSheetObserver(o, { win: currentWindow });\n adoptedStyleSheetObserver = initAdoptedStyleSheetObserver(o, o.doc);\n styleDeclarationObserver = initStyleDeclarationObserver(o, {\n win: currentWindow\n });\n if (o.collectFonts) {\n fontObserver = initFontObserver(o);\n }\n }\n const selectionObserver = initSelectionObserver(o);\n const customElementObserver = initCustomElementObserver(o);\n const pluginHandlers = [];\n for (const plugin of o.plugins) {\n pluginHandlers.push(\n plugin.observer(plugin.callback, currentWindow, plugin.options)\n );\n }\n return callbackWrapper(() => {\n mutationBuffers.forEach((b) => b.reset());\n mutationObserver == null ? void 0 : mutationObserver.disconnect();\n cleanupMutationIframe();\n mousemoveHandler();\n mouseInteractionHandler();\n scrollHandler();\n viewportResizeHandler();\n inputHandler();\n mediaInteractionHandler();\n styleSheetObserver();\n adoptedStyleSheetObserver();\n styleDeclarationObserver();\n fontObserver();\n selectionObserver();\n customElementObserver();\n pluginHandlers.forEach((h) => h());\n });\n}\nfunction hasNestedCSSRule(prop) {\n return typeof window[prop] !== \"undefined\";\n}\nfunction canMonkeyPatchNestedCSSRule(prop) {\n return Boolean(\n typeof window[prop] !== \"undefined\" && // Note: Generally, this check _shouldn't_ be necessary\n // However, in some scenarios (e.g. jsdom) this can sometimes fail, so we check for it here\n window[prop].prototype && \"insertRule\" in window[prop].prototype && \"deleteRule\" in window[prop].prototype\n );\n}\nclass CrossOriginIframeMirror {\n constructor(generateIdFn) {\n __publicField(this, \"iframeIdToRemoteIdMap\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"iframeRemoteIdToIdMap\", /* @__PURE__ */ new WeakMap());\n this.generateIdFn = generateIdFn;\n }\n getId(iframe, remoteId, idToRemoteMap, remoteToIdMap) {\n const idToRemoteIdMap = idToRemoteMap || this.getIdToRemoteIdMap(iframe);\n const remoteIdToIdMap = remoteToIdMap || this.getRemoteIdToIdMap(iframe);\n let id = idToRemoteIdMap.get(remoteId);\n if (!id) {\n id = this.generateIdFn();\n idToRemoteIdMap.set(remoteId, id);\n remoteIdToIdMap.set(id, remoteId);\n }\n return id;\n }\n getIds(iframe, remoteId) {\n const idToRemoteIdMap = this.getIdToRemoteIdMap(iframe);\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\n return remoteId.map(\n (id) => this.getId(iframe, id, idToRemoteIdMap, remoteIdToIdMap)\n );\n }\n getRemoteId(iframe, id, map) {\n const remoteIdToIdMap = map || this.getRemoteIdToIdMap(iframe);\n if (typeof id !== \"number\") return id;\n const remoteId = remoteIdToIdMap.get(id);\n if (!remoteId) return -1;\n return remoteId;\n }\n getRemoteIds(iframe, ids) {\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\n return ids.map((id) => this.getRemoteId(iframe, id, remoteIdToIdMap));\n }\n reset(iframe) {\n if (!iframe) {\n this.iframeIdToRemoteIdMap = /* @__PURE__ */ new WeakMap();\n this.iframeRemoteIdToIdMap = /* @__PURE__ */ new WeakMap();\n return;\n }\n this.iframeIdToRemoteIdMap.delete(iframe);\n this.iframeRemoteIdToIdMap.delete(iframe);\n }\n getIdToRemoteIdMap(iframe) {\n let idToRemoteIdMap = this.iframeIdToRemoteIdMap.get(iframe);\n if (!idToRemoteIdMap) {\n idToRemoteIdMap = /* @__PURE__ */ new Map();\n this.iframeIdToRemoteIdMap.set(iframe, idToRemoteIdMap);\n }\n return idToRemoteIdMap;\n }\n getRemoteIdToIdMap(iframe) {\n let remoteIdToIdMap = this.iframeRemoteIdToIdMap.get(iframe);\n if (!remoteIdToIdMap) {\n remoteIdToIdMap = /* @__PURE__ */ new Map();\n this.iframeRemoteIdToIdMap.set(iframe, remoteIdToIdMap);\n }\n return remoteIdToIdMap;\n }\n}\nclass IframeManager {\n constructor(options) {\n __publicField(this, \"iframes\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"crossOriginIframeMap\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"crossOriginIframeMirror\", new CrossOriginIframeMirror(genId));\n __publicField(this, \"crossOriginIframeStyleMirror\");\n __publicField(this, \"crossOriginIframeRootIdMap\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"mirror\");\n __publicField(this, \"mutationCb\");\n __publicField(this, \"wrappedEmit\");\n __publicField(this, \"loadListener\");\n __publicField(this, \"stylesheetManager\");\n __publicField(this, \"recordCrossOriginIframes\");\n this.mutationCb = options.mutationCb;\n this.wrappedEmit = options.wrappedEmit;\n this.stylesheetManager = options.stylesheetManager;\n this.recordCrossOriginIframes = options.recordCrossOriginIframes;\n this.crossOriginIframeStyleMirror = new CrossOriginIframeMirror(\n this.stylesheetManager.styleMirror.generateId.bind(\n this.stylesheetManager.styleMirror\n )\n );\n this.mirror = options.mirror;\n if (this.recordCrossOriginIframes) {\n window.addEventListener(\"message\", this.handleMessage.bind(this));\n }\n }\n addIframe(iframeEl) {\n this.iframes.set(iframeEl, true);\n if (iframeEl.contentWindow)\n this.crossOriginIframeMap.set(iframeEl.contentWindow, iframeEl);\n }\n addLoadListener(cb) {\n this.loadListener = cb;\n }\n attachIframe(iframeEl, childSn) {\n var _a2, _b;\n this.mutationCb({\n adds: [\n {\n parentId: this.mirror.getId(iframeEl),\n nextId: null,\n node: childSn\n }\n ],\n removes: [],\n texts: [],\n attributes: [],\n isAttachIframe: true\n });\n if (this.recordCrossOriginIframes)\n (_a2 = iframeEl.contentWindow) == null ? void 0 : _a2.addEventListener(\n \"message\",\n this.handleMessage.bind(this)\n );\n (_b = this.loadListener) == null ? void 0 : _b.call(this, iframeEl);\n if (iframeEl.contentDocument && iframeEl.contentDocument.adoptedStyleSheets && iframeEl.contentDocument.adoptedStyleSheets.length > 0)\n this.stylesheetManager.adoptStyleSheets(\n iframeEl.contentDocument.adoptedStyleSheets,\n this.mirror.getId(iframeEl.contentDocument)\n );\n }\n handleMessage(message) {\n const crossOriginMessageEvent = message;\n if (crossOriginMessageEvent.data.type !== \"rrweb\" || // To filter out the rrweb messages which are forwarded by some sites.\n crossOriginMessageEvent.origin !== crossOriginMessageEvent.data.origin)\n return;\n const iframeSourceWindow = message.source;\n if (!iframeSourceWindow) return;\n const iframeEl = this.crossOriginIframeMap.get(message.source);\n if (!iframeEl) return;\n const transformedEvent = this.transformCrossOriginEvent(\n iframeEl,\n crossOriginMessageEvent.data.event\n );\n if (transformedEvent)\n this.wrappedEmit(\n transformedEvent,\n crossOriginMessageEvent.data.isCheckout\n );\n }\n transformCrossOriginEvent(iframeEl, e) {\n var _a2;\n switch (e.type) {\n case EventType.FullSnapshot: {\n this.crossOriginIframeMirror.reset(iframeEl);\n this.crossOriginIframeStyleMirror.reset(iframeEl);\n this.replaceIdOnNode(e.data.node, iframeEl);\n const rootId = e.data.node.id;\n this.crossOriginIframeRootIdMap.set(iframeEl, rootId);\n this.patchRootIdOnNode(e.data.node, rootId);\n return {\n timestamp: e.timestamp,\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Mutation,\n adds: [\n {\n parentId: this.mirror.getId(iframeEl),\n nextId: null,\n node: e.data.node\n }\n ],\n removes: [],\n texts: [],\n attributes: [],\n isAttachIframe: true\n }\n };\n }\n case EventType.Meta:\n case EventType.Load:\n case EventType.DomContentLoaded: {\n return false;\n }\n case EventType.Plugin: {\n return e;\n }\n case EventType.Custom: {\n this.replaceIds(\n e.data.payload,\n iframeEl,\n [\"id\", \"parentId\", \"previousId\", \"nextId\"]\n );\n return e;\n }\n case EventType.IncrementalSnapshot: {\n switch (e.data.source) {\n case IncrementalSource.Mutation: {\n e.data.adds.forEach((n) => {\n this.replaceIds(n, iframeEl, [\n \"parentId\",\n \"nextId\",\n \"previousId\"\n ]);\n this.replaceIdOnNode(n.node, iframeEl);\n const rootId = this.crossOriginIframeRootIdMap.get(iframeEl);\n rootId && this.patchRootIdOnNode(n.node, rootId);\n });\n e.data.removes.forEach((n) => {\n this.replaceIds(n, iframeEl, [\"parentId\", \"id\"]);\n });\n e.data.attributes.forEach((n) => {\n this.replaceIds(n, iframeEl, [\"id\"]);\n });\n e.data.texts.forEach((n) => {\n this.replaceIds(n, iframeEl, [\"id\"]);\n });\n return e;\n }\n case IncrementalSource.Drag:\n case IncrementalSource.TouchMove:\n case IncrementalSource.MouseMove: {\n e.data.positions.forEach((p) => {\n this.replaceIds(p, iframeEl, [\"id\"]);\n });\n return e;\n }\n case IncrementalSource.ViewportResize: {\n return false;\n }\n case IncrementalSource.MediaInteraction:\n case IncrementalSource.MouseInteraction:\n case IncrementalSource.Scroll:\n case IncrementalSource.CanvasMutation:\n case IncrementalSource.Input: {\n this.replaceIds(e.data, iframeEl, [\"id\"]);\n return e;\n }\n case IncrementalSource.StyleSheetRule:\n case IncrementalSource.StyleDeclaration: {\n this.replaceIds(e.data, iframeEl, [\"id\"]);\n this.replaceStyleIds(e.data, iframeEl, [\"styleId\"]);\n return e;\n }\n case IncrementalSource.Font: {\n return e;\n }\n case IncrementalSource.Selection: {\n e.data.ranges.forEach((range) => {\n this.replaceIds(range, iframeEl, [\"start\", \"end\"]);\n });\n return e;\n }\n case IncrementalSource.AdoptedStyleSheet: {\n this.replaceIds(e.data, iframeEl, [\"id\"]);\n this.replaceStyleIds(e.data, iframeEl, [\"styleIds\"]);\n (_a2 = e.data.styles) == null ? void 0 : _a2.forEach((style) => {\n this.replaceStyleIds(style, iframeEl, [\"styleId\"]);\n });\n return e;\n }\n }\n }\n }\n return false;\n }\n replace(iframeMirror, obj, iframeEl, keys) {\n for (const key of keys) {\n if (!Array.isArray(obj[key]) && typeof obj[key] !== \"number\") continue;\n if (Array.isArray(obj[key])) {\n obj[key] = iframeMirror.getIds(\n iframeEl,\n obj[key]\n );\n } else {\n obj[key] = iframeMirror.getId(iframeEl, obj[key]);\n }\n }\n return obj;\n }\n replaceIds(obj, iframeEl, keys) {\n return this.replace(this.crossOriginIframeMirror, obj, iframeEl, keys);\n }\n replaceStyleIds(obj, iframeEl, keys) {\n return this.replace(this.crossOriginIframeStyleMirror, obj, iframeEl, keys);\n }\n replaceIdOnNode(node, iframeEl) {\n this.replaceIds(node, iframeEl, [\"id\", \"rootId\"]);\n if (\"childNodes\" in node) {\n node.childNodes.forEach((child) => {\n this.replaceIdOnNode(child, iframeEl);\n });\n }\n }\n patchRootIdOnNode(node, rootId) {\n if (node.type !== NodeType.Document && !node.rootId) node.rootId = rootId;\n if (\"childNodes\" in node) {\n node.childNodes.forEach((child) => {\n this.patchRootIdOnNode(child, rootId);\n });\n }\n }\n}\nclass ShadowDomManager {\n constructor(options) {\n __publicField(this, \"shadowDoms\", /* @__PURE__ */ new WeakSet());\n __publicField(this, \"mutationCb\");\n __publicField(this, \"scrollCb\");\n __publicField(this, \"bypassOptions\");\n __publicField(this, \"mirror\");\n __publicField(this, \"restoreHandlers\", []);\n this.mutationCb = options.mutationCb;\n this.scrollCb = options.scrollCb;\n this.bypassOptions = options.bypassOptions;\n this.mirror = options.mirror;\n this.init();\n }\n init() {\n this.reset();\n this.patchAttachShadow(Element, document);\n }\n addShadowRoot(shadowRoot2, doc) {\n if (!isNativeShadowDom(shadowRoot2)) return;\n if (this.shadowDoms.has(shadowRoot2)) return;\n this.shadowDoms.add(shadowRoot2);\n const [observer] = initMutationObserver(\n {\n ...this.bypassOptions,\n doc,\n mutationCb: this.mutationCb,\n mirror: this.mirror,\n shadowDomManager: this\n },\n shadowRoot2\n );\n this.restoreHandlers.push(() => observer.disconnect());\n this.restoreHandlers.push(\n initScrollObserver({\n ...this.bypassOptions,\n scrollCb: this.scrollCb,\n // https://gist.github.com/praveenpuglia/0832da687ed5a5d7a0907046c9ef1813\n // scroll is not allowed to pass the boundary, so we need to listen the shadow document\n doc: shadowRoot2,\n mirror: this.mirror\n })\n );\n setTimeout(() => {\n if (shadowRoot2.adoptedStyleSheets && shadowRoot2.adoptedStyleSheets.length > 0)\n this.bypassOptions.stylesheetManager.adoptStyleSheets(\n shadowRoot2.adoptedStyleSheets,\n this.mirror.getId(index.host(shadowRoot2))\n );\n this.restoreHandlers.push(\n initAdoptedStyleSheetObserver(\n {\n mirror: this.mirror,\n stylesheetManager: this.bypassOptions.stylesheetManager\n },\n shadowRoot2\n )\n );\n }, 0);\n }\n /**\n * Monkey patch 'attachShadow' of an IFrameElement to observe newly added shadow doms.\n */\n observeAttachShadow(iframeElement) {\n if (!iframeElement.contentWindow || !iframeElement.contentDocument) return;\n this.patchAttachShadow(\n iframeElement.contentWindow.Element,\n iframeElement.contentDocument\n );\n }\n /**\n * Patch 'attachShadow' to observe newly added shadow doms.\n */\n patchAttachShadow(element, doc) {\n const manager = this;\n this.restoreHandlers.push(\n patch(\n element.prototype,\n \"attachShadow\",\n function(original) {\n return function(option) {\n const sRoot = original.call(this, option);\n const shadowRootEl = index.shadowRoot(this);\n if (shadowRootEl && inDom(this))\n manager.addShadowRoot(shadowRootEl, doc);\n return sRoot;\n };\n }\n )\n );\n }\n reset() {\n this.restoreHandlers.forEach((handler) => {\n try {\n handler();\n } catch (e) {\n }\n });\n this.restoreHandlers = [];\n this.shadowDoms = /* @__PURE__ */ new WeakSet();\n }\n}\nvar chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nvar lookup = typeof Uint8Array === \"undefined\" ? [] : new Uint8Array(256);\nfor (var i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\nvar encode = function(arraybuffer) {\n var bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = \"\";\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];\n base64 += chars[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];\n base64 += chars[bytes[i + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + \"=\";\n } else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + \"==\";\n }\n return base64;\n};\nconst canvasVarMap = /* @__PURE__ */ new Map();\nfunction variableListFor(ctx, ctor) {\n let contextMap = canvasVarMap.get(ctx);\n if (!contextMap) {\n contextMap = /* @__PURE__ */ new Map();\n canvasVarMap.set(ctx, contextMap);\n }\n if (!contextMap.has(ctor)) {\n contextMap.set(ctor, []);\n }\n return contextMap.get(ctor);\n}\nconst saveWebGLVar = (value, win, ctx) => {\n if (!value || !(isInstanceOfWebGLObject(value, win) || typeof value === \"object\"))\n return;\n const name = value.constructor.name;\n const list = variableListFor(ctx, name);\n let index2 = list.indexOf(value);\n if (index2 === -1) {\n index2 = list.length;\n list.push(value);\n }\n return index2;\n};\nfunction serializeArg(value, win, ctx) {\n if (value instanceof Array) {\n return value.map((arg) => serializeArg(arg, win, ctx));\n } else if (value === null) {\n return value;\n } else if (value instanceof Float32Array || value instanceof Float64Array || value instanceof Int32Array || value instanceof Uint32Array || value instanceof Uint8Array || value instanceof Uint16Array || value instanceof Int16Array || value instanceof Int8Array || value instanceof Uint8ClampedArray) {\n const name = value.constructor.name;\n return {\n rr_type: name,\n args: [Object.values(value)]\n };\n } else if (\n // SharedArrayBuffer disabled on most browsers due to spectre.\n // More info: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/SharedArrayBuffer\n // value instanceof SharedArrayBuffer ||\n value instanceof ArrayBuffer\n ) {\n const name = value.constructor.name;\n const base64 = encode(value);\n return {\n rr_type: name,\n base64\n };\n } else if (value instanceof DataView) {\n const name = value.constructor.name;\n return {\n rr_type: name,\n args: [\n serializeArg(value.buffer, win, ctx),\n value.byteOffset,\n value.byteLength\n ]\n };\n } else if (value instanceof HTMLImageElement) {\n const name = value.constructor.name;\n const { src } = value;\n return {\n rr_type: name,\n src\n };\n } else if (value instanceof HTMLCanvasElement) {\n const name = \"HTMLImageElement\";\n const src = value.toDataURL();\n return {\n rr_type: name,\n src\n };\n } else if (value instanceof ImageData) {\n const name = value.constructor.name;\n return {\n rr_type: name,\n args: [serializeArg(value.data, win, ctx), value.width, value.height]\n };\n } else if (isInstanceOfWebGLObject(value, win) || typeof value === \"object\") {\n const name = value.constructor.name;\n const index2 = saveWebGLVar(value, win, ctx);\n return {\n rr_type: name,\n index: index2\n };\n }\n return value;\n}\nconst serializeArgs = (args, win, ctx) => {\n return args.map((arg) => serializeArg(arg, win, ctx));\n};\nconst isInstanceOfWebGLObject = (value, win) => {\n const webGLConstructorNames = [\n \"WebGLActiveInfo\",\n \"WebGLBuffer\",\n \"WebGLFramebuffer\",\n \"WebGLProgram\",\n \"WebGLRenderbuffer\",\n \"WebGLShader\",\n \"WebGLShaderPrecisionFormat\",\n \"WebGLTexture\",\n \"WebGLUniformLocation\",\n \"WebGLVertexArrayObject\",\n // In old Chrome versions, value won't be an instanceof WebGLVertexArrayObject.\n \"WebGLVertexArrayObjectOES\"\n ];\n const supportedWebGLConstructorNames = webGLConstructorNames.filter(\n (name) => typeof win[name] === \"function\"\n );\n return Boolean(\n supportedWebGLConstructorNames.find(\n (name) => value instanceof win[name]\n )\n );\n};\nfunction initCanvas2DMutationObserver(cb, win, blockClass, blockSelector) {\n const handlers = [];\n const props2D = Object.getOwnPropertyNames(\n win.CanvasRenderingContext2D.prototype\n );\n for (const prop of props2D) {\n try {\n if (typeof win.CanvasRenderingContext2D.prototype[prop] !== \"function\") {\n continue;\n }\n const restoreHandler = patch(\n win.CanvasRenderingContext2D.prototype,\n prop,\n function(original) {\n return function(...args) {\n if (!isBlocked(this.canvas, blockClass, blockSelector, true)) {\n setTimeout(() => {\n const recordArgs = serializeArgs(args, win, this);\n cb(this.canvas, {\n type: CanvasContext[\"2D\"],\n property: prop,\n args: recordArgs\n });\n }, 0);\n }\n return original.apply(this, args);\n };\n }\n );\n handlers.push(restoreHandler);\n } catch {\n const hookHandler = hookSetter(\n win.CanvasRenderingContext2D.prototype,\n prop,\n {\n set(v) {\n cb(this.canvas, {\n type: CanvasContext[\"2D\"],\n property: prop,\n args: [v],\n setter: true\n });\n }\n }\n );\n handlers.push(hookHandler);\n }\n }\n return () => {\n handlers.forEach((h) => h());\n };\n}\nfunction getNormalizedContextName(contextType) {\n return contextType === \"experimental-webgl\" ? \"webgl\" : contextType;\n}\nfunction initCanvasContextObserver(win, blockClass, blockSelector, setPreserveDrawingBufferToTrue) {\n const handlers = [];\n try {\n const restoreHandler = patch(\n win.HTMLCanvasElement.prototype,\n \"getContext\",\n function(original) {\n return function(contextType, ...args) {\n if (!isBlocked(this, blockClass, blockSelector, true)) {\n const ctxName = getNormalizedContextName(contextType);\n if (!(\"__context\" in this)) this.__context = ctxName;\n if (setPreserveDrawingBufferToTrue && [\"webgl\", \"webgl2\"].includes(ctxName)) {\n if (args[0] && typeof args[0] === \"object\") {\n const contextAttributes = args[0];\n if (!contextAttributes.preserveDrawingBuffer) {\n contextAttributes.preserveDrawingBuffer = true;\n }\n } else {\n args.splice(0, 1, {\n preserveDrawingBuffer: true\n });\n }\n }\n }\n return original.apply(this, [contextType, ...args]);\n };\n }\n );\n handlers.push(restoreHandler);\n } catch {\n console.error(\"failed to patch HTMLCanvasElement.prototype.getContext\");\n }\n return () => {\n handlers.forEach((h) => h());\n };\n}\nfunction patchGLPrototype(prototype, type, cb, blockClass, blockSelector, win) {\n const handlers = [];\n const props = Object.getOwnPropertyNames(prototype);\n for (const prop of props) {\n if (\n //prop.startsWith('get') || // e.g. getProgramParameter, but too risky\n [\n \"isContextLost\",\n \"canvas\",\n \"drawingBufferWidth\",\n \"drawingBufferHeight\"\n ].includes(prop)\n ) {\n continue;\n }\n try {\n if (typeof prototype[prop] !== \"function\") {\n continue;\n }\n const restoreHandler = patch(\n prototype,\n prop,\n function(original) {\n return function(...args) {\n const result = original.apply(this, args);\n saveWebGLVar(result, win, this);\n if (\"tagName\" in this.canvas && !isBlocked(this.canvas, blockClass, blockSelector, true)) {\n const recordArgs = serializeArgs(args, win, this);\n const mutation = {\n type,\n property: prop,\n args: recordArgs\n };\n cb(this.canvas, mutation);\n }\n return result;\n };\n }\n );\n handlers.push(restoreHandler);\n } catch {\n const hookHandler = hookSetter(prototype, prop, {\n set(v) {\n cb(this.canvas, {\n type,\n property: prop,\n args: [v],\n setter: true\n });\n }\n });\n handlers.push(hookHandler);\n }\n }\n return handlers;\n}\nfunction initCanvasWebGLMutationObserver(cb, win, blockClass, blockSelector) {\n const handlers = [];\n if (typeof win.WebGLRenderingContext !== \"undefined\") {\n handlers.push(\n ...patchGLPrototype(\n win.WebGLRenderingContext.prototype,\n CanvasContext.WebGL,\n cb,\n blockClass,\n blockSelector,\n win\n )\n );\n }\n if (typeof win.WebGL2RenderingContext !== \"undefined\") {\n handlers.push(\n ...patchGLPrototype(\n win.WebGL2RenderingContext.prototype,\n CanvasContext.WebGL2,\n cb,\n blockClass,\n blockSelector,\n win\n )\n );\n }\n return () => {\n handlers.forEach((h) => h());\n };\n}\nconst jsContent = '(function() {\\n \"use strict\";\\n var chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\\n var lookup = typeof Uint8Array === \"undefined\" ? [] : new Uint8Array(256);\\n for (var i = 0; i < chars.length; i++) {\\n lookup[chars.charCodeAt(i)] = i;\\n }\\n var encode = function(arraybuffer) {\\n var bytes = new Uint8Array(arraybuffer), i2, len = bytes.length, base64 = \"\";\\n for (i2 = 0; i2 < len; i2 += 3) {\\n base64 += chars[bytes[i2] >> 2];\\n base64 += chars[(bytes[i2] & 3) << 4 | bytes[i2 + 1] >> 4];\\n base64 += chars[(bytes[i2 + 1] & 15) << 2 | bytes[i2 + 2] >> 6];\\n base64 += chars[bytes[i2 + 2] & 63];\\n }\\n if (len % 3 === 2) {\\n base64 = base64.substring(0, base64.length - 1) + \"=\";\\n } else if (len % 3 === 1) {\\n base64 = base64.substring(0, base64.length - 2) + \"==\";\\n }\\n return base64;\\n };\\n const lastBlobMap = /* @__PURE__ */ new Map();\\n const transparentBlobMap = /* @__PURE__ */ new Map();\\n async function getTransparentBlobFor(width, height, dataURLOptions) {\\n const id = `${width}-${height}`;\\n if (\"OffscreenCanvas\" in globalThis) {\\n if (transparentBlobMap.has(id)) return transparentBlobMap.get(id);\\n const offscreen = new OffscreenCanvas(width, height);\\n offscreen.getContext(\"2d\");\\n const blob = await offscreen.convertToBlob(dataURLOptions);\\n const arrayBuffer = await blob.arrayBuffer();\\n const base64 = encode(arrayBuffer);\\n transparentBlobMap.set(id, base64);\\n return base64;\\n } else {\\n return \"\";\\n }\\n }\\n const worker = self;\\n worker.onmessage = async function(e) {\\n if (\"OffscreenCanvas\" in globalThis) {\\n const { id, bitmap, width, height, dataURLOptions } = e.data;\\n const transparentBase64 = getTransparentBlobFor(\\n width,\\n height,\\n dataURLOptions\\n );\\n const offscreen = new OffscreenCanvas(width, height);\\n const ctx = offscreen.getContext(\"2d\");\\n ctx.drawImage(bitmap, 0, 0);\\n bitmap.close();\\n const blob = await offscreen.convertToBlob(dataURLOptions);\\n const type = blob.type;\\n const arrayBuffer = await blob.arrayBuffer();\\n const base64 = encode(arrayBuffer);\\n if (!lastBlobMap.has(id) && await transparentBase64 === base64) {\\n lastBlobMap.set(id, base64);\\n return worker.postMessage({ id });\\n }\\n if (lastBlobMap.get(id) === base64) return worker.postMessage({ id });\\n worker.postMessage({\\n id,\\n type,\\n base64,\\n width,\\n height\\n });\\n lastBlobMap.set(id, base64);\\n } else {\\n return worker.postMessage({ id: e.data.id });\\n }\\n };\\n})();\\n//# sourceMappingURL=image-bitmap-data-url-worker-IJpC7g_b.js.map\\n';\nconst blob = typeof self !== \"undefined\" && self.Blob && new Blob([jsContent], { type: \"text/javascript;charset=utf-8\" });\nfunction WorkerWrapper(options) {\n let objURL;\n try {\n objURL = blob && (self.URL || self.webkitURL).createObjectURL(blob);\n if (!objURL) throw \"\";\n const worker = new Worker(objURL, {\n name: options == null ? void 0 : options.name\n });\n worker.addEventListener(\"error\", () => {\n (self.URL || self.webkitURL).revokeObjectURL(objURL);\n });\n return worker;\n } catch (e) {\n return new Worker(\n \"data:text/javascript;charset=utf-8,\" + encodeURIComponent(jsContent),\n {\n name: options == null ? void 0 : options.name\n }\n );\n } finally {\n objURL && (self.URL || self.webkitURL).revokeObjectURL(objURL);\n }\n}\nclass CanvasManager {\n constructor(options) {\n __publicField(this, \"pendingCanvasMutations\", /* @__PURE__ */ new Map());\n __publicField(this, \"rafStamps\", { latestId: 0, invokeId: null });\n __publicField(this, \"mirror\");\n __publicField(this, \"mutationCb\");\n __publicField(this, \"resetObservers\");\n __publicField(this, \"frozen\", false);\n __publicField(this, \"locked\", false);\n __publicField(this, \"processMutation\", (target, mutation) => {\n const newFrame = this.rafStamps.invokeId && this.rafStamps.latestId !== this.rafStamps.invokeId;\n if (newFrame || !this.rafStamps.invokeId)\n this.rafStamps.invokeId = this.rafStamps.latestId;\n if (!this.pendingCanvasMutations.has(target)) {\n this.pendingCanvasMutations.set(target, []);\n }\n this.pendingCanvasMutations.get(target).push(mutation);\n });\n const {\n sampling = \"all\",\n win,\n blockClass,\n blockSelector,\n recordCanvas,\n dataURLOptions\n } = options;\n this.mutationCb = options.mutationCb;\n this.mirror = options.mirror;\n if (recordCanvas && sampling === \"all\")\n this.initCanvasMutationObserver(win, blockClass, blockSelector);\n if (recordCanvas && typeof sampling === \"number\")\n this.initCanvasFPSObserver(sampling, win, blockClass, blockSelector, {\n dataURLOptions\n });\n }\n reset() {\n this.pendingCanvasMutations.clear();\n this.resetObservers && this.resetObservers();\n }\n freeze() {\n this.frozen = true;\n }\n unfreeze() {\n this.frozen = false;\n }\n lock() {\n this.locked = true;\n }\n unlock() {\n this.locked = false;\n }\n initCanvasFPSObserver(fps, win, blockClass, blockSelector, options) {\n const canvasContextReset = initCanvasContextObserver(\n win,\n blockClass,\n blockSelector,\n true\n );\n const snapshotInProgressMap = /* @__PURE__ */ new Map();\n const worker = new WorkerWrapper();\n worker.onmessage = (e) => {\n const { id } = e.data;\n snapshotInProgressMap.set(id, false);\n if (!(\"base64\" in e.data)) return;\n const { base64, type, width, height } = e.data;\n this.mutationCb({\n id,\n type: CanvasContext[\"2D\"],\n commands: [\n {\n property: \"clearRect\",\n // wipe canvas\n args: [0, 0, width, height]\n },\n {\n property: \"drawImage\",\n // draws (semi-transparent) image\n args: [\n {\n rr_type: \"ImageBitmap\",\n args: [\n {\n rr_type: \"Blob\",\n data: [{ rr_type: \"ArrayBuffer\", base64 }],\n type\n }\n ]\n },\n 0,\n 0\n ]\n }\n ]\n });\n };\n const timeBetweenSnapshots = 1e3 / fps;\n let lastSnapshotTime = 0;\n let rafId;\n const getCanvas = () => {\n const matchedCanvas = [];\n win.document.querySelectorAll(\"canvas\").forEach((canvas) => {\n if (!isBlocked(canvas, blockClass, blockSelector, true)) {\n matchedCanvas.push(canvas);\n }\n });\n return matchedCanvas;\n };\n const takeCanvasSnapshots = (timestamp) => {\n if (lastSnapshotTime && timestamp - lastSnapshotTime < timeBetweenSnapshots) {\n rafId = requestAnimationFrame(takeCanvasSnapshots);\n return;\n }\n lastSnapshotTime = timestamp;\n getCanvas().forEach(async (canvas) => {\n var _a2;\n const id = this.mirror.getId(canvas);\n if (snapshotInProgressMap.get(id)) return;\n if (canvas.width === 0 || canvas.height === 0) return;\n snapshotInProgressMap.set(id, true);\n if ([\"webgl\", \"webgl2\"].includes(canvas.__context)) {\n const context = canvas.getContext(canvas.__context);\n if (((_a2 = context == null ? void 0 : context.getContextAttributes()) == null ? void 0 : _a2.preserveDrawingBuffer) === false) {\n context.clear(context.COLOR_BUFFER_BIT);\n }\n }\n const bitmap = await createImageBitmap(canvas);\n worker.postMessage(\n {\n id,\n bitmap,\n width: canvas.width,\n height: canvas.height,\n dataURLOptions: options.dataURLOptions\n },\n [bitmap]\n );\n });\n rafId = requestAnimationFrame(takeCanvasSnapshots);\n };\n rafId = requestAnimationFrame(takeCanvasSnapshots);\n this.resetObservers = () => {\n canvasContextReset();\n cancelAnimationFrame(rafId);\n };\n }\n initCanvasMutationObserver(win, blockClass, blockSelector) {\n this.startRAFTimestamping();\n this.startPendingCanvasMutationFlusher();\n const canvasContextReset = initCanvasContextObserver(\n win,\n blockClass,\n blockSelector,\n false\n );\n const canvas2DReset = initCanvas2DMutationObserver(\n this.processMutation.bind(this),\n win,\n blockClass,\n blockSelector\n );\n const canvasWebGL1and2Reset = initCanvasWebGLMutationObserver(\n this.processMutation.bind(this),\n win,\n blockClass,\n blockSelector\n );\n this.resetObservers = () => {\n canvasContextReset();\n canvas2DReset();\n canvasWebGL1and2Reset();\n };\n }\n startPendingCanvasMutationFlusher() {\n requestAnimationFrame(() => this.flushPendingCanvasMutations());\n }\n startRAFTimestamping() {\n const setLatestRAFTimestamp = (timestamp) => {\n this.rafStamps.latestId = timestamp;\n requestAnimationFrame(setLatestRAFTimestamp);\n };\n requestAnimationFrame(setLatestRAFTimestamp);\n }\n flushPendingCanvasMutations() {\n this.pendingCanvasMutations.forEach(\n (_values, canvas) => {\n const id = this.mirror.getId(canvas);\n this.flushPendingCanvasMutationFor(canvas, id);\n }\n );\n requestAnimationFrame(() => this.flushPendingCanvasMutations());\n }\n flushPendingCanvasMutationFor(canvas, id) {\n if (this.frozen || this.locked) {\n return;\n }\n const valuesWithType = this.pendingCanvasMutations.get(canvas);\n if (!valuesWithType || id === -1) return;\n const values = valuesWithType.map((value) => {\n const { type: type2, ...rest } = value;\n return rest;\n });\n const { type } = valuesWithType[0];\n this.mutationCb({ id, type, commands: values });\n this.pendingCanvasMutations.delete(canvas);\n }\n}\nclass StylesheetManager {\n constructor(options) {\n __publicField(this, \"trackedLinkElements\", /* @__PURE__ */ new WeakSet());\n __publicField(this, \"mutationCb\");\n __publicField(this, \"adoptedStyleSheetCb\");\n __publicField(this, \"styleMirror\", new StyleSheetMirror());\n this.mutationCb = options.mutationCb;\n this.adoptedStyleSheetCb = options.adoptedStyleSheetCb;\n }\n attachLinkElement(linkEl, childSn) {\n if (\"_cssText\" in childSn.attributes)\n this.mutationCb({\n adds: [],\n removes: [],\n texts: [],\n attributes: [\n {\n id: childSn.id,\n attributes: childSn.attributes\n }\n ]\n });\n this.trackLinkElement(linkEl);\n }\n trackLinkElement(linkEl) {\n if (this.trackedLinkElements.has(linkEl)) return;\n this.trackedLinkElements.add(linkEl);\n this.trackStylesheetInLinkElement(linkEl);\n }\n adoptStyleSheets(sheets, hostId) {\n if (sheets.length === 0) return;\n const adoptedStyleSheetData = {\n id: hostId,\n styleIds: []\n };\n const styles = [];\n for (const sheet of sheets) {\n let styleId;\n if (!this.styleMirror.has(sheet)) {\n styleId = this.styleMirror.add(sheet);\n styles.push({\n styleId,\n rules: Array.from(sheet.rules || CSSRule, (r, index2) => ({\n rule: stringifyRule(r, sheet.href),\n index: index2\n }))\n });\n } else styleId = this.styleMirror.getId(sheet);\n adoptedStyleSheetData.styleIds.push(styleId);\n }\n if (styles.length > 0) adoptedStyleSheetData.styles = styles;\n this.adoptedStyleSheetCb(adoptedStyleSheetData);\n }\n reset() {\n this.styleMirror.reset();\n this.trackedLinkElements = /* @__PURE__ */ new WeakSet();\n }\n // TODO: take snapshot on stylesheet reload by applying event listener\n trackStylesheetInLinkElement(_linkEl) {\n }\n}\nclass ProcessedNodeManager {\n constructor() {\n __publicField(this, \"nodeMap\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"active\", false);\n }\n inOtherBuffer(node, thisBuffer) {\n const buffers = this.nodeMap.get(node);\n return buffers && Array.from(buffers).some((buffer) => buffer !== thisBuffer);\n }\n add(node, buffer) {\n if (!this.active) {\n this.active = true;\n requestAnimationFrame(() => {\n this.nodeMap = /* @__PURE__ */ new WeakMap();\n this.active = false;\n });\n }\n this.nodeMap.set(node, (this.nodeMap.get(node) || /* @__PURE__ */ new Set()).add(buffer));\n }\n destroy() {\n }\n}\nlet wrappedEmit;\nlet takeFullSnapshot;\nlet canvasManager;\nlet recording = false;\ntry {\n if (Array.from([1], (x) => x * 2)[0] !== 2) {\n const cleanFrame = document.createElement(\"iframe\");\n document.body.appendChild(cleanFrame);\n Array.from = ((_a = cleanFrame.contentWindow) == null ? void 0 : _a.Array.from) || Array.from;\n document.body.removeChild(cleanFrame);\n }\n} catch (err) {\n console.debug(\"Unable to override Array.from\", err);\n}\nconst mirror = createMirror();\nfunction record(options = {}) {\n const {\n emit,\n checkoutEveryNms,\n checkoutEveryNth,\n blockClass = \"rr-block\",\n blockSelector = null,\n ignoreClass = \"rr-ignore\",\n ignoreSelector = null,\n maskTextClass = \"rr-mask\",\n maskTextSelector = null,\n inlineStylesheet = true,\n maskAllInputs,\n maskInputOptions: _maskInputOptions,\n slimDOMOptions: _slimDOMOptions,\n maskInputFn,\n maskTextFn,\n hooks,\n packFn,\n sampling = {},\n dataURLOptions = {},\n mousemoveWait,\n recordDOM = true,\n recordCanvas = false,\n recordCrossOriginIframes = false,\n recordAfter = options.recordAfter === \"DOMContentLoaded\" ? options.recordAfter : \"load\",\n userTriggeredOnInput = false,\n collectFonts = false,\n inlineImages = false,\n plugins,\n keepIframeSrcFn = () => false,\n ignoreCSSAttributes = /* @__PURE__ */ new Set([]),\n errorHandler: errorHandler2\n } = options;\n registerErrorHandler(errorHandler2);\n const inEmittingFrame = recordCrossOriginIframes ? window.parent === window : true;\n let passEmitsToParent = false;\n if (!inEmittingFrame) {\n try {\n if (window.parent.document) {\n passEmitsToParent = false;\n }\n } catch (e) {\n passEmitsToParent = true;\n }\n }\n if (inEmittingFrame && !emit) {\n throw new Error(\"emit function is required\");\n }\n if (!inEmittingFrame && !passEmitsToParent) {\n return () => {\n };\n }\n if (mousemoveWait !== void 0 && sampling.mousemove === void 0) {\n sampling.mousemove = mousemoveWait;\n }\n mirror.reset();\n const maskInputOptions = maskAllInputs === true ? {\n color: true,\n date: true,\n \"datetime-local\": true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n password: true\n } : _maskInputOptions !== void 0 ? _maskInputOptions : { password: true };\n const slimDOMOptions = slimDOMDefaults(_slimDOMOptions);\n polyfill();\n let lastFullSnapshotEvent;\n let incrementalSnapshotCount = 0;\n const eventProcessor = (e) => {\n for (const plugin of plugins || []) {\n if (plugin.eventProcessor) {\n e = plugin.eventProcessor(e);\n }\n }\n if (packFn && // Disable packing events which will be emitted to parent frames.\n !passEmitsToParent) {\n e = packFn(e);\n }\n return e;\n };\n wrappedEmit = (r, isCheckout) => {\n var _a2;\n const e = r;\n e.timestamp = nowTimestamp();\n if (((_a2 = mutationBuffers[0]) == null ? void 0 : _a2.isFrozen()) && e.type !== EventType.FullSnapshot && !(e.type === EventType.IncrementalSnapshot && e.data.source === IncrementalSource.Mutation)) {\n mutationBuffers.forEach((buf) => buf.unfreeze());\n }\n if (inEmittingFrame) {\n emit == null ? void 0 : emit(eventProcessor(e), isCheckout);\n } else if (passEmitsToParent) {\n const message = {\n type: \"rrweb\",\n event: eventProcessor(e),\n origin: window.location.origin,\n isCheckout\n };\n window.parent.postMessage(message, \"*\");\n }\n if (e.type === EventType.FullSnapshot) {\n lastFullSnapshotEvent = e;\n incrementalSnapshotCount = 0;\n } else if (e.type === EventType.IncrementalSnapshot) {\n if (e.data.source === IncrementalSource.Mutation && e.data.isAttachIframe) {\n return;\n }\n incrementalSnapshotCount++;\n const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;\n const exceedTime = checkoutEveryNms && e.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;\n if (exceedCount || exceedTime) {\n takeFullSnapshot(true);\n }\n }\n };\n const wrappedMutationEmit = (m) => {\n wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Mutation,\n ...m\n }\n });\n };\n const wrappedScrollEmit = (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Scroll,\n ...p\n }\n });\n const wrappedCanvasMutationEmit = (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.CanvasMutation,\n ...p\n }\n });\n const wrappedAdoptedStyleSheetEmit = (a) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.AdoptedStyleSheet,\n ...a\n }\n });\n const stylesheetManager = new StylesheetManager({\n mutationCb: wrappedMutationEmit,\n adoptedStyleSheetCb: wrappedAdoptedStyleSheetEmit\n });\n const iframeManager = new IframeManager({\n mirror,\n mutationCb: wrappedMutationEmit,\n stylesheetManager,\n recordCrossOriginIframes,\n wrappedEmit\n });\n for (const plugin of plugins || []) {\n if (plugin.getMirror)\n plugin.getMirror({\n nodeMirror: mirror,\n crossOriginIframeMirror: iframeManager.crossOriginIframeMirror,\n crossOriginIframeStyleMirror: iframeManager.crossOriginIframeStyleMirror\n });\n }\n const processedNodeManager = new ProcessedNodeManager();\n canvasManager = new CanvasManager({\n recordCanvas,\n mutationCb: wrappedCanvasMutationEmit,\n win: window,\n blockClass,\n blockSelector,\n mirror,\n sampling: sampling.canvas,\n dataURLOptions\n });\n const shadowDomManager = new ShadowDomManager({\n mutationCb: wrappedMutationEmit,\n scrollCb: wrappedScrollEmit,\n bypassOptions: {\n blockClass,\n blockSelector,\n maskTextClass,\n maskTextSelector,\n inlineStylesheet,\n maskInputOptions,\n dataURLOptions,\n maskTextFn,\n maskInputFn,\n recordCanvas,\n inlineImages,\n sampling,\n slimDOMOptions,\n iframeManager,\n stylesheetManager,\n canvasManager,\n keepIframeSrcFn,\n processedNodeManager\n },\n mirror\n });\n takeFullSnapshot = (isCheckout = false) => {\n if (!recordDOM) {\n return;\n }\n wrappedEmit(\n {\n type: EventType.Meta,\n data: {\n href: window.location.href,\n width: getWindowWidth(),\n height: getWindowHeight()\n }\n },\n isCheckout\n );\n stylesheetManager.reset();\n shadowDomManager.init();\n mutationBuffers.forEach((buf) => buf.lock());\n const node = snapshot(document, {\n mirror,\n blockClass,\n blockSelector,\n maskTextClass,\n maskTextSelector,\n inlineStylesheet,\n maskAllInputs: maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOM: slimDOMOptions,\n dataURLOptions,\n recordCanvas,\n inlineImages,\n onSerialize: (n) => {\n if (isSerializedIframe(n, mirror)) {\n iframeManager.addIframe(n);\n }\n if (isSerializedStylesheet(n, mirror)) {\n stylesheetManager.trackLinkElement(n);\n }\n if (hasShadowRoot(n)) {\n shadowDomManager.addShadowRoot(index.shadowRoot(n), document);\n }\n },\n onIframeLoad: (iframe, childSn) => {\n iframeManager.attachIframe(iframe, childSn);\n shadowDomManager.observeAttachShadow(iframe);\n },\n onStylesheetLoad: (linkEl, childSn) => {\n stylesheetManager.attachLinkElement(linkEl, childSn);\n },\n keepIframeSrcFn\n });\n if (!node) {\n return console.warn(\"Failed to snapshot the document\");\n }\n wrappedEmit(\n {\n type: EventType.FullSnapshot,\n data: {\n node,\n initialOffset: getWindowScroll(window)\n }\n },\n isCheckout\n );\n mutationBuffers.forEach((buf) => buf.unlock());\n if (document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0)\n stylesheetManager.adoptStyleSheets(\n document.adoptedStyleSheets,\n mirror.getId(document)\n );\n };\n try {\n const handlers = [];\n const observe = (doc) => {\n var _a2;\n return callbackWrapper(initObservers)(\n {\n mutationCb: wrappedMutationEmit,\n mousemoveCb: (positions, source) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source,\n positions\n }\n }),\n mouseInteractionCb: (d) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.MouseInteraction,\n ...d\n }\n }),\n scrollCb: wrappedScrollEmit,\n viewportResizeCb: (d) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.ViewportResize,\n ...d\n }\n }),\n inputCb: (v) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Input,\n ...v\n }\n }),\n mediaInteractionCb: (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.MediaInteraction,\n ...p\n }\n }),\n styleSheetRuleCb: (r) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.StyleSheetRule,\n ...r\n }\n }),\n styleDeclarationCb: (r) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.StyleDeclaration,\n ...r\n }\n }),\n canvasMutationCb: wrappedCanvasMutationEmit,\n fontCb: (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Font,\n ...p\n }\n }),\n selectionCb: (p) => {\n wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Selection,\n ...p\n }\n });\n },\n customElementCb: (c) => {\n wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.CustomElement,\n ...c\n }\n });\n },\n blockClass,\n ignoreClass,\n ignoreSelector,\n maskTextClass,\n maskTextSelector,\n maskInputOptions,\n inlineStylesheet,\n sampling,\n recordDOM,\n recordCanvas,\n inlineImages,\n userTriggeredOnInput,\n collectFonts,\n doc,\n maskInputFn,\n maskTextFn,\n keepIframeSrcFn,\n blockSelector,\n slimDOMOptions,\n dataURLOptions,\n mirror,\n iframeManager,\n stylesheetManager,\n shadowDomManager,\n processedNodeManager,\n canvasManager,\n ignoreCSSAttributes,\n plugins: ((_a2 = plugins == null ? void 0 : plugins.filter((p) => p.observer)) == null ? void 0 : _a2.map((p) => ({\n observer: p.observer,\n options: p.options,\n callback: (payload) => wrappedEmit({\n type: EventType.Plugin,\n data: {\n plugin: p.name,\n payload\n }\n })\n }))) || []\n },\n hooks\n );\n };\n iframeManager.addLoadListener((iframeEl) => {\n try {\n handlers.push(observe(iframeEl.contentDocument));\n } catch (error) {\n console.warn(error);\n }\n });\n const init = () => {\n takeFullSnapshot();\n handlers.push(observe(document));\n recording = true;\n };\n if ([\"interactive\", \"complete\"].includes(document.readyState)) {\n init();\n } else {\n handlers.push(\n on(\"DOMContentLoaded\", () => {\n wrappedEmit({\n type: EventType.DomContentLoaded,\n data: {}\n });\n if (recordAfter === \"DOMContentLoaded\") init();\n })\n );\n handlers.push(\n on(\n \"load\",\n () => {\n wrappedEmit({\n type: EventType.Load,\n data: {}\n });\n if (recordAfter === \"load\") init();\n },\n window\n )\n );\n }\n return () => {\n handlers.forEach((handler) => {\n try {\n handler();\n } catch (error) {\n const msg = String(error).toLowerCase();\n if (!msg.includes(\"cross-origin\")) {\n console.warn(error);\n }\n }\n });\n processedNodeManager.destroy();\n recording = false;\n unregisterErrorHandler();\n };\n } catch (error) {\n console.warn(error);\n }\n}\nrecord.addCustomEvent = (tag, payload) => {\n if (!recording) {\n throw new Error(\"please add custom event after start recording\");\n }\n wrappedEmit({\n type: EventType.Custom,\n data: {\n tag,\n payload\n }\n });\n};\nrecord.freezePage = () => {\n mutationBuffers.forEach((buf) => buf.freeze());\n};\nrecord.takeFullSnapshot = (isCheckout) => {\n if (!recording) {\n throw new Error(\"please take full snapshot after start recording\");\n }\n takeFullSnapshot(isCheckout);\n};\nrecord.mirror = mirror;\nexport {\n record\n};\n//# sourceMappingURL=record.js.map\n","var EventType = /* @__PURE__ */ ((EventType2) => {\n EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n EventType2[EventType2[\"Asset\"] = 7] = \"Asset\";\n return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n IncrementalSource2[IncrementalSource2[\"CustomElement\"] = 16] = \"CustomElement\";\n return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n return MouseInteractions2;\n})(MouseInteractions || {});\nvar PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {\n PointerTypes2[PointerTypes2[\"Mouse\"] = 0] = \"Mouse\";\n PointerTypes2[PointerTypes2[\"Pen\"] = 1] = \"Pen\";\n PointerTypes2[PointerTypes2[\"Touch\"] = 2] = \"Touch\";\n return PointerTypes2;\n})(PointerTypes || {});\nvar CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n return CanvasContext2;\n})(CanvasContext || {});\nvar MediaInteractions = /* @__PURE__ */ ((MediaInteractions2) => {\n MediaInteractions2[MediaInteractions2[\"Play\"] = 0] = \"Play\";\n MediaInteractions2[MediaInteractions2[\"Pause\"] = 1] = \"Pause\";\n MediaInteractions2[MediaInteractions2[\"Seeked\"] = 2] = \"Seeked\";\n MediaInteractions2[MediaInteractions2[\"VolumeChange\"] = 3] = \"VolumeChange\";\n MediaInteractions2[MediaInteractions2[\"RateChange\"] = 4] = \"RateChange\";\n return MediaInteractions2;\n})(MediaInteractions || {});\nvar ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {\n ReplayerEvents2[\"Start\"] = \"start\";\n ReplayerEvents2[\"Pause\"] = \"pause\";\n ReplayerEvents2[\"Resume\"] = \"resume\";\n ReplayerEvents2[\"Resize\"] = \"resize\";\n ReplayerEvents2[\"Finish\"] = \"finish\";\n ReplayerEvents2[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n ReplayerEvents2[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n ReplayerEvents2[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n ReplayerEvents2[\"SkipStart\"] = \"skip-start\";\n ReplayerEvents2[\"SkipEnd\"] = \"skip-end\";\n ReplayerEvents2[\"MouseInteraction\"] = \"mouse-interaction\";\n ReplayerEvents2[\"EventCast\"] = \"event-cast\";\n ReplayerEvents2[\"CustomEvent\"] = \"custom-event\";\n ReplayerEvents2[\"Flush\"] = \"flush\";\n ReplayerEvents2[\"StateChange\"] = \"state-change\";\n ReplayerEvents2[\"PlayBack\"] = \"play-back\";\n ReplayerEvents2[\"Destroy\"] = \"destroy\";\n return ReplayerEvents2;\n})(ReplayerEvents || {});\nvar NodeType = /* @__PURE__ */ ((NodeType2) => {\n NodeType2[NodeType2[\"Document\"] = 0] = \"Document\";\n NodeType2[NodeType2[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType2[NodeType2[\"Element\"] = 2] = \"Element\";\n NodeType2[NodeType2[\"Text\"] = 3] = \"Text\";\n NodeType2[NodeType2[\"CDATA\"] = 4] = \"CDATA\";\n NodeType2[NodeType2[\"Comment\"] = 5] = \"Comment\";\n return NodeType2;\n})(NodeType || {});\nexport {\n CanvasContext,\n EventType,\n IncrementalSource,\n MediaInteractions,\n MouseInteractions,\n NodeType,\n PointerTypes,\n ReplayerEvents\n};\n//# sourceMappingURL=types.js.map\n","import { record } from \"@rrweb/record\";\nimport { EventType, type eventWithTime } from \"@rrweb/types\";\n\n/**\n * Buffered session replay — the rrweb capture half of issue #189 (ADR-0024).\n *\n * The recorder runs continuously from mount (\"the moment before matters\",\n * VISION principle 4) but never streams: rrweb events accumulate in **two\n * checkout-delimited buckets**, and every {@link REPLAY_CHECKOUT_MS} rrweb takes\n * a fresh full DOM snapshot (a \"checkout\") that rotates the buckets. A report's\n * {@link ReplayRecorder.snapshot} is the concatenation of both buckets, so it\n * always starts at a full snapshot and carries between one and two checkout\n * intervals of lead-up — the bounded-window posture the Trace already follows,\n * never an unbounded full-session stream.\n *\n * Masking is applied by rrweb **at serialization time, inside the page** — the\n * same client-side, private-by-default boundary as the screenshot and the Trace\n * (spec 0003 §C, VISION §5): every input is masked (`maskAllInputs`) and, by\n * default, **all text** is masked (`maskTextSelector: \"*\"`), so the recording\n * that leaves the browser carries layout and interaction, not content. A\n * Project that accepts the trade-off can narrow the text mask via\n * {@link ReplayOptions.maskTextSelector} (rrweb 2.1 has no per-element unmask\n * selector, so narrowing the mask selector is the escape hatch). The SDK's own\n * chrome — launcher and overlay hosts — is blocked from the recording entirely,\n * mirroring how the screenshot strips it.\n */\n\n/**\n * How often rrweb takes a checkout full snapshot, which is also the bucket\n * rotation period: a snapshot carries 1–2 of these intervals of lead-up\n * (30–60 s), Sentry's buffered-replay ballpark.\n */\nexport const REPLAY_CHECKOUT_MS = 30_000;\n\n/**\n * The SDK's own host elements (dom.ts markers), excluded from the recording the\n * way the screenshot's clone walk strips them.\n */\nexport const FIXBACK_BLOCK_SELECTOR = \"[data-fixback-root],[data-fixback-overlay]\";\n\n/**\n * Media elements blocked from the recording by default (Sentry's `blockAllMedia`\n * posture, adopted): text masking cannot redact what an image shows, so media\n * renders as a same-size placeholder in replay unless a Project opts out via\n * {@link ReplayOptions.blockMedia}.\n */\nexport const FIXBACK_MEDIA_SELECTOR =\n \"img,image,svg,video,object,picture,embed,map,audio\";\n\n/** Tuning for the replay recorder. All optional; the defaults are the contract. */\nexport interface ReplayOptions {\n /**\n * Mask **all** text content (default `true`, private-by-default). `false`\n * records text in the clear — inputs stay masked regardless.\n */\n readonly maskText?: boolean;\n /**\n * Which elements' text rrweb masks when {@link maskText} is on. Defaults to\n * `\"*\"` (everything); narrow it to unmask known-safe regions.\n */\n readonly maskTextSelector?: string;\n /**\n * Block media content — images, video, audio, SVG — from the recording\n * (default `true`, {@link FIXBACK_MEDIA_SELECTOR}): what a picture shows\n * cannot be text-masked, so media is a placeholder in replay. `false` records\n * it (an internal/beta Project trading privacy for fidelity, VISION §5).\n */\n readonly blockMedia?: boolean;\n /** Extra elements to exclude from the recording, alongside the SDK's own chrome. */\n readonly blockSelector?: string;\n}\n\n/** One rrweb event as recorded; the wire payload is an array of these. */\nexport type ReplayEvent = eventWithTime;\n\n/** The buffered window a report ships: rrweb events starting at a full snapshot. */\nexport interface ReplaySnapshot {\n readonly events: readonly ReplayEvent[];\n}\n\n/** A read-only view of the recorder the report surfaces attach from. */\nexport interface ReplaySource {\n /** The current buffered window, or `null` when nothing replayable exists. */\n snapshot(): ReplaySnapshot | null;\n}\n\n/** A running replay recorder. */\nexport interface ReplayRecorder extends ReplaySource {\n /** Stop recording and release the buffers. Safe to call more than once. */\n stop(): void;\n}\n\n/** The slice of rrweb's record options the recorder sets. */\nexport interface ReplayRecordOptions {\n readonly emit: (event: ReplayEvent, isCheckout?: boolean) => void;\n readonly checkoutEveryNms?: number;\n readonly maskAllInputs?: boolean;\n readonly maskTextSelector?: string;\n readonly blockSelector?: string;\n readonly slimDOMOptions?: \"all\";\n}\n\n/**\n * The slice of rrweb's `record` the recorder consumes; injectable for tests.\n * (A concrete signature — rrweb's own is generic, which mocks can't satisfy.)\n */\nexport type RecordFn = (options: ReplayRecordOptions) => (() => void) | undefined;\n\n/** A recorder that never records — what a failed start degrades to. */\nconst NOOP_RECORDER: ReplayRecorder = { snapshot: () => null, stop: () => {} };\n\n/**\n * Start the buffered replay recorder. Never throws: an rrweb failure (an exotic\n * DOM, an unsupported environment) degrades to a recorder whose `snapshot()` is\n * `null`, so a Fixback problem never surfaces on the host page and a report\n * simply ships without replay.\n */\nexport function startReplayRecorder(\n options: ReplayOptions = {},\n recordFn: RecordFn = record as RecordFn,\n): ReplayRecorder {\n /** Events since the last checkout (`cur`) and the full interval before it (`prev`). */\n let prev: ReplayEvent[] = [];\n let cur: ReplayEvent[] = [];\n /**\n * A checkout arrives as a burst of consecutive `isCheckout` events (meta +\n * full snapshot); rotate the buckets once per burst, on its first event.\n */\n let inCheckout = false;\n\n const maskText = options.maskText !== false;\n const blockParts = [\n FIXBACK_BLOCK_SELECTOR,\n ...(options.blockMedia !== false ? [FIXBACK_MEDIA_SELECTOR] : []),\n ...(options.blockSelector ? [options.blockSelector] : []),\n ];\n const blockSelector = blockParts.join(\",\");\n\n let stopFn: (() => void) | undefined;\n try {\n stopFn = recordFn({\n emit: (event: ReplayEvent, isCheckout?: boolean) => {\n if (isCheckout && !inCheckout) {\n prev = cur;\n cur = [];\n }\n inCheckout = isCheckout === true;\n cur.push(event);\n },\n checkoutEveryNms: REPLAY_CHECKOUT_MS,\n maskAllInputs: true,\n ...(maskText ? { maskTextSelector: options.maskTextSelector ?? \"*\" } : {}),\n blockSelector,\n // Strip script tags, comments, and head noise from the snapshot — replay\n // re-executes nothing, so they are dead weight on every payload.\n slimDOMOptions: \"all\",\n });\n } catch {\n stopFn = undefined;\n }\n if (typeof stopFn !== \"function\") return NOOP_RECORDER;\n const stopRecord = stopFn;\n\n let running = true;\n return {\n snapshot() {\n if (!running) return null;\n const events = [...prev, ...cur];\n // Replay needs a full snapshot to rebuild from; without one (recording\n // just started, or rrweb never produced it) there is nothing to watch.\n if (!events.some((event) => event.type === EventType.FullSnapshot)) return null;\n return { events };\n },\n stop() {\n if (!running) return;\n running = false;\n try {\n stopRecord();\n } catch {\n // Teardown must never throw into the host page.\n }\n prev = [];\n cur = [];\n },\n };\n}\n","import type { BeforeSend } from \"@fixback/sdk-core\";\n\nimport { type BootAnswer, type IdentityInputs, requestBoot } from \"./boot\";\nimport {\n createBreadcrumbBuffer,\n instrumentBreadcrumbs,\n type BeforeBreadcrumb,\n type BreadcrumbBuffer,\n type BreadcrumbLevel,\n type Teardown,\n type TraceStream,\n} from \"./breadcrumbs\";\nimport { installErrorCapture } from \"./error-capture\";\nimport { ensureAnonymousId } from \"./identity\";\nimport {\n fetchInviteStatus,\n persistReporter,\n readInviteToken,\n readStoredReporter,\n redeemInviteToken,\n type ReporterDisplay,\n stripInviteToken,\n} from \"./invite\";\nimport { LAUNCH_EVENT, type Launcher, mountLauncher, unmountLauncher } from \"./launcher\";\nimport { createOnboardingModal } from \"./onboarding\";\nimport { createOverlay } from \"./overlay\";\nimport {\n startReplayRecorder,\n type ReplayOptions,\n type ReplayRecorder,\n} from \"./replay\";\nimport { normaliseRelease } from \"./report\";\nimport { SDK_VERSION } from \"./version\";\n\n/**\n * The hosted Fixback API origin the SDK talks to by default. A self-hosted or\n * local deployment overrides it with `apiUrl` (the dashboard's install snippet\n * pre-fills the right value for the Project).\n */\nexport const DEFAULT_API_URL = \"https://api.fixback.dev\";\n\n/**\n * Does `url` address one of the SDK's **own** API endpoints? Every request the SDK\n * issues lives under two namespaces beneath the API origin: `/api/ingest/*` — boot\n * (`bootEndpoint`, boot.ts) and feedback (`feedbackEndpoint`, submit.ts) — and\n * `/api/invites/*` (`inviteStatusEndpoint` / `redeemEndpoint`, invite.ts).\n *\n * The trace's network capture ignores **only** these, never the whole origin. That\n * distinction matters when the instrumented app and the Fixback API share an origin — a\n * self-hosted deployment, or Fixback running its own SDK on its own dashboard — where\n * ignoring the origin wholesale would swallow all of the app's own requests and leave the\n * Network tab empty. When the app and the API sit on different origins (the common case)\n * this matches nothing extra, since the app's origin is never `apiUrl`. `url` is the raw\n * request URL — absolute for every call the SDK makes — so a prefix test over the\n * normalised origin is exact.\n */\nexport function isFixbackApiRequest(apiUrl: string, url: string): boolean {\n const apiBase = apiUrl.replace(/\\/+$/, \"\");\n return (\n url.startsWith(`${apiBase}/api/ingest/`) || url.startsWith(`${apiBase}/api/invites/`)\n );\n}\n\n/**\n * Trace buffer tuning (spec #122 §A). These are configurable **starting points**\n * from the grill — three per-stream ring budgets (network ≈ 100 / console ≈ 80 /\n * breadcrumbs ≈ 40), a shared age cap (~3 min, on), and **all** console levels\n * captured (eviction priority, not capture, keeps warn/error above the chatter) —\n * never frozen magic numbers. Pass `false` for {@link InitOptions.trace} to disable\n * capture entirely.\n */\nexport interface TraceOptions {\n /**\n * Per-stream ring budgets (network / console / breadcrumbs); each stream evicts\n * independently, so a chatty stream can't drop another's lead-up. Any stream\n * omitted uses its default.\n */\n readonly budgets?: Partial<Record<TraceStream, number>>;\n /** Shared age cap in ms. Defaults to ~3 min (on); pass `0` to disable age pruning. */\n readonly maxAgeMs?: number;\n /** Console levels captured. Defaults to **all** levels (log/info/warn/error/assert/debug). */\n readonly consoleLevels?: readonly BreadcrumbLevel[];\n /** Per-crumb filter: mute a category, edit a crumb, or drop it (`null`). */\n readonly beforeBreadcrumb?: BeforeBreadcrumb;\n}\n\n/** Options for {@link init}. Only `key` is required. */\nexport interface InitOptions extends IdentityInputs {\n /** The Project's **publishable** key — an identifier that ships in the page. */\n readonly key: string;\n /** The Fixback API origin. Defaults to {@link DEFAULT_API_URL}. */\n readonly apiUrl?: string;\n /** Where to mount the launcher. Defaults to `document.body`. */\n readonly target?: HTMLElement;\n /**\n * Still the launcher's pulse and motion. An explicit opt-in that complements\n * the visitor's OS-level `prefers-reduced-motion`, which the launcher already\n * honours on its own.\n */\n readonly reduceMotion?: boolean;\n /**\n * The synchronous, network-free client scrub hook every report passes through\n * before transport (spec §C). Mutate the draft to scrub further, or return\n * `null` to drop the report. Runs after the default scrubbers.\n */\n readonly beforeSend?: BeforeSend;\n /** Run the built-in default scrubbers. Defaults to `true` (private-by-default). */\n readonly scrub?: boolean;\n /** Trace buffer tuning, or `false` to turn the buffer off entirely. */\n readonly trace?: TraceOptions | false;\n /**\n * Buffered session-replay tuning (issue #189, ADR-0024) — masking defaults on:\n * all inputs, all text, SDK chrome blocked — or `false` to turn the recorder\n * off entirely regardless of the served config.\n */\n readonly replay?: ReplayOptions | false;\n /**\n * The dev-side override of the Project's server-served capture config (spec #122\n * §L; ticket #138). Capture is **default-on** and normally governed per-project\n * from the dashboard, surfaced on the boot answer; set a stream here to override\n * what the server serves for it — `{ network: false }` turns network capture off\n * even where the Project leaves it on, and a stream left unset follows the served\n * config. Independent of {@link trace} `false`, which turns the whole buffer off,\n * and of {@link replay} `false`, which turns the recorder off.\n */\n readonly capture?: {\n readonly console?: boolean;\n readonly network?: boolean;\n readonly replay?: boolean;\n };\n /**\n * Automatic error capture — the SDK files uncaught exceptions / unhandled\n * rejections as `source: error` Feedback with no prompt (spec §E, ADR-0011).\n * **Default-on across all Gates**; set `false` for the per-project toggle that\n * turns it off. It is gated by boot's `canSubmit` either way, so an auto-error is\n * never filed where a manual report would be refused.\n */\n readonly autoCapture?: boolean;\n /**\n * The host app's **Release** — a build identifier (a git SHA, a semver, a\n * `name@version`) stamped into every submission's environment (#117,\n * ADR-0024). Set it to the same value the build uploaded sourcemaps under\n * (`npx fixback sourcemaps upload --release <v>`), and auto-captured errors\n * gain a symbolicated **code-area pointer** on their Issues. Optional: without\n * it (or without uploaded sourcemaps) everything behaves exactly as before.\n * An invalid value (whitespace, slashes, over 100 chars) is ignored with a\n * console warning.\n */\n readonly release?: string;\n}\n\n/**\n * Options for {@link redeem} — the explicit form of the `?fixback_invite=` URL\n * detection {@link init} performs. Identical to {@link InitOptions} plus the\n * `token` to redeem (the value the invite link carried).\n */\nexport interface RedeemOptions extends InitOptions {\n /** The invite token to redeem — the `?fixback_invite=` value from the link. */\n readonly token: string;\n}\n\n/** A running SDK instance. */\nexport interface FixbackInstance {\n /** Remove the launcher and release its DOM. Safe to call more than once. */\n destroy(): void;\n}\n\nconst NOOP_INSTANCE: FixbackInstance = { destroy() {} };\n\n/** The host site's origin (for the onboarding modal); never throws. */\nfunction originHost(): string {\n try {\n const loc = window.location;\n return loc.host || loc.hostname || \"this site\";\n } catch {\n return \"this site\";\n }\n}\n\n/** The current page URL, or `\"\"` when it cannot be read; never throws. */\nfunction safeHref(): string {\n try {\n return window.location.href;\n } catch {\n return \"\";\n }\n}\n\n/** Context for mounting the launcher + overlay + trace once boot says yes. */\ninterface MountContext {\n readonly options: InitOptions;\n readonly apiUrl: string;\n readonly key: string;\n readonly identity: IdentityInputs;\n /**\n * The Reporter's self-provided display name / email (spec §F), when the SDK holds\n * them. Rides into the overlay and auto-capture so every submission names who filed\n * it — display only, never a trust signal.\n */\n readonly display?: ReporterDisplay;\n readonly target: HTMLElement;\n readonly answer: BootAnswer;\n}\n\n/**\n * Mount the launcher and the report overlay it opens, the thin trace buffer\n * (spec §C), and automatic error capture (spec §E). Returns a teardown that removes\n * them all. The boot answer's `gate` + `tier` ride into the overlay (no second\n * call): `tier` drives the display-only header chip (§G), `gate` is reserved for\n * Gate-aware behaviour. The overlay and the auto-capture handlers carry the resolved\n * identity, so both a filed report and an auto-captured error are attributed to the\n * very Reporter boot recognised.\n */\nfunction mountReporter(ctx: MountContext): Teardown {\n const { options, apiUrl, key, identity, display, target, answer } = ctx;\n // The host app's Release (#117, ADR-0024), validated once here: an invalid\n // value is dropped with a warning (never shipped for the server to discard,\n // and never a reason to refuse to mount — capture must not break on config).\n const release = options.release ? normaliseRelease(options.release) : undefined;\n if (options.release && !release) {\n console.warn(\n `[fixback] ignoring invalid release ${JSON.stringify(options.release)} — ` +\n \"use 1-100 visible characters with no whitespace or slashes (e.g. a git SHA or semver).\",\n );\n }\n const launcher: Launcher = mountLauncher(target, {\n key,\n reduceMotion: options.reduceMotion,\n });\n\n let buffer: BreadcrumbBuffer | null = null;\n let teardownTrace: Teardown = () => {};\n if (options.trace !== false) {\n const trace = options.trace ?? {};\n // Effective per-stream capture (#138): start from what boot served (default-on\n // when the server omits it or a value is not a boolean), then let an explicit\n // `init` option override that stream. Turning a stream off means it is never\n // instrumented, so no entry of that kind ever reaches the wire.\n const served = ctx.answer.capture;\n const captureConsole =\n options.capture?.console ??\n (typeof served?.console === \"boolean\" ? served.console : true);\n const captureNetwork =\n options.capture?.network ??\n (typeof served?.network === \"boolean\" ? served.network : true);\n buffer = createBreadcrumbBuffer({\n budgets: trace.budgets,\n maxAgeMs: trace.maxAgeMs,\n beforeBreadcrumb: trace.beforeBreadcrumb,\n });\n teardownTrace = instrumentBreadcrumbs(buffer, {\n consoleLevels: trace.consoleLevels,\n ignoreUrl: (url) => isFixbackApiRequest(apiUrl, url),\n captureConsole,\n captureNetwork,\n });\n }\n\n // Buffered session replay (issue #189, ADR-0024): same gating shape as the\n // trace streams — the served per-project toggle (default-on), overridable from\n // `capture.replay`, with `replay: false` turning the recorder off outright.\n let replay: ReplayRecorder | null = null;\n if (options.replay !== false) {\n const served = ctx.answer.capture;\n const captureReplay =\n options.capture?.replay ??\n (typeof served?.replay === \"boolean\" ? served.replay : true);\n if (captureReplay) {\n replay = startReplayRecorder(options.replay ?? {});\n }\n }\n\n const overlay = createOverlay({\n apiUrl,\n key,\n identity,\n display,\n gate: answer.gate,\n tier: answer.tier,\n sdkVersion: SDK_VERSION,\n release,\n target,\n buffer,\n replay,\n beforeSend: options.beforeSend,\n scrub: options.scrub,\n });\n const onLaunch = (): void => overlay.open();\n launcher.host.addEventListener(LAUNCH_EVENT, onLaunch);\n\n // Automatic error capture (spec §E, ADR-0011): two global handlers file uncaught\n // errors as `source: error` Feedback for this session's Reporter, with no prompt.\n // Default-on; `autoCapture: false` is the per-project toggle. Reaching here means\n // boot already returned `canSubmit`, so the Gate is respected and the auto-error\n // inherits the very tier boot derived — a Public crash stays tracked-not-shipped.\n let teardownAutoCapture: Teardown = () => {};\n if (options.autoCapture !== false) {\n teardownAutoCapture = installErrorCapture({\n apiUrl,\n key,\n identity,\n display,\n sdkVersion: SDK_VERSION,\n release,\n buffer,\n replay,\n beforeSend: options.beforeSend,\n scrub: options.scrub,\n }).destroy;\n }\n\n return () => {\n launcher.host.removeEventListener(LAUNCH_EVENT, onLaunch);\n overlay.destroy();\n unmountLauncher(launcher);\n teardownTrace();\n replay?.stop();\n teardownAutoCapture();\n };\n}\n\n/**\n * The shared boot + identity flow behind {@link init} and {@link redeem}.\n *\n * When an invite `token` is present and its Invite is live, the SDK renders the\n * onboarding modal (spec §F) instead of mounting immediately; on confirm it\n * redeems the Invite, persists the returned `reporterId` (scoped by publishable\n * key), strips the token from the URL (one-time consumption), and only then boots\n * with that identity and mounts the launcher. With no token — or a dead one — it\n * boots with any previously stored `reporterId` (a returning invited tester) or\n * an anonymous id, and mounts solely when boot's `canSubmit` is true. So on an\n * Invited / Internal Gate the launcher is absent until redemption, while an Open\n * Gate shows it to an anonymous visitor. Everything is wrapped so a Fixback\n * problem resolves to a no-op instance and never surfaces on the host page.\n */\nasync function run(\n options: InitOptions,\n inviteToken: string | null,\n): Promise<FixbackInstance> {\n try {\n // No DOM (server-side render, worker) — nothing to mount.\n if (typeof document === \"undefined\") return NOOP_INSTANCE;\n\n const key = options?.key;\n if (typeof key !== \"string\" || key.length === 0) return NOOP_INSTANCE;\n\n const apiUrl = options.apiUrl ?? DEFAULT_API_URL;\n const anonymousId = options.anonymousId ?? ensureAnonymousId();\n const target = options.target ?? document.body;\n\n // The launcher / overlay and the modal mount at different times (the modal\n // now, the launcher after redemption). `destroy()` tears down whichever exist.\n let disposed = false;\n let teardownMounted: Teardown = () => {};\n let teardownModal: Teardown = () => {};\n const instance: FixbackInstance = {\n destroy: () => {\n disposed = true;\n teardownModal();\n teardownModal = () => {};\n teardownMounted();\n teardownMounted = () => {};\n },\n };\n\n /** The identity to present when there is no fresh redemption to honour. */\n const storedIdentity = (): IdentityInputs => {\n const stored = readStoredReporter(key);\n return {\n signedIdentity: options.signedIdentity,\n reporterId: options.reporterId ?? stored?.reporterId,\n anonymousId,\n };\n };\n\n /**\n * The display name / email to present alongside a returning Reporter's stored\n * identity (spec §F) — read from the same persisted record `storedIdentity` uses,\n * so a report from a returning invited tester still names them. `undefined` when\n * nothing was stored (an anonymous visitor names no one).\n */\n const storedDisplay = (): ReporterDisplay | undefined => {\n const stored = readStoredReporter(key);\n if (!stored) return undefined;\n const display: ReporterDisplay = {\n ...(stored.name ? { name: stored.name } : {}),\n ...(stored.email ? { email: stored.email } : {}),\n };\n return display.name || display.email ? display : undefined;\n };\n\n /** Boot with a resolved identity and mount the launcher when accepted. */\n const bootAndMount = async (\n identity: IdentityInputs,\n display?: ReporterDisplay,\n ): Promise<void> => {\n const answer = await requestBoot(apiUrl, { key, ...identity });\n if (disposed || !answer?.canSubmit) return;\n teardownMounted = mountReporter({\n options,\n apiUrl,\n key,\n identity,\n display,\n target,\n answer,\n });\n };\n\n if (inviteToken) {\n const status = await fetchInviteStatus(apiUrl, inviteToken);\n if (disposed) return instance;\n if (status && status.status === \"pending\") {\n const stored = readStoredReporter(key);\n\n const confirmRedeem = async (display: ReporterDisplay): Promise<void> => {\n const result = await redeemInviteToken(apiUrl, inviteToken);\n if (disposed) return;\n teardownModal();\n teardownModal = () => {};\n if (result && result.status === \"redeemed\") {\n persistReporter(key, {\n reporterId: result.reporterId,\n name: display.name,\n email: display.email,\n });\n stripInviteToken(window);\n await bootAndMount(\n {\n signedIdentity: options.signedIdentity,\n reporterId: result.reporterId,\n anonymousId,\n },\n // The name / email the tester just entered ride along with their reports.\n display.name || display.email ? display : undefined,\n );\n } else {\n // The Invite died between reading its status and redeeming it (a\n // race, or an already-spent shared link) — fall back to whatever\n // identity we already hold; on a gated Project that means no launcher.\n await bootAndMount(storedIdentity(), storedDisplay());\n }\n };\n\n const modal = createOnboardingModal({\n origin: originHost(),\n tier: status.tier,\n defaults: stored ? { name: stored.name, email: stored.email } : undefined,\n target,\n onConfirm: (display) => {\n void confirmRedeem(display);\n },\n });\n teardownModal = () => modal.destroy();\n return instance;\n }\n // A dead, unknown, or unreachable Invite shows no modal — the SDK proceeds\n // as an ordinary boot (a returning Reporter's stored identity, or anonymous).\n }\n\n await bootAndMount(storedIdentity(), storedDisplay());\n return instance;\n } catch {\n // A Fixback failure must never break the host page.\n return NOOP_INSTANCE;\n }\n}\n\n/**\n * Boot the SDK and mount the launcher when — and only when — a submission would\n * be accepted for this key, origin, and Gate.\n *\n * On load the SDK first checks the page URL for an invite token\n * (`?fixback_invite=`, spec §F); when one is present and live it renders the\n * onboarding modal and defers the launcher until the tester redeems. Otherwise it\n * calls the ingest boot endpoint and mounts the launcher solely when the answer's\n * `canSubmit` is true — so a Reporter is never shown a launcher a submission would\n * be refused, and on an Invited / Internal Gate the launcher stays absent until\n * redemption. Everything is wrapped so a Fixback problem — unreachable, refused,\n * or an unexpected error — resolves to a no-op instance.\n */\nexport function init(options: InitOptions): Promise<FixbackInstance> {\n const token = typeof window !== \"undefined\" ? readInviteToken(safeHref()) : null;\n return run(options, token);\n}\n\n/**\n * Redeem an invite token explicitly, the programmatic equivalent of landing on a\n * page with `?fixback_invite=<token>`. Renders the onboarding modal, and on\n * confirm redeems, persists the `reporterId`, and mounts the launcher (spec §F).\n * Use it when the token reaches the page some way other than the URL.\n */\nexport function redeem(options: RedeemOptions): Promise<FixbackInstance> {\n const token =\n typeof options?.token === \"string\" && options.token.length > 0\n ? options.token\n : null;\n return run(options, token);\n}\n"],"x_google_ignoreList":[22,23],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["__defProp","__defNormalProp","__publicField","EventType"],"sources":["../../sdk-core/dist/index.mjs","../src/connect.ts","../src/identity.ts","../src/capture/extract-dom.ts","../src/annotation.ts","../src/report.ts","../src/submit.ts","../src/version.ts","../src/error-capture.ts","../src/styles.ts","../src/launcher.ts","../src/dom.ts","../src/element-picker.ts","../src/draw-surface.ts","../src/region-capture.ts","../src/overlay/marking.ts","../src/overlay/dom.ts","../src/overlay/icons.ts","../src/overlay/send.ts","../src/overlay-styles.ts","../src/overlay/view.ts","../src/overlay.ts","../../../node_modules/.pnpm/@rrweb+record@2.1.1/node_modules/@rrweb/record/dist/record.js","../../../node_modules/.pnpm/@rrweb+types@2.1.1/node_modules/@rrweb/types/dist/types.js","../src/replay.ts","../src/trace/instrument/window.ts","../src/trace/instrument/beacon.ts","../src/trace/instrument/fetch.ts","../src/trace/instrument/navigation.ts","../src/trace/instrument/ui.ts","../src/trace/instrument/xhr.ts","../src/trace/instrument/index.ts","../src/mount.ts","../src/reporter-session-store.ts","../src/session.ts","../src/init.ts"],"sourcesContent":["var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n\n// src/version.ts\nvar SDK_CORE_VERSION = \"0.3.0\";\n\n// src/scrub.ts\nvar MIN_DIGIT_RUN = 7;\nvar EMAIL_RE = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi;\nvar DIGIT_RUN_RE = new RegExp(`\\\\d{${MIN_DIGIT_RUN},}`, \"g\");\nvar BEARER_RE = /\\b(bearer|token)\\s+[\\w.\\-~+/]+=*/gi;\nvar URL_IN_TEXT_RE = /\\bhttps?:\\/\\/[^\\s\"'<>]+/gi;\nfunction redactPii(text) {\n if (typeof text !== \"string\" || text.length === 0) return text;\n return text.replace(EMAIL_RE, \"[redacted-email]\").replace(BEARER_RE, (_match, keyword) => `${keyword} [redacted]`).replace(DIGIT_RUN_RE, \"[redacted-number]\");\n}\nfunction redactPathPii(pathAndBeyond) {\n return pathAndBeyond.replace(EMAIL_RE, \"[redacted-email]\").replace(DIGIT_RUN_RE, \"[redacted-number]\");\n}\nfunction scrubUrl(url) {\n if (typeof url !== \"string\" || url.length === 0) return url;\n let out = url;\n out = out.replace(/(^[a-z][a-z0-9+.-]*:\\/\\/)[^/@?#]*@/i, \"$1\");\n out = out.replace(/\\?[^#]*/, \"\");\n out = out.replace(\n /#.*$/,\n (fragment) => fragment.includes(\"=\") ? \"\" : fragment\n );\n const absolute = out.match(/^([a-z][a-z0-9+.-]*:\\/\\/[^/?#]*)([\\s\\S]*)$/i);\n if (absolute) return absolute[1] + redactPathPii(absolute[2] ?? \"\");\n const protocolRelative = out.match(/^(\\/\\/[^/?#]*)([\\s\\S]*)$/);\n if (protocolRelative) {\n return protocolRelative[1] + redactPathPii(protocolRelative[2] ?? \"\");\n }\n return redactPathPii(out);\n}\nfunction scrubCrumbData(data) {\n const next = { ...data };\n if (typeof next.url === \"string\") next.url = scrubUrl(next.url);\n if (typeof next.from === \"string\") next.from = scrubUrl(next.from);\n if (typeof next.to === \"string\") next.to = scrubUrl(next.to);\n return next;\n}\nfunction scrubMessage(message) {\n return redactPii(message.replace(URL_IN_TEXT_RE, (url) => scrubUrl(url)));\n}\nfunction scrubArgValue(value) {\n if (typeof value === \"string\") return scrubMessage(value);\n if (Array.isArray(value)) return value.map(scrubArgValue);\n if (value && typeof value === \"object\") {\n const out = {};\n for (const [key, v] of Object.entries(value)) {\n out[key] = scrubArgValue(v);\n }\n return out;\n }\n return value;\n}\nfunction scrubConsoleArg(arg) {\n switch (arg.t) {\n case \"string\":\n return typeof arg.v === \"string\" ? { t: \"string\", v: scrubMessage(arg.v) } : arg;\n case \"json\":\n return { t: \"json\", v: scrubArgValue(arg.v) };\n case \"error\": {\n if (!arg.v || typeof arg.v !== \"object\") return arg;\n const v = arg.v;\n const next = { ...v };\n if (typeof next.message === \"string\") next.message = scrubMessage(next.message);\n if (typeof next.stack === \"string\") next.stack = scrubMessage(next.stack);\n return { t: \"error\", v: next };\n }\n default:\n return arg;\n }\n}\nfunction scrubCrumb(crumb) {\n const next = { ...crumb };\n if (typeof next.message === \"string\") next.message = scrubMessage(next.message);\n if (next.data) next.data = scrubCrumbData(next.data);\n if (typeof next.url === \"string\") next.url = scrubUrl(next.url);\n if (Array.isArray(next.args)) next.args = next.args.map(scrubConsoleArg);\n return next;\n}\nfunction applyDefaultScrub(draft) {\n const next = { ...draft };\n if (typeof next.url === \"string\") next.url = scrubUrl(next.url);\n if (next.trace && next.trace.length > 0) {\n next.trace = next.trace.map(scrubCrumb);\n }\n if (next.errorFrames && next.errorFrames.length > 0) {\n next.errorFrames = next.errorFrames.map((frame) => ({\n ...frame,\n file: scrubUrl(frame.file)\n }));\n }\n return next;\n}\nfunction runBeforeSend(draft, options = {}) {\n const current = options.scrub === false ? draft : applyDefaultScrub(draft);\n const hook = options.hook;\n if (!hook) return current;\n try {\n const result = hook(current);\n return result ?? null;\n } catch {\n return current;\n }\n}\n\n// src/stack.ts\nvar STRUCTURED_FRAME_LIMIT = 30;\nfunction parseStackLine(line) {\n const v8Named = line.match(/^at\\s+(.+?)\\s+\\((.+)\\)$/);\n if (v8Named) return { fn: v8Named[1] ?? null, location: v8Named[2] ?? \"\" };\n const v8Bare = line.match(/^at\\s+(.+)$/);\n if (v8Bare) return { fn: null, location: v8Bare[1] ?? \"\" };\n const at = line.indexOf(\"@\");\n if (at >= 0) {\n return { fn: at > 0 ? line.slice(0, at) : null, location: line.slice(at + 1) };\n }\n return null;\n}\nfunction parseFrameLocation(location) {\n const match = location.match(/^(.*?):(\\d+)(?::(\\d+))?$/);\n if (!match) return null;\n const file = match[1] ?? \"\";\n if (file.length === 0 || file === \"native\" || file.includes(\"<anonymous>\")) {\n return null;\n }\n const line = Number(match[2]);\n if (!Number.isFinite(line)) return null;\n const column = match[3] !== void 0 ? Number(match[3]) : null;\n return { file, line, column };\n}\nfunction extractStructuredFrames(stack, limit = STRUCTURED_FRAME_LIMIT) {\n if (typeof stack !== \"string\" || stack.length === 0) return [];\n const frames = [];\n for (const raw of stack.split(\"\\n\")) {\n if (frames.length >= limit) break;\n const tokens = parseStackLine(raw.trim());\n if (!tokens || !tokens.location) continue;\n const parsed = parseFrameLocation(tokens.location);\n if (!parsed) continue;\n frames.push({\n file: scrubUrl(parsed.file),\n line: parsed.line,\n column: parsed.column,\n function: tokens.fn && tokens.fn.length > 0 ? tokens.fn : null\n });\n }\n return frames;\n}\n\n// src/fingerprint.ts\nvar UUID_RE = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;\nvar URL_RE = /\\bhttps?:\\/\\/[^\\s\"')]+/gi;\nvar HEX_0X_RE = /\\b0x[0-9a-f]+\\b/gi;\nvar HEX_RUN_RE = /\\b[0-9a-f]{8,}\\b/gi;\nvar DIGIT_RUN_RE2 = /\\d{4,}/g;\nvar FINGERPRINT_FRAME_LIMIT = 5;\nfunction normalize(value) {\n if (typeof value !== \"string\" || value.length === 0) return \"\";\n return value.replace(UUID_RE, \"<uuid>\").replace(URL_RE, \"<url>\").replace(HEX_0X_RE, \"<hex>\").replace(HEX_RUN_RE, \"<hex>\").replace(DIGIT_RUN_RE2, \"<n>\").trim();\n}\nfunction hashString(input) {\n let h = 2166136261;\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 16777619);\n }\n return (h >>> 0).toString(36);\n}\nfunction compactLocation(location) {\n const noQuery = location.replace(/\\?[^:]*/, \"\");\n const lastSlash = noQuery.lastIndexOf(\"/\");\n return lastSlash >= 0 ? noQuery.slice(lastSlash + 1) : noQuery;\n}\nfunction parseFrame(line) {\n const tokens = parseStackLine(line);\n if (!tokens) return null;\n return `${tokens.fn ?? \"\"}@${compactLocation(tokens.location)}`;\n}\nfunction extractTopFrames(stack, limit = FINGERPRINT_FRAME_LIMIT) {\n if (typeof stack !== \"string\" || stack.length === 0) return \"\";\n const frames = [];\n for (const raw of stack.split(\"\\n\")) {\n const frame = parseFrame(raw.trim());\n if (frame) {\n frames.push(frame);\n if (frames.length >= limit) break;\n }\n }\n return frames.join(\" < \");\n}\nfunction computeFingerprint(type, value, stack) {\n return hashString(`${type}|${normalize(value)}|${extractTopFrames(stack)}`);\n}\n\n// src/backoff.ts\nvar DEFAULT_RETRY_AFTER_SECONDS = 60;\nfunction parseRetryAfter(header, now) {\n if (header == null) return DEFAULT_RETRY_AFTER_SECONDS;\n const value = header.trim();\n if (value === \"\") return DEFAULT_RETRY_AFTER_SECONDS;\n if (/^\\d+$/.test(value)) {\n return Number(value);\n }\n const when = Date.parse(value);\n if (!Number.isNaN(when)) {\n return Math.max(0, Math.ceil((when - now) / 1e3));\n }\n return DEFAULT_RETRY_AFTER_SECONDS;\n}\nvar AutoReportBackoff = class {\n constructor(now = Date.now) {\n this.now = now;\n /** Epoch ms until which automatic reports are held; `0` when clear. */\n __publicField(this, \"pausedUntil\", 0);\n }\n /** Is the automatic-report pause window currently open? */\n isPaused() {\n return this.now() < this.pausedUntil;\n }\n /** Whole seconds remaining in the pause window (`0` when clear). */\n retryAfterSeconds() {\n return Math.max(0, Math.ceil((this.pausedUntil - this.now()) / 1e3));\n }\n /**\n * Open (or extend) the window from a `429`'s `Retry-After` value, returning the\n * seconds it will hold for. The window only ever grows — a shorter later hold\n * never clips a longer one already in effect.\n */\n hold(retryAfterHeader) {\n const now = this.now();\n const seconds = parseRetryAfter(retryAfterHeader, now);\n const until = now + seconds * 1e3;\n if (until > this.pausedUntil) this.pausedUntil = until;\n return seconds;\n }\n};\n\n// src/env.ts\nfunction nowMono() {\n const perf = globalThis.performance;\n return perf && typeof perf.now === \"function\" ? perf.now() : Date.now();\n}\nfunction textEncoder() {\n return globalThis.TextEncoder;\n}\nfunction utf8ByteLength(value) {\n try {\n const Encoder = textEncoder();\n return Encoder ? new Encoder().encode(value).length : value.length;\n } catch {\n return value.length;\n }\n}\nfunction serializedBytes(value) {\n try {\n const json = JSON.stringify(value) ?? \"\";\n return utf8ByteLength(json);\n } catch {\n return Number.POSITIVE_INFINITY;\n }\n}\nfunction trivialBodySize(body) {\n if (typeof body === \"string\") return utf8ByteLength(body);\n const BlobCtor = globalThis.Blob;\n if (BlobCtor && body instanceof BlobCtor) return body.size;\n if (typeof ArrayBuffer !== \"undefined\") {\n if (body instanceof ArrayBuffer) return body.byteLength;\n if (ArrayBuffer.isView(body)) return body.byteLength;\n }\n return void 0;\n}\n\n// src/http.ts\nfunction resolveFetch() {\n const g = globalThis;\n if (typeof g.fetch !== \"function\") return void 0;\n const bound = g.fetch.bind(globalThis);\n return (url, init) => bound(url, init);\n}\nfunction safeHeader(response, name) {\n try {\n return response.headers?.get?.(name) ?? null;\n } catch {\n return null;\n }\n}\n\n// src/boot.ts\nfunction bootEndpoint(apiUrl) {\n return `${apiUrl.replace(/\\/+$/, \"\")}/api/ingest/boot`;\n}\nfunction feedbackEndpoint(apiUrl) {\n return `${apiUrl.replace(/\\/+$/, \"\")}/api/ingest/feedback`;\n}\nfunction isBootAnswer(value) {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value;\n return typeof v.originAllowed === \"boolean\" && typeof v.canSubmit === \"boolean\" && typeof v.gate === \"string\" && (v.tier === null || typeof v.tier === \"string\");\n}\nfunction compactIdentity(identity) {\n if (!identity) return {};\n const out = {};\n if (identity.hostIdentity) out.hostIdentity = identity.hostIdentity;\n if (identity.reporterSession) out.reporterSession = identity.reporterSession;\n if (identity.anonymousId) out.anonymousId = identity.anonymousId;\n return out;\n}\nfunction isFixbackApiRequest(apiUrl, url) {\n const apiBase = apiUrl.replace(/\\/+$/, \"\");\n return url.startsWith(`${apiBase}/api/ingest/`) || url.startsWith(`${apiBase}/api/connect/`);\n}\nasync function requestBoot(apiUrl, request, deps = {}) {\n const doFetch = deps.fetch ?? resolveFetch();\n if (!doFetch) return null;\n let response;\n try {\n response = await doFetch(bootEndpoint(apiUrl), {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n ...deps.origin ? { origin: deps.origin } : {}\n },\n body: JSON.stringify(request)\n });\n } catch {\n return null;\n }\n if (!response.ok) return null;\n let body;\n try {\n body = await response.json?.();\n } catch {\n return null;\n }\n return isBootAnswer(body) ? body : null;\n}\n\n// src/connect.ts\nvar CONNECT_MESSAGE_SOURCE = \"fixback-connect\";\nvar CONNECT_RETURN_PARAM = \"fixback\";\nfunction connectExchangeEndpoint(apiUrl) {\n return `${apiUrl.replace(/\\/+$/, \"\")}/api/connect/exchange`;\n}\nfunction connectSignOutEndpoint(apiUrl) {\n return `${apiUrl.replace(/\\/+$/, \"\")}/api/connect/signout`;\n}\nfunction buildConnectUrl(connectUrl, params) {\n const base = connectUrl.split(\"#\")[0] ?? connectUrl;\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n const query = `key=${encodeURIComponent(params.key)}&return=${encodeURIComponent(params.returnUrl)}`;\n return `${base}${sep}${query}`;\n}\nfunction reporterSessionStorageKey(publishableKey) {\n return `fixback.reporterSession.${publishableKey}`;\n}\nfunction parseConnectMessage(data) {\n if (typeof data !== \"object\" || data === null) return null;\n const v = data;\n if (v.source !== CONNECT_MESSAGE_SOURCE) return null;\n return typeof v.code === \"string\" && v.code.length > 0 ? v.code : null;\n}\nfunction isConnectExchangeResponse(value) {\n if (typeof value !== \"object\" || value === null) return false;\n const v = value;\n if (typeof v.reporterSession !== \"string\" || v.reporterSession.length === 0) {\n return false;\n }\n const account = v.account;\n return typeof account === \"object\" && account !== null && typeof account.name === \"string\" && typeof account.email === \"string\";\n}\nasync function exchangeConnectCode(apiUrl, request, deps = {}) {\n const doFetch = deps.fetch ?? resolveFetch();\n if (!doFetch) return null;\n let response;\n try {\n response = await doFetch(connectExchangeEndpoint(apiUrl), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(request)\n });\n } catch {\n return null;\n }\n if (!response.ok) return null;\n let body;\n try {\n body = await response.json?.();\n } catch {\n return null;\n }\n return isConnectExchangeResponse(body) ? body : null;\n}\nasync function revokeReporterSession(apiUrl, token, deps = {}) {\n const doFetch = deps.fetch ?? resolveFetch();\n if (!doFetch) return;\n try {\n await doFetch(connectSignOutEndpoint(apiUrl), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ reporterSession: token })\n });\n } catch {\n }\n}\n\n// src/anonymous-id.ts\nvar ANONYMOUS_ID_STORAGE_KEY = \"fixback.anonymousId\";\nfunction generateAnonymousId() {\n const c = globalThis.crypto;\n if (c && typeof c.randomUUID === \"function\") {\n try {\n return c.randomUUID();\n } catch {\n }\n }\n return `fb-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;\n}\n\n// src/release.ts\nvar RELEASE_MAX_LENGTH = 100;\nvar RESERVED_RELEASES = /* @__PURE__ */ new Set([\".\", \"..\", \"latest\"]);\nfunction normaliseRelease(value) {\n const trimmed = value.trim();\n if (trimmed.length === 0 || trimmed.length > RELEASE_MAX_LENGTH) return void 0;\n if (RESERVED_RELEASES.has(trimmed)) return void 0;\n if (/[\\s/\\\\\\u0000-\\u001f\\u007f]/.test(trimmed)) return void 0;\n return trimmed;\n}\n\n// src/options.ts\nvar DEFAULT_API_URL = \"https://api.fixback.dev\";\n\n// src/trace/console-args.ts\nvar MAX_MESSAGE_LENGTH = 300;\nvar MAX_ARG_DEPTH = 4;\nvar MAX_ARG_ITEMS = 100;\nvar MAX_ARG_STRING_LENGTH = 1024;\nvar MAX_CONSOLE_ARGS_BYTES = 4096;\nvar MAX_ERROR_STACK_LENGTH = 2048;\nfunction capLength(value, max) {\n return value.length > max ? `${value.slice(0, max)}\\u2026` : value;\n}\nfunction stringifyArg(arg) {\n if (typeof arg === \"string\") return arg;\n if (arg instanceof Error) return `${arg.name}: ${arg.message}`;\n if (arg === null || arg === void 0) return String(arg);\n if (typeof arg === \"number\" || typeof arg === \"boolean\") return String(arg);\n try {\n return JSON.stringify(arg) ?? String(arg);\n } catch {\n return \"[object]\";\n }\n}\nfunction joinArgs(args) {\n const text = args.map(stringifyArg).join(\" \");\n return text.length > MAX_MESSAGE_LENGTH ? `${text.slice(0, MAX_MESSAGE_LENGTH)}\\u2026` : text;\n}\nfunction describeErrorValue(error) {\n const out = {\n name: error.name || \"Error\",\n message: capLength(String(error.message ?? \"\"), MAX_ARG_STRING_LENGTH)\n };\n if (typeof error.stack === \"string\" && error.stack.length > 0) {\n out.stack = capLength(error.stack, MAX_ERROR_STACK_LENGTH);\n }\n return out;\n}\nfunction safeCloneValue(value, depth, seen) {\n if (value === null) return null;\n const type = typeof value;\n if (type === \"string\") return capLength(value, MAX_ARG_STRING_LENGTH);\n if (type === \"number\") return Number.isFinite(value) ? value : String(value);\n if (type === \"boolean\") return value;\n if (type === \"bigint\") return `${value.toString()}n`;\n if (type === \"symbol\") return value.toString();\n if (type === \"function\") return \"[Function]\";\n if (type === \"undefined\") return null;\n const obj = value;\n if (value instanceof Error) {\n const { name, message } = describeErrorValue(value);\n return { name, message };\n }\n if (seen.has(obj)) return \"[Circular]\";\n if (depth <= 0) return Array.isArray(value) ? \"[Array]\" : \"[Object]\";\n seen.add(obj);\n try {\n if (Array.isArray(value)) {\n const items = value.slice(0, MAX_ARG_ITEMS).map((item) => safeCloneValue(item, depth - 1, seen));\n if (value.length > MAX_ARG_ITEMS) {\n items.push(`\\u2026 ${value.length - MAX_ARG_ITEMS} more`);\n }\n return items;\n }\n const source = value;\n const keys = Object.keys(source);\n const out = {};\n for (const key of keys.slice(0, MAX_ARG_ITEMS)) {\n const child = source[key];\n if (typeof child === \"undefined\" || typeof child === \"function\") continue;\n out[key] = safeCloneValue(child, depth - 1, seen);\n }\n if (keys.length > MAX_ARG_ITEMS) out[\"\\u2026\"] = `${keys.length - MAX_ARG_ITEMS} more`;\n return out;\n } finally {\n seen.delete(obj);\n }\n}\nfunction toConsoleArg(value) {\n if (value === null || value === void 0) return { t: \"null\", v: null };\n const type = typeof value;\n if (type === \"string\") {\n return { t: \"string\", v: capLength(value, MAX_ARG_STRING_LENGTH) };\n }\n if (type === \"number\") {\n return Number.isFinite(value) ? { t: \"number\", v: value } : { t: \"string\", v: String(value) };\n }\n if (type === \"boolean\") return { t: \"bool\", v: value };\n if (type === \"bigint\") return { t: \"string\", v: `${value.toString()}n` };\n if (type === \"symbol\") return { t: \"string\", v: value.toString() };\n if (type === \"function\") return { t: \"string\", v: \"[Function]\" };\n if (value instanceof Error) return { t: \"error\", v: describeErrorValue(value) };\n return { t: \"json\", v: safeCloneValue(value, MAX_ARG_DEPTH, /* @__PURE__ */ new Set()) };\n}\nfunction capConsoleArgs(args) {\n if (serializedBytes(args) <= MAX_CONSOLE_ARGS_BYTES) return args;\n let out = args.slice();\n while (out.length > 1 && serializedBytes(out) > MAX_CONSOLE_ARGS_BYTES) {\n out = out.slice(0, -1);\n }\n if (out.length === 1 && serializedBytes(out) > MAX_CONSOLE_ARGS_BYTES) {\n return [{ t: \"string\", v: \"[trace: console argument omitted (too large)]\" }];\n }\n return out;\n}\n\n// src/trace/crumbs.ts\nvar MAX_URL_LENGTH = 2048;\nfunction consoleCrumb(level, args, timestamp, source) {\n const structured = capConsoleArgs(args.map(toConsoleArg));\n return {\n category: \"console\",\n level,\n message: joinArgs(args),\n timestamp,\n ...structured.length > 0 ? { args: structured } : {},\n ...source ? { source } : {}\n };\n}\nfunction navigationCrumb(from, to, timestamp) {\n const fromUrl = capLength(scrubUrl(from), MAX_URL_LENGTH);\n const toUrl = capLength(scrubUrl(to), MAX_URL_LENGTH);\n return {\n category: \"navigation\",\n message: `${fromUrl} \\u2192 ${toUrl}`,\n timestamp,\n data: { from: fromUrl, to: toUrl }\n };\n}\nfunction outcomeFromStatus(status) {\n if (typeof status !== \"number\" || status <= 0) return \"network-error\";\n if (status >= 500) return \"http-5xx\";\n if (status >= 400) return \"http-4xx\";\n return \"ok\";\n}\nfunction parseContentLength(value) {\n if (typeof value !== \"string\") return void 0;\n const bytes = Number.parseInt(value, 10);\n return Number.isFinite(bytes) && bytes >= 0 ? bytes : void 0;\n}\nfunction contentTypeOf(value) {\n if (typeof value !== \"string\" || value.length === 0) return void 0;\n const media = value.split(\";\")[0]?.trim();\n return media && media.length > 0 ? media : void 0;\n}\nfunction networkCrumb(input, timestamp) {\n const url = capLength(scrubUrl(input.url), MAX_URL_LENGTH);\n const hasStatus = typeof input.status === \"number\" && input.status > 0;\n const statusPart = hasStatus ? ` \\u2192 ${input.status}` : \"\";\n const outcomePart = input.outcome !== \"ok\" ? ` (${input.outcome})` : \"\";\n return {\n category: input.api,\n api: input.api,\n method: input.method,\n url,\n message: `${input.method} ${url}${statusPart}${outcomePart}`,\n timestamp,\n ...hasStatus ? { status: input.status } : {},\n ...input.statusText ? { statusText: input.statusText } : {},\n ...typeof input.durationMs === \"number\" ? { durationMs: input.durationMs } : {},\n ...typeof input.reqSize === \"number\" ? { reqSize: input.reqSize } : {},\n ...typeof input.respSize === \"number\" ? { respSize: input.respSize } : {},\n ...input.contentType ? { contentType: input.contentType } : {},\n outcome: input.outcome\n };\n}\nfunction fetchCrumb(method, url, status, timestamp) {\n return networkCrumb(\n { api: \"fetch\", method, url, status, outcome: outcomeFromStatus(status) },\n timestamp\n );\n}\nfunction xhrCrumb(method, url, status, timestamp) {\n return networkCrumb(\n { api: \"xhr\", method, url, status, outcome: outcomeFromStatus(status) },\n timestamp\n );\n}\nfunction describeError(error) {\n if (error instanceof Error) {\n return { name: error.name || \"Error\", message: error.message };\n }\n if (typeof error === \"string\") return { name: \"Error\", message: error };\n return { name: \"Error\", message: stringifyArg(error) };\n}\nfunction errorCrumb(error, timestamp, causedBy) {\n const { name, message } = describeError(error);\n const crumb = {\n category: \"error\",\n level: \"error\",\n message: message ? `${name}: ${message}` : name,\n timestamp,\n data: { errorType: name }\n };\n return causedBy && causedBy.length > 0 ? { ...crumb, causedBy } : crumb;\n}\n\n// src/auto-capture.ts\nvar DEFAULT_BURST_CAPACITY = 5;\nvar DEFAULT_BURST_REFILL_MS = 2e3;\nvar DEFAULT_MAX_DISTINCT_AUTO = 20;\nvar CAUSED_BY_LIMIT = 5;\nfunction asString(value) {\n if (typeof value === \"string\") return value;\n if (value == null) return \"\";\n try {\n return String(value);\n } catch {\n return \"\";\n }\n}\nfunction precedingIds(entries) {\n if (!entries || entries.length === 0) return [];\n const ids = [];\n for (let i = entries.length - 1; i >= 0 && ids.length < CAUSED_BY_LIMIT; i -= 1) {\n const id = entries[i]?.id;\n if (typeof id === \"string\" && id.length > 0) ids.unshift(id);\n }\n return ids;\n}\nvar TokenBucket = class {\n constructor(options) {\n this.options = options;\n __publicField(this, \"tokens\");\n __publicField(this, \"last\");\n __publicField(this, \"now\");\n this.now = options.now ?? Date.now;\n this.tokens = Math.max(0, options.capacity);\n this.last = this.now();\n }\n /** Consume a token if one is available (refilling first), else refuse. */\n take() {\n const now = this.now();\n const { capacity, refillIntervalMs } = this.options;\n if (refillIntervalMs > 0 && now > this.last) {\n const refill = Math.floor((now - this.last) / refillIntervalMs);\n if (refill > 0) {\n this.tokens = Math.min(capacity, this.tokens + refill);\n this.last += refill * refillIntervalMs;\n }\n }\n if (this.tokens >= 1) {\n this.tokens -= 1;\n return true;\n }\n return false;\n }\n};\nfunction createAutoCapture(config) {\n const now = config.now ?? Date.now;\n const maxDistinct = config.maxDistinct ?? DEFAULT_MAX_DISTINCT_AUTO;\n const bucket = new TokenBucket({\n capacity: config.burstCapacity ?? DEFAULT_BURST_CAPACITY,\n refillIntervalMs: config.burstRefillMs ?? DEFAULT_BURST_REFILL_MS,\n now\n });\n const seen = /* @__PURE__ */ new Map();\n let dropped = 0;\n async function file(fingerprint, occurrences, rich) {\n const entry = seen.get(fingerprint);\n if (!entry) return;\n const previouslySent = entry.sentCount;\n entry.sentCount = occurrences;\n try {\n const accepted = await config.submit({\n fingerprint,\n occurrences,\n rich,\n frames: entry.frames\n });\n if (!accepted && entry.sentCount === occurrences) {\n entry.sentCount = previouslySent;\n }\n } catch {\n if (entry.sentCount === occurrences) entry.sentCount = previouslySent;\n }\n }\n function handle(extracted) {\n const fingerprint = computeFingerprint(\n extracted.type,\n extracted.value,\n extracted.stack\n );\n const existing = seen.get(fingerprint);\n if (existing) {\n existing.count += 1;\n existing.lastAt = now();\n return;\n }\n if (!bucket.take()) {\n dropped += 1;\n return;\n }\n if (seen.size >= maxDistinct) {\n dropped += 1;\n return;\n }\n const at = now();\n seen.set(fingerprint, {\n count: 1,\n firstAt: at,\n lastAt: at,\n sentCount: 0,\n // Parsed once per fingerprint, from the first firing's stack (#117) — the\n // wire shape symbolication consumes, scrubbed like every captured URL.\n frames: extractStructuredFrames(extracted.stack)\n });\n try {\n const causedBy = precedingIds(config.buffer?.snapshot());\n config.buffer?.add(errorCrumb(extracted.original, at, causedBy));\n } catch {\n }\n void file(fingerprint, 1, true);\n }\n return {\n capture(raw) {\n try {\n const extracted = config.extract(raw);\n if (extracted) handle(extracted);\n } catch {\n }\n },\n flush() {\n try {\n for (const [fingerprint, entry] of seen) {\n if (entry.count > entry.sentCount) {\n void file(fingerprint, entry.count, false);\n }\n }\n } catch {\n }\n },\n droppedCount: () => dropped\n };\n}\n\n// src/trace/buffer.ts\nvar DEFAULT_STREAM_BUDGETS = {\n network: 100,\n console: 80,\n breadcrumbs: 40\n};\nvar DEFAULT_MAX_AGE_MS = 3 * 60 * 1e3;\nvar DEFAULT_CONSOLE_LEVELS = [\n \"log\",\n \"info\",\n \"warn\",\n \"error\",\n \"assert\",\n \"debug\"\n];\nvar PINNED_CONSOLE_LEVELS = [\n \"warn\",\n \"error\",\n \"assert\"\n];\nfunction isPinnedConsoleLevel(level) {\n return level !== void 0 && PINNED_CONSOLE_LEVELS.includes(level);\n}\nvar SOURCE_CAPTURE_LEVELS = PINNED_CONSOLE_LEVELS;\nfunction capturesSource(level) {\n return SOURCE_CAPTURE_LEVELS.includes(level);\n}\nfunction streamOf(category) {\n if (category === \"console\") return \"console\";\n if (category === \"fetch\" || category === \"xhr\" || category === \"beacon\") {\n return \"network\";\n }\n return \"breadcrumbs\";\n}\nfunction normalizeBudget(value, fallback) {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 1) {\n return fallback;\n }\n return Math.floor(value);\n}\nfunction createIdFactory() {\n const salt = Math.random().toString(36).slice(2, 8);\n let seq = 0;\n return () => `${salt}${(seq++).toString(36)}`;\n}\nvar STREAMS = [\"network\", \"console\", \"breadcrumbs\"];\nfunction trimConsoleStream(held, budget) {\n const over = held.length - budget;\n if (over <= 0) return held;\n const drop = /* @__PURE__ */ new Set();\n for (let i = 0; i < held.length && drop.size < over; i += 1) {\n if (!isPinnedConsoleLevel(held[i].crumb.level)) drop.add(i);\n }\n for (let i = 0; i < held.length && drop.size < over; i += 1) {\n if (!drop.has(i)) drop.add(i);\n }\n return held.filter((_, i) => !drop.has(i));\n}\nfunction createBreadcrumbBuffer(config = {}) {\n const budgets = {\n network: normalizeBudget(config.budgets?.network, DEFAULT_STREAM_BUDGETS.network),\n console: normalizeBudget(config.budgets?.console, DEFAULT_STREAM_BUDGETS.console),\n breadcrumbs: normalizeBudget(\n config.budgets?.breadcrumbs,\n DEFAULT_STREAM_BUDGETS.breadcrumbs\n )\n };\n const maxAgeMs = config.maxAgeMs === void 0 ? DEFAULT_MAX_AGE_MS : config.maxAgeMs;\n const beforeBreadcrumb = config.beforeBreadcrumb;\n const now = config.now ?? Date.now;\n const mono = config.mono ?? nowMono;\n const nextId = config.nextId ?? createIdFactory();\n const streams = {\n network: [],\n console: [],\n breadcrumbs: []\n };\n let seq = 0;\n function pruneByAge() {\n if (typeof maxAgeMs !== \"number\" || maxAgeMs <= 0) return;\n const cutoff = now() - maxAgeMs;\n for (const stream of STREAMS) {\n const held = streams[stream];\n if (held.length > 0) {\n streams[stream] = held.filter((h) => h.crumb.timestamp >= cutoff);\n }\n }\n }\n return {\n add(crumb) {\n let entry = crumb;\n if (beforeBreadcrumb) {\n try {\n entry = beforeBreadcrumb(crumb);\n } catch {\n entry = crumb;\n }\n }\n if (!entry) return;\n const stamped = {\n ...entry,\n id: entry.id ?? nextId(),\n timestamp: typeof entry.timestamp === \"number\" ? entry.timestamp : now(),\n mono: typeof entry.mono === \"number\" ? entry.mono : mono()\n };\n const stream = streamOf(stamped.category);\n streams[stream].push({ crumb: stamped, seq: seq++ });\n pruneByAge();\n const held = streams[stream];\n const budget = budgets[stream];\n if (held.length > budget) {\n streams[stream] = stream === \"console\" ? trimConsoleStream(held, budget) : held.slice(-budget);\n }\n },\n snapshot() {\n pruneByAge();\n const merged = [];\n for (const stream of STREAMS) merged.push(...streams[stream]);\n merged.sort((a, b) => {\n const am = typeof a.crumb.mono === \"number\" ? a.crumb.mono : a.crumb.timestamp;\n const bm = typeof b.crumb.mono === \"number\" ? b.crumb.mono : b.crumb.timestamp;\n return am - bm || a.seq - b.seq;\n });\n return merged.map((h) => h.crumb);\n },\n clear() {\n streams.network = [];\n streams.console = [];\n streams.breadcrumbs = [];\n seq = 0;\n }\n };\n}\n\n// src/trace/source.ts\nfunction parseStackFrame(line) {\n const tokens = parseStackLine(line);\n if (!tokens || !tokens.location) return void 0;\n const loc = tokens.location.replace(/\\?[^:]*/, \"\");\n const m = loc.match(/^(.*):(\\d+):\\d+$/) ?? loc.match(/^(.*):(\\d+)$/);\n if (!m) return void 0;\n const file = m[1] ?? \"\";\n const lineNo = Number(m[2]);\n if (!file || !Number.isFinite(lineNo)) return void 0;\n return { file, line: lineNo };\n}\nfunction sourceFromStack(stack, skipFrames = 0) {\n if (typeof stack !== \"string\" || stack.length === 0) return void 0;\n const frames = [];\n for (const raw of stack.split(\"\\n\")) {\n const frame = parseStackFrame(raw.trim());\n if (frame) frames.push(frame);\n }\n return frames[skipFrames];\n}\nvar CONSOLE_SOURCE_SKIP_FRAMES = 1;\n\n// src/trace/console.ts\nfunction instrumentConsole(buffer, consoleObj, levels, now) {\n const restores = [];\n for (const level of levels) {\n const original = consoleObj[level];\n if (typeof original !== \"function\") continue;\n const withSource = capturesSource(level);\n const wrapper = (...args) => {\n let source;\n if (withSource) {\n try {\n source = sourceFromStack(new Error().stack, CONSOLE_SOURCE_SKIP_FRAMES);\n } catch {\n source = void 0;\n }\n }\n try {\n if (level === \"assert\") {\n if (!args[0]) {\n buffer.add(consoleCrumb(\"assert\", args.slice(1), now(), source));\n }\n } else {\n buffer.add(consoleCrumb(level, args, now(), source));\n }\n } catch {\n }\n return original.apply(consoleObj, args);\n };\n consoleObj[level] = wrapper;\n restores.push(() => {\n consoleObj[level] = original;\n });\n }\n return () => {\n for (const restore of restores) restore();\n };\n}\nexport {\n ANONYMOUS_ID_STORAGE_KEY,\n AutoReportBackoff,\n CAUSED_BY_LIMIT,\n CONNECT_MESSAGE_SOURCE,\n CONNECT_RETURN_PARAM,\n CONSOLE_SOURCE_SKIP_FRAMES,\n DEFAULT_API_URL,\n DEFAULT_BURST_CAPACITY,\n DEFAULT_BURST_REFILL_MS,\n DEFAULT_CONSOLE_LEVELS,\n DEFAULT_MAX_AGE_MS,\n DEFAULT_MAX_DISTINCT_AUTO,\n DEFAULT_RETRY_AFTER_SECONDS,\n DEFAULT_STREAM_BUDGETS,\n MAX_ARG_DEPTH,\n MAX_ARG_ITEMS,\n MAX_ARG_STRING_LENGTH,\n MAX_CONSOLE_ARGS_BYTES,\n MAX_MESSAGE_LENGTH,\n MAX_URL_LENGTH,\n PINNED_CONSOLE_LEVELS,\n RELEASE_MAX_LENGTH,\n SDK_CORE_VERSION,\n SOURCE_CAPTURE_LEVELS,\n TokenBucket,\n applyDefaultScrub,\n asString,\n bootEndpoint,\n buildConnectUrl,\n capConsoleArgs,\n capLength,\n capturesSource,\n compactIdentity,\n computeFingerprint,\n connectExchangeEndpoint,\n connectSignOutEndpoint,\n consoleCrumb,\n contentTypeOf,\n createAutoCapture,\n createBreadcrumbBuffer,\n createIdFactory,\n describeError,\n describeErrorValue,\n errorCrumb,\n exchangeConnectCode,\n extractStructuredFrames,\n extractTopFrames,\n feedbackEndpoint,\n fetchCrumb,\n generateAnonymousId,\n hashString,\n instrumentConsole,\n isBootAnswer,\n isConnectExchangeResponse,\n isFixbackApiRequest,\n isPinnedConsoleLevel,\n joinArgs,\n navigationCrumb,\n networkCrumb,\n normaliseRelease,\n normalize,\n normalizeBudget,\n nowMono,\n outcomeFromStatus,\n parseConnectMessage,\n parseContentLength,\n parseFrameLocation,\n parseRetryAfter,\n parseStackFrame,\n parseStackLine,\n precedingIds,\n redactPii,\n reporterSessionStorageKey,\n requestBoot,\n resolveFetch,\n revokeReporterSession,\n runBeforeSend,\n safeCloneValue,\n safeHeader,\n scrubUrl,\n serializedBytes,\n sourceFromStack,\n streamOf,\n stringifyArg,\n toConsoleArg,\n trimConsoleStream,\n trivialBodySize,\n utf8ByteLength,\n xhrCrumb\n};\n//# sourceMappingURL=index.mjs.map\n","/**\n * The browser **Connect** flow (ADR-0032) — the DOM half of the round trip whose pure\n * pieces (URL building, message parsing, the code exchange) live in `@fixback/sdk-core`.\n *\n * Connect opens the platform's connect page in a **popup**; the page signs the person in\n * and posts back a one-time code, which the SDK exchanges for a Reporter session. When a\n * popup is blocked the SDK falls back to a **full-page redirect** to the same URL; the\n * connect page then returns to the site with the code on the `?fixback=` query\n * parameter, which the SDK reads on the next load ({@link readReturnCode}) and exchanges.\n * A Fixback-issued link (e.g. an Invite claim, ticket #250) carries the same parameter,\n * so arriving on it starts a Connect with no popup at all.\n */\n\nimport {\n buildConnectUrl,\n CONNECT_RETURN_PARAM,\n parseConnectMessage,\n} from \"@fixback/sdk-core\";\n\n/** How long to wait for the popup to post its code before giving up (ms). */\nconst CONNECT_TIMEOUT_MS = 5 * 60 * 1000;\n\n/** Open a URL in a popup window, or `null` when the browser blocked or refused it. */\nfunction safeOpen(win: Window, url: string): Window | null {\n try {\n return win.open(\n url,\n \"fixback-connect\",\n \"popup,width=480,height=680,menubar=no,toolbar=no,location=yes\",\n );\n } catch {\n return null;\n }\n}\n\n/**\n * The outcome of starting Connect: `code` when a popup handed one back, `redirected`\n * when a blocked popup sent the page to a full redirect (the page is navigating away and\n * the code will arrive via {@link readReturnCode} on reload), or `cancelled` when the\n * person closed the popup without signing in.\n */\nexport type ConnectStart =\n | { readonly kind: \"code\"; readonly code: string }\n | { readonly kind: \"redirected\" }\n | { readonly kind: \"cancelled\" };\n\n/**\n * Start Connect: open the connect page in a popup and resolve to the one-time code it\n * posts back, or fall back to a full-page redirect when the popup is blocked. `returnUrl`\n * is where the person is sent back — validated server-side against the Project's allowed\n * origins, so a hostile page cannot redirect the code elsewhere.\n */\nexport function startConnect(\n win: Window,\n params: { connectUrl: string; key: string; returnUrl: string },\n): Promise<ConnectStart> {\n const url = buildConnectUrl(params.connectUrl, {\n key: params.key,\n returnUrl: params.returnUrl,\n });\n const popup = safeOpen(win, url);\n if (!popup) {\n // Popup blocked — full-page redirect; the code returns on the `?fixback=` param.\n try {\n win.location.assign(url);\n } catch {\n /* navigation is best-effort — never throw into the host page */\n }\n return Promise.resolve({ kind: \"redirected\" });\n }\n\n return new Promise<ConnectStart>((resolve) => {\n let settled = false;\n const finish = (outcome: ConnectStart): void => {\n if (settled) return;\n settled = true;\n win.removeEventListener(\"message\", onMessage);\n clearInterval(poll);\n clearTimeout(timer);\n resolve(outcome);\n };\n const onMessage = (event: MessageEvent): void => {\n const code = parseConnectMessage(event.data);\n if (!code) return;\n try {\n popup.close();\n } catch {\n /* closing the popup is best-effort */\n }\n finish({ kind: \"code\", code });\n };\n win.addEventListener(\"message\", onMessage);\n // The person closed the popup without connecting → cancelled.\n const poll = setInterval(() => {\n try {\n if (popup.closed) finish({ kind: \"cancelled\" });\n } catch {\n /* cross-origin access to `closed` can throw mid-flow — ignore */\n }\n }, 400);\n const timer = setTimeout(() => finish({ kind: \"cancelled\" }), CONNECT_TIMEOUT_MS);\n });\n}\n\n/**\n * Read a Connect return code off the current URL's `?fixback=` parameter, or `null`.\n * The connect page's redirect fallback and Fixback-issued links carry it.\n */\nexport function readReturnCode(win: Window): string | null {\n try {\n const url = new URL(win.location.href);\n const code = url.searchParams.get(CONNECT_RETURN_PARAM);\n return code && code.length > 0 ? code : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Strip the `?fixback=` parameter from the current URL without a reload, so the\n * one-time code is not left in the address bar, history, or a shared link.\n */\nexport function stripReturnCode(win: Window): void {\n try {\n const url = new URL(win.location.href);\n if (!url.searchParams.has(CONNECT_RETURN_PARAM)) return;\n url.searchParams.delete(CONNECT_RETURN_PARAM);\n win.history.replaceState(win.history.state, \"\", url.toString());\n } catch {\n /* history rewrite is best-effort — a leftover param is harmless (single-use code) */\n }\n}\n","/**\n * The Public Reporter's anonymous id in the browser — the **storage binding** only.\n *\n * The key and the id generator are shared with every other SDK\n * (`@fixback/sdk-core`, ADR-0028), so a Fixback anonymous id looks the same across\n * clients. What differs, and so lives here, is persistence: `localStorage` is\n * synchronous, where React Native's AsyncStorage is not.\n *\n * When the host site does not supply its own identity, the SDK establishes a\n * per-browser id and persists it, so repeated boots from the same browser are one\n * Reporter (the server counts distinct Reporters by it). Persistence is\n * best-effort: if storage is unavailable (private mode, blocked cookies), we fall\n * back to an ephemeral id rather than throw — the SDK must never disturb the host\n * page.\n */\n\nimport { ANONYMOUS_ID_STORAGE_KEY, generateAnonymousId } from \"@fixback/sdk-core\";\n\n/** Return this browser's anonymous id, creating and persisting one on first use. */\nexport function ensureAnonymousId(): string {\n try {\n const store = globalThis.localStorage;\n const existing = store.getItem(ANONYMOUS_ID_STORAGE_KEY);\n if (existing) return existing;\n const id = generateAnonymousId();\n store.setItem(ANONYMOUS_ID_STORAGE_KEY, id);\n return id;\n } catch {\n // Storage blocked or absent — an ephemeral id keeps this boot working.\n return generateAnonymousId();\n }\n}\n","/**\n * Distilling the browser's **two error events** into the shape the shared capture\n * state machine keys on.\n *\n * These are the only genuinely DOM-shaped part of automatic error capture: an\n * `ErrorEvent` and an `unhandledrejection` `PromiseRejectionEvent` carry the\n * throwable in different places and deserve different default type names. Everything\n * after — fingerprinting, dedup, the burst limiter, the session cap — is\n * `@fixback/sdk-core`'s (ADR-0028) and shared with the React Native SDK.\n *\n * Both are defensive by construction: a value with no usable message returns `null`\n * rather than filing a Feedback about nothing, which is exactly how a resource-load\n * `error` event (an `<img>`/`<script>` that 404s — never an uncaught exception) is\n * kept out.\n */\n\nimport { asString, type ExtractedError } from \"@fixback/sdk-core\";\n\ninterface ErrorLike {\n name?: unknown;\n message?: unknown;\n stack?: unknown;\n}\n\n/**\n * Distil an uncaught `error` event into a fingerprint-able shape, or `null` when\n * the event names no error at all (a resource-load failure).\n */\nexport function extractFromErrorEvent(event: Event): ExtractedError | null {\n const e = event as ErrorEvent & { error?: unknown };\n const error = e.error;\n if (error && typeof error === \"object\") {\n const err = error as ErrorLike;\n return {\n type: asString(err.name) || \"Error\",\n value: asString(err.message) || asString(e.message),\n stack: typeof err.stack === \"string\" ? err.stack : undefined,\n original: error,\n };\n }\n // No Error object: a message-only event (some browsers) is still capturable.\n const message = asString(e.message);\n if (message) return { type: \"Error\", value: message, original: message };\n // A resource-load error (img/script) has neither — never an uncaught exception.\n return null;\n}\n\n/**\n * Distil an `unhandledrejection` event into a fingerprint-able shape. A rejection\n * with a non-Error reason still files — `Promise.reject(\"nope\")` is a real bug —\n * so unlike {@link extractFromErrorEvent} this never returns `null`.\n */\nexport function extractFromRejectionEvent(event: Event): ExtractedError {\n const reason = (event as Event & { reason?: unknown }).reason;\n if (reason && typeof reason === \"object\") {\n const err = reason as ErrorLike;\n return {\n type: asString(err.name) || \"UnhandledRejection\",\n value: asString(err.message) || asString(reason),\n stack: typeof err.stack === \"string\" ? err.stack : undefined,\n original: reason,\n };\n }\n const value = asString(reason);\n return { type: \"UnhandledRejection\", value, original: reason ?? value };\n}\n\n/**\n * Distil whichever of the two global error events fired. The browser registers one\n * listener per type, so the event's `type` is an exact discriminator — and the\n * single `extract` the shared state machine is parameterised over.\n */\nexport function extractFromGlobalEvent(event: Event): ExtractedError | null {\n return event.type === \"unhandledrejection\"\n ? extractFromRejectionEvent(event)\n : extractFromErrorEvent(event);\n}\n","/**\n * The Annotation & vector-marks geometry (spec 0003 §B/§D).\n *\n * The Annotation **wire types** (`Annotation`, `Mark` and friends, `Point`,\n * `Rect`, `SelectedElement`) live in `@fixback/sdk-core` (ADR-0028) so every\n * surface shares one shape; this module re-exports them and holds the browser's\n * pure geometry and Send-assembly used by the region-capture and draw controllers\n * and the overlay. Marks live in the **screenshot's coordinate space** (the full\n * viewport the screenshot is rasterised at), never baked into the PNG: the\n * dashboard composites them at view time (#91).\n */\n\nimport {\n type Annotation,\n type ArrowMark,\n type BoxMark,\n type DrawTool,\n type Mark,\n type PenMark,\n type Point,\n type Rect,\n type SelectedElement,\n type TextMark,\n} from \"@fixback/sdk-core\";\n\n// Re-export the shared wire types so `./annotation` stays the SDK's import path\n// for them — the shapes are owned by the core.\nexport type {\n Annotation,\n ArrowMark,\n BoxMark,\n DrawTool,\n Mark,\n PenMark,\n Point,\n Rect,\n TextMark,\n};\n\n/**\n * The default mark colour — Signal's danger red, matching the frozen Reporter\n * prototype's draw layer (`docs/design/Fixback Reporter.dc.html`).\n */\nexport const MARK_COLOR = \"#e5484d\";\n\n/**\n * Normalise a drag from a start to an end point into a positive-extent rect\n * (top-left origin, non-negative width/height), rounded to whole pixels — the\n * screenshot is a pixel raster, so sub-pixel extents carry no meaning. Shared by\n * region-capture and the box mark.\n */\nexport function normalizeRect(x0: number, y0: number, x1: number, y1: number): Rect {\n return {\n x: Math.round(Math.min(x0, x1)),\n y: Math.round(Math.min(y0, y1)),\n width: Math.round(Math.abs(x1 - x0)),\n height: Math.round(Math.abs(y1 - y0)),\n };\n}\n\n/**\n * The three points of an arrow's head, given its line `(x0,y0)→(x1,y1)` and a head\n * length: the tip, then the two barbs splayed ±30° behind it. Pure geometry the\n * draw surface renders as a filled triangle at the arrow's tip.\n */\nexport function arrowHeadPoints(\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n size = 14,\n): [Point, Point, Point] {\n const angle = Math.atan2(y1 - y0, x1 - x0);\n return [\n { x: x1, y: y1 },\n {\n x: x1 - size * Math.cos(angle - Math.PI / 6),\n y: y1 - size * Math.sin(angle - Math.PI / 6),\n },\n {\n x: x1 - size * Math.cos(angle + Math.PI / 6),\n y: y1 - size * Math.sin(angle + Math.PI / 6),\n },\n ];\n}\n\n/**\n * Assemble the structured Annotation from whatever a Reporter marked, dropping\n * empty layers: no element, no region, and an empty marks list are omitted, so the\n * result is `undefined` when nothing was marked. Marks are copied into a plain,\n * independent array so the annotation is a serialisable snapshot decoupled from the\n * live draw state.\n */\nexport function assembleAnnotation(parts: {\n readonly element?: SelectedElement | null;\n readonly region?: Rect | null;\n readonly marks?: ReadonlyArray<Mark> | null;\n}): Annotation | undefined {\n const annotation: {\n element?: SelectedElement;\n region?: Rect;\n marks?: ReadonlyArray<Mark>;\n } = {};\n if (parts.element) annotation.element = parts.element;\n if (parts.region) annotation.region = parts.region;\n if (parts.marks && parts.marks.length > 0) annotation.marks = parts.marks.slice();\n return Object.keys(annotation).length > 0 ? annotation : undefined;\n}\n","/**\n * Assembling the ingest **feedback** content from what a Reporter composed in the\n * overlay, plus the browser-side environment capture and Release validation.\n *\n * The shared wire shapes it produces — `ReportContent`, `CaptureEnvironment`,\n * `CapturedFrame`, `SelectedElement`, `ElementRect`, `FeedbackSource` — live in\n * `@fixback/sdk-core` (ADR-0028), so the browser and backend SDKs speak the same\n * shape; this module re-exports them for the SDK's public surface and holds only\n * the browser-specific assembly (`assembleContent`, `collectEnvironment`) and the\n * `release` validation. Keep the shapes in lock-step with the server: the JSON\n * `payload` accepted by `POST /api/ingest/feedback`\n * (`apps/api/src/ingest/ingest.controller.ts`).\n */\n\nimport {\n type Breadcrumb,\n type CaptureEnvironment,\n type CapturedFrame,\n type ElementRect,\n type FeedbackSource,\n normaliseRelease,\n type ReportContent,\n type SelectedElement,\n} from \"@fixback/sdk-core\";\n\nimport { assembleAnnotation, type Annotation, type Mark, type Rect } from \"./annotation\";\n\n// Re-export the shared wire shapes so the SDK's public surface (index.ts) and its\n// internal modules keep one import path — the shapes are owned by the core.\nexport type {\n CaptureEnvironment,\n CapturedFrame,\n ElementRect,\n FeedbackSource,\n ReportContent,\n SelectedElement,\n};\n\n// Release validation (#117, ADR-0024) is the shared core's — the SDK, the CLI, and\n// the bundler plugins must agree on it exactly, or a stamped release and an\n// uploaded one would not match. Re-exported so `./report` stays the SDK's path.\nexport { normaliseRelease };\n\n/**\n * What the overlay hands to {@link assembleContent} when the Reporter sends. The\n * three marking layers arrive flat (`element` / `region` / `marks`); `assembleContent`\n * folds whatever is present into the structured {@link Annotation}.\n */\nexport interface ReportDraft {\n readonly comment?: string;\n readonly element?: SelectedElement;\n readonly region?: Rect;\n readonly marks?: ReadonlyArray<Mark>;\n readonly url?: string;\n readonly environment?: CaptureEnvironment;\n readonly trace?: readonly Breadcrumb[];\n // The Reporter's self-provided display name / email are gone (ADR-0032): a Reporter is\n // an Account, so name and email come from the signed-in `user`, not from the report.\n /**\n * The deploy **Environment** the SDK was configured with (ADR-0025) —\n * `production` / `staging` / … — distinct from the build `release` in\n * {@link CaptureEnvironment}. Named apart from `environment` (the capture bag)\n * to avoid the collision, exactly as the wire does.\n */\n readonly deployEnvironment?: string;\n}\n\n/**\n * Read the capture environment off a window: the viewport size, the browser's\n * user-agent, and the SDK version. A dimension is recorded only when it is a\n * positive number (a headless/zero viewport records nothing rather than an\n * invalid `0`, which the server would reject).\n */\nexport function collectEnvironment(\n win: Window,\n sdkVersion: string,\n release?: string,\n): CaptureEnvironment {\n const env: {\n viewportWidth?: number;\n viewportHeight?: number;\n browser?: string;\n sdkVersion?: string;\n release?: string;\n } = {};\n\n const width = win.innerWidth;\n if (typeof width === \"number\" && width > 0) env.viewportWidth = Math.round(width);\n const height = win.innerHeight;\n if (typeof height === \"number\" && height > 0) {\n env.viewportHeight = Math.round(height);\n }\n\n const ua = win.navigator?.userAgent;\n if (typeof ua === \"string\" && ua.length > 0) env.browser = ua;\n\n if (sdkVersion.length > 0) env.sdkVersion = sdkVersion;\n\n // The Release, already validated at `init` (#117, ADR-0024).\n if (release && release.length > 0) env.release = release;\n\n return env;\n}\n\n/**\n * Assemble the ingest content from what the Reporter composed. Empty pieces are\n * dropped rather than sent as blanks: a whitespace-only comment, an absent\n * element, or an empty environment are simply omitted, so the payload carries\n * only what was actually provided (mirroring the server's all-optional content).\n */\nexport function assembleContent(draft: ReportDraft): ReportContent {\n const content: {\n comment?: string;\n url?: string;\n environment?: CaptureEnvironment;\n deployEnvironment?: string;\n annotation?: Annotation;\n trace?: readonly Breadcrumb[];\n } = {};\n\n const comment = draft.comment?.trim();\n if (comment) content.comment = comment;\n\n if (draft.url) content.url = draft.url;\n\n if (draft.environment && Object.keys(draft.environment).length > 0) {\n content.environment = draft.environment;\n }\n\n const deployEnvironment = draft.deployEnvironment?.trim();\n if (deployEnvironment) content.deployEnvironment = deployEnvironment;\n\n const annotation = assembleAnnotation({\n element: draft.element,\n region: draft.region,\n marks: draft.marks,\n });\n if (annotation) content.annotation = annotation;\n\n // Only a non-empty trace rides along — an empty buffer is simply omitted.\n if (draft.trace && draft.trace.length > 0) content.trace = draft.trace;\n\n return content;\n}\n","/**\n * The multipart feedback submission — the transport half of the capture loop.\n *\n * `POST /api/ingest/feedback` (spec MVP §C; tickets #50/#53) is a multipart\n * request: a single text part `payload` carrying the JSON (publishable key +\n * identity evidence + content) and an optional binary `replay` part — the buffered\n * rrweb window (ADR-0024), from which the annotated still is reconstructed downstream\n * (ADR-0027), so the browser SDK rasterises and sends no screenshot. The content-type\n * header is deliberately not set, so the runtime writes the `multipart/form-data`\n * boundary itself. Like `requestBoot`, this never throws: an unreachable Fixback or a\n * refusal is a quiet result, so a Fixback problem never breaks the host page.\n *\n * The endpoint, the identity compaction, and the backpressure window are the shared\n * core's (ADR-0028); what lives here is the browser envelope — a `FormData` with a\n * `Blob` replay part.\n *\n * The `payload` carries the full report content — the structured `annotation`\n * (element + region + marks, kept vector), the masked `trace` buffer, and the\n * `source` provenance (spec §D). Automatic reports (`source: error`) additionally\n * honour ingest's `429` + `Retry-After` backpressure: while the hold window is open\n * they are dropped without touching the network. Manual reports are never gated\n * (spec §E/§H).\n */\n\nimport {\n AutoReportBackoff,\n compactIdentity,\n feedbackEndpoint,\n type FeedbackSource,\n type FetchLike,\n type FetchResponseLike,\n type IdentityInputs,\n type ReportContent,\n type ReporterTier,\n resolveFetch,\n safeHeader,\n} from \"@fixback/sdk-core\";\n\n// Re-exported so `./submit` stays the SDK's import path for the endpoint helper.\nexport { feedbackEndpoint };\n\n/**\n * The multipart field the replay window is sent under (mirrors the server). A\n * **file part**, deliberately not a field inside `payload`: rrweb events dwarf\n * the JSON payload, and multipart text fields are size-capped far below what a\n * DOM recording needs (ADR-0024).\n */\nconst REPLAY_FIELD = \"replay\";\n\n/**\n * How long a submission may stay in flight before it is reported as\n * `unreachable`. A hung connection — a captive portal, a proxy that never\n * answers — would otherwise leave a report pending forever, and with it the\n * overlay's \"Sending…\" state. The abandoned request keeps running in the\n * background harmlessly. Matches `@fixback/expo`'s and `@fixback/node`'s window.\n */\nexport const DEFAULT_SUBMIT_TIMEOUT_MS = 30_000;\n\n/** What ingest returns for an accepted submission (vendored server shape). */\nexport interface RecordedFeedback {\n readonly feedbackId: string;\n readonly issueId: string;\n readonly reporterId: string;\n readonly tier: ReporterTier;\n}\n\n/**\n * The buffered replay window to attach, if any — the rrweb events a\n * `ReplaySnapshot` holds (replay.ts). Serialized into its own binary part.\n */\nexport interface SubmitReplay {\n readonly events: readonly unknown[];\n}\n\n/** Everything a single feedback submission carries. */\nexport interface SubmitInput {\n readonly key: string;\n readonly identity?: IdentityInputs;\n readonly content: ReportContent;\n readonly replay?: SubmitReplay | null;\n}\n\n/** The outcome of a submission — never an exception. */\nexport type SubmitResult =\n | { readonly ok: true; readonly feedback: RecordedFeedback | null }\n | {\n readonly ok: false;\n readonly reason: \"unreachable\" | \"refused\";\n readonly status?: number;\n }\n | {\n /**\n * A `source: error` report shed under ingest backpressure (spec §E/§H) — either\n * held locally because the window is still open, or answered `429` by ingest,\n * which opened/extended the window. Carries the seconds left to wait. Manual\n * reports never produce this.\n */\n readonly ok: false;\n readonly reason: \"backpressure\";\n readonly retryAfterSeconds: number;\n };\n\n/**\n * Injectable transport collaborators, defaulted to the real implementations — the\n * same deps-object shape `requestBoot` and `@fixback/expo`'s `submitReport` take.\n */\nexport interface SubmitDeps {\n /** The `fetch` to call. Defaults to the page's global. */\n readonly fetch?: FetchLike;\n /**\n * The shared `source: error` backpressure window. Defaults to the page-wide\n * instance; tests inject their own to isolate the clock.\n */\n readonly backoff?: AutoReportBackoff;\n /** Overall request timeout in ms; `0` disables. Defaults to {@link DEFAULT_SUBMIT_TIMEOUT_MS}. */\n readonly timeoutMs?: number;\n}\n\n/**\n * The shared `source: error` backpressure window for the page. One instance so a\n * `429` from an auto-report holds the auto-reports that follow it.\n */\nconst defaultBackoff = new AutoReportBackoff();\n\n/**\n * Submit a report to ingest. Assembles the `payload` JSON (key + identity +\n * content, with an explicit `source` stamped) and the optional `replay` window\n * into a `FormData`, posts it, and resolves to the recorded Feedback on success\n * or a named failure otherwise.\n *\n * A `source: error` report first consults the shared backpressure window: while it\n * is open the report is dropped without a request (spec §E/§H). Ingest's `429` +\n * `Retry-After` opens/extends that window (default 60 s if the header is absent).\n * Manual reports (`source: reporter`, the default) never consult the window and a\n * non-2xx for them stays a plain refusal. The `deps` seams exist purely so the call\n * is testable.\n */\nexport async function submitReport(\n apiUrl: string,\n input: SubmitInput,\n deps: SubmitDeps = {},\n): Promise<SubmitResult> {\n const source: FeedbackSource = input.content.source ?? \"reporter\";\n const isError = source === \"error\";\n const backoff = deps.backoff ?? defaultBackoff;\n\n // Client-side backpressure: shed auto-reports while the hold window is open,\n // without touching the network. Manual reports are never gated.\n if (isError && backoff.isPaused()) {\n return {\n ok: false,\n reason: \"backpressure\",\n retryAfterSeconds: backoff.retryAfterSeconds(),\n };\n }\n\n const doFetch = deps.fetch ?? resolveFetch();\n if (!doFetch) return { ok: false, reason: \"unreachable\" };\n\n const payload = {\n key: input.key,\n ...compactIdentity(input.identity),\n ...input.content,\n source,\n };\n\n const form = new FormData();\n form.append(\"payload\", JSON.stringify(payload));\n if (input.replay && input.replay.events.length > 0) {\n // Serialization can throw on exotic event content; a report must still ship\n // without its replay rather than not at all.\n try {\n const json = JSON.stringify(input.replay.events);\n form.append(\n REPLAY_FIELD,\n new Blob([json], { type: \"application/json\" }),\n \"replay.json\",\n );\n } catch {\n // Ship the report without replay.\n }\n }\n\n const timeoutMs = deps.timeoutMs ?? DEFAULT_SUBMIT_TIMEOUT_MS;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let response: FetchResponseLike;\n try {\n const request = doFetch(feedbackEndpoint(apiUrl), {\n method: \"POST\",\n body: form,\n });\n response =\n timeoutMs > 0\n ? await Promise.race([\n request,\n new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(\"fixback: submission timed out\")),\n timeoutMs,\n );\n }),\n ])\n : await request;\n } catch {\n return { ok: false, reason: \"unreachable\" };\n } finally {\n if (timer !== undefined) clearTimeout(timer);\n }\n\n if (!response.ok) {\n // A `429` for an auto-report is backpressure, not a refusal: open/extend the\n // hold window from `Retry-After` and report the wait. Manual reports never 429\n // here, so any non-2xx for them stays a plain refusal.\n if (isError && response.status === 429) {\n const retryAfterSeconds = backoff.hold(safeHeader(response, \"Retry-After\"));\n return { ok: false, reason: \"backpressure\", retryAfterSeconds };\n }\n return { ok: false, reason: \"refused\", status: response.status };\n }\n\n try {\n const feedback = (await response.json?.()) as RecordedFeedback;\n return { ok: true, feedback };\n } catch {\n // Accepted, but the body wasn't the expected JSON — still a success.\n return { ok: true, feedback: null };\n }\n}\n","/**\n * The SDK's own version string, reported to ingest as `environment.sdkVersion`\n * (spec MVP §B/§E). Kept as an inlined constant rather than a runtime `package.json`\n * import, so the published bundle stays a single self-contained file.\n *\n * It must equal `package.json`'s `version`. Two things keep it there: the Changesets\n * `version` step syncs it automatically (`scripts/sync-sdk-version.mjs`, wired into\n * `version-packages`), and `version.test.ts` fails the build if the two ever drift —\n * so a stale dogfood version (the SDK reporting an old number on our own dashboard)\n * can't slip through. Do not hand-edit this line to a value other than\n * `package.json`'s version.\n */\nexport const SDK_VERSION = \"0.6.0\";\n","/**\n * Automatic error capture — the SDK's signature capability: **errors report\n * themselves, no prompt** (spec 0003 §E, ADR-0011; research\n * `sentry-error-capture-findings.md` §7.1–7.3, §7.6).\n *\n * Exactly **two capture-phase listeners** (`window` `error` +\n * `unhandledrejection`) turn uncaught exceptions and unhandled rejections into\n * `source: error` Feedback (stamped `Kind = bug` server-side, ADR-0023) for the\n * current session's Reporter — no native-API monkeypatching, no library.\n * `console.error` is **not** promoted; it stays breadcrumb-only Evidence.\n *\n * This module is the **browser binding** over the shared state machine\n * (`createAutoCapture`, `@fixback/sdk-core`, ADR-0028): it supplies the two\n * listeners, the DOM event distillation (`./capture/extract-dom`), the browser\n * report assembly, and the flush hooks (`pagehide` + `visibilitychange`).\n * Everything between — the per-session fingerprint dedup, the token-bucket burst\n * limiter, the session cap, the causal error crumb, and the `sentCount` rollback —\n * is the core's, identical to the React Native SDK's.\n *\n * Per-firing order (research §7.1): **`canSubmit`/Gate → dedup → rate-limit/cap →\n * `beforeSend` scrub → enqueue Feedback**. The Gate is honoured by construction:\n * `init` installs this only when boot returned `canSubmit`, so an auto-error is\n * never filed where a manual report would be refused, and it inherits the session\n * Reporter's server-derived tier.\n *\n * The whole module is defensive — a Fixback problem (or an error thrown while\n * capturing an error) never surfaces on the host page.\n */\n\nimport {\n type AutoReport,\n type BeforeSend,\n type BreadcrumbBuffer,\n createAutoCapture,\n DEFAULT_BURST_CAPACITY,\n DEFAULT_BURST_REFILL_MS,\n DEFAULT_MAX_DISTINCT_AUTO,\n type IdentityInputs,\n type ReportContent,\n runBeforeSend,\n type Teardown,\n} from \"@fixback/sdk-core\";\n\nimport { extractFromGlobalEvent } from \"./capture/extract-dom\";\nimport { assembleContent, collectEnvironment } from \"./report\";\nimport type { ReplaySource } from \"./replay\";\nimport { submitReport, type SubmitDeps, type SubmitInput, type SubmitResult } from \"./submit\";\nimport { SDK_VERSION } from \"./version\";\n\nexport type { Teardown };\nexport { DEFAULT_BURST_CAPACITY, DEFAULT_BURST_REFILL_MS, DEFAULT_MAX_DISTINCT_AUTO };\n\n/** Injectable collaborators, defaulted to the real implementations. */\nexport interface AutoCaptureDeps {\n readonly submitReport: (\n apiUrl: string,\n input: SubmitInput,\n deps?: SubmitDeps,\n ) => Promise<SubmitResult>;\n}\n\n/** Configuration for {@link installErrorCapture}. */\nexport interface AutoCaptureConfig {\n readonly apiUrl: string;\n readonly key: string;\n /** Identity evidence, read **live** at capture time (ADR-0032) — the current session token. */\n readonly getIdentity?: () => IdentityInputs;\n /** The window whose global handlers are installed. Defaults to `window`. */\n readonly win?: Window;\n /** The document used for capture + environment. Defaults to the window's. */\n readonly doc?: Document;\n readonly sdkVersion?: string;\n /**\n * The host app's **Release** (#117, ADR-0024) — already validated by `init`\n * (`normaliseRelease`). Stamped into every auto report's environment so the\n * server can symbolicate the captured frames against this build's sourcemaps.\n */\n readonly release?: string;\n /** The deploy environment (`production` / `staging` / …), stamped on every report. */\n readonly deployEnvironment?: string;\n /** The shared trace buffer; the failing error is added to it before filing. */\n readonly buffer?: BreadcrumbBuffer | null;\n /**\n * The shared replay recorder (ADR-0024); the buffered window rides on a rich\n * first report — the moment before an uncaught error is exactly what replay\n * exists to show. Light count-update flushes never re-send it.\n */\n readonly replay?: ReplaySource | null;\n /** Per-project client scrub hook, run at the `beforeSend` choke point (§C). */\n readonly beforeSend?: BeforeSend;\n /** Run the built-in default scrubbers. Defaults to `true` (private-by-default). */\n readonly scrub?: boolean;\n readonly deps?: Partial<AutoCaptureDeps>;\n /** Burst limiter capacity. Defaults to {@link DEFAULT_BURST_CAPACITY}. */\n readonly burstCapacity?: number;\n /** Burst limiter refill interval (ms). Defaults to {@link DEFAULT_BURST_REFILL_MS}. */\n readonly burstRefillMs?: number;\n /** Per-session distinct-Feedback cap. Defaults to {@link DEFAULT_MAX_DISTINCT_AUTO}. */\n readonly maxDistinct?: number;\n /** Clock source, injectable for tests. Defaults to `Date.now`. */\n readonly now?: () => number;\n}\n\n/** A running auto-capture: its teardown, plus the local dropped-count (spec §E). */\nexport interface AutoCaptureHandle {\n /** Remove the two global handlers and the flush hooks. Safe to call repeatedly. */\n readonly destroy: Teardown;\n /**\n * Distinct auto-Feedback dropped by the burst limiter or the per-session cap —\n * the \"keep only a local dropped-count\" fallback beyond the guardrails (spec §E).\n */\n droppedCount(): number;\n}\n\nconst NOOP_HANDLE: AutoCaptureHandle = { destroy: () => {}, droppedCount: () => 0 };\n\n/**\n * Install automatic error capture on a window and return a handle whose `destroy`\n * removes every listener it added (the two global handlers plus the flush hooks).\n */\nexport function installErrorCapture(config: AutoCaptureConfig): AutoCaptureHandle {\n const maybeWin =\n config.win ?? (typeof window !== \"undefined\" ? window : undefined);\n if (!maybeWin) return NOOP_HANDLE;\n const win: Window = maybeWin;\n const doc: Document | undefined =\n config.doc ??\n win.document ??\n (typeof document !== \"undefined\" ? document : undefined);\n\n const sdkVersion = config.sdkVersion ?? SDK_VERSION;\n const submitReportFn = config.deps?.submitReport ?? submitReport;\n\n /**\n * Build the `source: error` content for one report. No Kind rides along\n * (ADR-0023): the server stamps a `source: error` Issue `bug` deterministically —\n * an uncaught error proves itself.\n */\n function buildContent(report: AutoReport): ReportContent {\n const base = assembleContent({\n url: win.location?.href,\n environment: collectEnvironment(win, sdkVersion, config.release),\n deployEnvironment: config.deployEnvironment,\n trace: report.rich ? config.buffer?.snapshot() : undefined,\n });\n return {\n ...base,\n source: \"error\",\n errorSignature: report.fingerprint,\n occurrences: report.occurrences,\n // The structured frames (#117) ride with the rich first report only — a\n // flush is a light count update, like the replay window and the trace.\n ...(report.rich && report.frames.length > 0 ? { errorFrames: report.frames } : {}),\n };\n }\n\n const core = createAutoCapture<Event>({\n extract: extractFromGlobalEvent,\n buffer: config.buffer,\n burstCapacity: config.burstCapacity,\n burstRefillMs: config.burstRefillMs,\n maxDistinct: config.maxDistinct,\n now: config.now,\n /**\n * Assemble, scrub, and ship one auto-Feedback. A `beforeSend` that returns\n * `null` drops the report without transport, which counts as delivered: an\n * intentional non-send has nothing to retry.\n */\n submit: async (report) => {\n const content = runBeforeSend(buildContent(report), {\n hook: config.beforeSend,\n scrub: config.scrub,\n });\n if (!content) return true; // dropped at the client scrub choke point — no transport.\n\n // The buffered replay window rides with the rich first report only. Since\n // ADR-0027 the still is reconstructed from this window downstream; the SDK\n // ships no raster.\n const replay = report.rich ? (config.replay?.snapshot() ?? null) : null;\n\n const result = await submitReportFn(config.apiUrl, {\n key: config.key,\n identity: config.getIdentity?.(),\n content,\n replay,\n });\n return result.ok;\n },\n });\n\n const onGlobalError = (event: Event): void => core.capture(event);\n const flush = (): void => core.flush();\n const onVisibility = (): void => {\n if (doc?.visibilityState === \"hidden\") flush();\n };\n\n win.addEventListener(\"error\", onGlobalError, true);\n win.addEventListener(\"unhandledrejection\", onGlobalError, true);\n win.addEventListener(\"pagehide\", flush);\n doc?.addEventListener(\"visibilitychange\", onVisibility);\n\n return {\n destroy: () => {\n win.removeEventListener(\"error\", onGlobalError, true);\n win.removeEventListener(\"unhandledrejection\", onGlobalError, true);\n win.removeEventListener(\"pagehide\", flush);\n doc?.removeEventListener(\"visibilitychange\", onVisibility);\n },\n droppedCount: core.droppedCount,\n };\n}\n","/**\n * The launcher's isolated styles.\n *\n * These live inside the launcher's Shadow DOM (see `launcher.ts`), so nothing\n * here can reach the host page and nothing on the host page can reach in. The\n * token values are **vendored** Signal design tokens — copied from\n * `packages/ui/src/tokens.css` rather than imported, because the SDK must not\n * depend on `@fixback/ui` at runtime (ticket #47). Keep them in sync by value.\n *\n * The launcher is the prototype's polished pill (spec 0003 §A): a bottom-right\n * **Feedback** pill that **hover-peeks**, can be **tucked away** (sliding off\n * behind an edge nub, with a corner hover-zone to bring it back), a first-visit\n * **welcome toast**, and a **reduce-motion** mode that stills the pulse. Every\n * piece — pill, nub, corner zone, welcome toast — lives in this one Shadow DOM.\n *\n * Motion is driven by two host-element attributes the mount toggles:\n * `data-fb-hidden` (tucked away) and `data-fb-peeking` (peeked back on hover);\n * `data-fb-reduce-motion` (or the OS `prefers-reduced-motion`) stills it all.\n */\nexport const LAUNCHER_STYLES = `\n:host {\n /* Vendored Signal tokens (packages/ui/src/tokens.css). */\n --fb-color-accent: #2f6fed;\n --fb-color-accent-hover: #245fd0;\n --fb-color-on-emphasis: #ffffff;\n --fb-color-text: #0f1720;\n /* Inverse (dark) surface for the toasts — Signal --fb-ink-900. */\n --fb-color-surface-inverse: #0f1720;\n --fb-font-sans: \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto,\n Helvetica, Arial, sans-serif;\n\n display: block;\n color: var(--fb-color-text);\n font-family: var(--fb-font-sans);\n font-size: 13px;\n line-height: 1.4;\n -webkit-font-smoothing: antialiased;\n}\n\n/* The pill: Feedback button + divider + tuck control, anchored bottom-right. */\n.fb-launcher {\n position: fixed;\n right: 20px;\n bottom: 20px;\n z-index: 2;\n display: inline-flex;\n align-items: stretch;\n box-sizing: border-box;\n height: 40px;\n margin: 0;\n border-radius: 999px;\n background: var(--fb-color-accent);\n box-shadow:\n 0 6px 18px rgba(15, 23, 32, 0.16),\n 0 1px 2px rgba(15, 23, 32, 0.12);\n transform: translateX(0);\n transition:\n transform 340ms cubic-bezier(0.2, 0.8, 0.3, 1),\n background-color 120ms ease;\n}\n\n.fb-launcher:hover {\n background: var(--fb-color-accent-hover);\n}\n\n.fb-launcher__button {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n box-sizing: border-box;\n height: 100%;\n margin: 0;\n padding: 0 6px 0 16px;\n border: 0;\n background: transparent;\n color: var(--fb-color-on-emphasis);\n font-family: inherit;\n font-size: 13px;\n font-weight: 600;\n letter-spacing: 0.01em;\n cursor: pointer;\n}\n\n.fb-launcher__button:focus-visible,\n.fb-launcher__tuck:focus-visible {\n outline: 2px solid var(--fb-color-on-emphasis);\n outline-offset: -3px;\n border-radius: 999px;\n}\n\n.fb-launcher__icon {\n display: block;\n flex: none;\n width: 16px;\n height: 16px;\n}\n\n.fb-launcher__label {\n white-space: nowrap;\n}\n\n.fb-launcher__divider {\n width: 1px;\n margin: 9px 0;\n flex: none;\n background: rgba(255, 255, 255, 0.28);\n}\n\n.fb-launcher__tuck {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n width: 32px;\n height: 100%;\n padding: 0;\n border: 0;\n background: transparent;\n color: rgba(255, 255, 255, 0.82);\n cursor: pointer;\n}\n\n.fb-launcher__tuck:hover {\n color: var(--fb-color-on-emphasis);\n}\n\n.fb-launcher__tuck-icon {\n display: block;\n width: 14px;\n height: 14px;\n transition: transform 340ms cubic-bezier(0.2, 0.8, 0.3, 1);\n}\n\n/* Tucked away: mirror the chevron so it points left — back into view. */\n:host([data-fb-hidden]) .fb-launcher__tuck-icon {\n transform: scaleX(-1);\n}\n\n/* The corner hover-zone that peeks a tucked launcher back — inert until tucked,\n * so it never swallows the host page's own bottom-right clicks. */\n.fb-launcher__peekzone {\n position: fixed;\n right: 0;\n bottom: 0;\n z-index: 1;\n width: 160px;\n height: 160px;\n pointer-events: none;\n}\n\n/* The edge nub: the visible re-reveal affordance, hidden until tucked. */\n.fb-launcher__nub {\n position: fixed;\n right: 0;\n bottom: 22px;\n z-index: 2;\n width: 13px;\n height: 42px;\n border-radius: 9px 0 0 9px;\n background: var(--fb-color-accent);\n box-shadow: -6px 5px 18px rgba(47, 111, 237, 0.4);\n cursor: pointer;\n opacity: 0;\n transform: translateX(10px);\n pointer-events: none;\n transition:\n opacity 220ms ease,\n transform 220ms ease;\n}\n\n/* Tucked and not peeking: slide the pill off, reveal the nub, arm the zone. */\n:host([data-fb-hidden]:not([data-fb-peeking])) .fb-launcher {\n transform: translateX(calc(100% + 30px));\n}\n\n:host([data-fb-hidden]:not([data-fb-peeking])) .fb-launcher__nub {\n opacity: 1;\n transform: none;\n pointer-events: auto;\n}\n\n:host([data-fb-hidden]) .fb-launcher__peekzone {\n pointer-events: auto;\n}\n\n/* The first-visit welcome toast, above the pill. */\n.fb-launcher__welcome {\n position: fixed;\n right: 20px;\n bottom: 70px;\n z-index: 5;\n box-sizing: border-box;\n max-width: 210px;\n padding: 9px 13px;\n color: #fff;\n font-size: 12px;\n line-height: 1.45;\n background: var(--fb-color-surface-inverse);\n border-radius: 10px;\n box-shadow: 0 12px 30px rgba(15, 40, 70, 0.32);\n animation: fbToast 300ms ease both;\n}\n\n.fb-launcher__welcome strong {\n color: #8fc0ff;\n font-weight: 600;\n}\n\n/* The pulse that draws the eye while the welcome shows. */\n.fb-launcher--pulse {\n animation: fbPulse 1.8s ease-in-out 2;\n}\n\n@keyframes fbPulse {\n 0%,\n 100% {\n box-shadow:\n 0 6px 18px rgba(15, 23, 32, 0.16),\n 0 0 0 0 rgba(47, 111, 237, 0.45);\n }\n 50% {\n box-shadow:\n 0 6px 18px rgba(15, 23, 32, 0.16),\n 0 0 0 12px rgba(47, 111, 237, 0);\n }\n}\n\n@keyframes fbToast {\n from {\n opacity: 0;\n transform: translateY(14px);\n }\n to {\n opacity: 1;\n transform: none;\n }\n}\n\n/* Reduce motion — the explicit opt-in and the OS setting both still it all. */\n:host([data-fb-reduce-motion]) .fb-launcher,\n:host([data-fb-reduce-motion]) .fb-launcher__nub,\n:host([data-fb-reduce-motion]) .fb-launcher__tuck-icon {\n transition: none;\n}\n\n:host([data-fb-reduce-motion]) .fb-launcher--pulse,\n:host([data-fb-reduce-motion]) .fb-launcher__welcome {\n animation: none;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fb-launcher,\n .fb-launcher__nub,\n .fb-launcher__tuck-icon {\n transition: none;\n }\n .fb-launcher--pulse,\n .fb-launcher__welcome {\n animation: none;\n }\n}\n`;\n","import { LAUNCHER_STYLES } from \"./styles\";\n\n/** Marks the SDK's host element in the light DOM, so it is findable and unique. */\nexport const ROOT_ATTRIBUTE = \"data-fixback-root\";\n\n/**\n * Dispatched from the host element when the launcher is activated. The report\n * overlay this opens is wired in `init`; this event is the seam it hangs off. It\n * is `composed` so host-page listeners outside the Shadow DOM can hear it.\n */\nexport const LAUNCH_EVENT = \"fixback:launch\";\n\n/** Storage-key namespace for the first-visit welcome flag, scoped per key. */\nconst WELCOME_STORAGE_PREFIX = \"fixback:welcomed:\";\n\n/** How long the welcome toast (and its pulse) linger before self-dismissing. */\nconst WELCOME_MS = 5000;\n/** Grace period before a peeked-open launcher tucks itself back on pointer-out. */\nconst PEEK_OUT_MS = 280;\n\nconst FEEDBACK_ICON =\n '<svg class=\"fb-launcher__icon\" viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\">' +\n '<path fill=\"currentColor\" d=\"M3.25 2h9.5A1.25 1.25 0 0 1 14 3.25v6.5A1.25 1.25 0 0 1 12.75 11H7.6l-3.19 2.55A.6.6 0 0 1 3.4 13.1V11h-.15A1.25 1.25 0 0 1 2 9.75v-6.5A1.25 1.25 0 0 1 3.25 2Z\"/>' +\n \"</svg>\";\n\n/**\n * The tuck control's chevron. It points **right** — the direction the pill tucks\n * away toward — and the stylesheet mirrors it to point **left** (back into view)\n * while the launcher is tucked, so the one control reads as a direction toggle.\n */\nconst TUCK_ICON =\n '<svg class=\"fb-launcher__tuck-icon\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">' +\n '<path d=\"M6 4l4 4-4 4\"/>' +\n \"</svg>\";\n\n/** Options that shape a mounted launcher. */\nexport interface LauncherOptions {\n /**\n * The Project's publishable key. Scopes the first-visit welcome flag so the\n * welcome greets once per key per browser.\n */\n readonly key?: string;\n /**\n * Still the pulse and motion. An explicit opt-in that complements the OS-level\n * `prefers-reduced-motion` (which the styles already honour on their own).\n */\n readonly reduceMotion?: boolean;\n}\n\n/** A mounted launcher and the handle needed to remove it again. */\nexport interface Launcher {\n readonly host: HTMLElement;\n /** Clears the launcher's pending timers. Called by {@link unmountLauncher}. */\n readonly dispose: () => void;\n}\n\n/**\n * Read the first-visit welcome flag and mark it seen, returning whether the\n * welcome should greet now. Never throws: when storage is unavailable (SSR,\n * sandboxed frame, blocked cookies) it greets without persisting.\n */\nfunction claimFirstVisitWelcome(win: Window | null, key: string | undefined): boolean {\n const flag = WELCOME_STORAGE_PREFIX + (key ?? \"default\");\n try {\n const storage = win?.localStorage;\n if (!storage) return true;\n if (storage.getItem(flag) === \"1\") return false;\n storage.setItem(flag, \"1\");\n return true;\n } catch {\n return true;\n }\n}\n\n/**\n * Mount the launcher into `target` (typically `document.body`). Everything the\n * launcher draws — the **Feedback** pill, its **tuck** control, the edge **nub**\n * and corner **hover-zone** that peek it back, and the first-visit **welcome**\n * toast — lives inside one open Shadow DOM, so its styles are fully isolated\n * from the host page and vice-versa. The host element is\n * fixed-positioned and out of flow, so mounting never shifts the host page's\n * layout. Only one launcher can exist at a time — an earlier one is removed first.\n *\n * Tuck/peek state is expressed as `data-fb-hidden` / `data-fb-peeking` attributes\n * on the host, which the Shadow DOM stylesheet animates; `reduceMotion` sets\n * `data-fb-reduce-motion`, which (with the OS `prefers-reduced-motion`) stills it.\n */\nexport function mountLauncher(\n target: HTMLElement,\n options: LauncherOptions = {},\n): Launcher {\n const doc = target.ownerDocument;\n const win = doc.defaultView;\n\n const previous = doc.querySelector(`[${ROOT_ATTRIBUTE}]`);\n if (previous) previous.remove();\n\n const host = doc.createElement(\"div\");\n host.setAttribute(ROOT_ATTRIBUTE, \"\");\n // Positioning is inlined on the host (not in the Shadow DOM sheet) so it holds\n // even against a hostile host-page reset, and so the launcher is anchored to\n // the viewport without ever participating in the page's flow.\n host.style.cssText =\n \"position:fixed;right:20px;bottom:20px;z-index:2147483000;margin:0;padding:0;border:0;\";\n if (options.reduceMotion) host.setAttribute(\"data-fb-reduce-motion\", \"true\");\n\n const shadow = host.attachShadow({ mode: \"open\" });\n\n const style = doc.createElement(\"style\");\n style.textContent = LAUNCHER_STYLES;\n shadow.appendChild(style);\n\n // --- The pill: Feedback button + divider + tuck control ---\n const pill = doc.createElement(\"div\");\n pill.className = \"fb-launcher\";\n\n const button = doc.createElement(\"button\");\n button.type = \"button\";\n button.className = \"fb-launcher__button\";\n button.setAttribute(\"aria-haspopup\", \"dialog\");\n button.setAttribute(\"aria-label\", \"Give feedback\");\n button.innerHTML = `${FEEDBACK_ICON}<span class=\"fb-launcher__label\">Feedback</span>`;\n button.addEventListener(\"click\", () => {\n host.dispatchEvent(\n new CustomEvent(LAUNCH_EVENT, { bubbles: true, composed: true }),\n );\n });\n\n const divider = doc.createElement(\"span\");\n divider.className = \"fb-launcher__divider\";\n divider.setAttribute(\"aria-hidden\", \"true\");\n\n const tuck = doc.createElement(\"button\");\n tuck.type = \"button\";\n tuck.className = \"fb-launcher__tuck\";\n tuck.setAttribute(\"data-fb-tuck\", \"\");\n tuck.setAttribute(\"aria-label\", \"Hide feedback button\");\n tuck.title = \"Tuck away\";\n tuck.innerHTML = TUCK_ICON;\n\n pill.append(button, divider, tuck);\n\n // --- The peek chrome: corner hover-zone + edge nub ---\n const peekzone = doc.createElement(\"div\");\n peekzone.className = \"fb-launcher__peekzone\";\n peekzone.setAttribute(\"aria-hidden\", \"true\");\n\n const nub = doc.createElement(\"div\");\n nub.className = \"fb-launcher__nub\";\n nub.setAttribute(\"role\", \"button\");\n nub.setAttribute(\"tabindex\", \"0\");\n nub.setAttribute(\"aria-label\", \"Show feedback button\");\n\n shadow.append(pill, peekzone, nub);\n\n // --- Tuck / peek / welcome state ---\n let hidden = false;\n let peeking = false;\n let peekTimer: ReturnType<typeof setTimeout> | undefined;\n let welcomeTimer: ReturnType<typeof setTimeout> | undefined;\n let welcome: HTMLElement | undefined;\n\n const syncState = (): void => {\n if (hidden) host.setAttribute(\"data-fb-hidden\", \"true\");\n else host.removeAttribute(\"data-fb-hidden\");\n if (hidden && peeking) host.setAttribute(\"data-fb-peeking\", \"true\");\n else host.removeAttribute(\"data-fb-peeking\");\n // The tuck control is a toggle: label it for the direction it will move next.\n tuck.setAttribute(\n \"aria-label\",\n hidden ? \"Show feedback button\" : \"Hide feedback button\",\n );\n tuck.title = hidden ? \"Bring back\" : \"Tuck away\";\n };\n\n const dismissWelcome = (): void => {\n if (welcomeTimer !== undefined) {\n clearTimeout(welcomeTimer);\n welcomeTimer = undefined;\n }\n pill.classList.remove(\"fb-launcher--pulse\");\n welcome?.remove();\n welcome = undefined;\n };\n\n const peekIn = (): void => {\n if (peekTimer !== undefined) {\n clearTimeout(peekTimer);\n peekTimer = undefined;\n }\n if (!peeking) {\n peeking = true;\n syncState();\n }\n };\n\n const peekOut = (): void => {\n if (peekTimer !== undefined) clearTimeout(peekTimer);\n peekTimer = setTimeout(() => {\n peekTimer = undefined;\n peeking = false;\n syncState();\n }, PEEK_OUT_MS);\n };\n\n // Hovering the pill, the nub, or the corner zone all keep the launcher peeked.\n for (const el of [pill, peekzone, nub]) {\n el.addEventListener(\"mouseenter\", peekIn);\n el.addEventListener(\"mouseleave\", peekOut);\n }\n\n const showLauncher = (): void => {\n if (peekTimer !== undefined) {\n clearTimeout(peekTimer);\n peekTimer = undefined;\n }\n hidden = false;\n peeking = false;\n syncState();\n };\n\n const hideLauncher = (): void => {\n dismissWelcome();\n hidden = true;\n peeking = false;\n syncState();\n };\n\n // The tuck control toggles: it tucks the launcher away, and — once tucked and\n // peeked back into reach on hover — brings it fully back, mirroring the chevron.\n tuck.addEventListener(\"click\", () => {\n if (hidden) showLauncher();\n else hideLauncher();\n });\n\n // The nub is a real re-reveal control for pointers that can't hover (touch,\n // keyboard): clicking or Enter/Space brings the launcher fully back.\n nub.addEventListener(\"click\", showLauncher);\n nub.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\" || event.key === \" \" || event.key === \"Spacebar\") {\n event.preventDefault();\n showLauncher();\n }\n });\n\n // --- First-visit welcome + its pulse ---\n if (claimFirstVisitWelcome(win, options.key)) {\n welcome = doc.createElement(\"div\");\n welcome.className = \"fb-launcher__welcome\";\n welcome.setAttribute(\"role\", \"status\");\n welcome.innerHTML =\n \"You're all set — tap <strong>Feedback</strong> any time to report something.\";\n shadow.appendChild(welcome);\n if (!options.reduceMotion) pill.classList.add(\"fb-launcher--pulse\");\n welcomeTimer = setTimeout(dismissWelcome, WELCOME_MS);\n }\n\n target.appendChild(host);\n\n const dispose = (): void => {\n if (peekTimer !== undefined) clearTimeout(peekTimer);\n if (welcomeTimer !== undefined) clearTimeout(welcomeTimer);\n };\n\n return { host, dispose };\n}\n\n/** Remove a mounted launcher. Safe to call more than once. */\nexport function unmountLauncher(launcher: Launcher): void {\n launcher.dispose();\n launcher.host.remove();\n}\n","/**\n * Recognising the SDK's **own** UI in the host page's DOM.\n *\n * The SDK mounts host elements into the page — the launcher and the overlay panel\n * — each tagged with a `data-fixback-*` marker attribute (the element-picker's\n * highlight lives inside the overlay's shadow, so it is covered by the\n * shadow-boundary walk below). {@link isFixbackNode} is what lets the picker, the\n * masked UI crumbs, and the replay recorder skip Fixback's own chrome, so a report\n * never targets or records the tool that filed it.\n */\n\n/** Marker attributes on the SDK's own host elements in the light DOM. */\nexport const FIXBACK_HOST_MARKERS = [\n \"data-fixback-root\",\n \"data-fixback-overlay\",\n] as const;\n\n/**\n * Is this node part of the SDK's own UI? Walks up parents and out through any\n * Shadow DOM boundary (via `getRootNode().host`), so a click inside the overlay's\n * shadow is recognised as Fixback's own — not a host-page element to pick.\n */\nexport function isFixbackNode(node: EventTarget | null | undefined): boolean {\n let current: Node | null = node instanceof Node ? node : null;\n while (current) {\n if (current instanceof Element) {\n for (const marker of FIXBACK_HOST_MARKERS) {\n if (current.hasAttribute(marker)) return true;\n }\n }\n const root = current.getRootNode();\n if (root instanceof ShadowRoot && root !== current) {\n current = root.host;\n continue;\n }\n current = current.parentNode;\n }\n return false;\n}\n","import { isFixbackNode } from \"./dom\";\nimport type { ElementRect, SelectedElement } from \"@fixback/sdk-core\";\n\n/**\n * Escape a string for use in a CSS selector, preferring the platform's\n * `CSS.escape` and falling back to a conservative backslash escape where it is\n * unavailable (older engines, some test environments).\n */\nfunction cssEscape(value: string): string {\n const api = (globalThis as { CSS?: { escape?: (v: string) => string } }).CSS;\n if (api?.escape) return api.escape(value);\n return value.replace(/[^\\w-]/g, (ch) => `\\\\${ch}`);\n}\n\n/** The 1-based position of `el` among its same-tag siblings (`:nth-of-type`). */\nfunction nthOfType(el: Element): number {\n let n = 1;\n let sib = el.previousElementSibling;\n while (sib) {\n if (sib.tagName === el.tagName) n += 1;\n sib = sib.previousElementSibling;\n }\n return n;\n}\n\n/**\n * A stable CSS selector for `el`: its own id when it has one, otherwise a path of\n * tag (with `:nth-of-type` to disambiguate same-tag siblings) climbing until it\n * reaches an ancestor with an id — the shortest anchor that still resolves.\n */\nexport function cssSelectorFor(el: Element): string {\n if (el.id) return `#${cssEscape(el.id)}`;\n\n const parts: string[] = [];\n let node: Element | null = el;\n while (node && node.tagName.toLowerCase() !== \"html\") {\n if (node.id) {\n parts.unshift(`#${cssEscape(node.id)}`);\n break;\n }\n const tag = node.tagName.toLowerCase();\n const parent: Element | null = node.parentElement;\n if (parent) {\n const sameTag = Array.from(parent.children).filter(\n (c) => c.tagName === node!.tagName,\n );\n parts.unshift(\n sameTag.length > 1 ? `${tag}:nth-of-type(${nthOfType(node)})` : tag,\n );\n } else {\n parts.unshift(tag);\n }\n node = parent;\n }\n return parts.join(\" > \");\n}\n\n/** One node's readable label: `tag`, `tag#id`, or `tag.firstClass`. */\nfunction describeNode(el: Element): string {\n const tag = el.tagName.toLowerCase();\n if (el.id) return `${tag}#${el.id}`;\n const firstClass = el.classList[0];\n return firstClass ? `${tag}.${firstClass}` : tag;\n}\n\n/** A readable ancestry path from the document root down to `el`. */\nexport function domPathFor(el: Element): string {\n const chain: string[] = [];\n let node: Element | null = el;\n while (node) {\n chain.unshift(describeNode(node));\n node = node.parentElement;\n }\n return chain.join(\" > \");\n}\n\nfunction roundedRect(el: Element): ElementRect {\n const r = el.getBoundingClientRect();\n return {\n x: Math.round(r.x),\n y: Math.round(r.y),\n width: Math.round(r.width),\n height: Math.round(r.height),\n };\n}\n\n/**\n * Describe a picked element as the Annotation ingest stores: a stable selector, a\n * readable DOM path, the tag, and the viewport bounding rect (spec MVP §B).\n */\nexport function describeElement(el: Element): SelectedElement {\n return {\n selector: cssSelectorFor(el),\n domPath: domPathFor(el),\n tag: el.tagName.toLowerCase(),\n rect: roundedRect(el),\n };\n}\n\n/** Options for {@link startElementPicker}. */\nexport interface ElementPickerOptions {\n /** Document to attach to. Defaults to the global `document`. */\n readonly doc?: Document;\n /** Called with the element being hovered (or `null` over nothing pickable). */\n readonly onHover?: (element: Element | null) => void;\n /** Called with the element the Reporter clicked to pin. */\n readonly onPick: (element: Element) => void;\n /** Called when the Reporter presses Escape to abandon the pick. */\n readonly onCancel?: () => void;\n /** Return true to skip a node (defaults to skipping the SDK's own UI). */\n readonly ignore?: (element: Element) => boolean;\n}\n\n/** A running element-picker; call {@link ElementPicker.stop} to detach it. */\nexport interface ElementPicker {\n stop(): void;\n}\n\n/**\n * Enter element-select mode: as the Reporter moves over the host page the element\n * under the pointer is reported through `onHover` (the overlay draws a highlight),\n * a click pins it through `onPick`, and Escape abandons through `onCancel`. The\n * click that pins is swallowed (prevent-default + stop-propagation) so it never\n * also activates the host page. The SDK's own UI is skipped by default, so the\n * Reporter can never pick the overlay itself.\n *\n * Listeners are attached in the capture phase so the pick is intercepted before\n * any host-page handler sees it; `stop()` (called automatically on pick/cancel)\n * detaches them all.\n */\nexport function startElementPicker(options: ElementPickerOptions): ElementPicker {\n const doc = options.doc ?? document;\n const ignore = options.ignore ?? isFixbackNode;\n let current: Element | null = null;\n let stopped = false;\n\n function resolveTarget(event: Event): Element | null {\n const path =\n typeof event.composedPath === \"function\" ? event.composedPath() : [];\n const deepest = path[0] ?? event.target;\n if (deepest instanceof Element) return ignore(deepest) ? null : deepest;\n return null;\n }\n\n function onOver(event: Event): void {\n if (stopped) return;\n current = resolveTarget(event);\n options.onHover?.(current);\n }\n\n function onClick(event: MouseEvent): void {\n if (stopped) return;\n const el = resolveTarget(event) ?? current;\n if (!el) return; // nothing pickable under the pointer — let the click pass\n event.preventDefault();\n event.stopPropagation();\n stop();\n options.onPick(el);\n }\n\n function onKey(event: KeyboardEvent): void {\n if (stopped) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n stop();\n options.onCancel?.();\n }\n }\n\n function stop(): void {\n if (stopped) return;\n stopped = true;\n doc.removeEventListener(\"mouseover\", onOver, true);\n doc.removeEventListener(\"click\", onClick, true);\n doc.removeEventListener(\"keydown\", onKey, true);\n current = null;\n }\n\n doc.addEventListener(\"mouseover\", onOver, true);\n doc.addEventListener(\"click\", onClick, true);\n doc.addEventListener(\"keydown\", onKey, true);\n\n return { stop };\n}\n","/**\n * The draw surface — arrow / box / pen / text marking over the captured frame\n * (spec 0003 §B, the Reporter prototype's draw toolbar). It is the interactive\n * editor behind the overlay's draw mode: a tool, a live preview, a committed list\n * of {@link Mark}s with undo, and an SVG it renders into. Marks are recorded in\n * **screenshot (viewport) coordinates** so they compose over the full masked\n * screenshot; the overlay reads {@link DrawSurface.marks} when the Reporter\n * attaches.\n *\n * Pointer listeners are capture-phase on the document, so a stroke is intercepted\n * before the host page; a stroke that begins on interactive chrome (the toolbar,\n * the label input) is ignored so the toolbar stays clickable. The surface draws\n * nothing into the host page — only into the SVG the overlay hands it inside its\n * own Shadow DOM.\n */\n\nimport {\n arrowHeadPoints,\n MARK_COLOR,\n type ArrowMark,\n type BoxMark,\n type DrawTool,\n type Mark,\n type PenMark,\n type Point,\n} from \"./annotation\";\n\n/** A mark mid-drag — always a stroke (arrow/box/pen); text is entered via the input. */\ntype StrokePreview = ArrowMark | BoxMark | PenMark;\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\n/** Stroke width for every mark, in px (matches the prototype). */\nconst STROKE_WIDTH = \"3\";\n\n/** The smallest arrow/box drag that commits, in px — smaller is a stray click. */\nconst MIN_DRAG = 4;\n\n/** The label font, vendored to match the overlay's Signal sans stack. */\nconst LABEL_FONT =\n '600 16px \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif';\n\n/** Options for {@link startDrawSurface}. */\nexport interface DrawSurfaceOptions {\n /** Document to attach to. Defaults to the global `document`. */\n readonly doc?: Document;\n /** The (viewport-filling) SVG the surface renders committed marks + preview into. */\n readonly svg: SVGSVGElement;\n /** The inline label input the text tool shows, positions, and reads. */\n readonly textInput: HTMLInputElement;\n /** Mark colour. Defaults to {@link MARK_COLOR}. */\n readonly color?: string;\n /** Marks to seed from, so re-entering draw continues an existing annotation. */\n readonly initialMarks?: ReadonlyArray<Mark>;\n /** Notified with a fresh snapshot whenever the committed marks change. */\n readonly onChange?: (marks: ReadonlyArray<Mark>) => void;\n}\n\n/** A running draw surface. */\nexport interface DrawSurface {\n /** Switch the active tool. */\n setTool(tool: DrawTool): void;\n /** The active tool. */\n getTool(): DrawTool;\n /** Remove the most recently committed mark. */\n undo(): void;\n /** A snapshot of the committed marks, in screenshot coordinates. */\n marks(): ReadonlyArray<Mark>;\n /** Detach all listeners and hide the label input. */\n stop(): void;\n}\n\n/**\n * Begin drawing. The returned surface tracks a tool, a live preview stroke, and the\n * committed marks; `marks()` snapshots them for the overlay's Send assembly. Text\n * labels are entered through the provided input (Enter commits, Escape/blur-empty\n * discards). `stop()` detaches everything.\n */\nexport function startDrawSurface(options: DrawSurfaceOptions): DrawSurface {\n const doc = options.doc ?? document;\n const { svg, textInput } = options;\n const color = options.color ?? MARK_COLOR;\n\n let tool: DrawTool = \"arrow\";\n let committed: Mark[] = options.initialMarks ? options.initialMarks.slice() : [];\n let preview: StrokePreview | null = null;\n let drawing = false;\n let pendingText: Point | null = null;\n let stopped = false;\n\n function emitChange(): void {\n options.onChange?.(committed.slice());\n }\n\n function point(event: MouseEvent): Point {\n return { x: Math.round(event.clientX), y: Math.round(event.clientY) };\n }\n\n /** Does the event begin on interactive chrome (a button/input in the path)? */\n function hitsChrome(event: Event): boolean {\n const path =\n typeof event.composedPath === \"function\" ? event.composedPath() : [event.target];\n for (const node of path) {\n if (node === doc) break;\n if (node instanceof Element) {\n const tag = node.tagName;\n if (tag === \"BUTTON\" || tag === \"INPUT\" || tag === \"TEXTAREA\") return true;\n }\n }\n return false;\n }\n\n function meaningful(mark: Mark): boolean {\n if (mark.type === \"pen\") return mark.points.length > 1;\n if (mark.type === \"text\") return mark.text.trim().length > 0;\n return Math.abs(mark.x1 - mark.x0) > MIN_DRAG || Math.abs(mark.y1 - mark.y0) > MIN_DRAG;\n }\n\n function onDown(event: MouseEvent): void {\n if (stopped || drawing || hitsChrome(event)) return;\n const p = point(event);\n if (tool === \"text\") {\n openText(p);\n return;\n }\n if (event.cancelable) event.preventDefault();\n drawing = true;\n preview =\n tool === \"pen\"\n ? { type: \"pen\", points: [p], color }\n : { type: tool, x0: p.x, y0: p.y, x1: p.x, y1: p.y, color };\n render();\n }\n\n function onMove(event: MouseEvent): void {\n if (stopped || !drawing || !preview) return;\n const p = point(event);\n if (preview.type === \"pen\") {\n preview = { type: \"pen\", points: [...preview.points, p], color: preview.color };\n } else {\n preview = { ...preview, x1: p.x, y1: p.y };\n }\n render();\n }\n\n function onUp(): void {\n if (stopped || !drawing) return;\n drawing = false;\n const pv = preview;\n preview = null;\n if (pv && meaningful(pv)) {\n committed = [...committed, pv];\n emitChange();\n }\n render();\n }\n\n function openText(p: Point): void {\n pendingText = p;\n textInput.value = \"\";\n textInput.style.display = \"block\";\n textInput.style.left = `${p.x}px`;\n textInput.style.top = `${p.y}px`;\n textInput.onkeydown = onTextKey;\n textInput.onblur = commitText;\n // Focus on the next tick so the current click doesn't immediately blur it.\n setTimeout(() => {\n try {\n textInput.focus();\n } catch {\n /* focus is best-effort — never throw into the host page */\n }\n }, 0);\n }\n\n function onTextKey(event: KeyboardEvent): void {\n if (event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n commitText();\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n discardText();\n }\n }\n\n function commitText(): void {\n if (!pendingText) return;\n const text = textInput.value.trim();\n const at = pendingText;\n discardText();\n if (text.length > 0) {\n committed = [...committed, { type: \"text\", x: at.x, y: at.y, text, color }];\n emitChange();\n render();\n }\n }\n\n function discardText(): void {\n pendingText = null;\n textInput.onkeydown = null;\n textInput.onblur = null;\n textInput.value = \"\";\n textInput.style.display = \"none\";\n }\n\n function render(): void {\n while (svg.firstChild) svg.removeChild(svg.firstChild);\n for (const mark of committed) svg.appendChild(renderMark(doc, mark));\n if (preview) svg.appendChild(renderMark(doc, preview));\n }\n\n function stop(): void {\n if (stopped) return;\n stopped = true;\n doc.removeEventListener(\"mousedown\", onDown, true);\n doc.removeEventListener(\"mousemove\", onMove, true);\n doc.removeEventListener(\"mouseup\", onUp, true);\n discardText();\n }\n\n doc.addEventListener(\"mousedown\", onDown, true);\n doc.addEventListener(\"mousemove\", onMove, true);\n doc.addEventListener(\"mouseup\", onUp, true);\n render();\n\n return {\n setTool: (next) => {\n tool = next;\n },\n getTool: () => tool,\n undo: () => {\n if (committed.length === 0) return;\n committed = committed.slice(0, -1);\n emitChange();\n render();\n },\n marks: () => committed.slice(),\n stop,\n };\n}\n\n/** Build the SVG element(s) for one mark, in the mark's own coordinate space. */\nfunction renderMark(doc: Document, mark: Mark): SVGElement {\n switch (mark.type) {\n case \"box\": {\n const rect = svgEl(doc, \"rect\", {\n x: String(Math.min(mark.x0, mark.x1)),\n y: String(Math.min(mark.y0, mark.y1)),\n width: String(Math.abs(mark.x1 - mark.x0)),\n height: String(Math.abs(mark.y1 - mark.y0)),\n rx: \"2\",\n fill: \"none\",\n stroke: mark.color,\n \"stroke-width\": STROKE_WIDTH,\n });\n return rect;\n }\n case \"pen\": {\n return svgEl(doc, \"polyline\", {\n points: mark.points.map((p) => `${p.x},${p.y}`).join(\" \"),\n fill: \"none\",\n stroke: mark.color,\n \"stroke-width\": STROKE_WIDTH,\n \"stroke-linecap\": \"round\",\n \"stroke-linejoin\": \"round\",\n });\n }\n case \"text\": {\n const text = svgEl(doc, \"text\", {\n x: String(mark.x),\n y: String(mark.y),\n fill: mark.color,\n style: `font:${LABEL_FONT}`,\n });\n text.textContent = mark.text;\n return text;\n }\n case \"arrow\": {\n const group = svgEl(doc, \"g\", {});\n group.appendChild(\n svgEl(doc, \"line\", {\n x1: String(mark.x0),\n y1: String(mark.y0),\n x2: String(mark.x1),\n y2: String(mark.y1),\n stroke: mark.color,\n \"stroke-width\": STROKE_WIDTH,\n \"stroke-linecap\": \"round\",\n }),\n );\n const head = arrowHeadPoints(mark.x0, mark.y0, mark.x1, mark.y1);\n group.appendChild(\n svgEl(doc, \"polygon\", {\n points: head.map((p) => `${p.x},${p.y}`).join(\" \"),\n fill: mark.color,\n }),\n );\n return group;\n }\n }\n}\n\n/** Create a namespaced SVG element with the given attributes. */\nfunction svgEl(\n doc: Document,\n tag: string,\n attrs: Record<string, string>,\n): SVGElement {\n const node = doc.createElementNS(SVG_NS, tag) as SVGElement;\n for (const [name, value] of Object.entries(attrs)) node.setAttribute(name, value);\n return node;\n}\n","/**\n * Region-capture — drag a rectangle over the page to focus the report on one area\n * (spec 0003 §B, the Reporter prototype's capture layer). It produces a `region`\n * rect in screenshot (viewport) coordinates; Escape or a too-small drag abandons\n * it. One of the overlay's three composable, optional marking layers, alongside\n * element-pick and draw.\n *\n * Listeners are attached in the **capture phase** so the drag is intercepted before\n * any host-page handler sees it. It is armed deliberately — the overlay lays a\n * full-screen capture layer over the page (and hides the panel) while it runs — so\n * it captures whatever the Reporter drags, its own layer included. Purely a producer\n * of a `Rect`: it draws nothing; the overlay renders the live selection box from\n * `onProgress`.\n */\n\nimport { normalizeRect, type Rect } from \"./annotation\";\n\n/** Options for {@link startRegionCapture}. */\nexport interface RegionCaptureOptions {\n /** Document to attach to. Defaults to the global `document`. */\n readonly doc?: Document;\n /** Called on each drag update with the current rect (to draw a selection box). */\n readonly onProgress?: (rect: Rect) => void;\n /** Called with the captured rect when the drag ends large enough to keep. */\n readonly onComplete: (rect: Rect) => void;\n /** Called when the capture is abandoned (Escape, or a drag below the floor). */\n readonly onCancel?: () => void;\n /** Minimum width and height, in px, to count as a capture. Defaults to 12. */\n readonly minSize?: number;\n}\n\n/** A running region-capture; call {@link RegionCapture.stop} to detach it. */\nexport interface RegionCapture {\n stop(): void;\n}\n\n/** The smallest drag that counts as a region (matches the prototype's 12px floor). */\nconst DEFAULT_MIN_SIZE = 12;\n\n/**\n * Enter region-capture mode: the next drag on the host page draws out a rectangle,\n * reported live through `onProgress` and committed through `onComplete` on release\n * (when it clears the size floor). Escape, or a drag too small to be meaningful,\n * calls `onCancel`. `stop()` (called automatically on complete/cancel) detaches all\n * listeners.\n */\nexport function startRegionCapture(options: RegionCaptureOptions): RegionCapture {\n const doc = options.doc ?? document;\n const minSize = options.minSize ?? DEFAULT_MIN_SIZE;\n let start: { x: number; y: number } | null = null;\n let stopped = false;\n\n function onDown(event: MouseEvent): void {\n if (stopped || start) return;\n start = { x: event.clientX, y: event.clientY };\n if (event.cancelable) event.preventDefault();\n }\n\n function onMove(event: MouseEvent): void {\n if (stopped || !start) return;\n options.onProgress?.(normalizeRect(start.x, start.y, event.clientX, event.clientY));\n }\n\n function onUp(event: MouseEvent): void {\n if (stopped || !start) return;\n const rect = normalizeRect(start.x, start.y, event.clientX, event.clientY);\n start = null;\n stop();\n if (rect.width < minSize || rect.height < minSize) {\n options.onCancel?.();\n return;\n }\n options.onComplete(rect);\n }\n\n function onKey(event: KeyboardEvent): void {\n if (stopped) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n stop();\n options.onCancel?.();\n }\n }\n\n function stop(): void {\n if (stopped) return;\n stopped = true;\n doc.removeEventListener(\"mousedown\", onDown, true);\n doc.removeEventListener(\"mousemove\", onMove, true);\n doc.removeEventListener(\"mouseup\", onUp, true);\n doc.removeEventListener(\"keydown\", onKey, true);\n start = null;\n }\n\n doc.addEventListener(\"mousedown\", onDown, true);\n doc.addEventListener(\"mousemove\", onMove, true);\n doc.addEventListener(\"mouseup\", onUp, true);\n doc.addEventListener(\"keydown\", onKey, true);\n\n return { stop };\n}\n","/**\n * The overlay's **marking state machine** (spec §B): the three composable,\n * optional layers a Reporter can put over the current view — **element-pick**,\n * **region-capture** (drag), and **draw** (arrow / box / pen / text) — and the\n * mutually-exclusive full-screen modes that collect them.\n *\n * Exactly one marking layer runs at a time, so starting one closes the others; the\n * panel hides while any of them is up. What survives is pure data — a picked\n * element, a viewport-space region, and a list of vector marks — which is what the\n * send path assembles into the structured Annotation. Marks are **never** baked\n * into an image: they are viewport-space vectors the dashboard composites at view\n * time (spec §D).\n *\n * The controller owns no DOM of its own: it positions the layers the view built\n * and reports every change through `onChange`, so the panel's summary line and the\n * send path read one state.\n */\n\nimport type { SelectedElement } from \"@fixback/sdk-core\";\n\nimport type { DrawTool, Mark, Rect } from \"../annotation\";\nimport { startDrawSurface, type DrawSurface } from \"../draw-surface\";\nimport {\n describeElement,\n type ElementPicker,\n type ElementPickerOptions,\n} from \"../element-picker\";\nimport { startRegionCapture, type RegionCapture } from \"../region-capture\";\nimport type { Refs } from \"./view\";\n\n/** Which full-screen marking mode is active, if any. */\nexport type MarkMode = \"compose\" | \"picking\" | \"capturing\" | \"drawing\";\n\n/** Everything the Reporter has marked so far — the send path's input. */\nexport interface MarkingState {\n readonly selectedElement: SelectedElement | null;\n readonly region: Rect | null;\n readonly marks: readonly Mark[];\n}\n\n/** The element-picker factory, injectable so the overlay is testable without pointer events. */\nexport type StartPickerFn = (options: ElementPickerOptions) => ElementPicker;\n\n/** Configuration for {@link createMarkingController}. */\nexport interface MarkingConfig {\n readonly doc: Document;\n readonly refs: Refs;\n readonly startElementPicker: StartPickerFn;\n /** Called whenever the marked state or the active mode changes. */\n readonly onChange: () => void;\n}\n\n/** The running marking state machine the overlay drives. */\nexport interface MarkingController {\n /** The current mode — `compose` when no marking layer is up. */\n mode(): MarkMode;\n /** What has been marked so far. */\n state(): MarkingState;\n /** Toggle the element picker (start it, or end it if it is already running). */\n togglePick(): void;\n /** Start the region-capture drag, which flows into the draw layer on completion. */\n beginCapture(): void;\n /** Select a draw tool (arrow / box / pen / text). */\n setTool(tool: DrawTool): void;\n /** Undo the last mark on the draw surface. */\n undo(): void;\n /** Attach the in-flight capture: its marks and region become part of the report. */\n attachDraw(): void;\n /** Discard the in-flight capture; previously attached marking is untouched. */\n cancelDraw(): void;\n /** Tear down any active marking layer (before starting another, or on close). */\n closeAll(): void;\n /** Forget every mark — called when the overlay opens a fresh report. */\n reset(): void;\n}\n\n/** Create the marking state machine over an already-built overlay view. */\nexport function createMarkingController(config: MarkingConfig): MarkingController {\n const { doc, refs, onChange } = config;\n\n let picker: ElementPicker | null = null;\n let regionCapture: RegionCapture | null = null;\n let drawSurface: DrawSurface | null = null;\n let pendingRegion: Rect | null = null;\n let mode: MarkMode = \"compose\";\n\n const state: {\n selectedElement: SelectedElement | null;\n region: Rect | null;\n marks: Mark[];\n } = { selectedElement: null, region: null, marks: [] };\n\n /** Show exactly one full-screen marking layer, hiding the panel while it runs. */\n function setMode(next: MarkMode): void {\n mode = next;\n const marking = next !== \"compose\";\n refs.panel.classList.toggle(\"is-marking\", marking);\n refs.pickLayer.classList.toggle(\"is-visible\", next === \"picking\");\n refs.captureLayer.classList.toggle(\"is-visible\", next === \"capturing\");\n refs.drawLayer.classList.toggle(\"is-visible\", next === \"drawing\");\n refs.pickBtn.classList.toggle(\"is-active\", next === \"picking\");\n refs.captureBtn.classList.toggle(\n \"is-active\",\n next === \"capturing\" || next === \"drawing\",\n );\n }\n\n function positionHighlight(element: Element | null): void {\n if (!element) {\n refs.highlight.style.display = \"none\";\n return;\n }\n const rect = element.getBoundingClientRect();\n refs.highlight.style.display = \"block\";\n refs.highlight.style.left = `${rect.left}px`;\n refs.highlight.style.top = `${rect.top}px`;\n refs.highlight.style.width = `${rect.width}px`;\n refs.highlight.style.height = `${rect.height}px`;\n }\n\n // ---- element-pick -------------------------------------------------------\n\n function stopPicker(): void {\n picker?.stop();\n picker = null;\n }\n\n function endPick(): void {\n refs.highlight.style.display = \"none\";\n stopPicker();\n if (mode === \"picking\") setMode(\"compose\");\n }\n\n function beginPick(): void {\n closeAll();\n setMode(\"picking\");\n picker = config.startElementPicker({\n doc,\n onHover: positionHighlight,\n onPick: (element) => {\n state.selectedElement = describeElement(element);\n endPick();\n onChange();\n },\n onCancel: endPick,\n });\n }\n\n // ---- region-capture -----------------------------------------------------\n\n function positionSelBox(rect: Rect | null): void {\n const box = refs.selBox;\n if (!rect) {\n box.style.display = \"none\";\n return;\n }\n box.style.display = \"block\";\n box.style.left = `${rect.x}px`;\n box.style.top = `${rect.y}px`;\n box.style.width = `${rect.width}px`;\n box.style.height = `${rect.height}px`;\n }\n\n function stopRegionCapture(): void {\n regionCapture?.stop();\n regionCapture = null;\n }\n\n // ---- draw ---------------------------------------------------------------\n\n function positionDrawFrame(region: Rect): void {\n refs.drawFrame.style.left = `${region.x}px`;\n refs.drawFrame.style.top = `${region.y}px`;\n refs.drawFrame.style.width = `${region.width}px`;\n refs.drawFrame.style.height = `${region.height}px`;\n }\n\n function setTool(tool: DrawTool): void {\n drawSurface?.setTool(tool);\n for (const [value, button] of refs.drawTools) {\n button.classList.toggle(\"is-active\", value === tool);\n }\n }\n\n function onMarksChange(marks: ReadonlyArray<Mark>): void {\n refs.undoBtn.disabled = marks.length === 0;\n }\n\n function stopDrawSurface(): void {\n drawSurface?.stop();\n drawSurface = null;\n }\n\n function beginDraw(region: Rect): void {\n pendingRegion = region;\n positionDrawFrame(region);\n setMode(\"drawing\");\n drawSurface = startDrawSurface({\n doc,\n svg: refs.drawSvg,\n textInput: refs.drawText,\n initialMarks: state.marks,\n onChange: onMarksChange,\n });\n setTool(\"arrow\");\n onMarksChange(state.marks);\n }\n\n function endDraw(): void {\n stopDrawSurface();\n pendingRegion = null;\n if (mode === \"drawing\") setMode(\"compose\");\n }\n\n function closeAll(): void {\n stopPicker();\n stopRegionCapture();\n stopDrawSurface();\n pendingRegion = null;\n positionSelBox(null);\n refs.highlight.style.display = \"none\";\n if (mode !== \"compose\") setMode(\"compose\");\n }\n\n return {\n mode: () => mode,\n state: () => ({\n selectedElement: state.selectedElement,\n region: state.region,\n marks: state.marks,\n }),\n togglePick(): void {\n if (mode === \"picking\") endPick();\n else beginPick();\n },\n beginCapture(): void {\n closeAll();\n positionSelBox(null);\n setMode(\"capturing\");\n regionCapture = startRegionCapture({\n doc,\n onProgress: positionSelBox,\n onComplete: (rect) => {\n stopRegionCapture();\n positionSelBox(null);\n beginDraw(rect);\n },\n onCancel: () => {\n stopRegionCapture();\n positionSelBox(null);\n setMode(\"compose\");\n },\n });\n },\n setTool,\n undo: () => drawSurface?.undo(),\n attachDraw(): void {\n if (drawSurface) {\n state.marks = drawSurface.marks().slice();\n if (pendingRegion) state.region = pendingRegion;\n }\n endDraw();\n onChange();\n },\n cancelDraw(): void {\n endDraw();\n onChange();\n },\n closeAll,\n reset(): void {\n state.selectedElement = null;\n state.region = null;\n state.marks = [];\n },\n };\n}\n","/**\n * The two element constructors the overlay's view is built from.\n *\n * Both take the `Document` explicitly rather than closing over a global, so the\n * whole overlay can be built into any document (a test's, an iframe's) — and both\n * set attributes rather than assigning properties, which keeps the built markup a\n * faithful match for the frozen Signal prototype.\n */\n\n/** The SVG namespace, for the draw surface's mark layer and the toolbar icons. */\nexport const SVG_NS = \"http://www.w3.org/2000/svg\";\n\n/** Marks the overlay's host element in the light DOM (skipped by capture/picker). */\nexport const OVERLAY_ATTRIBUTE = \"data-fixback-overlay\";\n\n/** Create an HTML element with attributes and children (text or nodes). */\nexport function h<K extends keyof HTMLElementTagNameMap>(\n doc: Document,\n tag: K,\n props: Partial<Record<string, string>> = {},\n children: ReadonlyArray<Node | string> = [],\n): HTMLElementTagNameMap[K] {\n const node = doc.createElement(tag);\n for (const [name, value] of Object.entries(props)) {\n if (value !== undefined) node.setAttribute(name, value);\n }\n for (const child of children) {\n node.appendChild(typeof child === \"string\" ? doc.createTextNode(child) : child);\n }\n return node;\n}\n\n/** Create a namespaced SVG element with attributes and optional SVG children. */\nexport function svgNode(\n doc: Document,\n tag: string,\n attrs: Record<string, string> = {},\n children: ReadonlyArray<SVGElement> = [],\n): SVGElement {\n const node = doc.createElementNS(SVG_NS, tag) as SVGElement;\n for (const [name, value] of Object.entries(attrs)) node.setAttribute(name, value);\n for (const child of children) node.appendChild(child);\n return node;\n}\n","/**\n * The overlay's inline **icons** — the glyphs on the element-pick, region-capture,\n * undo, and draw-tool controls, matching the frozen Signal Reporter prototype\n * (`docs/design/Fixback Reporter.dc.html`).\n *\n * They are built as DOM rather than shipped as an icon font or sprite sheet: the\n * SDK stays dependency-free and self-isolating, so every pixel it draws is created\n * inside its own Shadow DOM with no external asset to load or fail.\n */\n\nimport type { DrawTool } from \"../annotation\";\nimport { h, svgNode } from \"./dom\";\n\n/** The draw tools, in toolbar order (spec §B, the Reporter prototype). */\nexport const DRAW_TOOLS: ReadonlyArray<{ tool: DrawTool; label: string }> = [\n { tool: \"arrow\", label: \"Arrow\" },\n { tool: \"box\", label: \"Box\" },\n { tool: \"pen\", label: \"Pen\" },\n { tool: \"text\", label: \"Text label\" },\n];\n\n/** The shared attributes of every inline stroke icon. */\nfunction iconAttrs(size: string): Record<string, string> {\n return {\n class: \"fb-ov-icon\",\n width: size,\n height: size,\n viewBox: \"0 0 16 16\",\n fill: \"none\",\n stroke: \"currentColor\",\n \"stroke-width\": size === \"14\" ? \"1.5\" : \"1.6\",\n \"aria-hidden\": \"true\",\n };\n}\n\n/** The crosshair glyph on the element-pick control (matches the `⌖` in the prototype). */\nexport function pickGlyph(doc: Document): HTMLElement {\n return h(doc, \"span\", { class: \"fb-ov-pickbtn__glyph\", \"aria-hidden\": \"true\" }, [\"⌖\"]);\n}\n\n/** The frame glyph on the region-capture control (matches the prototype's crop icon). */\nexport function captureGlyph(doc: Document): SVGElement {\n return svgNode(doc, \"svg\", iconAttrs(\"14\"), [\n svgNode(doc, \"path\", { d: \"M2 5V2h3M14 5V2h-3M2 11v3h3M14 11v3h-3\" }),\n ]);\n}\n\n/** The undo glyph on the draw toolbar. */\nexport function undoGlyph(doc: Document): SVGElement {\n return svgNode(doc, \"svg\", iconAttrs(\"15\"), [\n svgNode(doc, \"path\", { d: \"M6 4 3 7l3 3M3 7h6a4 4 0 0 1 0 8H7\" }),\n ]);\n}\n\n/** The per-tool glyph on the draw toolbar (matches the prototype's icons). */\nexport function drawToolGlyph(doc: Document, tool: DrawTool): Node {\n if (tool === \"text\") {\n return h(doc, \"span\", { class: \"fb-ov-drawtool__t\", \"aria-hidden\": \"true\" }, [\"T\"]);\n }\n const paths: Record<Exclude<DrawTool, \"text\">, SVGElement> = {\n arrow: svgNode(doc, \"path\", { d: \"M3 13 13 3M7 3h6v6\" }),\n box: svgNode(doc, \"rect\", { x: \"2.5\", y: \"3.5\", width: \"11\", height: \"9\", rx: \"1\" }),\n pen: svgNode(doc, \"path\", { d: \"M3 13l1-3 6-6 2 2-6 6-3 1Z\" }),\n };\n return svgNode(doc, \"svg\", iconAttrs(\"15\"), [paths[tool]]);\n}\n","/**\n * The overlay's **Send** path: assemble what the Reporter composed, run it through\n * the single client-side scrub choke point, and hand it to the transport.\n *\n * Kept free of any DOM so the whole decision sequence — what is assembled, what the\n * hook may drop, when the replay window is read — is testable without an overlay.\n * The order matters and is asserted by its tests: the draft is assembled, then\n * scrubbed (spec §C), and only a draft the hook *accepted* causes the buffered\n * replay window to be read. A dropped report sends nothing at all.\n */\n\nimport {\n type Breadcrumb,\n type BeforeSend,\n type IdentityInputs,\n runBeforeSend,\n} from \"@fixback/sdk-core\";\n\nimport { assembleContent, collectEnvironment } from \"../report\";\nimport type { ReplaySnapshot, ReplaySource } from \"../replay\";\nimport type { SubmitDeps, SubmitInput, SubmitResult } from \"../submit\";\nimport type { MarkingState } from \"./marking\";\n\n/** A read-only view of the trace buffer the overlay attaches to a report. */\nexport interface BreadcrumbSource {\n snapshot(): readonly Breadcrumb[];\n}\n\n/** The transport call the send path makes — injectable for tests. */\nexport type SubmitReportFn = (\n apiUrl: string,\n input: SubmitInput,\n deps?: SubmitDeps,\n) => Promise<SubmitResult>;\n\n/** Everything the send path needs that does not change between sends. */\nexport interface SendContext {\n readonly apiUrl: string;\n readonly key: string;\n readonly identity?: IdentityInputs;\n readonly sdkVersion: string;\n /** The host app's Release (#117, ADR-0024), validated by `init`. */\n readonly release?: string;\n /** The deploy environment (`production` / `staging` / …), stamped on every report. */\n readonly deployEnvironment?: string;\n /** The window the page URL and viewport are read from. */\n readonly win: Window;\n /** The trace buffer whose snapshot rides on the report (spec §C). */\n readonly buffer?: BreadcrumbSource | null;\n /** The replay recorder, read only once the scrub hook has accepted the report. */\n readonly replay?: ReplaySource | null;\n /** Per-project client scrub hook, run at the `beforeSend` choke point. */\n readonly beforeSend?: BeforeSend;\n /** Run the built-in default scrubbers. Defaults to `true` (private-by-default). */\n readonly scrub?: boolean;\n readonly submitReport: SubmitReportFn;\n}\n\n/** What one Send carries beyond the context. */\nexport interface SendDraft {\n readonly comment: string;\n readonly marking: MarkingState;\n /**\n * The replay window frozen when the overlay **opened** (ADR-0024) — the lead-up\n * to the bug, not to Send. `null` falls back to a snapshot taken now.\n */\n readonly openedReplay: ReplaySnapshot | null;\n}\n\n/**\n * The outcome of a Send. `dropped` is the project's own `beforeSend` returning\n * `null`: an intentional non-send, which the overlay confirms exactly like a\n * delivered report — the Reporter did nothing wrong and must not see an error.\n */\nexport type SendOutcome = { readonly kind: \"dropped\" } | {\n readonly kind: \"submitted\";\n readonly result: SubmitResult;\n};\n\n/** Assemble, scrub, and submit one report. See the module doc for the ordering. */\nexport async function sendReport(\n context: SendContext,\n draft: SendDraft,\n): Promise<SendOutcome> {\n const { marking } = draft;\n const assembled = assembleContent({\n comment: draft.comment,\n element: marking.selectedElement ?? undefined,\n region: marking.region ?? undefined,\n marks: marking.marks.length > 0 ? marking.marks : undefined,\n url: context.win.location?.href,\n environment: collectEnvironment(context.win, context.sdkVersion, context.release),\n deployEnvironment: context.deployEnvironment,\n trace: context.buffer?.snapshot(),\n });\n\n // The single client-side scrub choke point (spec §C): default scrubbers + the\n // per-project hook run before transport; a `null` result drops the report.\n const content = runBeforeSend(assembled, {\n hook: context.beforeSend,\n scrub: context.scrub,\n });\n if (!content) return { kind: \"dropped\" };\n\n // The buffered replay window rides as its own part (ADR-0024): the frame the\n // Reporter annotated is reconstructed from it downstream (ADR-0027), so the SDK\n // ships no rasterised screenshot. Read *after* the hook accepted the report — a\n // dropped report sends nothing.\n const replay = draft.openedReplay ?? context.replay?.snapshot() ?? null;\n\n const result = await context.submitReport(context.apiUrl, {\n key: context.key,\n identity: context.identity,\n content,\n replay,\n });\n return { kind: \"submitted\", result };\n}\n","/**\n * The report overlay's isolated styles, built to the frozen Signal Reporter\n * overlay (`docs/design/Fixback Visual Identity.dc.html`, badge `1d`). Like the\n * launcher's styles these live inside the overlay's Shadow DOM, so nothing here\n * reaches the host page and nothing on the host page reaches in. Token values are\n * vendored Signal tokens (copied from `packages/ui/src/tokens.css`, not imported —\n * the SDK must not depend on `@fixback/ui` at runtime). Keep them in sync by value.\n */\nexport const OVERLAY_STYLES = `\n:host {\n --fb-color-accent: #2f6fed;\n --fb-color-accent-hover: #245fd0;\n --fb-color-on-emphasis: #ffffff;\n --fb-color-ink: #0f1720;\n --fb-color-text: #1a2530;\n --fb-color-muted: #5a6875;\n --fb-color-faint: #9aa7b2;\n --fb-color-border: #e0e6ec;\n --fb-color-border-soft: #e6ebf0;\n --fb-color-surface: #ffffff;\n --fb-color-bug: #e5484d;\n --fb-color-bug-bg: #fdecec;\n --fb-color-impr: #2f6fed;\n --fb-color-impr-bg: #eaf1fe;\n --fb-color-success: #2f9e5b;\n --fb-font-sans: \"IBM Plex Sans\", system-ui, -apple-system, \"Segoe UI\", Roboto,\n Helvetica, Arial, sans-serif;\n --fb-font-mono: \"IBM Plex Mono\", ui-monospace, \"SFMono-Regular\", Menlo, Consolas,\n monospace;\n\n display: block;\n color: var(--fb-color-text);\n font-family: var(--fb-font-sans);\n font-size: 13px;\n line-height: 1.45;\n -webkit-font-smoothing: antialiased;\n}\n\n* { box-sizing: border-box; }\n\n.fb-ov-panel {\n width: 300px;\n max-width: calc(100vw - 40px);\n background: var(--fb-color-surface);\n border: 1px solid var(--fb-color-border);\n border-radius: 13px;\n box-shadow: 0 18px 44px rgba(20, 40, 70, 0.2);\n overflow: hidden;\n}\n\n.fb-ov-head {\n display: flex;\n align-items: center;\n gap: 9px;\n padding: 12px 14px;\n border-bottom: 1px solid var(--fb-color-border-soft);\n}\n.fb-ov-mark-sq {\n width: 13px;\n height: 13px;\n border-radius: 4px;\n background: var(--fb-color-accent);\n flex: none;\n}\n.fb-ov-brand { font-size: 14px; font-weight: 600; color: var(--fb-color-ink); }\n.fb-ov-tier {\n flex: none;\n font-family: var(--fb-font-mono);\n font-size: 9.5px;\n color: var(--fb-color-faint);\n border: 1px solid var(--fb-color-border-soft);\n border-radius: 5px;\n padding: 1px 6px;\n}\n/* The identity chip (ADR-0032): \"Anonymous · Sign in\", or \"<name> · <tier> · Sign out\". */\n.fb-ov-identity {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n}\n.fb-ov-ident-name {\n font-size: 11.5px;\n color: var(--fb-color-faint);\n max-width: 140px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.fb-ov-signin,\n.fb-ov-signout {\n flex: none;\n border: 1px solid var(--fb-color-border-soft);\n background: none;\n border-radius: 5px;\n padding: 1px 7px;\n font-size: 10.5px;\n color: var(--fb-color-accent);\n cursor: pointer;\n}\n.fb-ov-signin:hover,\n.fb-ov-signout:hover { border-color: var(--fb-color-accent); }\n.fb-ov-signout { color: var(--fb-color-faint); }\n.fb-ov-close {\n margin-left: auto;\n border: 0;\n background: none;\n color: var(--fb-color-faint);\n font-size: 16px;\n line-height: 1;\n padding: 2px 4px;\n cursor: pointer;\n border-radius: 6px;\n}\n.fb-ov-close:hover { color: var(--fb-color-muted); background: #f4f7fa; }\n\n.fb-ov-mark {\n margin: 12px 14px 10px;\n min-height: 52px;\n border-radius: 9px;\n border: 1px solid var(--fb-color-border-soft);\n background: repeating-linear-gradient(135deg, #f4f7fa, #f4f7fa 7px, #eaeff4 7px, #eaeff4 14px);\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n gap: 6px;\n padding: 10px 12px;\n}\n.fb-ov-selector {\n display: none;\n max-width: 100%;\n font-family: var(--fb-font-mono);\n font-size: 10px;\n color: var(--fb-color-on-emphasis);\n background: var(--fb-color-accent);\n padding: 3px 8px;\n border-radius: 5px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.fb-ov-mark.has-element .fb-ov-selector { display: inline-block; }\n.fb-ov-mark-caption { font-size: 10px; color: var(--fb-color-faint); font-family: var(--fb-font-mono); }\n\n.fb-ov-comment {\n display: block;\n width: calc(100% - 28px);\n margin: 0 14px 10px;\n min-height: 62px;\n resize: vertical;\n font-family: inherit;\n font-size: 13px;\n color: var(--fb-color-text);\n border: 1px solid var(--fb-color-border-soft);\n border-radius: 9px;\n padding: 10px 11px;\n}\n.fb-ov-comment::placeholder { color: var(--fb-color-faint); }\n.fb-ov-comment:focus-visible { outline: 2px solid var(--fb-color-accent); outline-offset: 1px; }\n\n.fb-ov-status { padding: 0 14px; font-size: 11px; min-height: 0; }\n.fb-ov-status.is-error { color: var(--fb-color-bug); }\n\n.fb-ov-tools { display: flex; align-items: center; gap: 7px; padding: 8px 14px 14px; }\n.fb-ov-pickbtn,\n.fb-ov-capturebtn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-family: inherit;\n font-size: 12px;\n color: var(--fb-color-muted);\n background: var(--fb-color-surface);\n border: 1px solid var(--fb-color-border);\n border-radius: 8px;\n padding: 8px 11px;\n cursor: pointer;\n}\n.fb-ov-capturebtn { padding: 8px 9px; }\n.fb-ov-pickbtn:hover,\n.fb-ov-capturebtn:hover { border-color: #cfd8e2; }\n.fb-ov-pickbtn.is-active,\n.fb-ov-capturebtn.is-active,\n.fb-ov-capturebtn.is-attached {\n color: var(--fb-color-accent);\n border-color: var(--fb-color-accent);\n background: var(--fb-color-impr-bg);\n}\n.fb-ov-pickbtn__glyph { font-size: 14px; line-height: 1; }\n.fb-ov-icon { display: block; }\n\n.fb-ov-send {\n margin-left: auto;\n font-family: inherit;\n font-size: 13px;\n font-weight: 600;\n color: var(--fb-color-on-emphasis);\n background: var(--fb-color-accent);\n border: 0;\n border-radius: 8px;\n padding: 9px 18px;\n cursor: pointer;\n}\n.fb-ov-send:hover { background: var(--fb-color-accent-hover); }\n.fb-ov-send:disabled { opacity: 0.6; cursor: default; }\n\n.fb-ov-done { display: none; padding: 24px 18px; text-align: center; }\n.fb-ov-panel.is-sent .fb-ov-form { display: none; }\n.fb-ov-panel.is-sent .fb-ov-done { display: block; }\n.fb-ov-done__check {\n width: 40px; height: 40px; margin: 0 auto 12px;\n border-radius: 50%;\n background: #e7f6ee; color: var(--fb-color-success);\n display: flex; align-items: center; justify-content: center;\n font-size: 20px; font-weight: 700;\n}\n.fb-ov-done__title { font-size: 15px; font-weight: 600; color: var(--fb-color-ink); }\n.fb-ov-done__sub { font-size: 12px; color: var(--fb-color-muted); margin-top: 4px; }\n\n/* The panel is hidden while any full-screen marking layer is active. */\n.fb-ov-panel.is-marking { visibility: hidden; }\n\n.fb-ov-pick,\n.fb-ov-capture,\n.fb-ov-draw { position: fixed; inset: 0; z-index: 2147483002; display: none; }\n.fb-ov-pick.is-visible,\n.fb-ov-capture.is-visible,\n.fb-ov-draw.is-visible { display: block; }\n\n/* Element-pick highlight layer — visual only, never intercepts host events. */\n.fb-ov-pick { pointer-events: none; }\n.fb-ov-highlight {\n position: absolute;\n border: 2px dashed var(--fb-color-accent);\n border-radius: 6px;\n box-shadow: 0 0 0 3px rgba(47, 111, 237, 0.14);\n transition: all 60ms ease;\n}\n.fb-ov-hint {\n position: absolute;\n top: 16px;\n left: 50%;\n transform: translateX(-50%);\n font-family: var(--fb-font-mono);\n font-size: 11px;\n color: var(--fb-color-on-emphasis);\n background: var(--fb-color-ink);\n padding: 6px 12px;\n border-radius: 7px;\n box-shadow: 0 8px 20px rgba(20, 40, 70, 0.25);\n}\n\n/* Region-capture layer — a dim wash with a live selection box. */\n.fb-ov-capture { cursor: crosshair; }\n.fb-ov-capture-dim { position: absolute; inset: 0; background: rgba(15, 23, 32, 0.28); }\n.fb-ov-capture-sel {\n position: absolute;\n border: 2px solid var(--fb-color-accent);\n border-radius: 4px;\n box-shadow: 0 0 0 100vmax rgba(15, 23, 32, 0.32);\n}\n\n/* Draw layer — the mark SVG, the region frame, the label input, and the toolbar. */\n.fb-ov-draw-svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; pointer-events: none; }\n.fb-ov-draw-frame {\n position: absolute;\n border: 1px solid rgba(47, 111, 237, 0.5);\n border-radius: 4px;\n box-shadow: 0 0 0 100vmax rgba(15, 23, 32, 0.18);\n pointer-events: none;\n}\n.fb-ov-draw-text {\n position: absolute;\n display: none;\n font-family: var(--fb-font-sans);\n font-size: 15px;\n font-weight: 600;\n color: var(--fb-color-bug);\n background: rgba(255, 255, 255, 0.92);\n border: 1px dashed var(--fb-color-bug);\n border-radius: 4px;\n padding: 2px 6px;\n outline: none;\n z-index: 3;\n}\n.fb-ov-draw-toolbar {\n position: fixed;\n left: 50%;\n bottom: 26px;\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n gap: 5px;\n background: var(--fb-color-ink);\n border-radius: 12px;\n padding: 7px;\n box-shadow: 0 16px 40px rgba(15, 40, 70, 0.4);\n}\n.fb-ov-drawtool {\n width: 34px;\n height: 34px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: #c4ccd4;\n cursor: pointer;\n font-family: inherit;\n}\n.fb-ov-drawtool:hover { background: rgba(255, 255, 255, 0.08); color: #fff; }\n.fb-ov-drawtool.is-active { background: var(--fb-color-accent); color: var(--fb-color-on-emphasis); }\n.fb-ov-drawtool__t { font-weight: 700; font-size: 14px; line-height: 1; }\n.fb-ov-draw-divider { width: 1px; height: 22px; background: #2a343e; margin: 0 3px; }\n.fb-ov-draw-undo {\n width: 34px;\n height: 34px;\n display: flex;\n align-items: center;\n justify-content: center;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: #c4ccd4;\n cursor: pointer;\n}\n.fb-ov-draw-undo:hover:not(:disabled) { background: rgba(255, 255, 255, 0.08); color: #fff; }\n.fb-ov-draw-undo:disabled { opacity: 0.4; cursor: default; }\n.fb-ov-draw-cancel {\n height: 34px;\n padding: 0 12px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: var(--fb-color-faint);\n font-family: inherit;\n font-size: 12.5px;\n cursor: pointer;\n}\n.fb-ov-draw-cancel:hover { color: #fff; }\n.fb-ov-draw-attach {\n height: 34px;\n padding: 0 15px;\n border: 0;\n border-radius: 8px;\n background: var(--fb-color-accent);\n color: var(--fb-color-on-emphasis);\n font-family: inherit;\n font-size: 12.5px;\n font-weight: 600;\n cursor: pointer;\n}\n.fb-ov-draw-attach:hover { background: var(--fb-color-accent-hover); }\n\n@media (prefers-reduced-motion: reduce) {\n .fb-ov-highlight { transition: none; }\n}\n`;\n","/**\n * The overlay's **view**: one function that builds the whole Shadow DOM tree and\n * hands back typed references to the nodes the controller drives.\n *\n * It is deliberately behaviour-free. Every control is wired to a callback from\n * {@link OverlayHandlers}, so this module never decides anything — it renders the\n * frozen Signal Reporter prototype (`docs/design/Fixback Reporter.dc.html`) and\n * nothing more, which is what keeps the markup reviewable against the design and\n * the state machine reviewable on its own (`./marking`, `./send`).\n */\n\nimport type { DrawTool } from \"../annotation\";\nimport { OVERLAY_STYLES } from \"../overlay-styles\";\nimport type { ReporterIdentity } from \"@fixback/sdk-core\";\nimport { h, OVERLAY_ATTRIBUTE, svgNode } from \"./dom\";\nimport { captureGlyph, DRAW_TOOLS, drawToolGlyph, undoGlyph } from \"./icons\";\n\n/** The nodes the overlay controller reads and mutates after building. */\nexport interface Refs {\n readonly panel: HTMLElement;\n /** The identity chip container — \"Anonymous · Sign in\" / \"<name> · <tier> · Sign out\". */\n readonly identity: HTMLElement;\n readonly mark: HTMLElement;\n readonly selector: HTMLElement;\n readonly caption: HTMLElement;\n readonly comment: HTMLTextAreaElement;\n readonly status: HTMLElement;\n readonly pickBtn: HTMLButtonElement;\n readonly captureBtn: HTMLButtonElement;\n readonly sendBtn: HTMLButtonElement;\n readonly highlight: HTMLElement;\n readonly pickLayer: HTMLElement;\n readonly captureLayer: HTMLElement;\n readonly selBox: HTMLElement;\n readonly drawLayer: HTMLElement;\n readonly drawSvg: SVGSVGElement;\n readonly drawText: HTMLInputElement;\n readonly drawFrame: HTMLElement;\n readonly drawTools: Map<DrawTool, HTMLButtonElement>;\n readonly undoBtn: HTMLButtonElement;\n}\n\n/** What each control does — supplied by the controller, never decided here. */\nexport interface OverlayHandlers {\n readonly onClose: () => void;\n readonly onTogglePick: () => void;\n readonly onBeginCapture: () => void;\n readonly onSend: () => void;\n readonly onSelectTool: (tool: DrawTool) => void;\n readonly onUndo: () => void;\n readonly onCancelDraw: () => void;\n readonly onAttachDraw: () => void;\n /** The identity chip's **Sign in** — starts a Connect (ADR-0032). */\n readonly onSignIn: () => void;\n /** The identity chip's **Sign out** — clears the Reporter session (ADR-0032). */\n readonly onSignOut: () => void;\n}\n\n/** What {@link buildOverlay} needs beyond its handlers. */\nexport interface OverlayViewConfig {\n readonly doc: Document;\n /** Where to mount the host element. Defaults to the document's `body`. */\n readonly target?: HTMLElement;\n /** The initial identity to render in the chip (ADR-0032). */\n readonly identity: ReporterIdentity;\n}\n\n/**\n * Render the identity chip's contents for the given identity (ADR-0032). Anonymous\n * shows a **Sign in** button; a connected Account shows its name, its server-derived\n * tier, and a **Sign out** button. Called on build and again whenever the identity\n * changes, so the chip stays live without re-mounting the overlay. The tier is\n * display-only — never a trust signal, never read for a decision.\n */\nexport function renderIdentityChip(\n doc: Document,\n container: HTMLElement,\n identity: ReporterIdentity,\n handlers: Pick<OverlayHandlers, \"onSignIn\" | \"onSignOut\">,\n): void {\n container.textContent = \"\";\n if (identity.status === \"connected\") {\n container.appendChild(\n h(doc, \"span\", { class: \"fb-ov-ident-name\" }, [identity.name || identity.email]),\n );\n if (identity.tier) {\n container.appendChild(\n h(doc, \"span\", {\n class: \"fb-ov-tier\",\n \"aria-label\": `Trust tier: ${identity.tier}`,\n }, [identity.tier]),\n );\n }\n const signOut = h(doc, \"button\", {\n type: \"button\",\n class: \"fb-ov-signout\",\n }, [\"Sign out\"]);\n signOut.addEventListener(\"click\", handlers.onSignOut);\n container.appendChild(signOut);\n } else {\n container.appendChild(\n h(doc, \"span\", { class: \"fb-ov-ident-name\" }, [\"Anonymous\"]),\n );\n const signIn = h(doc, \"button\", {\n type: \"button\",\n class: \"fb-ov-signin\",\n }, [\"Sign in\"]);\n signIn.addEventListener(\"click\", handlers.onSignIn);\n container.appendChild(signIn);\n }\n}\n\n/** A built overlay: its light-DOM host and the refs its controller drives. */\nexport interface OverlayView {\n readonly host: HTMLElement;\n readonly refs: Refs;\n}\n\n/**\n * Build the overlay into a fresh Shadow DOM host, append it to the target, and\n * return the host plus its refs. The host starts hidden — the controller shows it\n * on `open()`.\n */\nexport function buildOverlay(\n config: OverlayViewConfig,\n handlers: OverlayHandlers,\n): OverlayView {\n const { doc } = config;\n const host = h(doc, \"div\", { [OVERLAY_ATTRIBUTE]: \"\" });\n host.style.cssText =\n \"position:fixed;right:20px;bottom:84px;z-index:2147483001;margin:0;padding:0;border:0;display:none;\";\n const shadow = host.attachShadow({ mode: \"open\" });\n\n const style = doc.createElement(\"style\");\n style.textContent = OVERLAY_STYLES;\n shadow.appendChild(style);\n\n // Header\n const closeBtn = h(doc, \"button\", {\n type: \"button\",\n class: \"fb-ov-close\",\n \"aria-label\": \"Close\",\n }, [\"✕\"]);\n closeBtn.addEventListener(\"click\", handlers.onClose);\n // The identity chip (ADR-0032): \"Anonymous · Sign in\", or the connected Account's\n // name + server-derived tier + \"Sign out\". Populated by `renderIdentityChip` now and\n // again whenever the identity changes.\n const identity = h(doc, \"span\", { class: \"fb-ov-identity\" });\n renderIdentityChip(doc, identity, config.identity, handlers);\n const head = h(doc, \"div\", { class: \"fb-ov-head\" }, [\n h(doc, \"span\", { class: \"fb-ov-mark-sq\" }),\n h(doc, \"span\", { class: \"fb-ov-brand\" }, [\"Fixback\"]),\n identity,\n ]);\n head.appendChild(closeBtn);\n\n // Annotation marking region\n const selector = h(doc, \"span\", { class: \"fb-ov-selector\" });\n const caption = h(doc, \"span\", { class: \"fb-ov-mark-caption\" });\n const mark = h(doc, \"div\", { class: \"fb-ov-mark\" }, [selector, caption]);\n\n // Comment\n const comment = h(doc, \"textarea\", {\n class: \"fb-ov-comment\",\n placeholder: \"Describe what you saw or want…\",\n \"aria-label\": \"Comment\",\n });\n\n // Status + tools\n const status = h(doc, \"div\", {\n class: \"fb-ov-status\",\n role: \"status\",\n \"aria-live\": \"polite\",\n });\n const pickBtn = h(doc, \"button\", {\n type: \"button\",\n class: \"fb-ov-pickbtn\",\n title: \"Point at an element\",\n });\n pickBtn.addEventListener(\"click\", handlers.onTogglePick);\n const captureBtn = h(doc, \"button\", {\n type: \"button\",\n class: \"fb-ov-capturebtn\",\n title: \"Capture a region and draw\",\n \"aria-label\": \"Capture a region and draw\",\n });\n captureBtn.appendChild(captureGlyph(doc));\n captureBtn.addEventListener(\"click\", handlers.onBeginCapture);\n const sendBtn = h(doc, \"button\", { type: \"button\", class: \"fb-ov-send\" }, [\"Send\"]);\n sendBtn.addEventListener(\"click\", handlers.onSend);\n const tools = h(doc, \"div\", { class: \"fb-ov-tools\" }, [pickBtn, captureBtn, sendBtn]);\n\n const form = h(doc, \"div\", { class: \"fb-ov-form\" }, [mark, comment, status, tools]);\n\n // Confirmation\n const done = h(doc, \"div\", { class: \"fb-ov-done\" }, [\n h(doc, \"div\", { class: \"fb-ov-done__check\" }, [\"✓\"]),\n h(doc, \"div\", { class: \"fb-ov-done__title\" }, [\"Report sent\"]),\n h(doc, \"div\", { class: \"fb-ov-done__sub\" }, [\"Thanks — the team can see it now.\"]),\n ]);\n\n const panel = h(doc, \"div\", {\n class: \"fb-ov-panel\",\n role: \"dialog\",\n \"aria-label\": \"Fixback feedback\",\n }, [head, form, done]);\n\n // Element-pick highlight layer (visual only; never intercepts host events)\n const highlight = h(doc, \"div\", { class: \"fb-ov-highlight\" });\n highlight.style.display = \"none\";\n const pickLayer = h(doc, \"div\", { class: \"fb-ov-pick\" }, [\n h(doc, \"div\", { class: \"fb-ov-hint\" }, [\"Click the element you mean · Esc to cancel\"]),\n highlight,\n ]);\n\n // Region-capture layer (a dim + a live selection box)\n const selBox = h(doc, \"div\", { class: \"fb-ov-capture-sel\" });\n selBox.style.display = \"none\";\n const captureLayer = h(doc, \"div\", { class: \"fb-ov-capture\" }, [\n h(doc, \"div\", { class: \"fb-ov-capture-dim\" }),\n h(doc, \"div\", { class: \"fb-ov-hint\" }, [\"Drag to capture an area · Esc to cancel\"]),\n selBox,\n ]);\n\n // Draw layer: the mark SVG, the label input, the region frame, and the toolbar.\n const drawSvg = svgNode(doc, \"svg\", {\n class: \"fb-ov-draw-svg\",\n width: \"100%\",\n height: \"100%\",\n }) as SVGSVGElement;\n const drawText = h(doc, \"input\", {\n class: \"fb-ov-draw-text\",\n placeholder: \"label…\",\n \"aria-label\": \"Mark label\",\n });\n drawText.style.display = \"none\";\n const drawFrame = h(doc, \"div\", { class: \"fb-ov-draw-frame\" });\n\n const drawTools = new Map<DrawTool, HTMLButtonElement>();\n const toolButtons: HTMLButtonElement[] = [];\n for (const { tool, label } of DRAW_TOOLS) {\n const button = h(doc, \"button\", {\n type: \"button\",\n class: \"fb-ov-drawtool\",\n \"data-tool\": tool,\n title: label,\n \"aria-label\": label,\n });\n button.appendChild(drawToolGlyph(doc, tool));\n button.addEventListener(\"click\", () => handlers.onSelectTool(tool));\n drawTools.set(tool, button);\n toolButtons.push(button);\n }\n const undoBtn = h(doc, \"button\", {\n type: \"button\",\n class: \"fb-ov-draw-undo\",\n title: \"Undo\",\n \"aria-label\": \"Undo\",\n });\n undoBtn.appendChild(undoGlyph(doc));\n undoBtn.addEventListener(\"click\", handlers.onUndo);\n const cancelDrawBtn = h(doc, \"button\", {\n type: \"button\",\n class: \"fb-ov-draw-cancel\",\n }, [\"Cancel\"]);\n cancelDrawBtn.addEventListener(\"click\", handlers.onCancelDraw);\n const attachBtn = h(doc, \"button\", {\n type: \"button\",\n class: \"fb-ov-draw-attach\",\n }, [\"Attach\"]);\n attachBtn.addEventListener(\"click\", handlers.onAttachDraw);\n const drawToolbar = h(doc, \"div\", { class: \"fb-ov-draw-toolbar\" }, [\n ...toolButtons,\n h(doc, \"span\", { class: \"fb-ov-draw-divider\" }),\n undoBtn,\n cancelDrawBtn,\n attachBtn,\n ]);\n const drawLayer = h(doc, \"div\", { class: \"fb-ov-draw\" }, [\n drawFrame,\n drawSvg,\n drawText,\n drawToolbar,\n ]);\n\n shadow.append(panel, pickLayer, captureLayer, drawLayer);\n (config.target ?? doc.body).appendChild(host);\n\n return {\n host,\n refs: {\n panel,\n identity,\n mark,\n selector,\n caption,\n comment,\n status,\n pickBtn,\n captureBtn,\n sendBtn,\n highlight,\n pickLayer,\n captureLayer,\n selBox,\n drawLayer,\n drawSvg,\n drawText,\n drawFrame,\n drawTools,\n undoBtn,\n },\n };\n}\n","/**\n * The report **overlay** — the on-page panel a Reporter files a report from, built\n * to the frozen Signal Reporter prototype (`docs/design/Fixback Reporter.dc.html`).\n *\n * This module is the wiring: it mounts the view lazily inside its own Shadow DOM\n * (isolated from the host page, and marked so the replay recorder and\n * element-picker skip it), opens on the launcher's `fixback:launch` seam, and joins\n * the three parts that do the work:\n *\n * - `./overlay/view` builds the markup and hands back typed refs;\n * - `./overlay/marking` runs the three composable marking layers (element-pick,\n * region-capture, draw) and owns what has been marked;\n * - `./overlay/send` assembles, scrubs, and submits.\n *\n * What is left here is the panel's own state: open/closed, the compose → sending →\n * sent phase, the status line, and the confirmation's auto-close. The marks are\n * viewport-space vectors composited at view time (spec §D), never baked into an\n * image; the still they annotate is a frame of the buffered rrweb window\n * (reconstructed downstream since ADR-0027), so the SDK rasterises nothing.\n */\n\nimport type {\n BeforeSend,\n IdentityInputs,\n ProjectGate,\n ReporterIdentity,\n} from \"@fixback/sdk-core\";\n\nimport { startElementPicker } from \"./element-picker\";\nimport {\n createMarkingController,\n type MarkingController,\n type StartPickerFn,\n} from \"./overlay/marking\";\nimport { pickGlyph } from \"./overlay/icons\";\nimport {\n sendReport,\n type BreadcrumbSource,\n type SubmitReportFn,\n} from \"./overlay/send\";\nimport { buildOverlay, type Refs, renderIdentityChip } from \"./overlay/view\";\nimport type { ReplaySnapshot, ReplaySource } from \"./replay\";\nimport { submitReport } from \"./submit\";\nimport { SDK_VERSION } from \"./version\";\n\nexport { OVERLAY_ATTRIBUTE } from \"./overlay/dom\";\nexport type { BreadcrumbSource } from \"./overlay/send\";\n\n/** How long the confirmation shows before the overlay closes itself. */\nconst AUTO_CLOSE_MS = 1800;\n\n/** Injectable collaborators, defaulted to the real implementations. */\nexport interface OverlayDeps {\n readonly submitReport: SubmitReportFn;\n readonly startElementPicker: StartPickerFn;\n}\n\n/** Configuration for {@link createOverlay}. */\nexport interface OverlayConfig {\n readonly apiUrl: string;\n readonly key: string;\n /** Identity evidence, read **live** at send time (ADR-0032) — see {@link MountContext}. */\n readonly getIdentity?: () => IdentityInputs;\n /**\n * The Project's Gate, forwarded verbatim from the boot answer. Reserved for\n * Gate-aware launcher / redemption behaviour (spec §A/§F); the overlay itself\n * does not read it yet, but `init` plumbs it through here (ticket #85 / §G).\n */\n readonly gate?: ProjectGate;\n /**\n * The current Reporter identity — anonymous, or a connected Account with its\n * server-derived tier — rendered in the header's identity chip (ADR-0032). Updated in\n * place via {@link OverlayController.setIdentity} after a Connect or sign-out.\n */\n readonly reporterIdentity: ReporterIdentity;\n /** Start a Connect from the chip's **Sign in** (ADR-0032). */\n readonly onSignIn: () => void;\n /** Clear the Reporter session from the chip's **Sign out** (ADR-0032). */\n readonly onSignOut: () => void;\n readonly sdkVersion?: string;\n /** The host app's Release (#117, ADR-0024), validated by `init`; rides in the environment. */\n readonly release?: string;\n /** The deploy environment (`production` / `staging` / …), stamped on every report. */\n readonly deployEnvironment?: string;\n /** Where to mount the overlay host. Defaults to `document.body`. */\n readonly target?: HTMLElement;\n readonly doc?: Document;\n readonly win?: Window;\n readonly deps?: Partial<OverlayDeps>;\n /** The trace buffer whose snapshot rides on each report (spec §C). */\n readonly buffer?: BreadcrumbSource | null;\n /** The replay recorder whose buffered window rides on each report (ADR-0024). */\n readonly replay?: ReplaySource | null;\n /** Per-project client scrub hook, run at the `beforeSend` choke point. */\n readonly beforeSend?: BeforeSend;\n /** Run the built-in default scrubbers. Defaults to `true` (private-by-default). */\n readonly scrub?: boolean;\n}\n\n/** A mounted overlay the launcher opens. */\nexport interface OverlayController {\n open(): void;\n close(): void;\n destroy(): void;\n /** Update the identity chip in place after a Connect or sign-out (ADR-0032). */\n setIdentity(identity: ReporterIdentity): void;\n readonly isOpen: boolean;\n}\n\n/** Create the report overlay. See the module doc. */\nexport function createOverlay(config: OverlayConfig): OverlayController {\n const doc = config.doc ?? document;\n const win = config.win ?? doc.defaultView ?? window;\n const sdkVersion = config.sdkVersion ?? SDK_VERSION;\n const deps: OverlayDeps = {\n submitReport: config.deps?.submitReport ?? submitReport,\n startElementPicker: config.deps?.startElementPicker ?? startElementPicker,\n };\n\n let host: HTMLElement | null = null;\n let refs: Refs | null = null;\n let marking: MarkingController | null = null;\n /** The identity currently shown in the chip; updated in place by `setIdentity`. */\n let currentIdentity: ReporterIdentity = config.reporterIdentity;\n let autoClose: ReturnType<typeof setTimeout> | null = null;\n let open = false;\n /**\n * The replay window frozen when the overlay opened (ADR-0024): the recorder\n * keeps rotating its buckets while the Reporter composes, so the window that\n * ships is the lead-up to *opening* the overlay — the bug — not to Send.\n */\n let openedReplay: ReplaySnapshot | null = null;\n let phase: \"compose\" | \"sending\" | \"sent\" = \"compose\";\n\n function setStatus(message: string, isError: boolean): void {\n if (!refs) return;\n refs.status.textContent = message;\n refs.status.classList.toggle(\"is-error\", isError);\n }\n\n /** Reflect the current marking state in the compose panel's mark region. */\n function renderMarking(): void {\n if (!refs || !marking) return;\n const { selectedElement, region, marks } = marking.state();\n const markCount = marks.length;\n\n refs.mark.classList.toggle(\"has-element\", !!selectedElement);\n refs.selector.textContent = selectedElement ? selectedElement.selector : \"\";\n\n refs.pickBtn.textContent = \"\";\n refs.pickBtn.append(\n pickGlyph(doc),\n doc.createTextNode(selectedElement ? \"Change element\" : \"Pick element\"),\n );\n refs.captureBtn.classList.toggle(\"is-attached\", !!region || markCount > 0);\n\n const bits: string[] = [];\n if (selectedElement) bits.push(\"Element\");\n if (region) bits.push(\"Region\");\n if (markCount > 0) bits.push(`${markCount} mark${markCount === 1 ? \"\" : \"s\"}`);\n refs.caption.textContent = bits.length\n ? `${bits.join(\" · \")} · masked session replay on Send`\n : \"Masked session replay attached on Send\";\n }\n\n function clearAutoClose(): void {\n if (autoClose !== null) {\n clearTimeout(autoClose);\n autoClose = null;\n }\n }\n\n function resetSendControl(): void {\n phase = \"compose\";\n if (!refs) return;\n refs.sendBtn.disabled = false;\n refs.sendBtn.textContent = \"Send\";\n }\n\n /** Show the confirmation, then close on its own — a delivered or dropped report. */\n function confirmSent(): void {\n phase = \"sent\";\n refs?.panel.classList.add(\"is-sent\");\n autoClose = setTimeout(close, AUTO_CLOSE_MS);\n }\n\n async function send(): Promise<void> {\n if (!refs || !marking || phase === \"sending\") return;\n marking.closeAll();\n phase = \"sending\";\n refs.sendBtn.disabled = true;\n refs.sendBtn.textContent = \"Sending…\";\n setStatus(\"\", false);\n try {\n const outcome = await sendReport(\n {\n apiUrl: config.apiUrl,\n key: config.key,\n identity: config.getIdentity?.(),\n sdkVersion,\n release: config.release,\n deployEnvironment: config.deployEnvironment,\n win,\n buffer: config.buffer,\n replay: config.replay,\n beforeSend: config.beforeSend,\n scrub: config.scrub,\n submitReport: deps.submitReport,\n },\n {\n comment: refs.comment.value,\n marking: marking.state(),\n openedReplay,\n },\n );\n // A `beforeSend` that dropped the report is an intentional non-send: the\n // Reporter did nothing wrong, so it confirms exactly like a delivered one.\n if (outcome.kind === \"dropped\" || outcome.result.ok) {\n confirmSent();\n return;\n }\n resetSendControl();\n setStatus(\n outcome.result.reason === \"unreachable\"\n ? \"Couldn't reach Fixback — try again.\"\n : \"Fixback couldn't accept this report.\",\n true,\n );\n } catch {\n resetSendControl();\n setStatus(\"Something went wrong — try again.\", true);\n }\n }\n\n function ensureBuilt(): void {\n if (host && refs && marking) return;\n const view = buildOverlay(\n { doc, target: config.target, identity: currentIdentity },\n {\n onClose: close,\n onTogglePick: () => {\n if (phase !== \"sending\") marking?.togglePick();\n },\n onBeginCapture: () => {\n if (phase !== \"sending\") marking?.beginCapture();\n },\n onSend: () => void send(),\n onSelectTool: (tool) => marking?.setTool(tool),\n onUndo: () => marking?.undo(),\n onCancelDraw: () => marking?.cancelDraw(),\n onAttachDraw: () => marking?.attachDraw(),\n onSignIn: config.onSignIn,\n onSignOut: config.onSignOut,\n },\n );\n host = view.host;\n refs = view.refs;\n marking = createMarkingController({\n doc,\n refs: view.refs,\n startElementPicker: deps.startElementPicker,\n onChange: renderMarking,\n });\n }\n\n function openOverlay(): void {\n ensureBuilt();\n if (!host || !refs || !marking) return;\n clearAutoClose();\n marking.closeAll();\n // Freeze the replay window NOW (ADR-0024): opening the overlay is the\n // moment closest to the bug, and the recorder's buckets keep rotating while\n // the Reporter composes — a snapshot at Send would show the composition,\n // not the lead-up. The SDK's own chrome is blocked from the recording\n // either way; this pins *when* the window ends.\n openedReplay = config.replay?.snapshot() ?? null;\n marking.reset();\n refs.panel.classList.remove(\"is-sent\");\n refs.comment.value = \"\";\n resetSendControl();\n setStatus(\"\", false);\n renderMarking();\n host.style.display = \"block\";\n open = true;\n try {\n refs.comment.focus();\n } catch {\n /* focus is best-effort — never let it throw into the host page */\n }\n }\n\n function close(): void {\n clearAutoClose();\n marking?.closeAll();\n if (host) host.style.display = \"none\";\n open = false;\n openedReplay = null;\n }\n\n function destroy(): void {\n clearAutoClose();\n marking?.closeAll();\n host?.remove();\n host = null;\n refs = null;\n marking = null;\n open = false;\n }\n\n /** Re-render the identity chip in place, without disturbing the rest of the overlay. */\n function setIdentity(identity: ReporterIdentity): void {\n currentIdentity = identity;\n if (refs) {\n renderIdentityChip(doc, refs.identity, identity, {\n onSignIn: config.onSignIn,\n onSignOut: config.onSignOut,\n });\n }\n }\n\n return {\n open: openOverlay,\n close,\n destroy,\n setIdentity,\n get isOpen() {\n return open;\n },\n };\n}\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nvar _a;\nvar EventType = /* @__PURE__ */ ((EventType2) => {\n EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n EventType2[EventType2[\"Asset\"] = 7] = \"Asset\";\n return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n IncrementalSource2[IncrementalSource2[\"CustomElement\"] = 16] = \"CustomElement\";\n return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n return MouseInteractions2;\n})(MouseInteractions || {});\nvar PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {\n PointerTypes2[PointerTypes2[\"Mouse\"] = 0] = \"Mouse\";\n PointerTypes2[PointerTypes2[\"Pen\"] = 1] = \"Pen\";\n PointerTypes2[PointerTypes2[\"Touch\"] = 2] = \"Touch\";\n return PointerTypes2;\n})(PointerTypes || {});\nvar CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n return CanvasContext2;\n})(CanvasContext || {});\nvar MediaInteractions = /* @__PURE__ */ ((MediaInteractions2) => {\n MediaInteractions2[MediaInteractions2[\"Play\"] = 0] = \"Play\";\n MediaInteractions2[MediaInteractions2[\"Pause\"] = 1] = \"Pause\";\n MediaInteractions2[MediaInteractions2[\"Seeked\"] = 2] = \"Seeked\";\n MediaInteractions2[MediaInteractions2[\"VolumeChange\"] = 3] = \"VolumeChange\";\n MediaInteractions2[MediaInteractions2[\"RateChange\"] = 4] = \"RateChange\";\n return MediaInteractions2;\n})(MediaInteractions || {});\nvar NodeType = /* @__PURE__ */ ((NodeType2) => {\n NodeType2[NodeType2[\"Document\"] = 0] = \"Document\";\n NodeType2[NodeType2[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType2[NodeType2[\"Element\"] = 2] = \"Element\";\n NodeType2[NodeType2[\"Text\"] = 3] = \"Text\";\n NodeType2[NodeType2[\"CDATA\"] = 4] = \"CDATA\";\n NodeType2[NodeType2[\"Comment\"] = 5] = \"Comment\";\n return NodeType2;\n})(NodeType || {});\nconst testableAccessors = {\n Node: [\n \"childNodes\",\n \"parentNode\",\n \"parentElement\",\n \"textContent\",\n \"ownerDocument\"\n ],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nconst untaintedBaseIframeCleanup = {};\nconst isAngularZonePresent = () => {\n return !!globalThis.Zone;\n};\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const defaultObj = globalThis[key];\n const defaultPrototype = defaultObj.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a2, _b;\n return Boolean(\n (_b = (_a2 = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a2.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a2;\n return typeof defaultPrototype[method] === \"function\" && ((_a2 = defaultPrototype[method]) == null ? void 0 : _a2.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods && !isAngularZonePresent()) {\n untaintedBasePrototype[key] = defaultObj.prototype;\n return defaultObj.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n iframeEl.style.display = \"none\";\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return defaultObj.prototype;\n const untaintedObject = win[key].prototype;\n if (!untaintedObject) {\n iframeEl.remove();\n return defaultPrototype;\n }\n const ua = navigator.userAgent;\n if (ua.includes(\"Safari\") && !ua.includes(\"Chrome\")) {\n iframeEl.classList.add(\"rr-block\");\n iframeEl.setAttribute(\"__rrwebUntaintedMutationObserver\", \"\");\n untaintedBaseIframeCleanup[key] = () => iframeEl.remove();\n } else {\n iframeEl.remove();\n }\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a2;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a2 = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a2.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction ownerDocument(n) {\n return getUntaintedAccessor(\"Node\", n, \"ownerDocument\");\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return [\n getUntaintedPrototype(\"MutationObserver\").constructor,\n untaintedBaseIframeCleanup[\"MutationObserver\"] ?? (() => {\n })\n ];\n}\nlet nowTimestamp = Date.now;\nif (!/* @__PURE__ */ /[1-9][0-9]{12}/.test(Date.now().toString())) {\n nowTimestamp = () => (/* @__PURE__ */ new Date()).getTime();\n}\nfunction patch(source, name, replacement) {\n try {\n if (!(name in source)) {\n return () => {\n };\n }\n const original = source[name];\n const wrapped = replacement(original);\n if (typeof wrapped === \"function\") {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __rrweb_original__: {\n enumerable: false,\n value: original\n }\n });\n }\n source[name] = wrapped;\n return () => {\n source[name] = original;\n };\n } catch {\n return () => {\n };\n }\n}\nconst index = {\n ownerDocument,\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n nowTimestamp,\n mutationObserverCtor,\n patch\n};\nfunction isElement(n) {\n return n.nodeType === n.ELEMENT_NODE;\n}\nfunction isShadowRoot(n) {\n const hostEl = (\n // anchor and textarea elements also have a `host` property\n // but only shadow roots have a `mode` property\n n && \"host\" in n && \"mode\" in n && index.host(n) || null\n );\n return Boolean(\n hostEl && \"shadowRoot\" in hostEl && index.shadowRoot(hostEl) === n\n );\n}\nfunction isNativeShadowDom(shadowRoot2) {\n return Object.prototype.toString.call(shadowRoot2) === \"[object ShadowRoot]\";\n}\nfunction fixBrowserCompatibilityIssuesInCSS(cssText) {\n if (cssText.includes(\" background-clip: text;\") && !cssText.includes(\" -webkit-background-clip: text;\")) {\n cssText = cssText.replace(\n /\\sbackground-clip:\\s*text;/g,\n \" -webkit-background-clip: text; background-clip: text;\"\n );\n }\n return cssText;\n}\nfunction escapeImportStatement(rule) {\n const { cssText } = rule;\n if (cssText.split('\"').length < 3) return cssText;\n const statement = [\"@import\", `url(${JSON.stringify(rule.href)})`];\n if (rule.layerName === \"\") {\n statement.push(`layer`);\n } else if (rule.layerName) {\n statement.push(`layer(${rule.layerName})`);\n }\n if (rule.supportsText) {\n statement.push(`supports(${rule.supportsText})`);\n }\n if (rule.media.length) {\n statement.push(rule.media.mediaText);\n }\n return statement.join(\" \") + \";\";\n}\nfunction stringifyStylesheet(s) {\n try {\n const rules = s.rules || s.cssRules;\n if (!rules) {\n return null;\n }\n let sheetHref = s.href;\n if (!sheetHref && s.ownerNode) {\n sheetHref = s.ownerNode.baseURI;\n }\n const stringifiedRules = Array.from(\n rules,\n (rule) => stringifyRule(rule, sheetHref)\n ).join(\"\");\n return fixBrowserCompatibilityIssuesInCSS(stringifiedRules);\n } catch (error) {\n return null;\n }\n}\nfunction stringifyRule(rule, sheetHref) {\n if (isCSSImportRule(rule)) {\n let importStringified;\n try {\n importStringified = // for same-origin stylesheets,\n // we can access the imported stylesheet rules directly\n stringifyStylesheet(rule.styleSheet) || // work around browser issues with the raw string `@import url(...)` statement\n escapeImportStatement(rule);\n } catch (error) {\n importStringified = rule.cssText;\n }\n if (rule.styleSheet.href) {\n return absolutifyURLs(importStringified, rule.styleSheet.href);\n }\n return importStringified;\n } else {\n let ruleStringified = rule.cssText;\n if (isCSSStyleRule(rule) && rule.selectorText.includes(\":\")) {\n ruleStringified = fixSafariColons(ruleStringified);\n }\n if (sheetHref) {\n return absolutifyURLs(ruleStringified, sheetHref);\n }\n return ruleStringified;\n }\n}\nfunction fixSafariColons(cssStringified) {\n const regex = /(\\[(?:[\\w-]+)[^\\\\])(:(?:[\\w-]+)\\])/gm;\n return cssStringified.replace(regex, \"$1\\\\$2\");\n}\nfunction isCSSImportRule(rule) {\n return \"styleSheet\" in rule;\n}\nfunction isCSSStyleRule(rule) {\n return \"selectorText\" in rule;\n}\nclass Mirror {\n constructor() {\n __publicField(this, \"idNodeMap\", /* @__PURE__ */ new Map());\n __publicField(this, \"nodeMetaMap\", /* @__PURE__ */ new WeakMap());\n }\n getId(n) {\n var _a2;\n if (!n) return -1;\n const id = (_a2 = this.getMeta(n)) == null ? void 0 : _a2.id;\n return id ?? -1;\n }\n getNode(id) {\n return this.idNodeMap.get(id) || null;\n }\n getIds() {\n return Array.from(this.idNodeMap.keys());\n }\n getMeta(n) {\n return this.nodeMetaMap.get(n) || null;\n }\n // removes the node from idNodeMap\n // doesn't remove the node from nodeMetaMap\n removeNodeFromMap(n) {\n const id = this.getId(n);\n this.idNodeMap.delete(id);\n if (n.childNodes) {\n n.childNodes.forEach(\n (childNode) => this.removeNodeFromMap(childNode)\n );\n }\n }\n has(id) {\n return this.idNodeMap.has(id);\n }\n hasNode(node) {\n return this.nodeMetaMap.has(node);\n }\n add(n, meta) {\n const id = meta.id;\n this.idNodeMap.set(id, n);\n this.nodeMetaMap.set(n, meta);\n }\n replace(id, n) {\n const oldNode = this.getNode(id);\n if (oldNode) {\n const meta = this.nodeMetaMap.get(oldNode);\n if (meta) this.nodeMetaMap.set(n, meta);\n }\n this.idNodeMap.set(id, n);\n }\n reset() {\n this.idNodeMap = /* @__PURE__ */ new Map();\n this.nodeMetaMap = /* @__PURE__ */ new WeakMap();\n }\n}\nfunction createMirror() {\n return new Mirror();\n}\nfunction maskInputValue({\n element,\n maskInputOptions,\n tagName,\n type,\n value,\n maskInputFn\n}) {\n let text = value || \"\";\n const actualType = type && toLowerCase(type);\n if (maskInputOptions[tagName.toLowerCase()] || actualType && maskInputOptions[actualType]) {\n if (maskInputFn) {\n text = maskInputFn(text, element);\n } else {\n text = \"*\".repeat(text.length);\n }\n }\n return text;\n}\nfunction toLowerCase(str) {\n return str.toLowerCase();\n}\nconst ORIGINAL_ATTRIBUTE_NAME = \"__rrweb_original__\";\nfunction is2DCanvasBlank(canvas) {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return true;\n const chunkSize = 50;\n for (let x = 0; x < canvas.width; x += chunkSize) {\n for (let y = 0; y < canvas.height; y += chunkSize) {\n const getImageData = ctx.getImageData;\n const originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData ? getImageData[ORIGINAL_ATTRIBUTE_NAME] : getImageData;\n const pixelBuffer = new Uint32Array(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access\n originalGetImageData.call(\n ctx,\n x,\n y,\n Math.min(chunkSize, canvas.width - x),\n Math.min(chunkSize, canvas.height - y)\n ).data.buffer\n );\n if (pixelBuffer.some((pixel) => pixel !== 0)) return false;\n }\n }\n return true;\n}\nfunction getInputType(element) {\n const type = element.type;\n return element.hasAttribute(\"data-rr-is-password\") ? \"password\" : type ? (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n toLowerCase(type)\n ) : null;\n}\nfunction extractFileExtension(path, baseURL) {\n let url;\n try {\n url = new URL(path, baseURL ?? window.location.href);\n } catch (err) {\n return null;\n }\n const regex = /\\.([0-9a-z]+)(?:$)/i;\n const match = url.pathname.match(regex);\n return (match == null ? void 0 : match[1]) ?? null;\n}\nfunction extractOrigin(url) {\n let origin = \"\";\n if (url.indexOf(\"//\") > -1) {\n origin = url.split(\"/\").slice(0, 3).join(\"/\");\n } else {\n origin = url.split(\"/\")[0];\n }\n origin = origin.split(\"?\")[0];\n return origin;\n}\nconst URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\nconst URL_PROTOCOL_MATCH = /^(?:[a-z+]+:)?\\/\\//i;\nconst URL_WWW_MATCH = /^www\\..*/i;\nconst DATA_URI = /^(data:)([^,]*),(.*)/i;\nfunction absolutifyURLs(cssText, href) {\n return (cssText || \"\").replace(\n URL_IN_CSS_REF,\n (origin, quote1, path1, quote2, path2, path3) => {\n const filePath = path1 || path2 || path3;\n const maybeQuote = quote1 || quote2 || \"\";\n if (!filePath) {\n return origin;\n }\n if (URL_PROTOCOL_MATCH.test(filePath) || URL_WWW_MATCH.test(filePath)) {\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\n }\n if (DATA_URI.test(filePath)) {\n return `url(${maybeQuote}${filePath}${maybeQuote})`;\n }\n if (filePath[0] === \"/\") {\n return `url(${maybeQuote}${extractOrigin(href) + filePath}${maybeQuote})`;\n }\n const filePathNoHash = filePath.split(\"#\")[0];\n const maybeHash = filePath.substring(filePathNoHash.length);\n const stack = href.split(\"#\")[0].split(\"/\");\n const parts = filePathNoHash.split(\"/\");\n stack.pop();\n for (const part of parts) {\n if (part === \".\") {\n continue;\n } else if (part === \"..\") {\n stack.pop();\n } else {\n stack.push(part);\n }\n }\n return `url(${maybeQuote}${stack.join(\"/\")}${maybeHash}${maybeQuote})`;\n }\n );\n}\nfunction normalizeCssString(cssText, _testNoPxNorm = false) {\n if (_testNoPxNorm) {\n return cssText.replace(/(\\/\\*[^*]*\\*\\/)|[\\s;]/g, \"\");\n } else {\n return cssText.replace(/(\\/\\*[^*]*\\*\\/)|[\\s;]/g, \"\").replace(/0px/g, \"0\");\n }\n}\nfunction splitCssText(cssText, style, _testNoPxNorm = false) {\n const childNodes2 = Array.from(style.childNodes);\n const splits = [];\n let iterCount = 0;\n if (childNodes2.length > 1 && cssText && typeof cssText === \"string\") {\n let cssTextNorm = normalizeCssString(cssText, _testNoPxNorm);\n const normFactor = cssTextNorm.length / cssText.length;\n for (let i = 1; i < childNodes2.length; i++) {\n if (childNodes2[i].textContent && typeof childNodes2[i].textContent === \"string\") {\n const textContentNorm = normalizeCssString(\n childNodes2[i].textContent,\n _testNoPxNorm\n );\n const jLimit = 100;\n let j = 3;\n for (; j < textContentNorm.length; j++) {\n if (\n // keep consuming css identifiers (to get a decent chunk more quickly)\n textContentNorm[j].match(/[a-zA-Z0-9]/) || // substring needs to be unique to this section\n textContentNorm.indexOf(textContentNorm.substring(0, j), 1) !== -1\n ) {\n continue;\n }\n break;\n }\n for (; j < textContentNorm.length; j++) {\n let startSubstring = textContentNorm.substring(0, j);\n let cssNormSplits = cssTextNorm.split(startSubstring);\n let splitNorm = -1;\n if (cssNormSplits.length === 2) {\n splitNorm = cssNormSplits[0].length;\n } else if (cssNormSplits.length > 2 && cssNormSplits[0] === \"\" && childNodes2[i - 1].textContent !== \"\") {\n splitNorm = cssTextNorm.indexOf(startSubstring, 1);\n } else if (cssNormSplits.length === 1) {\n startSubstring = startSubstring.substring(\n 0,\n startSubstring.length - 1\n );\n cssNormSplits = cssTextNorm.split(startSubstring);\n if (cssNormSplits.length <= 1) {\n splits.push(cssText);\n return splits;\n }\n j = jLimit + 1;\n } else if (j === textContentNorm.length - 1) {\n splitNorm = cssTextNorm.indexOf(startSubstring);\n }\n if (cssNormSplits.length >= 2 && j > jLimit) {\n const prevTextContent = childNodes2[i - 1].textContent;\n if (prevTextContent && typeof prevTextContent === \"string\") {\n const prevMinLength = normalizeCssString(prevTextContent).length;\n splitNorm = cssTextNorm.indexOf(startSubstring, prevMinLength);\n }\n if (splitNorm === -1) {\n splitNorm = cssNormSplits[0].length;\n }\n }\n if (splitNorm !== -1) {\n let k = Math.floor(splitNorm / normFactor);\n for (; k > 0 && k < cssText.length; ) {\n iterCount += 1;\n if (iterCount > 50 * childNodes2.length) {\n splits.push(cssText);\n return splits;\n }\n const normPart = normalizeCssString(\n cssText.substring(0, k),\n _testNoPxNorm\n );\n if (normPart.length === splitNorm) {\n splits.push(cssText.substring(0, k));\n cssText = cssText.substring(k);\n cssTextNorm = cssTextNorm.substring(splitNorm);\n break;\n } else if (normPart.length < splitNorm) {\n k += Math.max(\n 1,\n Math.floor((splitNorm - normPart.length) / normFactor)\n );\n } else {\n k -= Math.max(\n 1,\n Math.floor((normPart.length - splitNorm) * normFactor)\n );\n }\n }\n break;\n }\n }\n }\n }\n }\n splits.push(cssText);\n return splits;\n}\nfunction markCssSplits(cssText, style) {\n return splitCssText(cssText, style).join(\"/* rr_split */\");\n}\nlet _id = 1;\nconst tagNameRegex = new RegExp(\"[^a-z0-9-_:]\");\nconst IGNORED_NODE = -2;\nfunction genId() {\n return _id++;\n}\nfunction getValidTagName(element) {\n if (element instanceof HTMLFormElement) {\n return \"form\";\n }\n const processedTagName = toLowerCase(element.tagName);\n if (tagNameRegex.test(processedTagName)) {\n return \"div\";\n }\n return processedTagName;\n}\nlet canvasService;\nlet canvasCtx;\nconst SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\nconst SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\n if (attributeValue.trim() === \"\") {\n return attributeValue;\n }\n let pos = 0;\n function collectCharacters(regEx) {\n let chars2;\n const match = regEx.exec(attributeValue.substring(pos));\n if (match) {\n chars2 = match[0];\n pos += chars2.length;\n return chars2;\n }\n return \"\";\n }\n const output = [];\n while (true) {\n collectCharacters(SRCSET_COMMAS_OR_SPACES);\n if (pos >= attributeValue.length) {\n break;\n }\n let url = collectCharacters(SRCSET_NOT_SPACES);\n if (url.slice(-1) === \",\") {\n url = absoluteToDoc(doc, url.substring(0, url.length - 1));\n output.push(url);\n } else {\n let descriptorsStr = \"\";\n url = absoluteToDoc(doc, url);\n let inParens = false;\n while (true) {\n const c = attributeValue.charAt(pos);\n if (c === \"\") {\n output.push((url + descriptorsStr).trim());\n break;\n } else if (!inParens) {\n if (c === \",\") {\n pos += 1;\n output.push((url + descriptorsStr).trim());\n break;\n } else if (c === \"(\") {\n inParens = true;\n }\n } else {\n if (c === \")\") {\n inParens = false;\n }\n }\n descriptorsStr += c;\n pos += 1;\n }\n }\n }\n return output.join(\", \");\n}\nconst cachedDocument = /* @__PURE__ */ new WeakMap();\nfunction absoluteToDoc(doc, attributeValue) {\n if (!attributeValue || attributeValue.trim() === \"\") {\n return attributeValue;\n }\n return getHref(doc, attributeValue);\n}\nfunction isSVGElement(el) {\n return Boolean(el.tagName === \"svg\" || el.ownerSVGElement);\n}\nfunction getHref(doc, customHref) {\n let a = cachedDocument.get(doc);\n if (!a) {\n a = doc.createElement(\"a\");\n cachedDocument.set(doc, a);\n }\n if (!customHref) {\n customHref = \"\";\n } else if (customHref.startsWith(\"blob:\") || customHref.startsWith(\"data:\")) {\n return customHref;\n }\n a.setAttribute(\"href\", customHref);\n return a.href;\n}\nfunction transformAttribute(doc, tagName, name, value) {\n if (!value) {\n return value;\n }\n if (name === \"src\" || name === \"href\" && !(tagName === \"use\" && value[0] === \"#\")) {\n return absoluteToDoc(doc, value);\n } else if (name === \"xlink:href\" && value[0] !== \"#\") {\n return absoluteToDoc(doc, value);\n } else if (name === \"background\" && [\"table\", \"td\", \"th\"].includes(tagName)) {\n return absoluteToDoc(doc, value);\n } else if (name === \"srcset\") {\n return getAbsoluteSrcsetString(doc, value);\n } else if (name === \"style\") {\n return absolutifyURLs(value, getHref(doc));\n } else if (tagName === \"object\" && name === \"data\") {\n return absoluteToDoc(doc, value);\n }\n return value;\n}\nfunction ignoreAttribute(tagName, name, _value) {\n return [\"video\", \"audio\"].includes(tagName) && name === \"autoplay\";\n}\nfunction _isBlockedElement(element, blockClass, blockSelector) {\n try {\n if (typeof blockClass === \"string\") {\n if (element.classList.contains(blockClass)) {\n return true;\n }\n } else {\n for (let eIndex = element.classList.length; eIndex--; ) {\n const className = element.classList[eIndex];\n if (blockClass.test(className)) {\n return true;\n }\n }\n }\n if (blockSelector) {\n return element.matches(blockSelector);\n }\n } catch (e) {\n }\n return false;\n}\nfunction classMatchesRegex(node, regex, checkAncestors) {\n if (!node) return false;\n if (node.nodeType !== node.ELEMENT_NODE) {\n if (!checkAncestors) return false;\n return classMatchesRegex(index.parentNode(node), regex, checkAncestors);\n }\n for (let eIndex = node.classList.length; eIndex--; ) {\n const className = node.classList[eIndex];\n if (regex.test(className)) {\n return true;\n }\n }\n if (!checkAncestors) return false;\n return classMatchesRegex(index.parentNode(node), regex, checkAncestors);\n}\nfunction needMaskingText(node, maskTextClass, maskTextSelector, checkAncestors) {\n let el;\n if (isElement(node)) {\n el = node;\n if (!index.childNodes(el).length) {\n return false;\n }\n } else if (index.parentElement(node) === null) {\n return false;\n } else {\n el = index.parentElement(node);\n }\n try {\n if (typeof maskTextClass === \"string\") {\n if (checkAncestors) {\n if (el.closest(`.${maskTextClass}`)) return true;\n } else {\n if (el.classList.contains(maskTextClass)) return true;\n }\n } else {\n if (classMatchesRegex(el, maskTextClass, checkAncestors)) return true;\n }\n if (maskTextSelector) {\n if (checkAncestors) {\n if (el.closest(maskTextSelector)) return true;\n } else {\n if (el.matches(maskTextSelector)) return true;\n }\n }\n } catch (e) {\n }\n return false;\n}\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\n const win = iframeEl.contentWindow;\n if (!win) {\n return;\n }\n let fired = false;\n let readyState;\n try {\n readyState = win.document.readyState;\n } catch (error) {\n return;\n }\n if (readyState !== \"complete\") {\n const timer = setTimeout(() => {\n if (!fired) {\n listener();\n fired = true;\n }\n }, iframeLoadTimeout);\n iframeEl.addEventListener(\"load\", () => {\n clearTimeout(timer);\n fired = true;\n listener();\n });\n return;\n }\n const blankUrl = \"about:blank\";\n if (win.location.href !== blankUrl || iframeEl.src === blankUrl || iframeEl.src === \"\") {\n setTimeout(listener, 0);\n return iframeEl.addEventListener(\"load\", listener);\n }\n iframeEl.addEventListener(\"load\", listener);\n}\nfunction onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) {\n let fired = false;\n let styleSheetLoaded;\n try {\n styleSheetLoaded = link.sheet;\n } catch (error) {\n return;\n }\n if (styleSheetLoaded) return;\n const timer = setTimeout(() => {\n if (!fired) {\n listener();\n fired = true;\n }\n }, styleSheetLoadTimeout);\n link.addEventListener(\"load\", () => {\n clearTimeout(timer);\n fired = true;\n listener();\n });\n}\nfunction serializeNode(n, options) {\n const {\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n needsMask,\n inlineStylesheet,\n maskInputOptions = {},\n maskTextFn,\n maskInputFn,\n dataURLOptions = {},\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement = false,\n cssCaptured = false\n } = options;\n const rootId = getRootId(doc, mirror2);\n switch (n.nodeType) {\n case n.DOCUMENT_NODE:\n if (n.compatMode !== \"CSS1Compat\") {\n return {\n type: NodeType.Document,\n childNodes: [],\n compatMode: n.compatMode\n // probably \"BackCompat\"\n };\n } else {\n return {\n type: NodeType.Document,\n childNodes: []\n };\n }\n case n.DOCUMENT_TYPE_NODE:\n return {\n type: NodeType.DocumentType,\n name: n.name,\n publicId: n.publicId,\n systemId: n.systemId,\n rootId\n };\n case n.ELEMENT_NODE:\n return serializeElementNode(n, {\n doc,\n blockClass,\n blockSelector,\n inlineStylesheet,\n maskInputOptions,\n maskInputFn,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement,\n rootId\n });\n case n.TEXT_NODE:\n return serializeTextNode(n, {\n doc,\n needsMask,\n maskTextFn,\n rootId,\n cssCaptured\n });\n case n.CDATA_SECTION_NODE:\n return {\n type: NodeType.CDATA,\n textContent: \"\",\n rootId\n };\n case n.COMMENT_NODE:\n return {\n type: NodeType.Comment,\n textContent: index.textContent(n) || \"\",\n rootId\n };\n default:\n return false;\n }\n}\nfunction getRootId(doc, mirror2) {\n if (!mirror2.hasNode(doc)) return void 0;\n const docId = mirror2.getId(doc);\n return docId === 1 ? void 0 : docId;\n}\nfunction serializeTextNode(n, options) {\n const { needsMask, maskTextFn, rootId, cssCaptured } = options;\n const parent = index.parentNode(n);\n const parentTagName = parent && parent.tagName;\n let textContent2 = \"\";\n const isStyle = parentTagName === \"STYLE\" ? true : void 0;\n const isScript = parentTagName === \"SCRIPT\" ? true : void 0;\n if (isScript) {\n textContent2 = \"SCRIPT_PLACEHOLDER\";\n } else if (!cssCaptured) {\n textContent2 = index.textContent(n);\n if (isStyle && textContent2) {\n textContent2 = absolutifyURLs(textContent2, getHref(options.doc));\n }\n }\n if (!isStyle && !isScript && textContent2 && needsMask) {\n textContent2 = maskTextFn ? maskTextFn(textContent2, index.parentElement(n)) : textContent2.replace(/[\\S]/g, \"*\");\n }\n return {\n type: NodeType.Text,\n textContent: textContent2 || \"\",\n rootId\n };\n}\nfunction serializeElementNode(n, options) {\n const {\n doc,\n blockClass,\n blockSelector,\n inlineStylesheet,\n maskInputOptions = {},\n maskInputFn,\n dataURLOptions = {},\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement = false,\n rootId\n } = options;\n const needBlock = _isBlockedElement(n, blockClass, blockSelector);\n const tagName = getValidTagName(n);\n let attributes = {};\n const len = n.attributes.length;\n for (let i = 0; i < len; i++) {\n const attr = n.attributes[i];\n if (!ignoreAttribute(tagName, attr.name, attr.value)) {\n attributes[attr.name] = transformAttribute(\n doc,\n tagName,\n toLowerCase(attr.name),\n attr.value\n );\n }\n }\n if (tagName === \"link\" && inlineStylesheet) {\n const stylesheet = Array.from(doc.styleSheets).find((s) => {\n return s.href === n.href;\n });\n let cssText = null;\n if (stylesheet) {\n cssText = stringifyStylesheet(stylesheet);\n }\n if (cssText) {\n delete attributes.rel;\n delete attributes.href;\n attributes._cssText = cssText;\n }\n }\n if (tagName === \"style\" && n.sheet) {\n let cssText = stringifyStylesheet(\n n.sheet\n );\n if (cssText) {\n if (n.childNodes.length > 1) {\n cssText = markCssSplits(cssText, n);\n }\n attributes._cssText = cssText;\n }\n }\n if ([\"input\", \"textarea\", \"select\"].includes(tagName)) {\n const value = n.value;\n const checked = n.checked;\n if (attributes.type !== \"radio\" && attributes.type !== \"checkbox\" && attributes.type !== \"submit\" && attributes.type !== \"button\" && value) {\n attributes.value = maskInputValue({\n element: n,\n type: getInputType(n),\n tagName,\n value,\n maskInputOptions,\n maskInputFn\n });\n } else if (checked) {\n attributes.checked = checked;\n }\n }\n if (tagName === \"option\") {\n if (n.selected && !maskInputOptions[\"select\"]) {\n attributes.selected = true;\n } else {\n delete attributes.selected;\n }\n }\n if (tagName === \"dialog\" && n.open) {\n attributes.rr_open_mode = n.matches(\"dialog:modal\") ? \"modal\" : \"non-modal\";\n }\n if (tagName === \"canvas\" && recordCanvas) {\n if (n.__context === \"2d\") {\n if (!is2DCanvasBlank(n)) {\n attributes.rr_dataURL = n.toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality\n );\n }\n } else if (!(\"__context\" in n)) {\n const canvasDataURL = n.toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality\n );\n const blankCanvas = doc.createElement(\"canvas\");\n blankCanvas.width = n.width;\n blankCanvas.height = n.height;\n const blankCanvasDataURL = blankCanvas.toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality\n );\n if (canvasDataURL !== blankCanvasDataURL) {\n attributes.rr_dataURL = canvasDataURL;\n }\n }\n }\n if (tagName === \"img\" && inlineImages) {\n if (!canvasService) {\n canvasService = doc.createElement(\"canvas\");\n canvasCtx = canvasService.getContext(\"2d\");\n }\n const image = n;\n const imageSrc = image.currentSrc || image.getAttribute(\"src\") || \"<unknown-src>\";\n const priorCrossOrigin = image.crossOrigin;\n const recordInlineImage = () => {\n image.removeEventListener(\"load\", recordInlineImage);\n try {\n canvasService.width = image.naturalWidth;\n canvasService.height = image.naturalHeight;\n canvasCtx.drawImage(image, 0, 0);\n attributes.rr_dataURL = canvasService.toDataURL(\n dataURLOptions.type,\n dataURLOptions.quality\n );\n } catch (err) {\n if (image.crossOrigin !== \"anonymous\") {\n image.crossOrigin = \"anonymous\";\n if (image.complete && image.naturalWidth !== 0)\n recordInlineImage();\n else image.addEventListener(\"load\", recordInlineImage);\n return;\n } else {\n console.warn(\n `Cannot inline img src=${imageSrc}! Error: ${err}`\n );\n }\n }\n if (image.crossOrigin === \"anonymous\") {\n priorCrossOrigin ? attributes.crossOrigin = priorCrossOrigin : image.removeAttribute(\"crossorigin\");\n }\n };\n if (image.complete && image.naturalWidth !== 0) recordInlineImage();\n else image.addEventListener(\"load\", recordInlineImage);\n }\n if ([\"audio\", \"video\"].includes(tagName)) {\n const mediaAttributes = attributes;\n mediaAttributes.rr_mediaState = n.paused ? \"paused\" : \"played\";\n mediaAttributes.rr_mediaCurrentTime = n.currentTime;\n mediaAttributes.rr_mediaPlaybackRate = n.playbackRate;\n mediaAttributes.rr_mediaMuted = n.muted;\n mediaAttributes.rr_mediaLoop = n.loop;\n mediaAttributes.rr_mediaVolume = n.volume;\n }\n if (!newlyAddedElement) {\n if (n.scrollLeft) {\n attributes.rr_scrollLeft = n.scrollLeft;\n }\n if (n.scrollTop) {\n attributes.rr_scrollTop = n.scrollTop;\n }\n }\n if (needBlock) {\n const { width, height } = n.getBoundingClientRect();\n attributes = {\n class: attributes.class,\n rr_width: `${width}px`,\n rr_height: `${height}px`\n };\n }\n if (tagName === \"iframe\" && !keepIframeSrcFn(attributes.src)) {\n if (!n.contentDocument) {\n attributes.rr_src = attributes.src;\n }\n delete attributes.src;\n }\n let isCustomElement;\n try {\n if (customElements.get(tagName)) isCustomElement = true;\n } catch (e) {\n }\n return {\n type: NodeType.Element,\n tagName,\n attributes,\n childNodes: [],\n isSVG: isSVGElement(n) || void 0,\n needBlock,\n rootId,\n isCustom: isCustomElement\n };\n}\nfunction lowerIfExists(maybeAttr) {\n if (maybeAttr === void 0 || maybeAttr === null) {\n return \"\";\n } else {\n return maybeAttr.toLowerCase();\n }\n}\nfunction slimDOMDefaults(_slimDOMOptions) {\n if (_slimDOMOptions === true || _slimDOMOptions === \"all\") {\n return {\n script: true,\n comment: true,\n headFavicon: true,\n headWhitespace: true,\n headMetaSocial: true,\n headMetaRobots: true,\n headMetaHttpEquiv: true,\n headMetaVerification: true,\n // the following are off for slimDOMOptions === true,\n // as they destroy some (hidden) info:\n headMetaAuthorship: _slimDOMOptions === \"all\",\n headMetaDescKeywords: _slimDOMOptions === \"all\",\n headTitleMutations: _slimDOMOptions === \"all\"\n };\n } else if (_slimDOMOptions) {\n return _slimDOMOptions;\n }\n return {};\n}\nfunction slimDOMExcluded(sn, slimDOMOptions) {\n if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\n return true;\n } else if (sn.type === NodeType.Element) {\n if (slimDOMOptions.script && // script tag\n (sn.tagName === \"script\" || // (module)preload link\n sn.tagName === \"link\" && (sn.attributes.rel === \"preload\" && sn.attributes.as === \"script\" || sn.attributes.rel === \"modulepreload\") || // prefetch link\n sn.tagName === \"link\" && sn.attributes.rel === \"prefetch\" && typeof sn.attributes.href === \"string\" && extractFileExtension(sn.attributes.href) === \"js\")) {\n return true;\n } else if (slimDOMOptions.headFavicon && (sn.tagName === \"link\" && sn.attributes.rel === \"shortcut icon\" || sn.tagName === \"meta\" && (lowerIfExists(sn.attributes.name).match(\n /^msapplication-tile(image|color)$/\n ) || lowerIfExists(sn.attributes.name) === \"application-name\" || lowerIfExists(sn.attributes.rel) === \"icon\" || lowerIfExists(sn.attributes.rel) === \"apple-touch-icon\" || lowerIfExists(sn.attributes.rel) === \"shortcut icon\"))) {\n return true;\n } else if (sn.tagName === \"meta\") {\n if (slimDOMOptions.headMetaDescKeywords && lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\n return true;\n } else if (slimDOMOptions.headMetaSocial && (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) || // og = opengraph (facebook)\n lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) || lowerIfExists(sn.attributes.name) === \"pinterest\")) {\n return true;\n } else if (slimDOMOptions.headMetaRobots && (lowerIfExists(sn.attributes.name) === \"robots\" || lowerIfExists(sn.attributes.name) === \"googlebot\" || lowerIfExists(sn.attributes.name) === \"bingbot\")) {\n return true;\n } else if (slimDOMOptions.headMetaHttpEquiv && sn.attributes[\"http-equiv\"] !== void 0) {\n return true;\n } else if (slimDOMOptions.headMetaAuthorship && (lowerIfExists(sn.attributes.name) === \"author\" || lowerIfExists(sn.attributes.name) === \"generator\" || lowerIfExists(sn.attributes.name) === \"framework\" || lowerIfExists(sn.attributes.name) === \"publisher\" || lowerIfExists(sn.attributes.name) === \"progid\" || lowerIfExists(sn.attributes.property).match(/^article:/) || lowerIfExists(sn.attributes.property).match(/^product:/))) {\n return true;\n } else if (slimDOMOptions.headMetaVerification && (lowerIfExists(sn.attributes.name) === \"google-site-verification\" || lowerIfExists(sn.attributes.name) === \"yandex-verification\" || lowerIfExists(sn.attributes.name) === \"csrf-token\" || lowerIfExists(sn.attributes.name) === \"p:domain_verify\" || lowerIfExists(sn.attributes.name) === \"verify-v1\" || lowerIfExists(sn.attributes.name) === \"verification\" || lowerIfExists(sn.attributes.name) === \"shopify-checkout-api-token\")) {\n return true;\n }\n }\n }\n return false;\n}\nfunction serializeNodeWithId(n, options) {\n const {\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n maskTextClass,\n maskTextSelector,\n skipChild = false,\n inlineStylesheet = true,\n maskInputOptions = {},\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions = {},\n inlineImages = false,\n recordCanvas = false,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout = 5e3,\n onStylesheetLoad,\n stylesheetLoadTimeout = 5e3,\n keepIframeSrcFn = () => false,\n newlyAddedElement = false,\n cssCaptured = false\n } = options;\n let { needsMask } = options;\n let { preserveWhiteSpace = true } = options;\n if (!needsMask) {\n const checkAncestors = needsMask === void 0;\n needsMask = needMaskingText(\n n,\n maskTextClass,\n maskTextSelector,\n checkAncestors\n );\n }\n const _serializedNode = serializeNode(n, {\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n needsMask,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n keepIframeSrcFn,\n newlyAddedElement,\n cssCaptured\n });\n if (!_serializedNode) {\n console.warn(n, \"not serialized\");\n return null;\n }\n let id;\n if (mirror2.hasNode(n)) {\n id = mirror2.getId(n);\n } else if (slimDOMExcluded(_serializedNode, slimDOMOptions) || !preserveWhiteSpace && _serializedNode.type === NodeType.Text && !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, \"\").length) {\n id = IGNORED_NODE;\n } else {\n id = genId();\n }\n const serializedNode = Object.assign(_serializedNode, { id });\n mirror2.add(n, serializedNode);\n if (id === IGNORED_NODE) {\n return null;\n }\n if (onSerialize) {\n onSerialize(n);\n }\n let recordChild = !skipChild;\n if (serializedNode.type === NodeType.Element) {\n recordChild = recordChild && !serializedNode.needBlock;\n delete serializedNode.needBlock;\n const shadowRootEl = index.shadowRoot(n);\n if (shadowRootEl && isNativeShadowDom(shadowRootEl))\n serializedNode.isShadowHost = true;\n }\n if ((serializedNode.type === NodeType.Document || serializedNode.type === NodeType.Element) && recordChild) {\n if (slimDOMOptions.headWhitespace && serializedNode.type === NodeType.Element && serializedNode.tagName === \"head\") {\n preserveWhiteSpace = false;\n }\n const bypassOptions = {\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n needsMask,\n maskTextClass,\n maskTextSelector,\n skipChild,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n cssCaptured: false\n };\n if (serializedNode.type === NodeType.Element && serializedNode.tagName === \"textarea\" && serializedNode.attributes.value !== void 0) ;\n else {\n if (serializedNode.type === NodeType.Element && serializedNode.attributes._cssText !== void 0 && typeof serializedNode.attributes._cssText === \"string\") {\n bypassOptions.cssCaptured = true;\n }\n for (const childN of Array.from(index.childNodes(n))) {\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n }\n let shadowRootEl = null;\n if (isElement(n) && (shadowRootEl = index.shadowRoot(n))) {\n for (const childN of Array.from(index.childNodes(shadowRootEl))) {\n const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\n if (serializedChildNode) {\n isNativeShadowDom(shadowRootEl) && (serializedChildNode.isShadow = true);\n serializedNode.childNodes.push(serializedChildNode);\n }\n }\n }\n }\n const parent = index.parentNode(n);\n if (parent && isShadowRoot(parent) && isNativeShadowDom(parent)) {\n serializedNode.isShadow = true;\n }\n if (serializedNode.type === NodeType.Element && serializedNode.tagName === \"iframe\") {\n onceIframeLoaded(\n n,\n () => {\n const iframeDoc = n.contentDocument;\n if (iframeDoc && onIframeLoad) {\n const serializedIframeNode = serializeNodeWithId(iframeDoc, {\n doc: iframeDoc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n needsMask,\n maskTextClass,\n maskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn\n });\n if (serializedIframeNode) {\n onIframeLoad(\n n,\n serializedIframeNode\n );\n }\n }\n },\n iframeLoadTimeout\n );\n }\n if (serializedNode.type === NodeType.Element && serializedNode.tagName === \"link\" && typeof serializedNode.attributes.rel === \"string\" && (serializedNode.attributes.rel === \"stylesheet\" || serializedNode.attributes.rel === \"preload\" && typeof serializedNode.attributes.href === \"string\" && extractFileExtension(serializedNode.attributes.href) === \"css\")) {\n onceStylesheetLoaded(\n n,\n () => {\n if (onStylesheetLoad) {\n const serializedLinkNode = serializeNodeWithId(n, {\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n needsMask,\n maskTextClass,\n maskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn\n });\n if (serializedLinkNode) {\n onStylesheetLoad(\n n,\n serializedLinkNode\n );\n }\n }\n },\n stylesheetLoadTimeout\n );\n }\n return serializedNode;\n}\nfunction snapshot(n, options) {\n const {\n mirror: mirror2 = new Mirror(),\n blockClass = \"rr-block\",\n blockSelector = null,\n maskTextClass = \"rr-mask\",\n maskTextSelector = null,\n inlineStylesheet = true,\n inlineImages = false,\n recordCanvas = false,\n maskAllInputs = false,\n maskTextFn,\n maskInputFn,\n slimDOM = false,\n dataURLOptions,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn = () => false\n } = options;\n const maskInputOptions = maskAllInputs === true ? {\n color: true,\n date: true,\n \"datetime-local\": true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n password: true\n } : maskAllInputs === false ? {\n password: true\n } : maskAllInputs;\n const slimDOMOptions = slimDOMDefaults(slimDOM);\n return serializeNodeWithId(n, {\n doc: n,\n mirror: mirror2,\n blockClass,\n blockSelector,\n maskTextClass,\n maskTextSelector,\n skipChild: false,\n inlineStylesheet,\n maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOMOptions,\n dataURLOptions,\n inlineImages,\n recordCanvas,\n preserveWhiteSpace,\n onSerialize,\n onIframeLoad,\n iframeLoadTimeout,\n onStylesheetLoad,\n stylesheetLoadTimeout,\n keepIframeSrcFn,\n newlyAddedElement: false\n });\n}\nclass BaseRRNode {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any\n constructor(..._args) {\n __publicField(this, \"parentElement\", null);\n __publicField(this, \"parentNode\", null);\n __publicField(this, \"ownerDocument\");\n __publicField(this, \"firstChild\", null);\n __publicField(this, \"lastChild\", null);\n __publicField(this, \"previousSibling\", null);\n __publicField(this, \"nextSibling\", null);\n __publicField(this, \"ELEMENT_NODE\", 1);\n __publicField(this, \"TEXT_NODE\", 3);\n // corresponding nodeType value of standard HTML Node\n __publicField(this, \"nodeType\");\n __publicField(this, \"nodeName\");\n __publicField(this, \"RRNodeType\");\n }\n get childNodes() {\n const childNodes2 = [];\n let childIterator = this.firstChild;\n while (childIterator) {\n childNodes2.push(childIterator);\n childIterator = childIterator.nextSibling;\n }\n return childNodes2;\n }\n contains(node) {\n if (!(node instanceof BaseRRNode)) return false;\n else if (node.ownerDocument !== this.ownerDocument) return false;\n else if (node === this) return true;\n while (node.parentNode) {\n if (node.parentNode === this) return true;\n node = node.parentNode;\n }\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n appendChild(_newChild) {\n throw new Error(\n `RRDomException: Failed to execute 'appendChild' on 'RRNode': This RRNode type does not support this method.`\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n insertBefore(_newChild, _refChild) {\n throw new Error(\n `RRDomException: Failed to execute 'insertBefore' on 'RRNode': This RRNode type does not support this method.`\n );\n }\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n removeChild(_node) {\n throw new Error(\n `RRDomException: Failed to execute 'removeChild' on 'RRNode': This RRNode type does not support this method.`\n );\n }\n toString() {\n return \"RRNode\";\n }\n}\nfunction on(type, fn, target = document) {\n const options = { capture: true, passive: true };\n target.addEventListener(type, fn, options);\n return () => target.removeEventListener(type, fn, options);\n}\nconst DEPARTED_MIRROR_ACCESS_WARNING = \"Please stop import mirror directly. Instead of that,\\r\\nnow you can use replayer.getMirror() to access the mirror instance of a replayer,\\r\\nor you can use record.mirror to access the mirror instance during recording.\";\nlet _mirror = {\n map: {},\n getId() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return -1;\n },\n getNode() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return null;\n },\n removeNodeFromMap() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n },\n has() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n return false;\n },\n reset() {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n }\n};\nif (typeof window !== \"undefined\" && window.Proxy && window.Reflect) {\n _mirror = new Proxy(_mirror, {\n get(target, prop, receiver) {\n if (prop === \"map\") {\n console.error(DEPARTED_MIRROR_ACCESS_WARNING);\n }\n return Reflect.get(target, prop, receiver);\n }\n });\n}\nfunction throttle(func, wait, options = {}) {\n let timeout = null;\n let previous = 0;\n return function(...args) {\n const now = Date.now();\n if (!previous && options.leading === false) {\n previous = now;\n }\n const remaining = wait - (now - previous);\n const context = this;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = now;\n func.apply(context, args);\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(() => {\n previous = options.leading === false ? 0 : Date.now();\n timeout = null;\n func.apply(context, args);\n }, remaining);\n }\n };\n}\nfunction hookSetter(target, key, d, isRevoked, win = window) {\n const original = win.Object.getOwnPropertyDescriptor(target, key);\n win.Object.defineProperty(\n target,\n key,\n isRevoked ? d : {\n set(value) {\n setTimeout(() => {\n d.set.call(this, value);\n }, 0);\n if (original && original.set) {\n original.set.call(this, value);\n }\n }\n }\n );\n return () => hookSetter(target, key, original || {}, true);\n}\nfunction getWindowScroll(win) {\n var _a2, _b, _c, _d;\n const doc = win.document;\n return {\n left: doc.scrollingElement ? doc.scrollingElement.scrollLeft : win.pageXOffset !== void 0 ? win.pageXOffset : doc.documentElement.scrollLeft || (doc == null ? void 0 : doc.body) && ((_a2 = index.parentElement(doc.body)) == null ? void 0 : _a2.scrollLeft) || ((_b = doc == null ? void 0 : doc.body) == null ? void 0 : _b.scrollLeft) || 0,\n top: doc.scrollingElement ? doc.scrollingElement.scrollTop : win.pageYOffset !== void 0 ? win.pageYOffset : (doc == null ? void 0 : doc.documentElement.scrollTop) || (doc == null ? void 0 : doc.body) && ((_c = index.parentElement(doc.body)) == null ? void 0 : _c.scrollTop) || ((_d = doc == null ? void 0 : doc.body) == null ? void 0 : _d.scrollTop) || 0\n };\n}\nfunction getWindowHeight() {\n return window.innerHeight || document.documentElement && document.documentElement.clientHeight || document.body && document.body.clientHeight;\n}\nfunction getWindowWidth() {\n return window.innerWidth || document.documentElement && document.documentElement.clientWidth || document.body && document.body.clientWidth;\n}\nfunction closestElementOfNode(node) {\n if (!node) {\n return null;\n }\n const el = node.nodeType === node.ELEMENT_NODE ? node : index.parentElement(node);\n return el;\n}\nfunction isBlocked(node, blockClass, blockSelector, checkAncestors) {\n if (!node) {\n return false;\n }\n const el = closestElementOfNode(node);\n if (!el) {\n return false;\n }\n try {\n if (typeof blockClass === \"string\") {\n if (el.classList.contains(blockClass)) return true;\n if (checkAncestors && el.closest(\".\" + blockClass) !== null) return true;\n } else {\n if (classMatchesRegex(el, blockClass, checkAncestors)) return true;\n }\n } catch (e) {\n }\n if (blockSelector) {\n if (el.matches(blockSelector)) return true;\n if (checkAncestors && el.closest(blockSelector) !== null) return true;\n }\n return false;\n}\nfunction isSerialized(n, mirror2) {\n return mirror2.getId(n) !== -1;\n}\nfunction isIgnored(n, mirror2, slimDOMOptions) {\n if (n.tagName === \"TITLE\" && slimDOMOptions.headTitleMutations) {\n return true;\n }\n return mirror2.getId(n) === IGNORED_NODE;\n}\nfunction isAncestorRemoved(target, mirror2) {\n if (isShadowRoot(target)) {\n return false;\n }\n const id = mirror2.getId(target);\n if (!mirror2.has(id)) {\n return true;\n }\n const parent = index.parentNode(target);\n if (parent && parent.nodeType === target.DOCUMENT_NODE) {\n return false;\n }\n if (!parent) {\n return true;\n }\n return isAncestorRemoved(parent, mirror2);\n}\nfunction legacy_isTouchEvent(event) {\n return Boolean(event.changedTouches);\n}\nfunction polyfill(win = window) {\n if (\"NodeList\" in win && !win.NodeList.prototype.forEach) {\n win.NodeList.prototype.forEach = Array.prototype.forEach;\n }\n if (\"DOMTokenList\" in win && !win.DOMTokenList.prototype.forEach) {\n win.DOMTokenList.prototype.forEach = Array.prototype.forEach;\n }\n}\nfunction isSerializedIframe(n, mirror2) {\n return Boolean(n.nodeName === \"IFRAME\" && mirror2.getMeta(n));\n}\nfunction isSerializedStylesheet(n, mirror2) {\n return Boolean(\n n.nodeName === \"LINK\" && n.nodeType === n.ELEMENT_NODE && n.getAttribute && n.getAttribute(\"rel\") === \"stylesheet\" && mirror2.getMeta(n)\n );\n}\nfunction hasShadowRoot(n) {\n if (!n) return false;\n if (n instanceof BaseRRNode && \"shadowRoot\" in n) {\n return Boolean(n.shadowRoot);\n }\n return Boolean(index.shadowRoot(n));\n}\nclass StyleSheetMirror {\n constructor() {\n __publicField(this, \"id\", 1);\n __publicField(this, \"styleIDMap\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"idStyleMap\", /* @__PURE__ */ new Map());\n }\n getId(stylesheet) {\n return this.styleIDMap.get(stylesheet) ?? -1;\n }\n has(stylesheet) {\n return this.styleIDMap.has(stylesheet);\n }\n /**\n * @returns If the stylesheet is in the mirror, returns the id of the stylesheet. If not, return the new assigned id.\n */\n add(stylesheet, id) {\n if (this.has(stylesheet)) return this.getId(stylesheet);\n let newId;\n if (id === void 0) {\n newId = this.id++;\n } else newId = id;\n this.styleIDMap.set(stylesheet, newId);\n this.idStyleMap.set(newId, stylesheet);\n return newId;\n }\n getStyle(id) {\n return this.idStyleMap.get(id) || null;\n }\n reset() {\n this.styleIDMap = /* @__PURE__ */ new WeakMap();\n this.idStyleMap = /* @__PURE__ */ new Map();\n this.id = 1;\n }\n generateId() {\n return this.id++;\n }\n}\nfunction getShadowHost(n) {\n var _a2;\n let shadowHost = null;\n if (\"getRootNode\" in n && ((_a2 = index.getRootNode(n)) == null ? void 0 : _a2.nodeType) === Node.DOCUMENT_FRAGMENT_NODE && index.host(index.getRootNode(n)))\n shadowHost = index.host(index.getRootNode(n));\n return shadowHost;\n}\nfunction getRootShadowHost(n) {\n let rootShadowHost = n;\n let shadowHost;\n while (shadowHost = getShadowHost(rootShadowHost))\n rootShadowHost = shadowHost;\n return rootShadowHost;\n}\nfunction shadowHostInDom(n) {\n const doc = index.ownerDocument(n);\n if (!doc) return false;\n const shadowHost = getRootShadowHost(n);\n return index.contains(doc, shadowHost);\n}\nfunction inDom(n) {\n const doc = index.ownerDocument(n);\n if (!doc) return false;\n return index.contains(doc, n) || shadowHostInDom(n);\n}\nfunction isNodeInLinkedList(n) {\n return \"__ln\" in n;\n}\nclass DoubleLinkedList {\n constructor() {\n __publicField(this, \"length\", 0);\n __publicField(this, \"head\", null);\n __publicField(this, \"tail\", null);\n }\n get(position) {\n if (position >= this.length) {\n throw new Error(\"Position outside of list range\");\n }\n let current = this.head;\n for (let index2 = 0; index2 < position; index2++) {\n current = (current == null ? void 0 : current.next) || null;\n }\n return current;\n }\n addNode(n) {\n const node = {\n value: n,\n previous: null,\n next: null\n };\n n.__ln = node;\n if (n.previousSibling && isNodeInLinkedList(n.previousSibling)) {\n const current = n.previousSibling.__ln.next;\n node.next = current;\n node.previous = n.previousSibling.__ln;\n n.previousSibling.__ln.next = node;\n if (current) {\n current.previous = node;\n }\n } else if (n.nextSibling && isNodeInLinkedList(n.nextSibling) && n.nextSibling.__ln.previous) {\n const current = n.nextSibling.__ln.previous;\n node.previous = current;\n node.next = n.nextSibling.__ln;\n n.nextSibling.__ln.previous = node;\n if (current) {\n current.next = node;\n }\n } else {\n if (this.head) {\n this.head.previous = node;\n }\n node.next = this.head;\n this.head = node;\n }\n if (node.next === null) {\n this.tail = node;\n }\n this.length++;\n }\n removeNode(n) {\n const current = n.__ln;\n if (!this.head) {\n return;\n }\n if (!current.previous) {\n this.head = current.next;\n if (this.head) {\n this.head.previous = null;\n } else {\n this.tail = null;\n }\n } else {\n current.previous.next = current.next;\n if (current.next) {\n current.next.previous = current.previous;\n } else {\n this.tail = current.previous;\n }\n }\n if (n.__ln) {\n delete n.__ln;\n }\n this.length--;\n }\n}\nconst moveKey = (id, parentId) => `${id}@${parentId}`;\nclass MutationBuffer {\n constructor() {\n __publicField(this, \"frozen\", false);\n __publicField(this, \"locked\", false);\n __publicField(this, \"texts\", []);\n __publicField(this, \"attributes\", []);\n __publicField(this, \"attributeMap\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"removes\", []);\n __publicField(this, \"mapRemoves\", []);\n __publicField(this, \"movedMap\", {});\n /**\n * the browser MutationObserver emits multiple mutations after\n * a delay for performance reasons, making tracing added nodes hard\n * in our `processMutations` callback function.\n * For example, if we append an element el_1 into body, and then append\n * another element el_2 into el_1, these two mutations may be passed to the\n * callback function together when the two operations were done.\n * Generally we need to trace child nodes of newly added nodes, but in this\n * case if we count el_2 as el_1's child node in the first mutation record,\n * then we will count el_2 again in the second mutation record which was\n * duplicated.\n * To avoid of duplicate counting added nodes, we use a Set to store\n * added nodes and its child nodes during iterate mutation records. Then\n * collect added nodes from the Set which have no duplicate copy. But\n * this also causes newly added nodes will not be serialized with id ASAP,\n * which means all the id related calculation should be lazy too.\n */\n __publicField(this, \"addedSet\", /* @__PURE__ */ new Set());\n __publicField(this, \"movedSet\", /* @__PURE__ */ new Set());\n __publicField(this, \"droppedSet\", /* @__PURE__ */ new Set());\n __publicField(this, \"removesSubTreeCache\", /* @__PURE__ */ new Set());\n __publicField(this, \"mutationCb\");\n __publicField(this, \"blockClass\");\n __publicField(this, \"blockSelector\");\n __publicField(this, \"maskTextClass\");\n __publicField(this, \"maskTextSelector\");\n __publicField(this, \"inlineStylesheet\");\n __publicField(this, \"maskInputOptions\");\n __publicField(this, \"maskTextFn\");\n __publicField(this, \"maskInputFn\");\n __publicField(this, \"keepIframeSrcFn\");\n __publicField(this, \"recordCanvas\");\n __publicField(this, \"inlineImages\");\n __publicField(this, \"slimDOMOptions\");\n __publicField(this, \"dataURLOptions\");\n __publicField(this, \"doc\");\n __publicField(this, \"mirror\");\n __publicField(this, \"iframeManager\");\n __publicField(this, \"stylesheetManager\");\n __publicField(this, \"shadowDomManager\");\n __publicField(this, \"canvasManager\");\n __publicField(this, \"processedNodeManager\");\n __publicField(this, \"unattachedDoc\");\n __publicField(this, \"processMutations\", (mutations) => {\n mutations.forEach(this.processMutation);\n this.emit();\n });\n __publicField(this, \"emit\", () => {\n if (this.frozen || this.locked) {\n return;\n }\n const adds = [];\n const addedIds = /* @__PURE__ */ new Set();\n const addList = new DoubleLinkedList();\n const getNextId = (n) => {\n let ns = n;\n let nextId = IGNORED_NODE;\n while (nextId === IGNORED_NODE) {\n ns = ns && ns.nextSibling;\n nextId = ns && this.mirror.getId(ns);\n }\n return nextId;\n };\n const pushAdd = (n) => {\n const parent = index.parentNode(n);\n if (!parent || !inDom(n)) {\n return;\n }\n let cssCaptured = false;\n if (n.nodeType === Node.TEXT_NODE) {\n const parentTag = parent.tagName;\n if (parentTag === \"TEXTAREA\") {\n return;\n } else if (parentTag === \"STYLE\" && this.addedSet.has(parent)) {\n cssCaptured = true;\n }\n }\n const parentId = isShadowRoot(parent) ? this.mirror.getId(getShadowHost(n)) : this.mirror.getId(parent);\n const nextId = getNextId(n);\n if (parentId === -1 || nextId === -1) {\n return addList.addNode(n);\n }\n const sn = serializeNodeWithId(n, {\n doc: this.doc,\n mirror: this.mirror,\n blockClass: this.blockClass,\n blockSelector: this.blockSelector,\n maskTextClass: this.maskTextClass,\n maskTextSelector: this.maskTextSelector,\n skipChild: true,\n newlyAddedElement: true,\n inlineStylesheet: this.inlineStylesheet,\n maskInputOptions: this.maskInputOptions,\n maskTextFn: this.maskTextFn,\n maskInputFn: this.maskInputFn,\n slimDOMOptions: this.slimDOMOptions,\n dataURLOptions: this.dataURLOptions,\n recordCanvas: this.recordCanvas,\n inlineImages: this.inlineImages,\n onSerialize: (currentN) => {\n if (isSerializedIframe(currentN, this.mirror)) {\n this.iframeManager.addIframe(currentN);\n }\n if (isSerializedStylesheet(currentN, this.mirror)) {\n this.stylesheetManager.trackLinkElement(\n currentN\n );\n }\n if (hasShadowRoot(n)) {\n this.shadowDomManager.addShadowRoot(index.shadowRoot(n), this.doc);\n }\n },\n onIframeLoad: (iframe, childSn) => {\n this.iframeManager.attachIframe(iframe, childSn);\n this.shadowDomManager.observeAttachShadow(iframe);\n },\n onStylesheetLoad: (link, childSn) => {\n this.stylesheetManager.attachLinkElement(link, childSn);\n },\n cssCaptured\n });\n if (sn) {\n adds.push({\n parentId,\n nextId,\n node: sn\n });\n addedIds.add(sn.id);\n }\n };\n while (this.mapRemoves.length) {\n this.mirror.removeNodeFromMap(this.mapRemoves.shift());\n }\n for (const n of this.movedSet) {\n if (isParentRemoved(this.removesSubTreeCache, n, this.mirror) && !this.movedSet.has(index.parentNode(n))) {\n continue;\n }\n pushAdd(n);\n }\n for (const n of this.addedSet) {\n if (!isAncestorInSet(this.droppedSet, n) && !isParentRemoved(this.removesSubTreeCache, n, this.mirror)) {\n pushAdd(n);\n } else if (isAncestorInSet(this.movedSet, n)) {\n pushAdd(n);\n } else {\n this.droppedSet.add(n);\n }\n }\n let candidate = null;\n while (addList.length) {\n let node = null;\n if (candidate) {\n const parentId = this.mirror.getId(index.parentNode(candidate.value));\n const nextId = getNextId(candidate.value);\n if (parentId !== -1 && nextId !== -1) {\n node = candidate;\n }\n }\n if (!node) {\n let tailNode = addList.tail;\n while (tailNode) {\n const _node = tailNode;\n tailNode = tailNode.previous;\n if (_node) {\n const parentId = this.mirror.getId(index.parentNode(_node.value));\n const nextId = getNextId(_node.value);\n if (nextId === -1) continue;\n else if (parentId !== -1) {\n node = _node;\n break;\n } else {\n const unhandledNode = _node.value;\n const parent = index.parentNode(unhandledNode);\n if (parent && parent.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n const shadowHost = index.host(parent);\n const parentId2 = this.mirror.getId(shadowHost);\n if (parentId2 !== -1) {\n node = _node;\n break;\n }\n }\n }\n }\n }\n }\n if (!node) {\n while (addList.head) {\n addList.removeNode(addList.head.value);\n }\n break;\n }\n candidate = node.previous;\n addList.removeNode(node.value);\n pushAdd(node.value);\n }\n const payload = {\n texts: this.texts.map((text) => {\n const n = text.node;\n const parent = index.parentNode(n);\n if (parent && parent.tagName === \"TEXTAREA\") {\n this.genTextAreaValueMutation(parent);\n }\n return {\n id: this.mirror.getId(n),\n value: text.value\n };\n }).filter((text) => !addedIds.has(text.id)).filter((text) => this.mirror.has(text.id)),\n attributes: this.attributes.map((attribute) => {\n const { attributes } = attribute;\n if (typeof attributes.style === \"string\") {\n const diffAsStr = JSON.stringify(attribute.styleDiff);\n const unchangedAsStr = JSON.stringify(attribute._unchangedStyles);\n if (diffAsStr.length < attributes.style.length) {\n if ((diffAsStr + unchangedAsStr).split(\"var(\").length === attributes.style.split(\"var(\").length) {\n attributes.style = attribute.styleDiff;\n }\n }\n }\n return {\n id: this.mirror.getId(attribute.node),\n attributes\n };\n }).filter((attribute) => !addedIds.has(attribute.id)).filter((attribute) => this.mirror.has(attribute.id)),\n removes: this.removes,\n adds\n };\n if (!payload.texts.length && !payload.attributes.length && !payload.removes.length && !payload.adds.length) {\n return;\n }\n this.texts = [];\n this.attributes = [];\n this.attributeMap = /* @__PURE__ */ new WeakMap();\n this.removes = [];\n this.addedSet = /* @__PURE__ */ new Set();\n this.movedSet = /* @__PURE__ */ new Set();\n this.droppedSet = /* @__PURE__ */ new Set();\n this.removesSubTreeCache = /* @__PURE__ */ new Set();\n this.movedMap = {};\n this.mutationCb(payload);\n });\n __publicField(this, \"genTextAreaValueMutation\", (textarea) => {\n let item = this.attributeMap.get(textarea);\n if (!item) {\n item = {\n node: textarea,\n attributes: {},\n styleDiff: {},\n _unchangedStyles: {}\n };\n this.attributes.push(item);\n this.attributeMap.set(textarea, item);\n }\n const value = Array.from(\n index.childNodes(textarea),\n (cn) => index.textContent(cn) || \"\"\n ).join(\"\");\n item.attributes.value = maskInputValue({\n element: textarea,\n maskInputOptions: this.maskInputOptions,\n tagName: textarea.tagName,\n type: getInputType(textarea),\n value,\n maskInputFn: this.maskInputFn\n });\n });\n __publicField(this, \"processMutation\", (m) => {\n if (isIgnored(m.target, this.mirror, this.slimDOMOptions)) {\n return;\n }\n switch (m.type) {\n case \"characterData\": {\n const value = index.textContent(m.target);\n if (!isBlocked(m.target, this.blockClass, this.blockSelector, false) && value !== m.oldValue) {\n this.texts.push({\n value: needMaskingText(\n m.target,\n this.maskTextClass,\n this.maskTextSelector,\n true\n // checkAncestors\n ) && value ? this.maskTextFn ? this.maskTextFn(value, closestElementOfNode(m.target)) : value.replace(/[\\S]/g, \"*\") : value,\n node: m.target\n });\n }\n break;\n }\n case \"attributes\": {\n const target = m.target;\n let attributeName = m.attributeName;\n let value = m.target.getAttribute(attributeName);\n if (attributeName === \"value\") {\n const type = getInputType(target);\n value = maskInputValue({\n element: target,\n maskInputOptions: this.maskInputOptions,\n tagName: target.tagName,\n type,\n value,\n maskInputFn: this.maskInputFn\n });\n }\n if (isBlocked(m.target, this.blockClass, this.blockSelector, false) || value === m.oldValue) {\n return;\n }\n let item = this.attributeMap.get(m.target);\n if (target.tagName === \"IFRAME\" && attributeName === \"src\" && !this.keepIframeSrcFn(value)) {\n if (!target.contentDocument) {\n attributeName = \"rr_src\";\n } else {\n return;\n }\n }\n if (!item) {\n item = {\n node: m.target,\n attributes: {},\n styleDiff: {},\n _unchangedStyles: {}\n };\n this.attributes.push(item);\n this.attributeMap.set(m.target, item);\n }\n if (attributeName === \"type\" && target.tagName === \"INPUT\" && (m.oldValue || \"\").toLowerCase() === \"password\") {\n target.setAttribute(\"data-rr-is-password\", \"true\");\n }\n if (!ignoreAttribute(target.tagName, attributeName)) {\n item.attributes[attributeName] = transformAttribute(\n this.doc,\n toLowerCase(target.tagName),\n toLowerCase(attributeName),\n value\n );\n if (attributeName === \"style\") {\n if (!this.unattachedDoc) {\n try {\n this.unattachedDoc = document.implementation.createHTMLDocument();\n } catch (e) {\n this.unattachedDoc = this.doc;\n }\n }\n const old = this.unattachedDoc.createElement(\"span\");\n if (m.oldValue) {\n old.setAttribute(\"style\", m.oldValue);\n }\n for (const pname of Array.from(target.style)) {\n const newValue = target.style.getPropertyValue(pname);\n const newPriority = target.style.getPropertyPriority(pname);\n if (newValue !== old.style.getPropertyValue(pname) || newPriority !== old.style.getPropertyPriority(pname)) {\n if (newPriority === \"\") {\n item.styleDiff[pname] = newValue;\n } else {\n item.styleDiff[pname] = [newValue, newPriority];\n }\n } else {\n item._unchangedStyles[pname] = [newValue, newPriority];\n }\n }\n for (const pname of Array.from(old.style)) {\n if (target.style.getPropertyValue(pname) === \"\") {\n item.styleDiff[pname] = false;\n }\n }\n } else if (attributeName === \"open\" && target.tagName === \"DIALOG\") {\n if (target.matches(\"dialog:modal\")) {\n item.attributes[\"rr_open_mode\"] = \"modal\";\n } else {\n item.attributes[\"rr_open_mode\"] = \"non-modal\";\n }\n }\n }\n break;\n }\n case \"childList\": {\n if (isBlocked(m.target, this.blockClass, this.blockSelector, true))\n return;\n if (m.target.tagName === \"TEXTAREA\") {\n this.genTextAreaValueMutation(m.target);\n return;\n }\n m.addedNodes.forEach((n) => this.genAdds(n, m.target));\n m.removedNodes.forEach((n) => {\n const nodeId = this.mirror.getId(n);\n const parentId = isShadowRoot(m.target) ? this.mirror.getId(index.host(m.target)) : this.mirror.getId(m.target);\n if (isBlocked(m.target, this.blockClass, this.blockSelector, false) || isIgnored(n, this.mirror, this.slimDOMOptions) || !isSerialized(n, this.mirror)) {\n return;\n }\n if (this.addedSet.has(n)) {\n deepDelete(this.addedSet, n);\n this.droppedSet.add(n);\n } else if (this.addedSet.has(m.target) && nodeId === -1) ;\n else if (isAncestorRemoved(m.target, this.mirror)) ;\n else if (this.movedSet.has(n) && this.movedMap[moveKey(nodeId, parentId)]) {\n deepDelete(this.movedSet, n);\n } else {\n this.removes.push({\n parentId,\n id: nodeId,\n isShadow: isShadowRoot(m.target) && isNativeShadowDom(m.target) ? true : void 0\n });\n processRemoves(n, this.removesSubTreeCache);\n }\n this.mapRemoves.push(n);\n });\n break;\n }\n }\n });\n /**\n * Make sure you check if `n`'s parent is blocked before calling this function\n * */\n __publicField(this, \"genAdds\", (n, target) => {\n if (this.processedNodeManager.inOtherBuffer(n, this)) return;\n if (this.addedSet.has(n) || this.movedSet.has(n)) return;\n if (this.mirror.hasNode(n)) {\n if (isIgnored(n, this.mirror, this.slimDOMOptions)) {\n return;\n }\n this.movedSet.add(n);\n let targetId = null;\n if (target && this.mirror.hasNode(target)) {\n targetId = this.mirror.getId(target);\n }\n if (targetId && targetId !== -1) {\n this.movedMap[moveKey(this.mirror.getId(n), targetId)] = true;\n }\n } else {\n this.addedSet.add(n);\n this.droppedSet.delete(n);\n }\n if (!isBlocked(n, this.blockClass, this.blockSelector, false)) {\n index.childNodes(n).forEach((childN) => this.genAdds(childN));\n if (hasShadowRoot(n)) {\n index.childNodes(index.shadowRoot(n)).forEach((childN) => {\n this.processedNodeManager.add(childN, this);\n this.genAdds(childN, n);\n });\n }\n }\n });\n }\n init(options) {\n [\n \"mutationCb\",\n \"blockClass\",\n \"blockSelector\",\n \"maskTextClass\",\n \"maskTextSelector\",\n \"inlineStylesheet\",\n \"maskInputOptions\",\n \"maskTextFn\",\n \"maskInputFn\",\n \"keepIframeSrcFn\",\n \"recordCanvas\",\n \"inlineImages\",\n \"slimDOMOptions\",\n \"dataURLOptions\",\n \"doc\",\n \"mirror\",\n \"iframeManager\",\n \"stylesheetManager\",\n \"shadowDomManager\",\n \"canvasManager\",\n \"processedNodeManager\"\n ].forEach((key) => {\n this[key] = options[key];\n });\n }\n freeze() {\n this.frozen = true;\n this.canvasManager.freeze();\n }\n unfreeze() {\n this.frozen = false;\n this.canvasManager.unfreeze();\n this.emit();\n }\n isFrozen() {\n return this.frozen;\n }\n lock() {\n this.locked = true;\n this.canvasManager.lock();\n }\n unlock() {\n this.locked = false;\n this.canvasManager.unlock();\n this.emit();\n }\n reset() {\n this.shadowDomManager.reset();\n this.canvasManager.reset();\n }\n}\nfunction deepDelete(addsSet, n) {\n addsSet.delete(n);\n index.childNodes(n).forEach((childN) => deepDelete(addsSet, childN));\n}\nfunction processRemoves(n, cache) {\n const queue = [n];\n while (queue.length) {\n const next = queue.pop();\n if (cache.has(next)) continue;\n cache.add(next);\n index.childNodes(next).forEach((n2) => queue.push(n2));\n }\n return;\n}\nfunction isParentRemoved(removes, n, mirror2) {\n if (removes.size === 0) return false;\n return _isParentRemoved(removes, n);\n}\nfunction _isParentRemoved(removes, n, _mirror2) {\n const node = index.parentNode(n);\n if (!node) return false;\n return removes.has(node);\n}\nfunction isAncestorInSet(set, n) {\n if (set.size === 0) return false;\n return _isAncestorInSet(set, n);\n}\nfunction _isAncestorInSet(set, n) {\n const parent = index.parentNode(n);\n if (!parent) {\n return false;\n }\n if (set.has(parent)) {\n return true;\n }\n return _isAncestorInSet(set, parent);\n}\nlet errorHandler;\nfunction registerErrorHandler(handler) {\n errorHandler = handler;\n}\nfunction unregisterErrorHandler() {\n errorHandler = void 0;\n}\nconst callbackWrapper = (cb) => {\n if (!errorHandler) {\n return cb;\n }\n const rrwebWrapped = (...rest) => {\n try {\n return cb(...rest);\n } catch (error) {\n if (errorHandler && errorHandler(error) === true) {\n return;\n }\n throw error;\n }\n };\n return rrwebWrapped;\n};\nconst mutationBuffers = [];\nfunction getEventTarget(event) {\n try {\n if (\"composedPath\" in event) {\n const path = event.composedPath();\n if (path.length) {\n return path[0];\n }\n } else if (\"path\" in event && event.path.length) {\n return event.path[0];\n }\n } catch {\n }\n return event && event.target;\n}\nfunction initMutationObserver(options, rootEl) {\n const mutationBuffer = new MutationBuffer();\n mutationBuffers.push(mutationBuffer);\n mutationBuffer.init(options);\n const [ObserverCtor, iframeCleanup] = mutationObserverCtor();\n const observer = new ObserverCtor(\n callbackWrapper(mutationBuffer.processMutations.bind(mutationBuffer))\n );\n observer.observe(rootEl, {\n attributes: true,\n attributeOldValue: true,\n characterData: true,\n characterDataOldValue: true,\n childList: true,\n subtree: true\n });\n return [observer, iframeCleanup];\n}\nfunction initMoveObserver({\n mousemoveCb,\n sampling,\n doc,\n mirror: mirror2\n}) {\n if (sampling.mousemove === false) {\n return () => {\n };\n }\n const threshold = typeof sampling.mousemove === \"number\" ? sampling.mousemove : 50;\n const callbackThreshold = typeof sampling.mousemoveCallback === \"number\" ? sampling.mousemoveCallback : 500;\n let positions = [];\n let timeBaseline;\n const wrappedCb = throttle(\n callbackWrapper(\n (source) => {\n const totalOffset = Date.now() - timeBaseline;\n mousemoveCb(\n positions.map((p) => {\n p.timeOffset -= totalOffset;\n return p;\n }),\n source\n );\n positions = [];\n timeBaseline = null;\n }\n ),\n callbackThreshold\n );\n const updatePosition = callbackWrapper(\n throttle(\n callbackWrapper((evt) => {\n const target = getEventTarget(evt);\n const { clientX, clientY } = legacy_isTouchEvent(evt) ? evt.changedTouches[0] : evt;\n if (!timeBaseline) {\n timeBaseline = nowTimestamp();\n }\n positions.push({\n x: clientX,\n y: clientY,\n id: mirror2.getId(target),\n timeOffset: nowTimestamp() - timeBaseline\n });\n wrappedCb(\n typeof DragEvent !== \"undefined\" && evt instanceof DragEvent ? IncrementalSource.Drag : evt instanceof MouseEvent ? IncrementalSource.MouseMove : IncrementalSource.TouchMove\n );\n }),\n threshold,\n {\n trailing: false\n }\n )\n );\n const handlers = [\n on(\"mousemove\", updatePosition, doc),\n on(\"touchmove\", updatePosition, doc),\n on(\"drag\", updatePosition, doc)\n ];\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initMouseInteractionObserver({\n mouseInteractionCb,\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n sampling\n}) {\n if (sampling.mouseInteraction === false) {\n return () => {\n };\n }\n const disableMap = sampling.mouseInteraction === true || sampling.mouseInteraction === void 0 ? {} : sampling.mouseInteraction;\n const handlers = [];\n let currentPointerType = null;\n const getHandler = (eventKey) => {\n return (event) => {\n const target = getEventTarget(event);\n if (isBlocked(target, blockClass, blockSelector, true)) {\n return;\n }\n let pointerType = null;\n let thisEventKey = eventKey;\n if (\"pointerType\" in event) {\n switch (event.pointerType) {\n case \"mouse\":\n pointerType = PointerTypes.Mouse;\n break;\n case \"touch\":\n pointerType = PointerTypes.Touch;\n break;\n case \"pen\":\n pointerType = PointerTypes.Pen;\n break;\n }\n if (pointerType === PointerTypes.Touch) {\n if (MouseInteractions[eventKey] === MouseInteractions.MouseDown) {\n thisEventKey = \"TouchStart\";\n } else if (MouseInteractions[eventKey] === MouseInteractions.MouseUp) {\n thisEventKey = \"TouchEnd\";\n }\n } else if (pointerType === PointerTypes.Pen) ;\n } else if (legacy_isTouchEvent(event)) {\n pointerType = PointerTypes.Touch;\n }\n if (pointerType !== null) {\n currentPointerType = pointerType;\n if (thisEventKey.startsWith(\"Touch\") && pointerType === PointerTypes.Touch || thisEventKey.startsWith(\"Mouse\") && pointerType === PointerTypes.Mouse) {\n pointerType = null;\n }\n } else if (MouseInteractions[eventKey] === MouseInteractions.Click) {\n pointerType = currentPointerType;\n currentPointerType = null;\n }\n const e = legacy_isTouchEvent(event) ? event.changedTouches[0] : event;\n if (!e) {\n return;\n }\n const id = mirror2.getId(target);\n const { clientX, clientY } = e;\n callbackWrapper(mouseInteractionCb)({\n type: MouseInteractions[thisEventKey],\n id,\n x: clientX,\n y: clientY,\n ...pointerType !== null && { pointerType }\n });\n };\n };\n Object.keys(MouseInteractions).filter(\n (key) => Number.isNaN(Number(key)) && !key.endsWith(\"_Departed\") && disableMap[key] !== false\n ).forEach((eventKey) => {\n let eventName = toLowerCase(eventKey);\n const handler = getHandler(eventKey);\n if (window.PointerEvent) {\n switch (MouseInteractions[eventKey]) {\n case MouseInteractions.MouseDown:\n case MouseInteractions.MouseUp:\n eventName = eventName.replace(\n \"mouse\",\n \"pointer\"\n );\n break;\n case MouseInteractions.TouchStart:\n case MouseInteractions.TouchEnd:\n return;\n }\n }\n handlers.push(on(eventName, handler, doc));\n });\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initScrollObserver({\n scrollCb,\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n sampling\n}) {\n const updatePosition = callbackWrapper(\n throttle(\n callbackWrapper((evt) => {\n const target = getEventTarget(evt);\n if (!target || isBlocked(target, blockClass, blockSelector, true)) {\n return;\n }\n const id = mirror2.getId(target);\n if (target === doc && doc.defaultView) {\n const scrollLeftTop = getWindowScroll(doc.defaultView);\n scrollCb({\n id,\n x: scrollLeftTop.left,\n y: scrollLeftTop.top\n });\n } else {\n scrollCb({\n id,\n x: target.scrollLeft,\n y: target.scrollTop\n });\n }\n }),\n sampling.scroll || 100\n )\n );\n return on(\"scroll\", updatePosition, doc);\n}\nfunction initViewportResizeObserver({ viewportResizeCb }, { win }) {\n let lastH = -1;\n let lastW = -1;\n const updateDimension = callbackWrapper(\n throttle(\n callbackWrapper(() => {\n const height = getWindowHeight();\n const width = getWindowWidth();\n if (lastH !== height || lastW !== width) {\n viewportResizeCb({\n width: Number(width),\n height: Number(height)\n });\n lastH = height;\n lastW = width;\n }\n }),\n 200\n )\n );\n return on(\"resize\", updateDimension, win);\n}\nconst INPUT_TAGS = [\"INPUT\", \"TEXTAREA\", \"SELECT\"];\nconst lastInputValueMap = /* @__PURE__ */ new WeakMap();\nfunction initInputObserver({\n inputCb,\n doc,\n mirror: mirror2,\n blockClass,\n blockSelector,\n ignoreClass,\n ignoreSelector,\n maskInputOptions,\n maskInputFn,\n sampling,\n userTriggeredOnInput\n}) {\n function eventHandler(event) {\n let target = getEventTarget(event);\n const userTriggered = event.isTrusted;\n const tagName = target && target.tagName;\n if (target && tagName === \"OPTION\") {\n target = index.parentElement(target);\n }\n if (!target || !tagName || INPUT_TAGS.indexOf(tagName) < 0 || isBlocked(target, blockClass, blockSelector, true)) {\n return;\n }\n if (target.classList.contains(ignoreClass) || ignoreSelector && target.matches(ignoreSelector)) {\n return;\n }\n let text = target.value;\n let isChecked = false;\n const type = getInputType(target) || \"\";\n if (type === \"radio\" || type === \"checkbox\") {\n isChecked = target.checked;\n } else if (maskInputOptions[tagName.toLowerCase()] || maskInputOptions[type]) {\n text = maskInputValue({\n element: target,\n maskInputOptions,\n tagName,\n type,\n value: text,\n maskInputFn\n });\n }\n cbWithDedup(\n target,\n userTriggeredOnInput ? { text, isChecked, userTriggered } : { text, isChecked }\n );\n const name = target.name;\n if (type === \"radio\" && name && isChecked) {\n doc.querySelectorAll(`input[type=\"radio\"][name=\"${name}\"]`).forEach((el) => {\n if (el !== target) {\n const text2 = el.value;\n cbWithDedup(\n el,\n userTriggeredOnInput ? { text: text2, isChecked: !isChecked, userTriggered: false } : { text: text2, isChecked: !isChecked }\n );\n }\n });\n }\n }\n function cbWithDedup(target, v) {\n const lastInputValue = lastInputValueMap.get(target);\n if (!lastInputValue || lastInputValue.text !== v.text || lastInputValue.isChecked !== v.isChecked) {\n lastInputValueMap.set(target, v);\n const id = mirror2.getId(target);\n callbackWrapper(inputCb)({\n ...v,\n id\n });\n }\n }\n const events = sampling.input === \"last\" ? [\"change\"] : [\"input\", \"change\"];\n const handlers = events.map(\n (eventName) => on(eventName, callbackWrapper(eventHandler), doc)\n );\n const currentWindow = doc.defaultView;\n if (!currentWindow) {\n return () => {\n handlers.forEach((h) => h());\n };\n }\n const propertyDescriptor = currentWindow.Object.getOwnPropertyDescriptor(\n currentWindow.HTMLInputElement.prototype,\n \"value\"\n );\n const hookProperties = [\n [currentWindow.HTMLInputElement.prototype, \"value\"],\n [currentWindow.HTMLInputElement.prototype, \"checked\"],\n [currentWindow.HTMLSelectElement.prototype, \"value\"],\n [currentWindow.HTMLTextAreaElement.prototype, \"value\"],\n // Some UI library use selectedIndex to set select value\n [currentWindow.HTMLSelectElement.prototype, \"selectedIndex\"],\n [currentWindow.HTMLOptionElement.prototype, \"selected\"]\n ];\n if (propertyDescriptor && propertyDescriptor.set) {\n handlers.push(\n ...hookProperties.map(\n (p) => hookSetter(\n p[0],\n p[1],\n {\n set() {\n callbackWrapper(eventHandler)({\n target: this,\n isTrusted: false\n // userTriggered to false as this could well be programmatic\n });\n }\n },\n false,\n currentWindow\n )\n )\n );\n }\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction getNestedCSSRulePositions(rule) {\n const positions = [];\n function recurse(childRule, pos) {\n if (hasNestedCSSRule(\"CSSGroupingRule\") && childRule.parentRule instanceof CSSGroupingRule || hasNestedCSSRule(\"CSSMediaRule\") && childRule.parentRule instanceof CSSMediaRule || hasNestedCSSRule(\"CSSSupportsRule\") && childRule.parentRule instanceof CSSSupportsRule || hasNestedCSSRule(\"CSSConditionRule\") && childRule.parentRule instanceof CSSConditionRule) {\n const rules = Array.from(\n childRule.parentRule.cssRules\n );\n const index2 = rules.indexOf(childRule);\n pos.unshift(index2);\n return recurse(childRule.parentRule, pos);\n } else if (childRule.parentStyleSheet) {\n const rules = Array.from(childRule.parentStyleSheet.cssRules);\n const index2 = rules.indexOf(childRule);\n pos.unshift(index2);\n }\n return pos;\n }\n return recurse(rule, positions);\n}\nfunction getIdAndStyleId(sheet, mirror2, styleMirror) {\n let id, styleId;\n if (!sheet) return {};\n if (sheet.ownerNode) id = mirror2.getId(sheet.ownerNode);\n else styleId = styleMirror.getId(sheet);\n return {\n styleId,\n id\n };\n}\nfunction initStyleSheetObserver({ styleSheetRuleCb, mirror: mirror2, stylesheetManager }, { win }) {\n if (!win.CSSStyleSheet || !win.CSSStyleSheet.prototype) {\n return () => {\n };\n }\n const insertRule = win.CSSStyleSheet.prototype.insertRule;\n win.CSSStyleSheet.prototype.insertRule = new Proxy(insertRule, {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n const [rule, index2] = argumentsList;\n const { id, styleId } = getIdAndStyleId(\n thisArg,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleSheetRuleCb({\n id,\n styleId,\n adds: [{ rule, index: index2 }]\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n });\n win.CSSStyleSheet.prototype.addRule = function(selector, styleBlock, index2 = this.cssRules.length) {\n const rule = `${selector} { ${styleBlock} }`;\n return win.CSSStyleSheet.prototype.insertRule.apply(this, [rule, index2]);\n };\n const deleteRule = win.CSSStyleSheet.prototype.deleteRule;\n win.CSSStyleSheet.prototype.deleteRule = new Proxy(deleteRule, {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n const [index2] = argumentsList;\n const { id, styleId } = getIdAndStyleId(\n thisArg,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleSheetRuleCb({\n id,\n styleId,\n removes: [{ index: index2 }]\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n });\n win.CSSStyleSheet.prototype.removeRule = function(index2) {\n return win.CSSStyleSheet.prototype.deleteRule.apply(this, [index2]);\n };\n let replace;\n if (win.CSSStyleSheet.prototype.replace) {\n replace = win.CSSStyleSheet.prototype.replace;\n win.CSSStyleSheet.prototype.replace = new Proxy(replace, {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n const [text] = argumentsList;\n const { id, styleId } = getIdAndStyleId(\n thisArg,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleSheetRuleCb({\n id,\n styleId,\n replace: text\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n });\n }\n let replaceSync;\n if (win.CSSStyleSheet.prototype.replaceSync) {\n replaceSync = win.CSSStyleSheet.prototype.replaceSync;\n win.CSSStyleSheet.prototype.replaceSync = new Proxy(replaceSync, {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n const [text] = argumentsList;\n const { id, styleId } = getIdAndStyleId(\n thisArg,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleSheetRuleCb({\n id,\n styleId,\n replaceSync: text\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n });\n }\n const supportedNestedCSSRuleTypes = {};\n if (canMonkeyPatchNestedCSSRule(\"CSSGroupingRule\")) {\n supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule;\n } else {\n if (canMonkeyPatchNestedCSSRule(\"CSSMediaRule\")) {\n supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule;\n }\n if (canMonkeyPatchNestedCSSRule(\"CSSConditionRule\")) {\n supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule;\n }\n if (canMonkeyPatchNestedCSSRule(\"CSSSupportsRule\")) {\n supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule;\n }\n }\n const unmodifiedFunctions = {};\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\n unmodifiedFunctions[typeKey] = {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n insertRule: type.prototype.insertRule,\n // eslint-disable-next-line @typescript-eslint/unbound-method\n deleteRule: type.prototype.deleteRule\n };\n type.prototype.insertRule = new Proxy(\n unmodifiedFunctions[typeKey].insertRule,\n {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n const [rule, index2] = argumentsList;\n const { id, styleId } = getIdAndStyleId(\n thisArg.parentStyleSheet,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleSheetRuleCb({\n id,\n styleId,\n adds: [\n {\n rule,\n index: [\n ...getNestedCSSRulePositions(thisArg),\n index2 || 0\n // defaults to 0\n ]\n }\n ]\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n }\n );\n type.prototype.deleteRule = new Proxy(\n unmodifiedFunctions[typeKey].deleteRule,\n {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n const [index2] = argumentsList;\n const { id, styleId } = getIdAndStyleId(\n thisArg.parentStyleSheet,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleSheetRuleCb({\n id,\n styleId,\n removes: [\n { index: [...getNestedCSSRulePositions(thisArg), index2] }\n ]\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n }\n );\n });\n return callbackWrapper(() => {\n win.CSSStyleSheet.prototype.insertRule = insertRule;\n win.CSSStyleSheet.prototype.deleteRule = deleteRule;\n replace && (win.CSSStyleSheet.prototype.replace = replace);\n replaceSync && (win.CSSStyleSheet.prototype.replaceSync = replaceSync);\n Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\n type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule;\n type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule;\n });\n });\n}\nfunction initAdoptedStyleSheetObserver({\n mirror: mirror2,\n stylesheetManager\n}, host2) {\n var _a2, _b, _c;\n let hostId = null;\n if (host2.nodeName === \"#document\") hostId = mirror2.getId(host2);\n else hostId = mirror2.getId(index.host(host2));\n const patchTarget = host2.nodeName === \"#document\" ? (_a2 = host2.defaultView) == null ? void 0 : _a2.Document : (_c = (_b = host2.ownerDocument) == null ? void 0 : _b.defaultView) == null ? void 0 : _c.ShadowRoot;\n const originalPropertyDescriptor = (patchTarget == null ? void 0 : patchTarget.prototype) ? Object.getOwnPropertyDescriptor(\n patchTarget == null ? void 0 : patchTarget.prototype,\n \"adoptedStyleSheets\"\n ) : void 0;\n if (hostId === null || hostId === -1 || !patchTarget || !originalPropertyDescriptor)\n return () => {\n };\n Object.defineProperty(host2, \"adoptedStyleSheets\", {\n configurable: originalPropertyDescriptor.configurable,\n enumerable: originalPropertyDescriptor.enumerable,\n get() {\n var _a3;\n return (_a3 = originalPropertyDescriptor.get) == null ? void 0 : _a3.call(this);\n },\n set(sheets) {\n var _a3;\n const result = (_a3 = originalPropertyDescriptor.set) == null ? void 0 : _a3.call(this, sheets);\n if (hostId !== null && hostId !== -1) {\n try {\n stylesheetManager.adoptStyleSheets(sheets, hostId);\n } catch (e) {\n }\n }\n return result;\n }\n });\n return callbackWrapper(() => {\n Object.defineProperty(host2, \"adoptedStyleSheets\", {\n configurable: originalPropertyDescriptor.configurable,\n enumerable: originalPropertyDescriptor.enumerable,\n // eslint-disable-next-line @typescript-eslint/unbound-method\n get: originalPropertyDescriptor.get,\n // eslint-disable-next-line @typescript-eslint/unbound-method\n set: originalPropertyDescriptor.set\n });\n });\n}\nfunction initStyleDeclarationObserver({\n styleDeclarationCb,\n mirror: mirror2,\n ignoreCSSAttributes,\n stylesheetManager\n}, { win }) {\n const setProperty = win.CSSStyleDeclaration.prototype.setProperty;\n win.CSSStyleDeclaration.prototype.setProperty = new Proxy(setProperty, {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n var _a2;\n const [property, value, priority] = argumentsList;\n if (ignoreCSSAttributes.has(property)) {\n return setProperty.apply(thisArg, [property, value, priority]);\n }\n const { id, styleId } = getIdAndStyleId(\n (_a2 = thisArg.parentRule) == null ? void 0 : _a2.parentStyleSheet,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleDeclarationCb({\n id,\n styleId,\n set: {\n property,\n value,\n priority\n },\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n index: getNestedCSSRulePositions(thisArg.parentRule)\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n });\n const removeProperty = win.CSSStyleDeclaration.prototype.removeProperty;\n win.CSSStyleDeclaration.prototype.removeProperty = new Proxy(removeProperty, {\n apply: callbackWrapper(\n (target, thisArg, argumentsList) => {\n var _a2;\n const [property] = argumentsList;\n if (ignoreCSSAttributes.has(property)) {\n return removeProperty.apply(thisArg, [property]);\n }\n const { id, styleId } = getIdAndStyleId(\n (_a2 = thisArg.parentRule) == null ? void 0 : _a2.parentStyleSheet,\n mirror2,\n stylesheetManager.styleMirror\n );\n if (id && id !== -1 || styleId && styleId !== -1) {\n styleDeclarationCb({\n id,\n styleId,\n remove: {\n property\n },\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n index: getNestedCSSRulePositions(thisArg.parentRule)\n });\n }\n return target.apply(thisArg, argumentsList);\n }\n )\n });\n return callbackWrapper(() => {\n win.CSSStyleDeclaration.prototype.setProperty = setProperty;\n win.CSSStyleDeclaration.prototype.removeProperty = removeProperty;\n });\n}\nfunction initMediaInteractionObserver({\n mediaInteractionCb,\n blockClass,\n blockSelector,\n mirror: mirror2,\n sampling,\n doc\n}) {\n const handler = callbackWrapper(\n (type) => throttle(\n callbackWrapper((event) => {\n const target = getEventTarget(event);\n if (!target || isBlocked(target, blockClass, blockSelector, true)) {\n return;\n }\n const { currentTime, volume, muted, playbackRate, loop } = target;\n mediaInteractionCb({\n type,\n id: mirror2.getId(target),\n currentTime,\n volume,\n muted,\n playbackRate,\n loop\n });\n }),\n sampling.media || 500\n )\n );\n const handlers = [\n on(\"play\", handler(MediaInteractions.Play), doc),\n on(\"pause\", handler(MediaInteractions.Pause), doc),\n on(\"seeked\", handler(MediaInteractions.Seeked), doc),\n on(\"volumechange\", handler(MediaInteractions.VolumeChange), doc),\n on(\"ratechange\", handler(MediaInteractions.RateChange), doc)\n ];\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initFontObserver({ fontCb, doc }) {\n const win = doc.defaultView;\n if (!win) {\n return () => {\n };\n }\n const handlers = [];\n const fontMap = /* @__PURE__ */ new WeakMap();\n const originalFontFace = win.FontFace;\n win.FontFace = function FontFace(family, source, descriptors) {\n const fontFace = new originalFontFace(family, source, descriptors);\n fontMap.set(fontFace, {\n family,\n buffer: typeof source !== \"string\",\n descriptors,\n fontSource: typeof source === \"string\" ? source : JSON.stringify(Array.from(new Uint8Array(source)))\n });\n return fontFace;\n };\n const restoreHandler = patch(\n doc.fonts,\n \"add\",\n function(original) {\n return function(fontFace) {\n setTimeout(\n callbackWrapper(() => {\n const p = fontMap.get(fontFace);\n if (p) {\n fontCb(p);\n fontMap.delete(fontFace);\n }\n }),\n 0\n );\n return original.apply(this, [fontFace]);\n };\n }\n );\n handlers.push(() => {\n win.FontFace = originalFontFace;\n });\n handlers.push(restoreHandler);\n return callbackWrapper(() => {\n handlers.forEach((h) => h());\n });\n}\nfunction initSelectionObserver(param) {\n const { doc, mirror: mirror2, blockClass, blockSelector, selectionCb } = param;\n let collapsed = true;\n const updateSelection = callbackWrapper(() => {\n const selection = doc.getSelection();\n if (!selection || collapsed && (selection == null ? void 0 : selection.isCollapsed)) return;\n collapsed = selection.isCollapsed || false;\n const ranges = [];\n const count = selection.rangeCount || 0;\n for (let i = 0; i < count; i++) {\n const range = selection.getRangeAt(i);\n const { startContainer, startOffset, endContainer, endOffset } = range;\n const blocked = isBlocked(startContainer, blockClass, blockSelector, true) || isBlocked(endContainer, blockClass, blockSelector, true);\n if (blocked) continue;\n ranges.push({\n start: mirror2.getId(startContainer),\n startOffset,\n end: mirror2.getId(endContainer),\n endOffset\n });\n }\n selectionCb({ ranges });\n });\n updateSelection();\n return on(\"selectionchange\", updateSelection);\n}\nfunction initCustomElementObserver({\n doc,\n customElementCb\n}) {\n const win = doc.defaultView;\n if (!win || !win.customElements) return () => {\n };\n const restoreHandler = patch(\n win.customElements,\n \"define\",\n function(original) {\n return function(name, constructor, options) {\n try {\n customElementCb({\n define: {\n name\n }\n });\n } catch (e) {\n console.warn(`Custom element callback failed for ${name}`);\n }\n return original.apply(this, [name, constructor, options]);\n };\n }\n );\n return restoreHandler;\n}\nfunction mergeHooks(o, hooks) {\n const {\n mutationCb,\n mousemoveCb,\n mouseInteractionCb,\n scrollCb,\n viewportResizeCb,\n inputCb,\n mediaInteractionCb,\n styleSheetRuleCb,\n styleDeclarationCb,\n canvasMutationCb,\n fontCb,\n selectionCb,\n customElementCb\n } = o;\n o.mutationCb = (...p) => {\n if (hooks.mutation) {\n hooks.mutation(...p);\n }\n mutationCb(...p);\n };\n o.mousemoveCb = (...p) => {\n if (hooks.mousemove) {\n hooks.mousemove(...p);\n }\n mousemoveCb(...p);\n };\n o.mouseInteractionCb = (...p) => {\n if (hooks.mouseInteraction) {\n hooks.mouseInteraction(...p);\n }\n mouseInteractionCb(...p);\n };\n o.scrollCb = (...p) => {\n if (hooks.scroll) {\n hooks.scroll(...p);\n }\n scrollCb(...p);\n };\n o.viewportResizeCb = (...p) => {\n if (hooks.viewportResize) {\n hooks.viewportResize(...p);\n }\n viewportResizeCb(...p);\n };\n o.inputCb = (...p) => {\n if (hooks.input) {\n hooks.input(...p);\n }\n inputCb(...p);\n };\n o.mediaInteractionCb = (...p) => {\n if (hooks.mediaInteaction) {\n hooks.mediaInteaction(...p);\n }\n mediaInteractionCb(...p);\n };\n o.styleSheetRuleCb = (...p) => {\n if (hooks.styleSheetRule) {\n hooks.styleSheetRule(...p);\n }\n styleSheetRuleCb(...p);\n };\n o.styleDeclarationCb = (...p) => {\n if (hooks.styleDeclaration) {\n hooks.styleDeclaration(...p);\n }\n styleDeclarationCb(...p);\n };\n o.canvasMutationCb = (...p) => {\n if (hooks.canvasMutation) {\n hooks.canvasMutation(...p);\n }\n canvasMutationCb(...p);\n };\n o.fontCb = (...p) => {\n if (hooks.font) {\n hooks.font(...p);\n }\n fontCb(...p);\n };\n o.selectionCb = (...p) => {\n if (hooks.selection) {\n hooks.selection(...p);\n }\n selectionCb(...p);\n };\n o.customElementCb = (...c) => {\n if (hooks.customElement) {\n hooks.customElement(...c);\n }\n customElementCb(...c);\n };\n}\nfunction initObservers(o, hooks = {}) {\n const currentWindow = o.doc.defaultView;\n if (!currentWindow) {\n return () => {\n };\n }\n mergeHooks(o, hooks);\n let mutationObserver;\n let cleanupMutationIframe = () => {\n };\n if (o.recordDOM) {\n [mutationObserver, cleanupMutationIframe] = initMutationObserver(o, o.doc);\n }\n const mousemoveHandler = initMoveObserver(o);\n const mouseInteractionHandler = initMouseInteractionObserver(o);\n const scrollHandler = initScrollObserver(o);\n const viewportResizeHandler = initViewportResizeObserver(o, {\n win: currentWindow\n });\n const inputHandler = initInputObserver(o);\n const mediaInteractionHandler = initMediaInteractionObserver(o);\n let styleSheetObserver = () => {\n };\n let adoptedStyleSheetObserver = () => {\n };\n let styleDeclarationObserver = () => {\n };\n let fontObserver = () => {\n };\n if (o.recordDOM) {\n styleSheetObserver = initStyleSheetObserver(o, { win: currentWindow });\n adoptedStyleSheetObserver = initAdoptedStyleSheetObserver(o, o.doc);\n styleDeclarationObserver = initStyleDeclarationObserver(o, {\n win: currentWindow\n });\n if (o.collectFonts) {\n fontObserver = initFontObserver(o);\n }\n }\n const selectionObserver = initSelectionObserver(o);\n const customElementObserver = initCustomElementObserver(o);\n const pluginHandlers = [];\n for (const plugin of o.plugins) {\n pluginHandlers.push(\n plugin.observer(plugin.callback, currentWindow, plugin.options)\n );\n }\n return callbackWrapper(() => {\n mutationBuffers.forEach((b) => b.reset());\n mutationObserver == null ? void 0 : mutationObserver.disconnect();\n cleanupMutationIframe();\n mousemoveHandler();\n mouseInteractionHandler();\n scrollHandler();\n viewportResizeHandler();\n inputHandler();\n mediaInteractionHandler();\n styleSheetObserver();\n adoptedStyleSheetObserver();\n styleDeclarationObserver();\n fontObserver();\n selectionObserver();\n customElementObserver();\n pluginHandlers.forEach((h) => h());\n });\n}\nfunction hasNestedCSSRule(prop) {\n return typeof window[prop] !== \"undefined\";\n}\nfunction canMonkeyPatchNestedCSSRule(prop) {\n return Boolean(\n typeof window[prop] !== \"undefined\" && // Note: Generally, this check _shouldn't_ be necessary\n // However, in some scenarios (e.g. jsdom) this can sometimes fail, so we check for it here\n window[prop].prototype && \"insertRule\" in window[prop].prototype && \"deleteRule\" in window[prop].prototype\n );\n}\nclass CrossOriginIframeMirror {\n constructor(generateIdFn) {\n __publicField(this, \"iframeIdToRemoteIdMap\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"iframeRemoteIdToIdMap\", /* @__PURE__ */ new WeakMap());\n this.generateIdFn = generateIdFn;\n }\n getId(iframe, remoteId, idToRemoteMap, remoteToIdMap) {\n const idToRemoteIdMap = idToRemoteMap || this.getIdToRemoteIdMap(iframe);\n const remoteIdToIdMap = remoteToIdMap || this.getRemoteIdToIdMap(iframe);\n let id = idToRemoteIdMap.get(remoteId);\n if (!id) {\n id = this.generateIdFn();\n idToRemoteIdMap.set(remoteId, id);\n remoteIdToIdMap.set(id, remoteId);\n }\n return id;\n }\n getIds(iframe, remoteId) {\n const idToRemoteIdMap = this.getIdToRemoteIdMap(iframe);\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\n return remoteId.map(\n (id) => this.getId(iframe, id, idToRemoteIdMap, remoteIdToIdMap)\n );\n }\n getRemoteId(iframe, id, map) {\n const remoteIdToIdMap = map || this.getRemoteIdToIdMap(iframe);\n if (typeof id !== \"number\") return id;\n const remoteId = remoteIdToIdMap.get(id);\n if (!remoteId) return -1;\n return remoteId;\n }\n getRemoteIds(iframe, ids) {\n const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\n return ids.map((id) => this.getRemoteId(iframe, id, remoteIdToIdMap));\n }\n reset(iframe) {\n if (!iframe) {\n this.iframeIdToRemoteIdMap = /* @__PURE__ */ new WeakMap();\n this.iframeRemoteIdToIdMap = /* @__PURE__ */ new WeakMap();\n return;\n }\n this.iframeIdToRemoteIdMap.delete(iframe);\n this.iframeRemoteIdToIdMap.delete(iframe);\n }\n getIdToRemoteIdMap(iframe) {\n let idToRemoteIdMap = this.iframeIdToRemoteIdMap.get(iframe);\n if (!idToRemoteIdMap) {\n idToRemoteIdMap = /* @__PURE__ */ new Map();\n this.iframeIdToRemoteIdMap.set(iframe, idToRemoteIdMap);\n }\n return idToRemoteIdMap;\n }\n getRemoteIdToIdMap(iframe) {\n let remoteIdToIdMap = this.iframeRemoteIdToIdMap.get(iframe);\n if (!remoteIdToIdMap) {\n remoteIdToIdMap = /* @__PURE__ */ new Map();\n this.iframeRemoteIdToIdMap.set(iframe, remoteIdToIdMap);\n }\n return remoteIdToIdMap;\n }\n}\nclass IframeManager {\n constructor(options) {\n __publicField(this, \"iframes\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"crossOriginIframeMap\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"crossOriginIframeMirror\", new CrossOriginIframeMirror(genId));\n __publicField(this, \"crossOriginIframeStyleMirror\");\n __publicField(this, \"crossOriginIframeRootIdMap\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"mirror\");\n __publicField(this, \"mutationCb\");\n __publicField(this, \"wrappedEmit\");\n __publicField(this, \"loadListener\");\n __publicField(this, \"stylesheetManager\");\n __publicField(this, \"recordCrossOriginIframes\");\n this.mutationCb = options.mutationCb;\n this.wrappedEmit = options.wrappedEmit;\n this.stylesheetManager = options.stylesheetManager;\n this.recordCrossOriginIframes = options.recordCrossOriginIframes;\n this.crossOriginIframeStyleMirror = new CrossOriginIframeMirror(\n this.stylesheetManager.styleMirror.generateId.bind(\n this.stylesheetManager.styleMirror\n )\n );\n this.mirror = options.mirror;\n if (this.recordCrossOriginIframes) {\n window.addEventListener(\"message\", this.handleMessage.bind(this));\n }\n }\n addIframe(iframeEl) {\n this.iframes.set(iframeEl, true);\n if (iframeEl.contentWindow)\n this.crossOriginIframeMap.set(iframeEl.contentWindow, iframeEl);\n }\n addLoadListener(cb) {\n this.loadListener = cb;\n }\n attachIframe(iframeEl, childSn) {\n var _a2, _b;\n this.mutationCb({\n adds: [\n {\n parentId: this.mirror.getId(iframeEl),\n nextId: null,\n node: childSn\n }\n ],\n removes: [],\n texts: [],\n attributes: [],\n isAttachIframe: true\n });\n if (this.recordCrossOriginIframes)\n (_a2 = iframeEl.contentWindow) == null ? void 0 : _a2.addEventListener(\n \"message\",\n this.handleMessage.bind(this)\n );\n (_b = this.loadListener) == null ? void 0 : _b.call(this, iframeEl);\n if (iframeEl.contentDocument && iframeEl.contentDocument.adoptedStyleSheets && iframeEl.contentDocument.adoptedStyleSheets.length > 0)\n this.stylesheetManager.adoptStyleSheets(\n iframeEl.contentDocument.adoptedStyleSheets,\n this.mirror.getId(iframeEl.contentDocument)\n );\n }\n handleMessage(message) {\n const crossOriginMessageEvent = message;\n if (crossOriginMessageEvent.data.type !== \"rrweb\" || // To filter out the rrweb messages which are forwarded by some sites.\n crossOriginMessageEvent.origin !== crossOriginMessageEvent.data.origin)\n return;\n const iframeSourceWindow = message.source;\n if (!iframeSourceWindow) return;\n const iframeEl = this.crossOriginIframeMap.get(message.source);\n if (!iframeEl) return;\n const transformedEvent = this.transformCrossOriginEvent(\n iframeEl,\n crossOriginMessageEvent.data.event\n );\n if (transformedEvent)\n this.wrappedEmit(\n transformedEvent,\n crossOriginMessageEvent.data.isCheckout\n );\n }\n transformCrossOriginEvent(iframeEl, e) {\n var _a2;\n switch (e.type) {\n case EventType.FullSnapshot: {\n this.crossOriginIframeMirror.reset(iframeEl);\n this.crossOriginIframeStyleMirror.reset(iframeEl);\n this.replaceIdOnNode(e.data.node, iframeEl);\n const rootId = e.data.node.id;\n this.crossOriginIframeRootIdMap.set(iframeEl, rootId);\n this.patchRootIdOnNode(e.data.node, rootId);\n return {\n timestamp: e.timestamp,\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Mutation,\n adds: [\n {\n parentId: this.mirror.getId(iframeEl),\n nextId: null,\n node: e.data.node\n }\n ],\n removes: [],\n texts: [],\n attributes: [],\n isAttachIframe: true\n }\n };\n }\n case EventType.Meta:\n case EventType.Load:\n case EventType.DomContentLoaded: {\n return false;\n }\n case EventType.Plugin: {\n return e;\n }\n case EventType.Custom: {\n this.replaceIds(\n e.data.payload,\n iframeEl,\n [\"id\", \"parentId\", \"previousId\", \"nextId\"]\n );\n return e;\n }\n case EventType.IncrementalSnapshot: {\n switch (e.data.source) {\n case IncrementalSource.Mutation: {\n e.data.adds.forEach((n) => {\n this.replaceIds(n, iframeEl, [\n \"parentId\",\n \"nextId\",\n \"previousId\"\n ]);\n this.replaceIdOnNode(n.node, iframeEl);\n const rootId = this.crossOriginIframeRootIdMap.get(iframeEl);\n rootId && this.patchRootIdOnNode(n.node, rootId);\n });\n e.data.removes.forEach((n) => {\n this.replaceIds(n, iframeEl, [\"parentId\", \"id\"]);\n });\n e.data.attributes.forEach((n) => {\n this.replaceIds(n, iframeEl, [\"id\"]);\n });\n e.data.texts.forEach((n) => {\n this.replaceIds(n, iframeEl, [\"id\"]);\n });\n return e;\n }\n case IncrementalSource.Drag:\n case IncrementalSource.TouchMove:\n case IncrementalSource.MouseMove: {\n e.data.positions.forEach((p) => {\n this.replaceIds(p, iframeEl, [\"id\"]);\n });\n return e;\n }\n case IncrementalSource.ViewportResize: {\n return false;\n }\n case IncrementalSource.MediaInteraction:\n case IncrementalSource.MouseInteraction:\n case IncrementalSource.Scroll:\n case IncrementalSource.CanvasMutation:\n case IncrementalSource.Input: {\n this.replaceIds(e.data, iframeEl, [\"id\"]);\n return e;\n }\n case IncrementalSource.StyleSheetRule:\n case IncrementalSource.StyleDeclaration: {\n this.replaceIds(e.data, iframeEl, [\"id\"]);\n this.replaceStyleIds(e.data, iframeEl, [\"styleId\"]);\n return e;\n }\n case IncrementalSource.Font: {\n return e;\n }\n case IncrementalSource.Selection: {\n e.data.ranges.forEach((range) => {\n this.replaceIds(range, iframeEl, [\"start\", \"end\"]);\n });\n return e;\n }\n case IncrementalSource.AdoptedStyleSheet: {\n this.replaceIds(e.data, iframeEl, [\"id\"]);\n this.replaceStyleIds(e.data, iframeEl, [\"styleIds\"]);\n (_a2 = e.data.styles) == null ? void 0 : _a2.forEach((style) => {\n this.replaceStyleIds(style, iframeEl, [\"styleId\"]);\n });\n return e;\n }\n }\n }\n }\n return false;\n }\n replace(iframeMirror, obj, iframeEl, keys) {\n for (const key of keys) {\n if (!Array.isArray(obj[key]) && typeof obj[key] !== \"number\") continue;\n if (Array.isArray(obj[key])) {\n obj[key] = iframeMirror.getIds(\n iframeEl,\n obj[key]\n );\n } else {\n obj[key] = iframeMirror.getId(iframeEl, obj[key]);\n }\n }\n return obj;\n }\n replaceIds(obj, iframeEl, keys) {\n return this.replace(this.crossOriginIframeMirror, obj, iframeEl, keys);\n }\n replaceStyleIds(obj, iframeEl, keys) {\n return this.replace(this.crossOriginIframeStyleMirror, obj, iframeEl, keys);\n }\n replaceIdOnNode(node, iframeEl) {\n this.replaceIds(node, iframeEl, [\"id\", \"rootId\"]);\n if (\"childNodes\" in node) {\n node.childNodes.forEach((child) => {\n this.replaceIdOnNode(child, iframeEl);\n });\n }\n }\n patchRootIdOnNode(node, rootId) {\n if (node.type !== NodeType.Document && !node.rootId) node.rootId = rootId;\n if (\"childNodes\" in node) {\n node.childNodes.forEach((child) => {\n this.patchRootIdOnNode(child, rootId);\n });\n }\n }\n}\nclass ShadowDomManager {\n constructor(options) {\n __publicField(this, \"shadowDoms\", /* @__PURE__ */ new WeakSet());\n __publicField(this, \"mutationCb\");\n __publicField(this, \"scrollCb\");\n __publicField(this, \"bypassOptions\");\n __publicField(this, \"mirror\");\n __publicField(this, \"restoreHandlers\", []);\n this.mutationCb = options.mutationCb;\n this.scrollCb = options.scrollCb;\n this.bypassOptions = options.bypassOptions;\n this.mirror = options.mirror;\n this.init();\n }\n init() {\n this.reset();\n this.patchAttachShadow(Element, document);\n }\n addShadowRoot(shadowRoot2, doc) {\n if (!isNativeShadowDom(shadowRoot2)) return;\n if (this.shadowDoms.has(shadowRoot2)) return;\n this.shadowDoms.add(shadowRoot2);\n const [observer] = initMutationObserver(\n {\n ...this.bypassOptions,\n doc,\n mutationCb: this.mutationCb,\n mirror: this.mirror,\n shadowDomManager: this\n },\n shadowRoot2\n );\n this.restoreHandlers.push(() => observer.disconnect());\n this.restoreHandlers.push(\n initScrollObserver({\n ...this.bypassOptions,\n scrollCb: this.scrollCb,\n // https://gist.github.com/praveenpuglia/0832da687ed5a5d7a0907046c9ef1813\n // scroll is not allowed to pass the boundary, so we need to listen the shadow document\n doc: shadowRoot2,\n mirror: this.mirror\n })\n );\n setTimeout(() => {\n if (shadowRoot2.adoptedStyleSheets && shadowRoot2.adoptedStyleSheets.length > 0)\n this.bypassOptions.stylesheetManager.adoptStyleSheets(\n shadowRoot2.adoptedStyleSheets,\n this.mirror.getId(index.host(shadowRoot2))\n );\n this.restoreHandlers.push(\n initAdoptedStyleSheetObserver(\n {\n mirror: this.mirror,\n stylesheetManager: this.bypassOptions.stylesheetManager\n },\n shadowRoot2\n )\n );\n }, 0);\n }\n /**\n * Monkey patch 'attachShadow' of an IFrameElement to observe newly added shadow doms.\n */\n observeAttachShadow(iframeElement) {\n if (!iframeElement.contentWindow || !iframeElement.contentDocument) return;\n this.patchAttachShadow(\n iframeElement.contentWindow.Element,\n iframeElement.contentDocument\n );\n }\n /**\n * Patch 'attachShadow' to observe newly added shadow doms.\n */\n patchAttachShadow(element, doc) {\n const manager = this;\n this.restoreHandlers.push(\n patch(\n element.prototype,\n \"attachShadow\",\n function(original) {\n return function(option) {\n const sRoot = original.call(this, option);\n const shadowRootEl = index.shadowRoot(this);\n if (shadowRootEl && inDom(this))\n manager.addShadowRoot(shadowRootEl, doc);\n return sRoot;\n };\n }\n )\n );\n }\n reset() {\n this.restoreHandlers.forEach((handler) => {\n try {\n handler();\n } catch (e) {\n }\n });\n this.restoreHandlers = [];\n this.shadowDoms = /* @__PURE__ */ new WeakSet();\n }\n}\nvar chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nvar lookup = typeof Uint8Array === \"undefined\" ? [] : new Uint8Array(256);\nfor (var i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\nvar encode = function(arraybuffer) {\n var bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = \"\";\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];\n base64 += chars[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];\n base64 += chars[bytes[i + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + \"=\";\n } else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + \"==\";\n }\n return base64;\n};\nconst canvasVarMap = /* @__PURE__ */ new Map();\nfunction variableListFor(ctx, ctor) {\n let contextMap = canvasVarMap.get(ctx);\n if (!contextMap) {\n contextMap = /* @__PURE__ */ new Map();\n canvasVarMap.set(ctx, contextMap);\n }\n if (!contextMap.has(ctor)) {\n contextMap.set(ctor, []);\n }\n return contextMap.get(ctor);\n}\nconst saveWebGLVar = (value, win, ctx) => {\n if (!value || !(isInstanceOfWebGLObject(value, win) || typeof value === \"object\"))\n return;\n const name = value.constructor.name;\n const list = variableListFor(ctx, name);\n let index2 = list.indexOf(value);\n if (index2 === -1) {\n index2 = list.length;\n list.push(value);\n }\n return index2;\n};\nfunction serializeArg(value, win, ctx) {\n if (value instanceof Array) {\n return value.map((arg) => serializeArg(arg, win, ctx));\n } else if (value === null) {\n return value;\n } else if (value instanceof Float32Array || value instanceof Float64Array || value instanceof Int32Array || value instanceof Uint32Array || value instanceof Uint8Array || value instanceof Uint16Array || value instanceof Int16Array || value instanceof Int8Array || value instanceof Uint8ClampedArray) {\n const name = value.constructor.name;\n return {\n rr_type: name,\n args: [Object.values(value)]\n };\n } else if (\n // SharedArrayBuffer disabled on most browsers due to spectre.\n // More info: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/SharedArrayBuffer\n // value instanceof SharedArrayBuffer ||\n value instanceof ArrayBuffer\n ) {\n const name = value.constructor.name;\n const base64 = encode(value);\n return {\n rr_type: name,\n base64\n };\n } else if (value instanceof DataView) {\n const name = value.constructor.name;\n return {\n rr_type: name,\n args: [\n serializeArg(value.buffer, win, ctx),\n value.byteOffset,\n value.byteLength\n ]\n };\n } else if (value instanceof HTMLImageElement) {\n const name = value.constructor.name;\n const { src } = value;\n return {\n rr_type: name,\n src\n };\n } else if (value instanceof HTMLCanvasElement) {\n const name = \"HTMLImageElement\";\n const src = value.toDataURL();\n return {\n rr_type: name,\n src\n };\n } else if (value instanceof ImageData) {\n const name = value.constructor.name;\n return {\n rr_type: name,\n args: [serializeArg(value.data, win, ctx), value.width, value.height]\n };\n } else if (isInstanceOfWebGLObject(value, win) || typeof value === \"object\") {\n const name = value.constructor.name;\n const index2 = saveWebGLVar(value, win, ctx);\n return {\n rr_type: name,\n index: index2\n };\n }\n return value;\n}\nconst serializeArgs = (args, win, ctx) => {\n return args.map((arg) => serializeArg(arg, win, ctx));\n};\nconst isInstanceOfWebGLObject = (value, win) => {\n const webGLConstructorNames = [\n \"WebGLActiveInfo\",\n \"WebGLBuffer\",\n \"WebGLFramebuffer\",\n \"WebGLProgram\",\n \"WebGLRenderbuffer\",\n \"WebGLShader\",\n \"WebGLShaderPrecisionFormat\",\n \"WebGLTexture\",\n \"WebGLUniformLocation\",\n \"WebGLVertexArrayObject\",\n // In old Chrome versions, value won't be an instanceof WebGLVertexArrayObject.\n \"WebGLVertexArrayObjectOES\"\n ];\n const supportedWebGLConstructorNames = webGLConstructorNames.filter(\n (name) => typeof win[name] === \"function\"\n );\n return Boolean(\n supportedWebGLConstructorNames.find(\n (name) => value instanceof win[name]\n )\n );\n};\nfunction initCanvas2DMutationObserver(cb, win, blockClass, blockSelector) {\n const handlers = [];\n const props2D = Object.getOwnPropertyNames(\n win.CanvasRenderingContext2D.prototype\n );\n for (const prop of props2D) {\n try {\n if (typeof win.CanvasRenderingContext2D.prototype[prop] !== \"function\") {\n continue;\n }\n const restoreHandler = patch(\n win.CanvasRenderingContext2D.prototype,\n prop,\n function(original) {\n return function(...args) {\n if (!isBlocked(this.canvas, blockClass, blockSelector, true)) {\n setTimeout(() => {\n const recordArgs = serializeArgs(args, win, this);\n cb(this.canvas, {\n type: CanvasContext[\"2D\"],\n property: prop,\n args: recordArgs\n });\n }, 0);\n }\n return original.apply(this, args);\n };\n }\n );\n handlers.push(restoreHandler);\n } catch {\n const hookHandler = hookSetter(\n win.CanvasRenderingContext2D.prototype,\n prop,\n {\n set(v) {\n cb(this.canvas, {\n type: CanvasContext[\"2D\"],\n property: prop,\n args: [v],\n setter: true\n });\n }\n }\n );\n handlers.push(hookHandler);\n }\n }\n return () => {\n handlers.forEach((h) => h());\n };\n}\nfunction getNormalizedContextName(contextType) {\n return contextType === \"experimental-webgl\" ? \"webgl\" : contextType;\n}\nfunction initCanvasContextObserver(win, blockClass, blockSelector, setPreserveDrawingBufferToTrue) {\n const handlers = [];\n try {\n const restoreHandler = patch(\n win.HTMLCanvasElement.prototype,\n \"getContext\",\n function(original) {\n return function(contextType, ...args) {\n if (!isBlocked(this, blockClass, blockSelector, true)) {\n const ctxName = getNormalizedContextName(contextType);\n if (!(\"__context\" in this)) this.__context = ctxName;\n if (setPreserveDrawingBufferToTrue && [\"webgl\", \"webgl2\"].includes(ctxName)) {\n if (args[0] && typeof args[0] === \"object\") {\n const contextAttributes = args[0];\n if (!contextAttributes.preserveDrawingBuffer) {\n contextAttributes.preserveDrawingBuffer = true;\n }\n } else {\n args.splice(0, 1, {\n preserveDrawingBuffer: true\n });\n }\n }\n }\n return original.apply(this, [contextType, ...args]);\n };\n }\n );\n handlers.push(restoreHandler);\n } catch {\n console.error(\"failed to patch HTMLCanvasElement.prototype.getContext\");\n }\n return () => {\n handlers.forEach((h) => h());\n };\n}\nfunction patchGLPrototype(prototype, type, cb, blockClass, blockSelector, win) {\n const handlers = [];\n const props = Object.getOwnPropertyNames(prototype);\n for (const prop of props) {\n if (\n //prop.startsWith('get') || // e.g. getProgramParameter, but too risky\n [\n \"isContextLost\",\n \"canvas\",\n \"drawingBufferWidth\",\n \"drawingBufferHeight\"\n ].includes(prop)\n ) {\n continue;\n }\n try {\n if (typeof prototype[prop] !== \"function\") {\n continue;\n }\n const restoreHandler = patch(\n prototype,\n prop,\n function(original) {\n return function(...args) {\n const result = original.apply(this, args);\n saveWebGLVar(result, win, this);\n if (\"tagName\" in this.canvas && !isBlocked(this.canvas, blockClass, blockSelector, true)) {\n const recordArgs = serializeArgs(args, win, this);\n const mutation = {\n type,\n property: prop,\n args: recordArgs\n };\n cb(this.canvas, mutation);\n }\n return result;\n };\n }\n );\n handlers.push(restoreHandler);\n } catch {\n const hookHandler = hookSetter(prototype, prop, {\n set(v) {\n cb(this.canvas, {\n type,\n property: prop,\n args: [v],\n setter: true\n });\n }\n });\n handlers.push(hookHandler);\n }\n }\n return handlers;\n}\nfunction initCanvasWebGLMutationObserver(cb, win, blockClass, blockSelector) {\n const handlers = [];\n if (typeof win.WebGLRenderingContext !== \"undefined\") {\n handlers.push(\n ...patchGLPrototype(\n win.WebGLRenderingContext.prototype,\n CanvasContext.WebGL,\n cb,\n blockClass,\n blockSelector,\n win\n )\n );\n }\n if (typeof win.WebGL2RenderingContext !== \"undefined\") {\n handlers.push(\n ...patchGLPrototype(\n win.WebGL2RenderingContext.prototype,\n CanvasContext.WebGL2,\n cb,\n blockClass,\n blockSelector,\n win\n )\n );\n }\n return () => {\n handlers.forEach((h) => h());\n };\n}\nconst jsContent = '(function() {\\n \"use strict\";\\n var chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\\n var lookup = typeof Uint8Array === \"undefined\" ? [] : new Uint8Array(256);\\n for (var i = 0; i < chars.length; i++) {\\n lookup[chars.charCodeAt(i)] = i;\\n }\\n var encode = function(arraybuffer) {\\n var bytes = new Uint8Array(arraybuffer), i2, len = bytes.length, base64 = \"\";\\n for (i2 = 0; i2 < len; i2 += 3) {\\n base64 += chars[bytes[i2] >> 2];\\n base64 += chars[(bytes[i2] & 3) << 4 | bytes[i2 + 1] >> 4];\\n base64 += chars[(bytes[i2 + 1] & 15) << 2 | bytes[i2 + 2] >> 6];\\n base64 += chars[bytes[i2 + 2] & 63];\\n }\\n if (len % 3 === 2) {\\n base64 = base64.substring(0, base64.length - 1) + \"=\";\\n } else if (len % 3 === 1) {\\n base64 = base64.substring(0, base64.length - 2) + \"==\";\\n }\\n return base64;\\n };\\n const lastBlobMap = /* @__PURE__ */ new Map();\\n const transparentBlobMap = /* @__PURE__ */ new Map();\\n async function getTransparentBlobFor(width, height, dataURLOptions) {\\n const id = `${width}-${height}`;\\n if (\"OffscreenCanvas\" in globalThis) {\\n if (transparentBlobMap.has(id)) return transparentBlobMap.get(id);\\n const offscreen = new OffscreenCanvas(width, height);\\n offscreen.getContext(\"2d\");\\n const blob = await offscreen.convertToBlob(dataURLOptions);\\n const arrayBuffer = await blob.arrayBuffer();\\n const base64 = encode(arrayBuffer);\\n transparentBlobMap.set(id, base64);\\n return base64;\\n } else {\\n return \"\";\\n }\\n }\\n const worker = self;\\n worker.onmessage = async function(e) {\\n if (\"OffscreenCanvas\" in globalThis) {\\n const { id, bitmap, width, height, dataURLOptions } = e.data;\\n const transparentBase64 = getTransparentBlobFor(\\n width,\\n height,\\n dataURLOptions\\n );\\n const offscreen = new OffscreenCanvas(width, height);\\n const ctx = offscreen.getContext(\"2d\");\\n ctx.drawImage(bitmap, 0, 0);\\n bitmap.close();\\n const blob = await offscreen.convertToBlob(dataURLOptions);\\n const type = blob.type;\\n const arrayBuffer = await blob.arrayBuffer();\\n const base64 = encode(arrayBuffer);\\n if (!lastBlobMap.has(id) && await transparentBase64 === base64) {\\n lastBlobMap.set(id, base64);\\n return worker.postMessage({ id });\\n }\\n if (lastBlobMap.get(id) === base64) return worker.postMessage({ id });\\n worker.postMessage({\\n id,\\n type,\\n base64,\\n width,\\n height\\n });\\n lastBlobMap.set(id, base64);\\n } else {\\n return worker.postMessage({ id: e.data.id });\\n }\\n };\\n})();\\n//# sourceMappingURL=image-bitmap-data-url-worker-IJpC7g_b.js.map\\n';\nconst blob = typeof self !== \"undefined\" && self.Blob && new Blob([jsContent], { type: \"text/javascript;charset=utf-8\" });\nfunction WorkerWrapper(options) {\n let objURL;\n try {\n objURL = blob && (self.URL || self.webkitURL).createObjectURL(blob);\n if (!objURL) throw \"\";\n const worker = new Worker(objURL, {\n name: options == null ? void 0 : options.name\n });\n worker.addEventListener(\"error\", () => {\n (self.URL || self.webkitURL).revokeObjectURL(objURL);\n });\n return worker;\n } catch (e) {\n return new Worker(\n \"data:text/javascript;charset=utf-8,\" + encodeURIComponent(jsContent),\n {\n name: options == null ? void 0 : options.name\n }\n );\n } finally {\n objURL && (self.URL || self.webkitURL).revokeObjectURL(objURL);\n }\n}\nclass CanvasManager {\n constructor(options) {\n __publicField(this, \"pendingCanvasMutations\", /* @__PURE__ */ new Map());\n __publicField(this, \"rafStamps\", { latestId: 0, invokeId: null });\n __publicField(this, \"mirror\");\n __publicField(this, \"mutationCb\");\n __publicField(this, \"resetObservers\");\n __publicField(this, \"frozen\", false);\n __publicField(this, \"locked\", false);\n __publicField(this, \"processMutation\", (target, mutation) => {\n const newFrame = this.rafStamps.invokeId && this.rafStamps.latestId !== this.rafStamps.invokeId;\n if (newFrame || !this.rafStamps.invokeId)\n this.rafStamps.invokeId = this.rafStamps.latestId;\n if (!this.pendingCanvasMutations.has(target)) {\n this.pendingCanvasMutations.set(target, []);\n }\n this.pendingCanvasMutations.get(target).push(mutation);\n });\n const {\n sampling = \"all\",\n win,\n blockClass,\n blockSelector,\n recordCanvas,\n dataURLOptions\n } = options;\n this.mutationCb = options.mutationCb;\n this.mirror = options.mirror;\n if (recordCanvas && sampling === \"all\")\n this.initCanvasMutationObserver(win, blockClass, blockSelector);\n if (recordCanvas && typeof sampling === \"number\")\n this.initCanvasFPSObserver(sampling, win, blockClass, blockSelector, {\n dataURLOptions\n });\n }\n reset() {\n this.pendingCanvasMutations.clear();\n this.resetObservers && this.resetObservers();\n }\n freeze() {\n this.frozen = true;\n }\n unfreeze() {\n this.frozen = false;\n }\n lock() {\n this.locked = true;\n }\n unlock() {\n this.locked = false;\n }\n initCanvasFPSObserver(fps, win, blockClass, blockSelector, options) {\n const canvasContextReset = initCanvasContextObserver(\n win,\n blockClass,\n blockSelector,\n true\n );\n const snapshotInProgressMap = /* @__PURE__ */ new Map();\n const worker = new WorkerWrapper();\n worker.onmessage = (e) => {\n const { id } = e.data;\n snapshotInProgressMap.set(id, false);\n if (!(\"base64\" in e.data)) return;\n const { base64, type, width, height } = e.data;\n this.mutationCb({\n id,\n type: CanvasContext[\"2D\"],\n commands: [\n {\n property: \"clearRect\",\n // wipe canvas\n args: [0, 0, width, height]\n },\n {\n property: \"drawImage\",\n // draws (semi-transparent) image\n args: [\n {\n rr_type: \"ImageBitmap\",\n args: [\n {\n rr_type: \"Blob\",\n data: [{ rr_type: \"ArrayBuffer\", base64 }],\n type\n }\n ]\n },\n 0,\n 0\n ]\n }\n ]\n });\n };\n const timeBetweenSnapshots = 1e3 / fps;\n let lastSnapshotTime = 0;\n let rafId;\n const getCanvas = () => {\n const matchedCanvas = [];\n win.document.querySelectorAll(\"canvas\").forEach((canvas) => {\n if (!isBlocked(canvas, blockClass, blockSelector, true)) {\n matchedCanvas.push(canvas);\n }\n });\n return matchedCanvas;\n };\n const takeCanvasSnapshots = (timestamp) => {\n if (lastSnapshotTime && timestamp - lastSnapshotTime < timeBetweenSnapshots) {\n rafId = requestAnimationFrame(takeCanvasSnapshots);\n return;\n }\n lastSnapshotTime = timestamp;\n getCanvas().forEach(async (canvas) => {\n var _a2;\n const id = this.mirror.getId(canvas);\n if (snapshotInProgressMap.get(id)) return;\n if (canvas.width === 0 || canvas.height === 0) return;\n snapshotInProgressMap.set(id, true);\n if ([\"webgl\", \"webgl2\"].includes(canvas.__context)) {\n const context = canvas.getContext(canvas.__context);\n if (((_a2 = context == null ? void 0 : context.getContextAttributes()) == null ? void 0 : _a2.preserveDrawingBuffer) === false) {\n context.clear(context.COLOR_BUFFER_BIT);\n }\n }\n const bitmap = await createImageBitmap(canvas);\n worker.postMessage(\n {\n id,\n bitmap,\n width: canvas.width,\n height: canvas.height,\n dataURLOptions: options.dataURLOptions\n },\n [bitmap]\n );\n });\n rafId = requestAnimationFrame(takeCanvasSnapshots);\n };\n rafId = requestAnimationFrame(takeCanvasSnapshots);\n this.resetObservers = () => {\n canvasContextReset();\n cancelAnimationFrame(rafId);\n };\n }\n initCanvasMutationObserver(win, blockClass, blockSelector) {\n this.startRAFTimestamping();\n this.startPendingCanvasMutationFlusher();\n const canvasContextReset = initCanvasContextObserver(\n win,\n blockClass,\n blockSelector,\n false\n );\n const canvas2DReset = initCanvas2DMutationObserver(\n this.processMutation.bind(this),\n win,\n blockClass,\n blockSelector\n );\n const canvasWebGL1and2Reset = initCanvasWebGLMutationObserver(\n this.processMutation.bind(this),\n win,\n blockClass,\n blockSelector\n );\n this.resetObservers = () => {\n canvasContextReset();\n canvas2DReset();\n canvasWebGL1and2Reset();\n };\n }\n startPendingCanvasMutationFlusher() {\n requestAnimationFrame(() => this.flushPendingCanvasMutations());\n }\n startRAFTimestamping() {\n const setLatestRAFTimestamp = (timestamp) => {\n this.rafStamps.latestId = timestamp;\n requestAnimationFrame(setLatestRAFTimestamp);\n };\n requestAnimationFrame(setLatestRAFTimestamp);\n }\n flushPendingCanvasMutations() {\n this.pendingCanvasMutations.forEach(\n (_values, canvas) => {\n const id = this.mirror.getId(canvas);\n this.flushPendingCanvasMutationFor(canvas, id);\n }\n );\n requestAnimationFrame(() => this.flushPendingCanvasMutations());\n }\n flushPendingCanvasMutationFor(canvas, id) {\n if (this.frozen || this.locked) {\n return;\n }\n const valuesWithType = this.pendingCanvasMutations.get(canvas);\n if (!valuesWithType || id === -1) return;\n const values = valuesWithType.map((value) => {\n const { type: type2, ...rest } = value;\n return rest;\n });\n const { type } = valuesWithType[0];\n this.mutationCb({ id, type, commands: values });\n this.pendingCanvasMutations.delete(canvas);\n }\n}\nclass StylesheetManager {\n constructor(options) {\n __publicField(this, \"trackedLinkElements\", /* @__PURE__ */ new WeakSet());\n __publicField(this, \"mutationCb\");\n __publicField(this, \"adoptedStyleSheetCb\");\n __publicField(this, \"styleMirror\", new StyleSheetMirror());\n this.mutationCb = options.mutationCb;\n this.adoptedStyleSheetCb = options.adoptedStyleSheetCb;\n }\n attachLinkElement(linkEl, childSn) {\n if (\"_cssText\" in childSn.attributes)\n this.mutationCb({\n adds: [],\n removes: [],\n texts: [],\n attributes: [\n {\n id: childSn.id,\n attributes: childSn.attributes\n }\n ]\n });\n this.trackLinkElement(linkEl);\n }\n trackLinkElement(linkEl) {\n if (this.trackedLinkElements.has(linkEl)) return;\n this.trackedLinkElements.add(linkEl);\n this.trackStylesheetInLinkElement(linkEl);\n }\n adoptStyleSheets(sheets, hostId) {\n if (sheets.length === 0) return;\n const adoptedStyleSheetData = {\n id: hostId,\n styleIds: []\n };\n const styles = [];\n for (const sheet of sheets) {\n let styleId;\n if (!this.styleMirror.has(sheet)) {\n styleId = this.styleMirror.add(sheet);\n styles.push({\n styleId,\n rules: Array.from(sheet.rules || CSSRule, (r, index2) => ({\n rule: stringifyRule(r, sheet.href),\n index: index2\n }))\n });\n } else styleId = this.styleMirror.getId(sheet);\n adoptedStyleSheetData.styleIds.push(styleId);\n }\n if (styles.length > 0) adoptedStyleSheetData.styles = styles;\n this.adoptedStyleSheetCb(adoptedStyleSheetData);\n }\n reset() {\n this.styleMirror.reset();\n this.trackedLinkElements = /* @__PURE__ */ new WeakSet();\n }\n // TODO: take snapshot on stylesheet reload by applying event listener\n trackStylesheetInLinkElement(_linkEl) {\n }\n}\nclass ProcessedNodeManager {\n constructor() {\n __publicField(this, \"nodeMap\", /* @__PURE__ */ new WeakMap());\n __publicField(this, \"active\", false);\n }\n inOtherBuffer(node, thisBuffer) {\n const buffers = this.nodeMap.get(node);\n return buffers && Array.from(buffers).some((buffer) => buffer !== thisBuffer);\n }\n add(node, buffer) {\n if (!this.active) {\n this.active = true;\n requestAnimationFrame(() => {\n this.nodeMap = /* @__PURE__ */ new WeakMap();\n this.active = false;\n });\n }\n this.nodeMap.set(node, (this.nodeMap.get(node) || /* @__PURE__ */ new Set()).add(buffer));\n }\n destroy() {\n }\n}\nlet wrappedEmit;\nlet takeFullSnapshot;\nlet canvasManager;\nlet recording = false;\ntry {\n if (Array.from([1], (x) => x * 2)[0] !== 2) {\n const cleanFrame = document.createElement(\"iframe\");\n document.body.appendChild(cleanFrame);\n Array.from = ((_a = cleanFrame.contentWindow) == null ? void 0 : _a.Array.from) || Array.from;\n document.body.removeChild(cleanFrame);\n }\n} catch (err) {\n console.debug(\"Unable to override Array.from\", err);\n}\nconst mirror = createMirror();\nfunction record(options = {}) {\n const {\n emit,\n checkoutEveryNms,\n checkoutEveryNth,\n blockClass = \"rr-block\",\n blockSelector = null,\n ignoreClass = \"rr-ignore\",\n ignoreSelector = null,\n maskTextClass = \"rr-mask\",\n maskTextSelector = null,\n inlineStylesheet = true,\n maskAllInputs,\n maskInputOptions: _maskInputOptions,\n slimDOMOptions: _slimDOMOptions,\n maskInputFn,\n maskTextFn,\n hooks,\n packFn,\n sampling = {},\n dataURLOptions = {},\n mousemoveWait,\n recordDOM = true,\n recordCanvas = false,\n recordCrossOriginIframes = false,\n recordAfter = options.recordAfter === \"DOMContentLoaded\" ? options.recordAfter : \"load\",\n userTriggeredOnInput = false,\n collectFonts = false,\n inlineImages = false,\n plugins,\n keepIframeSrcFn = () => false,\n ignoreCSSAttributes = /* @__PURE__ */ new Set([]),\n errorHandler: errorHandler2\n } = options;\n registerErrorHandler(errorHandler2);\n const inEmittingFrame = recordCrossOriginIframes ? window.parent === window : true;\n let passEmitsToParent = false;\n if (!inEmittingFrame) {\n try {\n if (window.parent.document) {\n passEmitsToParent = false;\n }\n } catch (e) {\n passEmitsToParent = true;\n }\n }\n if (inEmittingFrame && !emit) {\n throw new Error(\"emit function is required\");\n }\n if (!inEmittingFrame && !passEmitsToParent) {\n return () => {\n };\n }\n if (mousemoveWait !== void 0 && sampling.mousemove === void 0) {\n sampling.mousemove = mousemoveWait;\n }\n mirror.reset();\n const maskInputOptions = maskAllInputs === true ? {\n color: true,\n date: true,\n \"datetime-local\": true,\n email: true,\n month: true,\n number: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true,\n textarea: true,\n select: true,\n password: true\n } : _maskInputOptions !== void 0 ? _maskInputOptions : { password: true };\n const slimDOMOptions = slimDOMDefaults(_slimDOMOptions);\n polyfill();\n let lastFullSnapshotEvent;\n let incrementalSnapshotCount = 0;\n const eventProcessor = (e) => {\n for (const plugin of plugins || []) {\n if (plugin.eventProcessor) {\n e = plugin.eventProcessor(e);\n }\n }\n if (packFn && // Disable packing events which will be emitted to parent frames.\n !passEmitsToParent) {\n e = packFn(e);\n }\n return e;\n };\n wrappedEmit = (r, isCheckout) => {\n var _a2;\n const e = r;\n e.timestamp = nowTimestamp();\n if (((_a2 = mutationBuffers[0]) == null ? void 0 : _a2.isFrozen()) && e.type !== EventType.FullSnapshot && !(e.type === EventType.IncrementalSnapshot && e.data.source === IncrementalSource.Mutation)) {\n mutationBuffers.forEach((buf) => buf.unfreeze());\n }\n if (inEmittingFrame) {\n emit == null ? void 0 : emit(eventProcessor(e), isCheckout);\n } else if (passEmitsToParent) {\n const message = {\n type: \"rrweb\",\n event: eventProcessor(e),\n origin: window.location.origin,\n isCheckout\n };\n window.parent.postMessage(message, \"*\");\n }\n if (e.type === EventType.FullSnapshot) {\n lastFullSnapshotEvent = e;\n incrementalSnapshotCount = 0;\n } else if (e.type === EventType.IncrementalSnapshot) {\n if (e.data.source === IncrementalSource.Mutation && e.data.isAttachIframe) {\n return;\n }\n incrementalSnapshotCount++;\n const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;\n const exceedTime = checkoutEveryNms && e.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;\n if (exceedCount || exceedTime) {\n takeFullSnapshot(true);\n }\n }\n };\n const wrappedMutationEmit = (m) => {\n wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Mutation,\n ...m\n }\n });\n };\n const wrappedScrollEmit = (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Scroll,\n ...p\n }\n });\n const wrappedCanvasMutationEmit = (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.CanvasMutation,\n ...p\n }\n });\n const wrappedAdoptedStyleSheetEmit = (a) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.AdoptedStyleSheet,\n ...a\n }\n });\n const stylesheetManager = new StylesheetManager({\n mutationCb: wrappedMutationEmit,\n adoptedStyleSheetCb: wrappedAdoptedStyleSheetEmit\n });\n const iframeManager = new IframeManager({\n mirror,\n mutationCb: wrappedMutationEmit,\n stylesheetManager,\n recordCrossOriginIframes,\n wrappedEmit\n });\n for (const plugin of plugins || []) {\n if (plugin.getMirror)\n plugin.getMirror({\n nodeMirror: mirror,\n crossOriginIframeMirror: iframeManager.crossOriginIframeMirror,\n crossOriginIframeStyleMirror: iframeManager.crossOriginIframeStyleMirror\n });\n }\n const processedNodeManager = new ProcessedNodeManager();\n canvasManager = new CanvasManager({\n recordCanvas,\n mutationCb: wrappedCanvasMutationEmit,\n win: window,\n blockClass,\n blockSelector,\n mirror,\n sampling: sampling.canvas,\n dataURLOptions\n });\n const shadowDomManager = new ShadowDomManager({\n mutationCb: wrappedMutationEmit,\n scrollCb: wrappedScrollEmit,\n bypassOptions: {\n blockClass,\n blockSelector,\n maskTextClass,\n maskTextSelector,\n inlineStylesheet,\n maskInputOptions,\n dataURLOptions,\n maskTextFn,\n maskInputFn,\n recordCanvas,\n inlineImages,\n sampling,\n slimDOMOptions,\n iframeManager,\n stylesheetManager,\n canvasManager,\n keepIframeSrcFn,\n processedNodeManager\n },\n mirror\n });\n takeFullSnapshot = (isCheckout = false) => {\n if (!recordDOM) {\n return;\n }\n wrappedEmit(\n {\n type: EventType.Meta,\n data: {\n href: window.location.href,\n width: getWindowWidth(),\n height: getWindowHeight()\n }\n },\n isCheckout\n );\n stylesheetManager.reset();\n shadowDomManager.init();\n mutationBuffers.forEach((buf) => buf.lock());\n const node = snapshot(document, {\n mirror,\n blockClass,\n blockSelector,\n maskTextClass,\n maskTextSelector,\n inlineStylesheet,\n maskAllInputs: maskInputOptions,\n maskTextFn,\n maskInputFn,\n slimDOM: slimDOMOptions,\n dataURLOptions,\n recordCanvas,\n inlineImages,\n onSerialize: (n) => {\n if (isSerializedIframe(n, mirror)) {\n iframeManager.addIframe(n);\n }\n if (isSerializedStylesheet(n, mirror)) {\n stylesheetManager.trackLinkElement(n);\n }\n if (hasShadowRoot(n)) {\n shadowDomManager.addShadowRoot(index.shadowRoot(n), document);\n }\n },\n onIframeLoad: (iframe, childSn) => {\n iframeManager.attachIframe(iframe, childSn);\n shadowDomManager.observeAttachShadow(iframe);\n },\n onStylesheetLoad: (linkEl, childSn) => {\n stylesheetManager.attachLinkElement(linkEl, childSn);\n },\n keepIframeSrcFn\n });\n if (!node) {\n return console.warn(\"Failed to snapshot the document\");\n }\n wrappedEmit(\n {\n type: EventType.FullSnapshot,\n data: {\n node,\n initialOffset: getWindowScroll(window)\n }\n },\n isCheckout\n );\n mutationBuffers.forEach((buf) => buf.unlock());\n if (document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0)\n stylesheetManager.adoptStyleSheets(\n document.adoptedStyleSheets,\n mirror.getId(document)\n );\n };\n try {\n const handlers = [];\n const observe = (doc) => {\n var _a2;\n return callbackWrapper(initObservers)(\n {\n mutationCb: wrappedMutationEmit,\n mousemoveCb: (positions, source) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source,\n positions\n }\n }),\n mouseInteractionCb: (d) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.MouseInteraction,\n ...d\n }\n }),\n scrollCb: wrappedScrollEmit,\n viewportResizeCb: (d) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.ViewportResize,\n ...d\n }\n }),\n inputCb: (v) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Input,\n ...v\n }\n }),\n mediaInteractionCb: (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.MediaInteraction,\n ...p\n }\n }),\n styleSheetRuleCb: (r) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.StyleSheetRule,\n ...r\n }\n }),\n styleDeclarationCb: (r) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.StyleDeclaration,\n ...r\n }\n }),\n canvasMutationCb: wrappedCanvasMutationEmit,\n fontCb: (p) => wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Font,\n ...p\n }\n }),\n selectionCb: (p) => {\n wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.Selection,\n ...p\n }\n });\n },\n customElementCb: (c) => {\n wrappedEmit({\n type: EventType.IncrementalSnapshot,\n data: {\n source: IncrementalSource.CustomElement,\n ...c\n }\n });\n },\n blockClass,\n ignoreClass,\n ignoreSelector,\n maskTextClass,\n maskTextSelector,\n maskInputOptions,\n inlineStylesheet,\n sampling,\n recordDOM,\n recordCanvas,\n inlineImages,\n userTriggeredOnInput,\n collectFonts,\n doc,\n maskInputFn,\n maskTextFn,\n keepIframeSrcFn,\n blockSelector,\n slimDOMOptions,\n dataURLOptions,\n mirror,\n iframeManager,\n stylesheetManager,\n shadowDomManager,\n processedNodeManager,\n canvasManager,\n ignoreCSSAttributes,\n plugins: ((_a2 = plugins == null ? void 0 : plugins.filter((p) => p.observer)) == null ? void 0 : _a2.map((p) => ({\n observer: p.observer,\n options: p.options,\n callback: (payload) => wrappedEmit({\n type: EventType.Plugin,\n data: {\n plugin: p.name,\n payload\n }\n })\n }))) || []\n },\n hooks\n );\n };\n iframeManager.addLoadListener((iframeEl) => {\n try {\n handlers.push(observe(iframeEl.contentDocument));\n } catch (error) {\n console.warn(error);\n }\n });\n const init = () => {\n takeFullSnapshot();\n handlers.push(observe(document));\n recording = true;\n };\n if ([\"interactive\", \"complete\"].includes(document.readyState)) {\n init();\n } else {\n handlers.push(\n on(\"DOMContentLoaded\", () => {\n wrappedEmit({\n type: EventType.DomContentLoaded,\n data: {}\n });\n if (recordAfter === \"DOMContentLoaded\") init();\n })\n );\n handlers.push(\n on(\n \"load\",\n () => {\n wrappedEmit({\n type: EventType.Load,\n data: {}\n });\n if (recordAfter === \"load\") init();\n },\n window\n )\n );\n }\n return () => {\n handlers.forEach((handler) => {\n try {\n handler();\n } catch (error) {\n const msg = String(error).toLowerCase();\n if (!msg.includes(\"cross-origin\")) {\n console.warn(error);\n }\n }\n });\n processedNodeManager.destroy();\n recording = false;\n unregisterErrorHandler();\n };\n } catch (error) {\n console.warn(error);\n }\n}\nrecord.addCustomEvent = (tag, payload) => {\n if (!recording) {\n throw new Error(\"please add custom event after start recording\");\n }\n wrappedEmit({\n type: EventType.Custom,\n data: {\n tag,\n payload\n }\n });\n};\nrecord.freezePage = () => {\n mutationBuffers.forEach((buf) => buf.freeze());\n};\nrecord.takeFullSnapshot = (isCheckout) => {\n if (!recording) {\n throw new Error(\"please take full snapshot after start recording\");\n }\n takeFullSnapshot(isCheckout);\n};\nrecord.mirror = mirror;\nexport {\n record\n};\n//# sourceMappingURL=record.js.map\n","var EventType = /* @__PURE__ */ ((EventType2) => {\n EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n EventType2[EventType2[\"Asset\"] = 7] = \"Asset\";\n return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n IncrementalSource2[IncrementalSource2[\"CustomElement\"] = 16] = \"CustomElement\";\n return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n return MouseInteractions2;\n})(MouseInteractions || {});\nvar PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {\n PointerTypes2[PointerTypes2[\"Mouse\"] = 0] = \"Mouse\";\n PointerTypes2[PointerTypes2[\"Pen\"] = 1] = \"Pen\";\n PointerTypes2[PointerTypes2[\"Touch\"] = 2] = \"Touch\";\n return PointerTypes2;\n})(PointerTypes || {});\nvar CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n return CanvasContext2;\n})(CanvasContext || {});\nvar MediaInteractions = /* @__PURE__ */ ((MediaInteractions2) => {\n MediaInteractions2[MediaInteractions2[\"Play\"] = 0] = \"Play\";\n MediaInteractions2[MediaInteractions2[\"Pause\"] = 1] = \"Pause\";\n MediaInteractions2[MediaInteractions2[\"Seeked\"] = 2] = \"Seeked\";\n MediaInteractions2[MediaInteractions2[\"VolumeChange\"] = 3] = \"VolumeChange\";\n MediaInteractions2[MediaInteractions2[\"RateChange\"] = 4] = \"RateChange\";\n return MediaInteractions2;\n})(MediaInteractions || {});\nvar ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {\n ReplayerEvents2[\"Start\"] = \"start\";\n ReplayerEvents2[\"Pause\"] = \"pause\";\n ReplayerEvents2[\"Resume\"] = \"resume\";\n ReplayerEvents2[\"Resize\"] = \"resize\";\n ReplayerEvents2[\"Finish\"] = \"finish\";\n ReplayerEvents2[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n ReplayerEvents2[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n ReplayerEvents2[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n ReplayerEvents2[\"SkipStart\"] = \"skip-start\";\n ReplayerEvents2[\"SkipEnd\"] = \"skip-end\";\n ReplayerEvents2[\"MouseInteraction\"] = \"mouse-interaction\";\n ReplayerEvents2[\"EventCast\"] = \"event-cast\";\n ReplayerEvents2[\"CustomEvent\"] = \"custom-event\";\n ReplayerEvents2[\"Flush\"] = \"flush\";\n ReplayerEvents2[\"StateChange\"] = \"state-change\";\n ReplayerEvents2[\"PlayBack\"] = \"play-back\";\n ReplayerEvents2[\"Destroy\"] = \"destroy\";\n return ReplayerEvents2;\n})(ReplayerEvents || {});\nvar NodeType = /* @__PURE__ */ ((NodeType2) => {\n NodeType2[NodeType2[\"Document\"] = 0] = \"Document\";\n NodeType2[NodeType2[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType2[NodeType2[\"Element\"] = 2] = \"Element\";\n NodeType2[NodeType2[\"Text\"] = 3] = \"Text\";\n NodeType2[NodeType2[\"CDATA\"] = 4] = \"CDATA\";\n NodeType2[NodeType2[\"Comment\"] = 5] = \"Comment\";\n return NodeType2;\n})(NodeType || {});\nexport {\n CanvasContext,\n EventType,\n IncrementalSource,\n MediaInteractions,\n MouseInteractions,\n NodeType,\n PointerTypes,\n ReplayerEvents\n};\n//# sourceMappingURL=types.js.map\n","import { record } from \"@rrweb/record\";\nimport { EventType, type eventWithTime } from \"@rrweb/types\";\n\n/**\n * Buffered session replay — the rrweb capture half of issue #189 (ADR-0024).\n *\n * The recorder runs continuously from mount (\"the moment before matters\",\n * VISION principle 4) but never streams: rrweb events accumulate in **two\n * checkout-delimited buckets**, and every {@link REPLAY_CHECKOUT_MS} rrweb takes\n * a fresh full DOM snapshot (a \"checkout\") that rotates the buckets. A report's\n * {@link ReplayRecorder.snapshot} is the concatenation of both buckets, so it\n * always starts at a full snapshot and carries between one and two checkout\n * intervals of lead-up — the bounded-window posture the Trace already follows,\n * never an unbounded full-session stream.\n *\n * Masking is applied by rrweb **at serialization time, inside the page** — the\n * same client-side, private-by-default boundary as the screenshot and the Trace\n * (spec 0003 §C, VISION §5): every input is masked (`maskAllInputs`) and, by\n * default, **all text** is masked (`maskTextSelector: \"*\"`), so the recording\n * that leaves the browser carries layout and interaction, not content. A\n * Project that accepts the trade-off can narrow the text mask via\n * {@link ReplayOptions.maskTextSelector} (rrweb 2.1 has no per-element unmask\n * selector, so narrowing the mask selector is the escape hatch). The SDK's own\n * chrome — launcher and overlay hosts — is blocked from the recording entirely,\n * mirroring how the screenshot strips it.\n */\n\n/**\n * How often rrweb takes a checkout full snapshot, which is also the bucket\n * rotation period: a snapshot carries 1–2 of these intervals of lead-up\n * (30–60 s), Sentry's buffered-replay ballpark.\n */\nexport const REPLAY_CHECKOUT_MS = 30_000;\n\n/**\n * The SDK's own host elements (dom.ts markers), excluded from the recording the\n * way the screenshot's clone walk strips them.\n */\nexport const FIXBACK_BLOCK_SELECTOR = \"[data-fixback-root],[data-fixback-overlay]\";\n\n/**\n * Media elements blocked from the recording by default (Sentry's `blockAllMedia`\n * posture, adopted): text masking cannot redact what an image shows, so media\n * renders as a same-size placeholder in replay unless a Project opts out via\n * {@link ReplayOptions.blockMedia}.\n */\nexport const FIXBACK_MEDIA_SELECTOR =\n \"img,image,svg,video,object,picture,embed,map,audio\";\n\n/** Tuning for the replay recorder. All optional; the defaults are the contract. */\nexport interface ReplayOptions {\n /**\n * Mask **all** text content (default `true`, private-by-default). `false`\n * records text in the clear — inputs stay masked regardless.\n */\n readonly maskText?: boolean;\n /**\n * Which elements' text rrweb masks when {@link maskText} is on. Defaults to\n * `\"*\"` (everything); narrow it to unmask known-safe regions.\n */\n readonly maskTextSelector?: string;\n /**\n * Block media content — images, video, audio, SVG — from the recording\n * (default `true`, {@link FIXBACK_MEDIA_SELECTOR}): what a picture shows\n * cannot be text-masked, so media is a placeholder in replay. `false` records\n * it (an internal/beta Project trading privacy for fidelity, VISION §5).\n */\n readonly blockMedia?: boolean;\n /** Extra elements to exclude from the recording, alongside the SDK's own chrome. */\n readonly blockSelector?: string;\n}\n\n/** One rrweb event as recorded; the wire payload is an array of these. */\nexport type ReplayEvent = eventWithTime;\n\n/** The buffered window a report ships: rrweb events starting at a full snapshot. */\nexport interface ReplaySnapshot {\n readonly events: readonly ReplayEvent[];\n}\n\n/** A read-only view of the recorder the report surfaces attach from. */\nexport interface ReplaySource {\n /** The current buffered window, or `null` when nothing replayable exists. */\n snapshot(): ReplaySnapshot | null;\n}\n\n/** A running replay recorder. */\nexport interface ReplayRecorder extends ReplaySource {\n /** Stop recording and release the buffers. Safe to call more than once. */\n stop(): void;\n}\n\n/** The slice of rrweb's record options the recorder sets. */\nexport interface ReplayRecordOptions {\n readonly emit: (event: ReplayEvent, isCheckout?: boolean) => void;\n readonly checkoutEveryNms?: number;\n readonly maskAllInputs?: boolean;\n readonly maskTextSelector?: string;\n readonly blockSelector?: string;\n readonly slimDOMOptions?: \"all\";\n}\n\n/**\n * The slice of rrweb's `record` the recorder consumes; injectable for tests.\n * (A concrete signature — rrweb's own is generic, which mocks can't satisfy.)\n */\nexport type RecordFn = (options: ReplayRecordOptions) => (() => void) | undefined;\n\n/** A recorder that never records — what a failed start degrades to. */\nconst NOOP_RECORDER: ReplayRecorder = { snapshot: () => null, stop: () => {} };\n\n/**\n * Start the buffered replay recorder. Never throws: an rrweb failure (an exotic\n * DOM, an unsupported environment) degrades to a recorder whose `snapshot()` is\n * `null`, so a Fixback problem never surfaces on the host page and a report\n * simply ships without replay.\n */\nexport function startReplayRecorder(\n options: ReplayOptions = {},\n recordFn: RecordFn = record as RecordFn,\n): ReplayRecorder {\n /** Events since the last checkout (`cur`) and the full interval before it (`prev`). */\n let prev: ReplayEvent[] = [];\n let cur: ReplayEvent[] = [];\n /**\n * A checkout arrives as a burst of consecutive `isCheckout` events (meta +\n * full snapshot); rotate the buckets once per burst, on its first event.\n */\n let inCheckout = false;\n\n const maskText = options.maskText !== false;\n const blockParts = [\n FIXBACK_BLOCK_SELECTOR,\n ...(options.blockMedia !== false ? [FIXBACK_MEDIA_SELECTOR] : []),\n ...(options.blockSelector ? [options.blockSelector] : []),\n ];\n const blockSelector = blockParts.join(\",\");\n\n let stopFn: (() => void) | undefined;\n try {\n stopFn = recordFn({\n emit: (event: ReplayEvent, isCheckout?: boolean) => {\n if (isCheckout && !inCheckout) {\n prev = cur;\n cur = [];\n }\n inCheckout = isCheckout === true;\n cur.push(event);\n },\n checkoutEveryNms: REPLAY_CHECKOUT_MS,\n maskAllInputs: true,\n ...(maskText ? { maskTextSelector: options.maskTextSelector ?? \"*\" } : {}),\n blockSelector,\n // Strip script tags, comments, and head noise from the snapshot — replay\n // re-executes nothing, so they are dead weight on every payload.\n slimDOMOptions: \"all\",\n });\n } catch {\n stopFn = undefined;\n }\n if (typeof stopFn !== \"function\") return NOOP_RECORDER;\n const stopRecord = stopFn;\n\n let running = true;\n return {\n snapshot() {\n if (!running) return null;\n const events = [...prev, ...cur];\n // Replay needs a full snapshot to rebuild from; without one (recording\n // just started, or rrweb never produced it) there is nothing to watch.\n if (!events.some((event) => event.type === EventType.FullSnapshot)) return null;\n return { events };\n },\n stop() {\n if (!running) return;\n running = false;\n try {\n stopRecord();\n } catch {\n // Teardown must never throw into the host page.\n }\n prev = [];\n cur = [];\n },\n };\n}\n","/**\n * The **structural browser surfaces** the trace instrumentation reaches into, and\n * the resolvers that find them on the page.\n *\n * Everything the hooks touch is described as a narrow interface rather than taken\n * from the DOM lib wholesale, so a test can build a plain object (`fakeWindow()`)\n * instead of a whole `Window`. The shapes are deliberately written so the **real**\n * `window` and `console` satisfy them by assignment — no `as unknown as` escape\n * anywhere, in the SDK or in its tests.\n */\n\nimport type { ConsoleLike } from \"@fixback/sdk-core\";\n\n/** The `fetch` signature the network hook wraps. */\nexport type FetchFn = (\n input: string | URL | Request,\n init?: RequestInit,\n) => Promise<Response>;\n\n/** The `history` slice the navigation hook patches. */\nexport interface HistoryLike {\n pushState(data: unknown, unused: string, url?: string | URL | null): void;\n replaceState(data: unknown, unused: string, url?: string | URL | null): void;\n}\n\n/** The XHR instance surface the network hook touches. */\nexport interface XhrInstance {\n status: number;\n statusText?: string;\n open(method: string, url: string | URL, ...rest: unknown[]): void;\n send(body?: unknown): void;\n getResponseHeader?(name: string): string | null;\n addEventListener(type: string, listener: () => void): void;\n removeEventListener(type: string, listener: () => void): void;\n}\n\n/** The XHR constructor whose prototype the network hook patches. */\nexport interface XhrConstructor {\n new (): XhrInstance;\n prototype: XhrInstance;\n}\n\n/** The `navigator.sendBeacon` surface the beacon hook wraps. */\nexport interface BeaconNavigator {\n sendBeacon?: (url: string | URL, data?: BodyInit | null) => boolean;\n}\n\n/** The structural window surface the instrumentation reaches into. */\nexport interface InstrumentWindow {\n fetch?: FetchFn;\n history?: HistoryLike;\n location?: { href: string };\n XMLHttpRequest?: XhrConstructor;\n navigator?: BeaconNavigator;\n addEventListener(\n type: string,\n listener: (event: Event) => void,\n options?: boolean | AddEventListenerOptions,\n ): void;\n removeEventListener(\n type: string,\n listener: (event: Event) => void,\n options?: boolean | EventListenerOptions,\n ): void;\n}\n\n/** An installed hook's detacher — nothing installed is the no-op below. */\nexport function noop(): void {\n /* nothing installed */\n}\n\n/**\n * The page's `window`, when there is one (a worker or an SSR pass has none).\n * `Window` satisfies {@link InstrumentWindow} structurally, so this is a plain\n * assignment rather than a cast.\n */\nexport function globalWindow(): InstrumentWindow | undefined {\n return typeof window !== \"undefined\" ? window : undefined;\n}\n\n/** The page's `document`, when there is one. */\nexport function globalDocument(): Document | undefined {\n return typeof document !== \"undefined\" ? document : undefined;\n}\n\n/**\n * The page's `console`, when there is one. A real `Console` satisfies\n * {@link ConsoleLike} (its optional-method shape is bivariant in its parameters,\n * which is what makes `console.assert`'s overloads fit), so this too is an\n * assignment, not a cast.\n */\nexport function globalConsole(): ConsoleLike | undefined {\n return typeof console !== \"undefined\" ? console : undefined;\n}\n","/**\n * The `navigator.sendBeacon` network hook (spec #122 §D, ticket #139).\n *\n * `sendBeacon` is fire-and-forget with a **synchronous boolean** return — `true`\n * when the user agent queued the beacon, `false` when it declined — so wrapping\n * must return that boolean unchanged: the original is called first and its result\n * both classifies the crumb (`ok` / `network-error`) and is returned to the caller.\n * Only the URL and the trivially-known request size are recorded (no response\n * exists to read); capture failure is swallowed and the boolean still returned, and\n * if the original itself throws we record best-effort and re-throw so the contract\n * is preserved exactly.\n */\n\nimport {\n type BreadcrumbBuffer,\n type NetworkOutcome,\n networkCrumb,\n type Teardown,\n trivialBodySize,\n} from \"@fixback/sdk-core\";\n\nimport { type InstrumentWindow, noop } from \"./window\";\n\n/** Wrap `navigator.sendBeacon` to record a network crumb per beacon. See the module doc. */\nexport function instrumentBeacon(\n buffer: BreadcrumbBuffer,\n win: InstrumentWindow,\n ignoreUrl: (url: string) => boolean,\n now: () => number,\n): Teardown {\n const nav = win.navigator;\n if (!nav || typeof nav.sendBeacon !== \"function\") return noop;\n const original = nav.sendBeacon;\n const record = (url: string, data: unknown, outcome: NetworkOutcome): void => {\n if (ignoreUrl(url)) return;\n try {\n buffer.add(\n networkCrumb(\n { api: \"beacon\", method: \"POST\", url, reqSize: trivialBodySize(data), outcome },\n now(),\n ),\n );\n } catch {\n /* never throw into the host page */\n }\n };\n const wrapper = function (url: string | URL, data?: BodyInit | null): boolean {\n const target = typeof url === \"string\" ? url : String(url);\n let queued: boolean;\n try {\n queued = original.call(nav, url, data);\n } catch (error) {\n // The original threw: record a best-effort failure, then preserve semantics.\n record(target, data, \"network-error\");\n throw error;\n }\n record(target, data, queued ? \"ok\" : \"network-error\");\n return queued;\n };\n nav.sendBeacon = wrapper;\n return () => {\n nav.sendBeacon = original;\n };\n}\n","/**\n * The `fetch` network hook (spec #122 §D, ticket #139).\n *\n * Wraps the page's `fetch` to record a rich network crumb on settlement: method,\n * scrubbed URL, status + statusText, a `performance.now()` duration, request size\n * (only when the body is trivially sized), response size (from the\n * `content-length` header only), content type, and a failure outcome. The\n * **original** outcome is returned untouched — the response is passed through\n * **without its body being read** (only two metadata headers are inspected), and a\n * rejection is re-thrown so the caller's `unhandledrejection` semantics are\n * preserved.\n */\n\nimport {\n type BreadcrumbBuffer,\n contentTypeOf,\n type NetworkOutcome,\n networkCrumb,\n nowMono,\n outcomeFromStatus,\n parseContentLength,\n type Teardown,\n trivialBodySize,\n} from \"@fixback/sdk-core\";\n\nimport { type FetchFn, type InstrumentWindow, noop } from \"./window\";\n\nfunction requestUrl(input: string | URL | Request): string {\n if (typeof input === \"string\") return input;\n if (input instanceof URL) return input.toString();\n return input.url;\n}\n\nfunction requestMethod(\n input: string | URL | Request,\n init: RequestInit | undefined,\n): string {\n const method =\n init?.method ??\n (typeof input === \"object\" && \"method\" in input ? input.method : undefined) ??\n \"GET\";\n return method.toUpperCase();\n}\n\n/** Read one response header defensively — `null` on an opaque response or any throw. */\nfunction safeResponseHeader(response: Response, name: string): string | null {\n try {\n return response.headers?.get?.(name) ?? null;\n } catch {\n return null;\n }\n}\n\n/**\n * Classify a settled `fetch` response into a {@link NetworkOutcome} (spec #122 §D). An\n * opaque cross-origin response (status masked to `0`) is `opaque-cors`; otherwise the\n * outcome follows the HTTP status.\n */\nfunction classifyFetchResponse(response: Response): NetworkOutcome {\n if (response.type === \"opaque\" || response.type === \"opaqueredirect\") {\n return \"opaque-cors\";\n }\n return outcomeFromStatus(response.status);\n}\n\n/**\n * Classify a rejected `fetch` into a {@link NetworkOutcome} (spec #122 §D) by the\n * error's name: an `AbortError` is `aborted`, a `TimeoutError` (an `AbortSignal.timeout`)\n * is `timeout`, and anything else is a plain `network-error`.\n */\nfunction classifyFetchError(error: unknown): NetworkOutcome {\n const name =\n typeof error === \"object\" && error !== null && \"name\" in error\n ? String((error as { name?: unknown }).name)\n : \"\";\n if (name === \"AbortError\") return \"aborted\";\n if (name === \"TimeoutError\") return \"timeout\";\n return \"network-error\";\n}\n\n/** Wrap `fetch` to record a rich network crumb on settlement. See the module doc. */\nexport function instrumentFetch(\n buffer: BreadcrumbBuffer,\n win: InstrumentWindow,\n ignoreUrl: (url: string) => boolean,\n now: () => number,\n mono: () => number = nowMono,\n): Teardown {\n const original = win.fetch;\n if (typeof original !== \"function\") return noop;\n const wrapper: FetchFn = (\n input: string | URL | Request,\n init?: RequestInit,\n ): Promise<Response> => {\n const url = requestUrl(input);\n const method = requestMethod(input, init);\n // Size only a body passed literally in `init` — never a `Request`'s stream body.\n const reqSize = trivialBodySize(init?.body);\n const started = mono();\n // Native `fetch` must run against the window, so bind the receiver rather\n // than forward whatever `this` a free call carries.\n const promise = original.call(win, input, init);\n if (ignoreUrl(url)) return promise;\n return promise.then(\n (response) => {\n try {\n buffer.add(\n networkCrumb(\n {\n api: \"fetch\",\n method,\n url,\n status: response.status || undefined,\n statusText: response.statusText || undefined,\n durationMs: Math.max(0, mono() - started),\n reqSize,\n respSize: parseContentLength(\n safeResponseHeader(response, \"content-length\"),\n ),\n contentType: contentTypeOf(\n safeResponseHeader(response, \"content-type\"),\n ),\n outcome: classifyFetchResponse(response),\n },\n now(),\n ),\n );\n } catch {\n /* never throw into the host page */\n }\n return response;\n },\n (error: unknown) => {\n try {\n buffer.add(\n networkCrumb(\n {\n api: \"fetch\",\n method,\n url,\n durationMs: Math.max(0, mono() - started),\n reqSize,\n outcome: classifyFetchError(error),\n },\n now(),\n ),\n );\n } catch {\n /* never throw into the host page */\n }\n throw error;\n },\n );\n };\n win.fetch = wrapper;\n return () => {\n win.fetch = original;\n };\n}\n","/**\n * The navigation hook (spec #122 §A): a `navigation` crumb on every SPA route\n * change — `pushState`, `replaceState`, `popstate`, and `hashchange`.\n *\n * Both `history` methods are patched rather than listened for, because neither\n * fires an event of its own; the original is always called first and its result\n * returned, so the host page's routing is untouched.\n */\n\nimport {\n type BreadcrumbBuffer,\n navigationCrumb,\n type Teardown,\n} from \"@fixback/sdk-core\";\n\nimport { type HistoryLike, type InstrumentWindow, noop } from \"./window\";\n\n/** Record a `navigation` crumb on `pushState`/`replaceState`/pop/hash changes. */\nexport function instrumentNavigation(\n buffer: BreadcrumbBuffer,\n win: InstrumentWindow,\n now: () => number,\n): Teardown {\n const history = win.history;\n const location = win.location;\n if (!history || !location) return noop;\n\n let last = location.href;\n const record = (to: string): void => {\n try {\n buffer.add(navigationCrumb(last, to, now()));\n } catch {\n /* never throw into the host page */\n }\n last = to;\n };\n\n const originalPush = history.pushState;\n const originalReplace = history.replaceState;\n\n history.pushState = function (\n this: HistoryLike,\n data: unknown,\n unused: string,\n url?: string | URL | null,\n ): void {\n const result = originalPush.call(this, data, unused, url);\n record(location.href);\n return result;\n };\n history.replaceState = function (\n this: HistoryLike,\n data: unknown,\n unused: string,\n url?: string | URL | null,\n ): void {\n const result = originalReplace.call(this, data, unused, url);\n record(location.href);\n return result;\n };\n\n const onPopState = (): void => record(location.href);\n const onHashChange = (): void => record(location.href);\n win.addEventListener(\"popstate\", onPopState);\n win.addEventListener(\"hashchange\", onHashChange);\n\n return () => {\n history.pushState = originalPush;\n history.replaceState = originalReplace;\n win.removeEventListener(\"popstate\", onPopState);\n win.removeEventListener(\"hashchange\", onHashChange);\n };\n}\n","/**\n * The masked **user-action** hook (spec #122 §A) and its two crumb builders.\n *\n * These are the browser-only crumbs: they need an `Element` to derive a masked CSS\n * selector from, which is why they stay here rather than in the shared core with\n * the rest of the builders. The masking is at the source and structural — a\n * `ui.input` crumb records **that** a field changed and which one, and the shape\n * has no slot for a value, so the typed text can never be recorded.\n *\n * Listeners are capture-phase and passive observers: they never call\n * `preventDefault` or `stopPropagation`, and the SDK's own chrome (launcher,\n * overlay, and anything inside their shadow roots) is skipped.\n */\n\nimport type { Breadcrumb, BreadcrumbBuffer, Teardown } from \"@fixback/sdk-core\";\n\nimport { isFixbackNode } from \"../../dom\";\nimport { cssSelectorFor } from \"../../element-picker\";\n\n/** A stable CSS selector for a target, degrading to its tag name on any throw. */\nfunction safeSelector(target: Element): string {\n try {\n return cssSelectorFor(target);\n } catch {\n return target.tagName ? target.tagName.toLowerCase() : \"unknown\";\n }\n}\n\n/** A `ui.click` crumb: a masked target selector only — no text or value. */\nexport function clickCrumb(target: Element, timestamp: number): Breadcrumb {\n const selector = safeSelector(target);\n return {\n category: \"ui.click\",\n message: `click ${selector}`,\n timestamp,\n data: { target: selector },\n };\n}\n\n/**\n * A `ui.input` crumb: records **that** an input changed and which field, never\n * the value typed into it. The `target` element's `.value` is never read.\n */\nexport function inputCrumb(target: Element, timestamp: number): Breadcrumb {\n const selector = safeSelector(target);\n return {\n category: \"ui.input\",\n message: `input ${selector}`,\n timestamp,\n data: { target: selector },\n };\n}\n\n/** The deepest element an event actually originated from, crossing shadow roots. */\nfunction eventTargetElement(event: Event): Element | null {\n const path =\n typeof event.composedPath === \"function\" ? event.composedPath() : [];\n const deepest = path[0] ?? event.target;\n return deepest instanceof Element ? deepest : null;\n}\n\n/** Listen (capture-phase) for clicks and input changes as masked crumbs. */\nexport function instrumentUiEvents(\n buffer: BreadcrumbBuffer,\n doc: Document,\n now: () => number,\n): Teardown {\n const onClick = (event: Event): void => {\n const target = eventTargetElement(event);\n if (!target || isFixbackNode(target)) return;\n try {\n buffer.add(clickCrumb(target, now()));\n } catch {\n /* never throw into the host page */\n }\n };\n const onInput = (event: Event): void => {\n const target = eventTargetElement(event);\n if (!target || isFixbackNode(target)) return;\n try {\n buffer.add(inputCrumb(target, now()));\n } catch {\n /* never throw into the host page */\n }\n };\n doc.addEventListener(\"click\", onClick, true);\n doc.addEventListener(\"input\", onInput, true);\n return () => {\n doc.removeEventListener(\"click\", onClick, true);\n doc.removeEventListener(\"input\", onInput, true);\n };\n}\n","/**\n * The `XMLHttpRequest` network hook (spec #122 §D, ticket #139).\n *\n * Patches the prototype's `open`/`send` to record a rich network crumb when a\n * request settles: method, scrubbed URL, status + statusText, a\n * `performance.now()` duration, request size (only when the body is trivially\n * sized), response size (from the `content-length` header only), content type, and\n * a failure outcome distinguished by which terminal event fired (`error` /\n * `timeout` / `abort` / `load`). The `send` body argument is **never read for\n * content** — only its trivially-known size — so a body can never reach the buffer.\n */\n\nimport {\n type BreadcrumbBuffer,\n contentTypeOf,\n type NetworkOutcome,\n networkCrumb,\n nowMono,\n outcomeFromStatus,\n parseContentLength,\n type Teardown,\n trivialBodySize,\n} from \"@fixback/sdk-core\";\n\nimport { type InstrumentWindow, noop, type XhrInstance } from \"./window\";\n\ninterface XhrMeta {\n __fixbackMeta?: { method: string; url: string };\n}\n\n/** Read one XHR response header defensively — `null` when unavailable or on any throw. */\nfunction safeXhrHeader(xhr: XhrInstance, name: string): string | null {\n try {\n return typeof xhr.getResponseHeader === \"function\"\n ? xhr.getResponseHeader(name)\n : null;\n } catch {\n return null;\n }\n}\n\n/** Read an XHR's `statusText` defensively — `undefined` when empty or on any throw. */\nfunction safeXhrStatusText(xhr: XhrInstance): string | undefined {\n try {\n return xhr.statusText || undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Patch `XMLHttpRequest` to record a rich network crumb on settlement. See the module doc. */\nexport function instrumentXhr(\n buffer: BreadcrumbBuffer,\n win: InstrumentWindow,\n ignoreUrl: (url: string) => boolean,\n now: () => number,\n mono: () => number = nowMono,\n): Teardown {\n const ctor = win.XMLHttpRequest;\n if (typeof ctor !== \"function\") return noop;\n const proto = ctor.prototype;\n const originalOpen = proto.open;\n const originalSend = proto.send;\n\n proto.open = function (\n this: XhrInstance & XhrMeta,\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ): void {\n this.__fixbackMeta = { method: String(method).toUpperCase(), url: String(url) };\n return originalOpen.call(this, method, url, ...rest);\n };\n\n proto.send = function (this: XhrInstance & XhrMeta, body?: unknown): void {\n const meta = this.__fixbackMeta;\n if (meta && !ignoreUrl(meta.url)) {\n const started = mono();\n const reqSize = trivialBodySize(body);\n // The terminal event names the outcome; `loadend` always follows exactly one of\n // load/error/timeout/abort, so by the time we record, `settled` is set.\n let settled: NetworkOutcome | undefined;\n const onLoad = (): void => {\n settled = outcomeFromStatus(this.status || undefined);\n };\n const onError = (): void => {\n settled = \"network-error\";\n };\n const onTimeout = (): void => {\n settled = \"timeout\";\n };\n const onAbort = (): void => {\n settled = \"aborted\";\n };\n // An arrow captures the request instance as `this` without aliasing it.\n const onDone = (): void => {\n try {\n buffer.add(\n networkCrumb(\n {\n api: \"xhr\",\n method: meta.method,\n url: meta.url,\n status: this.status || undefined,\n statusText: safeXhrStatusText(this),\n durationMs: Math.max(0, mono() - started),\n reqSize,\n respSize: parseContentLength(safeXhrHeader(this, \"content-length\")),\n contentType: contentTypeOf(safeXhrHeader(this, \"content-type\")),\n outcome: settled ?? outcomeFromStatus(this.status || undefined),\n },\n now(),\n ),\n );\n } catch {\n /* never throw into the host page */\n }\n this.removeEventListener(\"load\", onLoad);\n this.removeEventListener(\"error\", onError);\n this.removeEventListener(\"timeout\", onTimeout);\n this.removeEventListener(\"abort\", onAbort);\n this.removeEventListener(\"loadend\", onDone);\n };\n this.addEventListener(\"load\", onLoad);\n this.addEventListener(\"error\", onError);\n this.addEventListener(\"timeout\", onTimeout);\n this.addEventListener(\"abort\", onAbort);\n this.addEventListener(\"loadend\", onDone);\n }\n return originalSend.call(this, body);\n };\n\n return () => {\n proto.open = originalOpen;\n proto.send = originalSend;\n };\n}\n","/**\n * The browser SDK's **capture instrumentation** — one hook per stream, plus the\n * composite that installs them all (spec 0003 §C; spec #122 §A/§D).\n *\n * Each hook lives in its own module and takes exactly the surface it patches, so\n * none of them needs a whole `Window`: `console` (the shared core's wrapper),\n * `fetch`, `XMLHttpRequest`, `sendBeacon`, `history` + hash navigation, and the\n * masked `click`/`input` listeners.\n *\n * Everything private is kept out **at the source**: `ui.input` records that an\n * input changed, never its value; network crumbs carry method + URL + status only,\n * **never** bodies; URLs are scrubbed as the crumb is built. The `beforeSend` choke\n * point is the final gate over the whole report.\n *\n * The SDK stays dependency-free and must never throw into the host page, so every\n * hook is wrapped: a capture failure is swallowed and the original behaviour (the\n * real `console`, `fetch`, navigation) always runs.\n */\n\nimport {\n type BreadcrumbBuffer,\n type BreadcrumbLevel,\n type ConsoleLike,\n DEFAULT_CONSOLE_LEVELS,\n instrumentConsole,\n nowMono,\n type Teardown,\n} from \"@fixback/sdk-core\";\n\nimport { instrumentBeacon } from \"./beacon\";\nimport { instrumentFetch } from \"./fetch\";\nimport { instrumentNavigation } from \"./navigation\";\nimport { instrumentUiEvents } from \"./ui\";\nimport {\n globalConsole,\n globalDocument,\n globalWindow,\n type InstrumentWindow,\n} from \"./window\";\nimport { instrumentXhr } from \"./xhr\";\n\nexport { instrumentBeacon } from \"./beacon\";\nexport { instrumentConsole } from \"./console\";\nexport { instrumentFetch } from \"./fetch\";\nexport { instrumentNavigation } from \"./navigation\";\nexport { clickCrumb, inputCrumb, instrumentUiEvents } from \"./ui\";\nexport { instrumentXhr } from \"./xhr\";\nexport {\n type BeaconNavigator,\n type FetchFn,\n globalConsole,\n globalDocument,\n globalWindow,\n type HistoryLike,\n type InstrumentWindow,\n type XhrConstructor,\n type XhrInstance,\n} from \"./window\";\n\n/** Options for {@link instrumentBreadcrumbs} and the individual installers. */\nexport interface InstrumentOptions {\n /** The window to instrument. Defaults to the page's, when there is one. */\n readonly win?: InstrumentWindow;\n /** The document whose masked UI events are listened for. Defaults to the page's. */\n readonly doc?: Document;\n /** The console to wrap. Defaults to the page's. */\n readonly consoleObj?: ConsoleLike;\n readonly consoleLevels?: readonly BreadcrumbLevel[];\n /** Skip URLs (e.g. the SDK's own ingest calls) so they never become crumbs. */\n readonly ignoreUrl?: (url: string) => boolean;\n readonly now?: () => number;\n /**\n * High-res monotonic clock (spec #122 §D) — used to measure a request's duration as\n * a delta around the wrapped call. Defaults to `performance.now`; injectable for tests.\n */\n readonly mono?: () => number;\n /**\n * Whether to instrument the **console** stream (spec #122 §L; ticket #138).\n * Defaults to `true`; pass `false` and `console` is never wrapped, so no console\n * entry is ever recorded — the per-project toggle stops the stream at its source.\n */\n readonly captureConsole?: boolean;\n /**\n * Whether to instrument the **network** stream — `fetch`, `XHR`, and `sendBeacon`\n * (spec #122 §L; ticket #138). Defaults to `true`; pass `false` and none is\n * wrapped, so no network entry is ever recorded. Navigation and masked UI events\n * are unaffected.\n */\n readonly captureNetwork?: boolean;\n}\n\n/**\n * Install every capture hook onto a window/document and return a single teardown\n * that removes them all. Each hook is independent and defensive: a failure in one\n * never blocks the others, and none can throw into the host page.\n */\nexport function instrumentBreadcrumbs(\n buffer: BreadcrumbBuffer,\n options: InstrumentOptions = {},\n): Teardown {\n const win = options.win ?? globalWindow();\n const doc = options.doc ?? globalDocument();\n const consoleObj = options.consoleObj ?? globalConsole();\n const levels = options.consoleLevels ?? DEFAULT_CONSOLE_LEVELS;\n const ignoreUrl = options.ignoreUrl ?? (() => false);\n const now = options.now ?? Date.now;\n const mono = options.mono ?? nowMono;\n // Per-project capture toggles (#138): a stream is captured unless explicitly\n // turned off, so a boot config that omits it — or an older server — stays on.\n const captureConsole = options.captureConsole !== false;\n const captureNetwork = options.captureNetwork !== false;\n\n const teardowns: Teardown[] = [];\n if (consoleObj && captureConsole) {\n teardowns.push(instrumentConsole(buffer, consoleObj, levels, now));\n }\n if (win) {\n if (captureNetwork) {\n teardowns.push(instrumentFetch(buffer, win, ignoreUrl, now, mono));\n teardowns.push(instrumentXhr(buffer, win, ignoreUrl, now, mono));\n teardowns.push(instrumentBeacon(buffer, win, ignoreUrl, now));\n }\n teardowns.push(instrumentNavigation(buffer, win, now));\n }\n if (doc) {\n teardowns.push(instrumentUiEvents(buffer, doc, now));\n }\n\n return () => {\n for (const teardown of teardowns) {\n try {\n teardown();\n } catch {\n /* teardown is best-effort */\n }\n }\n };\n}\n","/**\n * Mounting the running SDK once boot has said yes.\n *\n * `mountReporter` is the one place the four live pieces are created and wired\n * together — the launcher, the report overlay it opens, the trace buffer and its\n * instrumentation (spec §C), and automatic error capture (spec §E) — and the one\n * place they are all torn down. It runs **only** with a boot answer whose\n * `canSubmit` is true, so every decision here can assume the Gate is already\n * satisfied: the overlay and the auto-capture handlers carry the resolved identity,\n * and both a filed report and an auto-captured error are attributed to the very\n * Reporter boot recognised.\n *\n * The boot answer's `gate` + `tier` ride into the overlay with no second call:\n * `tier` drives the display-only header chip (§G), `gate` is reserved for\n * Gate-aware behaviour.\n */\n\nimport {\n type BootAnswer,\n type BreadcrumbBuffer,\n createBreadcrumbBuffer,\n type IdentityInputs,\n isFixbackApiRequest,\n normaliseRelease,\n type ReporterIdentity,\n type Teardown,\n} from \"@fixback/sdk-core\";\n\nimport { installErrorCapture } from \"./error-capture\";\nimport type { InitOptions } from \"./init\";\nimport { LAUNCH_EVENT, type Launcher, mountLauncher, unmountLauncher } from \"./launcher\";\nimport { createOverlay } from \"./overlay\";\nimport { startReplayRecorder, type ReplayRecorder } from \"./replay\";\nimport { instrumentBreadcrumbs } from \"./trace/instrument\";\nimport { SDK_VERSION } from \"./version\";\n\n/** Context for mounting the launcher + overlay + trace once boot says yes. */\nexport interface MountContext {\n readonly options: InitOptions;\n readonly apiUrl: string;\n readonly key: string;\n /**\n * The identity evidence to forward on each report / auto-capture, read **live** at\n * send time — so a report filed after an in-overlay Connect carries the new Reporter\n * session token, not the stale one the overlay mounted with (ADR-0032).\n */\n readonly getIdentity: () => IdentityInputs;\n /** The current Reporter identity for the chip (ADR-0032) — anonymous or connected. */\n readonly reporterIdentity: ReporterIdentity;\n /** The chip's **Sign in** — starts a Connect (ADR-0032). */\n readonly onSignIn: () => void;\n /** The chip's **Sign out** — clears the Reporter session (ADR-0032). */\n readonly onSignOut: () => void;\n readonly target: HTMLElement;\n readonly answer: BootAnswer;\n}\n\n/** A mounted reporter: how to tear it down, and how to update its identity chip. */\nexport interface MountHandle {\n readonly teardown: Teardown;\n /** Update the identity chip in place after a Connect or sign-out (ADR-0032). */\n setIdentity(identity: ReporterIdentity): void;\n}\n\n/**\n * The effective per-stream capture decision (#138): start from what boot served\n * (default-on when the server omits it or the value is not a boolean), then let an\n * explicit `init` option override that stream. Turning a stream off means it is\n * never instrumented, so no entry of that kind ever reaches the wire.\n */\nfunction streamEnabled(\n override: boolean | undefined,\n served: boolean | undefined,\n): boolean {\n return override ?? (typeof served === \"boolean\" ? served : true);\n}\n\n/** Mount the launcher, overlay, trace, and auto-capture. Returns a teardown + chip updater. */\nexport function mountReporter(ctx: MountContext): MountHandle {\n const { options, apiUrl, key, getIdentity, reporterIdentity, target, answer } = ctx;\n // The host app's Release (#117, ADR-0024), validated once here: an invalid\n // value is dropped with a warning (never shipped for the server to discard,\n // and never a reason to refuse to mount — capture must not break on config).\n const release = options.release ? normaliseRelease(options.release) : undefined;\n if (options.release && !release) {\n console.warn(\n `[fixback] ignoring invalid release ${JSON.stringify(options.release)} — ` +\n \"use 1-100 visible characters with no whitespace or slashes (e.g. a git SHA or semver).\",\n );\n }\n const launcher: Launcher = mountLauncher(target, {\n key,\n reduceMotion: options.reduceMotion,\n });\n\n const served = answer.capture;\n const trace = options.trace ?? {};\n const buffer: BreadcrumbBuffer = createBreadcrumbBuffer({\n budgets: trace.budgets,\n maxAgeMs: trace.maxAgeMs,\n beforeBreadcrumb: options.beforeBreadcrumb,\n });\n const teardownTrace = instrumentBreadcrumbs(buffer, {\n consoleLevels: trace.consoleLevels,\n ignoreUrl: (url) => isFixbackApiRequest(apiUrl, url),\n captureConsole: streamEnabled(options.capture?.console, served?.console),\n captureNetwork: streamEnabled(options.capture?.network, served?.network),\n });\n\n // Buffered session replay (issue #189, ADR-0024): the same gating shape as the\n // trace streams — the served per-project toggle (default-on), overridable from\n // `capture.replay`.\n let replay: ReplayRecorder | null = null;\n if (streamEnabled(options.capture?.replay, served?.replay)) {\n replay = startReplayRecorder(options.replay ?? {});\n }\n\n const overlay = createOverlay({\n apiUrl,\n key,\n getIdentity,\n reporterIdentity,\n onSignIn: ctx.onSignIn,\n onSignOut: ctx.onSignOut,\n gate: answer.gate,\n sdkVersion: SDK_VERSION,\n release,\n deployEnvironment: options.environment,\n target,\n buffer,\n replay,\n beforeSend: options.beforeSend,\n scrub: options.scrub,\n });\n const onLaunch = (): void => overlay.open();\n launcher.host.addEventListener(LAUNCH_EVENT, onLaunch);\n\n // Automatic error capture (spec §E, ADR-0011): two global handlers file uncaught\n // errors as `source: error` Feedback for this session's Reporter, with no prompt.\n // Default-on; `autoCapture: false` is the per-project toggle.\n let teardownAutoCapture: Teardown = () => {};\n if (options.autoCapture !== false) {\n teardownAutoCapture = installErrorCapture({\n apiUrl,\n key,\n getIdentity,\n sdkVersion: SDK_VERSION,\n release,\n deployEnvironment: options.environment,\n buffer,\n replay,\n beforeSend: options.beforeSend,\n scrub: options.scrub,\n }).destroy;\n }\n\n return {\n teardown: () => {\n launcher.host.removeEventListener(LAUNCH_EVENT, onLaunch);\n overlay.destroy();\n unmountLauncher(launcher);\n teardownTrace();\n replay?.stop();\n teardownAutoCapture();\n },\n setIdentity: (id) => overlay.setIdentity(id),\n };\n}\n","/**\n * The browser's **Reporter session** store (ADR-0032) — the storage binding only.\n *\n * After a Connect the SDK holds a compact signed token per origin and forwards it on\n * every boot; the boot answer hands back a refreshed one (30-day sliding). The token\n * lives in `localStorage` under a key **scoped by publishable key** (so two Projects on\n * one origin keep separate sessions), the key format shared with every SDK\n * (`@fixback/sdk-core`). Persistence is best-effort: a blocked or absent `localStorage`\n * (private mode) simply means no stored session — the SDK falls back to anonymous\n * rather than throwing, so it never disturbs the host page.\n */\n\nimport { reporterSessionStorageKey } from \"@fixback/sdk-core\";\n\n/** Read the stored Reporter session token for this Project, or `null`. */\nexport function readReporterSession(publishableKey: string): string | null {\n try {\n return globalThis.localStorage.getItem(reporterSessionStorageKey(publishableKey));\n } catch {\n return null;\n }\n}\n\n/** Persist a Reporter session token for this Project. Best-effort. */\nexport function writeReporterSession(publishableKey: string, token: string): void {\n try {\n globalThis.localStorage.setItem(reporterSessionStorageKey(publishableKey), token);\n } catch {\n // Storage blocked — the session lives only for this page load, which still works.\n }\n}\n\n/** Clear the stored Reporter session token for this Project (sign out). Best-effort. */\nexport function clearReporterSession(publishableKey: string): void {\n try {\n globalThis.localStorage.removeItem(reporterSessionStorageKey(publishableKey));\n } catch {\n // Nothing to do — an unreadable store holds nothing to clear.\n }\n}\n","/**\n * The **session flow** behind `init` (ADR-0032): recognise the Reporter through the\n * Reporter session token it holds, ask ingest what it may do, and mount only when a\n * submission would be accepted — while exposing `signIn` / `signOut` / `identity`.\n *\n * On boot the SDK forwards its stored **Reporter session** token (from a prior Connect,\n * scoped per publishable key) and swaps in the refreshed one boot hands back (30-day\n * sliding). It also detects a one-time code arriving on the `?fixback=` query parameter\n * — the connect page's redirect fallback, and Fixback-issued links (ticket #250) — and\n * exchanges it for a session before booting.\n *\n * **Connect** binds an Account to the site: `signIn` opens the platform's connect page\n * (popup, or a full redirect when it is blocked), exchanges the returned code, and\n * re-boots — so an Open-gated visitor's launcher gains the Account, and a gated\n * Project's launcher **mounts** once the Account is eligible. The launcher mounts only\n * when boot returns `canSubmit`, so a gated Project shows nothing to a signed-out\n * visitor. Everything is wrapped so a Fixback problem resolves to a no-op and never\n * surfaces on the host page.\n */\n\nimport {\n compactIdentity,\n exchangeConnectCode,\n type IdentityInputs,\n type ReporterIdentity,\n type ReporterTier,\n requestBoot,\n revokeReporterSession,\n} from \"@fixback/sdk-core\";\n\nimport { readReturnCode, startConnect, stripReturnCode } from \"./connect\";\nimport { ensureAnonymousId } from \"./identity\";\nimport type { FixbackInstance, InitOptions } from \"./init\";\nimport { type MountHandle, mountReporter } from \"./mount\";\nimport {\n clearReporterSession,\n readReporterSession,\n writeReporterSession,\n} from \"./reporter-session-store\";\n\n/** A running SDK that mounted nothing — every failure path resolves to this. */\nexport const NOOP_INSTANCE: FixbackInstance = {\n destroy() {},\n signIn: () => Promise.resolve({ status: \"anonymous\" }),\n signOut: () => Promise.resolve(),\n identity: () => ({ status: \"anonymous\" }),\n};\n\n/** The current page URL, or `\"\"` when it cannot be read; never throws. */\nfunction safeHref(): string {\n try {\n return window.location.href;\n } catch {\n return \"\";\n }\n}\n\n/**\n * Run one session: recognise the Reporter, boot, and mount when accepted — exchanging a\n * `?fixback=` return code first, and exposing Connect (`signIn` / `signOut` / `identity`).\n */\nexport async function runSession(\n options: InitOptions,\n apiUrl: string,\n): Promise<FixbackInstance> {\n try {\n // No DOM (server-side render, worker) — nothing to mount.\n if (typeof document === \"undefined\") return NOOP_INSTANCE;\n\n const key = options?.key;\n if (typeof key !== \"string\" || key.length === 0) return NOOP_INSTANCE;\n\n const win = window;\n const anonymousId = options.anonymousId ?? ensureAnonymousId();\n const target = options.target ?? document.body;\n\n let disposed = false;\n let token: string | null = readReporterSession(key);\n let mounted: MountHandle | null = null;\n // The tier from the last boot, cached so `identity()` can report it between boots.\n let currentTier: ReporterTier | null = null;\n let account: { name: string; email: string } | null = null;\n let connectUrl: string | undefined;\n\n /** The identity evidence forwarded on every boot / submission — read live. */\n const identityInputs = (): IdentityInputs => ({\n hostIdentity: options.hostIdentity,\n reporterSession: token ?? undefined,\n anonymousId,\n });\n\n /** The current Reporter identity for the chip and `identity()`. */\n const reporterIdentity = (): ReporterIdentity =>\n account\n ? { status: \"connected\", name: account.name, email: account.email, tier: currentTier ?? null }\n : { status: \"anonymous\" };\n\n /** Exchange a one-time code for a Reporter session, storing the token. */\n const exchange = async (code: string): Promise<void> => {\n const result = await exchangeConnectCode(apiUrl, {\n key,\n code,\n anonymousId,\n platform: \"browser\",\n });\n if (result) {\n token = result.reporterSession;\n writeReporterSession(key, token);\n }\n };\n\n /** Boot with the current identity and reconcile what is mounted + the chip. */\n const bootAndRender = async (): Promise<void> => {\n const answer = await requestBoot(apiUrl, {\n key,\n ...compactIdentity(identityInputs()),\n });\n if (disposed) return;\n // Swap in the refreshed session token (30-day sliding) when boot returned one.\n if (answer?.reporterSession) {\n token = answer.reporterSession;\n writeReporterSession(key, token);\n }\n currentTier = answer?.tier ?? null;\n account = answer?.account ?? null;\n connectUrl = answer?.connectUrl;\n\n if (answer?.canSubmit) {\n if (mounted) {\n // Already up (an Open-gated visitor who just Connected): update the chip in\n // place, so the live trace/replay buffers survive the identity change.\n mounted.setIdentity(reporterIdentity());\n } else {\n mounted = mountReporter({\n options,\n apiUrl,\n key,\n getIdentity: identityInputs,\n reporterIdentity: reporterIdentity(),\n onSignIn: () => void signIn(),\n onSignOut: () => void signOut(),\n target,\n answer,\n });\n }\n } else if (mounted) {\n // No longer eligible (a sign-out on a gated Project) — take the launcher down.\n mounted.teardown();\n mounted = null;\n }\n };\n\n /** Open Connect, exchange the code, and re-boot as the Account. */\n const signIn = async (): Promise<ReporterIdentity> => {\n if (disposed || !connectUrl) return reporterIdentity();\n const outcome = await startConnect(win, {\n connectUrl,\n key,\n returnUrl: safeHref(),\n });\n if (outcome.kind === \"code\") {\n await exchange(outcome.code);\n await bootAndRender();\n }\n // `redirected` navigates the page away; the code returns via `?fixback=` on reload.\n return reporterIdentity();\n };\n\n /** Revoke the Reporter session, clear it, and re-boot as anonymous. */\n const signOut = async (): Promise<void> => {\n if (token) await revokeReporterSession(apiUrl, token);\n clearReporterSession(key);\n token = null;\n await bootAndRender();\n };\n\n const instance: FixbackInstance = {\n destroy: () => {\n disposed = true;\n mounted?.teardown();\n mounted = null;\n },\n signIn,\n signOut,\n identity: () => reporterIdentity(),\n };\n\n // A one-time code on the URL (the connect page's redirect fallback, or a\n // Fixback-issued link): exchange it for a session, then strip it from the URL.\n const returnCode = readReturnCode(win);\n if (returnCode) {\n await exchange(returnCode);\n if (disposed) return instance;\n stripReturnCode(win);\n }\n\n await bootAndRender();\n return instance;\n } catch {\n // A Fixback failure must never break the host page.\n return NOOP_INSTANCE;\n }\n}\n","/**\n * The SDK's **entry point** and the options it takes.\n *\n * `init` boots the SDK and mounts the launcher when — and only when — a submission\n * would be accepted for this key, origin, and Gate. It recognises the Reporter through\n * the **Reporter session** token it holds after a Connect (ADR-0032), refreshes it on\n * boot, and detects a one-time code arriving on the `?fixback=` query parameter. The\n * running instance — and the module-level {@link Fixback} — expose `signIn` / `signOut`\n * / `identity`, so a host app can start a Connect from its own UI (the way a gated\n * Project, which shows nothing to a signed-out visitor, is entered).\n *\n * The runtime-agnostic half — the trace buffer and its crumb builders, scrubbing,\n * fingerprinting, the ingest boot + Connect contracts, and the shared init vocabulary —\n * is `@fixback/sdk-core` (ADR-0028) and re-exported here, so a host page imports\n * everything from one package.\n */\n\nimport {\n type BreadcrumbLevel,\n type CommonCaptureInitOptions,\n DEFAULT_API_URL,\n type IdentityInputs,\n type ReporterIdentity,\n type TraceStream,\n} from \"@fixback/sdk-core\";\n\nimport type { ReplayOptions } from \"./replay\";\nimport { NOOP_INSTANCE, runSession } from \"./session\";\n\n// The hosted API origin is defined once in the shared core (ADR-0028); re-exported\n// so `@fixback/sdk`'s public surface still names it.\nexport { DEFAULT_API_URL };\n\n/**\n * Trace buffer **tuning** (spec #122 §A). These are configurable starting points\n * from the grill — three per-stream ring budgets (network ≈ 100 / console ≈ 80 /\n * breadcrumbs ≈ 40), a shared age cap (~3 min, on), and **all** console levels\n * captured (eviction priority, not capture, keeps warn/error above the chatter) —\n * never frozen magic numbers.\n *\n * Tuning only: whether a stream is captured at all is {@link InitOptions.capture}'s\n * job, and whether the SDK runs at all is {@link InitOptions.enabled}'s.\n */\nexport interface TraceOptions {\n /**\n * Per-stream ring budgets (network / console / breadcrumbs); each stream evicts\n * independently, so a chatty stream can't drop another's lead-up. Any stream\n * omitted uses its default.\n */\n readonly budgets?: Partial<Record<TraceStream, number>>;\n /** Shared age cap in ms. Defaults to ~3 min (on); pass `0` to disable age pruning. */\n readonly maxAgeMs?: number;\n /** Console levels captured. Defaults to **all** levels (log/info/warn/error/assert/debug). */\n readonly consoleLevels?: readonly BreadcrumbLevel[];\n}\n\n/**\n * Options for {@link init}. Only `key` is required.\n *\n * The shared half (`apiUrl`, `release`, `environment`, `enabled`, `scrub`,\n * `beforeSend`, `beforeBreadcrumb`, `capture`) comes from `CommonInitOptions`, so\n * it means exactly the same here as in `@fixback/expo` and `@fixback/node`\n * (ADR-0028); the `hostIdentity` escape hatch and an optional `anonymousId` come\n * from `IdentityInputs`; what follows is what only a browser has.\n */\nexport interface InitOptions extends CommonCaptureInitOptions, IdentityInputs {\n /** The Project's **publishable** key — an identifier that ships in the page. */\n readonly key: string;\n /** Where to mount the launcher. Defaults to `document.body`. */\n readonly target?: HTMLElement;\n /**\n * Still the launcher's pulse and motion. An explicit opt-in that complements\n * the visitor's OS-level `prefers-reduced-motion`, which the launcher already\n * honours on its own.\n */\n readonly reduceMotion?: boolean;\n /** Trace buffer tuning (sizes, age cap, console levels) — see {@link TraceOptions}. */\n readonly trace?: TraceOptions;\n /**\n * Buffered session-replay tuning (issue #189, ADR-0024) — masking defaults on:\n * all inputs, all text, SDK chrome blocked. To turn the recorder off, set\n * `capture: { replay: false }`.\n */\n readonly replay?: ReplayOptions;\n /**\n * Automatic error capture — the SDK files uncaught exceptions / unhandled\n * rejections as `source: error` Feedback with no prompt (spec §E, ADR-0011).\n * **Default-on across all Gates**; set `false` for the per-project toggle that\n * turns it off. It is gated by boot's `canSubmit` either way, so an auto-error is\n * never filed where a manual report would be refused.\n */\n readonly autoCapture?: boolean;\n}\n\n/** A running SDK instance. */\nexport interface FixbackInstance {\n /** Remove the launcher and release its DOM. Safe to call more than once. */\n destroy(): void;\n /**\n * Start a **Connect** (ADR-0032): open the platform's connect page, sign the person\n * in, and bind their Account to this site as a Reporter session. Resolves to the\n * resulting identity. The way to enter a gated Project (which shows no launcher to a\n * signed-out visitor) from the host app's own UI.\n */\n signIn(): Promise<ReporterIdentity>;\n /** Clear the Reporter session — revoke it server-side and forget the token locally. */\n signOut(): Promise<void>;\n /** The current Reporter identity — anonymous, or a connected Account with its tier. */\n identity(): ReporterIdentity;\n}\n\n/**\n * The most recently initialised instance, so the module-level {@link Fixback} can\n * delegate `signIn` / `signOut` / `identity` to it. A host that has not called `init`\n * (or whose `init` has not resolved yet) delegates to a no-op, so these never throw.\n */\nlet active: FixbackInstance = NOOP_INSTANCE;\n\n/**\n * The module-level Connect surface (ADR-0032). `Fixback.signIn()` lets a host app start\n * a Connect from its own UI — the entry point for a gated Project that shows nothing to\n * a signed-out visitor. It delegates to the most recent {@link init} instance.\n */\nexport const Fixback = {\n signIn: (): Promise<ReporterIdentity> => active.signIn(),\n signOut: (): Promise<void> => active.signOut(),\n identity: (): ReporterIdentity => active.identity(),\n};\n\n/**\n * Boot the SDK and mount the launcher when — and only when — a submission would be\n * accepted for this key, origin, and Gate. On an Open Gate the launcher (and its\n * identity chip) mount for an anonymous visitor; on a gated Project the launcher stays\n * absent until the Account is eligible, entered through `Fixback.signIn()` or a\n * Fixback-issued link's `?fixback=` code. Everything is wrapped so a Fixback problem —\n * unreachable, refused, or an unexpected error — resolves to a no-op instance.\n */\nexport function init(options: InitOptions): Promise<FixbackInstance> {\n // The master gate (`enabled: false`): nothing is instrumented, no boot call is made,\n // and nothing mounts — the way to keep Fixback out of local dev without branching.\n if (options?.enabled === false) return Promise.resolve(NOOP_INSTANCE);\n const apiUrl = options?.apiUrl ?? DEFAULT_API_URL;\n return runSession(options, apiUrl).then((instance) => {\n active = instance;\n return instance;\n });\n}\n"],"x_google_ignoreList":[22,23],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACkE9B,SAAgB,GACd,GACA,GACA,GACA,GACM;AAEN,MADA,EAAU,cAAc,IACpB,EAAS,WAAW,aAAa;AACnC,IAAA,EAAU,YACR,EAAE,GAAK,QAAQ,EAAE,OAAO,mBAAmB,GAAG,CAAC,EAAS,QAAQ,EAAS,KAAK,CAAC,CACjF,GACI,EAAS,QACX,EAAU,YACR,EAAE,GAAK,QAAQ;AAAA,MACb,OAAO;AAAA,MACP,cAAc,eAAe,EAAS,IAAA;AAAA,IACxC,GAAG,CAAC,EAAS,IAAI,CAAC,CACpB;AAEF,UAAM,IAAU,EAAE,GAAK,UAAU;AAAA,MAC/B,MAAM;AAAA,MACN,OAAO;AAAA,IACT,GAAG,CAAC,UAAU,CAAC;AACf,IAAA,EAAQ,iBAAiB,SAAS,EAAS,SAAS,GACpD,EAAU,YAAY,CAAO;AAAA,EAC/B,OAAO;AACL,IAAA,EAAU,YACR,EAAE,GAAK,QAAQ,EAAE,OAAO,mBAAmB,GAAG,CAAC,WAAW,CAAC,CAC7D;AACA,UAAM,IAAS,EAAE,GAAK,UAAU;AAAA,MAC9B,MAAM;AAAA,MACN,OAAO;AAAA,IACT,GAAG,CAAC,SAAS,CAAC;AACd,IAAA,EAAO,iBAAiB,SAAS,EAAS,QAAQ,GAClD,EAAU,YAAY,CAAM;AAAA,EAC9B;AACF;AAaA,SAAgB,GACd,GACA,GACa;;AACb,QAAM,EAAE,KAAA,EAAA,IAAQ,GACV,IAAO,EAAE,GAAK,OAAO,EAAA,CAAG,EAAA,GAAoB,GAAG,CAAC;AACtD,EAAA,EAAK,MAAM,UACT;AACF,QAAM,IAAS,EAAK,aAAa,EAAE,MAAM,OAAO,CAAC,GAE3C,IAAQ,EAAI,cAAc,OAAO;AACvC,EAAA,EAAM,cAAc,IACpB,EAAO,YAAY,CAAK;AAGxB,QAAM,IAAW,EAAE,GAAK,UAAU;AAAA,IAChC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,cAAc;AAAA,EAChB,GAAG,CAAC,GAAG,CAAC;AACR,EAAA,EAAS,iBAAiB,SAAS,EAAS,OAAO;AAInD,QAAM,IAAW,EAAE,GAAK,QAAQ,EAAE,OAAO,iBAAiB,CAAC;AAC3D,EAAA,GAAmB,GAAK,GAAU,EAAO,UAAU,CAAQ;AAC3D,QAAM,IAAO,EAAE,GAAK,OAAO,EAAE,OAAO,aAAa,GAAG;AAAA,IAClD,EAAE,GAAK,QAAQ,EAAE,OAAO,gBAAgB,CAAC;AAAA,IACzC,EAAE,GAAK,QAAQ,EAAE,OAAO,cAAc,GAAG,CAAC,SAAS,CAAC;AAAA,IACpD;AAAA,EACF,CAAC;AACD,EAAA,EAAK,YAAY,CAAQ;AAGzB,QAAM,IAAW,EAAE,GAAK,QAAQ,EAAE,OAAO,iBAAiB,CAAC,GACrD,IAAU,EAAE,GAAK,QAAQ,EAAE,OAAO,qBAAqB,CAAC,GACxD,IAAO,EAAE,GAAK,OAAO,EAAE,OAAO,aAAa,GAAG,CAAC,GAAU,CAAO,CAAC,GAGjE,IAAU,EAAE,GAAK,YAAY;AAAA,IACjC,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,EAChB,CAAC,GAGK,IAAS,EAAE,GAAK,OAAO;AAAA,IAC3B,OAAO;AAAA,IACP,MAAM;AAAA,IACN,aAAa;AAAA,EACf,CAAC,GACK,IAAU,EAAE,GAAK,UAAU;AAAA,IAC/B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,EACT,CAAC;AACD,EAAA,EAAQ,iBAAiB,SAAS,EAAS,YAAY;AACvD,QAAM,IAAa,EAAE,GAAK,UAAU;AAAA,IAClC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,cAAc;AAAA,EAChB,CAAC;AACD,EAAA,EAAW,YAAY,GAAa,CAAG,CAAC,GACxC,EAAW,iBAAiB,SAAS,EAAS,cAAc;AAC5D,QAAM,IAAU,EAAE,GAAK,UAAU;AAAA,IAAE,MAAM;AAAA,IAAU,OAAO;AAAA,EAAa,GAAG,CAAC,MAAM,CAAC;AAClF,EAAA,EAAQ,iBAAiB,SAAS,EAAS,MAAM;AACjD,QAAM,IAAQ,EAAE,GAAK,OAAO,EAAE,OAAO,cAAc,GAAG;AAAA,IAAC;AAAA,IAAS;AAAA,IAAY;AAAA,EAAO,CAAC,GAE9E,IAAO,EAAE,GAAK,OAAO,EAAE,OAAO,aAAa,GAAG;AAAA,IAAC;AAAA,IAAM;AAAA,IAAS;AAAA,IAAQ;AAAA,EAAK,CAAC,GAG5E,IAAO,EAAE,GAAK,OAAO,EAAE,OAAO,aAAa,GAAG;AAAA,IAClD,EAAE,GAAK,OAAO,EAAE,OAAO,oBAAoB,GAAG,CAAC,GAAG,CAAC;AAAA,IACnD,EAAE,GAAK,OAAO,EAAE,OAAO,oBAAoB,GAAG,CAAC,aAAa,CAAC;AAAA,IAC7D,EAAE,GAAK,OAAO,EAAE,OAAO,kBAAkB,GAAG,CAAC,mCAAmC,CAAC;AAAA,EACnF,CAAC,GAEK,IAAQ,EAAE,GAAK,OAAO;AAAA,IAC1B,OAAO;AAAA,IACP,MAAM;AAAA,IACN,cAAc;AAAA,EAChB,GAAG;AAAA,IAAC;AAAA,IAAM;AAAA,IAAM;AAAA,EAAI,CAAC,GAGf,IAAY,EAAE,GAAK,OAAO,EAAE,OAAO,kBAAkB,CAAC;AAC5D,EAAA,EAAU,MAAM,UAAU;AAC1B,QAAM,IAAY,EAAE,GAAK,OAAO,EAAE,OAAO,aAAa,GAAG,CACvD,EAAE,GAAK,OAAO,EAAE,OAAO,aAAa,GAAG,CAAC,4CAA4C,CAAC,GACrF,CACF,CAAC,GAGK,IAAS,EAAE,GAAK,OAAO,EAAE,OAAO,oBAAoB,CAAC;AAC3D,EAAA,EAAO,MAAM,UAAU;AACvB,QAAM,IAAe,EAAE,GAAK,OAAO,EAAE,OAAO,gBAAgB,GAAG;AAAA,IAC7D,EAAE,GAAK,OAAO,EAAE,OAAO,oBAAoB,CAAC;AAAA,IAC5C,EAAE,GAAK,OAAO,EAAE,OAAO,aAAa,GAAG,CAAC,yCAAyC,CAAC;AAAA,IAClF;AAAA,EACF,CAAC,GAGK,IAAU,GAAQ,GAAK,OAAO;AAAA,IAClC,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,EACV,CAAC,GACK,IAAW,EAAE,GAAK,SAAS;AAAA,IAC/B,OAAO;AAAA,IACP,aAAa;AAAA,IACb,cAAc;AAAA,EAChB,CAAC;AACD,EAAA,EAAS,MAAM,UAAU;AACzB,QAAM,IAAY,EAAE,GAAK,OAAO,EAAE,OAAO,mBAAmB,CAAC,GAEvD,IAAY,oBAAI,IAAiC,GACjD,KAAmC,CAAC;AAC1C,aAAW,EAAE,MAAA,GAAM,OAAA,GAAA,KAAW,IAAY;AACxC,UAAM,KAAS,EAAE,GAAK,UAAU;AAAA,MAC9B,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,MACP,cAAc;AAAA,IAChB,CAAC;AACD,IAAA,GAAO,YAAY,GAAc,GAAK,CAAI,CAAC,GAC3C,GAAO,iBAAiB,SAAA,MAAe,EAAS,aAAa,CAAI,CAAC,GAClE,EAAU,IAAI,GAAM,EAAM,GAC1B,GAAY,KAAK,EAAM;AAAA,EACzB;AACA,QAAM,IAAU,EAAE,GAAK,UAAU;AAAA,IAC/B,MAAM;AAAA,IACN,OAAO;AAAA,IACP,OAAO;AAAA,IACP,cAAc;AAAA,EAChB,CAAC;AACD,EAAA,EAAQ,YAAY,GAAU,CAAG,CAAC,GAClC,EAAQ,iBAAiB,SAAS,EAAS,MAAM;AACjD,QAAM,IAAgB,EAAE,GAAK,UAAU;AAAA,IACrC,MAAM;AAAA,IACN,OAAO;AAAA,EACT,GAAG,CAAC,QAAQ,CAAC;AACb,EAAA,EAAc,iBAAiB,SAAS,EAAS,YAAY;AAC7D,QAAM,IAAY,EAAE,GAAK,UAAU;AAAA,IACjC,MAAM;AAAA,IACN,OAAO;AAAA,EACT,GAAG,CAAC,QAAQ,CAAC;AACb,EAAA,EAAU,iBAAiB,SAAS,EAAS,YAAY;AACzD,QAAM,IAAc,EAAE,GAAK,OAAO,EAAE,OAAO,qBAAqB,GAAG;AAAA,IACjE,GAAG;AAAA,IACH,EAAE,GAAK,QAAQ,EAAE,OAAO,qBAAqB,CAAC;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC,GACK,IAAY,EAAE,GAAK,OAAO,EAAE,OAAO,aAAa,GAAG;AAAA,IACvD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAA,EAAO,OAAO,GAAO,GAAW,GAAc,CAAS,KACvD,IAAC,EAAO,YAAA,QAAA,MAAA,SAAA,IAAU,EAAI,MAAM,YAAY,CAAI,GAErC;AAAA,IACL,MAAA;AAAA,IACA,MAAM;AAAA,MACJ,OAAA;AAAA,MACA,UAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,IACF;AAAA,EACF;AACF;ACxQA,IAAM,KAAgB;AA6DtB,SAAgB,GAAc,GAA0C;;AACtE,QAAM,KAAA,IAAM,EAAO,SAAA,QAAA,MAAA,SAAA,IAAO,UACpB,KAAA,KAAA,IAAM,EAAO,SAAA,QAAA,MAAA,SAAA,IAAO,EAAI,iBAAA,QAAA,MAAA,SAAA,IAAe,QACvC,KAAA,IAAa,EAAO,gBAAA,QAAA,MAAA,SAAA,IAAc,IAClC,IAAoB;AAAA,IACxB,eAAA,KAAA,IAAc,EAAO,UAAA,QAAA,MAAA,SAAA,SAAA,EAAM,kBAAA,QAAA,MAAA,SAAA,IAAgB;AAAA,IAC3C,qBAAA,KAAA,IAAoB,EAAO,UAAA,QAAA,MAAA,SAAA,SAAA,EAAM,wBAAA,QAAA,MAAA,SAAA,IAAsB;AAAA,EACzD;AAEA,MAAI,IAA2B,MAC3B,IAAoB,MACpB,IAAoC,MAEpC,IAAoC,EAAO,kBAC3C,IAAkD,MAClD,IAAO,IAMP,IAAsC,MACtC,IAAwC;AAE5C,WAAS,EAAU,GAAiB,GAAwB;AAC1D,IAAK,MACL,EAAK,OAAO,cAAc,GAC1B,EAAK,OAAO,UAAU,OAAO,YAAY,CAAO;AAAA,EAClD;AAGA,WAAS,IAAsB;AAC7B,QAAI,CAAC,KAAQ,CAAC,EAAS;AACvB,UAAM,EAAE,iBAAA,GAAiB,QAAA,GAAQ,OAAA,EAAA,IAAU,EAAQ,MAAM,GACnD,IAAY,EAAM;AAExB,IAAA,EAAK,KAAK,UAAU,OAAO,eAAe,CAAC,CAAC,CAAe,GAC3D,EAAK,SAAS,cAAc,IAAkB,EAAgB,WAAW,IAEzE,EAAK,QAAQ,cAAc,IAC3B,EAAK,QAAQ,OACX,GAAU,CAAG,GACb,EAAI,eAAe,IAAkB,mBAAmB,cAAc,CACxE,GACA,EAAK,WAAW,UAAU,OAAO,eAAe,CAAC,CAAC,KAAU,IAAY,CAAC;AAEzE,UAAM,IAAiB,CAAC;AACxB,IAAI,KAAiB,EAAK,KAAK,SAAS,GACpC,KAAQ,EAAK,KAAK,QAAQ,GAC1B,IAAY,KAAG,EAAK,KAAK,GAAG,CAAA,QAAiB,MAAc,IAAI,KAAK,GAAA,EAAK,GAC7E,EAAK,QAAQ,cAAc,EAAK,SAC5B,GAAG,EAAK,KAAK,KAAK,CAAA,qCAClB;AAAA,EACN;AAEA,WAAS,IAAuB;AAC9B,IAAI,MAAc,SAChB,aAAa,CAAS,GACtB,IAAY;AAAA,EAEhB;AAEA,WAAS,IAAyB;AAEhC,IADA,IAAQ,WACH,MACL,EAAK,QAAQ,WAAW,IACxB,EAAK,QAAQ,cAAc;AAAA,EAC7B;AAGA,WAAS,IAAoB;AAC3B,IAAA,IAAQ,QACR,KAAA,QAAA,EAAM,MAAM,UAAU,IAAI,SAAS,GACnC,IAAY,WAAW,GAAO,EAAa;AAAA,EAC7C;AAEA,iBAAe,IAAsB;AACnC,QAAI,GAAC,KAAQ,CAAC,KAAW,MAAU,YACnC;AAAA,MAAA,EAAQ,SAAS,GACjB,IAAQ,WACR,EAAK,QAAQ,WAAW,IACxB,EAAK,QAAQ,cAAc,YAC3B,EAAU,IAAI,EAAK;AACnB,UAAI;;AACF,cAAM,IAAU,MAAM,GACpB;AAAA,UACE,QAAQ,EAAO;AAAA,UACf,KAAK,EAAO;AAAA,UACZ,WAAA,IAAU,EAAO,iBAAA,QAAA,MAAA,SAAA,SAAA,EAAA,KAAA,CAAc;AAAA,UAC/B,YAAA;AAAA,UACA,SAAS,EAAO;AAAA,UAChB,mBAAmB,EAAO;AAAA,UAC1B,KAAA;AAAA,UACA,QAAQ,EAAO;AAAA,UACf,QAAQ,EAAO;AAAA,UACf,YAAY,EAAO;AAAA,UACnB,OAAO,EAAO;AAAA,UACd,cAAc,EAAK;AAAA,QACrB,GACA;AAAA,UACE,SAAS,EAAK,QAAQ;AAAA,UACtB,SAAS,EAAQ,MAAM;AAAA,UACvB,cAAA;AAAA,QACF,CACF;AAGA,YAAI,EAAQ,SAAS,aAAa,EAAQ,OAAO,IAAI;AACnD,UAAA,EAAY;AACZ;AAAA,QACF;AACA,QAAA,EAAiB,GACjB,EACE,EAAQ,OAAO,WAAW,gBACtB,wCACA,wCACJ,EACF;AAAA,MACF,QAAQ;AACN,QAAA,EAAiB,GACjB,EAAU,qCAAqC,EAAI;AAAA,MACrD;AAAA;AAAA,EACF;AAEA,WAAS,IAAoB;AAC3B,QAAI,KAAQ,KAAQ,EAAS;AAC7B,UAAM,IAAO,GACX;AAAA,MAAE,KAAA;AAAA,MAAK,QAAQ,EAAO;AAAA,MAAQ,UAAU;AAAA,IAAgB,GACxD;AAAA,MACE,SAAS;AAAA,MACT,cAAA,MAAoB;AAClB,QAAI,MAAU,cAAW,KAAA,QAAA,EAAS,WAAW;AAAA,MAC/C;AAAA,MACA,gBAAA,MAAsB;AACpB,QAAI,MAAU,cAAW,KAAA,QAAA,EAAS,aAAa;AAAA,MACjD;AAAA,MACA,QAAA,MAAA;AAAc,QAAK,EAAK;AAAA;AAAA,MACxB,cAAA,CAAe,MAAA,KAAA,OAAA,SAAS,EAAS,QAAQ,CAAI;AAAA,MAC7C,QAAA,MAAA,KAAA,OAAA,SAAc,EAAS,KAAK;AAAA,MAC5B,cAAA,MAAA,KAAA,OAAA,SAAoB,EAAS,WAAW;AAAA,MACxC,cAAA,MAAA,KAAA,OAAA,SAAoB,EAAS,WAAW;AAAA,MACxC,UAAU,EAAO;AAAA,MACjB,WAAW,EAAO;AAAA,IACpB,CACF;AACA,IAAA,IAAO,EAAK,MACZ,IAAO,EAAK,MACZ,IAAU,GAAwB;AAAA,MAChC,KAAA;AAAA,MACA,MAAM,EAAK;AAAA,MACX,oBAAoB,EAAK;AAAA,MACzB,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,WAAS,IAAoB;;AAE3B,QADA,EAAY,GACR,GAAC,KAAQ,CAAC,KAAQ,CAAC,IACvB;AAAA,MAAA,EAAe,GACf,EAAQ,SAAS,GAMjB,KAAA,KAAA,IAAe,EAAO,YAAA,QAAA,MAAA,SAAA,SAAA,EAAQ,SAAS,OAAA,QAAA,MAAA,SAAA,IAAK,MAC5C,EAAQ,MAAM,GACd,EAAK,MAAM,UAAU,OAAO,SAAS,GACrC,EAAK,QAAQ,QAAQ,IACrB,EAAiB,GACjB,EAAU,IAAI,EAAK,GACnB,EAAc,GACd,EAAK,MAAM,UAAU,SACrB,IAAO;AACP,UAAI;AACF,QAAA,EAAK,QAAQ,MAAM;AAAA,MACrB,QAAQ;AAAA,MAER;AAAA;AAAA,EACF;AAEA,WAAS,IAAc;AACrB,IAAA,EAAe,GACf,KAAA,QAAA,EAAS,SAAS,GACd,MAAM,EAAK,MAAM,UAAU,SAC/B,IAAO,IACP,IAAe;AAAA,EACjB;AAEA,WAAS,KAAgB;AACvB,IAAA,EAAe,GACf,KAAA,QAAA,EAAS,SAAS,GAClB,KAAA,QAAA,EAAM,OAAO,GACb,IAAO,MACP,IAAO,MACP,IAAU,MACV,IAAO;AAAA,EACT;AAGA,WAAS,EAAY,GAAkC;AACrD,IAAA,IAAkB,GACd,KACF,GAAmB,GAAK,EAAK,UAAU,GAAU;AAAA,MAC/C,UAAU,EAAO;AAAA,MACjB,WAAW,EAAO;AAAA,IACpB,CAAC;AAAA,EAEL;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,IAAI,SAAS;AACX,aAAO;AAAA,IACT;AAAA,EACF;AACF;ACzUA,IAAI,KAAY,OAAO,gBACnB,KAAA,CAAmB,GAAK,GAAK,MAAU,KAAO,IAAM,GAAU,GAAK,GAAK;AAAA,EAAE,YAAY;AAAA,EAAM,cAAc;AAAA,EAAM,UAAU;AAAA,EAAM,OAAA;AAAM,CAAC,IAAI,EAAI,CAAA,IAAO,GACtJ,IAAA,CAAiB,GAAK,GAAK,MAAU,GAAgB,GAAK,OAAO,KAAQ,WAAW,IAAM,KAAK,GAAK,CAAK,GACzG,IACAE,IAA4B,kBAAE,OAChC,EAAW,EAAW,mBAAsB,CAAA,IAAK,oBACjD,EAAW,EAAW,OAAU,CAAA,IAAK,QACrC,EAAW,EAAW,eAAkB,CAAA,IAAK,gBAC7C,EAAW,EAAW,sBAAyB,CAAA,IAAK,uBACpD,EAAW,EAAW,OAAU,CAAA,IAAK,QACrC,EAAW,EAAW,SAAY,CAAA,IAAK,UACvC,EAAW,EAAW,SAAY,CAAA,IAAK,UACvC,EAAW,EAAW,QAAW,CAAA,IAAK,SAC/B,IACNA,KAAa,CAAC,CAAC,GACd,IAAoC,kBAAE,OACxC,EAAmB,EAAmB,WAAc,CAAA,IAAK,YACzD,EAAmB,EAAmB,YAAe,CAAA,IAAK,aAC1D,EAAmB,EAAmB,mBAAsB,CAAA,IAAK,oBACjE,EAAmB,EAAmB,SAAY,CAAA,IAAK,UACvD,EAAmB,EAAmB,iBAAoB,CAAA,IAAK,kBAC/D,EAAmB,EAAmB,QAAW,CAAA,IAAK,SACtD,EAAmB,EAAmB,YAAe,CAAA,IAAK,aAC1D,EAAmB,EAAmB,mBAAsB,CAAA,IAAK,oBACjE,EAAmB,EAAmB,iBAAoB,CAAA,IAAK,kBAC/D,EAAmB,EAAmB,iBAAoB,CAAA,IAAK,kBAC/D,EAAmB,EAAmB,OAAU,EAAA,IAAM,QACtD,EAAmB,EAAmB,MAAS,EAAA,IAAM,OACrD,EAAmB,EAAmB,OAAU,EAAA,IAAM,QACtD,EAAmB,EAAmB,mBAAsB,EAAA,IAAM,oBAClE,EAAmB,EAAmB,YAAe,EAAA,IAAM,aAC3D,EAAmB,EAAmB,oBAAuB,EAAA,IAAM,qBACnE,EAAmB,EAAmB,gBAAmB,EAAA,IAAM,iBACxD,IACN,KAAqB,CAAC,CAAC,GACtB,IAAoC,kBAAE,OACxC,EAAmB,EAAmB,UAAa,CAAA,IAAK,WACxD,EAAmB,EAAmB,YAAe,CAAA,IAAK,aAC1D,EAAmB,EAAmB,QAAW,CAAA,IAAK,SACtD,EAAmB,EAAmB,cAAiB,CAAA,IAAK,eAC5D,EAAmB,EAAmB,WAAc,CAAA,IAAK,YACzD,EAAmB,EAAmB,QAAW,CAAA,IAAK,SACtD,EAAmB,EAAmB,OAAU,CAAA,IAAK,QACrD,EAAmB,EAAmB,aAAgB,CAAA,IAAK,cAC3D,EAAmB,EAAmB,qBAAwB,CAAA,IAAK,sBACnE,EAAmB,EAAmB,WAAc,CAAA,IAAK,YACzD,EAAmB,EAAmB,cAAiB,EAAA,IAAM,eACtD,IACN,KAAqB,CAAC,CAAC,GACtB,KAA+B,kBAAE,OACnC,EAAc,EAAc,QAAW,CAAA,IAAK,SAC5C,EAAc,EAAc,MAAS,CAAA,IAAK,OAC1C,EAAc,EAAc,QAAW,CAAA,IAAK,SACrC,IACN,MAAgB,CAAC,CAAC,GACjB,KAAgC,kBAAE,OACpC,EAAe,EAAe,IAAA,IAAQ,CAAA,IAAK,MAC3C,EAAe,EAAe,QAAW,CAAA,IAAK,SAC9C,EAAe,EAAe,SAAY,CAAA,IAAK,UACxC,IACN,MAAiB,CAAC,CAAC,GAClB,KAAoC,kBAAE,OACxC,EAAmB,EAAmB,OAAU,CAAA,IAAK,QACrD,EAAmB,EAAmB,QAAW,CAAA,IAAK,SACtD,EAAmB,EAAmB,SAAY,CAAA,IAAK,UACvD,EAAmB,EAAmB,eAAkB,CAAA,IAAK,gBAC7D,EAAmB,EAAmB,aAAgB,CAAA,IAAK,cACpD,IACN,MAAqB,CAAC,CAAC,GACtB,IAA2B,kBAAE,OAC/B,EAAU,EAAU,WAAc,CAAA,IAAK,YACvC,EAAU,EAAU,eAAkB,CAAA,IAAK,gBAC3C,EAAU,EAAU,UAAa,CAAA,IAAK,WACtC,EAAU,EAAU,OAAU,CAAA,IAAK,QACnC,EAAU,EAAU,QAAW,CAAA,IAAK,SACpC,EAAU,EAAU,UAAa,CAAA,IAAK,WAC/B,IACN,KAAY,CAAC,CAAC,GACX,KAAoB;AAAA,EACxB,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY,CAAC,QAAQ,aAAa;AAAA,EAClC,SAAS;AAAA,IAAC;AAAA,IAAc;AAAA,IAAiB;AAAA,EAAkB;AAAA,EAC3D,kBAAkB,CAAC;AACrB,GACM,KAAkB;AAAA,EACtB,MAAM,CAAC,YAAY,aAAa;AAAA,EAChC,YAAY,CAAC,cAAc;AAAA,EAC3B,SAAS,CAAC;AAAA,EACV,kBAAkB,CAAC,aAAa;AAClC,GACM,KAAyB,CAAC,GAC1B,KAA6B,CAAC,GAC9B,KAAA,MACG,CAAC,CAAC,WAAW;AAEtB,SAAS,GAAsB,GAAK;AAClC,MAAI,GAAuB,CAAA,EACzB,QAAO,GAAuB,CAAA;AAChC,QAAM,IAAa,WAAW,CAAA,GACxB,IAAmB,EAAW,WAC9B,IAAgB,KAAO,KAAoB,GAAkB,CAAA,IAAO,QACpE,IAAuB,GAC3B,KACA,EAAc,MAAA,CACX,MAAa;AACZ,QAAI,GAAK;AACT,WAAO,IACJ,KAAM,IAAM,OAAO,yBAAyB,GAAkB,CAAQ,MAAM,OAAO,SAAS,EAAI,QAAQ,QAAgB,EAAG,SAAS,EAAE,SAAS,eAAe;AAAA,EAEnK,CACF,IAEI,IAAc,KAAO,KAAkB,GAAgB,CAAA,IAAO,QAC9D,IAAqB,GACzB,KAAe,EAAY,MAAA,CAExB,MAAW;AACV,QAAI;AACJ,WAAO,OAAO,EAAiB,CAAA,KAAY,gBAAgB,IAAM,EAAiB,CAAA,MAAY,OAAO,SAAS,EAAI,SAAS,EAAE,SAAS,eAAe;AAAA,EACvJ,CACF;AAEF,MAAI,KAAwB,KAAsB,CAAC,GAAqB;AACtE,WAAA,GAAuB,CAAA,IAAO,EAAW,WAClC,EAAW;AAEpB,MAAI;AACF,UAAM,IAAW,SAAS,cAAc,QAAQ;AAChD,IAAA,EAAS,MAAM,UAAU,QACzB,SAAS,KAAK,YAAY,CAAQ;AAClC,UAAM,IAAM,EAAS;AACrB,QAAI,CAAC,EAAK,QAAO,EAAW;AAC5B,UAAM,IAAkB,EAAI,CAAA,EAAK;AACjC,QAAI,CAAC;AACH,aAAA,EAAS,OAAO,GACT;AAET,UAAM,IAAK,UAAU;AACrB,WAAI,EAAG,SAAS,QAAQ,KAAK,CAAC,EAAG,SAAS,QAAQ,KAChD,EAAS,UAAU,IAAI,UAAU,GACjC,EAAS,aAAa,oCAAoC,EAAE,GAC5D,GAA2B,CAAA,IAAA,MAAa,EAAS,OAAO,KAExD,EAAS,OAAO,GAEX,GAAuB,CAAA,IAAO;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AACA,IAAM,KAAyB,CAAC;AAChC,SAAS,GAAqB,GAAK,GAAU,GAAU;AACrD,MAAI;AACJ,QAAM,IAAW,GAAG,CAAA,IAAO,OAAO,CAAQ,CAAA;AAC1C,MAAI,GAAuB,CAAA,EACzB,QAAO,GAAuB,CAAA,EAAU,KACtC,CACF;AACF,QAAM,IAAqB,GAAsB,CAAG,GAC9C,KAAqB,IAAM,OAAO,yBACtC,GACA,CACF,MAAM,OAAO,SAAS,EAAI;AAC1B,SAAK,KACL,GAAuB,CAAA,IAAY,GAC5B,EAAkB,KAAK,CAAQ,KAFP,EAAS,CAAA;AAG1C;AACA,IAAM,KAAuB,CAAC;AAC9B,SAAS,GAAmB,GAAK,GAAU,GAAQ;AACjD,QAAM,IAAW,GAAG,CAAA,IAAO,OAAO,CAAM,CAAA;AACxC,MAAI,GAAqB,CAAA,EACvB,QAAO,GAAqB,CAAA,EAAU,KACpC,CACF;AAEF,QAAM,IADqB,GAAsB,CACR,EAAE,CAAA;AAC3C,SAAI,OAAO,KAAoB,aAAmB,EAAS,CAAA,KAC3D,GAAqB,CAAA,IAAY,GAC1B,EAAgB,KAAK,CAAQ;AACtC;AACA,SAAS,GAAc,GAAG;AACxB,SAAO,GAAqB,QAAQ,GAAG,eAAe;AACxD;AACA,SAAS,GAAW,GAAG;AACrB,SAAO,GAAqB,QAAQ,GAAG,YAAY;AACrD;AACA,SAAS,GAAW,GAAG;AACrB,SAAO,GAAqB,QAAQ,GAAG,YAAY;AACrD;AACA,SAAS,GAAc,GAAG;AACxB,SAAO,GAAqB,QAAQ,GAAG,eAAe;AACxD;AACA,SAAS,GAAY,GAAG;AACtB,SAAO,GAAqB,QAAQ,GAAG,aAAa;AACtD;AACA,SAAS,GAAS,GAAG,GAAO;AAC1B,SAAO,GAAmB,QAAQ,GAAG,UAAU,EAAE,CAAK;AACxD;AACA,SAAS,GAAY,GAAG;AACtB,SAAO,GAAmB,QAAQ,GAAG,aAAa,EAAE;AACtD;AACA,SAAS,GAAK,GAAG;AACf,SAAI,CAAC,KAAK,EAAE,UAAU,KAAW,OAC1B,GAAqB,cAAc,GAAG,MAAM;AACrD;AACA,SAAS,GAAY,GAAG;AACtB,SAAO,EAAE;AACX;AACA,SAAS,GAAW,GAAG;AACrB,SAAI,CAAC,KAAK,EAAE,gBAAgB,KAAW,OAChC,GAAqB,WAAW,GAAG,YAAY;AACxD;AACA,SAAS,GAAc,GAAG,GAAW;AACnC,SAAO,GAAqB,WAAW,GAAG,eAAe,EAAE,CAAS;AACtE;AACA,SAAS,GAAiB,GAAG,GAAW;AACtC,SAAO,GAAqB,WAAW,GAAG,kBAAkB,EAAE,CAAS;AACzE;AACA,SAAS,KAAuB;;AAC9B,SAAO,CACL,GAAsB,kBAAkB,EAAE,cAAA,IAC1C,GAA2B,sBAAA,QAAA,MAAA,SAAA,KAAA,MAA8B;AAAA,EACzD,EACF;AACF;AACA,IAAI,KAAe,KAAK;AACH,iCAAiB,KAAK,KAAK,IAAI,EAAE,SAAS,CAAC,MAC9D,KAAA,OAAsC,oBAAI,KAAK,GAAG,QAAQ;AAE5D,SAAS,GAAM,GAAQ,GAAM,GAAa;AACxC,MAAI;AACF,QAAI,EAAE,KAAQ,GACZ,QAAA,MAAa;AAAA,IACb;AAEF,UAAM,IAAW,EAAO,CAAA,GAClB,IAAU,EAAY,CAAQ;AACpC,WAAI,OAAO,KAAY,eACrB,EAAQ,YAAY,EAAQ,aAAa,CAAC,GAC1C,OAAO,iBAAiB,GAAS,EAC/B,oBAAoB;AAAA,MAClB,YAAY;AAAA,MACZ,OAAO;AAAA,IACT,EACF,CAAC,IAEH,EAAO,CAAA,IAAQ,GACf,MAAa;AACX,MAAA,EAAO,CAAA,IAAQ;AAAA,IACjB;AAAA,EACF,QAAQ;AACN,WAAA,MAAa;AAAA,IACb;AAAA,EACF;AACF;AACA,IAAM,IAAQ;AAAA,EACZ,eAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,sBAAA;AAAA,EACA,OAAA;AACF;AACA,SAAS,GAAU,GAAG;AACpB,SAAO,EAAE,aAAa,EAAE;AAC1B;AACA,SAAS,GAAa,GAAG;AACvB,QAAM,IAGJ,KAAK,UAAU,KAAK,UAAU,KAAK,EAAM,KAAK,CAAC,KAAK;AAEtD,SAAO,GACL,KAAU,gBAAgB,KAAU,EAAM,WAAW,CAAM,MAAM;AAErE;AACA,SAAS,GAAkB,GAAa;AACtC,SAAO,OAAO,UAAU,SAAS,KAAK,CAAW,MAAM;AACzD;AACA,SAAS,GAAmC,GAAS;AACnD,SAAI,EAAQ,SAAS,yBAAyB,KAAK,CAAC,EAAQ,SAAS,iCAAiC,MACpG,IAAU,EAAQ,QAChB,+BACA,wDACF,IAEK;AACT;AACA,SAAS,GAAsB,GAAM;AACnC,QAAM,EAAE,SAAA,EAAA,IAAY;AACpB,MAAI,EAAQ,MAAM,GAAG,EAAE,SAAS,EAAG,QAAO;AAC1C,QAAM,IAAY,CAAC,WAAW,OAAO,KAAK,UAAU,EAAK,IAAI,CAAA,GAAI;AACjE,SAAI,EAAK,cAAc,KACrB,EAAU,KAAK,OAAO,IACb,EAAK,aACd,EAAU,KAAK,SAAS,EAAK,SAAA,GAAY,GAEvC,EAAK,gBACP,EAAU,KAAK,YAAY,EAAK,YAAA,GAAe,GAE7C,EAAK,MAAM,UACb,EAAU,KAAK,EAAK,MAAM,SAAS,GAE9B,EAAU,KAAK,GAAG,IAAI;AAC/B;AACA,SAAS,GAAoB,GAAG;AAC9B,MAAI;AACF,UAAM,IAAQ,EAAE,SAAS,EAAE;AAC3B,QAAI,CAAC,EACH,QAAO;AAET,QAAI,IAAY,EAAE;AAClB,WAAI,CAAC,KAAa,EAAE,cAClB,IAAY,EAAE,UAAU,UAMnB,GAJkB,MAAM,KAC7B,GAAA,CACC,MAAS,GAAc,GAAM,CAAS,CACzC,EAAE,KAAK,EACkD,CAAC;AAAA,EAC5D,QAAgB;AACd,WAAO;AAAA,EACT;AACF;AACA,SAAS,GAAc,GAAM,GAAW;AACtC,MAAI,GAAgB,CAAI,GAAG;AACzB,QAAI;AACJ,QAAI;AACF,MAAA,IAEA,GAAoB,EAAK,UAAU,KACnC,GAAsB,CAAI;AAAA,IAC5B,QAAgB;AACd,MAAA,IAAoB,EAAK;AAAA,IAC3B;AACA,WAAI,EAAK,WAAW,OACX,GAAe,GAAmB,EAAK,WAAW,IAAI,IAExD;AAAA,EACT,OAAO;AACL,QAAI,IAAkB,EAAK;AAI3B,WAHI,GAAe,CAAI,KAAK,EAAK,aAAa,SAAS,GAAG,MACxD,IAAkB,GAAgB,CAAe,IAE/C,IACK,GAAe,GAAiB,CAAS,IAE3C;AAAA,EACT;AACF;AACA,SAAS,GAAgB,GAAgB;AAEvC,SAAO,EAAe,QAAQ,wCAAO,QAAQ;AAC/C;AACA,SAAS,GAAgB,GAAM;AAC7B,SAAO,gBAAgB;AACzB;AACA,SAAS,GAAe,GAAM;AAC5B,SAAO,kBAAkB;AAC3B;AACA,IAAM,KAAN,MAAa;AAAA,EACX,cAAc;AACZ,IAAA,EAAc,MAAM,aAA6B,oBAAI,IAAI,CAAC,GAC1D,EAAc,MAAM,eAA+B,oBAAI,QAAQ,CAAC;AAAA,EAClE;AAAA,EACA,MAAM,GAAG;AACP,QAAI;AACJ,QAAI,CAAC,EAAG,QAAO;AACf,UAAM,KAAM,IAAM,KAAK,QAAQ,CAAC,MAAM,OAAO,SAAS,EAAI;AAC1D,WAAO,KAAA,OAAA,IAAM;AAAA,EACf;AAAA,EACA,QAAQ,GAAI;AACV,WAAO,KAAK,UAAU,IAAI,CAAE,KAAK;AAAA,EACnC;AAAA,EACA,SAAS;AACP,WAAO,MAAM,KAAK,KAAK,UAAU,KAAK,CAAC;AAAA,EACzC;AAAA,EACA,QAAQ,GAAG;AACT,WAAO,KAAK,YAAY,IAAI,CAAC,KAAK;AAAA,EACpC;AAAA,EAGA,kBAAkB,GAAG;AACnB,UAAM,IAAK,KAAK,MAAM,CAAC;AACvB,SAAK,UAAU,OAAO,CAAE,GACpB,EAAE,cACJ,EAAE,WAAW,QAAA,CACV,MAAc,KAAK,kBAAkB,CAAS,CACjD;AAAA,EAEJ;AAAA,EACA,IAAI,GAAI;AACN,WAAO,KAAK,UAAU,IAAI,CAAE;AAAA,EAC9B;AAAA,EACA,QAAQ,GAAM;AACZ,WAAO,KAAK,YAAY,IAAI,CAAI;AAAA,EAClC;AAAA,EACA,IAAI,GAAG,GAAM;AACX,UAAM,IAAK,EAAK;AAChB,SAAK,UAAU,IAAI,GAAI,CAAC,GACxB,KAAK,YAAY,IAAI,GAAG,CAAI;AAAA,EAC9B;AAAA,EACA,QAAQ,GAAI,GAAG;AACb,UAAM,IAAU,KAAK,QAAQ,CAAE;AAC/B,QAAI,GAAS;AACX,YAAM,IAAO,KAAK,YAAY,IAAI,CAAO;AACzC,MAAI,KAAM,KAAK,YAAY,IAAI,GAAG,CAAI;AAAA,IACxC;AACA,SAAK,UAAU,IAAI,GAAI,CAAC;AAAA,EAC1B;AAAA,EACA,QAAQ;AACN,SAAK,YAA4B,oBAAI,IAAI,GACzC,KAAK,cAA8B,oBAAI,QAAQ;AAAA,EACjD;AACF;AACA,SAAS,KAAe;AACtB,SAAO,IAAI,GAAO;AACpB;AACA,SAAS,GAAe,EACtB,SAAA,GACA,kBAAA,GACA,SAAA,GACA,MAAA,GACA,OAAA,GACA,aAAA,EAAA,GACC;AACD,MAAI,IAAO,KAAS;AACpB,QAAM,IAAa,KAAQ,GAAY,CAAI;AAC3C,UAAI,EAAiB,EAAQ,YAAY,CAAA,KAAM,KAAc,EAAiB,CAAA,OACxE,IACF,IAAO,EAAY,GAAM,CAAO,IAEhC,IAAO,IAAI,OAAO,EAAK,MAAM,IAG1B;AACT;AACA,SAAS,GAAY,GAAK;AACxB,SAAO,EAAI,YAAY;AACzB;AACA,IAAM,KAA0B;AAChC,SAAS,GAAgB,GAAQ;AAC/B,QAAM,IAAM,EAAO,WAAW,IAAI;AAClC,MAAI,CAAC,EAAK,QAAO;AACjB,QAAM,IAAY;AAClB,WAAS,IAAI,GAAG,IAAI,EAAO,OAAO,KAAK,EACrC,UAAS,IAAI,GAAG,IAAI,EAAO,QAAQ,KAAK,GAAW;AACjD,UAAM,IAAe,EAAI,cACnB,IAAuB,MAA2B,IAAe,EAAa,EAAA,IAA2B;AAW/G,QAAI,IAVoB,YAEtB,EAAqB,KACnB,GACA,GACA,GACA,KAAK,IAAI,GAAW,EAAO,QAAQ,CAAC,GACpC,KAAK,IAAI,GAAW,EAAO,SAAS,CAAC,CACvC,EAAE,KAAK,MAEK,EAAE,KAAA,CAAM,MAAU,MAAU,CAAC,EAAG,QAAO;AAAA,EACvD;AAEF,SAAO;AACT;AACA,SAAS,GAAa,GAAS;AAC7B,QAAM,IAAO,EAAQ;AACrB,SAAO,EAAQ,aAAa,qBAAqB,IAAI,aAAa,IAEhE,GAAY,CAAI,IACd;AACN;AACA,SAAS,GAAqB,GAAM,GAAS;;AAC3C,MAAI;AACJ,MAAI;AACF,IAAA,IAAM,IAAI,IAAI,GAAM,KAAA,OAAA,IAAW,OAAO,SAAS,IAAI;AAAA,EACrD,QAAc;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,IAAQ,EAAI,SAAS,MAAM,qBAAK;AACtC,UAAA,IAAQ,KAAS,OAAO,SAAS,EAAM,CAAA,OAAA,QAAA,MAAA,SAAA,IAAO;AAChD;AACA,SAAS,GAAc,GAAK;AAC1B,MAAI,IAAS;AACb,SAAI,EAAI,QAAQ,IAAI,IAAI,KACtB,IAAS,EAAI,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IAE5C,IAAS,EAAI,MAAM,GAAG,EAAE,CAAA,GAE1B,IAAS,EAAO,MAAM,GAAG,EAAE,CAAA,GACpB;AACT;AACA,IAAM,KAAiB,8CACjB,KAAqB,uBACrB,KAAgB,aAChB,KAAW;AACjB,SAAS,GAAe,GAAS,GAAM;AACrC,UAAQ,KAAW,IAAI,QACrB,IAAA,CACC,GAAQ,GAAQ,GAAO,GAAQ,GAAO,MAAU;AAC/C,UAAM,IAAW,KAAS,KAAS,GAC7B,IAAa,KAAU,KAAU;AACvC,QAAI,CAAC,EACH,QAAO;AAET,QAAI,GAAmB,KAAK,CAAQ,KAAK,GAAc,KAAK,CAAQ,EAClE,QAAO,OAAO,CAAA,GAAa,CAAA,GAAW,CAAA;AAExC,QAAI,GAAS,KAAK,CAAQ,EACxB,QAAO,OAAO,CAAA,GAAa,CAAA,GAAW,CAAA;AAExC,QAAI,EAAS,CAAA,MAAO,IAClB,QAAO,OAAO,CAAA,GAAa,GAAc,CAAI,IAAI,CAAA,GAAW,CAAA;AAE9D,UAAM,IAAiB,EAAS,MAAM,GAAG,EAAE,CAAA,GACrC,IAAY,EAAS,UAAU,EAAe,MAAM,GACpD,IAAQ,EAAK,MAAM,GAAG,EAAE,CAAA,EAAG,MAAM,GAAG,GACpC,IAAQ,EAAe,MAAM,GAAG;AACtC,IAAA,EAAM,IAAI;AACV,eAAW,KAAQ,EACjB,CAAI,MAAS,QAEF,MAAS,OAClB,EAAM,IAAI,IAEV,EAAM,KAAK,CAAI;AAGnB,WAAO,OAAO,CAAA,GAAa,EAAM,KAAK,GAAG,CAAA,GAAI,CAAA,GAAY,CAAA;AAAA,EAC3D,CACF;AACF;AACA,SAAS,GAAmB,GAAS,IAAgB,IAAO;AAC1D,SAAI,IACK,EAAQ,QAAQ,0BAA0B,EAAE,IAE5C,EAAQ,QAAQ,0BAA0B,EAAE,EAAE,QAAQ,QAAQ,GAAG;AAE5E;AACA,SAAS,GAAa,GAAS,GAAO,IAAgB,IAAO;AAC3D,QAAM,IAAc,MAAM,KAAK,EAAM,UAAU,GACzC,IAAS,CAAC;AAChB,MAAI,IAAY;AAChB,MAAI,EAAY,SAAS,KAAK,KAAW,OAAO,KAAY,UAAU;AACpE,QAAI,IAAc,GAAmB,GAAS,CAAa;AAC3D,UAAM,IAAa,EAAY,SAAS,EAAQ;AAChD,aAAS,IAAI,GAAG,IAAI,EAAY,QAAQ,IACtC,KAAI,EAAY,CAAA,EAAG,eAAe,OAAO,EAAY,CAAA,EAAG,eAAgB,UAAU;AAChF,YAAM,IAAkB,GACtB,EAAY,CAAA,EAAG,aACf,CACF,GACM,IAAS;AACf,UAAI,IAAI;AACR,aAAO,IAAI,EAAgB,WAGvB,EAAgB,CAAA,EAAG,MAAM,aAAa,KACtC,EAAgB,QAAQ,EAAgB,UAAU,GAAG,CAAC,GAAG,CAAC,MAAM,KAJjC;AACjC;AASF,aAAO,IAAI,EAAgB,QAAQ,KAAK;AACtC,YAAI,IAAiB,EAAgB,UAAU,GAAG,CAAC,GAC/C,IAAgB,EAAY,MAAM,CAAc,GAChD,IAAY;AAChB,YAAI,EAAc,WAAW,EAC3B,CAAA,IAAY,EAAc,CAAA,EAAG;AAAA,iBACpB,EAAc,SAAS,KAAK,EAAc,CAAA,MAAO,MAAM,EAAY,IAAI,CAAA,EAAG,gBAAgB,GACnG,CAAA,IAAY,EAAY,QAAQ,GAAgB,CAAC;AAAA,iBACxC,EAAc,WAAW,GAAG;AAMrC,cALA,IAAiB,EAAe,UAC9B,GACA,EAAe,SAAS,CAC1B,GACA,IAAgB,EAAY,MAAM,CAAc,GAC5C,EAAc,UAAU;AAC1B,mBAAA,EAAO,KAAK,CAAO,GACZ;AAET,UAAA,IAAI;AAAA,QACN,MAAO,CAAI,MAAM,EAAgB,SAAS,MACxC,IAAY,EAAY,QAAQ,CAAc;AAEhD,YAAI,EAAc,UAAU,KAAK,IAAI,GAAQ;AAC3C,gBAAM,IAAkB,EAAY,IAAI,CAAA,EAAG;AAC3C,cAAI,KAAmB,OAAO,KAAoB,UAAU;AAC1D,kBAAM,IAAgB,GAAmB,CAAe,EAAE;AAC1D,YAAA,IAAY,EAAY,QAAQ,GAAgB,CAAa;AAAA,UAC/D;AACA,UAAI,MAAc,OAChB,IAAY,EAAc,CAAA,EAAG;AAAA,QAEjC;AACA,YAAI,MAAc,IAAI;AACpB,cAAI,IAAI,KAAK,MAAM,IAAY,CAAU;AACzC,iBAAO,IAAI,KAAK,IAAI,EAAQ,UAAU;AAEpC,gBADA,KAAa,GACT,IAAY,KAAK,EAAY;AAC/B,qBAAA,EAAO,KAAK,CAAO,GACZ;AAET,kBAAM,IAAW,GACf,EAAQ,UAAU,GAAG,CAAC,GACtB,CACF;AACA,gBAAI,EAAS,WAAW,GAAW;AACjC,cAAA,EAAO,KAAK,EAAQ,UAAU,GAAG,CAAC,CAAC,GACnC,IAAU,EAAQ,UAAU,CAAC,GAC7B,IAAc,EAAY,UAAU,CAAS;AAC7C;AAAA,YACF,MAAO,CAAI,EAAS,SAAS,IAC3B,KAAK,KAAK,IACR,GACA,KAAK,OAAO,IAAY,EAAS,UAAU,CAAU,CACvD,IAEA,KAAK,KAAK,IACR,GACA,KAAK,OAAO,EAAS,SAAS,KAAa,CAAU,CACvD;AAAA,UAEJ;AACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EAEJ;AACA,SAAA,EAAO,KAAK,CAAO,GACZ;AACT;AACA,SAAS,GAAc,GAAS,GAAO;AACrC,SAAO,GAAa,GAAS,CAAK,EAAE,KAAK,gBAAgB;AAC3D;AACA,IAAI,KAAM,GACJ,KAAe,oBAAI,OAAO,cAAc,GACxC,KAAe;AACrB,SAAS,KAAQ;AACf,SAAO;AACT;AACA,SAAS,GAAgB,GAAS;AAChC,MAAI,aAAmB,gBACrB,QAAO;AAET,QAAM,IAAmB,GAAY,EAAQ,OAAO;AACpD,SAAI,GAAa,KAAK,CAAgB,IAC7B,QAEF;AACT;AACA,IAAI,IACA,IACE,KAAoB,sBACpB,KAA0B;AAChC,SAAS,GAAwB,GAAK,GAAgB;AACpD,MAAI,EAAe,KAAK,MAAM,GAC5B,QAAO;AAET,MAAI,IAAM;AACV,WAAS,EAAkB,GAAO;AAChC,QAAI;AACJ,UAAM,IAAQ,EAAM,KAAK,EAAe,UAAU,CAAG,CAAC;AACtD,WAAI,KACF,IAAS,EAAM,CAAA,GACf,KAAO,EAAO,QACP,KAEF;AAAA,EACT;AACA,QAAM,IAAS,CAAC;AAChB,SACE,EAAkB,EAAuB,GACrC,EAAA,KAAO,EAAe,WAFf;AAKX,QAAI,IAAM,EAAkB,EAAiB;AAC7C,QAAI,EAAI,MAAM,EAAE,MAAM;AACpB,MAAA,IAAM,GAAc,GAAK,EAAI,UAAU,GAAG,EAAI,SAAS,CAAC,CAAC,GACzD,EAAO,KAAK,CAAG;AAAA,SACV;AACL,UAAI,IAAiB;AACrB,MAAA,IAAM,GAAc,GAAK,CAAG;AAC5B,UAAI,IAAW;AACf,iBAAa;AACX,cAAM,IAAI,EAAe,OAAO,CAAG;AACnC,YAAI,MAAM,IAAI;AACZ,UAAA,EAAO,MAAM,IAAM,GAAgB,KAAK,CAAC;AACzC;AAAA,QACF,WAAY;AASV,UAAI,MAAM,QACR,IAAW;AAAA,iBATT,MAAM,KAAK;AACb,UAAA,KAAO,GACP,EAAO,MAAM,IAAM,GAAgB,KAAK,CAAC;AACzC;AAAA,QACF,MAAO,CAAI,MAAM,QACf,IAAW;AAOf,QAAA,KAAkB,GAClB,KAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAO,KAAK,IAAI;AACzB;AACA,IAAM,KAAiC,oBAAI,QAAQ;AACnD,SAAS,GAAc,GAAK,GAAgB;AAC1C,SAAI,CAAC,KAAkB,EAAe,KAAK,MAAM,KACxC,IAEF,GAAQ,GAAK,CAAc;AACpC;AACA,SAAS,GAAa,GAAI;AACxB,SAAO,GAAQ,EAAG,YAAY,SAAS,EAAG;AAC5C;AACA,SAAS,GAAQ,GAAK,GAAY;AAChC,MAAI,IAAI,GAAe,IAAI,CAAG;AAK9B,MAJK,MACH,IAAI,EAAI,cAAc,GAAG,GACzB,GAAe,IAAI,GAAK,CAAC,IAEvB,CAAC,EACH,CAAA,IAAa;AAAA,WACJ,EAAW,WAAW,OAAO,KAAK,EAAW,WAAW,OAAO,EACxE,QAAO;AAET,SAAA,EAAE,aAAa,QAAQ,CAAU,GAC1B,EAAE;AACX;AACA,SAAS,GAAmB,GAAK,GAAS,GAAM,GAAO;AACrD,SAAK,MAGD,MAAS,SAAS,MAAS,UAAU,EAAE,MAAY,SAAS,EAAM,CAAA,MAAO,QAElE,MAAS,gBAAgB,EAAM,CAAA,MAAO,OAEtC,MAAS,gBAAgB;AAAA,IAAC;AAAA,IAAS;AAAA,IAAM;AAAA,EAAI,EAAE,SAAS,CAAO,IAHjE,GAAc,GAAK,CAAK,IAKtB,MAAS,WACX,GAAwB,GAAK,CAAK,IAChC,MAAS,UACX,GAAe,GAAO,GAAQ,CAAG,CAAC,IAChC,MAAY,YAAY,MAAS,SACnC,GAAc,GAAK,CAAK,IAE1B;AACT;AACA,SAAS,GAAgB,GAAS,GAAM,GAAQ;AAC9C,SAAO,CAAC,SAAS,OAAO,EAAE,SAAS,CAAO,KAAK,MAAS;AAC1D;AACA,SAAS,GAAkB,GAAS,GAAY,GAAe;AAC7D,MAAI;AACF,QAAI,OAAO,KAAe;AACpB,UAAA,EAAQ,UAAU,SAAS,CAAU,EACvC,QAAO;AAAA,UAGT,UAAS,IAAS,EAAQ,UAAU,QAAQ,OAAY;AACtD,YAAM,IAAY,EAAQ,UAAU,CAAA;AACpC,UAAI,EAAW,KAAK,CAAS,EAC3B,QAAO;AAAA,IAEX;AAEF,QAAI,EACF,QAAO,EAAQ,QAAQ,CAAa;AAAA,EAExC,QAAY;AAAA,EACZ;AACA,SAAO;AACT;AACA,SAAS,GAAkB,GAAM,GAAO,GAAgB;AACtD,MAAI,CAAC,EAAM,QAAO;AAClB,MAAI,EAAK,aAAa,EAAK;AACzB,WAAK,IACE,GAAkB,EAAM,WAAW,CAAI,GAAG,GAAO,CAAc,IAD1C;AAG9B,WAAS,IAAS,EAAK,UAAU,QAAQ,OAAY;AACnD,UAAM,IAAY,EAAK,UAAU,CAAA;AACjC,QAAI,EAAM,KAAK,CAAS,EACtB,QAAO;AAAA,EAEX;AACA,SAAK,IACE,GAAkB,EAAM,WAAW,CAAI,GAAG,GAAO,CAAc,IAD1C;AAE9B;AACA,SAAS,GAAgB,GAAM,GAAe,GAAkB,GAAgB;AAC9E,MAAI;AACJ,MAAI,GAAU,CAAI;AAEhB,QADA,IAAK,GACD,CAAC,EAAM,WAAW,CAAE,EAAE,OACxB,QAAO;AAAA,SAEJ;AAAA,QAAI,EAAM,cAAc,CAAI,MAAM,KACvC,QAAO;AAEP,IAAA,IAAK,EAAM,cAAc,CAAI;AAAA;AAE/B,MAAI;AACF,QAAI,OAAO,KAAkB;AAC3B,UAAI;AACE,YAAA,EAAG,QAAQ,IAAI,CAAA,EAAe,EAAG,QAAO;AAAA,iBAExC,EAAG,UAAU,SAAS,CAAa,EAAG,QAAO;AAAA,eAG/C,GAAkB,GAAI,GAAe,CAAc,EAAG,QAAO;AAEnE,QAAI;AACF,UAAI;AACE,YAAA,EAAG,QAAQ,CAAgB,EAAG,QAAO;AAAA,iBAErC,EAAG,QAAQ,CAAgB,EAAG,QAAO;AAAA;AAAA,EAG/C,QAAY;AAAA,EACZ;AACA,SAAO;AACT;AACA,SAAS,GAAiB,GAAU,GAAU,GAAmB;AAC/D,QAAM,IAAM,EAAS;AACrB,MAAI,CAAC,EACH;AAEF,MAAI,IAAQ,IACR;AACJ,MAAI;AACF,IAAA,IAAa,EAAI,SAAS;AAAA,EAC5B,QAAgB;AACd;AAAA,EACF;AACA,MAAI,MAAe,YAAY;AAC7B,UAAM,IAAQ,WAAA,MAAiB;AAC7B,MAAK,MACH,EAAS,GACT,IAAQ;AAAA,IAEZ,GAAG,CAAiB;AACpB,IAAA,EAAS,iBAAiB,QAAA,MAAc;AACtC,mBAAa,CAAK,GAClB,IAAQ,IACR,EAAS;AAAA,IACX,CAAC;AACD;AAAA,EACF;AACA,QAAM,IAAW;AACjB,MAAI,EAAI,SAAS,SAAS,KAAY,EAAS,QAAQ,KAAY,EAAS,QAAQ;AAClF,sBAAW,GAAU,CAAC,GACf,EAAS,iBAAiB,QAAQ,CAAQ;AAEnD,EAAA,EAAS,iBAAiB,QAAQ,CAAQ;AAC5C;AACA,SAAS,GAAqB,GAAM,GAAU,GAAuB;AACnE,MAAI,IAAQ,IACR;AACJ,MAAI;AACF,IAAA,IAAmB,EAAK;AAAA,EAC1B,QAAgB;AACd;AAAA,EACF;AACA,MAAI,EAAkB;AACtB,QAAM,IAAQ,WAAA,MAAiB;AAC7B,IAAK,MACH,EAAS,GACT,IAAQ;AAAA,EAEZ,GAAG,CAAqB;AACxB,EAAA,EAAK,iBAAiB,QAAA,MAAc;AAClC,iBAAa,CAAK,GAClB,IAAQ,IACR,EAAS;AAAA,EACX,CAAC;AACH;AACA,SAAS,GAAc,GAAG,GAAS;AACjC,QAAM,EACJ,KAAA,GACA,QAAQ,GACR,YAAA,GACA,eAAA,GACA,WAAA,GACA,kBAAA,GACA,kBAAA,IAAmB,CAAC,GACpB,YAAA,GACA,aAAA,GACA,gBAAA,IAAiB,CAAC,GAClB,cAAA,GACA,cAAA,GACA,iBAAA,GACA,mBAAA,IAAoB,IACpB,aAAA,IAAc,GAAA,IACZ,GACE,IAAS,GAAU,GAAK,CAAO;AACrC,UAAQ,EAAE,UAAV;AAAA,IACE,KAAK,EAAE;AACL,aAAI,EAAE,eAAe,eACZ;AAAA,QACL,MAAM,EAAS;AAAA,QACf,YAAY,CAAC;AAAA,QACb,YAAY,EAAE;AAAA,MAEhB,IAEO;AAAA,QACL,MAAM,EAAS;AAAA,QACf,YAAY,CAAC;AAAA,MACf;AAAA,IAEJ,KAAK,EAAE;AACL,aAAO;AAAA,QACL,MAAM,EAAS;AAAA,QACf,MAAM,EAAE;AAAA,QACR,UAAU,EAAE;AAAA,QACZ,UAAU,EAAE;AAAA,QACZ,QAAA;AAAA,MACF;AAAA,IACF,KAAK,EAAE;AACL,aAAO,GAAqB,GAAG;AAAA,QAC7B,KAAA;AAAA,QACA,YAAA;AAAA,QACA,eAAA;AAAA,QACA,kBAAA;AAAA,QACA,kBAAA;AAAA,QACA,aAAA;AAAA,QACA,gBAAA;AAAA,QACA,cAAA;AAAA,QACA,cAAA;AAAA,QACA,iBAAA;AAAA,QACA,mBAAA;AAAA,QACA,QAAA;AAAA,MACF,CAAC;AAAA,IACH,KAAK,EAAE;AACL,aAAO,GAAkB,GAAG;AAAA,QAC1B,KAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA;AAAA,QACA,QAAA;AAAA,QACA,aAAA;AAAA,MACF,CAAC;AAAA,IACH,KAAK,EAAE;AACL,aAAO;AAAA,QACL,MAAM,EAAS;AAAA,QACf,aAAa;AAAA,QACb,QAAA;AAAA,MACF;AAAA,IACF,KAAK,EAAE;AACL,aAAO;AAAA,QACL,MAAM,EAAS;AAAA,QACf,aAAa,EAAM,YAAY,CAAC,KAAK;AAAA,QACrC,QAAA;AAAA,MACF;AAAA,IACF;AACE,aAAO;AAAA,EACX;AACF;AACA,SAAS,GAAU,GAAK,GAAS;AAC/B,MAAI,CAAC,EAAQ,QAAQ,CAAG,EAAG;AAC3B,QAAM,IAAQ,EAAQ,MAAM,CAAG;AAC/B,SAAO,MAAU,IAAI,SAAS;AAChC;AACA,SAAS,GAAkB,GAAG,GAAS;AACrC,QAAM,EAAE,WAAA,GAAW,YAAA,GAAY,QAAA,GAAQ,aAAA,EAAA,IAAgB,GACjD,IAAS,EAAM,WAAW,CAAC,GAC3B,IAAgB,KAAU,EAAO;AACvC,MAAI,IAAe;AACnB,QAAM,IAAU,MAAkB,UAAU,KAAO,QAC7C,IAAW,MAAkB,WAAW,KAAO;AACrD,SAAI,IACF,IAAe,uBACL,MACV,IAAe,EAAM,YAAY,CAAC,GAC9B,KAAW,MACb,IAAe,GAAe,GAAc,GAAQ,EAAQ,GAAG,CAAC,KAGhE,CAAC,KAAW,CAAC,KAAY,KAAgB,MAC3C,IAAe,IAAa,EAAW,GAAc,EAAM,cAAc,CAAC,CAAC,IAAI,EAAa,QAAQ,SAAS,GAAG,IAE3G;AAAA,IACL,MAAM,EAAS;AAAA,IACf,aAAa,KAAgB;AAAA,IAC7B,QAAA;AAAA,EACF;AACF;AACA,SAAS,GAAqB,GAAG,GAAS;AACxC,QAAM,EACJ,KAAA,GACA,YAAA,GACA,eAAA,GACA,kBAAA,GACA,kBAAA,IAAmB,CAAC,GACpB,aAAA,GACA,gBAAA,IAAiB,CAAC,GAClB,cAAA,GACA,cAAA,GACA,iBAAA,GACA,mBAAA,IAAoB,IACpB,QAAA,EAAA,IACE,GACE,IAAY,GAAkB,GAAG,GAAY,CAAa,GAC1D,IAAU,GAAgB,CAAC;AACjC,MAAI,IAAa,CAAC;AAClB,QAAM,IAAM,EAAE,WAAW;AACzB,WAAS,IAAI,GAAG,IAAI,GAAK,KAAK;AAC5B,UAAM,IAAO,EAAE,WAAW,CAAA;AAC1B,IAAK,GAAgB,GAAS,EAAK,MAAM,EAAK,KAAK,MACjD,EAAW,EAAK,IAAA,IAAQ,GACtB,GACA,GACA,GAAY,EAAK,IAAI,GACrB,EAAK,KACP;AAAA,EAEJ;AACA,MAAI,MAAY,UAAU,GAAkB;AAC1C,UAAM,IAAa,MAAM,KAAK,EAAI,WAAW,EAAE,KAAA,CAAM,MAC5C,EAAE,SAAS,EAAE,IACrB;AACD,QAAI,IAAU;AACd,IAAI,MACF,IAAU,GAAoB,CAAU,IAEtC,MACF,OAAO,EAAW,KAClB,OAAO,EAAW,MAClB,EAAW,WAAW;AAAA,EAE1B;AACA,MAAI,MAAY,WAAW,EAAE,OAAO;AAClC,QAAI,IAAU,GACZ,EAAE,KACJ;AACA,IAAI,MACE,EAAE,WAAW,SAAS,MACxB,IAAU,GAAc,GAAS,CAAC,IAEpC,EAAW,WAAW;AAAA,EAE1B;AACA,MAAI;AAAA,IAAC;AAAA,IAAS;AAAA,IAAY;AAAA,EAAQ,EAAE,SAAS,CAAO,GAAG;AACrD,UAAM,IAAQ,EAAE,OACV,IAAU,EAAE;AAClB,IAAI,EAAW,SAAS,WAAW,EAAW,SAAS,cAAc,EAAW,SAAS,YAAY,EAAW,SAAS,YAAY,IACnI,EAAW,QAAQ,GAAe;AAAA,MAChC,SAAS;AAAA,MACT,MAAM,GAAa,CAAC;AAAA,MACpB,SAAA;AAAA,MACA,OAAA;AAAA,MACA,kBAAA;AAAA,MACA,aAAA;AAAA,IACF,CAAC,IACQ,MACT,EAAW,UAAU;AAAA,EAEzB;AAWA,MAVI,MAAY,aACV,EAAE,YAAY,CAAC,EAAiB,SAClC,EAAW,WAAW,KAEtB,OAAO,EAAW,WAGlB,MAAY,YAAY,EAAE,SAC5B,EAAW,eAAe,EAAE,QAAQ,cAAc,IAAI,UAAU,cAE9D,MAAY,YAAY;AAC1B,QAAI,EAAE,cAAc;AACd,MAAC,GAAgB,CAAC,MACpB,EAAW,aAAa,EAAE,UACxB,EAAe,MACf,EAAe,OACjB;AAAA,aAEO,EAAE,eAAe,IAAI;AAC9B,YAAM,IAAgB,EAAE,UACtB,EAAe,MACf,EAAe,OACjB,GACM,IAAc,EAAI,cAAc,QAAQ;AAC9C,MAAA,EAAY,QAAQ,EAAE,OACtB,EAAY,SAAS,EAAE,QAKnB,MAJuB,EAAY,UACrC,EAAe,MACf,EAAe,OAEsB,MACrC,EAAW,aAAa;AAAA,IAE5B;AAAA;AAEF,MAAI,MAAY,SAAS,GAAc;AACrC,IAAK,OACH,KAAgB,EAAI,cAAc,QAAQ,GAC1C,KAAY,GAAc,WAAW,IAAI;AAE3C,UAAM,IAAQ,GACR,IAAW,EAAM,cAAc,EAAM,aAAa,KAAK,KAAK,iBAC5D,IAAmB,EAAM,aACzB,IAAA,MAA0B;AAC9B,MAAA,EAAM,oBAAoB,QAAQ,CAAiB;AACnD,UAAI;AACF,QAAA,GAAc,QAAQ,EAAM,cAC5B,GAAc,SAAS,EAAM,eAC7B,GAAU,UAAU,GAAO,GAAG,CAAC,GAC/B,EAAW,aAAa,GAAc,UACpC,EAAe,MACf,EAAe,OACjB;AAAA,MACF,SAAS,GAAK;AACZ,YAAI,EAAM,gBAAgB,aAAa;AACrC,UAAA,EAAM,cAAc,aAChB,EAAM,YAAY,EAAM,iBAAiB,IAC3C,EAAkB,IACf,EAAM,iBAAiB,QAAQ,CAAiB;AACrD;AAAA,QACF,MACE,SAAQ,KACN,yBAAyB,CAAA,YAAoB,CAAA,EAC/C;AAAA,MAEJ;AACA,MAAI,EAAM,gBAAgB,gBACxB,IAAmB,EAAW,cAAc,IAAmB,EAAM,gBAAgB,aAAa;AAAA,IAEtG;AACA,IAAI,EAAM,YAAY,EAAM,iBAAiB,IAAG,EAAkB,IAC7D,EAAM,iBAAiB,QAAQ,CAAiB;AAAA,EACvD;AACA,MAAI,CAAC,SAAS,OAAO,EAAE,SAAS,CAAO,GAAG;AACxC,UAAM,IAAkB;AACxB,IAAA,EAAgB,gBAAgB,EAAE,SAAS,WAAW,UACtD,EAAgB,sBAAsB,EAAE,aACxC,EAAgB,uBAAuB,EAAE,cACzC,EAAgB,gBAAgB,EAAE,OAClC,EAAgB,eAAe,EAAE,MACjC,EAAgB,iBAAiB,EAAE;AAAA,EACrC;AASA,MARK,MACC,EAAE,eACJ,EAAW,gBAAgB,EAAE,aAE3B,EAAE,cACJ,EAAW,eAAe,EAAE,aAG5B,GAAW;AACb,UAAM,EAAE,OAAA,GAAO,QAAA,EAAA,IAAW,EAAE,sBAAsB;AAClD,IAAA,IAAa;AAAA,MACX,OAAO,EAAW;AAAA,MAClB,UAAU,GAAG,CAAA;AAAA,MACb,WAAW,GAAG,CAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAI,MAAY,YAAY,CAAC,EAAgB,EAAW,GAAG,MACpD,EAAE,oBACL,EAAW,SAAS,EAAW,MAEjC,OAAO,EAAW;AAEpB,MAAI;AACJ,MAAI;AACF,IAAI,eAAe,IAAI,CAAO,MAAG,IAAkB;AAAA,EACrD,QAAY;AAAA,EACZ;AACA,SAAO;AAAA,IACL,MAAM,EAAS;AAAA,IACf,SAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAY,CAAC;AAAA,IACb,OAAO,GAAa,CAAC,KAAK;AAAA,IAC1B,WAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAU;AAAA,EACZ;AACF;AACA,SAAS,EAAc,GAAW;AAChC,SAA4B,KAAc,OACjC,KAEA,EAAU,YAAY;AAEjC;AACA,SAAS,GAAgB,GAAiB;AACxC,SAAI,MAAoB,MAAQ,MAAoB,QAC3C;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,IAGtB,oBAAoB,MAAoB;AAAA,IACxC,sBAAsB,MAAoB;AAAA,IAC1C,oBAAoB,MAAoB;AAAA,EAC1C,IACS,KAGJ,CAAC;AACV;AACA,SAAS,GAAgB,GAAI,GAAgB;AAC3C,MAAI,EAAe,WAAW,EAAG,SAAS,EAAS,QACjD,QAAO;AACF,MAAI,EAAG,SAAS,EAAS,SAAS;AACvC,QAAI,EAAe,WAClB,EAAG,YAAY,YAChB,EAAG,YAAY,WAAW,EAAG,WAAW,QAAQ,aAAa,EAAG,WAAW,OAAO,YAAY,EAAG,WAAW,QAAQ,oBACpH,EAAG,YAAY,UAAU,EAAG,WAAW,QAAQ,cAAc,OAAO,EAAG,WAAW,QAAS,YAAY,GAAqB,EAAG,WAAW,IAAI,MAAM,MAClJ,QAAO;AACF,QAAI,EAAe,gBAAgB,EAAG,YAAY,UAAU,EAAG,WAAW,QAAQ,mBAAmB,EAAG,YAAY,WAAW,EAAc,EAAG,WAAW,IAAI,EAAE,MACtK,mCACF,KAAK,EAAc,EAAG,WAAW,IAAI,MAAM,sBAAsB,EAAc,EAAG,WAAW,GAAG,MAAM,UAAU,EAAc,EAAG,WAAW,GAAG,MAAM,sBAAsB,EAAc,EAAG,WAAW,GAAG,MAAM,kBAC9M,QAAO;AACF,QAAI,EAAG,YAAY,QAAQ;AAChC,UAAI,EAAe,wBAAwB,EAAc,EAAG,WAAW,IAAI,EAAE,MAAM,wBAAwB,EACzG,QAAO;AACF,UAAI,EAAe,mBAAmB,EAAc,EAAG,WAAW,QAAQ,EAAE,MAAM,mBAAmB,KAC5G,EAAc,EAAG,WAAW,IAAI,EAAE,MAAM,gBAAgB,KAAK,EAAc,EAAG,WAAW,IAAI,MAAM,aACjG,QAAO;AACF,UAAI,EAAe,mBAAmB,EAAc,EAAG,WAAW,IAAI,MAAM,YAAY,EAAc,EAAG,WAAW,IAAI,MAAM,eAAe,EAAc,EAAG,WAAW,IAAI,MAAM,WACxL,QAAO;AACF,UAAI,EAAe,qBAAqB,EAAG,WAAW,YAAA,MAAkB,OAC7E,QAAO;AACF,UAAI,EAAe,uBAAuB,EAAc,EAAG,WAAW,IAAI,MAAM,YAAY,EAAc,EAAG,WAAW,IAAI,MAAM,eAAe,EAAc,EAAG,WAAW,IAAI,MAAM,eAAe,EAAc,EAAG,WAAW,IAAI,MAAM,eAAe,EAAc,EAAG,WAAW,IAAI,MAAM,YAAY,EAAc,EAAG,WAAW,QAAQ,EAAE,MAAM,WAAW,KAAK,EAAc,EAAG,WAAW,QAAQ,EAAE,MAAM,WAAW,GACra,QAAO;AACF,UAAI,EAAe,yBAAyB,EAAc,EAAG,WAAW,IAAI,MAAM,8BAA8B,EAAc,EAAG,WAAW,IAAI,MAAM,yBAAyB,EAAc,EAAG,WAAW,IAAI,MAAM,gBAAgB,EAAc,EAAG,WAAW,IAAI,MAAM,qBAAqB,EAAc,EAAG,WAAW,IAAI,MAAM,eAAe,EAAc,EAAG,WAAW,IAAI,MAAM,kBAAkB,EAAc,EAAG,WAAW,IAAI,MAAM,8BACxb,QAAO;AAAA,IAEX;AAAA,EACF;AACA,SAAO;AACT;AACA,SAAS,GAAoB,GAAG,GAAS;AACvC,QAAM,EACJ,KAAA,GACA,QAAQ,GACR,YAAA,GACA,eAAA,GACA,eAAA,GACA,kBAAA,GACA,WAAA,IAAY,IACZ,kBAAA,IAAmB,IACnB,kBAAA,IAAmB,CAAC,GACpB,YAAA,GACA,aAAA,GACA,gBAAA,GACA,gBAAA,IAAiB,CAAC,GAClB,cAAA,IAAe,IACf,cAAA,IAAe,IACf,aAAA,GACA,cAAA,GACA,mBAAA,IAAoB,KACpB,kBAAA,GACA,uBAAA,IAAwB,KACxB,iBAAA,IAAA,MAAwB,IACxB,mBAAA,IAAoB,IACpB,aAAA,IAAc,GAAA,IACZ;AACJ,MAAI,EAAE,WAAA,EAAA,IAAc,GAChB,EAAE,oBAAA,IAAqB,GAAA,IAAS;AACpC,EAAK,MAEH,IAAY,GACV,GACA,GACA,GAJqB,MAAc,MAMrC;AAEF,QAAM,IAAkB,GAAc,GAAG;AAAA,IACvC,KAAA;AAAA,IACA,QAAQ;AAAA,IACR,YAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,aAAA;AAAA,EACF,CAAC;AACD,MAAI,CAAC;AACH,mBAAQ,KAAK,GAAG,gBAAgB,GACzB;AAET,MAAI;AACJ,EAAI,EAAQ,QAAQ,CAAC,IACnB,IAAK,EAAQ,MAAM,CAAC,IACX,GAAgB,GAAiB,CAAc,KAAK,CAAC,KAAsB,EAAgB,SAAS,EAAS,QAAQ,CAAC,EAAgB,YAAY,QAAQ,eAAe,EAAE,EAAE,SACtL,IAAK,KAEL,IAAK,GAAM;AAEb,QAAM,IAAiB,OAAO,OAAO,GAAiB,EAAE,IAAA,EAAG,CAAC;AAE5D,MADA,EAAQ,IAAI,GAAG,CAAc,GACzB,MAAO,GACT,QAAO;AAET,EAAI,KACF,EAAY,CAAC;AAEf,MAAI,KAAc,CAAC;AACnB,MAAI,EAAe,SAAS,EAAS,SAAS;AAC5C,IAAA,KAAc,MAAe,CAAC,EAAe,WAC7C,OAAO,EAAe;AACtB,UAAM,IAAe,EAAM,WAAW,CAAC;AACvC,IAAI,KAAgB,GAAkB,CAAY,MAChD,EAAe,eAAe;AAAA,EAClC;AACA,OAAK,EAAe,SAAS,EAAS,YAAY,EAAe,SAAS,EAAS,YAAY,IAAa;AAC1G,IAAI,EAAe,kBAAkB,EAAe,SAAS,EAAS,WAAW,EAAe,YAAY,WAC1G,IAAqB;AAEvB,UAAM,IAAgB;AAAA,MACpB,KAAA;AAAA,MACA,QAAQ;AAAA,MACR,YAAA;AAAA,MACA,eAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA;AAAA,MACA,kBAAA;AAAA,MACA,WAAA;AAAA,MACA,kBAAA;AAAA,MACA,kBAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,gBAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,oBAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,mBAAA;AAAA,MACA,kBAAA;AAAA,MACA,uBAAA;AAAA,MACA,iBAAA;AAAA,MACA,aAAa;AAAA,IACf;AACA,QAAI,EAAA,EAAe,SAAS,EAAS,WAAW,EAAe,YAAY,cAAc,EAAe,WAAW,UAAU,SACxH;AACH,MAAI,EAAe,SAAS,EAAS,WAAW,EAAe,WAAW,aAAa,UAAU,OAAO,EAAe,WAAW,YAAa,aAC7I,EAAc,cAAc;AAE9B,iBAAW,KAAU,MAAM,KAAK,EAAM,WAAW,CAAC,CAAC,GAAG;AACpD,cAAM,IAAsB,GAAoB,GAAQ,CAAa;AACrE,QAAI,KACF,EAAe,WAAW,KAAK,CAAmB;AAAA,MAEtD;AAAA,IACF;AACA,QAAI,IAAe;AACnB,QAAI,GAAU,CAAC,MAAM,IAAe,EAAM,WAAW,CAAC,GACpD,YAAW,KAAU,MAAM,KAAK,EAAM,WAAW,CAAY,CAAC,GAAG;AAC/D,YAAM,IAAsB,GAAoB,GAAQ,CAAa;AACrE,MAAI,MACF,GAAkB,CAAY,MAAM,EAAoB,WAAW,KACnE,EAAe,WAAW,KAAK,CAAmB;AAAA,IAEtD;AAAA,EAEJ;AACA,QAAM,IAAS,EAAM,WAAW,CAAC;AACjC,SAAI,KAAU,GAAa,CAAM,KAAK,GAAkB,CAAM,MAC5D,EAAe,WAAW,KAExB,EAAe,SAAS,EAAS,WAAW,EAAe,YAAY,YACzE,GACE,GAAA,MACM;AACJ,UAAM,IAAY,EAAE;AACpB,QAAI,KAAa,GAAc;AAC7B,YAAM,IAAuB,GAAoB,GAAW;AAAA,QAC1D,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,YAAA;AAAA,QACA,eAAA;AAAA,QACA,WAAA;AAAA,QACA,eAAA;AAAA,QACA,kBAAA;AAAA,QACA,WAAW;AAAA,QACX,kBAAA;AAAA,QACA,kBAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA,gBAAA;AAAA,QACA,gBAAA;AAAA,QACA,cAAA;AAAA,QACA,cAAA;AAAA,QACA,oBAAA;AAAA,QACA,aAAA;AAAA,QACA,cAAA;AAAA,QACA,mBAAA;AAAA,QACA,kBAAA;AAAA,QACA,uBAAA;AAAA,QACA,iBAAA;AAAA,MACF,CAAC;AACD,MAAI,KACF,EACE,GACA,CACF;AAAA,IAEJ;AAAA,EACF,GACA,CACF,GAEE,EAAe,SAAS,EAAS,WAAW,EAAe,YAAY,UAAU,OAAO,EAAe,WAAW,OAAQ,aAAa,EAAe,WAAW,QAAQ,gBAAgB,EAAe,WAAW,QAAQ,aAAa,OAAO,EAAe,WAAW,QAAS,YAAY,GAAqB,EAAe,WAAW,IAAI,MAAM,UACzV,GACE,GAAA,MACM;AACJ,QAAI,GAAkB;AACpB,YAAM,IAAqB,GAAoB,GAAG;AAAA,QAChD,KAAA;AAAA,QACA,QAAQ;AAAA,QACR,YAAA;AAAA,QACA,eAAA;AAAA,QACA,WAAA;AAAA,QACA,eAAA;AAAA,QACA,kBAAA;AAAA,QACA,WAAW;AAAA,QACX,kBAAA;AAAA,QACA,kBAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA,gBAAA;AAAA,QACA,gBAAA;AAAA,QACA,cAAA;AAAA,QACA,cAAA;AAAA,QACA,oBAAA;AAAA,QACA,aAAA;AAAA,QACA,cAAA;AAAA,QACA,mBAAA;AAAA,QACA,kBAAA;AAAA,QACA,uBAAA;AAAA,QACA,iBAAA;AAAA,MACF,CAAC;AACD,MAAI,KACF,EACE,GACA,CACF;AAAA,IAEJ;AAAA,EACF,GACA,CACF,GAEK;AACT;AACA,SAAS,GAAS,GAAG,GAAS;AAC5B,QAAM,EACJ,QAAQ,IAAU,IAAI,GAAO,GAC7B,YAAA,IAAa,YACb,eAAA,IAAgB,MAChB,eAAA,IAAgB,WAChB,kBAAA,IAAmB,MACnB,kBAAA,IAAmB,IACnB,cAAA,IAAe,IACf,cAAA,IAAe,IACf,eAAA,IAAgB,IAChB,YAAA,GACA,aAAA,GACA,SAAA,IAAU,IACV,gBAAA,GACA,oBAAA,GACA,aAAA,GACA,cAAA,GACA,mBAAA,GACA,kBAAA,GACA,uBAAA,GACA,iBAAA,IAAA,MAAwB,GAAA,IACtB;AAsBJ,SAAO,GAAoB,GAAG;AAAA,IAC5B,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,YAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,WAAW;AAAA,IACX,kBAAA;AAAA,IACA,kBA9BuB,MAAkB,KAAO;AAAA,MAChD,OAAO;AAAA,MACP,MAAM;AAAA,MACN,kBAAkB;AAAA,MAClB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ,IAAI,MAAkB,KAAQ,EAC5B,UAAU,GACZ,IAAI;AAAA,IAYF,YAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAbqB,GAAgB,CAaxB;AAAA,IACb,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,oBAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,mBAAA;AAAA,IACA,kBAAA;AAAA,IACA,uBAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAmB;AAAA,EACrB,CAAC;AACH;AACA,IAAM,KAAN,MAAM,GAAW;AAAA,EAEf,eAAe,GAAO;AACpB,IAAA,EAAc,MAAM,iBAAiB,IAAI,GACzC,EAAc,MAAM,cAAc,IAAI,GACtC,EAAc,MAAM,eAAe,GACnC,EAAc,MAAM,cAAc,IAAI,GACtC,EAAc,MAAM,aAAa,IAAI,GACrC,EAAc,MAAM,mBAAmB,IAAI,GAC3C,EAAc,MAAM,eAAe,IAAI,GACvC,EAAc,MAAM,gBAAgB,CAAC,GACrC,EAAc,MAAM,aAAa,CAAC,GAElC,EAAc,MAAM,UAAU,GAC9B,EAAc,MAAM,UAAU,GAC9B,EAAc,MAAM,YAAY;AAAA,EAClC;AAAA,EACA,IAAI,aAAa;AACf,UAAM,IAAc,CAAC;AACrB,QAAI,IAAgB,KAAK;AACzB,WAAO;AACL,MAAA,EAAY,KAAK,CAAa,GAC9B,IAAgB,EAAc;AAEhC,WAAO;AAAA,EACT;AAAA,EACA,SAAS,GAAM;AACb,QAAM,aAAgB,IACjB;AAAA,UAAI,EAAK,kBAAkB,KAAK,cAAe,QAAO;AACtD,UAAI,MAAS,KAAM,QAAO;AAAA,UAFI,QAAO;AAG1C,WAAO,EAAK,cAAY;AACtB,UAAI,EAAK,eAAe,KAAM,QAAO;AACrC,MAAA,IAAO,EAAK;AAAA,IACd;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,GAAW;AACrB,UAAM,IAAI,MACR,6GACF;AAAA,EACF;AAAA,EAEA,aAAa,GAAW,GAAW;AACjC,UAAM,IAAI,MACR,8GACF;AAAA,EACF;AAAA,EAEA,YAAY,GAAO;AACjB,UAAM,IAAI,MACR,6GACF;AAAA,EACF;AAAA,EACA,WAAW;AACT,WAAO;AAAA,EACT;AACF;AACA,SAAS,EAAG,GAAM,GAAI,IAAS,UAAU;AACvC,QAAM,IAAU;AAAA,IAAE,SAAS;AAAA,IAAM,SAAS;AAAA,EAAK;AAC/C,SAAA,EAAO,iBAAiB,GAAM,GAAI,CAAO,GACzC,MAAa,EAAO,oBAAoB,GAAM,GAAI,CAAO;AAC3D;AACA,IAAM,KAAiC;AAAA;AAAA,+EACnC,KAAU;AAAA,EACZ,KAAK,CAAC;AAAA,EACN,QAAQ;AACN,mBAAQ,MAAM,EAA8B,GACrC;AAAA,EACT;AAAA,EACA,UAAU;AACR,mBAAQ,MAAM,EAA8B,GACrC;AAAA,EACT;AAAA,EACA,oBAAoB;AAClB,YAAQ,MAAM,EAA8B;AAAA,EAC9C;AAAA,EACA,MAAM;AACJ,mBAAQ,MAAM,EAA8B,GACrC;AAAA,EACT;AAAA,EACA,QAAQ;AACN,YAAQ,MAAM,EAA8B;AAAA,EAC9C;AACF;AACI,OAAO,UAAW,eAAe,OAAO,SAAS,OAAO,YAC1D,KAAU,IAAI,MAAM,IAAS,EAC3B,IAAI,GAAQ,GAAM,GAAU;AAC1B,SAAI,MAAS,SACX,QAAQ,MAAM,EAA8B,GAEvC,QAAQ,IAAI,GAAQ,GAAM,CAAQ;AAC3C,EACF,CAAC;AAEH,SAAS,GAAS,GAAM,GAAM,IAAU,CAAC,GAAG;AAC1C,MAAI,IAAU,MACV,IAAW;AACf,SAAO,YAAY,GAAM;AACvB,UAAM,IAAM,KAAK,IAAI;AACrB,IAAI,CAAC,KAAY,EAAQ,YAAY,OACnC,IAAW;AAEb,UAAM,IAAY,KAAQ,IAAM,IAC1B,IAAU;AAChB,IAAI,KAAa,KAAK,IAAY,KAC5B,MACF,aAAa,CAAO,GACpB,IAAU,OAEZ,IAAW,GACX,EAAK,MAAM,GAAS,CAAI,KACf,CAAC,KAAW,EAAQ,aAAa,OAC1C,IAAU,WAAA,MAAiB;AACzB,MAAA,IAAW,EAAQ,YAAY,KAAQ,IAAI,KAAK,IAAI,GACpD,IAAU,MACV,EAAK,MAAM,GAAS,CAAI;AAAA,IAC1B,GAAG,CAAS;AAAA,EAEhB;AACF;AACA,SAAS,GAAW,GAAQ,GAAK,GAAG,GAAW,IAAM,QAAQ;AAC3D,QAAM,IAAW,EAAI,OAAO,yBAAyB,GAAQ,CAAG;AAChE,SAAA,EAAI,OAAO,eACT,GACA,GACA,IAAY,IAAI,EACd,IAAI,GAAO;AACT,eAAA,MAAiB;AACf,MAAA,EAAE,IAAI,KAAK,MAAM,CAAK;AAAA,IACxB,GAAG,CAAC,GACA,KAAY,EAAS,OACvB,EAAS,IAAI,KAAK,MAAM,CAAK;AAAA,EAEjC,EACF,CACF,GACA,MAAa,GAAW,GAAQ,GAAK,KAAY,CAAC,GAAG,EAAI;AAC3D;AACA,SAAS,GAAgB,GAAK;AAC5B,MAAI,GAAK,GAAI,GAAI;AACjB,QAAM,IAAM,EAAI;AAChB,SAAO;AAAA,IACL,MAAM,EAAI,mBAAmB,EAAI,iBAAiB,aAAa,EAAI,gBAAgB,SAAS,EAAI,cAAc,EAAI,gBAAgB,eAAe,KAAO,OAAO,SAAS,EAAI,WAAW,IAAM,EAAM,cAAc,EAAI,IAAI,MAAM,OAAO,SAAS,EAAI,iBAAiB,IAAK,KAAO,OAAO,SAAS,EAAI,SAAS,OAAO,SAAS,EAAG,eAAe;AAAA,IAC/U,KAAK,EAAI,mBAAmB,EAAI,iBAAiB,YAAY,EAAI,gBAAgB,SAAS,EAAI,eAAe,KAAO,OAAO,SAAS,EAAI,gBAAgB,eAAe,KAAO,OAAO,SAAS,EAAI,WAAW,IAAK,EAAM,cAAc,EAAI,IAAI,MAAM,OAAO,SAAS,EAAG,gBAAgB,IAAK,KAAO,OAAO,SAAS,EAAI,SAAS,OAAO,SAAS,EAAG,cAAc;AAAA,EACnW;AACF;AACA,SAAS,KAAkB;AACzB,SAAO,OAAO,eAAe,SAAS,mBAAmB,SAAS,gBAAgB,gBAAgB,SAAS,QAAQ,SAAS,KAAK;AACnI;AACA,SAAS,KAAiB;AACxB,SAAO,OAAO,cAAc,SAAS,mBAAmB,SAAS,gBAAgB,eAAe,SAAS,QAAQ,SAAS,KAAK;AACjI;AACA,SAAS,GAAqB,GAAM;AAClC,SAAK,IAGM,EAAK,aAAa,EAAK,eAAe,IAAO,EAAM,cAAc,CAAI,IAFvE;AAIX;AACA,SAAS,EAAU,GAAM,GAAY,GAAe,GAAgB;AAClE,MAAI,CAAC,EACH,QAAO;AAET,QAAM,IAAK,GAAqB,CAAI;AACpC,MAAI,CAAC,EACH,QAAO;AAET,MAAI;AACF,QAAI,OAAO,KAAe;AAExB,UADI,EAAG,UAAU,SAAS,CAAU,KAChC,KAAkB,EAAG,QAAQ,MAAM,CAAU,MAAM,KAAM,QAAO;AAAA,eAEhE,GAAkB,GAAI,GAAY,CAAc,EAAG,QAAO;AAAA,EAElE,QAAY;AAAA,EACZ;AACA,SAAI,GAAA,MACE,EAAG,QAAQ,CAAa,KACxB,KAAkB,EAAG,QAAQ,CAAa,MAAM;AAGxD;AACA,SAAS,GAAa,GAAG,GAAS;AAChC,SAAO,EAAQ,MAAM,CAAC,MAAM;AAC9B;AACA,SAAS,GAAU,GAAG,GAAS,GAAgB;AAC7C,SAAI,EAAE,YAAY,WAAW,EAAe,qBACnC,KAEF,EAAQ,MAAM,CAAC,MAAM;AAC9B;AACA,SAAS,GAAkB,GAAQ,GAAS;AAC1C,MAAI,GAAa,CAAM,EACrB,QAAO;AAET,QAAM,IAAK,EAAQ,MAAM,CAAM;AAC/B,MAAI,CAAC,EAAQ,IAAI,CAAE,EACjB,QAAO;AAET,QAAM,IAAS,EAAM,WAAW,CAAM;AACtC,SAAI,KAAU,EAAO,aAAa,EAAO,gBAChC,KAEJ,IAGE,GAAkB,GAAQ,CAAO,IAF/B;AAGX;AACA,SAAS,GAAoB,GAAO;AAClC,SAAO,EAAQ,EAAM;AACvB;AACA,SAAS,GAAS,IAAM,QAAQ;AAC9B,EAAI,cAAc,KAAO,CAAC,EAAI,SAAS,UAAU,YAC/C,EAAI,SAAS,UAAU,UAAU,MAAM,UAAU,UAE/C,kBAAkB,KAAO,CAAC,EAAI,aAAa,UAAU,YACvD,EAAI,aAAa,UAAU,UAAU,MAAM,UAAU;AAEzD;AACA,SAAS,GAAmB,GAAG,GAAS;AACtC,SAAO,GAAQ,EAAE,aAAa,YAAY,EAAQ,QAAQ,CAAC;AAC7D;AACA,SAAS,GAAuB,GAAG,GAAS;AAC1C,SAAO,GACL,EAAE,aAAa,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,KAAK,MAAM,gBAAgB,EAAQ,QAAQ,CAAC;AAE3I;AACA,SAAS,GAAc,GAAG;AACxB,SAAK,IACD,aAAa,MAAc,gBAAgB,IACtC,EAAQ,EAAE,aAEZ,EAAQ,EAAM,WAAW,CAAC,IAJlB;AAKjB;AACA,IAAM,KAAN,MAAuB;AAAA,EACrB,cAAc;AACZ,IAAA,EAAc,MAAM,MAAM,CAAC,GAC3B,EAAc,MAAM,cAA8B,oBAAI,QAAQ,CAAC,GAC/D,EAAc,MAAM,cAA8B,oBAAI,IAAI,CAAC;AAAA,EAC7D;AAAA,EACA,MAAM,GAAY;;AAChB,YAAA,IAAO,KAAK,WAAW,IAAI,CAAU,OAAA,QAAA,MAAA,SAAA,IAAK;AAAA,EAC5C;AAAA,EACA,IAAI,GAAY;AACd,WAAO,KAAK,WAAW,IAAI,CAAU;AAAA,EACvC;AAAA,EAIA,IAAI,GAAY,GAAI;AAClB,QAAI,KAAK,IAAI,CAAU,EAAG,QAAO,KAAK,MAAM,CAAU;AACtD,QAAI;AACJ,WAAI,MAAO,SACT,IAAQ,KAAK,OACR,IAAQ,GACf,KAAK,WAAW,IAAI,GAAY,CAAK,GACrC,KAAK,WAAW,IAAI,GAAO,CAAU,GAC9B;AAAA,EACT;AAAA,EACA,SAAS,GAAI;AACX,WAAO,KAAK,WAAW,IAAI,CAAE,KAAK;AAAA,EACpC;AAAA,EACA,QAAQ;AACN,SAAK,aAA6B,oBAAI,QAAQ,GAC9C,KAAK,aAA6B,oBAAI,IAAI,GAC1C,KAAK,KAAK;AAAA,EACZ;AAAA,EACA,aAAa;AACX,WAAO,KAAK;AAAA,EACd;AACF;AACA,SAAS,GAAc,GAAG;AACxB,MAAI;AACJ,MAAI,IAAa;AACjB,SAAI,iBAAiB,OAAO,IAAM,EAAM,YAAY,CAAC,MAAM,OAAO,SAAS,EAAI,cAAc,KAAK,0BAA0B,EAAM,KAAK,EAAM,YAAY,CAAC,CAAC,MACzJ,IAAa,EAAM,KAAK,EAAM,YAAY,CAAC,CAAC,IACvC;AACT;AACA,SAAS,GAAkB,GAAG;AAC5B,MAAI,IAAiB,GACjB;AACJ,SAAO,IAAa,GAAc,CAAc,IAC9C,CAAA,IAAiB;AACnB,SAAO;AACT;AACA,SAAS,GAAgB,GAAG;AAC1B,QAAM,IAAM,EAAM,cAAc,CAAC;AACjC,MAAI,CAAC,EAAK,QAAO;AACjB,QAAM,IAAa,GAAkB,CAAC;AACtC,SAAO,EAAM,SAAS,GAAK,CAAU;AACvC;AACA,SAAS,GAAM,GAAG;AAChB,QAAM,IAAM,EAAM,cAAc,CAAC;AACjC,SAAK,IACE,EAAM,SAAS,GAAK,CAAC,KAAK,GAAgB,CAAC,IADjC;AAEnB;AACA,SAAS,GAAmB,GAAG;AAC7B,SAAO,UAAU;AACnB;AACA,IAAM,KAAN,MAAuB;AAAA,EACrB,cAAc;AACZ,IAAA,EAAc,MAAM,UAAU,CAAC,GAC/B,EAAc,MAAM,QAAQ,IAAI,GAChC,EAAc,MAAM,QAAQ,IAAI;AAAA,EAClC;AAAA,EACA,IAAI,GAAU;AACZ,QAAI,KAAY,KAAK,OACnB,OAAM,IAAI,MAAM,gCAAgC;AAElD,QAAI,IAAU,KAAK;AACnB,aAAS,IAAS,GAAG,IAAS,GAAU,IACtC,CAAA,KAAW,KAAW,OAAO,SAAS,EAAQ,SAAS;AAEzD,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,GAAG;AACT,UAAM,IAAO;AAAA,MACX,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MAAM;AAAA,IACR;AAEA,QADA,EAAE,OAAO,GACL,EAAE,mBAAmB,GAAmB,EAAE,eAAe,GAAG;AAC9D,YAAM,IAAU,EAAE,gBAAgB,KAAK;AACvC,MAAA,EAAK,OAAO,GACZ,EAAK,WAAW,EAAE,gBAAgB,MAClC,EAAE,gBAAgB,KAAK,OAAO,GAC1B,MACF,EAAQ,WAAW;AAAA,IAEvB,WAAW,EAAE,eAAe,GAAmB,EAAE,WAAW,KAAK,EAAE,YAAY,KAAK,UAAU;AAC5F,YAAM,IAAU,EAAE,YAAY,KAAK;AACnC,MAAA,EAAK,WAAW,GAChB,EAAK,OAAO,EAAE,YAAY,MAC1B,EAAE,YAAY,KAAK,WAAW,GAC1B,MACF,EAAQ,OAAO;AAAA,IAEnB;AACE,MAAI,KAAK,SACP,KAAK,KAAK,WAAW,IAEvB,EAAK,OAAO,KAAK,MACjB,KAAK,OAAO;AAEd,IAAI,EAAK,SAAS,SAChB,KAAK,OAAO,IAEd,KAAK;AAAA,EACP;AAAA,EACA,WAAW,GAAG;AACZ,UAAM,IAAU,EAAE;AAClB,IAAK,KAAK,SAGL,EAAQ,YAQX,EAAQ,SAAS,OAAO,EAAQ,MAC5B,EAAQ,OACV,EAAQ,KAAK,WAAW,EAAQ,WAEhC,KAAK,OAAO,EAAQ,aAXtB,KAAK,OAAO,EAAQ,MAChB,KAAK,OACP,KAAK,KAAK,WAAW,OAErB,KAAK,OAAO,OAUZ,EAAE,QACJ,OAAO,EAAE,MAEX,KAAK;AAAA,EACP;AACF,GACM,KAAA,CAAW,GAAI,MAAa,GAAG,CAAA,IAAM,CAAA,IACrC,KAAN,MAAqB;AAAA,EACnB,cAAc;AACZ,IAAA,EAAc,MAAM,UAAU,EAAK,GACnC,EAAc,MAAM,UAAU,EAAK,GACnC,EAAc,MAAM,SAAS,CAAC,CAAC,GAC/B,EAAc,MAAM,cAAc,CAAC,CAAC,GACpC,EAAc,MAAM,gBAAgC,oBAAI,QAAQ,CAAC,GACjE,EAAc,MAAM,WAAW,CAAC,CAAC,GACjC,EAAc,MAAM,cAAc,CAAC,CAAC,GACpC,EAAc,MAAM,YAAY,CAAC,CAAC,GAkBlC,EAAc,MAAM,YAA4B,oBAAI,IAAI,CAAC,GACzD,EAAc,MAAM,YAA4B,oBAAI,IAAI,CAAC,GACzD,EAAc,MAAM,cAA8B,oBAAI,IAAI,CAAC,GAC3D,EAAc,MAAM,uBAAuC,oBAAI,IAAI,CAAC,GACpE,EAAc,MAAM,YAAY,GAChC,EAAc,MAAM,YAAY,GAChC,EAAc,MAAM,eAAe,GACnC,EAAc,MAAM,eAAe,GACnC,EAAc,MAAM,kBAAkB,GACtC,EAAc,MAAM,kBAAkB,GACtC,EAAc,MAAM,kBAAkB,GACtC,EAAc,MAAM,YAAY,GAChC,EAAc,MAAM,aAAa,GACjC,EAAc,MAAM,iBAAiB,GACrC,EAAc,MAAM,cAAc,GAClC,EAAc,MAAM,cAAc,GAClC,EAAc,MAAM,gBAAgB,GACpC,EAAc,MAAM,gBAAgB,GACpC,EAAc,MAAM,KAAK,GACzB,EAAc,MAAM,QAAQ,GAC5B,EAAc,MAAM,eAAe,GACnC,EAAc,MAAM,mBAAmB,GACvC,EAAc,MAAM,kBAAkB,GACtC,EAAc,MAAM,eAAe,GACnC,EAAc,MAAM,sBAAsB,GAC1C,EAAc,MAAM,eAAe,GACnC,EAAc,MAAM,oBAAA,CAAqB,MAAc;AACrD,MAAA,EAAU,QAAQ,KAAK,eAAe,GACtC,KAAK,KAAK;AAAA,IACZ,CAAC,GACD,EAAc,MAAM,QAAA,MAAc;AAChC,UAAI,KAAK,UAAU,KAAK,OACtB;AAEF,YAAM,IAAO,CAAC,GACR,IAA2B,oBAAI,IAAI,GACnC,IAAU,IAAI,GAAiB,GAC/B,IAAA,CAAa,MAAM;AACvB,YAAI,IAAK,GACL,IAAS;AACb,eAAO,MAAW;AAChB,UAAA,IAAK,KAAM,EAAG,aACd,IAAS,KAAM,KAAK,OAAO,MAAM,CAAE;AAErC,eAAO;AAAA,MACT,GACM,IAAA,CAAW,MAAM;AACrB,cAAM,IAAS,EAAM,WAAW,CAAC;AACjC,YAAI,CAAC,KAAU,CAAC,GAAM,CAAC,EACrB;AAEF,YAAI,IAAc;AAClB,YAAI,EAAE,aAAa,KAAK,WAAW;AACjC,gBAAM,IAAY,EAAO;AACzB,cAAI,MAAc,WAChB;AACK,UAAI,MAAc,WAAW,KAAK,SAAS,IAAI,CAAM,MAC1D,IAAc;AAAA,QAElB;AACA,cAAM,IAAW,GAAa,CAAM,IAAI,KAAK,OAAO,MAAM,GAAc,CAAC,CAAC,IAAI,KAAK,OAAO,MAAM,CAAM,GAChG,IAAS,EAAU,CAAC;AAC1B,YAAI,MAAa,MAAM,MAAW,GAChC,QAAO,EAAQ,QAAQ,CAAC;AAE1B,cAAM,IAAK,GAAoB,GAAG;AAAA,UAChC,KAAK,KAAK;AAAA,UACV,QAAQ,KAAK;AAAA,UACb,YAAY,KAAK;AAAA,UACjB,eAAe,KAAK;AAAA,UACpB,eAAe,KAAK;AAAA,UACpB,kBAAkB,KAAK;AAAA,UACvB,WAAW;AAAA,UACX,mBAAmB;AAAA,UACnB,kBAAkB,KAAK;AAAA,UACvB,kBAAkB,KAAK;AAAA,UACvB,YAAY,KAAK;AAAA,UACjB,aAAa,KAAK;AAAA,UAClB,gBAAgB,KAAK;AAAA,UACrB,gBAAgB,KAAK;AAAA,UACrB,cAAc,KAAK;AAAA,UACnB,cAAc,KAAK;AAAA,UACnB,aAAA,CAAc,MAAa;AACzB,YAAI,GAAmB,GAAU,KAAK,MAAM,KAC1C,KAAK,cAAc,UAAU,CAAQ,GAEnC,GAAuB,GAAU,KAAK,MAAM,KAC9C,KAAK,kBAAkB,iBACrB,CACF,GAEE,GAAc,CAAC,KACjB,KAAK,iBAAiB,cAAc,EAAM,WAAW,CAAC,GAAG,KAAK,GAAG;AAAA,UAErE;AAAA,UACA,cAAA,CAAe,GAAQ,MAAY;AACjC,iBAAK,cAAc,aAAa,GAAQ,CAAO,GAC/C,KAAK,iBAAiB,oBAAoB,CAAM;AAAA,UAClD;AAAA,UACA,kBAAA,CAAmB,GAAM,MAAY;AACnC,iBAAK,kBAAkB,kBAAkB,GAAM,CAAO;AAAA,UACxD;AAAA,UACA,aAAA;AAAA,QACF,CAAC;AACD,QAAI,MACF,EAAK,KAAK;AAAA,UACR,UAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAM;AAAA,QACR,CAAC,GACD,EAAS,IAAI,EAAG,EAAE;AAAA,MAEtB;AACA,aAAO,KAAK,WAAW,SACrB,MAAK,OAAO,kBAAkB,KAAK,WAAW,MAAM,CAAC;AAEvD,iBAAW,KAAK,KAAK;AACnB,QAAI,GAAgB,KAAK,qBAAqB,GAAG,KAAK,MAAM,KAAK,CAAC,KAAK,SAAS,IAAI,EAAM,WAAW,CAAC,CAAC,KAGvG,EAAQ,CAAC;AAEX,iBAAW,KAAK,KAAK,SACnB,CAAI,CAAC,GAAgB,KAAK,YAAY,CAAC,KAAK,CAAC,GAAgB,KAAK,qBAAqB,GAAG,KAAK,MAAM,KAE1F,GAAgB,KAAK,UAAU,CAAC,IADzC,EAAQ,CAAC,IAIT,KAAK,WAAW,IAAI,CAAC;AAGzB,UAAI,IAAY;AAChB,aAAO,EAAQ,UAAQ;AACrB,YAAI,IAAO;AACX,YAAI,GAAW;AACb,gBAAM,IAAW,KAAK,OAAO,MAAM,EAAM,WAAW,EAAU,KAAK,CAAC,GAC9D,IAAS,EAAU,EAAU,KAAK;AACxC,UAAI,MAAa,MAAM,MAAW,OAChC,IAAO;AAAA,QAEX;AACA,YAAI,CAAC,GAAM;AACT,cAAI,IAAW,EAAQ;AACvB,iBAAO,KAAU;AACf,kBAAM,IAAQ;AAEd,gBADA,IAAW,EAAS,UAChB,GAAO;AACT,oBAAM,IAAW,KAAK,OAAO,MAAM,EAAM,WAAW,EAAM,KAAK,CAAC;AAEhE,kBADe,EAAU,EAAM,KACtB,MAAM,GAAI;AACd,kBAAI,MAAa,IAAI;AACxB,gBAAA,IAAO;AACP;AAAA,cACF,OAAO;AACL,sBAAM,IAAgB,EAAM,OACtB,IAAS,EAAM,WAAW,CAAa;AAC7C,oBAAI,KAAU,EAAO,aAAa,KAAK,wBAAwB;AAC7D,wBAAM,IAAa,EAAM,KAAK,CAAM;AAEpC,sBADkB,KAAK,OAAO,MAAM,CACxB,MAAM,IAAI;AACpB,oBAAA,IAAO;AACP;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,YAAI,CAAC,GAAM;AACT,iBAAO,EAAQ,OACb,CAAA,EAAQ,WAAW,EAAQ,KAAK,KAAK;AAEvC;AAAA,QACF;AACA,QAAA,IAAY,EAAK,UACjB,EAAQ,WAAW,EAAK,KAAK,GAC7B,EAAQ,EAAK,KAAK;AAAA,MACpB;AACA,YAAM,IAAU;AAAA,QACd,OAAO,KAAK,MAAM,IAAA,CAAK,MAAS;AAC9B,gBAAM,IAAI,EAAK,MACT,IAAS,EAAM,WAAW,CAAC;AACjC,iBAAI,KAAU,EAAO,YAAY,cAC/B,KAAK,yBAAyB,CAAM,GAE/B;AAAA,YACL,IAAI,KAAK,OAAO,MAAM,CAAC;AAAA,YACvB,OAAO,EAAK;AAAA,UACd;AAAA,QACF,CAAC,EAAE,OAAA,CAAQ,MAAS,CAAC,EAAS,IAAI,EAAK,EAAE,CAAC,EAAE,OAAA,CAAQ,MAAS,KAAK,OAAO,IAAI,EAAK,EAAE,CAAC;AAAA,QACrF,YAAY,KAAK,WAAW,IAAA,CAAK,MAAc;AAC7C,gBAAM,EAAE,YAAA,EAAA,IAAe;AACvB,cAAI,OAAO,EAAW,SAAU,UAAU;AACxC,kBAAM,IAAY,KAAK,UAAU,EAAU,SAAS,GAC9C,IAAiB,KAAK,UAAU,EAAU,gBAAgB;AAChE,YAAI,EAAU,SAAS,EAAW,MAAM,WACjC,IAAY,GAAgB,MAAM,MAAM,EAAE,WAAW,EAAW,MAAM,MAAM,MAAM,EAAE,WACvF,EAAW,QAAQ,EAAU;AAAA,UAGnC;AACA,iBAAO;AAAA,YACL,IAAI,KAAK,OAAO,MAAM,EAAU,IAAI;AAAA,YACpC,YAAA;AAAA,UACF;AAAA,QACF,CAAC,EAAE,OAAA,CAAQ,MAAc,CAAC,EAAS,IAAI,EAAU,EAAE,CAAC,EAAE,OAAA,CAAQ,MAAc,KAAK,OAAO,IAAI,EAAU,EAAE,CAAC;AAAA,QACzG,SAAS,KAAK;AAAA,QACd,MAAA;AAAA,MACF;AACA,MAAI,CAAC,EAAQ,MAAM,UAAU,CAAC,EAAQ,WAAW,UAAU,CAAC,EAAQ,QAAQ,UAAU,CAAC,EAAQ,KAAK,WAGpG,KAAK,QAAQ,CAAC,GACd,KAAK,aAAa,CAAC,GACnB,KAAK,eAA+B,oBAAI,QAAQ,GAChD,KAAK,UAAU,CAAC,GAChB,KAAK,WAA2B,oBAAI,IAAI,GACxC,KAAK,WAA2B,oBAAI,IAAI,GACxC,KAAK,aAA6B,oBAAI,IAAI,GAC1C,KAAK,sBAAsC,oBAAI,IAAI,GACnD,KAAK,WAAW,CAAC,GACjB,KAAK,WAAW,CAAO;AAAA,IACzB,CAAC,GACD,EAAc,MAAM,4BAAA,CAA6B,MAAa;AAC5D,UAAI,IAAO,KAAK,aAAa,IAAI,CAAQ;AACzC,MAAK,MACH,IAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY,CAAC;AAAA,QACb,WAAW,CAAC;AAAA,QACZ,kBAAkB,CAAC;AAAA,MACrB,GACA,KAAK,WAAW,KAAK,CAAI,GACzB,KAAK,aAAa,IAAI,GAAU,CAAI;AAEtC,YAAM,IAAQ,MAAM,KAClB,EAAM,WAAW,CAAQ,GAAA,CACxB,MAAO,EAAM,YAAY,CAAE,KAAK,EACnC,EAAE,KAAK,EAAE;AACT,MAAA,EAAK,WAAW,QAAQ,GAAe;AAAA,QACrC,SAAS;AAAA,QACT,kBAAkB,KAAK;AAAA,QACvB,SAAS,EAAS;AAAA,QAClB,MAAM,GAAa,CAAQ;AAAA,QAC3B,OAAA;AAAA,QACA,aAAa,KAAK;AAAA,MACpB,CAAC;AAAA,IACH,CAAC,GACD,EAAc,MAAM,mBAAA,CAAoB,MAAM;AAC5C,UAAI,CAAA,GAAU,EAAE,QAAQ,KAAK,QAAQ,KAAK,cAAc;AAGxD,gBAAQ,EAAE,MAAV;AAAA,UACE,KAAK,iBAAiB;AACpB,kBAAM,IAAQ,EAAM,YAAY,EAAE,MAAM;AACxC,YAAI,CAAC,EAAU,EAAE,QAAQ,KAAK,YAAY,KAAK,eAAe,EAAK,KAAK,MAAU,EAAE,YAClF,KAAK,MAAM,KAAK;AAAA,cACd,OAAO,GACL,EAAE,QACF,KAAK,eACL,KAAK,kBACL,EAEF,KAAK,IAAQ,KAAK,aAAa,KAAK,WAAW,GAAO,GAAqB,EAAE,MAAM,CAAC,IAAI,EAAM,QAAQ,SAAS,GAAG,IAAI;AAAA,cACtH,MAAM,EAAE;AAAA,YACV,CAAC;AAEH;AAAA,UACF;AAAA,UACA,KAAK,cAAc;AACjB,kBAAM,IAAS,EAAE;AACjB,gBAAI,IAAgB,EAAE,eAClB,IAAQ,EAAE,OAAO,aAAa,CAAa;AAC/C,gBAAI,MAAkB,SAAS;AAC7B,oBAAM,IAAO,GAAa,CAAM;AAChC,cAAA,IAAQ,GAAe;AAAA,gBACrB,SAAS;AAAA,gBACT,kBAAkB,KAAK;AAAA,gBACvB,SAAS,EAAO;AAAA,gBAChB,MAAA;AAAA,gBACA,OAAA;AAAA,gBACA,aAAa,KAAK;AAAA,cACpB,CAAC;AAAA,YACH;AACA,gBAAI,EAAU,EAAE,QAAQ,KAAK,YAAY,KAAK,eAAe,EAAK,KAAK,MAAU,EAAE,SACjF;AAEF,gBAAI,IAAO,KAAK,aAAa,IAAI,EAAE,MAAM;AACzC,gBAAI,EAAO,YAAY,YAAY,MAAkB,SAAS,CAAC,KAAK,gBAAgB,CAAK;AACvF,kBAAI,CAAC,EAAO,gBACV,CAAA,IAAgB;AAAA,kBAEhB;AAgBJ,gBAbK,MACH,IAAO;AAAA,cACL,MAAM,EAAE;AAAA,cACR,YAAY,CAAC;AAAA,cACb,WAAW,CAAC;AAAA,cACZ,kBAAkB,CAAC;AAAA,YACrB,GACA,KAAK,WAAW,KAAK,CAAI,GACzB,KAAK,aAAa,IAAI,EAAE,QAAQ,CAAI,IAElC,MAAkB,UAAU,EAAO,YAAY,YAAY,EAAE,YAAY,IAAI,YAAY,MAAM,cACjG,EAAO,aAAa,uBAAuB,MAAM,GAE/C,CAAC,GAAgB,EAAO,SAAS,CAAa;AAOhD,kBANA,EAAK,WAAW,CAAA,IAAiB,GAC/B,KAAK,KACL,GAAY,EAAO,OAAO,GAC1B,GAAY,CAAa,GACzB,CACF,GACI,MAAkB,SAAS;AAC7B,oBAAI,CAAC,KAAK,cACR,KAAI;AACF,uBAAK,gBAAgB,SAAS,eAAe,mBAAmB;AAAA,gBAClE,QAAY;AACV,uBAAK,gBAAgB,KAAK;AAAA,gBAC5B;AAEF,sBAAM,IAAM,KAAK,cAAc,cAAc,MAAM;AACnD,gBAAI,EAAE,YACJ,EAAI,aAAa,SAAS,EAAE,QAAQ;AAEtC,2BAAW,KAAS,MAAM,KAAK,EAAO,KAAK,GAAG;AAC5C,wBAAM,IAAW,EAAO,MAAM,iBAAiB,CAAK,GAC9C,IAAc,EAAO,MAAM,oBAAoB,CAAK;AAC1D,kBAAI,MAAa,EAAI,MAAM,iBAAiB,CAAK,KAAK,MAAgB,EAAI,MAAM,oBAAoB,CAAK,IACnG,MAAgB,KAClB,EAAK,UAAU,CAAA,IAAS,IAExB,EAAK,UAAU,CAAA,IAAS,CAAC,GAAU,CAAW,IAGhD,EAAK,iBAAiB,CAAA,IAAS,CAAC,GAAU,CAAW;AAAA,gBAEzD;AACA,2BAAW,KAAS,MAAM,KAAK,EAAI,KAAK,EACtC,CAAI,EAAO,MAAM,iBAAiB,CAAK,MAAM,OAC3C,EAAK,UAAU,CAAA,IAAS;AAAA,cAG9B,MAAO,CAAI,MAAkB,UAAU,EAAO,YAAY,aACpD,EAAO,QAAQ,cAAc,IAC/B,EAAK,WAAW,eAAkB,UAElC,EAAK,WAAW,eAAkB;AAIxC;AAAA,UACF;AAAA,UACA,KAAK;AACH,gBAAI,EAAU,EAAE,QAAQ,KAAK,YAAY,KAAK,eAAe,EAAI,EAC/D;AACF,gBAAI,EAAE,OAAO,YAAY,YAAY;AACnC,mBAAK,yBAAyB,EAAE,MAAM;AACtC;AAAA,YACF;AACA,YAAA,EAAE,WAAW,QAAA,CAAS,MAAM,KAAK,QAAQ,GAAG,EAAE,MAAM,CAAC,GACrD,EAAE,aAAa,QAAA,CAAS,MAAM;AAC5B,oBAAM,IAAS,KAAK,OAAO,MAAM,CAAC,GAC5B,IAAW,GAAa,EAAE,MAAM,IAAI,KAAK,OAAO,MAAM,EAAM,KAAK,EAAE,MAAM,CAAC,IAAI,KAAK,OAAO,MAAM,EAAE,MAAM;AAC9G,cAAI,EAAU,EAAE,QAAQ,KAAK,YAAY,KAAK,eAAe,EAAK,KAAK,GAAU,GAAG,KAAK,QAAQ,KAAK,cAAc,KAAK,CAAC,GAAa,GAAG,KAAK,MAAM,MAGjJ,KAAK,SAAS,IAAI,CAAC,KACrB,GAAW,KAAK,UAAU,CAAC,GAC3B,KAAK,WAAW,IAAI,CAAC,KACZ,KAAK,SAAS,IAAI,EAAE,MAAM,KAAK,MAAW,MAC5C,GAAkB,EAAE,QAAQ,KAAK,MAAM,MACvC,KAAK,SAAS,IAAI,CAAC,KAAK,KAAK,SAAS,GAAQ,GAAQ,CAAQ,CAAA,IACrE,GAAW,KAAK,UAAU,CAAC,KAE3B,KAAK,QAAQ,KAAK;AAAA,gBAChB,UAAA;AAAA,gBACA,IAAI;AAAA,gBACJ,UAAU,GAAa,EAAE,MAAM,KAAK,GAAkB,EAAE,MAAM,IAAI,KAAO;AAAA,cAC3E,CAAC,GACD,GAAe,GAAG,KAAK,mBAAmB,KAE5C,KAAK,WAAW,KAAK,CAAC;AAAA,YACxB,CAAC;AAAA,QAGL;AAAA,IACF,CAAC,GAID,EAAc,MAAM,WAAA,CAAY,GAAG,MAAW;AAC5C,UAAI,MAAK,qBAAqB,cAAc,GAAG,IAAI,KAC/C,OAAK,SAAS,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,IAC/C;AAAA,YAAI,KAAK,OAAO,QAAQ,CAAC,GAAG;AAC1B,cAAI,GAAU,GAAG,KAAK,QAAQ,KAAK,cAAc,EAC/C;AAEF,eAAK,SAAS,IAAI,CAAC;AACnB,cAAI,IAAW;AACf,UAAI,KAAU,KAAK,OAAO,QAAQ,CAAM,MACtC,IAAW,KAAK,OAAO,MAAM,CAAM,IAEjC,KAAY,MAAa,OAC3B,KAAK,SAAS,GAAQ,KAAK,OAAO,MAAM,CAAC,GAAG,CAAQ,CAAA,IAAK;AAAA,QAE7D;AACE,eAAK,SAAS,IAAI,CAAC,GACnB,KAAK,WAAW,OAAO,CAAC;AAE1B,QAAK,EAAU,GAAG,KAAK,YAAY,KAAK,eAAe,EAAK,MAC1D,EAAM,WAAW,CAAC,EAAE,QAAA,CAAS,MAAW,KAAK,QAAQ,CAAM,CAAC,GACxD,GAAc,CAAC,KACjB,EAAM,WAAW,EAAM,WAAW,CAAC,CAAC,EAAE,QAAA,CAAS,MAAW;AACxD,eAAK,qBAAqB,IAAI,GAAQ,IAAI,GAC1C,KAAK,QAAQ,GAAQ,CAAC;AAAA,QACxB,CAAC;AAAA;AAAA,IAGP,CAAC;AAAA,EACH;AAAA,EACA,KAAK,GAAS;AACZ;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,QAAA,CAAS,MAAQ;AACjB,WAAK,CAAA,IAAO,EAAQ,CAAA;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EACA,SAAS;AACP,SAAK,SAAS,IACd,KAAK,cAAc,OAAO;AAAA,EAC5B;AAAA,EACA,WAAW;AACT,SAAK,SAAS,IACd,KAAK,cAAc,SAAS,GAC5B,KAAK,KAAK;AAAA,EACZ;AAAA,EACA,WAAW;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EACA,OAAO;AACL,SAAK,SAAS,IACd,KAAK,cAAc,KAAK;AAAA,EAC1B;AAAA,EACA,SAAS;AACP,SAAK,SAAS,IACd,KAAK,cAAc,OAAO,GAC1B,KAAK,KAAK;AAAA,EACZ;AAAA,EACA,QAAQ;AACN,SAAK,iBAAiB,MAAM,GAC5B,KAAK,cAAc,MAAM;AAAA,EAC3B;AACF;AACA,SAAS,GAAW,GAAS,GAAG;AAC9B,EAAA,EAAQ,OAAO,CAAC,GAChB,EAAM,WAAW,CAAC,EAAE,QAAA,CAAS,MAAW,GAAW,GAAS,CAAM,CAAC;AACrE;AACA,SAAS,GAAe,GAAG,GAAO;AAChC,QAAM,IAAQ,CAAC,CAAC;AAChB,SAAO,EAAM,UAAQ;AACnB,UAAM,IAAO,EAAM,IAAI;AACvB,IAAI,EAAM,IAAI,CAAI,MAClB,EAAM,IAAI,CAAI,GACd,EAAM,WAAW,CAAI,EAAE,QAAA,CAAS,MAAO,EAAM,KAAK,CAAE,CAAC;AAAA,EACvD;AAEF;AACA,SAAS,GAAgB,GAAS,GAAG,GAAS;AAC5C,SAAI,EAAQ,SAAS,IAAU,KACxB,GAAiB,GAAS,CAAC;AACpC;AACA,SAAS,GAAiB,GAAS,GAAG,GAAU;AAC9C,QAAM,IAAO,EAAM,WAAW,CAAC;AAC/B,SAAK,IACE,EAAQ,IAAI,CAAI,IADL;AAEpB;AACA,SAAS,GAAgB,GAAK,GAAG;AAC/B,SAAI,EAAI,SAAS,IAAU,KACpB,GAAiB,GAAK,CAAC;AAChC;AACA,SAAS,GAAiB,GAAK,GAAG;AAChC,QAAM,IAAS,EAAM,WAAW,CAAC;AACjC,SAAK,IAGD,EAAI,IAAI,CAAM,IACT,KAEF,GAAiB,GAAK,CAAM,IAL1B;AAMX;AACA,IAAI;AACJ,SAAS,GAAqB,GAAS;AACrC,EAAA,KAAe;AACjB;AACA,SAAS,KAAyB;AAChC,EAAA,KAAe;AACjB;AACA,IAAM,IAAA,CAAmB,MAClB,KAGC,IAAmB,MAAS;AAChC,MAAI;AACF,WAAO,EAAG,GAAG,CAAI;AAAA,EACnB,SAAS,GAAO;AACd,QAAI,MAAgB,GAAa,CAAK,MAAM,GAC1C;AAEF,UAAM;AAAA,EACR;AACF,IAXS,GAcL,KAAkB,CAAC;AACzB,SAAS,GAAe,GAAO;AAC7B,MAAI;AACF,QAAI,kBAAkB,GAAO;AAC3B,YAAM,IAAO,EAAM,aAAa;AAChC,UAAI,EAAK,OACP,QAAO,EAAK,CAAA;AAAA,IAEhB,WAAW,UAAU,KAAS,EAAM,KAAK,OACvC,QAAO,EAAM,KAAK,CAAA;AAAA,EAEtB,QAAQ;AAAA,EACR;AACA,SAAO,KAAS,EAAM;AACxB;AACA,SAAS,GAAqB,GAAS,GAAQ;AAC7C,QAAM,IAAiB,IAAI,GAAe;AAC1C,EAAA,GAAgB,KAAK,CAAc,GACnC,EAAe,KAAK,CAAO;AAC3B,QAAM,CAAC,GAAc,CAAA,IAAiB,GAAqB,GACrD,IAAW,IAAI,EACnB,EAAgB,EAAe,iBAAiB,KAAK,CAAc,CAAC,CACtE;AACA,SAAA,EAAS,QAAQ,GAAQ;AAAA,IACvB,YAAY;AAAA,IACZ,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,uBAAuB;AAAA,IACvB,WAAW;AAAA,IACX,SAAS;AAAA,EACX,CAAC,GACM,CAAC,GAAU,CAAa;AACjC;AACA,SAAS,GAAiB,EACxB,aAAA,GACA,UAAA,GACA,KAAA,GACA,QAAQ,EAAA,GACP;AACD,MAAI,EAAS,cAAc,GACzB,QAAA,MAAa;AAAA,EACb;AAEF,QAAM,IAAY,OAAO,EAAS,aAAc,WAAW,EAAS,YAAY,IAC1E,IAAoB,OAAO,EAAS,qBAAsB,WAAW,EAAS,oBAAoB;AACxG,MAAI,IAAY,CAAC,GACb;AACJ,QAAM,IAAY,GAChB,EAAA,CACG,MAAW;AACV,UAAM,IAAc,KAAK,IAAI,IAAI;AACjC,IAAA,EACE,EAAU,IAAA,CAAK,OACb,EAAE,cAAc,GACT,EACR,GACD,CACF,GACA,IAAY,CAAC,GACb,IAAe;AAAA,EACjB,CACF,GACA,CACF,GACM,IAAiB,EACrB,GACE,EAAA,CAAiB,MAAQ;AACvB,UAAM,IAAS,GAAe,CAAG,GAC3B,EAAE,SAAA,GAAS,SAAA,EAAA,IAAY,GAAoB,CAAG,IAAI,EAAI,eAAe,CAAA,IAAK;AAChF,IAAK,MACH,IAAe,GAAa,IAE9B,EAAU,KAAK;AAAA,MACb,GAAG;AAAA,MACH,GAAG;AAAA,MACH,IAAI,EAAQ,MAAM,CAAM;AAAA,MACxB,YAAY,GAAa,IAAI;AAAA,IAC/B,CAAC,GACD,EACE,OAAO,aAAc,eAAe,aAAe,YAAY,EAAkB,OAAO,aAAe,aAAa,EAAkB,YAAY,EAAkB,SACtK;AAAA,EACF,CAAC,GACD,GACA,EACE,UAAU,GACZ,CACF,CACF,GACM,IAAW;AAAA,IACf,EAAG,aAAa,GAAgB,CAAG;AAAA,IACnC,EAAG,aAAa,GAAgB,CAAG;AAAA,IACnC,EAAG,QAAQ,GAAgB,CAAG;AAAA,EAChC;AACA,SAAO,EAAA,MAAsB;AAC3B,IAAA,EAAS,QAAA,CAAS,MAAM,EAAE,CAAC;AAAA,EAC7B,CAAC;AACH;AACA,SAAS,GAA6B,EACpC,oBAAA,GACA,KAAA,GACA,QAAQ,GACR,YAAA,GACA,eAAA,GACA,UAAA,EAAA,GACC;AACD,MAAI,EAAS,qBAAqB,GAChC,QAAA,MAAa;AAAA,EACb;AAEF,QAAM,IAAa,EAAS,qBAAqB,MAAQ,EAAS,qBAAqB,SAAS,CAAC,IAAI,EAAS,kBACxG,IAAW,CAAC;AAClB,MAAI,IAAqB;AACzB,QAAM,IAAA,CAAc,MAClB,CAAQ,MAAU;AAChB,UAAM,IAAS,GAAe,CAAK;AACnC,QAAI,EAAU,GAAQ,GAAY,GAAe,EAAI,EACnD;AAEF,QAAI,IAAc,MACd,IAAe;AACnB,QAAI,iBAAiB,GAAO;AAC1B,cAAQ,EAAM,aAAd;AAAA,QACE,KAAK;AACH,UAAA,IAAc,GAAa;AAC3B;AAAA,QACF,KAAK;AACH,UAAA,IAAc,GAAa;AAC3B;AAAA,QACF,KAAK;AACH,UAAA,IAAc,GAAa;AAAA,MAE/B;AACA,MAAI,MAAgB,GAAa,QAC3B,EAAkB,CAAA,MAAc,EAAkB,YACpD,IAAe,eACN,EAAkB,CAAA,MAAc,EAAkB,YAC3D,IAAe,cAEQ,GAAa;AAAA,IAC1C,MAAO,CAAI,GAAoB,CAAK,MAClC,IAAc,GAAa;AAE7B,IAAI,MAAgB,QAClB,IAAqB,IACjB,EAAa,WAAW,OAAO,KAAK,MAAgB,GAAa,SAAS,EAAa,WAAW,OAAO,KAAK,MAAgB,GAAa,WAC7I,IAAc,SAEP,EAAkB,CAAA,MAAc,EAAkB,UAC3D,IAAc,GACd,IAAqB;AAEvB,UAAM,IAAI,GAAoB,CAAK,IAAI,EAAM,eAAe,CAAA,IAAK;AACjE,QAAI,CAAC,EACH;AAEF,UAAM,IAAK,EAAQ,MAAM,CAAM,GACzB,EAAE,SAAA,GAAS,SAAA,EAAA,IAAY;AAC7B,IAAA,EAAgB,CAAkB,EAAE;AAAA,MAClC,MAAM,EAAkB,CAAA;AAAA,MACxB,IAAA;AAAA,MACA,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG,MAAgB,QAAQ,EAAE,aAAA,EAAY;AAAA,IAC3C,CAAC;AAAA,EACH;AAEF,gBAAO,KAAK,CAAiB,EAAE,OAAA,CAC5B,MAAQ,OAAO,MAAM,OAAO,CAAG,CAAC,KAAK,CAAC,EAAI,SAAS,WAAW,KAAK,EAAW,CAAA,MAAS,EAC1F,EAAE,QAAA,CAAS,MAAa;AACtB,QAAI,IAAY,GAAY,CAAQ;AACpC,UAAM,IAAU,EAAW,CAAQ;AACnC,QAAI,OAAO,aACT,SAAQ,EAAkB,CAAA,GAA1B;AAAA,MACE,KAAK,EAAkB;AAAA,MACvB,KAAK,EAAkB;AACrB,QAAA,IAAY,EAAU,QACpB,SACA,SACF;AACA;AAAA,MACF,KAAK,EAAkB;AAAA,MACvB,KAAK,EAAkB;AACrB;AAAA,IACJ;AAEF,IAAA,EAAS,KAAK,EAAG,GAAW,GAAS,CAAG,CAAC;AAAA,EAC3C,CAAC,GACM,EAAA,MAAsB;AAC3B,IAAA,EAAS,QAAA,CAAS,MAAM,EAAE,CAAC;AAAA,EAC7B,CAAC;AACH;AACA,SAAS,GAAmB,EAC1B,UAAA,GACA,KAAA,GACA,QAAQ,GACR,YAAA,GACA,eAAA,GACA,UAAA,EAAA,GACC;AA2BD,SAAO,EAAG,UA1Ba,EACrB,GACE,EAAA,CAAiB,MAAQ;AACvB,UAAM,IAAS,GAAe,CAAG;AACjC,QAAI,CAAC,KAAU,EAAU,GAAQ,GAAY,GAAe,EAAI,EAC9D;AAEF,UAAM,IAAK,EAAQ,MAAM,CAAM;AAC/B,QAAI,MAAW,KAAO,EAAI,aAAa;AACrC,YAAM,IAAgB,GAAgB,EAAI,WAAW;AACrD,MAAA,EAAS;AAAA,QACP,IAAA;AAAA,QACA,GAAG,EAAc;AAAA,QACjB,GAAG,EAAc;AAAA,MACnB,CAAC;AAAA,IACH,MACE,CAAA,EAAS;AAAA,MACP,IAAA;AAAA,MACA,GAAG,EAAO;AAAA,MACV,GAAG,EAAO;AAAA,IACZ,CAAC;AAAA,EAEL,CAAC,GACD,EAAS,UAAU,GACrB,CAE+B,GAAG,CAAG;AACzC;AACA,SAAS,GAA2B,EAAE,kBAAA,EAAA,GAAoB,EAAE,KAAA,EAAA,GAAO;AACjE,MAAI,IAAQ,IACR,IAAQ;AAkBZ,SAAO,EAAG,UAjBc,EACtB,GACE,EAAA,MAAsB;AACpB,UAAM,IAAS,GAAgB,GACzB,IAAQ,GAAe;AAC7B,KAAI,MAAU,KAAU,MAAU,OAChC,EAAiB;AAAA,MACf,OAAO,OAAO,CAAK;AAAA,MACnB,QAAQ,OAAO,CAAM;AAAA,IACvB,CAAC,GACD,IAAQ,GACR,IAAQ;AAAA,EAEZ,CAAC,GACD,GACF,CAEgC,GAAG,CAAG;AAC1C;AACA,IAAM,KAAa;AAAA,EAAC;AAAA,EAAS;AAAA,EAAY;AAAQ,GAC3C,KAAoC,oBAAI,QAAQ;AACtD,SAAS,GAAkB,EACzB,SAAA,GACA,KAAA,GACA,QAAQ,GACR,YAAA,GACA,eAAA,GACA,aAAA,GACA,gBAAA,GACA,kBAAA,GACA,aAAA,GACA,UAAA,GACA,sBAAA,EAAA,GACC;AACD,WAAS,EAAa,GAAO;AAC3B,QAAI,IAAS,GAAe,CAAK;AACjC,UAAM,IAAgB,EAAM,WACtB,IAAU,KAAU,EAAO;AAOjC,QANI,KAAU,MAAY,aACxB,IAAS,EAAM,cAAc,CAAM,IAEjC,CAAC,KAAU,CAAC,KAAW,GAAW,QAAQ,CAAO,IAAI,KAAK,EAAU,GAAQ,GAAY,GAAe,EAAI,KAG3G,EAAO,UAAU,SAAS,CAAW,KAAK,KAAkB,EAAO,QAAQ,CAAc,EAC3F;AAEF,QAAI,IAAO,EAAO,OACd,IAAY;AAChB,UAAM,IAAO,GAAa,CAAM,KAAK;AACrC,IAAI,MAAS,WAAW,MAAS,aAC/B,IAAY,EAAO,WACV,EAAiB,EAAQ,YAAY,CAAA,KAAM,EAAiB,CAAA,OACrE,IAAO,GAAe;AAAA,MACpB,SAAS;AAAA,MACT,kBAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAO;AAAA,MACP,aAAA;AAAA,IACF,CAAC,IAEH,EACE,GACA,IAAuB;AAAA,MAAE,MAAA;AAAA,MAAM,WAAA;AAAA,MAAW,eAAA;AAAA,IAAc,IAAI;AAAA,MAAE,MAAA;AAAA,MAAM,WAAA;AAAA,IAAU,CAChF;AACA,UAAM,IAAO,EAAO;AACpB,IAAI,MAAS,WAAW,KAAQ,KAC9B,EAAI,iBAAiB,6BAA6B,CAAA,IAAQ,EAAE,QAAA,CAAS,MAAO;AAC1E,UAAI,MAAO,GAAQ;AACjB,cAAM,IAAQ,EAAG;AACjB,QAAA,EACE,GACA,IAAuB;AAAA,UAAE,MAAM;AAAA,UAAO,WAAW,CAAC;AAAA,UAAW,eAAe;AAAA,QAAM,IAAI;AAAA,UAAE,MAAM;AAAA,UAAO,WAAW,CAAC;AAAA,QAAU,CAC7H;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EAEL;AACA,WAAS,EAAY,GAAQ,GAAG;AAC9B,UAAM,IAAiB,GAAkB,IAAI,CAAM;AACnD,QAAI,CAAC,KAAkB,EAAe,SAAS,EAAE,QAAQ,EAAe,cAAc,EAAE,WAAW;AACjG,MAAA,GAAkB,IAAI,GAAQ,CAAC;AAC/B,YAAM,IAAK,EAAQ,MAAM,CAAM;AAC/B,MAAA,EAAgB,CAAO,EAAE;AAAA,QACvB,GAAG;AAAA,QACH,IAAA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,KADS,EAAS,UAAU,SAAS,CAAC,QAAQ,IAAI,CAAC,SAAS,QAAQ,GAClD,IAAA,CACrB,MAAc,EAAG,GAAW,EAAgB,CAAY,GAAG,CAAG,CACjE,GACM,IAAgB,EAAI;AAC1B,MAAI,CAAC,EACH,QAAA,MAAa;AACX,IAAA,EAAS,QAAA,CAAS,MAAM,EAAE,CAAC;AAAA,EAC7B;AAEF,QAAM,IAAqB,EAAc,OAAO,yBAC9C,EAAc,iBAAiB,WAC/B,OACF,GACM,IAAiB;AAAA,IACrB,CAAC,EAAc,iBAAiB,WAAW,OAAO;AAAA,IAClD,CAAC,EAAc,iBAAiB,WAAW,SAAS;AAAA,IACpD,CAAC,EAAc,kBAAkB,WAAW,OAAO;AAAA,IACnD,CAAC,EAAc,oBAAoB,WAAW,OAAO;AAAA,IAErD,CAAC,EAAc,kBAAkB,WAAW,eAAe;AAAA,IAC3D,CAAC,EAAc,kBAAkB,WAAW,UAAU;AAAA,EACxD;AACA,SAAI,KAAsB,EAAmB,OAC3C,EAAS,KACP,GAAG,EAAe,IAAA,CACf,MAAM,GACL,EAAE,CAAA,GACF,EAAE,CAAA,GACF,EACE,MAAM;AACJ,IAAA,EAAgB,CAAY,EAAE;AAAA,MAC5B,QAAQ;AAAA,MACR,WAAW;AAAA,IAEb,CAAC;AAAA,EACH,EACF,GACA,IACA,CACF,CACF,CACF,GAEK,EAAA,MAAsB;AAC3B,IAAA,EAAS,QAAA,CAAS,MAAM,EAAE,CAAC;AAAA,EAC7B,CAAC;AACH;AACA,SAAS,GAA0B,GAAM;AACvC,QAAM,IAAY,CAAC;AACnB,WAAS,EAAQ,GAAW,GAAK;AAC/B,QAAI,GAAiB,iBAAiB,KAAK,EAAU,sBAAsB,mBAAmB,GAAiB,cAAc,KAAK,EAAU,sBAAsB,gBAAgB,GAAiB,iBAAiB,KAAK,EAAU,sBAAsB,mBAAmB,GAAiB,kBAAkB,KAAK,EAAU,sBAAsB,kBAAkB;AAIpW,YAAM,IAHQ,MAAM,KAClB,EAAU,WAAW,QAEJ,EAAE,QAAQ,CAAS;AACtC,aAAA,EAAI,QAAQ,CAAM,GACX,EAAQ,EAAU,YAAY,CAAG;AAAA,IAC1C,WAAW,EAAU,kBAAkB;AAErC,YAAM,IADQ,MAAM,KAAK,EAAU,iBAAiB,QACjC,EAAE,QAAQ,CAAS;AACtC,MAAA,EAAI,QAAQ,CAAM;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AACA,SAAO,EAAQ,GAAM,CAAS;AAChC;AACA,SAAS,GAAgB,GAAO,GAAS,GAAa;AACpD,MAAI,GAAI;AACR,SAAK,KACD,EAAM,YAAW,IAAK,EAAQ,MAAM,EAAM,SAAS,IAClD,IAAU,EAAY,MAAM,CAAK,GAC/B;AAAA,IACL,SAAA;AAAA,IACA,IAAA;AAAA,EACF,KANmB,CAAC;AAOtB;AACA,SAAS,GAAuB,EAAE,kBAAA,GAAkB,QAAQ,GAAS,mBAAA,EAAA,GAAqB,EAAE,KAAA,EAAA,GAAO;AACjG,MAAI,CAAC,EAAI,iBAAiB,CAAC,EAAI,cAAc,UAC3C,QAAA,MAAa;AAAA,EACb;AAEF,QAAM,IAAa,EAAI,cAAc,UAAU;AAC/C,EAAA,EAAI,cAAc,UAAU,aAAa,IAAI,MAAM,GAAY,EAC7D,OAAO,EAAA,CACJ,GAAQ,GAAS,MAAkB;AAClC,UAAM,CAAC,GAAM,CAAA,IAAU,GACjB,EAAE,IAAA,GAAI,SAAA,EAAA,IAAY,GACtB,GACA,GACA,EAAkB,WACpB;AACA,YAAI,KAAM,MAAO,MAAM,KAAW,MAAY,OAC5C,EAAiB;AAAA,MACf,IAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAM,CAAC;AAAA,QAAE,MAAA;AAAA,QAAM,OAAO;AAAA,MAAO,CAAC;AAAA,IAChC,CAAC,GAEI,EAAO,MAAM,GAAS,CAAa;AAAA,EAC5C,CACF,EACF,CAAC,GACD,EAAI,cAAc,UAAU,UAAU,SAAS,GAAU,GAAY,IAAS,KAAK,SAAS,QAAQ;AAClG,UAAM,IAAO,GAAG,CAAA,MAAc,CAAA;AAC9B,WAAO,EAAI,cAAc,UAAU,WAAW,MAAM,MAAM,CAAC,GAAM,CAAM,CAAC;AAAA,EAC1E;AACA,QAAM,IAAa,EAAI,cAAc,UAAU;AAC/C,EAAA,EAAI,cAAc,UAAU,aAAa,IAAI,MAAM,GAAY,EAC7D,OAAO,EAAA,CACJ,GAAQ,GAAS,MAAkB;AAClC,UAAM,CAAC,CAAA,IAAU,GACX,EAAE,IAAA,GAAI,SAAA,EAAA,IAAY,GACtB,GACA,GACA,EAAkB,WACpB;AACA,YAAI,KAAM,MAAO,MAAM,KAAW,MAAY,OAC5C,EAAiB;AAAA,MACf,IAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAS,CAAC,EAAE,OAAO,EAAO,CAAC;AAAA,IAC7B,CAAC,GAEI,EAAO,MAAM,GAAS,CAAa;AAAA,EAC5C,CACF,EACF,CAAC,GACD,EAAI,cAAc,UAAU,aAAa,SAAS,GAAQ;AACxD,WAAO,EAAI,cAAc,UAAU,WAAW,MAAM,MAAM,CAAC,CAAM,CAAC;AAAA,EACpE;AACA,MAAI;AACJ,EAAI,EAAI,cAAc,UAAU,YAC9B,IAAU,EAAI,cAAc,UAAU,SACtC,EAAI,cAAc,UAAU,UAAU,IAAI,MAAM,GAAS,EACvD,OAAO,EAAA,CACJ,GAAQ,GAAS,MAAkB;AAClC,UAAM,CAAC,CAAA,IAAQ,GACT,EAAE,IAAA,GAAI,SAAA,EAAA,IAAY,GACtB,GACA,GACA,EAAkB,WACpB;AACA,YAAI,KAAM,MAAO,MAAM,KAAW,MAAY,OAC5C,EAAiB;AAAA,MACf,IAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAS;AAAA,IACX,CAAC,GAEI,EAAO,MAAM,GAAS,CAAa;AAAA,EAC5C,CACF,EACF,CAAC;AAEH,MAAI;AACJ,EAAI,EAAI,cAAc,UAAU,gBAC9B,IAAc,EAAI,cAAc,UAAU,aAC1C,EAAI,cAAc,UAAU,cAAc,IAAI,MAAM,GAAa,EAC/D,OAAO,EAAA,CACJ,GAAQ,GAAS,MAAkB;AAClC,UAAM,CAAC,CAAA,IAAQ,GACT,EAAE,IAAA,GAAI,SAAA,EAAA,IAAY,GACtB,GACA,GACA,EAAkB,WACpB;AACA,YAAI,KAAM,MAAO,MAAM,KAAW,MAAY,OAC5C,EAAiB;AAAA,MACf,IAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAa;AAAA,IACf,CAAC,GAEI,EAAO,MAAM,GAAS,CAAa;AAAA,EAC5C,CACF,EACF,CAAC;AAEH,QAAM,IAA8B,CAAC;AACrC,EAAI,GAA4B,iBAAiB,IAC/C,EAA4B,kBAAkB,EAAI,mBAE9C,GAA4B,cAAc,MAC5C,EAA4B,eAAe,EAAI,eAE7C,GAA4B,kBAAkB,MAChD,EAA4B,mBAAmB,EAAI,mBAEjD,GAA4B,iBAAiB,MAC/C,EAA4B,kBAAkB,EAAI;AAGtD,QAAM,IAAsB,CAAC;AAC7B,gBAAO,QAAQ,CAA2B,EAAE,QAAA,CAAS,CAAC,GAAS,CAAA,MAAU;AACvE,IAAA,EAAoB,CAAA,IAAW;AAAA,MAE7B,YAAY,EAAK,UAAU;AAAA,MAE3B,YAAY,EAAK,UAAU;AAAA,IAC7B,GACA,EAAK,UAAU,aAAa,IAAI,MAC9B,EAAoB,CAAA,EAAS,YAC7B,EACE,OAAO,EAAA,CACJ,GAAQ,GAAS,MAAkB;AAClC,YAAM,CAAC,GAAM,CAAA,IAAU,GACjB,EAAE,IAAA,GAAI,SAAA,EAAA,IAAY,GACtB,EAAQ,kBACR,GACA,EAAkB,WACpB;AACA,cAAI,KAAM,MAAO,MAAM,KAAW,MAAY,OAC5C,EAAiB;AAAA,QACf,IAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAM,CACJ;AAAA,UACE,MAAA;AAAA,UACA,OAAO,CACL,GAAG,GAA0B,CAAO,GACpC,KAAU,CAEZ;AAAA,QACF,CACF;AAAA,MACF,CAAC,GAEI,EAAO,MAAM,GAAS,CAAa;AAAA,IAC5C,CACF,EACF,CACF,GACA,EAAK,UAAU,aAAa,IAAI,MAC9B,EAAoB,CAAA,EAAS,YAC7B,EACE,OAAO,EAAA,CACJ,GAAQ,GAAS,MAAkB;AAClC,YAAM,CAAC,CAAA,IAAU,GACX,EAAE,IAAA,GAAI,SAAA,EAAA,IAAY,GACtB,EAAQ,kBACR,GACA,EAAkB,WACpB;AACA,cAAI,KAAM,MAAO,MAAM,KAAW,MAAY,OAC5C,EAAiB;AAAA,QACf,IAAA;AAAA,QACA,SAAA;AAAA,QACA,SAAS,CACP,EAAE,OAAO,CAAC,GAAG,GAA0B,CAAO,GAAG,CAAM,EAAE,CAC3D;AAAA,MACF,CAAC,GAEI,EAAO,MAAM,GAAS,CAAa;AAAA,IAC5C,CACF,EACF,CACF;AAAA,EACF,CAAC,GACM,EAAA,MAAsB;AAC3B,IAAA,EAAI,cAAc,UAAU,aAAa,GACzC,EAAI,cAAc,UAAU,aAAa,GACzC,MAAY,EAAI,cAAc,UAAU,UAAU,IAClD,MAAgB,EAAI,cAAc,UAAU,cAAc,IAC1D,OAAO,QAAQ,CAA2B,EAAE,QAAA,CAAS,CAAC,GAAS,CAAA,MAAU;AACvE,MAAA,EAAK,UAAU,aAAa,EAAoB,CAAA,EAAS,YACzD,EAAK,UAAU,aAAa,EAAoB,CAAA,EAAS;AAAA,IAC3D,CAAC;AAAA,EACH,CAAC;AACH;AACA,SAAS,GAA8B,EACrC,QAAQ,GACR,mBAAA,EAAA,GACC,GAAO;AACR,MAAI,GAAK,GAAI;AACb,MAAI,IAAS;AACb,EAAI,EAAM,aAAa,cAAa,IAAS,EAAQ,MAAM,CAAK,IAC3D,IAAS,EAAQ,MAAM,EAAM,KAAK,CAAK,CAAC;AAC7C,QAAM,IAAc,EAAM,aAAa,eAAe,IAAM,EAAM,gBAAgB,OAAO,SAAS,EAAI,YAAY,KAAM,IAAK,EAAM,kBAAkB,OAAO,SAAS,EAAG,gBAAgB,OAAO,SAAS,EAAG,YACrM,IAA8B,KAAe,QAAgB,EAAY,YAAa,OAAO,yBACjG,KAAe,OAAO,SAAS,EAAY,WAC3C,oBACF,IAAI;AACJ,SAAI,MAAW,QAAQ,MAAW,MAAM,CAAC,KAAe,CAAC,IACvD,MAAa;AAAA,EACb,KACF,OAAO,eAAe,GAAO,sBAAsB;AAAA,IACjD,cAAc,EAA2B;AAAA,IACzC,YAAY,EAA2B;AAAA,IACvC,MAAM;AACJ,UAAI;AACJ,cAAQ,IAAM,EAA2B,QAAQ,OAAO,SAAS,EAAI,KAAK,IAAI;AAAA,IAChF;AAAA,IACA,IAAI,GAAQ;AACV,UAAI;AACJ,YAAM,KAAU,IAAM,EAA2B,QAAQ,OAAO,SAAS,EAAI,KAAK,MAAM,CAAM;AAC9F,UAAI,MAAW,QAAQ,MAAW,GAChC,KAAI;AACF,QAAA,EAAkB,iBAAiB,GAAQ,CAAM;AAAA,MACnD,QAAY;AAAA,MACZ;AAEF,aAAO;AAAA,IACT;AAAA,EACF,CAAC,GACM,EAAA,MAAsB;AAC3B,WAAO,eAAe,GAAO,sBAAsB;AAAA,MACjD,cAAc,EAA2B;AAAA,MACzC,YAAY,EAA2B;AAAA,MAEvC,KAAK,EAA2B;AAAA,MAEhC,KAAK,EAA2B;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AACH;AACA,SAAS,GAA6B,EACpC,oBAAA,GACA,QAAQ,GACR,qBAAA,GACA,mBAAA,EAAA,GACC,EAAE,KAAA,EAAA,GAAO;AACV,QAAM,IAAc,EAAI,oBAAoB,UAAU;AACtD,EAAA,EAAI,oBAAoB,UAAU,cAAc,IAAI,MAAM,GAAa,EACrE,OAAO,EAAA,CACJ,GAAQ,GAAS,MAAkB;AAClC,QAAI;AACJ,UAAM,CAAC,GAAU,GAAO,CAAA,IAAY;AACpC,QAAI,EAAoB,IAAI,CAAQ,EAClC,QAAO,EAAY,MAAM,GAAS;AAAA,MAAC;AAAA,MAAU;AAAA,MAAO;AAAA,IAAQ,CAAC;AAE/D,UAAM,EAAE,IAAA,GAAI,SAAA,EAAA,IAAY,IACrB,IAAM,EAAQ,eAAe,OAAO,SAAS,EAAI,kBAClD,GACA,EAAkB,WACpB;AACA,YAAI,KAAM,MAAO,MAAM,KAAW,MAAY,OAC5C,EAAmB;AAAA,MACjB,IAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAK;AAAA,QACH,UAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,MACF;AAAA,MAEA,OAAO,GAA0B,EAAQ,UAAU;AAAA,IACrD,CAAC,GAEI,EAAO,MAAM,GAAS,CAAa;AAAA,EAC5C,CACF,EACF,CAAC;AACD,QAAM,IAAiB,EAAI,oBAAoB,UAAU;AACzD,SAAA,EAAI,oBAAoB,UAAU,iBAAiB,IAAI,MAAM,GAAgB,EAC3E,OAAO,EAAA,CACJ,GAAQ,GAAS,MAAkB;AAClC,QAAI;AACJ,UAAM,CAAC,CAAA,IAAY;AACnB,QAAI,EAAoB,IAAI,CAAQ,EAClC,QAAO,EAAe,MAAM,GAAS,CAAC,CAAQ,CAAC;AAEjD,UAAM,EAAE,IAAA,GAAI,SAAA,EAAA,IAAY,IACrB,IAAM,EAAQ,eAAe,OAAO,SAAS,EAAI,kBAClD,GACA,EAAkB,WACpB;AACA,YAAI,KAAM,MAAO,MAAM,KAAW,MAAY,OAC5C,EAAmB;AAAA,MACjB,IAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAQ,EACN,UAAA,EACF;AAAA,MAEA,OAAO,GAA0B,EAAQ,UAAU;AAAA,IACrD,CAAC,GAEI,EAAO,MAAM,GAAS,CAAa;AAAA,EAC5C,CACF,EACF,CAAC,GACM,EAAA,MAAsB;AAC3B,IAAA,EAAI,oBAAoB,UAAU,cAAc,GAChD,EAAI,oBAAoB,UAAU,iBAAiB;AAAA,EACrD,CAAC;AACH;AACA,SAAS,GAA6B,EACpC,oBAAA,GACA,YAAA,GACA,eAAA,GACA,QAAQ,GACR,UAAA,GACA,KAAA,EAAA,GACC;AACD,QAAM,IAAU,EAAA,CACb,MAAS,GACR,EAAA,CAAiB,MAAU;AACzB,UAAM,IAAS,GAAe,CAAK;AACnC,QAAI,CAAC,KAAU,EAAU,GAAQ,GAAY,GAAe,EAAI,EAC9D;AAEF,UAAM,EAAE,aAAA,GAAa,QAAA,GAAQ,OAAA,GAAO,cAAA,GAAc,MAAA,EAAA,IAAS;AAC3D,IAAA,EAAmB;AAAA,MACjB,MAAA;AAAA,MACA,IAAI,EAAQ,MAAM,CAAM;AAAA,MACxB,aAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,cAAA;AAAA,MACA,MAAA;AAAA,IACF,CAAC;AAAA,EACH,CAAC,GACD,EAAS,SAAS,GACpB,CACF,GACM,IAAW;AAAA,IACf,EAAG,QAAQ,EAAQ,GAAkB,IAAI,GAAG,CAAG;AAAA,IAC/C,EAAG,SAAS,EAAQ,GAAkB,KAAK,GAAG,CAAG;AAAA,IACjD,EAAG,UAAU,EAAQ,GAAkB,MAAM,GAAG,CAAG;AAAA,IACnD,EAAG,gBAAgB,EAAQ,GAAkB,YAAY,GAAG,CAAG;AAAA,IAC/D,EAAG,cAAc,EAAQ,GAAkB,UAAU,GAAG,CAAG;AAAA,EAC7D;AACA,SAAO,EAAA,MAAsB;AAC3B,IAAA,EAAS,QAAA,CAAS,MAAM,EAAE,CAAC;AAAA,EAC7B,CAAC;AACH;AACA,SAAS,GAAiB,EAAE,QAAA,GAAQ,KAAA,EAAA,GAAO;AACzC,QAAM,IAAM,EAAI;AAChB,MAAI,CAAC,EACH,QAAA,MAAa;AAAA,EACb;AAEF,QAAM,IAAW,CAAC,GACZ,IAA0B,oBAAI,QAAQ,GACtC,IAAmB,EAAI;AAC7B,EAAA,EAAI,WAAW,SAAkB,GAAQ,GAAQ,GAAa;AAC5D,UAAM,IAAW,IAAI,EAAiB,GAAQ,GAAQ,CAAW;AACjE,WAAA,EAAQ,IAAI,GAAU;AAAA,MACpB,QAAA;AAAA,MACA,QAAQ,OAAO,KAAW;AAAA,MAC1B,aAAA;AAAA,MACA,YAAY,OAAO,KAAW,WAAW,IAAS,KAAK,UAAU,MAAM,KAAK,IAAI,WAAW,CAAM,CAAC,CAAC;AAAA,IACrG,CAAC,GACM;AAAA,EACT;AACA,QAAM,IAAiB,GACrB,EAAI,OACJ,OACA,SAAS,GAAU;AACjB,WAAO,SAAS,GAAU;AACxB,wBACE,EAAA,MAAsB;AACpB,cAAM,IAAI,EAAQ,IAAI,CAAQ;AAC9B,QAAI,MACF,EAAO,CAAC,GACR,EAAQ,OAAO,CAAQ;AAAA,MAE3B,CAAC,GACD,CACF,GACO,EAAS,MAAM,MAAM,CAAC,CAAQ,CAAC;AAAA,IACxC;AAAA,EACF,CACF;AACA,SAAA,EAAS,KAAA,MAAW;AAClB,IAAA,EAAI,WAAW;AAAA,EACjB,CAAC,GACD,EAAS,KAAK,CAAc,GACrB,EAAA,MAAsB;AAC3B,IAAA,EAAS,QAAA,CAAS,MAAM,EAAE,CAAC;AAAA,EAC7B,CAAC;AACH;AACA,SAAS,GAAsB,GAAO;AACpC,QAAM,EAAE,KAAA,GAAK,QAAQ,GAAS,YAAA,GAAY,eAAA,GAAe,aAAA,EAAA,IAAgB;AACzE,MAAI,IAAY;AAChB,QAAM,IAAkB,EAAA,MAAsB;AAC5C,UAAM,IAAY,EAAI,aAAa;AACnC,QAAI,CAAC,KAAa,MAAc,KAAa,QAAgB,EAAU,aAAc;AACrF,IAAA,IAAY,EAAU,eAAe;AACrC,UAAM,IAAS,CAAC,GACV,IAAQ,EAAU,cAAc;AACtC,aAAS,IAAI,GAAG,IAAI,GAAO,KAAK;AAE9B,YAAM,EAAE,gBAAA,GAAgB,aAAA,GAAa,cAAA,GAAc,WAAA,EAAA,IADrC,EAAU,WAAW,CACkC;AAErE,MADgB,EAAU,GAAgB,GAAY,GAAe,EAAI,KAAK,EAAU,GAAc,GAAY,GAAe,EAAI,KAErI,EAAO,KAAK;AAAA,QACV,OAAO,EAAQ,MAAM,CAAc;AAAA,QACnC,aAAA;AAAA,QACA,KAAK,EAAQ,MAAM,CAAY;AAAA,QAC/B,WAAA;AAAA,MACF,CAAC;AAAA,IACH;AACA,IAAA,EAAY,EAAE,QAAA,EAAO,CAAC;AAAA,EACxB,CAAC;AACD,SAAA,EAAgB,GACT,EAAG,mBAAmB,CAAe;AAC9C;AACA,SAAS,GAA0B,EACjC,KAAA,GACA,iBAAA,EAAA,GACC;AACD,QAAM,IAAM,EAAI;AAChB,SAAI,CAAC,KAAO,CAAC,EAAI,iBAAgB,MAAa;AAAA,EAC9C,IACuB,GACrB,EAAI,gBACJ,UACA,SAAS,GAAU;AACjB,WAAO,SAAS,GAAM,GAAa,GAAS;AAC1C,UAAI;AACF,QAAA,EAAgB,EACd,QAAQ,EACN,MAAA,EACF,EACF,CAAC;AAAA,MACH,QAAY;AACV,gBAAQ,KAAK,sCAAsC,CAAA,EAAM;AAAA,MAC3D;AACA,aAAO,EAAS,MAAM,MAAM;AAAA,QAAC;AAAA,QAAM;AAAA,QAAa;AAAA,MAAO,CAAC;AAAA,IAC1D;AAAA,EACF,CAEkB;AACtB;AACA,SAAS,GAAW,GAAG,GAAO;AAC5B,QAAM,EACJ,YAAA,GACA,aAAA,GACA,oBAAA,GACA,UAAA,GACA,kBAAA,GACA,SAAA,GACA,oBAAA,GACA,kBAAA,GACA,oBAAA,GACA,kBAAA,GACA,QAAA,GACA,aAAA,GACA,iBAAA,EAAA,IACE;AACJ,EAAA,EAAE,aAAA,IAAiB,MAAM;AACvB,IAAI,EAAM,YACR,EAAM,SAAS,GAAG,CAAC,GAErB,EAAW,GAAG,CAAC;AAAA,EACjB,GACA,EAAE,cAAA,IAAkB,MAAM;AACxB,IAAI,EAAM,aACR,EAAM,UAAU,GAAG,CAAC,GAEtB,EAAY,GAAG,CAAC;AAAA,EAClB,GACA,EAAE,qBAAA,IAAyB,MAAM;AAC/B,IAAI,EAAM,oBACR,EAAM,iBAAiB,GAAG,CAAC,GAE7B,EAAmB,GAAG,CAAC;AAAA,EACzB,GACA,EAAE,WAAA,IAAe,MAAM;AACrB,IAAI,EAAM,UACR,EAAM,OAAO,GAAG,CAAC,GAEnB,EAAS,GAAG,CAAC;AAAA,EACf,GACA,EAAE,mBAAA,IAAuB,MAAM;AAC7B,IAAI,EAAM,kBACR,EAAM,eAAe,GAAG,CAAC,GAE3B,EAAiB,GAAG,CAAC;AAAA,EACvB,GACA,EAAE,UAAA,IAAc,MAAM;AACpB,IAAI,EAAM,SACR,EAAM,MAAM,GAAG,CAAC,GAElB,EAAQ,GAAG,CAAC;AAAA,EACd,GACA,EAAE,qBAAA,IAAyB,MAAM;AAC/B,IAAI,EAAM,mBACR,EAAM,gBAAgB,GAAG,CAAC,GAE5B,EAAmB,GAAG,CAAC;AAAA,EACzB,GACA,EAAE,mBAAA,IAAuB,MAAM;AAC7B,IAAI,EAAM,kBACR,EAAM,eAAe,GAAG,CAAC,GAE3B,EAAiB,GAAG,CAAC;AAAA,EACvB,GACA,EAAE,qBAAA,IAAyB,MAAM;AAC/B,IAAI,EAAM,oBACR,EAAM,iBAAiB,GAAG,CAAC,GAE7B,EAAmB,GAAG,CAAC;AAAA,EACzB,GACA,EAAE,mBAAA,IAAuB,MAAM;AAC7B,IAAI,EAAM,kBACR,EAAM,eAAe,GAAG,CAAC,GAE3B,EAAiB,GAAG,CAAC;AAAA,EACvB,GACA,EAAE,SAAA,IAAa,MAAM;AACnB,IAAI,EAAM,QACR,EAAM,KAAK,GAAG,CAAC,GAEjB,EAAO,GAAG,CAAC;AAAA,EACb,GACA,EAAE,cAAA,IAAkB,MAAM;AACxB,IAAI,EAAM,aACR,EAAM,UAAU,GAAG,CAAC,GAEtB,EAAY,GAAG,CAAC;AAAA,EAClB,GACA,EAAE,kBAAA,IAAsB,MAAM;AAC5B,IAAI,EAAM,iBACR,EAAM,cAAc,GAAG,CAAC,GAE1B,EAAgB,GAAG,CAAC;AAAA,EACtB;AACF;AACA,SAAS,GAAc,GAAG,IAAQ,CAAC,GAAG;AACpC,QAAM,IAAgB,EAAE,IAAI;AAC5B,MAAI,CAAC,EACH,QAAA,MAAa;AAAA,EACb;AAEF,EAAA,GAAW,GAAG,CAAK;AACnB,MAAI,GACA,IAAA,MAA8B;AAAA,EAClC;AACA,EAAI,EAAE,cACJ,CAAC,GAAkB,CAAA,IAAyB,GAAqB,GAAG,EAAE,GAAG;AAE3E,QAAM,IAAmB,GAAiB,CAAC,GACrC,IAA0B,GAA6B,CAAC,GACxD,IAAgB,GAAmB,CAAC,GACpC,IAAwB,GAA2B,GAAG,EAC1D,KAAK,EACP,CAAC,GACK,IAAe,GAAkB,CAAC,GAClC,IAA0B,GAA6B,CAAC;AAC9D,MAAI,IAAA,MAA2B;AAAA,EAC/B,GACI,IAAA,MAAkC;AAAA,EACtC,GACI,IAAA,MAAiC;AAAA,EACrC,GACI,IAAA,MAAqB;AAAA,EACzB;AACA,EAAI,EAAE,cACJ,IAAqB,GAAuB,GAAG,EAAE,KAAK,EAAc,CAAC,GACrE,IAA4B,GAA8B,GAAG,EAAE,GAAG,GAClE,IAA2B,GAA6B,GAAG,EACzD,KAAK,EACP,CAAC,GACG,EAAE,iBACJ,IAAe,GAAiB,CAAC;AAGrC,QAAM,IAAoB,GAAsB,CAAC,GAC3C,IAAwB,GAA0B,CAAC,GACnD,IAAiB,CAAC;AACxB,aAAW,KAAU,EAAE,QACrB,CAAA,EAAe,KACb,EAAO,SAAS,EAAO,UAAU,GAAe,EAAO,OAAO,CAChE;AAEF,SAAO,EAAA,MAAsB;AAC3B,IAAA,GAAgB,QAAA,CAAS,MAAM,EAAE,MAAM,CAAC,GACxC,KAAoB,QAAgB,EAAiB,WAAW,GAChE,EAAsB,GACtB,EAAiB,GACjB,EAAwB,GACxB,EAAc,GACd,EAAsB,GACtB,EAAa,GACb,EAAwB,GACxB,EAAmB,GACnB,EAA0B,GAC1B,EAAyB,GACzB,EAAa,GACb,EAAkB,GAClB,EAAsB,GACtB,EAAe,QAAA,CAAS,MAAM,EAAE,CAAC;AAAA,EACnC,CAAC;AACH;AACA,SAAS,GAAiB,GAAM;AAC9B,SAAO,OAAO,OAAO,CAAA,KAAU;AACjC;AACA,SAAS,GAA4B,GAAM;AACzC,SAAO,GACL,OAAO,OAAO,CAAA,KAAU,eAExB,OAAO,CAAA,EAAM,aAAa,gBAAgB,OAAO,CAAA,EAAM,aAAa,gBAAgB,OAAO,CAAA,EAAM;AAErG;AACA,IAAM,KAAN,MAA8B;AAAA,EAC5B,YAAY,GAAc;AACxB,IAAA,EAAc,MAAM,yBAAyC,oBAAI,QAAQ,CAAC,GAC1E,EAAc,MAAM,yBAAyC,oBAAI,QAAQ,CAAC,GAC1E,KAAK,eAAe;AAAA,EACtB;AAAA,EACA,MAAM,GAAQ,GAAU,GAAe,GAAe;AACpD,UAAM,IAAkB,KAAiB,KAAK,mBAAmB,CAAM,GACjE,IAAkB,KAAiB,KAAK,mBAAmB,CAAM;AACvE,QAAI,IAAK,EAAgB,IAAI,CAAQ;AACrC,WAAK,MACH,IAAK,KAAK,aAAa,GACvB,EAAgB,IAAI,GAAU,CAAE,GAChC,EAAgB,IAAI,GAAI,CAAQ,IAE3B;AAAA,EACT;AAAA,EACA,OAAO,GAAQ,GAAU;AACvB,UAAM,IAAkB,KAAK,mBAAmB,CAAM,GAChD,IAAkB,KAAK,mBAAmB,CAAM;AACtD,WAAO,EAAS,IAAA,CACb,MAAO,KAAK,MAAM,GAAQ,GAAI,GAAiB,CAAe,CACjE;AAAA,EACF;AAAA,EACA,YAAY,GAAQ,GAAI,GAAK;AAC3B,UAAM,IAAkB,KAAO,KAAK,mBAAmB,CAAM;AAC7D,QAAI,OAAO,KAAO,SAAU,QAAO;AACnC,UAAM,IAAW,EAAgB,IAAI,CAAE;AACvC,WAAK,KAAiB;AAAA,EAExB;AAAA,EACA,aAAa,GAAQ,GAAK;AACxB,UAAM,IAAkB,KAAK,mBAAmB,CAAM;AACtD,WAAO,EAAI,IAAA,CAAK,MAAO,KAAK,YAAY,GAAQ,GAAI,CAAe,CAAC;AAAA,EACtE;AAAA,EACA,MAAM,GAAQ;AACZ,QAAI,CAAC,GAAQ;AACX,WAAK,wBAAwC,oBAAI,QAAQ,GACzD,KAAK,wBAAwC,oBAAI,QAAQ;AACzD;AAAA,IACF;AACA,SAAK,sBAAsB,OAAO,CAAM,GACxC,KAAK,sBAAsB,OAAO,CAAM;AAAA,EAC1C;AAAA,EACA,mBAAmB,GAAQ;AACzB,QAAI,IAAkB,KAAK,sBAAsB,IAAI,CAAM;AAC3D,WAAK,MACH,IAAkC,oBAAI,IAAI,GAC1C,KAAK,sBAAsB,IAAI,GAAQ,CAAe,IAEjD;AAAA,EACT;AAAA,EACA,mBAAmB,GAAQ;AACzB,QAAI,IAAkB,KAAK,sBAAsB,IAAI,CAAM;AAC3D,WAAK,MACH,IAAkC,oBAAI,IAAI,GAC1C,KAAK,sBAAsB,IAAI,GAAQ,CAAe,IAEjD;AAAA,EACT;AACF,GACM,KAAN,MAAoB;AAAA,EAClB,YAAY,GAAS;AACnB,IAAA,EAAc,MAAM,WAA2B,oBAAI,QAAQ,CAAC,GAC5D,EAAc,MAAM,wBAAwC,oBAAI,QAAQ,CAAC,GACzE,EAAc,MAAM,2BAA2B,IAAI,GAAwB,EAAK,CAAC,GACjF,EAAc,MAAM,8BAA8B,GAClD,EAAc,MAAM,8BAA8C,oBAAI,QAAQ,CAAC,GAC/E,EAAc,MAAM,QAAQ,GAC5B,EAAc,MAAM,YAAY,GAChC,EAAc,MAAM,aAAa,GACjC,EAAc,MAAM,cAAc,GAClC,EAAc,MAAM,mBAAmB,GACvC,EAAc,MAAM,0BAA0B,GAC9C,KAAK,aAAa,EAAQ,YAC1B,KAAK,cAAc,EAAQ,aAC3B,KAAK,oBAAoB,EAAQ,mBACjC,KAAK,2BAA2B,EAAQ,0BACxC,KAAK,+BAA+B,IAAI,GACtC,KAAK,kBAAkB,YAAY,WAAW,KAC5C,KAAK,kBAAkB,WACzB,CACF,GACA,KAAK,SAAS,EAAQ,QAClB,KAAK,4BACP,OAAO,iBAAiB,WAAW,KAAK,cAAc,KAAK,IAAI,CAAC;AAAA,EAEpE;AAAA,EACA,UAAU,GAAU;AAClB,SAAK,QAAQ,IAAI,GAAU,EAAI,GAC3B,EAAS,iBACX,KAAK,qBAAqB,IAAI,EAAS,eAAe,CAAQ;AAAA,EAClE;AAAA,EACA,gBAAgB,GAAI;AAClB,SAAK,eAAe;AAAA,EACtB;AAAA,EACA,aAAa,GAAU,GAAS;AAC9B,QAAI,GAAK;AACT,SAAK,WAAW;AAAA,MACd,MAAM,CACJ;AAAA,QACE,UAAU,KAAK,OAAO,MAAM,CAAQ;AAAA,QACpC,QAAQ;AAAA,QACR,MAAM;AAAA,MACR,CACF;AAAA,MACA,SAAS,CAAC;AAAA,MACV,OAAO,CAAC;AAAA,MACR,YAAY,CAAC;AAAA,MACb,gBAAgB;AAAA,IAClB,CAAC,GACG,KAAK,8BACN,IAAM,EAAS,kBAAkB,QAAgB,EAAI,iBACpD,WACA,KAAK,cAAc,KAAK,IAAI,CAC9B,KACD,IAAK,KAAK,iBAAiB,QAAgB,EAAG,KAAK,MAAM,CAAQ,GAC9D,EAAS,mBAAmB,EAAS,gBAAgB,sBAAsB,EAAS,gBAAgB,mBAAmB,SAAS,KAClI,KAAK,kBAAkB,iBACrB,EAAS,gBAAgB,oBACzB,KAAK,OAAO,MAAM,EAAS,eAAe,CAC5C;AAAA,EACJ;AAAA,EACA,cAAc,GAAS;AACrB,UAAM,IAA0B;AAKhC,QAJI,EAAwB,KAAK,SAAS,WAC1C,EAAwB,WAAW,EAAwB,KAAK,UAG5D,CADuB,EAAQ,OACV;AACzB,UAAM,IAAW,KAAK,qBAAqB,IAAI,EAAQ,MAAM;AAC7D,QAAI,CAAC,EAAU;AACf,UAAM,IAAmB,KAAK,0BAC5B,GACA,EAAwB,KAAK,KAC/B;AACA,IAAI,KACF,KAAK,YACH,GACA,EAAwB,KAAK,UAC/B;AAAA,EACJ;AAAA,EACA,0BAA0B,GAAU,GAAG;AACrC,QAAI;AACJ,YAAQ,EAAE,MAAV;AAAA,MACE,KAAKA,EAAU,cAAc;AAC3B,aAAK,wBAAwB,MAAM,CAAQ,GAC3C,KAAK,6BAA6B,MAAM,CAAQ,GAChD,KAAK,gBAAgB,EAAE,KAAK,MAAM,CAAQ;AAC1C,cAAM,IAAS,EAAE,KAAK,KAAK;AAC3B,oBAAK,2BAA2B,IAAI,GAAU,CAAM,GACpD,KAAK,kBAAkB,EAAE,KAAK,MAAM,CAAM,GACnC;AAAA,UACL,WAAW,EAAE;AAAA,UACb,MAAMA,EAAU;AAAA,UAChB,MAAM;AAAA,YACJ,QAAQ,EAAkB;AAAA,YAC1B,MAAM,CACJ;AAAA,cACE,UAAU,KAAK,OAAO,MAAM,CAAQ;AAAA,cACpC,QAAQ;AAAA,cACR,MAAM,EAAE,KAAK;AAAA,YACf,CACF;AAAA,YACA,SAAS,CAAC;AAAA,YACV,OAAO,CAAC;AAAA,YACR,YAAY,CAAC;AAAA,YACb,gBAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAKA,EAAU;AAAA,MACf,KAAKA,EAAU;AAAA,MACf,KAAKA,EAAU;AACb,eAAO;AAAA,MAET,KAAKA,EAAU;AACb,eAAO;AAAA,MAET,KAAKA,EAAU;AACb,oBAAK,WACH,EAAE,KAAK,SACP,GACA;AAAA,UAAC;AAAA,UAAM;AAAA,UAAY;AAAA,UAAc;AAAA,QAAQ,CAC3C,GACO;AAAA,MAET,KAAKA,EAAU;AACb,gBAAQ,EAAE,KAAK,QAAf;AAAA,UACE,KAAK,EAAkB;AACrB,mBAAA,EAAE,KAAK,KAAK,QAAA,CAAS,MAAM;AACzB,mBAAK,WAAW,GAAG,GAAU;AAAA,gBAC3B;AAAA,gBACA;AAAA,gBACA;AAAA,cACF,CAAC,GACD,KAAK,gBAAgB,EAAE,MAAM,CAAQ;AACrC,oBAAM,IAAS,KAAK,2BAA2B,IAAI,CAAQ;AAC3D,cAAA,KAAU,KAAK,kBAAkB,EAAE,MAAM,CAAM;AAAA,YACjD,CAAC,GACD,EAAE,KAAK,QAAQ,QAAA,CAAS,MAAM;AAC5B,mBAAK,WAAW,GAAG,GAAU,CAAC,YAAY,IAAI,CAAC;AAAA,YACjD,CAAC,GACD,EAAE,KAAK,WAAW,QAAA,CAAS,MAAM;AAC/B,mBAAK,WAAW,GAAG,GAAU,CAAC,IAAI,CAAC;AAAA,YACrC,CAAC,GACD,EAAE,KAAK,MAAM,QAAA,CAAS,MAAM;AAC1B,mBAAK,WAAW,GAAG,GAAU,CAAC,IAAI,CAAC;AAAA,YACrC,CAAC,GACM;AAAA,UAET,KAAK,EAAkB;AAAA,UACvB,KAAK,EAAkB;AAAA,UACvB,KAAK,EAAkB;AACrB,mBAAA,EAAE,KAAK,UAAU,QAAA,CAAS,MAAM;AAC9B,mBAAK,WAAW,GAAG,GAAU,CAAC,IAAI,CAAC;AAAA,YACrC,CAAC,GACM;AAAA,UAET,KAAK,EAAkB;AACrB,mBAAO;AAAA,UAET,KAAK,EAAkB;AAAA,UACvB,KAAK,EAAkB;AAAA,UACvB,KAAK,EAAkB;AAAA,UACvB,KAAK,EAAkB;AAAA,UACvB,KAAK,EAAkB;AACrB,wBAAK,WAAW,EAAE,MAAM,GAAU,CAAC,IAAI,CAAC,GACjC;AAAA,UAET,KAAK,EAAkB;AAAA,UACvB,KAAK,EAAkB;AACrB,wBAAK,WAAW,EAAE,MAAM,GAAU,CAAC,IAAI,CAAC,GACxC,KAAK,gBAAgB,EAAE,MAAM,GAAU,CAAC,SAAS,CAAC,GAC3C;AAAA,UAET,KAAK,EAAkB;AACrB,mBAAO;AAAA,UAET,KAAK,EAAkB;AACrB,mBAAA,EAAE,KAAK,OAAO,QAAA,CAAS,MAAU;AAC/B,mBAAK,WAAW,GAAO,GAAU,CAAC,SAAS,KAAK,CAAC;AAAA,YACnD,CAAC,GACM;AAAA,UAET,KAAK,EAAkB;AACrB,wBAAK,WAAW,EAAE,MAAM,GAAU,CAAC,IAAI,CAAC,GACxC,KAAK,gBAAgB,EAAE,MAAM,GAAU,CAAC,UAAU,CAAC,IAClD,IAAM,EAAE,KAAK,WAAW,QAAgB,EAAI,QAAA,CAAS,MAAU;AAC9D,mBAAK,gBAAgB,GAAO,GAAU,CAAC,SAAS,CAAC;AAAA,YACnD,CAAC,GACM;AAAA,QAEX;AAAA,IAEJ;AACA,WAAO;AAAA,EACT;AAAA,EACA,QAAQ,GAAc,GAAK,GAAU,GAAM;AACzC,eAAW,KAAO;AAChB,MAAI,CAAC,MAAM,QAAQ,EAAI,CAAA,CAAI,KAAK,OAAO,EAAI,CAAA,KAAS,aAChD,MAAM,QAAQ,EAAI,CAAA,CAAI,IACxB,EAAI,CAAA,IAAO,EAAa,OACtB,GACA,EAAI,CAAA,CACN,IAEA,EAAI,CAAA,IAAO,EAAa,MAAM,GAAU,EAAI,CAAA,CAAI;AAGpD,WAAO;AAAA,EACT;AAAA,EACA,WAAW,GAAK,GAAU,GAAM;AAC9B,WAAO,KAAK,QAAQ,KAAK,yBAAyB,GAAK,GAAU,CAAI;AAAA,EACvE;AAAA,EACA,gBAAgB,GAAK,GAAU,GAAM;AACnC,WAAO,KAAK,QAAQ,KAAK,8BAA8B,GAAK,GAAU,CAAI;AAAA,EAC5E;AAAA,EACA,gBAAgB,GAAM,GAAU;AAC9B,SAAK,WAAW,GAAM,GAAU,CAAC,MAAM,QAAQ,CAAC,GAC5C,gBAAgB,KAClB,EAAK,WAAW,QAAA,CAAS,MAAU;AACjC,WAAK,gBAAgB,GAAO,CAAQ;AAAA,IACtC,CAAC;AAAA,EAEL;AAAA,EACA,kBAAkB,GAAM,GAAQ;AAC9B,IAAI,EAAK,SAAS,EAAS,YAAY,CAAC,EAAK,WAAQ,EAAK,SAAS,IAC/D,gBAAgB,KAClB,EAAK,WAAW,QAAA,CAAS,MAAU;AACjC,WAAK,kBAAkB,GAAO,CAAM;AAAA,IACtC,CAAC;AAAA,EAEL;AACF,GACM,KAAN,MAAuB;AAAA,EACrB,YAAY,GAAS;AACnB,IAAA,EAAc,MAAM,cAA8B,oBAAI,QAAQ,CAAC,GAC/D,EAAc,MAAM,YAAY,GAChC,EAAc,MAAM,UAAU,GAC9B,EAAc,MAAM,eAAe,GACnC,EAAc,MAAM,QAAQ,GAC5B,EAAc,MAAM,mBAAmB,CAAC,CAAC,GACzC,KAAK,aAAa,EAAQ,YAC1B,KAAK,WAAW,EAAQ,UACxB,KAAK,gBAAgB,EAAQ,eAC7B,KAAK,SAAS,EAAQ,QACtB,KAAK,KAAK;AAAA,EACZ;AAAA,EACA,OAAO;AACL,SAAK,MAAM,GACX,KAAK,kBAAkB,SAAS,QAAQ;AAAA,EAC1C;AAAA,EACA,cAAc,GAAa,GAAK;AAE9B,QADI,CAAC,GAAkB,CAAW,KAC9B,KAAK,WAAW,IAAI,CAAW,EAAG;AACtC,SAAK,WAAW,IAAI,CAAW;AAC/B,UAAM,CAAC,CAAA,IAAY,GACjB;AAAA,MACE,GAAG,KAAK;AAAA,MACR,KAAA;AAAA,MACA,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,MACb,kBAAkB;AAAA,IACpB,GACA,CACF;AACA,SAAK,gBAAgB,KAAA,MAAW,EAAS,WAAW,CAAC,GACrD,KAAK,gBAAgB,KACnB,GAAmB;AAAA,MACjB,GAAG,KAAK;AAAA,MACR,UAAU,KAAK;AAAA,MAGf,KAAK;AAAA,MACL,QAAQ,KAAK;AAAA,IACf,CAAC,CACH,GACA,WAAA,MAAiB;AACf,MAAI,EAAY,sBAAsB,EAAY,mBAAmB,SAAS,KAC5E,KAAK,cAAc,kBAAkB,iBACnC,EAAY,oBACZ,KAAK,OAAO,MAAM,EAAM,KAAK,CAAW,CAAC,CAC3C,GACF,KAAK,gBAAgB,KACnB,GACE;AAAA,QACE,QAAQ,KAAK;AAAA,QACb,mBAAmB,KAAK,cAAc;AAAA,MACxC,GACA,CACF,CACF;AAAA,IACF,GAAG,CAAC;AAAA,EACN;AAAA,EAIA,oBAAoB,GAAe;AACjC,IAAI,CAAC,EAAc,iBAAiB,CAAC,EAAc,mBACnD,KAAK,kBACH,EAAc,cAAc,SAC5B,EAAc,eAChB;AAAA,EACF;AAAA,EAIA,kBAAkB,GAAS,GAAK;AAC9B,UAAM,IAAU;AAChB,SAAK,gBAAgB,KACnB,GACE,EAAQ,WACR,gBACA,SAAS,GAAU;AACjB,aAAO,SAAS,GAAQ;AACtB,cAAM,IAAQ,EAAS,KAAK,MAAM,CAAM,GAClC,IAAe,EAAM,WAAW,IAAI;AAC1C,eAAI,KAAgB,GAAM,IAAI,KAC5B,EAAQ,cAAc,GAAc,CAAG,GAClC;AAAA,MACT;AAAA,IACF,CACF,CACF;AAAA,EACF;AAAA,EACA,QAAQ;AACN,SAAK,gBAAgB,QAAA,CAAS,MAAY;AACxC,UAAI;AACF,QAAA,EAAQ;AAAA,MACV,QAAY;AAAA,MACZ;AAAA,IACF,CAAC,GACD,KAAK,kBAAkB,CAAC,GACxB,KAAK,aAA6B,oBAAI,QAAQ;AAAA,EAChD;AACF,GACI,KAAQ,oEACR,KAAS,OAAO,cAAe,cAAc,CAAC,IAAI,oBAAI,WAAW,GAAG;AACxE,SAAS,KAAI,GAAG,KAAI,GAAM,QAAQ,KAChC,CAAA,GAAO,GAAM,WAAW,EAAC,CAAA,IAAK;AAEhC,IAAI,KAAS,SAAS,GAAa;AACjC,MAAI,IAAQ,IAAI,WAAW,CAAW,GAAG,GAAG,IAAM,EAAM,QAAQ,IAAS;AACzE,OAAK,IAAI,GAAG,IAAI,GAAK,KAAK;AACxB,IAAA,KAAU,GAAM,EAAM,CAAA,KAAM,CAAA,GAC5B,KAAU,IAAO,EAAM,CAAA,IAAK,MAAM,IAAI,EAAM,IAAI,CAAA,KAAM,CAAA,GACtD,KAAU,IAAO,EAAM,IAAI,CAAA,IAAK,OAAO,IAAI,EAAM,IAAI,CAAA,KAAM,CAAA,GAC3D,KAAU,GAAM,EAAM,IAAI,CAAA,IAAK,EAAA;AAEjC,SAAI,IAAM,MAAM,IACd,IAAS,EAAO,UAAU,GAAG,EAAO,SAAS,CAAC,IAAI,MACzC,IAAM,MAAM,MACrB,IAAS,EAAO,UAAU,GAAG,EAAO,SAAS,CAAC,IAAI,OAE7C;AACT,GACM,KAA+B,oBAAI,IAAI;AAC7C,SAAS,GAAgB,GAAK,GAAM;AAClC,MAAI,IAAa,GAAa,IAAI,CAAG;AACrC,SAAK,MACH,IAA6B,oBAAI,IAAI,GACrC,GAAa,IAAI,GAAK,CAAU,IAE7B,EAAW,IAAI,CAAI,KACtB,EAAW,IAAI,GAAM,CAAC,CAAC,GAElB,EAAW,IAAI,CAAI;AAC5B;AACA,IAAM,KAAA,CAAgB,GAAO,GAAK,MAAQ;AACxC,MAAI,CAAC,KAAS,EAAE,GAAwB,GAAO,CAAG,KAAK,OAAO,KAAU,UACtE;AACF,QAAM,IAAO,EAAM,YAAY,MACzB,IAAO,GAAgB,GAAK,CAAI;AACtC,MAAI,IAAS,EAAK,QAAQ,CAAK;AAC/B,SAAI,MAAW,OACb,IAAS,EAAK,QACd,EAAK,KAAK,CAAK,IAEV;AACT;AACA,SAAS,GAAa,GAAO,GAAK,GAAK;AACrC,MAAI,aAAiB,MACnB,QAAO,EAAM,IAAA,CAAK,MAAQ,GAAa,GAAK,GAAK,CAAG,CAAC;AAChD,MAAI,MAAU,KACnB,QAAO;AACF,MAAI,aAAiB,gBAAgB,aAAiB,gBAAgB,aAAiB,cAAc,aAAiB,eAAe,aAAiB,cAAc,aAAiB,eAAe,aAAiB,cAAc,aAAiB,aAAa,aAAiB,kBAEvR,QAAO;AAAA,IACL,SAFW,EAAM,YAAY;AAAA,IAG7B,MAAM,CAAC,OAAO,OAAO,CAAK,CAAC;AAAA,EAC7B;AACK,MAIL,aAAiB,YAIjB,QAAO;AAAA,IACL,SAHW,EAAM,YAAY;AAAA,IAI7B,QAHa,GAAO,CAGf;AAAA,EACP;AACK,MAAI,aAAiB,SAE1B,QAAO;AAAA,IACL,SAFW,EAAM,YAAY;AAAA,IAG7B,MAAM;AAAA,MACJ,GAAa,EAAM,QAAQ,GAAK,CAAG;AAAA,MACnC,EAAM;AAAA,MACN,EAAM;AAAA,IACR;AAAA,EACF;AACK,MAAI,aAAiB,kBAAkB;AAC5C,UAAM,IAAO,EAAM,YAAY,MACzB,EAAE,KAAA,EAAA,IAAQ;AAChB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,KAAA;AAAA,IACF;AAAA,EACF,OAAO;AAAA,QAAI,aAAiB,kBAG1B,QAAO;AAAA,MACL,SAAS;AAAA,MACT,KAHU,EAAM,UAGd;AAAA,IACJ;AACK,QAAI,aAAiB,UAE1B,QAAO;AAAA,MACL,SAFW,EAAM,YAAY;AAAA,MAG7B,MAAM;AAAA,QAAC,GAAa,EAAM,MAAM,GAAK,CAAG;AAAA,QAAG,EAAM;AAAA,QAAO,EAAM;AAAA,MAAM;AAAA,IACtE;AACK,QAAI,GAAwB,GAAO,CAAG,KAAK,OAAO,KAAU,SAGjE,QAAO;AAAA,MACL,SAHW,EAAM,YAAY;AAAA,MAI7B,OAHa,GAAa,GAAO,GAAK,CAG1B;AAAA,IACd;AAAA;AAEF,SAAO;AACT;AACA,IAAM,KAAA,CAAiB,GAAM,GAAK,MACzB,EAAK,IAAA,CAAK,MAAQ,GAAa,GAAK,GAAK,CAAG,CAAC,GAEhD,KAAA,CAA2B,GAAO,MAkB/B,EAHgC;AAAA,EAbrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAEyD,EAAE,OAAA,CAC1D,MAAS,OAAO,EAAI,CAAA,KAAU,UACjC,EAEiC,KAAA,CAC5B,MAAS,aAAiB,EAAI,CAAA,CACjC;AAGJ,SAAS,GAA6B,GAAI,GAAK,GAAY,GAAe;AACxE,QAAM,IAAW,CAAC,GACZ,IAAU,OAAO,oBACrB,EAAI,yBAAyB,SAC/B;AACA,aAAW,KAAQ,EACjB,KAAI;AACF,QAAI,OAAO,EAAI,yBAAyB,UAAU,CAAA,KAAU,WAC1D;AAEF,UAAM,IAAiB,GACrB,EAAI,yBAAyB,WAC7B,GACA,SAAS,GAAU;AACjB,aAAO,YAAY,GAAM;AACvB,eAAK,EAAU,KAAK,QAAQ,GAAY,GAAe,EAAI,KACzD,WAAA,MAAiB;AACf,gBAAM,IAAa,GAAc,GAAM,GAAK,IAAI;AAChD,UAAA,EAAG,KAAK,QAAQ;AAAA,YACd,MAAM,GAAc,IAAA;AAAA,YACpB,UAAU;AAAA,YACV,MAAM;AAAA,UACR,CAAC;AAAA,QACH,GAAG,CAAC,GAEC,EAAS,MAAM,MAAM,CAAI;AAAA,MAClC;AAAA,IACF,CACF;AACA,IAAA,EAAS,KAAK,CAAc;AAAA,EAC9B,QAAQ;AACN,UAAM,IAAc,GAClB,EAAI,yBAAyB,WAC7B,GACA,EACE,IAAI,GAAG;AACL,MAAA,EAAG,KAAK,QAAQ;AAAA,QACd,MAAM,GAAc,IAAA;AAAA,QACpB,UAAU;AAAA,QACV,MAAM,CAAC,CAAC;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,EACF,CACF;AACA,IAAA,EAAS,KAAK,CAAW;AAAA,EAC3B;AAEF,SAAA,MAAa;AACX,IAAA,EAAS,QAAA,CAAS,MAAM,EAAE,CAAC;AAAA,EAC7B;AACF;AACA,SAAS,GAAyB,GAAa;AAC7C,SAAO,MAAgB,uBAAuB,UAAU;AAC1D;AACA,SAAS,GAA0B,GAAK,GAAY,GAAe,GAAgC;AACjG,QAAM,IAAW,CAAC;AAClB,MAAI;AACF,UAAM,IAAiB,GACrB,EAAI,kBAAkB,WACtB,cACA,SAAS,GAAU;AACjB,aAAO,SAAS,MAAgB,GAAM;AACpC,YAAI,CAAC,EAAU,MAAM,GAAY,GAAe,EAAI,GAAG;AACrD,gBAAM,IAAU,GAAyB,CAAW;AAEpD,cADM,eAAe,SAAO,KAAK,YAAY,IACzC,KAAkC,CAAC,SAAS,QAAQ,EAAE,SAAS,CAAO;AACxE,gBAAI,EAAK,CAAA,KAAM,OAAO,EAAK,CAAA,KAAO,UAAU;AAC1C,oBAAM,IAAoB,EAAK,CAAA;AAC/B,cAAK,EAAkB,0BACrB,EAAkB,wBAAwB;AAAA,YAE9C,MACE,CAAA,EAAK,OAAO,GAAG,GAAG,EAChB,uBAAuB,GACzB,CAAC;AAAA,QAGP;AACA,eAAO,EAAS,MAAM,MAAM,CAAC,GAAa,GAAG,CAAI,CAAC;AAAA,MACpD;AAAA,IACF,CACF;AACA,IAAA,EAAS,KAAK,CAAc;AAAA,EAC9B,QAAQ;AACN,YAAQ,MAAM,wDAAwD;AAAA,EACxE;AACA,SAAA,MAAa;AACX,IAAA,EAAS,QAAA,CAAS,MAAM,EAAE,CAAC;AAAA,EAC7B;AACF;AACA,SAAS,GAAiB,GAAW,GAAM,GAAI,GAAY,GAAe,GAAK;AAC7E,QAAM,IAAW,CAAC,GACZ,IAAQ,OAAO,oBAAoB,CAAS;AAClD,aAAW,KAAQ;AACjB,QAEE;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,SAAS,CAAI;AAIjB,UAAI;AACF,YAAI,OAAO,EAAU,CAAA,KAAU,WAC7B;AAEF,cAAM,IAAiB,GACrB,GACA,GACA,SAAS,GAAU;AACjB,iBAAO,YAAY,GAAM;AACvB,kBAAM,IAAS,EAAS,MAAM,MAAM,CAAI;AAExC,gBADA,GAAa,GAAQ,GAAK,IAAI,GAC1B,aAAa,KAAK,UAAU,CAAC,EAAU,KAAK,QAAQ,GAAY,GAAe,EAAI,GAAG;AACxF,oBAAM,IAAa,GAAc,GAAM,GAAK,IAAI,GAC1C,IAAW;AAAA,gBACf,MAAA;AAAA,gBACA,UAAU;AAAA,gBACV,MAAM;AAAA,cACR;AACA,cAAA,EAAG,KAAK,QAAQ,CAAQ;AAAA,YAC1B;AACA,mBAAO;AAAA,UACT;AAAA,QACF,CACF;AACA,QAAA,EAAS,KAAK,CAAc;AAAA,MAC9B,QAAQ;AACN,cAAM,IAAc,GAAW,GAAW,GAAM,EAC9C,IAAI,GAAG;AACL,UAAA,EAAG,KAAK,QAAQ;AAAA,YACd,MAAA;AAAA,YACA,UAAU;AAAA,YACV,MAAM,CAAC,CAAC;AAAA,YACR,QAAQ;AAAA,UACV,CAAC;AAAA,QACH,EACF,CAAC;AACD,QAAA,EAAS,KAAK,CAAW;AAAA,MAC3B;AAEF,SAAO;AACT;AACA,SAAS,GAAgC,GAAI,GAAK,GAAY,GAAe;AAC3E,QAAM,IAAW,CAAC;AAClB,SAAI,OAAO,EAAI,yBAA0B,eACvC,EAAS,KACP,GAAG,GACD,EAAI,sBAAsB,WAC1B,GAAc,OACd,GACA,GACA,GACA,CACF,CACF,GAEE,OAAO,EAAI,0BAA2B,eACxC,EAAS,KACP,GAAG,GACD,EAAI,uBAAuB,WAC3B,GAAc,QACd,GACA,GACA,GACA,CACF,CACF,GAEF,MAAa;AACX,IAAA,EAAS,QAAA,CAAS,MAAM,EAAE,CAAC;AAAA,EAC7B;AACF;AACA,IAAM,KAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GACZ,KAAO,OAAO,QAAS,eAAe,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAS,GAAG,EAAE,MAAM,gCAAgC,CAAC;AACxH,SAAS,GAAc,GAAS;AAC9B,MAAI;AACJ,MAAI;AAEF,QADA,IAAS,OAAS,KAAK,OAAO,KAAK,WAAW,gBAAgB,EAAI,GAC9D,CAAC,EAAQ,OAAM;AACnB,UAAM,IAAS,IAAI,OAAO,GAAQ,EAChC,MAAM,KAAW,OAAO,SAAS,EAAQ,KAC3C,CAAC;AACD,WAAA,EAAO,iBAAiB,SAAA,MAAe;AACrC,OAAC,KAAK,OAAO,KAAK,WAAW,gBAAgB,CAAM;AAAA,IACrD,CAAC,GACM;AAAA,EACT,QAAY;AACV,WAAO,IAAI,OACT,wCAAwC,mBAAmB,EAAS,GACpE,EACE,MAAM,KAAW,OAAO,SAAS,EAAQ,KAC3C,CACF;AAAA,EACF,UAAA;AACE,IAAA,MAAW,KAAK,OAAO,KAAK,WAAW,gBAAgB,CAAM;AAAA,EAC/D;AACF;AACA,IAAM,KAAN,MAAoB;AAAA,EAClB,YAAY,GAAS;AACnB,IAAA,EAAc,MAAM,0BAA0C,oBAAI,IAAI,CAAC,GACvE,EAAc,MAAM,aAAa;AAAA,MAAE,UAAU;AAAA,MAAG,UAAU;AAAA,IAAK,CAAC,GAChE,EAAc,MAAM,QAAQ,GAC5B,EAAc,MAAM,YAAY,GAChC,EAAc,MAAM,gBAAgB,GACpC,EAAc,MAAM,UAAU,EAAK,GACnC,EAAc,MAAM,UAAU,EAAK,GACnC,EAAc,MAAM,mBAAA,CAAoB,GAAQ,MAAa;AAE3D,OADiB,KAAK,UAAU,YAAY,KAAK,UAAU,aAAa,KAAK,UAAU,YACvE,CAAC,KAAK,UAAU,cAC9B,KAAK,UAAU,WAAW,KAAK,UAAU,WACtC,KAAK,uBAAuB,IAAI,CAAM,KACzC,KAAK,uBAAuB,IAAI,GAAQ,CAAC,CAAC,GAE5C,KAAK,uBAAuB,IAAI,CAAM,EAAE,KAAK,CAAQ;AAAA,IACvD,CAAC;AACD,UAAM,EACJ,UAAA,IAAW,OACX,KAAA,GACA,YAAA,GACA,eAAA,GACA,cAAA,GACA,gBAAA,EAAA,IACE;AACJ,SAAK,aAAa,EAAQ,YAC1B,KAAK,SAAS,EAAQ,QAClB,KAAgB,MAAa,SAC/B,KAAK,2BAA2B,GAAK,GAAY,CAAa,GAC5D,KAAgB,OAAO,KAAa,YACtC,KAAK,sBAAsB,GAAU,GAAK,GAAY,GAAe,EACnE,gBAAA,EACF,CAAC;AAAA,EACL;AAAA,EACA,QAAQ;AACN,SAAK,uBAAuB,MAAM,GAClC,KAAK,kBAAkB,KAAK,eAAe;AAAA,EAC7C;AAAA,EACA,SAAS;AACP,SAAK,SAAS;AAAA,EAChB;AAAA,EACA,WAAW;AACT,SAAK,SAAS;AAAA,EAChB;AAAA,EACA,OAAO;AACL,SAAK,SAAS;AAAA,EAChB;AAAA,EACA,SAAS;AACP,SAAK,SAAS;AAAA,EAChB;AAAA,EACA,sBAAsB,GAAK,GAAK,GAAY,GAAe,GAAS;AAClE,UAAM,IAAqB,GACzB,GACA,GACA,GACA,EACF,GACM,IAAwC,oBAAI,IAAI,GAChD,IAAS,IAAI,GAAc;AACjC,IAAA,EAAO,YAAA,CAAa,MAAM;AACxB,YAAM,EAAE,IAAA,EAAA,IAAO,EAAE;AAEjB,UADA,EAAsB,IAAI,GAAI,EAAK,GAC/B,EAAE,YAAY,EAAE,MAAO;AAC3B,YAAM,EAAE,QAAA,GAAQ,MAAA,GAAM,OAAA,GAAO,QAAA,EAAA,IAAW,EAAE;AAC1C,WAAK,WAAW;AAAA,QACd,IAAA;AAAA,QACA,MAAM,GAAc,IAAA;AAAA,QACpB,UAAU,CACR;AAAA,UACE,UAAU;AAAA,UAEV,MAAM;AAAA,YAAC;AAAA,YAAG;AAAA,YAAG;AAAA,YAAO;AAAA,UAAM;AAAA,QAC5B,GACA;AAAA,UACE,UAAU;AAAA,UAEV,MAAM;AAAA,YACJ;AAAA,cACE,SAAS;AAAA,cACT,MAAM,CACJ;AAAA,gBACE,SAAS;AAAA,gBACT,MAAM,CAAC;AAAA,kBAAE,SAAS;AAAA,kBAAe,QAAA;AAAA,gBAAO,CAAC;AAAA,gBACzC,MAAA;AAAA,cACF,CACF;AAAA,YACF;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,CACF;AAAA,MACF,CAAC;AAAA,IACH;AACA,UAAM,IAAuB,MAAM;AACnC,QAAI,IAAmB,GACnB;AACJ,UAAM,IAAA,MAAkB;AACtB,YAAM,IAAgB,CAAC;AACvB,aAAA,EAAI,SAAS,iBAAiB,QAAQ,EAAE,QAAA,CAAS,MAAW;AAC1D,QAAK,EAAU,GAAQ,GAAY,GAAe,EAAI,KACpD,EAAc,KAAK,CAAM;AAAA,MAE7B,CAAC,GACM;AAAA,IACT,GACM,IAAA,CAAuB,MAAc;AACzC,UAAI,KAAoB,IAAY,IAAmB,GAAsB;AAC3E,QAAA,IAAQ,sBAAsB,CAAmB;AACjD;AAAA,MACF;AACA,MAAA,IAAmB,GACnB,EAAU,EAAE,QAAQ,OAAO,MAAW;AACpC,YAAI;AACJ,cAAM,IAAK,KAAK,OAAO,MAAM,CAAM;AAEnC,YADI,EAAsB,IAAI,CAAE,KAC5B,EAAO,UAAU,KAAK,EAAO,WAAW,EAAG;AAE/C,YADA,EAAsB,IAAI,GAAI,EAAI,GAC9B,CAAC,SAAS,QAAQ,EAAE,SAAS,EAAO,SAAS,GAAG;AAClD,gBAAM,IAAU,EAAO,WAAW,EAAO,SAAS;AAClD,YAAM,IAAM,KAAW,OAAO,SAAS,EAAQ,qBAAqB,MAAM,OAAO,SAAS,EAAI,2BAA2B,MACvH,EAAQ,MAAM,EAAQ,gBAAgB;AAAA,QAE1C;AACA,cAAM,IAAS,MAAM,kBAAkB,CAAM;AAC7C,QAAA,EAAO,YACL;AAAA,UACE,IAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAO,EAAO;AAAA,UACd,QAAQ,EAAO;AAAA,UACf,gBAAgB,EAAQ;AAAA,QAC1B,GACA,CAAC,CAAM,CACT;AAAA,MACF,CAAC,GACD,IAAQ,sBAAsB,CAAmB;AAAA,IACnD;AACA,IAAA,IAAQ,sBAAsB,CAAmB,GACjD,KAAK,iBAAA,MAAuB;AAC1B,MAAA,EAAmB,GACnB,qBAAqB,CAAK;AAAA,IAC5B;AAAA,EACF;AAAA,EACA,2BAA2B,GAAK,GAAY,GAAe;AACzD,SAAK,qBAAqB,GAC1B,KAAK,kCAAkC;AACvC,UAAM,IAAqB,GACzB,GACA,GACA,GACA,EACF,GACM,IAAgB,GACpB,KAAK,gBAAgB,KAAK,IAAI,GAC9B,GACA,GACA,CACF,GACM,IAAwB,GAC5B,KAAK,gBAAgB,KAAK,IAAI,GAC9B,GACA,GACA,CACF;AACA,SAAK,iBAAA,MAAuB;AAC1B,MAAA,EAAmB,GACnB,EAAc,GACd,EAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA,oCAAoC;AAClC,0BAAA,MAA4B,KAAK,4BAA4B,CAAC;AAAA,EAChE;AAAA,EACA,uBAAuB;AACrB,UAAM,IAAA,CAAyB,MAAc;AAC3C,WAAK,UAAU,WAAW,GAC1B,sBAAsB,CAAqB;AAAA,IAC7C;AACA,0BAAsB,CAAqB;AAAA,EAC7C;AAAA,EACA,8BAA8B;AAC5B,SAAK,uBAAuB,QAAA,CACzB,GAAS,MAAW;AACnB,YAAM,IAAK,KAAK,OAAO,MAAM,CAAM;AACnC,WAAK,8BAA8B,GAAQ,CAAE;AAAA,IAC/C,CACF,GACA,sBAAA,MAA4B,KAAK,4BAA4B,CAAC;AAAA,EAChE;AAAA,EACA,8BAA8B,GAAQ,GAAI;AACxC,QAAI,KAAK,UAAU,KAAK,OACtB;AAEF,UAAM,IAAiB,KAAK,uBAAuB,IAAI,CAAM;AAC7D,QAAI,CAAC,KAAkB,MAAO,GAAI;AAClC,UAAM,IAAS,EAAe,IAAA,CAAK,MAAU;AAC3C,YAAM,EAAE,MAAM,GAAO,GAAG,EAAA,IAAS;AACjC,aAAO;AAAA,IACT,CAAC,GACK,EAAE,MAAA,EAAA,IAAS,EAAe,CAAA;AAChC,SAAK,WAAW;AAAA,MAAE,IAAA;AAAA,MAAI,MAAA;AAAA,MAAM,UAAU;AAAA,IAAO,CAAC,GAC9C,KAAK,uBAAuB,OAAO,CAAM;AAAA,EAC3C;AACF,GACM,KAAN,MAAwB;AAAA,EACtB,YAAY,GAAS;AACnB,IAAA,EAAc,MAAM,uBAAuC,oBAAI,QAAQ,CAAC,GACxE,EAAc,MAAM,YAAY,GAChC,EAAc,MAAM,qBAAqB,GACzC,EAAc,MAAM,eAAe,IAAI,GAAiB,CAAC,GACzD,KAAK,aAAa,EAAQ,YAC1B,KAAK,sBAAsB,EAAQ;AAAA,EACrC;AAAA,EACA,kBAAkB,GAAQ,GAAS;AACjC,IAAI,cAAc,EAAQ,cACxB,KAAK,WAAW;AAAA,MACd,MAAM,CAAC;AAAA,MACP,SAAS,CAAC;AAAA,MACV,OAAO,CAAC;AAAA,MACR,YAAY,CACV;AAAA,QACE,IAAI,EAAQ;AAAA,QACZ,YAAY,EAAQ;AAAA,MACtB,CACF;AAAA,IACF,CAAC,GACH,KAAK,iBAAiB,CAAM;AAAA,EAC9B;AAAA,EACA,iBAAiB,GAAQ;AACvB,IAAI,KAAK,oBAAoB,IAAI,CAAM,MACvC,KAAK,oBAAoB,IAAI,CAAM,GACnC,KAAK,6BAA6B,CAAM;AAAA,EAC1C;AAAA,EACA,iBAAiB,GAAQ,GAAQ;AAC/B,QAAI,EAAO,WAAW,EAAG;AACzB,UAAM,IAAwB;AAAA,MAC5B,IAAI;AAAA,MACJ,UAAU,CAAC;AAAA,IACb,GACM,IAAS,CAAC;AAChB,eAAW,KAAS,GAAQ;AAC1B,UAAI;AACJ,MAAK,KAAK,YAAY,IAAI,CAAK,IASxB,IAAU,KAAK,YAAY,MAAM,CAAK,KAR3C,IAAU,KAAK,YAAY,IAAI,CAAK,GACpC,EAAO,KAAK;AAAA,QACV,SAAA;AAAA,QACA,OAAO,MAAM,KAAK,EAAM,SAAS,SAAA,CAAU,GAAG,OAAY;AAAA,UACxD,MAAM,GAAc,GAAG,EAAM,IAAI;AAAA,UACjC,OAAO;AAAA,QACT,EAAE;AAAA,MACJ,CAAC,IAEH,EAAsB,SAAS,KAAK,CAAO;AAAA,IAC7C;AACA,IAAI,EAAO,SAAS,MAAG,EAAsB,SAAS,IACtD,KAAK,oBAAoB,CAAqB;AAAA,EAChD;AAAA,EACA,QAAQ;AACN,SAAK,YAAY,MAAM,GACvB,KAAK,sBAAsC,oBAAI,QAAQ;AAAA,EACzD;AAAA,EAEA,6BAA6B,GAAS;AAAA,EACtC;AACF,GACM,KAAN,MAA2B;AAAA,EACzB,cAAc;AACZ,IAAA,EAAc,MAAM,WAA2B,oBAAI,QAAQ,CAAC,GAC5D,EAAc,MAAM,UAAU,EAAK;AAAA,EACrC;AAAA,EACA,cAAc,GAAM,GAAY;AAC9B,UAAM,IAAU,KAAK,QAAQ,IAAI,CAAI;AACrC,WAAO,KAAW,MAAM,KAAK,CAAO,EAAE,KAAA,CAAM,MAAW,MAAW,CAAU;AAAA,EAC9E;AAAA,EACA,IAAI,GAAM,GAAQ;AAChB,IAAK,KAAK,WACR,KAAK,SAAS,IACd,sBAAA,MAA4B;AAC1B,WAAK,UAA0B,oBAAI,QAAQ,GAC3C,KAAK,SAAS;AAAA,IAChB,CAAC,IAEH,KAAK,QAAQ,IAAI,IAAO,KAAK,QAAQ,IAAI,CAAI,KAAqB,oBAAI,IAAI,GAAG,IAAI,CAAM,CAAC;AAAA,EAC1F;AAAA,EACA,UAAU;AAAA,EACV;AACF,GACI,GACA,IACA,IACA,KAAY;AAChB,IAAI;AACF,MAAI,MAAM,KAAK,CAAC,CAAC,GAAA,CAAI,MAAM,IAAI,CAAC,EAAE,CAAA,MAAO,GAAG;AAC1C,UAAM,IAAa,SAAS,cAAc,QAAQ;AAClD,aAAS,KAAK,YAAY,CAAU,GACpC,MAAM,SAAS,KAAK,EAAW,kBAAkB,OAAO,SAAS,GAAG,MAAM,SAAS,MAAM,MACzF,SAAS,KAAK,YAAY,CAAU;AAAA,EACtC;AACF,SAAS,GAAK;AACZ,UAAQ,MAAM,iCAAiC,CAAG;AACpD;AACA,IAAM,KAAS,GAAa;AAC5B,SAAS,GAAO,IAAU,CAAC,GAAG;AAC5B,QAAM,EACJ,MAAA,GACA,kBAAA,GACA,kBAAA,GACA,YAAA,IAAa,YACb,eAAA,IAAgB,MAChB,aAAA,IAAc,aACd,gBAAA,IAAiB,MACjB,eAAA,IAAgB,WAChB,kBAAA,IAAmB,MACnB,kBAAA,IAAmB,IACnB,eAAA,GACA,kBAAkB,GAClB,gBAAgB,GAChB,aAAA,GACA,YAAA,GACA,OAAA,GACA,QAAA,GACA,UAAA,IAAW,CAAC,GACZ,gBAAA,IAAiB,CAAC,GAClB,eAAA,GACA,WAAA,IAAY,IACZ,cAAA,IAAe,IACf,0BAAA,IAA2B,IAC3B,aAAA,IAAc,EAAQ,gBAAgB,qBAAqB,EAAQ,cAAc,QACjF,sBAAA,IAAuB,IACvB,cAAA,IAAe,IACf,cAAA,IAAe,IACf,SAAA,GACA,iBAAA,IAAA,MAAwB,IACxB,qBAAA,KAAsC,oBAAI,IAAI,CAAC,CAAC,GAChD,cAAc,EAAA,IACZ;AACJ,EAAA,GAAqB,CAAa;AAClC,QAAM,IAAkB,IAA2B,OAAO,WAAW,SAAS;AAC9E,MAAI,IAAoB;AACxB,MAAI,CAAC,EACH,KAAI;AACF,IAAI,OAAO,OAAO,aAChB,IAAoB;AAAA,EAExB,QAAY;AACV,IAAA,IAAoB;AAAA,EACtB;AAEF,MAAI,KAAmB,CAAC,EACtB,OAAM,IAAI,MAAM,2BAA2B;AAE7C,MAAI,CAAC,KAAmB,CAAC,EACvB,QAAA,MAAa;AAAA,EACb;AAEF,EAAI,MAAkB,UAAU,EAAS,cAAc,WACrD,EAAS,YAAY,IAEvB,GAAO,MAAM;AACb,QAAM,IAAmB,MAAkB,KAAO;AAAA,IAChD,OAAO;AAAA,IACP,MAAM;AAAA,IACN,kBAAkB;AAAA,IAClB,OAAO;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,EACZ,IAAI,MAAsB,SAAS,IAAoB,EAAE,UAAU,GAAK,GAClE,IAAiB,GAAgB,CAAe;AACtD,EAAA,GAAS;AACT,MAAI,GACA,KAA2B;AAC/B,QAAM,KAAA,CAAkB,MAAM;AAC5B,eAAW,KAAU,KAAW,CAAC,EAC/B,CAAI,EAAO,mBACT,IAAI,EAAO,eAAe,CAAC;AAG/B,WAAI,KACJ,CAAC,MACC,IAAI,EAAO,CAAC,IAEP;AAAA,EACT;AACA,EAAA,IAAA,CAAe,GAAG,MAAe;AAC/B,QAAI;AACJ,UAAM,IAAI;AAKV,QAJA,EAAE,YAAY,GAAa,IACrB,IAAM,GAAgB,CAAA,MAAO,QAAgB,EAAI,SAAS,KAAM,EAAE,SAASA,EAAU,gBAAgB,EAAE,EAAE,SAASA,EAAU,uBAAuB,EAAE,KAAK,WAAW,EAAkB,aAC3L,GAAgB,QAAA,CAAS,MAAQ,EAAI,SAAS,CAAC,GAE7C,EACF,CAAA,KAAQ,QAAgB,EAAK,GAAe,CAAC,GAAG,CAAU;AAAA,aACjD,GAAmB;AAC5B,YAAM,IAAU;AAAA,QACd,MAAM;AAAA,QACN,OAAO,GAAe,CAAC;AAAA,QACvB,QAAQ,OAAO,SAAS;AAAA,QACxB,YAAA;AAAA,MACF;AACA,aAAO,OAAO,YAAY,GAAS,GAAG;AAAA,IACxC;AACA,QAAI,EAAE,SAASA,EAAU;AACvB,MAAA,IAAwB,GACxB,KAA2B;AAAA,aAClB,EAAE,SAASA,EAAU,qBAAqB;AACnD,UAAI,EAAE,KAAK,WAAW,EAAkB,YAAY,EAAE,KAAK,eACzD;AAEF,MAAA;AACA,YAAM,IAAc,KAAoB,MAA4B,GAC9D,IAAa,KAAoB,EAAE,YAAY,EAAsB,YAAY;AACvF,OAAI,KAAe,MACjB,GAAiB,EAAI;AAAA,IAEzB;AAAA,EACF;AACA,QAAM,KAAA,CAAuB,MAAM;AACjC,IAAA,EAAY;AAAA,MACV,MAAMA,EAAU;AAAA,MAChB,MAAM;AAAA,QACJ,QAAQ,EAAkB;AAAA,QAC1B,GAAG;AAAA,MACL;AAAA,IACF,CAAC;AAAA,EACH,GACM,KAAA,CAAqB,MAAM,EAAY;AAAA,IAC3C,MAAMA,EAAU;AAAA,IAChB,MAAM;AAAA,MACJ,QAAQ,EAAkB;AAAA,MAC1B,GAAG;AAAA,IACL;AAAA,EACF,CAAC,GACK,KAAA,CAA6B,MAAM,EAAY;AAAA,IACnD,MAAMA,EAAU;AAAA,IAChB,MAAM;AAAA,MACJ,QAAQ,EAAkB;AAAA,MAC1B,GAAG;AAAA,IACL;AAAA,EACF,CAAC,GACK,KAAA,CAAgC,MAAM,EAAY;AAAA,IACtD,MAAMA,EAAU;AAAA,IAChB,MAAM;AAAA,MACJ,QAAQ,EAAkB;AAAA,MAC1B,GAAG;AAAA,IACL;AAAA,EACF,CAAC,GACK,KAAoB,IAAI,GAAkB;AAAA,IAC9C,YAAY;AAAA,IACZ,qBAAqB;AAAA,EACvB,CAAC,GACK,KAAgB,IAAI,GAAc;AAAA,IACtC,QAAA;AAAA,IACA,YAAY;AAAA,IACZ,mBAAA;AAAA,IACA,0BAAA;AAAA,IACA,aAAA;AAAA,EACF,CAAC;AACD,aAAW,KAAU,KAAW,CAAC,EAC/B,CAAI,EAAO,aACT,EAAO,UAAU;AAAA,IACf,YAAY;AAAA,IACZ,yBAAyB,GAAc;AAAA,IACvC,8BAA8B,GAAc;AAAA,EAC9C,CAAC;AAEL,QAAM,KAAuB,IAAI,GAAqB;AACtD,EAAA,KAAgB,IAAI,GAAc;AAAA,IAChC,cAAA;AAAA,IACA,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,YAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAU,EAAS;AAAA,IACnB,gBAAA;AAAA,EACF,CAAC;AACD,QAAM,KAAmB,IAAI,GAAiB;AAAA,IAC5C,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,eAAe;AAAA,MACb,YAAA;AAAA,MACA,eAAA;AAAA,MACA,eAAA;AAAA,MACA,kBAAA;AAAA,MACA,kBAAA;AAAA,MACA,kBAAA;AAAA,MACA,gBAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,UAAA;AAAA,MACA,gBAAA;AAAA,MACA,eAAA;AAAA,MACA,mBAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,sBAAA;AAAA,IACF;AAAA,IACA,QAAA;AAAA,EACF,CAAC;AACD,EAAA,KAAA,CAAoB,IAAa,OAAU;AACzC,QAAI,CAAC,EACH;AAEF,IAAA,EACE;AAAA,MACE,MAAMA,EAAU;AAAA,MAChB,MAAM;AAAA,QACJ,MAAM,OAAO,SAAS;AAAA,QACtB,OAAO,GAAe;AAAA,QACtB,QAAQ,GAAgB;AAAA,MAC1B;AAAA,IACF,GACA,CACF,GACA,GAAkB,MAAM,GACxB,GAAiB,KAAK,GACtB,GAAgB,QAAA,CAAS,MAAQ,EAAI,KAAK,CAAC;AAC3C,UAAM,IAAO,GAAS,UAAU;AAAA,MAC9B,QAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,eAAA;AAAA,MACA,kBAAA;AAAA,MACA,kBAAA;AAAA,MACA,eAAe;AAAA,MACf,YAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAS;AAAA,MACT,gBAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA,CAAc,MAAM;AAClB,QAAI,GAAmB,GAAG,EAAM,KAC9B,GAAc,UAAU,CAAC,GAEvB,GAAuB,GAAG,EAAM,KAClC,GAAkB,iBAAiB,CAAC,GAElC,GAAc,CAAC,KACjB,GAAiB,cAAc,EAAM,WAAW,CAAC,GAAG,QAAQ;AAAA,MAEhE;AAAA,MACA,cAAA,CAAe,GAAQ,MAAY;AACjC,QAAA,GAAc,aAAa,GAAQ,CAAO,GAC1C,GAAiB,oBAAoB,CAAM;AAAA,MAC7C;AAAA,MACA,kBAAA,CAAmB,GAAQ,MAAY;AACrC,QAAA,GAAkB,kBAAkB,GAAQ,CAAO;AAAA,MACrD;AAAA,MACA,iBAAA;AAAA,IACF,CAAC;AACD,QAAI,CAAC,EACH,QAAO,QAAQ,KAAK,iCAAiC;AAEvD,IAAA,EACE;AAAA,MACE,MAAMA,EAAU;AAAA,MAChB,MAAM;AAAA,QACJ,MAAA;AAAA,QACA,eAAe,GAAgB,MAAM;AAAA,MACvC;AAAA,IACF,GACA,CACF,GACA,GAAgB,QAAA,CAAS,MAAQ,EAAI,OAAO,CAAC,GACzC,SAAS,sBAAsB,SAAS,mBAAmB,SAAS,KACtE,GAAkB,iBAChB,SAAS,oBACT,GAAO,MAAM,QAAQ,CACvB;AAAA,EACJ;AACA,MAAI;AACF,UAAM,IAAW,CAAC,GACZ,IAAA,CAAW,MAAQ;AACvB,UAAI;AACJ,aAAO,EAAgB,EAAa,EAClC;AAAA,QACE,YAAY;AAAA,QACZ,aAAA,CAAc,GAAW,OAAW,EAAY;AAAA,UAC9C,MAAMA,EAAU;AAAA,UAChB,MAAM;AAAA,YACJ,QAAA;AAAA,YACA,WAAA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QACD,oBAAA,CAAqB,MAAM,EAAY;AAAA,UACrC,MAAMA,EAAU;AAAA,UAChB,MAAM;AAAA,YACJ,QAAQ,EAAkB;AAAA,YAC1B,GAAG;AAAA,UACL;AAAA,QACF,CAAC;AAAA,QACD,UAAU;AAAA,QACV,kBAAA,CAAmB,MAAM,EAAY;AAAA,UACnC,MAAMA,EAAU;AAAA,UAChB,MAAM;AAAA,YACJ,QAAQ,EAAkB;AAAA,YAC1B,GAAG;AAAA,UACL;AAAA,QACF,CAAC;AAAA,QACD,SAAA,CAAU,MAAM,EAAY;AAAA,UAC1B,MAAMA,EAAU;AAAA,UAChB,MAAM;AAAA,YACJ,QAAQ,EAAkB;AAAA,YAC1B,GAAG;AAAA,UACL;AAAA,QACF,CAAC;AAAA,QACD,oBAAA,CAAqB,MAAM,EAAY;AAAA,UACrC,MAAMA,EAAU;AAAA,UAChB,MAAM;AAAA,YACJ,QAAQ,EAAkB;AAAA,YAC1B,GAAG;AAAA,UACL;AAAA,QACF,CAAC;AAAA,QACD,kBAAA,CAAmB,MAAM,EAAY;AAAA,UACnC,MAAMA,EAAU;AAAA,UAChB,MAAM;AAAA,YACJ,QAAQ,EAAkB;AAAA,YAC1B,GAAG;AAAA,UACL;AAAA,QACF,CAAC;AAAA,QACD,oBAAA,CAAqB,MAAM,EAAY;AAAA,UACrC,MAAMA,EAAU;AAAA,UAChB,MAAM;AAAA,YACJ,QAAQ,EAAkB;AAAA,YAC1B,GAAG;AAAA,UACL;AAAA,QACF,CAAC;AAAA,QACD,kBAAkB;AAAA,QAClB,QAAA,CAAS,MAAM,EAAY;AAAA,UACzB,MAAMA,EAAU;AAAA,UAChB,MAAM;AAAA,YACJ,QAAQ,EAAkB;AAAA,YAC1B,GAAG;AAAA,UACL;AAAA,QACF,CAAC;AAAA,QACD,aAAA,CAAc,MAAM;AAClB,UAAA,EAAY;AAAA,YACV,MAAMA,EAAU;AAAA,YAChB,MAAM;AAAA,cACJ,QAAQ,EAAkB;AAAA,cAC1B,GAAG;AAAA,YACL;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,iBAAA,CAAkB,MAAM;AACtB,UAAA,EAAY;AAAA,YACV,MAAMA,EAAU;AAAA,YAChB,MAAM;AAAA,cACJ,QAAQ,EAAkB;AAAA,cAC1B,GAAG;AAAA,YACL;AAAA,UACF,CAAC;AAAA,QACH;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA,gBAAA;AAAA,QACA,eAAA;AAAA,QACA,kBAAA;AAAA,QACA,kBAAA;AAAA,QACA,kBAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA;AAAA,QACA,cAAA;AAAA,QACA,cAAA;AAAA,QACA,sBAAA;AAAA,QACA,cAAA;AAAA,QACA,KAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,iBAAA;AAAA,QACA,eAAA;AAAA,QACA,gBAAA;AAAA,QACA,gBAAA;AAAA,QACA,QAAA;AAAA,QACA,eAAA;AAAA,QACA,mBAAA;AAAA,QACA,kBAAA;AAAA,QACA,sBAAA;AAAA,QACA,eAAA;AAAA,QACA,qBAAA;AAAA,QACA,WAAW,IAAM,KAAW,OAAO,SAAS,EAAQ,OAAA,CAAQ,MAAM,EAAE,QAAQ,MAAM,OAAO,SAAS,EAAI,IAAA,CAAK,OAAO;AAAA,UAChH,UAAU,EAAE;AAAA,UACZ,SAAS,EAAE;AAAA,UACX,UAAA,CAAW,OAAY,EAAY;AAAA,YACjC,MAAMA,EAAU;AAAA,YAChB,MAAM;AAAA,cACJ,QAAQ,EAAE;AAAA,cACV,SAAA;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,EAAE,MAAM,CAAC;AAAA,MACX,GACA,CACF;AAAA,IACF;AACA,IAAA,GAAc,gBAAA,CAAiB,MAAa;AAC1C,UAAI;AACF,QAAA,EAAS,KAAK,EAAQ,EAAS,eAAe,CAAC;AAAA,MACjD,SAAS,GAAO;AACd,gBAAQ,KAAK,CAAK;AAAA,MACpB;AAAA,IACF,CAAC;AACD,UAAM,IAAA,MAAa;AACjB,MAAA,GAAiB,GACjB,EAAS,KAAK,EAAQ,QAAQ,CAAC,GAC/B,KAAY;AAAA,IACd;AACA,WAAI,CAAC,eAAe,UAAU,EAAE,SAAS,SAAS,UAAU,IAC1D,EAAK,KAEL,EAAS,KACP,EAAG,oBAAA,MAA0B;AAC3B,MAAA,EAAY;AAAA,QACV,MAAMA,EAAU;AAAA,QAChB,MAAM,CAAC;AAAA,MACT,CAAC,GACG,MAAgB,sBAAoB,EAAK;AAAA,IAC/C,CAAC,CACH,GACA,EAAS,KACP,EACE,QAAA,MACM;AACJ,MAAA,EAAY;AAAA,QACV,MAAMA,EAAU;AAAA,QAChB,MAAM,CAAC;AAAA,MACT,CAAC,GACG,MAAgB,UAAQ,EAAK;AAAA,IACnC,GACA,MACF,CACF,IAEF,MAAa;AACX,MAAA,EAAS,QAAA,CAAS,MAAY;AAC5B,YAAI;AACF,UAAA,EAAQ;AAAA,QACV,SAAS,GAAO;AAEd,UADY,OAAO,CAAK,EAAE,YACnB,EAAE,SAAS,cAAc,KAC9B,QAAQ,KAAK,CAAK;AAAA,QAEtB;AAAA,MACF,CAAC,GACD,GAAqB,QAAQ,GAC7B,KAAY,IACZ,GAAuB;AAAA,IACzB;AAAA,EACF,SAAS,GAAO;AACd,YAAQ,KAAK,CAAK;AAAA,EACpB;AACF;AACA,GAAO,iBAAA,CAAkB,GAAK,MAAY;AACxC,MAAI,CAAC,GACH,OAAM,IAAI,MAAM,+CAA+C;AAEjE,EAAA,EAAY;AAAA,IACV,MAAMA,EAAU;AAAA,IAChB,MAAM;AAAA,MACJ,KAAA;AAAA,MACA,SAAA;AAAA,IACF;AAAA,EACF,CAAC;AACH;AACA,GAAO,aAAA,MAAmB;AACxB,EAAA,GAAgB,QAAA,CAAS,MAAQ,EAAI,OAAO,CAAC;AAC/C;AACA,GAAO,mBAAA,CAAoB,MAAe;AACxC,MAAI,CAAC,GACH,OAAM,IAAI,MAAM,iDAAiD;AAEnE,EAAA,GAAiB,CAAU;AAC7B;AACA,GAAO,SAAS;ACt6JhB,IAAI,KAA4B,kBAAE,OAChC,EAAW,EAAW,mBAAsB,CAAA,IAAK,oBACjD,EAAW,EAAW,OAAU,CAAA,IAAK,QACrC,EAAW,EAAW,eAAkB,CAAA,IAAK,gBAC7C,EAAW,EAAW,sBAAyB,CAAA,IAAK,uBACpD,EAAW,EAAW,OAAU,CAAA,IAAK,QACrC,EAAW,EAAW,SAAY,CAAA,IAAK,UACvC,EAAW,EAAW,SAAY,CAAA,IAAK,UACvC,EAAW,EAAW,QAAW,CAAA,IAAK,SAC/B,IACN,MAAa,CAAC,CAAC,GCsBL,KAAqB,KAMrB,KAAyB,8CAQzB,KACX,sDA8DI,KAAgC;AAAA,EAAE,UAAA,MAAgB;AAAA,EAAM,MAAA,MAAY;AAAA,EAAC;AAAE;AAQ7E,SAAgB,GACd,IAAyB,CAAC,GAC1B,IAAqB,IACL;AAEhB,MAAI,IAAsB,CAAC,GACvB,IAAqB,CAAC,GAKtB,IAAa;AAEjB,QAAM,IAAW,EAAQ,aAAa,IAMhC,IAAgB;AAAA,IAJpB;AAAA,IACA,GAAI,EAAQ,eAAe,KAAQ,CAAC,EAAsB,IAAI,CAAC;AAAA,IAC/D,GAAI,EAAQ,gBAAgB,CAAC,EAAQ,aAAa,IAAI,CAAC;AAAA,EAEnC,EAAW,KAAK,GAAG;AAEzC,MAAI;AACJ,MAAI;;AACF,IAAA,IAAS,EAAS;AAAA,MAChB,MAAA,CAAO,GAAoB,MAAyB;AAClD,QAAI,KAAc,CAAC,MACjB,IAAO,GACP,IAAM,CAAC,IAET,IAAa,MAAe,IAC5B,EAAI,KAAK,CAAK;AAAA,MAChB;AAAA,MACA,kBAAkB;AAAA,MAClB,eAAe;AAAA,MACf,GAAI,IAAW,EAAE,mBAAA,IAAkB,EAAQ,sBAAA,QAAA,MAAA,SAAA,IAAoB,IAAI,IAAI,CAAC;AAAA,MACxE,eAAA;AAAA,MAGA,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH,QAAQ;AACN,IAAA,IAAS;AAAA,EACX;AACA,MAAI,OAAO,KAAW,WAAY,QAAO;AACzC,QAAM,IAAa;AAEnB,MAAI,IAAU;AACd,SAAO;AAAA,IACL,WAAW;AACT,UAAI,CAAC,EAAS,QAAO;AACrB,YAAM,IAAS,CAAC,GAAG,GAAM,GAAG,CAAG;AAG/B,aAAK,EAAO,KAAA,CAAM,MAAU,EAAM,SAAS,GAAU,YAAY,IAC1D,EAAE,QAAA,EAAO,IAD2D;AAAA,IAE7E;AAAA,IACA,OAAO;AACL,UAAK,GACL;AAAA,QAAA,IAAU;AACV,YAAI;AACF,UAAA,EAAW;AAAA,QACb,QAAQ;AAAA,QAER;AACA,QAAA,IAAO,CAAC,GACR,IAAM,CAAC;AAAA;AAAA,IACT;AAAA,EACF;AACF;ACtHA,SAAgB,KAAa;AAE7B;AAOA,SAAgB,KAA6C;AAC3D,SAAO,OAAO,UAAW,cAAc,SAAS;AAClD;AAGA,SAAgB,KAAuC;AACrD,SAAO,OAAO,YAAa,cAAc,WAAW;AACtD;AAQA,SAAgB,KAAyC;AACvD,SAAO,OAAO,WAAY,cAAc,UAAU;AACpD;ACrEA,SAAgB,GACd,GACA,GACA,GACA,GACU;AACV,QAAM,IAAM,EAAI;AAChB,MAAI,CAAC,KAAO,OAAO,EAAI,cAAe,WAAY,QAAO;AACzD,QAAM,IAAW,EAAI,YACf,IAAA,CAAU,GAAa,GAAe,MAAkC;AAC5E,QAAI,CAAA,EAAU,CAAG;AACjB,UAAI;AACF,QAAA,EAAO,IACL,GACE;AAAA,UAAE,KAAK;AAAA,UAAU,QAAQ;AAAA,UAAQ,KAAA;AAAA,UAAK,SAAS,GAAgB,CAAI;AAAA,UAAG,SAAA;AAAA,QAAQ,GAC9E,EAAI,CACN,CACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,EACF,GACM,IAAU,SAAU,GAAmB,GAAiC;AAC5E,UAAM,IAAS,OAAO,KAAQ,WAAW,IAAM,OAAO,CAAG;AACzD,QAAI;AACJ,QAAI;AACF,MAAA,IAAS,EAAS,KAAK,GAAK,GAAK,CAAI;AAAA,IACvC,SAAS,GAAO;AAEd,YAAA,EAAO,GAAQ,GAAM,eAAe,GAC9B;AAAA,IACR;AACA,WAAA,EAAO,GAAQ,GAAM,IAAS,OAAO,eAAe,GAC7C;AAAA,EACT;AACA,SAAA,EAAI,aAAa,GACjB,MAAa;AACX,IAAA,EAAI,aAAa;AAAA,EACnB;AACF;ACpCA,SAAS,GAAW,GAAuC;AACzD,SAAI,OAAO,KAAU,WAAiB,IAClC,aAAiB,MAAY,EAAM,SAAS,IACzC,EAAM;AACf;AAEA,SAAS,GACP,GACA,GACQ;;AAKR,WAAA,KAAA,IAAA,KAAA,OAAA,SAHE,EAAM,YAAA,QAAA,MAAA,SAAA,IACL,OAAO,KAAU,YAAY,YAAY,IAAQ,EAAM,SAAS,YAAA,QAAA,MAAA,SAAA,IACjE,OACY,YAAY;AAC5B;AAGA,SAAS,GAAmB,GAAoB,GAA6B;AAC3E,MAAI;;AACF,YAAA,KAAA,IAAO,EAAS,aAAA,QAAA,MAAA,WAAA,IAAA,EAAS,SAAA,QAAA,MAAA,SAAA,SAAA,EAAA,KAAA,GAAM,CAAI,OAAA,QAAA,MAAA,SAAA,IAAK;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOA,SAAS,GAAsB,GAAoC;AACjE,SAAI,EAAS,SAAS,YAAY,EAAS,SAAS,mBAC3C,gBAEF,GAAkB,EAAS,MAAM;AAC1C;AAOA,SAAS,GAAmB,GAAgC;AAC1D,QAAM,IACJ,OAAO,KAAU,YAAY,MAAU,QAAQ,UAAU,IACrD,OAAQ,EAA6B,IAAI,IACzC;AACN,SAAI,MAAS,eAAqB,YAC9B,MAAS,iBAAuB,YAC7B;AACT;AAGA,SAAgB,GACd,GACA,GACA,GACA,GACA,IAAqB,IACX;AACV,QAAM,IAAW,EAAI;AACrB,MAAI,OAAO,KAAa,WAAY,QAAO;AAC3C,QAAM,IAAA,CACJ,GACA,MACsB;AACtB,UAAM,IAAM,GAAW,CAAK,GACtB,IAAS,GAAc,GAAO,CAAI,GAElC,IAAU,GAAA,KAAA,OAAA,SAAgB,EAAM,IAAI,GACpC,IAAU,EAAK,GAGf,IAAU,EAAS,KAAK,GAAK,GAAO,CAAI;AAC9C,WAAI,EAAU,CAAG,IAAU,IACpB,EAAQ,KAAA,CACZ,MAAa;AACZ,UAAI;AACF,QAAA,EAAO,IACL,GACE;AAAA,UACE,KAAK;AAAA,UACL,QAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAQ,EAAS,UAAU;AAAA,UAC3B,YAAY,EAAS,cAAc;AAAA,UACnC,YAAY,KAAK,IAAI,GAAG,EAAK,IAAI,CAAO;AAAA,UACxC,SAAA;AAAA,UACA,UAAU,GACR,GAAmB,GAAU,gBAAgB,CAC/C;AAAA,UACA,aAAa,GACX,GAAmB,GAAU,cAAc,CAC7C;AAAA,UACA,SAAS,GAAsB,CAAQ;AAAA,QACzC,GACA,EAAI,CACN,CACF;AAAA,MACF,QAAQ;AAAA,MAER;AACA,aAAO;AAAA,IACT,GAAA,CACC,MAAmB;AAClB,UAAI;AACF,QAAA,EAAO,IACL,GACE;AAAA,UACE,KAAK;AAAA,UACL,QAAA;AAAA,UACA,KAAA;AAAA,UACA,YAAY,KAAK,IAAI,GAAG,EAAK,IAAI,CAAO;AAAA,UACxC,SAAA;AAAA,UACA,SAAS,GAAmB,CAAK;AAAA,QACnC,GACA,EAAI,CACN,CACF;AAAA,MACF,QAAQ;AAAA,MAER;AACA,YAAM;AAAA,IACR,CACF;AAAA,EACF;AACA,SAAA,EAAI,QAAQ,GACZ,MAAa;AACX,IAAA,EAAI,QAAQ;AAAA,EACd;AACF;AC5IA,SAAgB,GACd,GACA,GACA,GACU;AACV,QAAM,IAAU,EAAI,SACd,IAAW,EAAI;AACrB,MAAI,CAAC,KAAW,CAAC,EAAU,QAAO;AAElC,MAAI,IAAO,EAAS;AACpB,QAAM,IAAA,CAAU,MAAqB;AACnC,QAAI;AACF,MAAA,EAAO,IAAI,GAAgB,GAAM,GAAI,EAAI,CAAC,CAAC;AAAA,IAC7C,QAAQ;AAAA,IAER;AACA,IAAA,IAAO;AAAA,EACT,GAEM,IAAe,EAAQ,WACvB,IAAkB,EAAQ;AAEhC,EAAA,EAAQ,YAAY,SAElB,GACA,GACA,GACM;AACN,UAAM,IAAS,EAAa,KAAK,MAAM,GAAM,GAAQ,CAAG;AACxD,WAAA,EAAO,EAAS,IAAI,GACb;AAAA,EACT,GACA,EAAQ,eAAe,SAErB,GACA,GACA,GACM;AACN,UAAM,IAAS,EAAgB,KAAK,MAAM,GAAM,GAAQ,CAAG;AAC3D,WAAA,EAAO,EAAS,IAAI,GACb;AAAA,EACT;AAEA,QAAM,IAAA,MAAyB,EAAO,EAAS,IAAI,GAC7C,IAAA,MAA2B,EAAO,EAAS,IAAI;AACrD,SAAA,EAAI,iBAAiB,YAAY,CAAU,GAC3C,EAAI,iBAAiB,cAAc,CAAY,GAE/C,MAAa;AACX,IAAA,EAAQ,YAAY,GACpB,EAAQ,eAAe,GACvB,EAAI,oBAAoB,YAAY,CAAU,GAC9C,EAAI,oBAAoB,cAAc,CAAY;AAAA,EACpD;AACF;ACpDA,SAAS,GAAa,GAAyB;AAC7C,MAAI;AACF,WAAO,GAAe,CAAM;AAAA,EAC9B,QAAQ;AACN,WAAO,EAAO,UAAU,EAAO,QAAQ,YAAY,IAAI;AAAA,EACzD;AACF;AAGA,SAAgB,GAAW,GAAiB,GAA+B;AACzE,QAAM,IAAW,GAAa,CAAM;AACpC,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS,SAAS,CAAA;AAAA,IAClB,WAAA;AAAA,IACA,MAAM,EAAE,QAAQ,EAAS;AAAA,EAC3B;AACF;AAMA,SAAgB,GAAW,GAAiB,GAA+B;AACzE,QAAM,IAAW,GAAa,CAAM;AACpC,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS,SAAS,CAAA;AAAA,IAClB,WAAA;AAAA,IACA,MAAM,EAAE,QAAQ,EAAS;AAAA,EAC3B;AACF;AAGA,SAAS,GAAmB,GAA8B;;AAGxD,QAAM,KAAA,KADJ,OAAO,EAAM,gBAAiB,aAAa,EAAM,aAAa,IAAI,CAAC,GAChD,CAAA,OAAA,QAAA,MAAA,SAAA,IAAM,EAAM;AACjC,SAAO,aAAmB,UAAU,IAAU;AAChD;AAGA,SAAgB,GACd,GACA,GACA,GACU;AACV,QAAM,IAAA,CAAW,MAAuB;AACtC,UAAM,IAAS,GAAmB,CAAK;AACvC,QAAI,GAAC,KAAU,GAAc,CAAM;AACnC,UAAI;AACF,QAAA,EAAO,IAAI,GAAW,GAAQ,EAAI,CAAC,CAAC;AAAA,MACtC,QAAQ;AAAA,MAER;AAAA,EACF,GACM,IAAA,CAAW,MAAuB;AACtC,UAAM,IAAS,GAAmB,CAAK;AACvC,QAAI,GAAC,KAAU,GAAc,CAAM;AACnC,UAAI;AACF,QAAA,EAAO,IAAI,GAAW,GAAQ,EAAI,CAAC,CAAC;AAAA,MACtC,QAAQ;AAAA,MAER;AAAA,EACF;AACA,SAAA,EAAI,iBAAiB,SAAS,GAAS,EAAI,GAC3C,EAAI,iBAAiB,SAAS,GAAS,EAAI,GAC3C,MAAa;AACX,IAAA,EAAI,oBAAoB,SAAS,GAAS,EAAI,GAC9C,EAAI,oBAAoB,SAAS,GAAS,EAAI;AAAA,EAChD;AACF;AC5DA,SAAS,GAAc,GAAkB,GAA6B;AACpE,MAAI;AACF,WAAO,OAAO,EAAI,qBAAsB,aACpC,EAAI,kBAAkB,CAAI,IAC1B;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,GAAkB,GAAsC;AAC/D,MAAI;AACF,WAAO,EAAI,cAAc;AAAA,EAC3B,QAAQ;AACN;AAAA,EACF;AACF;AAGA,SAAgB,GACd,GACA,GACA,GACA,GACA,IAAqB,IACX;AACV,QAAM,IAAO,EAAI;AACjB,MAAI,OAAO,KAAS,WAAY,QAAO;AACvC,QAAM,IAAQ,EAAK,WACb,IAAe,EAAM,MACrB,IAAe,EAAM;AAE3B,SAAA,EAAM,OAAO,SAEX,GACA,MACG,GACG;AACN,gBAAK,gBAAgB;AAAA,MAAE,QAAQ,OAAO,CAAM,EAAE,YAAY;AAAA,MAAG,KAAK,OAAO,CAAG;AAAA,IAAE,GACvE,EAAa,KAAK,MAAM,GAAQ,GAAK,GAAG,CAAI;AAAA,EACrD,GAEA,EAAM,OAAO,SAAuC,GAAsB;AACxE,UAAM,IAAO,KAAK;AAClB,QAAI,KAAQ,CAAC,EAAU,EAAK,GAAG,GAAG;AAChC,YAAM,IAAU,EAAK,GACf,IAAU,GAAgB,CAAI;AAGpC,UAAI;AACJ,YAAM,IAAA,MAAqB;AACzB,QAAA,IAAU,GAAkB,KAAK,UAAU,MAAS;AAAA,MACtD,GACM,IAAA,MAAsB;AAC1B,QAAA,IAAU;AAAA,MACZ,GACM,IAAA,MAAwB;AAC5B,QAAA,IAAU;AAAA,MACZ,GACM,IAAA,MAAsB;AAC1B,QAAA,IAAU;AAAA,MACZ,GAEM,IAAA,MAAqB;AACzB,YAAI;;AACF,UAAA,EAAO,IACL,GACE;AAAA,YACE,KAAK;AAAA,YACL,QAAQ,EAAK;AAAA,YACb,KAAK,EAAK;AAAA,YACV,QAAQ,KAAK,UAAU;AAAA,YACvB,YAAY,GAAkB,IAAI;AAAA,YAClC,YAAY,KAAK,IAAI,GAAG,EAAK,IAAI,CAAO;AAAA,YACxC,SAAA;AAAA,YACA,UAAU,GAAmB,GAAc,MAAM,gBAAgB,CAAC;AAAA,YAClE,aAAa,GAAc,GAAc,MAAM,cAAc,CAAC;AAAA,YAC9D,UAAA,IAAS,OAAA,QAAA,MAAA,SAAA,IAAW,GAAkB,KAAK,UAAU,MAAS;AAAA,UAChE,GACA,EAAI,CACN,CACF;AAAA,QACF,QAAQ;AAAA,QAER;AACA,aAAK,oBAAoB,QAAQ,CAAM,GACvC,KAAK,oBAAoB,SAAS,CAAO,GACzC,KAAK,oBAAoB,WAAW,CAAS,GAC7C,KAAK,oBAAoB,SAAS,CAAO,GACzC,KAAK,oBAAoB,WAAW,CAAM;AAAA,MAC5C;AACA,WAAK,iBAAiB,QAAQ,CAAM,GACpC,KAAK,iBAAiB,SAAS,CAAO,GACtC,KAAK,iBAAiB,WAAW,CAAS,GAC1C,KAAK,iBAAiB,SAAS,CAAO,GACtC,KAAK,iBAAiB,WAAW,CAAM;AAAA,IACzC;AACA,WAAO,EAAa,KAAK,MAAM,CAAI;AAAA,EACrC,GAEA,MAAa;AACX,IAAA,EAAM,OAAO,GACb,EAAM,OAAO;AAAA,EACf;AACF;ACxCA,SAAgB,GACd,GACA,IAA6B,CAAC,GACpB;;AACV,QAAM,KAAA,IAAM,EAAQ,SAAA,QAAA,MAAA,SAAA,IAAO,GAAa,GAClC,KAAA,IAAM,EAAQ,SAAA,QAAA,MAAA,SAAA,IAAO,GAAe,GACpC,KAAA,IAAa,EAAQ,gBAAA,QAAA,MAAA,SAAA,IAAc,GAAc,GACjD,KAAA,IAAS,EAAQ,mBAAA,QAAA,MAAA,SAAA,IAAiB,IAClC,KAAA,IAAY,EAAQ,eAAA,QAAA,MAAA,SAAA,KAAA,MAAoB,KACxC,KAAA,IAAM,EAAQ,SAAA,QAAA,MAAA,SAAA,IAAO,KAAK,KAC1B,KAAA,IAAO,EAAQ,UAAA,QAAA,MAAA,SAAA,IAAQ,IAGvB,IAAiB,EAAQ,mBAAmB,IAC5C,IAAiB,EAAQ,mBAAmB,IAE5C,IAAwB,CAAC;AAC/B,SAAI,KAAc,KAChB,EAAU,KAAK,GAAkB,GAAQ,GAAY,GAAQ,CAAG,CAAC,GAE/D,MACE,MACF,EAAU,KAAK,GAAgB,GAAQ,GAAK,GAAW,GAAK,CAAI,CAAC,GACjE,EAAU,KAAK,GAAc,GAAQ,GAAK,GAAW,GAAK,CAAI,CAAC,GAC/D,EAAU,KAAK,GAAiB,GAAQ,GAAK,GAAW,CAAG,CAAC,IAE9D,EAAU,KAAK,GAAqB,GAAQ,GAAK,CAAG,CAAC,IAEnD,KACF,EAAU,KAAK,GAAmB,GAAQ,GAAK,CAAG,CAAC,GAGrD,MAAa;AACX,eAAW,KAAY,EACrB,KAAI;AACF,MAAA,EAAS;AAAA,IACX,QAAQ;AAAA,IAER;AAAA,EAEJ;AACF;ACnEA,SAAS,GACP,GACA,GACS;AACT,SAAO,KAAA,OAAA,IAAa,OAAO,KAAW,YAAY,IAAS;AAC7D;AAGA,SAAgB,GAAc,GAAgC;;AAC5D,QAAM,EAAE,SAAA,GAAS,QAAA,GAAQ,KAAA,GAAK,aAAA,GAAa,kBAAA,GAAkB,QAAA,GAAQ,QAAA,EAAA,IAAW,GAI1E,IAAU,EAAQ,UAAU,GAAiB,EAAQ,OAAO,IAAI;AACtE,EAAI,EAAQ,WAAW,CAAC,KACtB,QAAQ,KACN,sCAAsC,KAAK,UAAU,EAAQ,OAAO,CAAA,2FAEtE;AAEF,QAAM,IAAqB,GAAc,GAAQ;AAAA,IAC/C,KAAA;AAAA,IACA,cAAc,EAAQ;AAAA,EACxB,CAAC,GAEK,IAAS,EAAO,SAChB,KAAA,IAAQ,EAAQ,WAAA,QAAA,MAAA,SAAA,IAAS,CAAC,GAC1B,IAA2B,GAAuB;AAAA,IACtD,SAAS,EAAM;AAAA,IACf,UAAU,EAAM;AAAA,IAChB,kBAAkB,EAAQ;AAAA,EAC5B,CAAC,GACK,IAAgB,GAAsB,GAAQ;AAAA,IAClD,eAAe,EAAM;AAAA,IACrB,WAAA,CAAY,MAAQ,GAAoB,GAAQ,CAAG;AAAA,IACnD,gBAAgB,IAAA,IAAc,EAAQ,aAAA,QAAA,MAAA,SAAA,SAAA,EAAS,SAAA,KAAA,OAAA,SAAS,EAAQ,OAAO;AAAA,IACvE,gBAAgB,IAAA,IAAc,EAAQ,aAAA,QAAA,MAAA,SAAA,SAAA,EAAS,SAAA,KAAA,OAAA,SAAS,EAAQ,OAAO;AAAA,EACzE,CAAC;AAKD,MAAI,IAAgC;AACpC,MAAI,IAAA,IAAc,EAAQ,aAAA,QAAA,MAAA,SAAA,SAAA,EAAS,QAAA,KAAA,OAAA,SAAQ,EAAQ,MAAM,GAAG;;AAC1D,IAAA,IAAS,IAAA,IAAoB,EAAQ,YAAA,QAAA,MAAA,SAAA,IAAU,CAAC,CAAC;AAAA,EACnD;AAEA,QAAM,IAAU,GAAc;AAAA,IAC5B,QAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,kBAAA;AAAA,IACA,UAAU,EAAI;AAAA,IACd,WAAW,EAAI;AAAA,IACf,MAAM,EAAO;AAAA,IACb,YAAY;AAAA,IACZ,SAAA;AAAA,IACA,mBAAmB,EAAQ;AAAA,IAC3B,QAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAY,EAAQ;AAAA,IACpB,OAAO,EAAQ;AAAA,EACjB,CAAC,GACK,IAAA,MAAuB,EAAQ,KAAK;AAC1C,EAAA,EAAS,KAAK,iBAAiB,IAAc,CAAQ;AAKrD,MAAI,IAAA,MAAsC;AAAA,EAAC;AAC3C,SAAI,EAAQ,gBAAgB,OAC1B,IAAsB,GAAoB;AAAA,IACxC,QAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAY;AAAA,IACZ,SAAA;AAAA,IACA,mBAAmB,EAAQ;AAAA,IAC3B,QAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAY,EAAQ;AAAA,IACpB,OAAO,EAAQ;AAAA,EACjB,CAAC,EAAE,UAGE;AAAA,IACL,UAAA,MAAgB;AACd,MAAA,EAAS,KAAK,oBAAoB,IAAc,CAAQ,GACxD,EAAQ,QAAQ,GAChB,GAAgB,CAAQ,GACxB,EAAc,GACd,KAAA,QAAA,EAAQ,KAAK,GACb,EAAoB;AAAA,IACtB;AAAA,IACA,aAAA,CAAc,MAAO,EAAQ,YAAY,CAAE;AAAA,EAC7C;AACF;ACxJA,SAAgB,GAAoB,GAAuC;AACzE,MAAI;AACF,WAAO,WAAW,aAAa,QAAQ,GAA0B,CAAc,CAAC;AAAA,EAClF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAgB,GAAqB,GAAwB,GAAqB;AAChF,MAAI;AACF,eAAW,aAAa,QAAQ,GAA0B,CAAc,GAAG,CAAK;AAAA,EAClF,QAAQ;AAAA,EAER;AACF;AAGA,SAAgB,GAAqB,GAA8B;AACjE,MAAI;AACF,eAAW,aAAa,WAAW,GAA0B,CAAc,CAAC;AAAA,EAC9E,QAAQ;AAAA,EAER;AACF;ACEA,IAAa,KAAiC;AAAA,EAC5C,UAAU;AAAA,EAAC;AAAA,EACX,QAAA,MAAc,QAAQ,QAAQ,EAAE,QAAQ,YAAY,CAAC;AAAA,EACrD,SAAA,MAAe,QAAQ,QAAQ;AAAA,EAC/B,UAAA,OAAiB,EAAE,QAAQ,YAAY;AACzC;AAGA,SAAS,KAAmB;AAC1B,MAAI;AACF,WAAO,OAAO,SAAS;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,eAAsB,GACpB,GACA,GAC0B;AAC1B,MAAI;;AAEF,QAAI,OAAO,YAAa,YAAa,QAAO;AAE5C,UAAM,IAAA,KAAA,OAAA,SAAM,EAAS;AACrB,QAAI,OAAO,KAAQ,YAAY,EAAI,WAAW,EAAG,QAAO;AAExD,UAAM,IAAM,QACN,KAAA,IAAc,EAAQ,iBAAA,QAAA,MAAA,SAAA,IAAe,GAAkB,GACvD,KAAA,IAAS,EAAQ,YAAA,QAAA,MAAA,SAAA,IAAU,SAAS;AAE1C,QAAI,IAAW,IACX,IAAuB,GAAoB,CAAG,GAC9C,IAA8B,MAE9B,IAAmC,MACnC,IAAkD,MAClD;AAGJ,UAAM,IAAA,MAAwC;;;QAC5C,cAAc,EAAQ;AAAA,QACtB,kBAAA,IAAiB,OAAA,QAAA,MAAA,SAAA,IAAS;AAAA,QAC1B,aAAA;AAAA,MACF;AAAA,OAGM,IAAA,MACJ;;AACI,aAAA,IAAA;AAAA,QAAE,QAAQ;AAAA,QAAa,MAAM,EAAQ;AAAA,QAAM,OAAO,EAAQ;AAAA,QAAO,OAAA,IAAM,OAAA,QAAA,MAAA,SAAA,IAAe;AAAA,MAAK,IAC3F,EAAE,QAAQ,YAAY;AAAA,OAGtB,IAAW,OAAO,MAAgC;AACtD,YAAM,IAAS,MAAM,GAAoB,GAAQ;AAAA,QAC/C,KAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA;AAAA,QACA,UAAU;AAAA,MACZ,CAAC;AACD,MAAI,MACF,IAAQ,EAAO,iBACf,GAAqB,GAAK,CAAK;AAAA,IAEnC,GAGM,IAAgB,YAA2B;;AAC/C,YAAM,IAAS,MAAM,GAAY,GAAQ;AAAA,QACvC,KAAA;AAAA,QACA,GAAG,GAAgB,EAAe,CAAC;AAAA,MACrC,CAAC;AACD,MAAI,MAEJ,KAAA,QAAI,EAAQ,oBACV,IAAQ,EAAO,iBACf,GAAqB,GAAK,CAAK,IAEjC,KAAA,IAAA,KAAA,OAAA,SAAc,EAAQ,UAAA,QAAA,MAAA,SAAA,IAAQ,MAC9B,KAAA,IAAA,KAAA,OAAA,SAAU,EAAQ,aAAA,QAAA,MAAA,SAAA,IAAW,MAC7B,IAAA,KAAA,OAAA,SAAa,EAAQ,YAErB,KAAA,QAAI,EAAQ,YACN,IAGF,EAAQ,YAAY,EAAiB,CAAC,IAEtC,IAAU,GAAc;AAAA,QACtB,SAAA;AAAA,QACA,QAAA;AAAA,QACA,KAAA;AAAA,QACA,aAAa;AAAA,QACb,kBAAkB,EAAiB;AAAA,QACnC,UAAA,MAAA;AAAgB,UAAK,EAAO;AAAA;AAAA,QAC5B,WAAA,MAAA;AAAiB,UAAK,EAAQ;AAAA;AAAA,QAC9B,QAAA;AAAA,QACA,QAAA;AAAA,MACF,CAAC,IAEM,MAET,EAAQ,SAAS,GACjB,IAAU;AAAA,IAEd,GAGM,IAAS,YAAuC;AACpD,UAAI,KAAY,CAAC,EAAY,QAAO,EAAiB;AACrD,YAAM,IAAU,MAAM,GAAa,GAAK;AAAA,QACtC,YAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAW,GAAS;AAAA,MACtB,CAAC;AACD,aAAI,EAAQ,SAAS,WACnB,MAAM,EAAS,EAAQ,IAAI,GAC3B,MAAM,EAAc,IAGf,EAAiB;AAAA,IAC1B,GAGM,IAAU,YAA2B;AACzC,MAAI,KAAO,MAAM,GAAsB,GAAQ,CAAK,GACpD,GAAqB,CAAG,GACxB,IAAQ,MACR,MAAM,EAAc;AAAA,IACtB,GAEM,IAA4B;AAAA,MAChC,SAAA,MAAe;AACb,QAAA,IAAW,IACX,KAAA,QAAA,EAAS,SAAS,GAClB,IAAU;AAAA,MACZ;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA,MAAgB,EAAiB;AAAA,IACnC,GAIM,IAAa,GAAe,CAAG;AACrC,QAAI,GAAY;AAEd,UADA,MAAM,EAAS,CAAU,GACrB,EAAU,QAAO;AACrB,MAAA,GAAgB,CAAG;AAAA,IACrB;AAEA,iBAAM,EAAc,GACb;AAAA,EACT,QAAQ;AAEN,WAAO;AAAA,EACT;AACF;ACtFA,IAAI,KAA0B,IAOjB,KAAU;AAAA,EACrB,QAAA,MAAyC,GAAO,OAAO;AAAA,EACvD,SAAA,MAA8B,GAAO,QAAQ;AAAA,EAC7C,UAAA,MAAkC,GAAO,SAAS;AACpD;AAUA,SAAgB,GAAK,GAAgD;;AAGnE,OAAA,KAAA,OAAA,SAAI,EAAS,aAAY,GAAO,QAAO,QAAQ,QAAQ,EAAa;AACpE,QAAM,KAAA,IAAA,KAAA,OAAA,SAAS,EAAS,YAAA,QAAA,MAAA,SAAA,IAAU;AAClC,SAAO,GAAW,GAAS,CAAM,EAAE,KAAA,CAAM,OACvC,KAAS,GACF,EACR;AACH"}